L07_Oracle数据库编程_QUST.pdf
《L07_Oracle数据库编程_QUST.pdf》由会员分享,可在线阅读,更多相关《L07_Oracle数据库编程_QUST.pdf(87页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据操作语句数据查询(二)嵌套查询(子查询)概述 一个SELECT-FROM-WHERE语句称为一个查询块 将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询 包含子查询的语句称为主查询或外层查询 子查询也可以嵌套在另一个子查询中 为了与外层查询有所区别,总是把子查询写在圆括号中概述SELECTSnameFROMStudentWHERESno IN(SELECTSno FROMSCWHERECno=2);外层查询/父查询 内层查询/子查询概述 子查询语句通常出现在外层查询的WHERE子句或HAVING子句中,与运算符一起构成查询条件 不相关子查询 子查询
2、条件不依赖于父查询 相关子查询 子查询条件依赖于父查询概述WHERE列名 NOTIN(子查询)WHERE列名 比较运算符(子查询)WHEREEXISTS(子查询)子查询的结果往往是一个集合,IN就是在这个集合中进行操作连接词IN测试元组是否是集合中成员子查询不能使用ORDERBY子句有些嵌套查询可以用连接运算替代示例求选修了课程名为J的学生学号和姓名SC:S#C#GS:S#SNSDSAC:C#CNPC#在C中找课程J的编号 在SC中找选修该课的学号 在S中找选修该课的学生姓名S1ACS20S2BCS21S3CMA19S4DCI19S5EMA20S6FCS22C1GC2HC1C3IC1C4JC2
3、C5KC4S1C1AS1C2AS1C3AS1C5BS2C1BS2C2CS2C4CS3C2BS3C3CS3C4BS4C3BS4C5DS5C2CS5C3BS5C5BS6C4AS6C5ASELECTS.S#,S.SNFROMSJOINSCONS.S#=SC.S#,JOINCONSC.C#=C.C#WHEREC.CN=“J”;分析:可用连接来实现,但最后结果只包含S中的字段,应该考虑更为有效、直观的方法:示例 在C中找课程J的编号 在SC中找选修该课的学号 在S中找选修该课的学生姓名SELECTC#FROMCWHERECN=J;SELECTS#FROMSCWHEREC#IN(C4);SELECTS#,
4、SNFROMSWHERES#IN(S2,S3,S6);C:C#CNPC#S1ACS20S2BCS21S3CMA19S4DCI19S5EMA20S6FCS22C1GC2HC1C3IC1C4JC2C5KC4S1C1AS1C2AS1C3AS1C5BS2C1BS2C2CS2C4CS3C2BS3C3CS3C4BS4C3BS4C5DS5C2CS5C3BS5C5BS6C4AS6C5AS:S#SNSDSA示例SELECTS#FROMSCWHEREC#IN(C4);SELECTS#,SNFROMSWHERES#IN(S2,S3,S6);最后的查询语句:SELECTC#FROMCWHERECN=J()();在C中
5、找课程J的编号 在SC中找选修该课的学号 在S中找选修该课的学生姓名SELECTC#FROMCWHERECN=J;SELECTS#FROMSCWHEREC#IN(C4);SELECTS#,SNFROMSWHERES#IN(S2,S3,S6);示例 查询与“刘晨”在同一个系学习的学生 第一步:确定“刘晨”所在系名SELECTSdeptFROMStudentWHERESname=刘晨;SdeptIS示例 查询与“刘晨”在同一个系学习的学生 第二步:查找所有在IS系学习的学生SELECTSno,Sname,SdeptFROMStudentWHERESdept=IS;SnoSnameSdept9500
6、1刘晨IS95004张立IS示例 查询与“刘晨”在同一个系学习的学生 第三步:将第一步查询嵌入到第二步查询的条件中 SELECTSno,Sname,Sdept FROMStudent WHERESdept IN(SELECTSdept FROMStudentWHERESname=刘晨)ANDSname!=刘晨;示例 查询考试成绩大于90分的学生的学号和姓名SELECTSno,Sname FROMStudentWHERESno IN(SELECTSno FROMSCWHEREGrade90)等价于SELECTSC.Sno,Sname FROMStudentJOINSCONStudent.Sno=
7、SC.Sno WHEREGrade90等价于等价于示例 查询计算机系选了“C002”课程的学生,列出姓名和性别SELECTSname,Ssex FROMStudentWHERESno IN(SELECTSno FROMSCWHERECno=C002)ANDSdept=计算机系 等价于SELECTSname,Ssex FROMStudentSJOINSCONS.Sno=SC.SnoWHERESdept=计算机系ANDCno=C002等价于等价于示例 查询选修了“VB”课程的学生的学号和姓名SELECTSno,Sname FROMStudentWHERESno IN(SELECTSno FROMS
8、CWHERECno IN(SELECTCno FROMCourseWHERECname=VB)嵌套查询 在选修了VB课程的这些学生中,统计他们的选课门数和平均成绩SELECTSno 学号,COUNT(*)选课门数,AVG(Grade)平均成绩FROMSCWHERESno IN(SELECTSno FROMSCJOINCourseCONC.Cno=SC.CnoWHERECname=VB)GROUPBYSno不能用连接形式实现不能用连接形式实现嵌套查询 查询选修了“VB”课程的学生的学号、姓名和VB成绩SELECTStudent.Sno,Sname,GradeFROMStudentJOINSCON
9、Student.Sno=SC.SnoJOINCourseONCourse.Cno=SC.CnoWHERECname=VB不能纯用子查询实现不能纯用子查询实现嵌套查询 嵌套查询由内向外处理 SQL允许多层嵌套 嵌套查询中最常用的谓词是IN 嵌套查询层次分明、容易理解比较测试 当能确切知道内层查询返回单值时,可用比较运算符(,=,=或)WHERE列名 比较运算符(子查询)要求子查询语句必须是返回单值的查询语句 只返回至多一个记录、一个字段的查询为单值子查询 与ANY或ALL谓词配合使用比较测试 查询选了“C004”号课程且成绩高于此课程的平均成绩的学生的学号和成绩SELECTSno,GradeFR
10、OMSCWHERECno=C004ANDGrade(SELECTAVG(Grade)FROMSCWHERECno=C004)比较测试 查询计算机系年龄最大的学生的姓名和年龄SELECTSname,SageFROMStudentWHERESdept=计算机系ANDSage=(SELECTMAX(Sage)FROMStudentWHERESdept=计算机系)比较测试 查询考试平均成绩高于全体学生的总平均成绩的学生的学号和平均成绩SELECTSno,AVG(Grade)平均成绩FROMSCGROUPBYSnoHAVING AVG(Grade)(SELECTAVG(Grade)FROMSC)比较测试
11、 查询没有选修“C001”号课程的学生姓名和所在系SELECTSname,Sdept FROMStudentWHERESno NOTIN(SELECTSno FROMSCWHERECno=C001)注意:不能用连接查询和在子查询中否定的形式实现比较测试 找出每个学生超过他选修课程平均成绩的课程号 先得到某个学生的平均成绩(SELECTAVG(Grade)/某学生平均成绩FROM选课表/成绩在SC表中WHERE某学生)比较测试 找出每个学生超过他选修课程平均成绩的课程号 嵌入父查询SELECTSno,Cno FROMSC scxWHEREGrade=(SELECTAVG(Grade)FROMSC
12、sczWHEREscz.Sno=scx.Sno)再论子查询ANY、SOME和ALL比较运算符 ANY|SOME|ALL(子查询)ANY、SOME 只要子查询中有一行能使结果为真,则结果为真 ANY和SOME在功能上是一样的 ALL 当子查询中所有行都使结果为真时,则结果为真ANY、SOME和ALL表达方法含义ANY(或=ANY),SOME(或=SOME)大于(或等于)子查询结果中的某个值ALL 或=ALL大于(或等于)子查询结果中的所有值ANY(或=ANY)SOME(或=SOME)小于(或等于)子查询结果中的某个值ALL(或=ALL)小于(或等于)子查询结果中的所有值=ANY,=SOME等于子
13、查询结果中的某个值=ALL等于子查询结果中的所有值!=ANY(或ANY)!=SOME(或SOME)不等于子查询结果中的某个值!=ALL(或ALL)不等于子查询结果中的任何一个值ANY、SOME 查询其它系中比信息管理系某一学生年龄小的学生姓名和年龄SELECTSname,Sdept,SageFROMStudentWHERESageSOME(SELECTSageFROMStudentWHERESdept=信息管理系)ANDSdept!=信息管理系;等价于?ANY、SOME等价于:查询比信息管理系最大年龄小的其他系学生的姓名、所在系和年龄SELECTSname,SageFROMStudentWHE
14、RESage(SELECTMAX(Sage)FROMStudentWHERESdept=信息管理系)ANDSdept 信息管理系;用聚集函数实现子查询通常比直接用ANY或ALL查询效率要高ANY、SOME 查询至少获得一次成绩大于等于90的学生的姓名、所修的课程号和成绩SELECTSname,Cno,GradeFROMStudentSJOINSCONS.Sno=SC.SnoWHERES.Sno=SOME(SELECTSno FROMSCWHEREGrade=90);ANY、SOME 等价于:查询成绩大于等于90分的学生的姓名及所修的全部课程号和考试成绩SELECTSname,Cno,Grade
15、FROMStudentSJOINSCONS.Sno=SC.SnoWHERESC.Grade=90;SELECTSname,Cno,GradeFROMStudentSJOINSCONS.Sno=SC.SnoWHERESC.Sno IN(SELECTSC.Sno FROMSCWHERESC.Grade=90);ALL 查询比信息管理系所有学生的年龄都小的其他系学生的姓名及年龄SELECTSname,SageFROMStudentWHERESageALL(SELECTSageFROMStudentWHERESdept=信息管理系)ANDSdept!=信息管理系;ALL 等价于:查询其它系中年龄小于信
16、息管理系最小年龄的学生姓名和年龄SELECTSname,SageFROMStudentWHERESageSOME”意味着大于值中的任何一个,即大于最小的一个值“=SOME”与“IN”运算符功能相同“ALL”意味着大于所有的值,即大于最大值ANY、SOME与ALL与集函数的对应关系 表达式=SOME|ANY(子查询)表达式 IN(子查询)表达式=SOME|ANY(子查询)表达式=MIN(子查询)表达式=SOME|ANY(子查询)表达式=MAX(子查询)ANY、SOME与ALL与集函数的对应关系 表达式=ALL(子查询)表达式=MIN(子查询)表达式 ALL(子查询)表达式 NOTIN(子查询)表
17、达式=ALL(子查询)表达式=MAX(子查询)ANY、SOME与ALL与集函数的对应关系 ANY、SOME和ALL谓词有时可以用集函数实现=或或!=ANY/SOMEIN-MAXMIN=MINALL-NOT INMINMAX=MAXEXISTSWHERENOTEXISTS(子查询)EXISTS代表存在量词 不返回查询的数据,只产生逻辑真值和假值 EXISTS:当子查询中有满足条件的数据时,返回真值,否则返回假值 NOTEXISTS:当子查询中有满足条件的数据时,返回假值;否则返回真值EXISTS 查询至少一门不及格的学生姓名若内层查询结果非空,则为真否则为假相当于一个变量,根据它的值处理内层查询
18、,S中有多少个学号,内层查询就进行多少次称为相关子查询:查询条件依赖于外层查询中某个值等价于:SELECTS.SNFROMSJOINSCONS.S#=SC.S#WHERESC.G=D;SELECTSNFROMSWHEREEXISTS(SELECT*FROMSCWHERES#=S.S#ANDG=D);EXISTS 查询选修了“C002”号课程的学生姓名SELECTSname FROMStudentWHEREEXISTS(SELECT*FROMSCWHERESC.Sno=Student.Sno ANDSC.Cno=C002)1.无条件执行外层查询语句,在外层查询的结果集中取第一行结果,得到Sno的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- L07_Oracle 数据库 编程 _QUST
限制150内