




已阅读5页,还剩81页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章SQL语言及T-SQL的应用(2),内容概要:3.1关系数据库的标准语言SQL3.2数据定义3.3数据查询语言(重点)3.4数据操纵语言(重点),实例分析:,Student,Course,SC,返回,3.3.3多表查询(连接查询),连接查询同时涉及多个表的查询称为连接查询。用来连接两个表的条件称为连接条件或连接谓词一般格式:.比较运算符:=、=、.BETWEEN.AND.,连接字段连接谓词中的列名称为连接字段。连接条件中的各连接字段类型必须是可比的,但不必是相同的。,DBMS执行连接操作的过程:,嵌套循环法(NESTED-LOOP)首先在表1中找到第一个元组,然后从头开始扫描表2,逐一查找满足连接件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。,表2全部查找完后,再找表1中第二个元组,然后再从头开始扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第二个元组与该元组拼接起来,形成结果表中一个元组。重复上述操作,直到表1中的全部元组都处理完毕。,SQL中连接查询的主要类型:广义笛卡尔积等值连接自然连接非等值连接查询自身连接查询外连接查询复合条件连接查询,一、广义笛卡尔积,不带连接谓词的连接很少使用例1:SELECTStudent.*,SC.*FROMStudent,SCT-SQL:格式一:SELECT列名列表FROM表名1CROSSJOIN表名2例:select*fromstudentcrossjoinsc或selectstudent.*,sc.*FROMSTUDENTcrossjoinsc格式二:SELECT列名列表FROM表名1,表名2,返回,二、等值与非等值连接查询,分类:等值连接、自然连接、非等值连接等值连接:,.=.若子句中引用表1和表2中同名属性时,都必须加表名前缀。引用唯一属性名时可以加也可以省略表名前缀。,例2查询每个学生及其选修课程的情况。SELECTStudent.*,SC.*FROMStudent,SCWHEREStudent.Sno=SC.Sno;,结果表,返回,T-SQL中等值连接操作的格式:SELECT列名列表FROM表名1,表名2WHERE表名1.列名=表名2.列名或SELECT列名列表FROM表名1INNERJOIN表名2ON表名1.列名=表名2.列名如:selectstudent.*,sc.*fromstudentinnerjoinsconstudent.sno=sc.sno,自然连接,删去重复的属性列。例3对例2用自然连接完成。SELECTStudent.Sno,Sname,Ssex,birthday,Sdept,Cno,GradeFROMStudent,SCWHEREStudent.Sno=SC.Sno;,返回,非等值连接.比较运算符:、=、70;,返回,运行结果:,Student,SC,例7查询每个学生的学号、姓名、选修的课程名及成绩。SELECTStudent.Sno,Sname,Cname,GradeFROMStudent,SC,CourseWHEREStudent.Sno=SC.SnoandSC.Cno=Course.Cno;如结果:,3.3.4嵌套查询,1、嵌套查询概述一个SELECT-FROM-WHERE语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。,SELECTSname外层查询/父查询FROMStudentWHERESnoIN(SELECTSno内层查询/子查询FROMSCWHERECno=002);,子查询的限制不能使用ORDERBY子句,其只能对最终结果排序。层层嵌套方式反映了SQL语言的结构化。有些嵌套查询可以用连接运算替代。2、嵌套查询分类不相关子查询:子查询的查询条件不依赖于父查询。相关子查询:子查询的查询条件依赖于父查询。,3、嵌套查询求解方法不相关子查询:是由里向外逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。相关子查询:首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若父层WHERE子句返回值为真,则取此元组放入结果表;然后再取外层表的下一个元组;重复这一过程,直至外层表全部检查完为止。,4、引出子查询的谓词,带有IN谓词的子查询带有比较运算符的子查询带有ANY或ALL谓词的子查询带有EXISTS谓词的子查询,一、带有IN谓词的子查询,例8查询与“刘晨”在同一个系学习的学生。此查询要求可以分步来完成确定“刘晨”所在系名SELECTSdeptFROMStudentWHERESname=刘晨;结果为:,查找所有在IS系学习的学生的学号、姓名、系。SELECTSno,Sname,SdeptFROMStudentWHERESdept=IS;结果为:SnoSnameSdept95001刘晨IS95004张立IS,将第一步查询嵌入到第二步查询的条件中SELECTSno,Sname,SdeptFROMStudentWHERESdeptIN(SELECTSdeptFROMStudentWHERESname=刘晨);注:此查询为不相关子查询。DBMS求解该查询时也是分步去做的。,用自身连接完成本查询要求SELECTS1.Sno,S1.Sname,S1.SdeptFROMStudentS1,StudentS2WHERES1.Sdept=S2.SdeptANDS2.Sname=刘晨;结果为:,例9查询选修了课程名为“信息系统”的学生学号和姓名。(用子查询实现)SELECTSno,Sname最后在Student关系中FROMStudent取出Sno和SnameWHERESnoIN(SELECTSno然后在SC关系中找出选FROMSC修了3号课程的学生学号WHERECnoIN(SELECTCno首先在Course关系中找出“信FROMCourse息系统”的课程号,结果为3号WHERECname=信息系统);,方法二:用连接查询SELECTSno,SnameFROMStudent,SC,CourseWHEREStudent.Sno=SC.SnoANDSC.Cno=Course.CnoANDCourse.Cname=信息系统;,例10假设一个学生只可能在一个系学习,并且必须属于一个系,则在例8可以用=代替IN:SELECTSno,Sname,SdeptFROMStudentWHERESdept=(SELECTSdeptFROMStudentWHERESname=刘晨);,子查询一定要跟在比较符之后错误的例子:SELECTSno,Sname,SdeptFROMStudentWHERE(SELECTSdeptFROMStudentWHERESname=刘晨)=Sdept;,二、带有比较运算符的子查询,当能确切知道内层查询返回单值时,可用比较运算符(,=,)。与ANY或ALL谓词配合使用。ANY表示子查询结果中的某个值,而ALL表示子查询结果中的所有值。,带有ANY或ALL谓词的比较运算符的含义:,需要配合使用比较运算符ANY大于子查询结果中的某个值ALL大于子查询结果中的所有值=ANY大于等于子查询结果中的某个值=ALL大于等于子查询结果中的所有值)ANY不等于子查询结果中的某个值!=(或)ALL不等于子查询结果中的任何一个值,例11查询其他系中比计算机系某一学生年龄小的学生姓名、性别和年龄。SELECTSname,Ssex,year(getdate()-year(birthday)SageFROMStudentWHEREbirthdayANY(SELECTbirthdayFROMStudentWHERESdept=计算机系)ANDSdept计算机系;/*注意这是父查询块中的条件*/,运行结果:,Student,ANY和ALL谓词有时可以用集函数实现ANY与ALL与集函数的对应关系,注:用集函数实现子查询通常比直接用ANY或ALL查询效率要高,因为前者通常能够减少比较次数,例11:用集函数实现例11SELECTSname,Ssex,year(getdate()-year(birthday)SageFROMStudentWHEREbirthday(SELECTmax(birthday)FROMStudentWHERESdept=计算机系)ANDSdept计算机系;,例12查询其他系中比信息系所有学生年龄都小的学生姓名及年龄。方法一:用ALL谓词SELECTSname,year(getdate()-year(birthday)SageFROMStudentWHEREbirthdayALL(SELECTbirthdayFROMStudentWHERESdept=计算机系)ANDSdept计算机系;查询结果为空表。,方法二:用集函数SELECTSname,year(getdate()-year(birthday)SageFROMStudentWHEREbirthday(SELECTmax(birthday)FROMStudentWHERESdept=计算机系)ANDSdept计算机系;,三、带有EXISTS谓词的子查询,1.EXISTS谓词2.NOTEXISTS谓词3.不同形式的查询间的替换4.相关子查询的效率5.用EXISTS/NOTEXISTS实现全称量词6.用EXISTS/NOTEXISTS实现逻辑蕴函,1.EXISTS谓词存在量词带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。若内层查询结果非空,则返回真值若内层查询结果为空,则返回假值由EXISTS引出的子查询,其目标列表达式通常都用*,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义。2.NOTEXISTS谓词,例13查询所有选修了1号课程的学生姓名。用嵌套查询SELECTSnameFROMStudentWHEREEXISTS(SELECT*FROMSC/*相关子查询*/WHERESno=Student.SnoANDCno=1);求解过程分析?,方法二:用连接运算SELECTSnameFROMStudent,SCWHEREStudent.Sno=SC.SnoANDSC.Cno=1;,例14查询没有选修1号课程的学生姓名。SELECTSnameFROMStudentWHERENOTEXISTS(SELECT*FROMSCWHERESno=Student.SnoANDCno=1);注:此例用连接运算难于实现。,3.不同形式的查询之间的替换一些带EXISTS或NOTEXISTS谓词的子查询不能被其他形式的子查询等价替换。所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换。,例15对例8查询与“刘晨”在同一个系学习的学生,可以用带EXISTS谓词的子查询替换:SELECTSno,Sname,SdeptFROMStudentS1WHEREEXISTS(SELECT*FROMStudentS2WHERES2.Sdept=S1.SdeptANDS2.Sname=刘晨);,4.用EXISTS/NOTEXISTS实现全称量词(难点)SQL语言中没有全称量词(Forall)可以把带有全称量词的谓词转换为等价的带有存在量词的谓词:(x)P(x(P)含义:没有x是不在P中的。,例16查询选修了全部课程的学生姓名。(课程)选修(课程(选修)SELECTSnameFROMStudentWHERENOTEXISTS(SELECT*/*没有一门课程是该生未选修的*/FROMCourseWHERENOTEXISTS(SELECT*FROMSC/*该生没有选修这门课*/WHERESno=Student.SnoANDCno=Course.Cno));,5.用EXISTS/NOTEXISTS实现逻辑蕴函(难点)SQL语言中没有蕴函(Implication)逻辑运算可以利用谓词演算将逻辑蕴函谓词等价转换为:pqpq,p、q为谓词。,例17查询至少选修了学生95002选修的全部课程的学生号码。分析:用逻辑蕴函表达:查询学号为x的学生,对所有的课程y,只要95002学生选修了课程y,则x也选修了y。形式化表示:用P表示谓词“学生95002选修了课程y”用q表示谓词“学生x选修了课程y”则上述查询为:(y)pq,等价变换:(y)pq(y(pq)(y(pq)y(pq)变换后语义:学生95002选修了y,而学生x没有选y,这样的课程y不存在。,用NOTEXISTS谓词表示:SELECTDISTINCTSnoFROMSCSCXWHERENOTEXISTS(SELECT*FROMSCSCYWHERESCY.Sno=95002ANDNOTEXISTS(SELECT*FROMSCSCZWHERESCZ.Sno=SCX.SnoANDSCZ.Cno=SCY.Cno);,3.3.5集合查询,标准SQL直接支持的集合操作种类并操作(UNION)标准SQL中没有提供集合交操作、差操作,但可用其他方法间接实现。,1、并操作,形式:UNION参加UNION操作的各结果表的列数必须相同;对应项的数据类型也必须相同,例18查询计算机系的学生及年龄不大于19岁的学生。方法一:SELECT*FROMStudentWHERESdept=计算机系UNIONSELECT*FROMStudentWHEREyear(getdate()-year(birthday)=19;,方法二:SELECTDISTINCT*FROMStudentWHERESdept=计算机系ORyear(getdate()-year(birthday)=19;,例19查询选修了课程1或者选修了课程2的学生。方法一:SELECTSnoFROMSCWHERECno=001UNIONSELECTSnoFROMSCWHERECno=002;,T-SQL支持并操作,不支持交、差操作。,方法二:SELECTDISTINCTSnoFROMSCWHERECno=001ORCno=002;,2、交操作的实现,例20查询计算机科学系的学生与年龄不大于19岁的学生的交集。本例实际上就是查询计算机系中年龄不大于19岁的学生SELECT*FROMStudentWHERESdept=计算机系ANDyear(getdate()-year(birthday)19,SELECT*FROMStudentWHEREsnonotin(selectsnofromstudentwhereSdept=计算机系ANDSage=19),或使用notin等:,4、对集合操作结果的排序,ORDERBY子句只能用于对最终查询结果排序,不能对中间结果排序。任何情况下,ORDERBY子句只能出现在最后。对集合操作结果排序时,ORDERBY子句中用数字指定排序属性。,例23错误写法SELECT*FROMStudentWHERESdept=计算机系UNIONSELECT*FROMStudentWHEREyear(getdate()-year(birthday)=70andgrade=60thenCElseDEndFromscJOINstudentONsc.sno=student.sno,运行结果:,课堂练习:如表ST,试利用case子句将Sdept中的英文缩写用中文名来表示;其中CS:计算机系、ES:外语系、MS:数学系。,selectsno,sname,ssex,birthday,Sdept=caseSdeptwhenCSthen计算机系whenESthen外语系whenMSthen数学系endfromst,补充2T-SQL使用from(select子句):,实例2:查询每位学生的学号、姓名、考试的平均成绩、最高成绩、最低成绩。selects.sno学号,sname姓名,ag平均
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 家政服务合同协议书
- Unit 2 单元整体说课稿 2023-2024学年人教版八年级英语下册
- 关于读书活动总结(集合15篇)
- 2025山东菏泽高新城市建设投资有限公司招聘考试12人笔试题库及答案详解
- 抵押物品抵押管理与风险控制合同
- 建设用地地勘合同示范文本(工业用地)
- 出差人员安全保障及费用报销合同范本
- 文化创意担保借款合同示范文本
- 事业单位合同签订风险评估与防范措施合同
- 《国有企业改革中员工转岗劳务派遣专项合同》
- 农村处理矛盾纠纷课件
- 厂房搬迁管理办法
- 保险学考试题(附答案)
- 中药处方点评管理办法
- 国企纪法教育实施路径
- 药品发放登记管理制度
- 临床科室科研管理制度
- 铁艺围栏采购合同
- 中国皮肤基底细胞癌诊疗指南2023
- 卫星通信技术在电力行业中的应用场景分析
- 黄旭华人物介绍
评论
0/150
提交评论