From b7272a820a38db25324fa7e05cb8c2d42af33f0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=99=E9=87=91=E6=98=9F?= <3441777097@qq.com> Date: Wed, 14 Sep 2022 00:16:11 +0800 Subject: [PATCH] 10 --- ...7-\345\255\220\346\237\245\350\257\242.md" | 37 ++++++++ ...8-\345\255\220\346\237\245\350\257\242.md" | 88 +++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 "10\344\275\231\351\207\221\346\230\237/\344\275\234\344\270\232/9.7-\345\255\220\346\237\245\350\257\242.md" create mode 100644 "10\344\275\231\351\207\221\346\230\237/\347\254\224\350\256\260/9.8-\345\255\220\346\237\245\350\257\242.md" diff --git "a/10\344\275\231\351\207\221\346\230\237/\344\275\234\344\270\232/9.7-\345\255\220\346\237\245\350\257\242.md" "b/10\344\275\231\351\207\221\346\230\237/\344\275\234\344\270\232/9.7-\345\255\220\346\237\245\350\257\242.md" new file mode 100644 index 0000000..fda808d --- /dev/null +++ "b/10\344\275\231\351\207\221\346\230\237/\344\275\234\344\270\232/9.7-\345\255\220\346\237\245\350\257\242.md" @@ -0,0 +1,37 @@ +```sql +--1.关羽的银行卡号为"6225547858741263",查询出余额比关羽多的银行卡信息,显示卡号,身份证,姓名,余额。 +select CardNo,AccountCode,RealName,cardMoney from BankCard bd +inner join AccountInfo ao on ao.AccountId=bd.AccountId +where cardmoney>all(select CardMoney from BankCard where CardNo=6225547858741263) +--2.从所有账户信息中查询出余额最高的交易明细(存钱取钱信息)。 +select * from CardExchange where CardNo = (select top 1 CardNo from BankCard order by CardMoney desc) +--3.查询有取款记录的银行卡及账户信息,显示卡号,身份证,姓名,余额。 +select CardNo 卡号,AccountCode 身份证,RealName 姓名,CardMoney 余额 from BankCard bd +left join AccountInfo ao on bd.AccountId = ao.AccountId +where CardNo in (select CardNo from CardExchange where MoneyOutBank != 0) +--4.查询出没有存款记录的银行卡及账户信息,显示卡号,身份证,姓名,余额。 +select CardNo 卡号,AccountCode 身份证,RealName 姓名,CardMoney 余额 from BankCard bd +left join AccountInfo ao on bd.AccountId = ao.AccountId +where CardNo not in (select CardNo from CardExchange where MoneyOutBank != 0) +--5.关羽的银行卡号为"6225547858741263",查询当天是否有收到转账。 +if exists(select * from CardTransfer where CardNoIn = '6225547858741263' and convert(char(18),TransferTime) = convert(varchar(10),getdate(), 120)) +begin + print '有转账记录' +end +else +begin + print '没有转账记录' +end +--6.查询出交易次数(存款取款操作)最多的银行卡账户信息,显示:卡号,身份证,姓名,余额,交易数。 +select top 1 bd.CardNo 卡号,AccountCode 身份证,RealName 姓名,CardMoney 余额, +exchangeCount 交易次数 from BankCard bd +inner join AccountInfo ao on bd.AccountId =ao.AccountId +inner join (select CardNo,COUNT(*) exchangeCount from CardExchange group by CardNo ) CarcExchageTemp on bd.CardNo = CarcExchageTemp.CardNo +order by exchangeCount desc +--7.查询出没有转账交易记录的银行卡账户信息,显示卡号,身份证,姓名,余额。 +select CardNo 卡号,AccountCode 身份证,RealName 姓名,CardMoney 余额 from BankCard bd +left join AccountInfo ao on bd.AccountId = ao.AccountId +where bd.CardNo not in (select CardNoIn from CardTransfer) +and bd.CardNo not in (select CardNoOut from CardTransfer) +``` + diff --git "a/10\344\275\231\351\207\221\346\230\237/\347\254\224\350\256\260/9.8-\345\255\220\346\237\245\350\257\242.md" "b/10\344\275\231\351\207\221\346\230\237/\347\254\224\350\256\260/9.8-\345\255\220\346\237\245\350\257\242.md" new file mode 100644 index 0000000..db80997 --- /dev/null +++ "b/10\344\275\231\351\207\221\346\230\237/\347\254\224\350\256\260/9.8-\345\255\220\346\237\245\350\257\242.md" @@ -0,0 +1,88 @@ +# 子查询 + +### 标量子查询 : + +通常可以使用连接查询替代 +标量子查询是指子查询返回的是**单一值**,如一个数字或一个字符串。 + +### 列子查询 + +列子查询是指子查询返回的结果集是N行1列**,该结果通常来自对表某个字段的查询结果,带in关键字的子查询是最常用的一类子查询,在使用in关键字进行查询时,子查询语句返回的结果应该是一个数据列中的多个值,如果仅返回1个数值,则可用标量子查询代替。 + +```sql +--in习题 +--查询学生表(tb-student)中和黄弘相同专业学生读者的学号(stu-num)姓名(name)和专业(major) +--先查询 黄宏的 专业 +select major from tb_student where name='黄弘' +--in代表:只要符合后面的条件就筛选出来 +select * from tb_student where major in (select major from tb_student where name='黄弘') +--查询学生表(tb-student)中还未还书的读者的学号(stu-num)和姓名(name) +--查询未还书学生的学号 +select stu_num from tb_record where return_time is null +--通过学号查询学生姓名 +select * from tb_student where stu_num in (select stu_num from tb_record where return_time is null) +--all any some 习题 +--1.查询学生表(tb-student)中,比信息学院出生日期最大的还要大的所有学生记录,即比信息学院年龄最小的还要小的所有记录,使用ALL关键字,显示学生的姓名(name)、出生日期(birth)和所属学院(school),同样的结果尝试用max()函数再实现一次。 +--信息学院学生最小年龄 +select birth from tb_student where school='信息学院' +select max(birth) from tb_student where school='信息学院' +select * from tb_student where birth>(select max(birth) from tb_student where school='信息学院' ) +--all关键字:>,<,= +select * from tb_student where birth>all(select birth from tb_student where school='信息学院') +--2.查询学生表(tb-student)中,比信息学院出生日期最小的还要大的所有学生记录,即比信息学院年龄最大的还要小的所有记录,使用ANY关键字,显示学生的姓名(name)、出生日期(birth)和所属学院(school)。尝试用SOME关键字代替ANY,重新执行后观察查询结果。 +select * from tb_student where birth>any(select birth from tb_student where school='信息学院') +select * from tb_student where birth>some(select birth from tb_student where school='信息学院') +--3.查询书目表(tb-bibliography)中,使用ANY关键字,每种类型中最贵的图 书名称(name)和价格(price) +-- =any 与 in 等价 +select max(price) 最贵的价格 from tb_bibliography group by category +select name 图书名称,price 价格 from tb_bibliography +where price in (select max(price) 最贵的价格 from tb_bibliography group by category) +``` + +### 行子查询 + +行子查询是指子查询返回的结果集是1行N列,该子查询的结果通常是对表的某行数据进行查询而返回的结果集。 + +### 表子查询(from子查询) + +表子查询是指子查询返回是M行N列的结果集,查询语句可嵌套在FROM关 +键字后,且需要定义别名。 + +### exists子查询 + +关键字EXISTS构造子查询时,当子查询的结果集不为空时,则EXISTS返回的结果为TRUE,外层查询语句进行查询;当子查询的结果集为空时,则EXISTS返回的结果为FALSE,外层查询语句不进行查询。 + +```sql +--(1)查询学生表(tb-student)中,是否有学生读者的姓名是"黄弘" +if exists(select stu_num from tb_record where stu_num in (select stu_num from tb_student where name='黄弘') and return_time is null) + print '有' +else + print '没有' +``` + +## 排序函数 + +**排序函数 OVER( [分组子句] 排序子句[DESC][ASC] )** + +**排序子句 :ORDER BY 排序列,排序列…** + +- ROW_NUMBER()函数生成的排序根据排序子句给出**递增连续的序号** +- RANK()函数生成的排序根据排序子句给出**递增的序号,但是存在并列并且跳空** +- DENSE_RANK() 函数生成的排序根据排序子句给出**递增的序号,但是存在并列不跳空** + +```sql +--学生的Java成绩,并根据成绩排名 +--row_number() +select StuName 姓名,ROW_NUMBER() over(order by score desc) 排名,score 分数 from StuScore +join stuinfo on StuInfo.StuID = StuScore.StuID +where subject = 'Java' +--rank() +select StuName 姓名,rank() over(order by score desc) 排名,score 分数 from StuScore +join stuinfo on StuInfo.StuID = StuScore.StuID +where subject = 'Java' +--DENSE_RANK() + select StuName 姓名,dense_rank() over(order by score desc) 排名,score 分数 from StuScore +join stuinfo on StuInfo.StuID = StuScore.StuID +where subject = 'Java' +``` + -- Gitee