《关系数据库标准语言SQL课件》由会员分享,可在线阅读,更多相关《关系数据库标准语言SQL课件(82页珍藏版)》请在金锄头文库上搜索。
1、数据库系统概论 An Introduction to Database System第三章第三章 关系数据库标准语言关系数据库标准语言SQL(续续1)2024/7/201关系数据库标准语言SQL最新课件第三章第三章关系数据库标准语言关系数据库标准语言SQL3.1SQL概述概述3.2学生学生-课程数据库课程数据库3.3数据定义数据定义3.4数据查询数据查询3.5数据更新数据更新3.6空值的处理空值的处理3.7视图视图3.8小结小结2024/7/202关系数据库标准语言SQL最新课件3.4数据查询数据查询3.4.1单表查询单表查询3.4.2连接查询连接查询3.4.3嵌套查询嵌套查询3.4.4集合查
2、询集合查询3.4.5基于派生表的查询基于派生表的查询3.4.5Select语句的一般形式语句的一般形式2024/7/203关系数据库标准语言SQL最新课件3.4.2连接查询连接查询v连接查询:同时涉及两个以上的表的查询连接查询:同时涉及两个以上的表的查询v连接条件或连接谓词:用来连接两个表的条件连接条件或连接谓词:用来连接两个表的条件一般格式:一般格式:n.n.BETWEEN.AND.v连接字段:连接谓词中的列名称连接字段:连接谓词中的列名称n连连接接条条件件中中的的各各连连接接字字段段类类型型必必须须是是可可比比的的,但但名名字字不不必相同必相同2024/7/204关系数据库标准语言SQL最
3、新课件连接查询(续)连接查询(续)1.等值与非等值连接查询等值与非等值连接查询2.自身连接自身连接3.外连接外连接4.多表连接多表连接2024/7/205关系数据库标准语言SQL最新课件1.等值与非等值连接查询等值与非等值连接查询v等值连接:连接运算符为等值连接:连接运算符为=例例3.49查询每个学生及其选修课程的情况查询每个学生及其选修课程的情况SELECTStudent.*,SC.*FROMStudent,SCWHEREStudent.Sno=SC.Sno;2024/7/206关系数据库标准语言SQL最新课件等值与非等值连接查询(续)等值与非等值连接查询(续)Student.SnoSnam
4、eSsexSageSdeptSC.SnoCnoGrade201215121李勇李勇男男20CS201215121192201215121李勇李勇男男20CS201215121285201215121李勇李勇男男20CS201215121388201215122刘晨刘晨女女19CS201215122290201215122刘晨刘晨女女19CS201215122380查询结果:查询结果:2024/7/207关系数据库标准语言SQL最新课件连接操作的执行过程连接操作的执行过程(1)嵌套循环法)嵌套循环法(NESTED-LOOP)n首首先先在在表表1中中找找到到第第一一个个元元组组,然然后后从从头头开
5、开始始扫扫描描表表2,逐逐一一查查找找满满足足连连接接件件的的元元组组,找找到到后后就就将将表表1中中的的第第一一个个元元组组与该元组拼接起来,形成结果表中一个元组。与该元组拼接起来,形成结果表中一个元组。n表表2全全部部查查找找完完后后,再再找找表表1中中第第二二个个元元组组,然然后后再再从从头头开开始始扫扫描描表表2,逐逐一一查查找找满满足足连连接接条条件件的的元元组组,找找到到后后就就将将表表1中中的的第第二二个个元元组组与与该该元元组组拼拼接接起起来来,形形成成结结果果表表中中一一个个元元组。组。n重复上述操作,直到表重复上述操作,直到表1中的全部元组都处理完毕中的全部元组都处理完毕注
6、:连接操作的执行过程,在第九章注:连接操作的执行过程,在第九章关系查询处理和查询优化中将比较详细关系查询处理和查询优化中将比较详细地讲解,在爱课程网地讲解,在爱课程网9.1节中还有节中还有连接操作的实现连接操作的实现的的动画。这里只是先动画。这里只是先简单介绍一下。简单介绍一下。2024/7/208关系数据库标准语言SQL最新课件连接操作的执行过程(续)连接操作的执行过程(续)(2)排序合并法()排序合并法(SORT-MERGE)n常用于常用于=连接连接n首先按连接属性对表首先按连接属性对表1和表和表2排序排序n对对表表1的的第第一一个个元元组组,从从头头开开始始扫扫描描表表2,顺顺序序查查找
7、找满满足足连连接接条条件件的的元元组组,找找到到后后就就将将表表1中中的的第第一一个个元元组组与与该该元元组组拼拼接接起起来来,形形成成结结果果表表中中一一个个元元组组。当当遇遇到到表表2中中第第一一条大于表条大于表1连接字段值的元组时,对表连接字段值的元组时,对表2的查询不再继续的查询不再继续2024/7/209关系数据库标准语言SQL最新课件连接操作的执行过程(续)连接操作的执行过程(续)(2)排序合并法(续)排序合并法(续)n找找到到表表1的的第第二二条条元元组组,然然后后从从刚刚才才的的中中断断点点处处继继续续顺顺序序扫扫描描表表2,查查找找满满足足连连接接条条件件的的元元组组,找找到
8、到后后就就将将表表1中中的的第第一一个个元元组组与与该该元元组组拼拼接接起起来来,形形成成结结果果表表中中一一个个元元组组。直直接接遇遇到到表表2中中大大于于表表1连连接接字字段段值值的的元元组组时时,对对表表2的的查查询询不不再继续再继续n重重复复上上述述操操作作,直直到到表表1或或表表2中中的的全全部部元元组组都都处处理理完完毕毕为为止止2024/7/2010关系数据库标准语言SQL最新课件连接操作的执行过程(续)连接操作的执行过程(续)(3)索引连接()索引连接(INDEX-JOIN)n对表对表2按连接字段建立索引按连接字段建立索引n对对表表1中中的的每每个个元元组组,依依次次根根据据其
9、其连连接接字字段段值值查查询询表表2的的索索引引,从从中中找找到到满满足足条条件件的的元元组组,找找到到后后就就将将表表1中中的的第第一个元组与该元组拼接起来,形成结果表中一个元组一个元组与该元组拼接起来,形成结果表中一个元组2024/7/2011关系数据库标准语言SQL最新课件等值与非等值连接查询(续)等值与非等值连接查询(续)v自然连接自然连接例例3.50对对例例3.49用自然连接完成。用自然连接完成。SELECTStudent.Sno,Sname,Ssex,Sage,Sdept,Cno,GradeFROMStudent,SCWHEREStudent.Sno=SC.Sno;2024/7/2
10、012关系数据库标准语言SQL最新课件等值与非等值连接查询(续)等值与非等值连接查询(续)v一条一条SQL语句可以同时完成选择和连接查询,这时语句可以同时完成选择和连接查询,这时WHERE子句是由连接谓词和选择谓词组成的复合条件。子句是由连接谓词和选择谓词组成的复合条件。例例3.51查询选修查询选修2号课程且成绩在号课程且成绩在90分以上的所有学生的学号和姓名。分以上的所有学生的学号和姓名。SELECTStudent.Sno,SnameFROMStudent,SCWHEREStudent.Sno=SC.SnoANDSC.Cno=2ANDSC.Grade90;n执行过程执行过程:l先从先从SC中
11、挑选出中挑选出Cno=2并且并且Grade90的元组形成一个中间的元组形成一个中间关系关系l再和再和Student中满足连接条件的元组进行连接得到最终的结果中满足连接条件的元组进行连接得到最终的结果关系关系2024/7/2013关系数据库标准语言SQL最新课件连接查询(续)连接查询(续)1.等值与非等值连接查询等值与非等值连接查询2.自身连接自身连接3.外连接外连接4.多表连接多表连接2024/7/2014关系数据库标准语言SQL最新课件2.自身连接自身连接v自身连接自身连接:一个表与其自己进行连接一个表与其自己进行连接v需要给表起别名以示区别需要给表起别名以示区别v由于所有属性名都是同名属性
12、,因此必须使用别由于所有属性名都是同名属性,因此必须使用别名前缀名前缀例例3.52查询每一门课的间接先修课(即先修课的先修课)查询每一门课的间接先修课(即先修课的先修课)SELECTFIRST.Cno,SECOND.CpnoFROMCourseFIRST,CourseSECONDWHEREFIRST.Cpno=SECOND.Cno;2024/7/2015关系数据库标准语言SQL最新课件自身连接(续)自身连接(续)FIRST表(表(Course表)表)SECOND表(表(Course表)表)课程号课程号Cno课程名课程名Cname先行课先行课Cpno学分学分Ccredit1数据库数据库542数学
13、数学23信息系统信息系统144操作系统操作系统635数据结构数据结构746数据处理数据处理27PASCAL语言语言64课程号课程号Cno课程名课程名Cname先行课先行课Cpno学分学分Ccredit1数据库数据库542数学数学23信息系统信息系统144操作系统操作系统635数据结构数据结构746数据处理数据处理27PASCAL语言语言642024/7/2016关系数据库标准语言SQL最新课件自身连接(续)自身连接(续)查询结果:查询结果:CnoPcno1735562024/7/2017关系数据库标准语言SQL最新课件连接查询(续)连接查询(续)1.等值与非等值连接查询等值与非等值连接查询2.
14、自身连接自身连接3.外连接外连接4.多表连接多表连接2024/7/2018关系数据库标准语言SQL最新课件3.外连接外连接v外连接与普通连接的区别外连接与普通连接的区别n普通连接操作只输出满足连接条件的元组普通连接操作只输出满足连接条件的元组n外连接操作以指定表为连接主体,将主体表中不满足连外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出接条件的元组一并输出n左外连接左外连接l列出左边关系中所有的元组列出左边关系中所有的元组n右外连接右外连接l列出右边关系中所有的元组列出右边关系中所有的元组2024/7/2019关系数据库标准语言SQL最新课件外连接(续)外连接(续)例例3
15、.53改写改写例例3.49SELECTStudent.Sno,Sname,Ssex,Sage,Sdept,Cno,GradeFROMStudentLEFTOUTJOINSCON(Student.Sno=SC.Sno);2024/7/2020关系数据库标准语言SQL最新课件外连接(续)外连接(续)执行结果:执行结果:Student.Sno SnameSsexSageSdeptCnoGrade201215121李勇李勇男男20CS192201215121李勇李勇男男20CS285201215121李勇李勇男男20CS388201215122刘晨刘晨女女19CS290201215122刘晨刘晨女女1
16、9CS380201215123王敏王敏女女18MANULLNULL201215125张立立男男19ISNULLNULL2024/7/2021关系数据库标准语言SQL最新课件连接查询(续)连接查询(续)1.等值与非等值连接查询等值与非等值连接查询2.自身连接自身连接3.外连接外连接4.多表连接多表连接2024/7/2022关系数据库标准语言SQL最新课件4.多表连接多表连接v多表连接:两个以上的表进行连接多表连接:两个以上的表进行连接例例3.54查询每个学生的学号、姓名、选修的课程名及成绩查询每个学生的学号、姓名、选修的课程名及成绩SELECTStudent.Sno,Sname,Cname,Gr
17、adeFROMStudent,SC,Course/*多表连接多表连接*/WHEREStudent.Sno=SC.SnoANDSC.Cno=Course.Cno;2024/7/2023关系数据库标准语言SQL最新课件3.4数据查询数据查询3.4.1单表查询单表查询3.4.2连接查询连接查询3.4.3嵌套查询嵌套查询3.4.4集合查询集合查询3.4.5基于派生表的查询基于派生表的查询3.4.5Select语句的一般形式语句的一般形式2024/7/2024关系数据库标准语言SQL最新课件嵌套查询(续)嵌套查询(续)v嵌套查询概述嵌套查询概述n一个一个SELECT-FROM-WHERE语句称为一个语句
18、称为一个查询块查询块n将一个查询块嵌套在另一个查询块的将一个查询块嵌套在另一个查询块的WHERE子句子句或或HAVING短语的条件中的查询称为短语的条件中的查询称为嵌套查询嵌套查询SELECTSname/*外层查询外层查询/父查询父查询*/FROMStudentWHERESnoIN(SELECTSno/*内层查询内层查询/子查询子查询*/FROMSCWHERECno=2);2024/7/2025关系数据库标准语言SQL最新课件嵌套查询(续)嵌套查询(续)n上层的查询块称为上层的查询块称为外层查询外层查询或或父查询父查询n下层查询块称为下层查询块称为内层查询内层查询或或子查询子查询nSQL语言允
19、许多层嵌套查询语言允许多层嵌套查询l即一个子查询中还可以嵌套其他子查询即一个子查询中还可以嵌套其他子查询n子查询的限制子查询的限制l不能使用不能使用ORDERBY子句子句2024/7/2026关系数据库标准语言SQL最新课件嵌套查询求解方法嵌套查询求解方法v不相关子查询:不相关子查询:子查询的查询条件不依赖于父查询子查询的查询条件不依赖于父查询n由里向外由里向外逐层处理。即每个子查询在上一级查询处理逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条之前求解,子查询的结果用于建立其父查询的查找条件。件。2024/7/2027关系数据库标准语言SQL最新课件嵌套查
20、询求解方法(续)嵌套查询求解方法(续)v相关子查询:子查询的查询条件依赖于父查询相关子查询:子查询的查询条件依赖于父查询n首先取外层查询中表的第一个元组,根据它与内层查首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若询相关的属性值处理内层查询,若WHERE子句返回值子句返回值为真,则取此元组放入结果表为真,则取此元组放入结果表n然后再取外层表的下一个元组然后再取外层表的下一个元组n重复这一过程,直至外层表全部检查完为止重复这一过程,直至外层表全部检查完为止2024/7/2028关系数据库标准语言SQL最新课件3.4.3嵌套查询嵌套查询1.带有带有IN谓词的子查询谓词
21、的子查询2.带有比较运算符的子查询带有比较运算符的子查询3.带有带有ANY(SOME)或)或ALL谓词的子查询谓词的子查询4.带有带有EXISTS谓词的子查询谓词的子查询2024/7/2029关系数据库标准语言SQL最新课件1.带有带有IN谓词的子查询谓词的子查询例例3.55查询与查询与“刘晨刘晨”在同一个系学习的学生。在同一个系学习的学生。此查询要求可以分步来完成此查询要求可以分步来完成确定确定“刘晨刘晨”所在系名所在系名SELECTSdeptFROMStudentWHERESname=刘晨刘晨;结果为:结果为:CS2024/7/2030关系数据库标准语言SQL最新课件带有带有IN谓词的子查
22、询(续)谓词的子查询(续)查找所有在查找所有在CS系学习的学生。系学习的学生。SELECTSno,Sname,SdeptFROMStudentWHERESdept=CS;结果为:结果为:SnoSnameSdept201215121李勇李勇CS201215122刘晨刘晨CS2024/7/2031关系数据库标准语言SQL最新课件带有带有IN谓词的子查询(续)谓词的子查询(续)将第一步查询嵌入到第二步查询的条件中将第一步查询嵌入到第二步查询的条件中SELECTSno,Sname,SdeptFROMStudent WHERESdeptIN(SELECTSdeptFROMStudentWHERESnam
23、e=刘晨刘晨);此查询为不相关子查询。此查询为不相关子查询。2024/7/2032关系数据库标准语言SQL最新课件带有带有IN谓词的子查询(续)谓词的子查询(续)用自身连接完成用自身连接完成例例3.55查询要求查询要求SELECTS1.Sno,S1.Sname,S1.SdeptFROMStudentS1,StudentS2WHERES1.Sdept=S2.SdeptANDS2.Sname=刘晨刘晨;2024/7/2033关系数据库标准语言SQL最新课件带有带有IN谓词的子查询(续)谓词的子查询(续)例例3.56查询选修了课程名为查询选修了课程名为“信息系统信息系统”的学生学号和姓名的学生学号和
24、姓名SELECTSno,Sname最后在最后在Student关系中关系中 FROMStudent取出取出Sno和和SnameWHERESnoIN(SELECTSno然后在然后在SC关系中找出选关系中找出选FROMSC修了修了3号课程的学生学号号课程的学生学号WHERECnoIN(SELECTCno首先在首先在Course关系中找出关系中找出FROMCourse“信息系统信息系统”的课程号,为的课程号,为3号号WHERECname=信息系统信息系统);2024/7/2034关系数据库标准语言SQL最新课件带有带有IN谓词的子查询(续)谓词的子查询(续)用连接查询实现用连接查询实现例例3.56:S
25、ELECTSno,SnameFROMStudent,SC,CourseWHEREStudent.Sno=SC.SnoANDSC.Cno=Course.CnoANDCourse.Cname=信息系统信息系统;2024/7/2035关系数据库标准语言SQL最新课件3.4.3嵌套查询嵌套查询1.带有带有IN谓词的子查询谓词的子查询2.带有比较运算符的子查询带有比较运算符的子查询3.带有带有ANY(SOME)或)或ALL谓词的子查询谓词的子查询4.带有带有EXISTS谓词的子查询谓词的子查询2024/7/2036关系数据库标准语言SQL最新课件2.带有比较运算符的子查询带有比较运算符的子查询v当能确切
26、知道内层查询返回单值时,可用比较运当能确切知道内层查询返回单值时,可用比较运算符(算符(,=,=,!=或或)。)。在在例例3.55中,由于一个学生只可能在一个系学习,则可以中,由于一个学生只可能在一个系学习,则可以用用=代替代替IN:SELECTSno,Sname,SdeptFROMStudentWHERESdept=(SELECTSdeptFROMStudentWHERESname=刘晨刘晨);2024/7/2037关系数据库标准语言SQL最新课件带有比较运算符的子查询(续)带有比较运算符的子查询(续)例例3.57找出每个学生超过他选修课程平均成绩的课程号。找出每个学生超过他选修课程平均成绩
27、的课程号。SELECTSno,CnoFROMSCxWHEREGrade=(SELECTAVG(Grade)FROMSCyWHEREy.Sno=x.Sno);相关子查询2024/7/2038关系数据库标准语言SQL最新课件带有比较运算符的子查询(续)带有比较运算符的子查询(续)v可能的执行过程可能的执行过程n从外层查询中取出从外层查询中取出SC的一个元组的一个元组x,将元组,将元组x的的Sno值值(201215121)传送给内层查询。)传送给内层查询。SELECTAVG(Grade)FROMSCyWHEREy.Sno=201215121;2024/7/2039关系数据库标准语言SQL最新课件带有
28、比较运算符的子查询(续)带有比较运算符的子查询(续)v可能的执行过程(续)可能的执行过程(续)n执行内层查询,得到值执行内层查询,得到值88(近似值),用该值代替内(近似值),用该值代替内层查询,得到外层查询:层查询,得到外层查询:SELECTSno,CnoFROMSCxWHEREGrade=88;2024/7/2040关系数据库标准语言SQL最新课件带有比较运算符的子查询(续)带有比较运算符的子查询(续)v可能的执行过程(续)可能的执行过程(续)n执行这个查询,得到执行这个查询,得到(201215121,1)(201215121,3)然后外层查询取出下一个元组重复做上述然后外层查询取出下一个
29、元组重复做上述至至步骤,直步骤,直到外层的到外层的SC元组全部处理完毕。结果为元组全部处理完毕。结果为:(201215121,1)(201215121,3)(201215122,2)2024/7/2041关系数据库标准语言SQL最新课件3.4.3嵌套查询嵌套查询1.带有带有IN谓词的子查询谓词的子查询2.带有比较运算符的子查询带有比较运算符的子查询3.带有带有ANY(SOME)或)或ALL谓词的子查询谓词的子查询4.带有带有EXISTS谓词的子查询谓词的子查询2024/7/2042关系数据库标准语言SQL最新课件带有带有ANY(SOME)或)或ALL谓词的子查询谓词的子查询(续)(续)使用使用
30、ANY或或ALL谓词时必须同时使用比较运算谓词时必须同时使用比较运算语义为:语义为:ANY大于子查询结果中的某个值大于子查询结果中的某个值ALL大于子查询结果中的所有值大于子查询结果中的所有值ANY小于子查询结果中的某个值小于子查询结果中的某个值=ANY大于等于子查询结果中的某个值大于等于子查询结果中的某个值=ALL大于等于子查询结果中的所有值大于等于子查询结果中的所有值2024/7/2043关系数据库标准语言SQL最新课件带有带有ANY(SOME)或)或ALL谓词的子查询谓词的子查询(续)(续)使用使用ANY或或ALL谓词时必须同时使用比较运算谓词时必须同时使用比较运算语义为(续)语义为(续
31、)=ANY小于等于子查询结果中的某个值小于等于子查询结果中的某个值=ALL小于等于子查询结果中的所有值小于等于子查询结果中的所有值=ANY等于子查询结果中的某个值等于子查询结果中的某个值=ALL等于子查询结果中的所有值(通常没有实际意义)等于子查询结果中的所有值(通常没有实际意义)!=(或(或)ANY 不等于子查询结果中的某个值不等于子查询结果中的某个值!=(或(或)ALL 不等于子查询结果中的任何一个值不等于子查询结果中的任何一个值2024/7/2044关系数据库标准语言SQL最新课件带有带有ANY(SOME)或)或ALL谓词的子查询谓词的子查询(续)(续)例例3.58查询非计算机科学系中比
32、计算机科学系任意一个查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄学生年龄小的学生姓名和年龄SELECTSname,SageFROMStudentWHERESageANY(SELECTSageFROMStudentWHERESdept=CS)ANDSdeptCS;/*父查询块中的条件父查询块中的条件*/2024/7/2045关系数据库标准语言SQL最新课件带有带有ANY(SOME)或)或ALL谓词的子查询谓词的子查询(续)(续)结果:结果:执行过程:执行过程:(1)首先处理子查询,找出首先处理子查询,找出CS系中所有学生的年龄,系中所有学生的年龄,构成一个集合构成一个集合
33、(20,19)(2)处理父查询,找所有不是处理父查询,找所有不是CS系且年龄小于系且年龄小于20或或19的学生的学生SnameSage王敏王敏18张立张立192024/7/2046关系数据库标准语言SQL最新课件带有带有ANY(SOME)或)或ALL谓词的子查询谓词的子查询(续)(续)用聚集函数实现用聚集函数实现例例3.58SELECTSname,SageFROMStudentWHERESage(SELECTMAX(Sage)FROMStudentWHERESdept=CS)ANDSdeptCS;2024/7/2047关系数据库标准语言SQL最新课件带有带有ANY(SOME)或)或ALL谓词的
34、子查询谓词的子查询(续)(续)例例3.59查询非计算机科学系中比计算机科学系查询非计算机科学系中比计算机科学系所有所有学学生年龄都小的学生姓名及年龄。生年龄都小的学生姓名及年龄。方法一:用方法一:用ALL谓词谓词SELECTSname,SageFROMStudentWHERESageALL(SELECTSageFROMStudentWHERESdept=CS)ANDSdeptCS;2024/7/2048关系数据库标准语言SQL最新课件带有带有ANY(SOME)或)或ALL谓词的子查询谓词的子查询(续)(续)方法二:用聚集函数方法二:用聚集函数SELECTSname,SageFROMStuden
35、tWHERESage(SELECTMIN(Sage)FROMStudentWHERESdept=CS)ANDSdeptCS;2024/7/2049关系数据库标准语言SQL最新课件带有带有ANY(SOME)或)或ALL谓词的子查询谓词的子查询(续)(续)表表3.7ANY(或(或SOME),),ALL谓词与聚集函数、谓词与聚集函数、IN谓词的等谓词的等价转换关系价转换关系=或或!=ANYIN-MAXMIN=MINALL-NOTINMINMAX=MAX2024/7/2050关系数据库标准语言SQL最新课件3.4.3嵌套查询嵌套查询1.带有带有IN谓词的子查询谓词的子查询2.带有比较运算符的子查询带有
36、比较运算符的子查询3.带有带有ANY(SOME)或)或ALL谓词的子查询谓词的子查询4.带有带有EXISTS谓词的子查询谓词的子查询2024/7/2051关系数据库标准语言SQL最新课件带有带有EXISTS谓词的子查询谓词的子查询vEXISTS谓词谓词n存在量词存在量词 n带有带有EXISTS谓词的子查询不返回任何数据,只产生逻辑谓词的子查询不返回任何数据,只产生逻辑真值真值“true”或逻辑假值或逻辑假值“false”。l若内层查询结果非空,则外层的若内层查询结果非空,则外层的WHERE子句返回真值子句返回真值l若内层查询结果为空,则外层的若内层查询结果为空,则外层的WHERE子句返回假值子
37、句返回假值n由由EXISTS引出的子查询,其目标列表达式通常都用引出的子查询,其目标列表达式通常都用*,因为带因为带EXISTS的子查询只返回真值或假值,给出列名无的子查询只返回真值或假值,给出列名无实际意义。实际意义。2024/7/2052关系数据库标准语言SQL最新课件vNOTEXISTS谓词谓词n若内层查询结果非空,则外层的若内层查询结果非空,则外层的WHERE子句返回假值子句返回假值n若内层查询结果为空,则外层的若内层查询结果为空,则外层的WHERE子句返回真值子句返回真值带有带有EXISTS谓词的子查询(续)谓词的子查询(续)2024/7/2053关系数据库标准语言SQL最新课件带有
38、带有EXISTS谓词的子查询(续)谓词的子查询(续)例例3.60查询所有选修了查询所有选修了1号课程的学生姓名。号课程的学生姓名。思路分析:思路分析:n本查询涉及本查询涉及Student和和SC关系关系n在在Student中依次取每个元组的中依次取每个元组的Sno值,用此值去检查值,用此值去检查SC表表n若若SC中存在这样的元组,其中存在这样的元组,其Sno值等于此值等于此Student.Sno值,值,并且其并且其Cno=1,则取此,则取此Student.Sname送入结果表送入结果表SELECTSnameFROMStudentWHEREEXISTS(SELECT*FROMSCWHERESno
39、=Student.SnoANDCno=1); 2024/7/2054关系数据库标准语言SQL最新课件带有带有EXISTS谓词的子查询(续)谓词的子查询(续)例例3.61查询没有选修查询没有选修1 1号课程的学生姓名。号课程的学生姓名。SELECTSnameFROMStudentWHERENOTEXISTS(SELECT*FROMSCWHERESno=Student.SnoANDCno=1);2024/7/2055关系数据库标准语言SQL最新课件带有带有EXISTS谓词的子查询(续)谓词的子查询(续)v 不同形式的查询间的替换不同形式的查询间的替换n一些带一些带EXISTS或或NOTEXISTS
40、谓词的子查询不能被其他谓词的子查询不能被其他形式的子查询等价替换形式的子查询等价替换n所有带所有带IN谓词、比较运算符、谓词、比较运算符、ANY和和ALL谓词的子查询谓词的子查询都能用带都能用带EXISTS谓词的子查询等价替换谓词的子查询等价替换v用用EXISTS/NOTEXISTS实现全称量词(难点)实现全称量词(难点)nSQL语言中没有全称量词语言中没有全称量词 (Forall)n可以把带有全称量词的谓词转换为等价的带有存在量词可以把带有全称量词的谓词转换为等价的带有存在量词的谓词:的谓词:( x)P ( x( P) 2024/7/2056关系数据库标准语言SQL最新课件带有带有EXIST
41、S谓词的子查询(续)谓词的子查询(续)例例3.55查询与查询与“刘晨刘晨”在同一个系学习的学生。在同一个系学习的学生。可以用带可以用带EXISTS谓词的子查询替换:谓词的子查询替换:SELECTSno,Sname,SdeptFROMStudentS1WHEREEXISTS(SELECT*FROMStudentS2WHERES2.Sdept=S1.SdeptANDS2.Sname=刘晨刘晨);2024/7/2057关系数据库标准语言SQL最新课件带有带有EXISTS谓词的子查询谓词的子查询(续续)例例3.62查询选修了全部课程的学生姓名。查询选修了全部课程的学生姓名。SELECTSnameFRO
42、MStudentWHERENOTEXISTS(SELECT*FROMCourseWHERENOTEXISTS(SELECT*FROMSCWHERESno=Student.SnoANDCno=Course.Cno);v参见爱课程网数据库系统概论数据查询节动画参见爱课程网数据库系统概论数据查询节动画EXISTS子查询子查询2024/7/2058关系数据库标准语言SQL最新课件带有带有EXISTS谓词的子查询谓词的子查询(续续)v用用EXISTS/NOTEXISTS实现逻辑蕴涵实现逻辑蕴涵(难点难点)nSQL语言中没有蕴涵语言中没有蕴涵(Implication)逻辑运算逻辑运算n可以利用谓词演算将逻
43、辑蕴涵谓词等价转换为:可以利用谓词演算将逻辑蕴涵谓词等价转换为:pq p q2024/7/2059关系数据库标准语言SQL最新课件带有带有EXISTS谓词的子查询谓词的子查询(续续)例例3.63查询至少选修了学生查询至少选修了学生201215122选修的全部课程的选修的全部课程的学生号码。学生号码。解题思路:解题思路:n用逻辑蕴涵表达:查询学号为用逻辑蕴涵表达:查询学号为x的学生,对所有的课程的学生,对所有的课程y,只要只要201215122学生选修了课程学生选修了课程y,则,则x也选修了也选修了y。n形式化表示:形式化表示:用用P表示谓词表示谓词“学生学生201215122选修了课程选修了课
44、程y”用用q表示谓词表示谓词“学生学生x选修了课程选修了课程y”则上述查询为则上述查询为:( y)pq2024/7/2060关系数据库标准语言SQL最新课件带有带有EXISTS谓词的子查询谓词的子查询(续续)n等价变换:等价变换:( y)pq ( y( (pq) ( y( ( p q) y(p q)n变换后语义:不存在这样的课程变换后语义:不存在这样的课程y,学生,学生201215122201215122选修了选修了y,而学生,而学生x没有选。没有选。2024/7/2061关系数据库标准语言SQL最新课件带有带有EXISTS谓词的子查询谓词的子查询(续续)n用用NOTEXISTS谓词表示:谓词
45、表示:SELECTDISTINCTSnoFROMSCSCXWHERENOTEXISTS(SELECT*FROMSCSCYWHERESCY.Sno=201215122ANDNOTEXISTS(SELECT*FROMSCSCZWHERESCZ.Sno=SCX.SnoANDSCZ.Cno=SCY.Cno);2024/7/2062关系数据库标准语言SQL最新课件3.4数据查询数据查询3.4.1单表查询单表查询3.4.2连接查询连接查询3.4.3嵌套查询嵌套查询3.4.4集合查询集合查询3.4.5基于派生表的查询基于派生表的查询3.4.5Select语句的一般形式语句的一般形式2024/7/2063关系
46、数据库标准语言SQL最新课件3.4.4集合查询集合查询v集合操作的种类集合操作的种类n并操作并操作UNIONn交操作交操作INTERSECTn差操作差操作EXCEPTv参参加加集集合合操操作作的的各各查查询询结结果果的的列列数数必必须须相相同同;对对应应项的数据类型也必须相同项的数据类型也必须相同2024/7/2064关系数据库标准语言SQL最新课件集合查询(续)集合查询(续)例例3.64查询计算机科学系的学生及年龄不大于查询计算机科学系的学生及年龄不大于19岁的学生。岁的学生。SELECT*FROMStudentWHERESdept=CSUNIONSELECT*FROMStudentWHER
47、ESage=19;nUNION:将多个查询结果合并起来时,系统自动去掉重复元组:将多个查询结果合并起来时,系统自动去掉重复元组nUNIONALL:将多个查询结果合并起来时,保留重复元组:将多个查询结果合并起来时,保留重复元组2024/7/2065关系数据库标准语言SQL最新课件集合查询(续)集合查询(续)例例3.65查询选修了课程查询选修了课程1或者选修了课程或者选修了课程2的学生。的学生。SELECTSnoFROMSCWHERECno=1UNIONSELECTSnoFROMSCWHERECno=2;2024/7/2066关系数据库标准语言SQL最新课件集合查询(续)集合查询(续)例例3.66
48、查询计算机科学系的学生与年龄不大于查询计算机科学系的学生与年龄不大于19岁的学生岁的学生的交集。的交集。SELECT*FROMStudentWHERESdept=CSINTERSECTSELECT*FROMStudentWHERESage=192024/7/2067关系数据库标准语言SQL最新课件集合查询(续)集合查询(续)例例3.66实际上就是查询计算机科学系中年龄不大实际上就是查询计算机科学系中年龄不大于于19岁的学生。岁的学生。SELECT* FROMStudent WHERESdept=CSANDSage=19;2024/7/2068关系数据库标准语言SQL最新课件集合查询(续)集合查
49、询(续)例例3.67查询既选修了课程查询既选修了课程1又选修了课程又选修了课程2的学生。的学生。SELECTSnoFROMSCWHERECno=1INTERSECTSELECTSnoFROMSCWHERECno=2;2024/7/2069关系数据库标准语言SQL最新课件集合查询(续)集合查询(续)例例3.67也可以表示为:也可以表示为:SELECTSnoFROMSCWHERECno=1ANDSnoIN(SELECTSnoFROMSCWHERECno=2);2024/7/2070关系数据库标准语言SQL最新课件集合查询(续)集合查询(续)例例3.68查询计算机科学系的学生与年龄不大于查询计算机科
50、学系的学生与年龄不大于19岁的岁的学生的差集。学生的差集。SELECT*FROMStudentWHERESdept=CSEXCEPTSELECT*FROMStudentWHERESage19;2024/7/2072关系数据库标准语言SQL最新课件3.4数据查询数据查询3.4.1单表查询单表查询3.4.2连接查询连接查询3.4.3嵌套查询嵌套查询3.4.4集合查询集合查询3.4.5基于派生表的查询基于派生表的查询3.4.6Select语句的一般形式语句的一般形式2024/7/2073关系数据库标准语言SQL最新课件3.4.5基于派生表的查询基于派生表的查询v子查询不仅可以出现在子查询不仅可以出现
51、在WHERE子句中,还可以出子句中,还可以出现在现在FROM子句中,这时子查询生成的临时派生表子句中,这时子查询生成的临时派生表(DerivedTable)成为主查询的查询对象)成为主查询的查询对象例例3.57找出每个学生超过他自己选修课程平均成绩的课程号找出每个学生超过他自己选修课程平均成绩的课程号SELECTSno,CnoFROMSC,(SELECTSno,Avg(Grade)FROMSCGROUPBYSno)ASAvg_sc(avg_sno,avg_grade)WHERESC.Sno=Avg_sc.avg_snoandSC.Grade=Avg_sc.avg_grade2024/7/207
52、4关系数据库标准语言SQL最新课件基于派生表的查询(续)基于派生表的查询(续)v如果子查询中没有聚集函数,派生表可以不指定属性如果子查询中没有聚集函数,派生表可以不指定属性列,子查询列,子查询SELECT子句后面的列名为其缺省属性。子句后面的列名为其缺省属性。例例3.60查询所有选修了查询所有选修了1 1号课程的学生姓名,可以用如下查询完号课程的学生姓名,可以用如下查询完成:成:SELECTSnameFROMStudent,(SELECTSnoFROMSCWHERECno=1)ASSC1WHEREStudent.Sno=SC1.Sno;2024/7/2075关系数据库标准语言SQL最新课件3.
53、4.1单表查询单表查询3.4.2连接查询连接查询3.4.3嵌套查询嵌套查询3.4.4集合查询集合查询3.4.5基于派生表的查询基于派生表的查询3.4.6SELECT语句的一般形式语句的一般形式3.4数据查询数据查询2024/7/2076关系数据库标准语言SQL最新课件3.4.6SELECT语句的一般格式语句的一般格式SELECTALL|DISTINCT别名别名,别名别名FROM别名别名,别名别名|()ASWHEREGROUPBYHAVINGORDERBYASC|DESC;2024/7/2077关系数据库标准语言SQL最新课件1.目标列表达式的可选格式目标列表达式的可选格式v目标列表达式格式目标
54、列表达式格式(1)*(2).*(3)COUNT(DISTINCT|ALL*)(4).,.其中其中可以是由属性列、作用于属性列可以是由属性列、作用于属性列的聚集函数和常量的任意算术运算(的聚集函数和常量的任意算术运算(+,-,*,/)组成的)组成的运算公式运算公式2024/7/2078关系数据库标准语言SQL最新课件2.聚集函数的一般格式聚集函数的一般格式COUNTSUMAVG(DISTINCT|ALL)MAXMIN2024/7/2079关系数据库标准语言SQL最新课件3.WHERE子句的条件表达式的可选格式子句的条件表达式的可选格式(1)ANY|ALL(SELECT语句语句)(2)NOTBETWEENAND(SELECT语句语句)(SELECT语句语句)2024/7/2080关系数据库标准语言SQL最新课件WHERE子句的条件表达式格式(续)子句的条件表达式格式(续)(3)(,)NOTIN (SELECT语句语句)(4)NOTLIKE(5)ISNOTNULL(6)NOTEXISTS(SELECT语句语句)2024/7/2081关系数据库标准语言SQL最新课件WHERE子句的条件表达式格式(续)子句的条件表达式格式(续)(7)ANDANDOROR2024/7/2082关系数据库标准语言SQL最新课件