diff --git "a/15\345\220\264\346\230\216\346\235\260/\347\254\224\350\256\260/220907\345\255\220\346\237\245\350\257\242.md" "b/15\345\220\264\346\230\216\346\235\260/\347\254\224\350\256\260/220907\345\255\220\346\237\245\350\257\242.md" new file mode 100644 index 0000000000000000000000000000000000000000..672eda2cd01e44a1910012c971534887e588c745 --- /dev/null +++ "b/15\345\220\264\346\230\216\346\235\260/\347\254\224\350\256\260/220907\345\255\220\346\237\245\350\257\242.md" @@ -0,0 +1,117 @@ +# 三、SQL高级查询 + +## (一)子查询 + + **子查询**是一个嵌套在select、insert、update、delete语句的其他查询中的查询。==任何允许使用表达式的地方都可以使用子查询==。子查询也称为内部查询或内部选择,而包含子部查询的语句也称为外部查询或外部选择 + +==子查询的注意事项:== + +1. 子查询语法中的小括号 + +2. 可以使用子查询的位置:**where,select,having,==from(要用as取别名)==** + +3. 不可以使用子查询的位置:group by ,order by + +4. 主查询和子查询可以不是同一张表 + +5. 一般不在子查询中使用排序(但是在top-n问题分析中必须对子查询使用排序) + +6. 一般先执行子查询,再执行主查询(相关子查询除外) + +7. 单行子查询只能使用单行操作符;多行子查询只能使用多行操作符 + + 注意:当子查询为null值的问题 + + 子查询也可以作为赋值语句的一部分 + +******* + +### 1.使用in 和 not in完成子查询 + +in[在] not in[不在] + + **in 和 not in==通常在where子句中使用==,在 in 或 not in后接的子查询中==可以有多个值出现==** + +例:查询出所有选修课程都及格的学生的信息 + +```sql +select * from StudentInfo +where stuNO in (select stuid + from stuMarks + group by stuid + having min(Score) >= 60 + ) +``` + +******* + +### 2.使用some、any、all进行查询 + +some[一些] any[任意的] all[全部] + +**在SQL查询中,`some`、`any`、`all` 后必须跟子查询** + +- **==some和any的查询功能是一样的==,where条件能够满足some和any所接的子查询中的==任意一个值==,就表示where条件成立** +- **all表示的是能够==满足==all所接的子查询中的==所有值==才成立** +- = any 等值于in + +例:查询出某同学某一门考试成绩比“张秋利”同学所有分数都高的学生基本信息 + +```sql +select sti.* from stuMarks smk +inner join StudentInfo sti on sti.stuNo = smk.stuID +where score > all(select score + from stuMarks stm +inner join StudentInfo st on stm.stuID = st.stuNo +where stuName = '张秋利') +``` + +查询出某同学某一门考试成绩只需要比“张秋利”同学某个分数高的学生基本信息(stuMarks) + +```sql +select distinct sti.* from stuMarks smk +inner join StudentInfo sti on sti.stuNo = smk.stuID +where stuName <> '张秋利' and score > any(select score + from stuMarks stm +inner join StudentInfo st on stm.stuID = st.stuNo + where stuName = '张秋利') +``` + +************ + +### 3.使用exists 和not exists完成子查询 + +**exists[存在]: 如果子查询结果非空,即记录条数1条以上,则exsts(子查询)返回true 或 false**,==可配合if语句使用if exists(条件)== + +**`exists` 和 `not exists`表示存在和不存在的意思。在语句中会==判断`exists` 或 `not exists`后接的子句是否存在和是否不存在==** + +示例:查询出参加考试的学生的信息 + +```sql +select * from StudentInfo st +where exists (select stuid from stuMarks stm where st.stuNo = stm.stuID) --如果该条件成立就显示,上一行的查询结果 +``` + +也可以和if配合使用 + +```sql +if exists(子查询) +语句 +``` + +************ + +### 4.使用compute和compute by进行汇总查询 + +**compute 和 compute by子句使您得以用同一select语句即查看明细行,有查看汇总行。可以计算子组的汇总值,也可以计算整个结果集的汇总值** + +当compute不带可选的by子句时,select语句有两个结果集: + ● 每个组的第一个结果集是包含选择列表信息的所有明细行 + ● 第二个结果集有一行,其中包含compute子句中所指定的聚合函数的合计 + +compute子句需要下列信息: + ● 可选by关键字。它基于每一列计算指定的行聚合 + ● 行聚合函数名称 SUM、AVG、MIN、MAX、或 COUNT + ● 要对其执行行聚函数的列 + +对结果先进行分组然后进行汇总计算时使用:compute by进行分组汇总查询 \ No newline at end of file diff --git "a/15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220906-\351\200\273\350\276\221\350\257\255\345\217\245\347\273\203\344\271\240.md" "b/15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220906-\351\200\273\350\276\221\350\257\255\345\217\245\347\273\203\344\271\240.md" index d90e80f37279bec88a59c6a96347bea74e4342e8..461e2632f4c7d2f9ff6782571fc9d7e0bc529246 100644 --- "a/15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220906-\351\200\273\350\276\221\350\257\255\345\217\245\347\273\203\344\271\240.md" +++ "b/15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220906-\351\200\273\350\276\221\350\257\255\345\217\245\347\273\203\344\271\240.md" @@ -38,13 +38,16 @@ where AccountCode= @ano -- 3.某用户银行卡号为“6225547854125656”,该用户执行取钱操作,取钱5000元,余额充足则进行取钱操作,并提示"取钱成功",否则提示“余额不足”。 ``` -declare @acno varchar(30)='6225547854125656' -declare @cmoney money -select @cmoney=CardMoney from BankCard where CardNo=@acno -if @cmoney>=5000 -print '取钱成功' -else -print '余额不足' +declare @balance money +select @balance = (select CardMoney from BankCard where CardNo='6225547854125656') +if @balance >= 5000 + begin + update BankCard set CardMoney = CardMoney - 5000 + insert into CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime) + values('6225547854125656',0,5000,GETDATE()) + end +else + print '余额不足' ``` diff --git "a/15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220907\345\255\220\346\237\245\350\257\242.md" "b/15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220907\345\255\220\346\237\245\350\257\242.md" new file mode 100644 index 0000000000000000000000000000000000000000..b13c7ef931a5c90c2811b8176c2ab9d967b0b668 --- /dev/null +++ "b/15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220907\345\255\220\346\237\245\350\257\242.md" @@ -0,0 +1,59 @@ +--1. 关羽的银行卡号为"6225547858741263",查询出余额比关羽多的银行卡信息,显示卡号,身份证,姓名,余额。 + +``` +select CardNo,AccountCode,RealName,CardMoney from AccountInfo a +join BankCard b on a.AccountId=b.AccountId +where CardMoney >any (select CardMoney from BankCard where CardNo='6225547858741263') +``` + +--2. 从所有账户信息中查询出余额最高的交易明细(存钱取钱信息)。 + +``` +select * from CardExchange where MoneyInBank =(select max(MoneyInBank) from CardExchange) +and MoneyOutBank =(select max(MoneyOutBank) from CardExchange) +``` + +--3. 查询有取款记录的银行卡及账户信息,显示卡号,身份证,姓名,余额。 + +``` +select CardNo,AccountCode,RealName,CardMoney from AccountInfo a +join BankCard b on a.AccountId=b.AccountId +where CardNo in(select cardno from CardExchange where MoneyOutBank is not null) +``` + +--4. 查询出没有存款记录的银行卡及账户信息,显示卡号,身份证,姓名,余额。 + +``` +select CardNo,AccountCode,RealName,CardMoney from AccountInfo a +join BankCard b on a.AccountId=b.AccountId +where CardNo in(select cardno from CardExchange where MoneyInBank is null) +``` + +--5. 关羽的银行卡号为"6225547858741263",查询当天是否有收到转账。 + +``` +if exists(select * from CardTransfer where TransferTime=getdate() and CardNoOut='6225547858741263') +print '有收账' +else +print '无收账' +``` + +--6. 查询出交易次数(存款取款操作)最多的银行卡账户信息,显示:卡号,身份证,姓名,余额,交易数。 + +``` +select top 1 b.CardNo,AccountCode,RealName,CardMoney,交易次数 from AccountInfo a +join BankCard b on a.AccountId=b.AccountId +join (select CardNo,count(*) 交易次数 from CardExchange group by CardNo +) ta on b.CardNo=ta.CardNo +order by 交易次数 desc +``` + +--7. 查询出没有转账交易记录的银行卡账户信息,显示卡号,身份证,姓名,余额。 + +``` +select CardNo,AccountCode,RealName,CardMoney from AccountInfo a +join BankCard b on a.AccountId=b.AccountId +where CardNo not in (select CardNoOut from CardTransfer) and CardNo not in(select CardNoIn from CardTransfer) +``` + +