数据库系统(三.3).ppt
《数据库系统(三.3).ppt》由会员分享,可在线阅读,更多相关《数据库系统(三.3).ppt(117页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第3章 关系数据库标准语言SQL1 13.4 数据查询u单表查询u连接查询u嵌套查询u集合查询uSelect语句的一般形式2 23.4 数据查询-嵌套查询u嵌套查询一个一个SELECT-FROM-WHERE语句称为一个语句称为一个查询块将一个查询块嵌套在另一个查询块的将一个查询块嵌套在另一个查询块的WHERE子句或子句或HAVING短语的条件中的查询称为短语的条件中的查询称为嵌套查询 SELECT Sname/*外层查询外层查询/父查询父查询*/FROM Student WHERE Sno IN (SELECT Sno /*内层查询内层查询/子查询子查询*/FROM SC WHERE Cno=
2、2););3 33.4 数据查询-嵌套查询u嵌套查询子查询的限制子查询的限制不能使用不能使用ORDER BY子句子句层层嵌套方式反映了层层嵌套方式反映了 SQL语言的结构化语言的结构化有些嵌套查询可以用连接运算替代有些嵌套查询可以用连接运算替代4 43.4 数据查询-嵌套查询u嵌套查询求解方法不相关子查询不相关子查询子查询的查询条件不依赖于父查询子查询的查询条件不依赖于父查询由里向外由里向外 逐层处理。即每个子查询在上一级查询逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询处理之前求解,子查询的结果用于建立其父查询的查找条件。的查找条件。5 53.4 数据查询-嵌套
3、查询u嵌套查询求解方法相关子查询:子查询的查询条件依赖于父查询相关子查询:子查询的查询条件依赖于父查询首先取外层查询中表的第一个元组,根据它与首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结子句返回值为真,则取此元组放入结果表果表然后再取外层表的下一个元组然后再取外层表的下一个元组重复这一过程,直至外层表全部检查完为止重复这一过程,直至外层表全部检查完为止6 63.4 数据查询-嵌套查询u带有IN谓词的子查询u带有比较运算符的子查询u带有ANY(SOME)或ALL谓词的子查询u带有EXIS
4、TS谓词的子查询7 73.4 数据查询-嵌套查询u带有IN谓词的子查询u带有比较运算符的子查询u带有ANY(SOME)或ALL谓词的子查询u带有EXISTS谓词的子查询8 83.4 数据查询-嵌套查询u带有IN谓词的子查询例例67 查询与查询与“刘晨刘晨”在同一个系学习的学生。在同一个系学习的学生。此查询要求可以分步来完成此查询要求可以分步来完成 确定确定“刘晨刘晨”所在系所在系 SELECT Sdept FROM Student WHERE Sname=刘晨刘晨;结结果果为为:29 93.4 数据查询-嵌套查询u带有IN谓词的子查询例例67 查询与查询与“刘晨刘晨”在同一个系学习的学生。在同
5、一个系学习的学生。查找所有在查找所有在2系学习的学生。系学习的学生。SELECT Sno,Sname,Sdept FROM Student WHERE Sdept=2;2刘晨刘晨2002151222李勇李勇200215121SdeptSnameSno10103.4 数据查询-嵌套查询u带有IN谓词的子查询例例67 查询与查询与“刘晨刘晨”在同一个系学习的学生。在同一个系学习的学生。将第一步查询嵌入到第二步查询的条件中将第一步查询嵌入到第二步查询的条件中 SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN (SELECT Sdept FROM S
6、tudent WHERE Sname=刘晨);此查询为不相关子查询。11113.4 数据查询-嵌套查询 用自身连接完成用自身连接完成例例67查询要求查询要求 SELECT S1.Sno,S1.Sname,S1.Sdept FROM Student S1,Student S2 WHERE S1.Sdept=S2.Sdept AND S2.Sname=刘晨刘晨;12123.4 数据查询-嵌套查询u带有IN谓词的子查询例例68查询选修了课程名为查询选修了课程名为“信息系统信息系统”的学生学号的学生学号和姓名和姓名13133.4 数据查询-嵌套查询 SELECT Sno,Sname FROM Stud
7、entWHERE Sno IN SELECT Sno FROM SC WHERE Cno IN SELECT Cno FROM Course WHERE Cname=信息系信息系统统 )最后在最后在Student关系关系中取出中取出Sno和和Sname 然后在然后在SC关系中找出选关系中找出选 修了修了3号课程的学生学号号课程的学生学号 首先在首先在Course关系关系中找出中找出“信息系统信息系统”的课程号,为的课程号,为3号号();(14143.4 数据查询-嵌套查询用连接查询实现用连接查询实现例例68 SELECT Sno,Sname FROM Student,SC,Course WHE
8、RE Student.Sno=SC.Sno AND SC.Cno=Course.Cno AND Course.Cname=信息系统信息系统;15153.4 数据查询-嵌套查询u带有IN谓词的子查询对对例例51“求有两门以上不及格课程的同学的学号及求有两门以上不及格课程的同学的学号及其平均成绩其平均成绩”给出正确语句给出正确语句 Select Sno,AVG(Score)From SC Where Sno in (Select Sno From SC Where Score 2)Group by Sno;16163.4 数据查询-嵌套查询u带有IN谓词的子查询重新改写重新改写例例61“求既学过求
9、既学过1号课程号课程,又学过又学过2号课程号课程的学生的学号的学生的学号”,用嵌套查询实现,用嵌套查询实现 Select Sno From SC Where Cno=1 and Sno in (Select Sno From SC Cno=2 );17173.4 数据查询-嵌套查询u带有IN谓词的子查询例例69 列出没学过李明老师讲授课程的所有同学的列出没学过李明老师讲授课程的所有同学的姓名姓名 Select Sname From Student Where Sno not in (Select Sno From SC,Prof,Course Where Prof.Pname=李明李明 and
10、 Prof.Pno=Course.Pno and SC.Cno=Course.Cno);18183.4 数据查询-嵌套查询u带有IN谓词的子查询u带有比较运算符的子查询u带有ANY(SOME)或ALL谓词的子查询u带有EXISTS谓词的子查询19193.4 数据查询-嵌套查询u带有比较运算符的子查询当能确切知道内层查询返回当能确切知道内层查询返回单值时,可用比较运算时,可用比较运算符(符(,=,=,!=或或)。)。20203.4 数据查询-嵌套查询u带有比较运算符的子查询例:假设一个学生只可能在一个系学习,并且必须例:假设一个学生只可能在一个系学习,并且必须属于一个系,则在属于一个系,则在例例
11、67可以可以用=代替IN:SELECT Sno,Sname,SdeptFROM StudentWHERE Sdept =(SELECT Sdept FROM Student WHERE Sname=刘晨刘晨);21213.4 数据查询-嵌套查询u带有比较运算符的子查询错误的例子:错误的例子:SELECT Sno,Sname,Sdept FROM Student WHERE(SELECT Sdept FROM Student WHERE Sname=刘晨刘晨 )=Sdept;子查询一定要跟在比较符之后子查询一定要跟在比较符之后22223.4 数据查询-嵌套查询u带有比较运算符的子查询例例70找出
12、每个学生超过他选修课程平均成绩的找出每个学生超过他选修课程平均成绩的课程号。课程号。SELECT Sno,CnoFROM SC xWHERE Grade=(SELECT AVG(Grade)FROM SC y WHERE y.Sno=x.Sno);此此查询为查询为相关子相关子查询查询23233.4 数据查询-嵌套查询u带有比较运算符的子查询可能的执行过程可能的执行过程(1)从外层查询中取出从外层查询中取出SC的一个元组的一个元组x,将元组,将元组x的的Sno值(值(200215121)传送给内层查询。)传送给内层查询。SELECT AVG(Grade)FROM SC y WHERE y.Sno
13、=200215121;24243.4 数据查询-嵌套查询u带有比较运算符的子查询可能的执行过程可能的执行过程(2)执行内层查询,得到值执行内层查询,得到值88(近似值),用该值(近似值),用该值代替内层查询,得到外层查询:代替内层查询,得到外层查询:SELECT Sno,Cno FROM SC x WHERE Grade=88;25253.4 数据查询-嵌套查询u带有比较运算符的子查询可能的执行过程可能的执行过程(3)执行这个查询,得到执行这个查询,得到 (200215121,1)(200215121,3)26263.4 数据查询-嵌套查询u带有比较运算符的子查询可能的执行过程可能的执行过程(
14、4)外层查询取出下一个元组重复做上述外层查询取出下一个元组重复做上述1至至3步步骤,直到外层的骤,直到外层的SC元组全部处理完毕。结果为元组全部处理完毕。结果为:(200215121,1)(200215121,3)(200215122,2)27273.3 数据查询-嵌套查询u带有比较运算符的子查询例例75找出所有课程都不及格的学生姓名找出所有课程都不及格的学生姓名。SELECT Sname FROM Student WHERE 60 (SELECT max(Grade)FROM SC WHERE Sno=Sudent.Sno);28283.4 数据查询-嵌套查询u带有IN谓词的子查询u带有比较
15、运算符的子查询u带有ANY(SOME)或ALL谓词的子查询u带有EXISTS谓词的子查询29293.4 数据查询-嵌套查询u带有ANY(SOME)或ALL谓词的子查询谓词语义谓词语义ANY:任意一个值:任意一个值ALL:所有值:所有值30303.4 数据查询-嵌套查询u带有ANY(SOME)或ALL谓词的子查询需要配合使用比较运算符需要配合使用比较运算符 ANY大于子大于子查询结查询结果中的某个果中的某个值值 ALL大于子大于子查询结查询结果中的所有果中的所有值值 ANY小于子小于子查询结查询结果中的某个果中的某个值值 =ANY大于等于子大于等于子查询结查询结果中的某个果中的某个值值 =ALL
16、大于等于子大于等于子查询结查询结果中的所有果中的所有值值 31313.4 数据查询-嵌套查询u带有ANY(SOME)或ALL谓词的子查询需要配合使用比较运算符需要配合使用比较运算符 =ANY小于等于子小于等于子查询结查询结果中的某个果中的某个值值 =ALL小于等于子小于等于子查询结查询结果中的所有果中的所有值值 =ANY 等于子等于子查询结查询结果中的某个果中的某个值值 =ALL 等于子等于子查询结查询结果中的所有果中的所有值值 (通常没有(通常没有实际实际意意义义)!=(或(或)ANY不等于子不等于子查询结查询结果中的某个果中的某个值值 !=(或(或)ALL不等于子不等于子查询结查询结果中的
17、任何一果中的任何一个个值值32323.4 数据查询-嵌套查询u带有ANY(SOME)或ALL谓词的子查询例例71 查询其他系中比查询其他系中比1系某一学生年龄小的学系某一学生年龄小的学生姓名和年龄生姓名和年龄 SELECT Sname,SageFROM StudentWHERE Sage ANY (SELECT Sage FROM Student WHERE Dno=1)AND Dno 1 ;33333.4 数据查询-嵌套查询 结果:结果:执行过程:执行过程:1.RDBMS执行此查询时,首先处理子查询,找出执行此查询时,首先处理子查询,找出1系中所有学生的年龄,构成一个集合系中所有学生的年龄,
18、构成一个集合(20,19)2.处理父查询,找所有不是处理父查询,找所有不是1系且年龄小于系且年龄小于20 或 19的学生的学生SnameSage王敏王敏张立张立181934343.4 数据查询-嵌套查询u带有ANY(SOME)或ALL谓词的子查询用聚集函数实现用聚集函数实现例例71SELECT Sname,Sage FROM Student WHERE Sage (SELECT MAX(Sage)FROM Student WHERE Dno=1)AND Dno 1 ;35353.4 数据查询-嵌套查询u带有ANY(SOME)或ALL谓词的子查询例例72 查询其他系中比查询其他系中比1系系所有学
19、生年龄都小的学生年龄都小的学生姓名及年龄。学生姓名及年龄。方法一:用方法一:用ALL谓词谓词 SELECT Sname,Sage FROM Student WHERE Sage ALL (SELECT Sage FROM Student WHERE Dno=1)AND Dno 1;36363.4 数据查询-嵌套查询u带有ANY(SOME)或ALL谓词的子查询例例72 查询其他系中比查询其他系中比1系系所有学生年龄都小的学生学生年龄都小的学生姓名及年龄。姓名及年龄。方法二:用聚集函数方法二:用聚集函数 SELECT Sname,Sage FROM Student WHERE Sage (SELE
20、CT MIN(Sage)FROM Student WHERE Dno=1)AND Dno 1;37373.4 数据查询-嵌套查询u带有ANY(SOME)或ALL谓词的子查询ANY(或(或SOME),),ALL谓词与聚集函数、谓词与聚集函数、IN谓词谓词的等价转换关系的等价转换关系=或或!=ANYIN-MAXMIN=MINALL-NOT INMINMAX=MAX38383.4 数据查询-嵌套查询u带有ANY(SOME)或ALL谓词的子查询例例73找出工资最低的教师姓名找出工资最低的教师姓名。SELECT Pname FROM Prof WHERE Sal=all (SELECT Sal FROM
21、 Prof);39393.4 数据查询-嵌套查询u带有ANY(SOME)或ALL谓词的子查询例例74找出找出1号课成绩不是最高的所有学生的学号课成绩不是最高的所有学生的学号号。SELECT Sno FROM SC WHERE Cno=1 and Grade=all(select avg(Grade)from SC group by Sno)41413.4 数据查询-嵌套查询u带有IN谓词的子查询u带有比较运算符的子查询u带有ANY(SOME)或ALL谓词的子查询u带有EXISTS谓词的子查询42423.4 数据查询-嵌套查询u带有EXISTS谓词的子查询EXISTS谓词谓词存在量词存在量词 带
22、有带有EXISTS谓词的子查询不返回任何数据,只产谓词的子查询不返回任何数据,只产生逻辑真值生逻辑真值“true”或逻辑假值或逻辑假值“false”。l若内层查询结果非空,则外层的若内层查询结果非空,则外层的WHERE子句返回子句返回真值真值l若内层查询结果为空,则外层的若内层查询结果为空,则外层的WHERE子句返回子句返回假值假值由由EXISTS引出的子查询,其目标列表达式通常都引出的子查询,其目标列表达式通常都用用*,因为带,因为带EXISTS的子查询只返回真值或假值,的子查询只返回真值或假值,给出列名无实际意义给出列名无实际意义43433.4 数据查询-嵌套查询u带有EXISTS谓词的子
23、查询NOT EXISTS谓词谓词若内层查询结果非空,则外层的若内层查询结果非空,则外层的WHERE子句返子句返回假值回假值若内层查询结果为空,则外层的若内层查询结果为空,则外层的WHERE子句返子句返回真值回真值44443.4 数据查询-嵌套查询u带有EXISTS谓词的子查询例例76查询所有选修了查询所有选修了1号课程的学生姓名。号课程的学生姓名。思路分析:思路分析:本查询涉及本查询涉及Student和和SC关系关系在在Student中依次取每个元组的中依次取每个元组的Sno值,用此值去值,用此值去检查检查SC关系关系若若SC中存在这样的元组,其中存在这样的元组,其Sno值等于此值等于此Stu
24、dent.Sno值,并且其值,并且其Cno=1,则取此,则取此Student.Sname送入结果关系送入结果关系45453.4 数据查询-嵌套查询u带有EXISTS谓词的子查询例例76查询所有选修了查询所有选修了1号课程的学生姓名。号课程的学生姓名。用嵌套查询用嵌套查询 SELECT Sname FROM Student WHERE EXISTS (SELECT*FROM SC WHERE Sno=Student.Sno AND Cno=1);46463.4 数据查询-嵌套查询u带有EXISTS谓词的子查询例例76查询所有选修了查询所有选修了1号课程的学生姓名。号课程的学生姓名。用用连连接运算
25、接运算SELECT SnameFROM Student,SCWHERE Student.Sno=SC.Sno AND SC.Cno=1;47473.4 数据查询-嵌套查询u带有EXISTS谓词的子查询例例77 查询没有选修查询没有选修1号课程的学生姓名。号课程的学生姓名。SELECT Sname FROM Student WHERE NOT EXISTS (SELECT*FROM SC WHERE Sno=Student.Sno AND Cno=1);48483.4 数据查询-嵌套查询u带有EXISTS谓词的子查询不同形式的查询间的替换不同形式的查询间的替换一些带一些带EXISTS或或NOT
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 系统
限制150内