diff --git "a/\347\275\227\345\220\257\346\201\222/\347\254\254\344\270\211\346\254\241\347\275\227\345\220\257\346\201\222/.keep" "b/\347\275\227\345\220\257\346\201\222/\347\254\254\344\270\211\346\254\241\347\275\227\345\220\257\346\201\222/.keep" new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git "a/\347\275\227\345\220\257\346\201\222/\347\254\254\344\270\211\346\254\241\347\275\227\345\220\257\346\201\222/\347\275\227\345\220\257\346\201\222/\344\275\234\344\270\232/2022-9-20 \344\275\234\344\270\232.sql" "b/\347\275\227\345\220\257\346\201\222/\347\254\254\344\270\211\346\254\241\347\275\227\345\220\257\346\201\222/\347\275\227\345\220\257\346\201\222/\344\275\234\344\270\232/2022-9-20 \344\275\234\344\270\232.sql" new file mode 100644 index 0000000000000000000000000000000000000000..b91e3900222624886ef7de6b4d637e7020f3f077 --- /dev/null +++ "b/\347\275\227\345\220\257\346\201\222/\347\254\254\344\270\211\346\254\241\347\275\227\345\220\257\346\201\222/\347\275\227\345\220\257\346\201\222/\344\275\234\344\270\232/2022-9-20 \344\275\234\344\270\232.sql" @@ -0,0 +1,45 @@ +select * from AccountInfo +select * from BankCard +select * from CardExchange +select * from CardStateChange +select * from CardTransfer +--关羽的银行卡号为"6225547858741263",查询出余额比关羽多的银行卡信息,显示卡号,身份证,姓名,余额。 +select AccountCode 身份证,CardNo 卡号,RealName 姓名,CardMoney 余额 from AccountInfo +join BankCard on BankCard.AccountId = AccountInfo.AccountId +where RealName = '关羽' + +--从所有账户信息中查询出余额最高的交易明细(存钱取钱信息)。 +select * from BankCard +join CardExchange on BankCard.CardNo=CardExchange.CardNo +where CardMoney in (select MAX(CardMoney) from BankCard); +--查询有取款记录的银行卡及账户信息,显示卡号,身份证,姓名,余额。 +select BankCard.CardNo,AccountInfo.AccountCode,AccountInfo.RealName,BankCard.CardMoney from AccountInfo +join BankCard on AccountInfo.AccountId = BankCard.AccountId +where AccountInfo.AccountId= +(select BankCard.AccountId from BankCard +join CardExchange on CardExchange.CardNo=BankCard.CardNo +where BankCard.CardMoney-CardExchange.MoneyInBank>0 +); +--查询出没有存款记录的银行卡及账户信息,显示卡号,身份证,姓名,余额。 +select BankCard.CardNo,AccountInfo.AccountCode,AccountInfo.RealName,BankCard.CardMoney from CardExchange +join BankCard on CardExchange.CardNo = BankCard.CardNo +join AccountInfo on AccountInfo.AccountId=BankCard.AccountId +where MoneyInBank is null +--关羽的银行卡号为"6225547858741263",查询当天是否有收到转账。 +if exists (select * from CardTransfer where CardNoIn='6225547858741263') +print'有转账' +else +print'无转账' +--查询出交易次数(存款取款操作)最多的银行卡账户信息,显示:卡号,身份证,姓名,余额,交易次数。 +select BankCard.CardNo,AccountInfo.AccountCode,AccountInfo.RealName,BankCard.CardMoney,a.交易次数 from AccountInfo +join BankCard on AccountInfo.AccountId= BankCard.AccountId +join (select CardNo,COUNT(CardNo)交易次数 from CardExchange group by CardNo ) a on a.CardNo=BankCard.CardNo +order by a.交易次数 +desc; +--查询出没有转账交易记录的银行卡账户信息,显示卡号,身份证,姓名,余额。 +select a.*,AccountInfo.AccountCode,AccountInfo.RealName from AccountInfo , +( +select * from BankCard where CardNo not in(select CardNoOut from CardTransfer ) +and CardNo not in(select CardNoIn from CardTransfer ) +) a +where AccountInfo.AccountId=a.AccountId \ No newline at end of file diff --git "a/\347\275\227\345\220\257\346\201\222/\347\254\254\344\270\211\346\254\241\347\275\227\345\220\257\346\201\222/\347\275\227\345\220\257\346\201\222/\347\254\224\350\256\260/2022-9-19 \347\254\224\350\256\260.sql" "b/\347\275\227\345\220\257\346\201\222/\347\254\254\344\270\211\346\254\241\347\275\227\345\220\257\346\201\222/\347\275\227\345\220\257\346\201\222/\347\254\224\350\256\260/2022-9-19 \347\254\224\350\256\260.sql" new file mode 100644 index 0000000000000000000000000000000000000000..985e5a27a210e7ac61992a16c4e9c3a2e483f70e --- /dev/null +++ "b/\347\275\227\345\220\257\346\201\222/\347\254\254\344\270\211\346\254\241\347\275\227\345\220\257\346\201\222/\347\275\227\345\220\257\346\201\222/\347\254\224\350\256\260/2022-9-19 \347\254\224\350\256\260.sql" @@ -0,0 +1,218 @@ +## 嵌套/子查询 + +#### 什么是子查询? + +**问题:编写T-SQL语句,查询“黄炜杰”同学的分数大于80 分的考试成绩记录?** + +```sql +--实现方式1:连接查询 +--实现方式2: 子查询 +``` + + +#### 子查询的特点和优势 + +1)使用灵活。 + +1. 可以成为SQL 语句的多个部分。 +2. **子查询作为查询条件使用**。 + +```sql +--练习:查询学号在曾鹏前面的同学信息 +``` + +1. **子查询作为临时表使用**。 from () + +```sql +--练习:查询所有学生的HTML成绩,如果学生没有成绩显示null +``` + +1. **子查询作为列使用**。 + +```sql +--练习:查询所有学生的HTML成绩,如果学生没有成绩显示null +``` + +2)降低SQL 的语句的复杂度,提高SQL 语句的可读性。 + +#### 子查询 + +![](https://gitee.com/snailclass/tuchuang/raw/master/img/image-20220906173549480-2022-9-1913:24:45.png) + +##### 按结果分类 + +###### 标量子查询 : + +**通常可以使用连接查询替代** + +标量子查询是指子查询返回的是**单一值**,如一个数字或一个字符串。 + +```sql +--1.查询书目表(tb_bibliography)中,条码号(barcode)为"TP311.13"图书(需要在图书表中先查找"TP31L13"的ISBN号)的图书名称(name)和作者(author) + + +--2.查询借阅表(tb-record)中姓名为"邓承明"(需要在学生表中先查找"邓承明'的学号)的学生的借阅信息,显示学号(stu-num)和条码号(barcode) +``` + + + +###### 列子查询 + +**列子查询是指子查询返回的结果集是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列,该子查询的结果通常是对表的某行数据进行查询而返回的结果集。 + +```sql +--(1)查询书目表(tb_bibliography)中与《管理信息系统实用教程(第3版)》同作者(author),同类型(category)的书。 +--(2)查询学生表(tb_student)中与"邹睿睿'在同一个学院(school)且同一年级(学号头两位相同则表明在同一年级)学生的学号、姓名和学院。 +``` + + + +###### 表子查询(from子查询) + +表子查询是指子查询返回是M行N列的结果集,查询语句可嵌套在FROM关 +键字后,且需要定义别名。 + +```sql +--查询每种图书在馆的本数,显示ISBN号(ISBN)、图书名称(name)和该图书的在馆数量。 +``` + + + +##### 按位置分类 + +###### 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 '没有' + +--(2)查询书目表(tb-bibliography)中,库存数为0的书目名称(name) +``` + +## 排序函数 + +**排序函数 OVER( [分组子句] 排序子句[DESC][ASC] )** + +**排序子句 :ORDER BY 排序列,排序列…** + +练习:使用各个排名函数对学员的Java 成绩进行排名,并仔细体会其中排序函数的具体用法与其中的区别。 + +```sql + +``` + +- ROW_NUMBER()函数生成的排序根据排序子句给出**递增连续的序号** +- RANK()函数生成的排序根据排序子句给出**递增的序号,但是存在并列并且跳空** +- DENSE_RANK() 函数生成的排序根据排序子句给出**递增的序号,但是存在并列不跳空** + +根据上面三个函数,我们可以增加一个序列,但是有时候我们需要对数据进行分组,然后对分组后的数据进行增加序列,PARTITION BY可以与以上三个函数联合使用 + +```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' + +``` + + + + + +## 分页查询 + +#### 分页方案一 + +**使用top分页** + +```sql +declare @PageSize int = 5 -- 每页5条 +declare @PageIndex int = 2 --第2页 +select top(@PageSize) * from Student +where Stuid not in (select top(@PageSize)*(@PageIndex-1)) StuId from Student +``` + + + +#### 分页方案二 + +**使用row_number分页** + +```sql +declare @PageSize int = 5 +declare @PageIndex int = 3 +select * from +(select ROW_NUMBER() over(order by StuId) RowId,*from Student) as Temp +where RowId between (@PageIndex-1)*@PageSize+1 and @PageIndex*PageSiz` + + + +#### 分页查询练习 + +```sql +--数据结构和数据如下: +create table Student +( + StuId int primary key identity(1,2), --自动编号 + StuName varchar(20), + StuSex varchar(4) +) \ No newline at end of file