数据库精品课(仅供个人学习)第三章2.ppt_第1页
数据库精品课(仅供个人学习)第三章2.ppt_第2页
数据库精品课(仅供个人学习)第三章2.ppt_第3页
数据库精品课(仅供个人学习)第三章2.ppt_第4页
数据库精品课(仅供个人学习)第三章2.ppt_第5页
已阅读5页,还剩167页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数据库原理TheoryofDatabase第三章关系数据库标准语言SQL,Theoryofdatabase,2,第三章关系数据库标准语言SQL,3.1SQL概述3.2学生-课程数据库3.3数据定义3.4数据更新3.5数据查询3.6视图3.7小结,Theoryofdatabase,3,3.5数据查询,语句格式:,SELECTALL|DISTINCT,FROM,WHEREGROUPBYHAVINGORDERBYASC|DESC;,Theoryofdatabase,4,3.5数据查询,3.5.1单表查询3.5.2连接查询3.5.3嵌套查询3.5.4集合查询3.5.5Select语句的一般形式,The

2、oryofdatabase,5,3.5.1单表查询,查询仅涉及一个表:,一、选择表中的若干列,二、选择表中的若干元组,三、ORDERBY子句,四、聚集函数,五、GROUPBY子句,Theoryofdatabase,6,一、选择表中的若干列,查询指定列,例1:查询全体学生的学号与姓名。SELECTSno,SnameFROMStudent;,例2:查询全体学生的姓名、学号、所在系。SELECTSname,Sno,SdeptFROMStudent;,Theoryofdatabase,7,一、选择表中的若干列(续),查询全部列,选出所有属性列:在SELECT关键字后面列出所有列名将指定为*,SELEC

3、TSno,Sname,Ssex,Sage,SdeptFROMStudent;或SELECT*FROMStudent;,例3:查询全体学生的详细记录。,Theoryofdatabase,8,算术表达式字符串常量函数列别名,一、选择表中的若干列(续),查询经过计算的值,SELECT子句的可以为:,Theoryofdatabase,9,一、选择表中的若干列(续),例4:查询全体学生的姓名及其出生年份。SELECTSname,2004-Sage/*假定当年的年份为2004年*/FROMStudent;,输出结果:,算术表达式,Theoryofdatabase,10,一、选择表中的若干列(续),例5:查

4、询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。SELECTSname,YearofBirth:,2004-Sage,ISLOWER(Sdept)FROMStudent;,输出结果:,Theoryofdatabase,11,NAMEBIRTHBIRTHDAYDEPARTMENT-李勇YearofBirth:1984cs刘晨YearofBirth:1985is王敏YearofBirth:1986ma张立YearofBirth:1985is,一、选择表中的若干列(续),使用列别名改变查询结果的列标题:,SELECTSnameNAME,YearofBirth:BIRTH,2000-S

5、ageBIRTHDAY,LOWER(Sdept)DEPARTMENTFROMStudent;,使用别名,输出结果:,Theoryofdatabase,12,二、选择表中的若干元组,消除取值重复的行,两个本来并不完全相同的元组,投影到指定的某些列上后,可能变成相同的行了,可以用DISTINCT取消它们。,例6:查询选修了课程的学生学号。SELECTSnoFROMSC;,输出结果:,出现重复行,Theoryofdatabase,13,SELECTDISTINCTSnoFROMSC;,二、选择表中的若干元组(续),如果想去掉结果表中的重复行,必须指定DISTINCT关键词。,输出结果:,Theory

6、ofdatabase,14,二、选择表中的若干元组(续),如果没有指定DISTINCT关键词,则缺省为ALL,即保留结果表中取值重复的行。,SELECTSnoFROMSC;SELECTALLSnoFROMSC;,等价于:,Theoryofdatabase,15,表3.4常用的查询条件,二、选择表中的若干元组(续),查询满足条件的元组,Theoryofdatabase,16,1.比较大小,二、选择表中的若干元组(续),例7:查询计算机科学系全体学生的名单。,例8:查询所有年龄在20岁以下的学生姓名及其年龄。,例9:查询考试成绩有不及格的学生的学号。,谓词:=,等等。,SELECTSnameFRO

7、MStudentWHERESdept=CS;,SELECTSname,SageFROMStudentWHERESage20;,SELECTDISTINCTSnoFROMSCWHEREGrade90;/*其他限定条件*/,例38:查询每个学生的学号、姓名、选修的课程名及成绩。,SELECTStudent.Sno,Sname,Cname,GradeFROMStudent,SC,Course/*多表连接*/WHEREStudent.Sno=SC.SnoandSC.Cno=Course.Cno;,Theoryofdatabase,57,3.5数据查询,3.5.1单表查询3.5.2连接查询3.5.3嵌套

8、查询3.5.4集合查询3.5.5Select语句的一般形式,Theoryofdatabase,58,3.5.3嵌套查询,嵌套查询概述,一个SELECT-FROM-WHERE语句称为一个查询块;,将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询;,SELECTSnameFROMStudentWHERESnoIN(SELECTSnoFROMSCWHERECno=2);,例如:,外层查询/父查询,内层查询/子查询,Theoryofdatabase,59,3.5.3嵌套查询(续),子查询的限制,层层嵌套方式反映了SQL语言的结构化,有些嵌套查询可以用连接运算替

9、代,不能使用ORDERBY子句,Theoryofdatabase,60,嵌套查询求解方法,3.5.3嵌套查询(续),不相关子查询:,子查询的查询条件不依赖于父查询,由里向外逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。,相关子查询:,子查询的查询条件依赖于父查询,首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表;,然后再取外层表的下一个元组;,重复这一过程,直至外层表全部检查完为止。,Theoryofdatabase,61,一、带有IN谓词的子查询二、带有比较运算符的子查询三、带

10、有ANY(SOME)或ALL谓词的子查询四、带有EXISTS谓词的子查询,3.5.3嵌套查询(续),Theoryofdatabase,62,一、带有IN谓词的子查询,例39:查询与“刘晨”在同一个系学习的学生。,(此查询要求可以分步来完成),确定“刘晨”所在系名:SELECTSdeptFROMStudentWHERESname=刘晨;结果为:CS,Theoryofdatabase,63,一、带有IN谓词的子查询(续),例39:查询与“刘晨”在同一个系学习的学生。,(此查询要求可以分步来完成),查找所有在“CS”系学习的学生:SELECTSno,Sname,SdeptFROMStudentWHE

11、RESdept=CS;,结果为:,Theoryofdatabase,64,一、带有IN谓词的子查询(续),例39:查询与“刘晨”在同一个系学习的学生。,(此查询要求可以分步来完成),将第一步查询嵌入到第二步查询的条件中:,SELECTSno,Sname,SdeptFROMStudentWHERESdeptIN(SELECTSdeptFROMStudentWHERESname=刘晨);,此查询为不相关子查询。,Theoryofdatabase,65,一、带有IN谓词的子查询(续),要求:用自身连接完成查询,SELECTS1.Sno,S1.Sname,S1.SdeptFROMStudentS1,S

12、tudentS2WHERES1.Sdept=S2.SdeptANDS2.Sname=刘晨;,例39:查询与“刘晨”在同一个系学习的学生。,返回,Theoryofdatabase,66,一、带有IN谓词的子查询(续),例40:查询选修了课程名为“信息系统”的学生学号和姓名。,SELECTSno,SnameFROMStudentWHERESnoIN(SELECTSnoFROMSCWHERECnoIN(SELECTCnoFROMCourseWHERECname=信息系统);,首先在Course关系中找出“信息系统”的课程号,结果为3号,然后在SC关系中找出选修了3号课程的学生学号,最后在Studen

13、t关系中取出Sno和Sname,Theoryofdatabase,67,一、带有IN谓词的子查询(续),例40:查询选修了课程名为“信息系统”的学生学号和姓名。,要求:用连接查询实现查询,SELECTSno,SnameFROMStudent,SC,CourseWHEREStudent.Sno=SC.SnoANDSC.Cno=Course.CnoANDCourse.Cname=信息系统;,Theoryofdatabase,68,二、带有比较运算符的子查询,当能确切知道内层查询返回单值时,可用比较运算符(,=,)。,注意:与ANY或ALL谓词配合使用。,例:假设一个学生只可能在一个系学习,并且必须

14、属于一个系,则在例39可以用=代替IN:,SELECTSno,Sname,SdeptFROMStudentWHERESdept=(SELECTSdeptFROMStudentWHERESname=刘晨);,用=代替IN,Theoryofdatabase,69,二、带有比较运算符的子查询(续),子查询一定要跟在比较符之后。,错误的例子:,SELECTSno,Sname,SdeptFROMStudentWHERE(SELECTSdeptFROMStudentWHERESname=刘晨)=Sdept;,子查询没有跟在比较符之后。,Theoryofdatabase,70,相关子查询,二、带有比较运算符

15、的子查询(续),例41:找出每个学生超过他选修课程平均成绩的课程号。,SELECTSno,CnoFROMSCxWHEREGrade=(SELECTAVG(Grade)FROMSCyWHEREy.Sno=x.Sno);,Theoryofdatabase,71,二、带有比较运算符的子查询(续),相关子查询可能的执行过程:,从外层查询中取出SC的一个元组x,将元组x的Sno值(200215121)传送给内层查询。,SELECTAVG(Grade)FROMSCyWHEREy.Sno=200215121;,执行内层查询,得到值88(近似值),用该值代替内层查询,得到外层查询:,SELECTSno,Cno

16、FROMSCxWHEREGrade=88;,Theoryofdatabase,72,二、带有比较运算符的子查询(续),执行这个查询,得到,(200215121,1)(200215121,3),然后外层查询取出下一个元组重复做上述1至3步骤,直到外层的SC元组全部处理完毕。结果为:,(200215121,1)(200215121,3)(200215122,2),相关子查询可能的执行过程:,Theoryofdatabase,73,谓词语义,ANY:任意一个值,ALL:所有值,需要配合使用比较运算符,ANY大于子查询结果中的某个值ALL大于子查询结果中的所有值=ANY大于等于子查询结果中的某个值=A

17、LL大于等于子查询结果中的所有值,三、带有ANY(SOME)或ALL谓词的子查询,Theoryofdatabase,74,三、带有ANY(SOME)或ALL谓词的子查询,)ANY不等于子查询结果中的某个值!=(或)ALL不等于子查询结果中的任何一个值,谓词语义,ANY:任意一个值,ALL:所有值,需要配合使用比较运算符(续),Theoryofdatabase,75,三、带有ANY(SOME)或ALL谓词的子查询,例42:查询其他系中比计算机科学某一学生年龄小的学生姓名和年龄。,SELECTSname,SageFROMStudentWHERESageCS;/*父查询块中的条件*/,Theoryo

18、fdatabase,76,三、带有ANY(SOME)或ALL谓词的子查询,例42:查询其他系中比计算机科学某一学生年龄小的学生姓名和年龄。,结果:,执行过程:,1.RDBMS执行此查询时,首先处理子查询,找出CS系中所有学生的年龄,构成一个集合(20,19);,2.处理父查询,找所有不是CS系且年龄小于20或19的学生。,Theoryofdatabase,77,三、带有ANY(SOME)或ALL谓词的子查询,(要求用聚集函数实现查询),例42:查询其他系中比计算机科学某一学生年龄小的学生姓名和年龄。,SELECTSname,SageFROMStudentWHERESageCS;,Theoryo

19、fdatabase,78,三、带有ANY(SOME)或ALL谓词的子查询,例43:查询其他系中比计算机科学系所有学生年龄都小的学生姓名及年龄。,(方法一:用ALL谓词),SELECTSname,SageFROMStudentWHERESageCS;,Theoryofdatabase,79,三、带有ANY(SOME)或ALL谓词的子查询,例43:查询其他系中比计算机科学系所有学生年龄都小的学生姓名及年龄。,(方法二:用聚集函数),SELECTSname,SageFROMStudentWHERESageCS;,Theoryofdatabase,80,表3.5ANY(或SOME),ALL谓词与聚集函

20、数、IN谓词的等价转换关系,三、带有ANY(SOME)或ALL谓词的子查询,Theoryofdatabase,81,四、带有EXISTS谓词的子查询,EXISTS谓词,存在量词,带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。,若内层查询结果非空,则外层的WHERE子句返回真值,若内层查询结果为空,则外层的WHERE子句返回假值,由EXIST引出的子查询,其目标列表达式通常都用*,因为带EXIST的子查询只返回真值或假值,给出列名无实际意义。,NOTEXISTS谓词,若内层查询结果非空,则外层的WHERE子句返回假值,若内层查询结果为空,则外层的

21、WHERE子句返回真值,Theoryofdatabase,82,例44:查询所有选修了1号课程的学生姓名。,思路分析:,本查询涉及Student和SC表;在Student中依次取每个元组的Sno值,用此值去检查SC表;若SC中存在这样的元组,其Sno值等于此Student.Sno值,并且其Cno=1,则取此Student.Sname送入结果中;,四、带有EXISTS谓词的子查询(续),Theoryofdatabase,83,(用嵌套查询实现查询),SELECTSnameFROMStudentWHEREEXISTS(SELECT*FROMSCWHERESno=Student.SnoANDCno=

22、1);,例44:查询所有选修了1号课程的学生姓名。,四、带有EXISTS谓词的子查询(续),Theoryofdatabase,84,四、带有EXISTS谓词的子查询(续),(用连接运算实现查询),SELECTSnameFROMStudent,SCWHEREStudent.Sno=SC.SnoANDSC.Cno=1;,例44:查询所有选修了1号课程的学生姓名。,Theoryofdatabase,85,四、带有EXISTS谓词的子查询(续),例45:查询没有选修1号课程的学生姓名。,SELECTSnameFROMStudentWHERENOTEXISTS(SELECT*FROMSCWHERESno

23、=Student.SnoANDCno=1);,Theoryofdatabase,86,四、带有EXISTS谓词的子查询(续),不同形式的查询间的替换,一些带EXISTS或NOTEXISTS谓词的子查询不能被其他形式的子查询等价替换;,所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换。,Theoryofdatabase,87,四、带有EXISTS谓词的子查询(续),例:例39中,查询与“刘晨”在同一个系学习的学生。,(可以用带EXISTS谓词的子查询替换),SELECTSno,Sname,SdeptFROMStudentS1WHEREEXISTS(S

24、ELECT*FROMStudentS2WHERES2.Sdept=S1.SdeptANDS2.Sname=刘晨);,例39,Theoryofdatabase,88,全称量词的实现,四、带有EXISTS谓词的子查询(续),SQL语言中没有全称量词(Forall),可以把带有全称量词的谓词转换为等价的带有存在量词的谓词:(x)P(x(P),用EXISTS/NOTEXISTS实现全称量词(难点),Theoryofdatabase,89,四、带有EXISTS谓词的子查询(续),例46:查询选修了全部课程的学生姓名。,SELECTSnameFROMStudentWHERENOTEXISTS(SELECT

25、*FROMCourseWHERENOTEXISTS(SELECT*FROMSCWHERESno=Student.SnoANDCno=Course.Cno);,不存在这样的课程,这个学生没有选修,即:查询这样的学生,不存在这样的课程,这个学生没有选修,Theoryofdatabase,90,四、带有EXISTS谓词的子查询(续),逻辑蕴涵的实现,用EXISTS/NOTEXISTS实现逻辑蕴涵(难点),SQL语言中没有蕴涵(Implication)逻辑运算,可以利用谓词演算将逻辑蕴涵谓词等价转换为:pqpq,Theoryofdatabase,91,四、带有EXISTS谓词的子查询(续),例47:查

26、询至少选修了学生200215122选修的全部课程的学号。,解题思路:,用逻辑蕴涵表达:查询学号为x的学生,对所有的课程y,只要200215122学生选修了课程y,则x也选修了y。,形式化表示:用p表示谓词“学生200215122选修了课程y”用q表示谓词“学生x选修了课程y”则上述查询为:(y)pq,Theoryofdatabase,92,四、带有EXISTS谓词的子查询(续),例47:查询至少选修了学生200215122选修的全部课程的学号。,等价变换:(y)pq(y(pq)(y(pq)y(pq),变换后语义:不存在这样的课程y,学生200215122选修了y,而学生x没有选。,Theory

27、ofdatabase,93,四、带有EXISTS谓词的子查询(续),例47:查询至少选修了学生200215122选修的全部课程的学号。,SELECTDISTINCTSnoFROMSCSCXWHERENOTEXISTS(SELECT*FROMSCSCYWHERESCY.Sno=200215122ANDNOTEXISTS(SELECT*FROMSCSCZWHERESCZ.Sno=SCX.SnoANDSCZ.Cno=SCY.Cno);,不存在这样的课程,学生200215122选了,而学生X没选,Theoryofdatabase,94,3.5数据查询,3.5.1单表查询3.5.2连接查询3.5.3嵌套

28、查询3.5.4集合查询3.5.5Select语句的一般形式,Theoryofdatabase,95,3.5.4集合查询,集合操作的种类,并操作UNION交操作INTERSECT差操作EXCEPT,参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同;,Theoryofdatabase,96,3.5.4集合查询(续),例48:查询计算机科学系的学生及年龄不大于19岁的学生。,SELECT*FROMStudentWHERESdept=CS,UNION:将多个查询结果合并起来时,系统自动去掉重复元组。,UNIONALL:将多个查询结果合并起来时,保留重复元组。,方法一:,SELET*F

29、ROMStudentWHERESage=19;,UNION,Theoryofdatabase,97,3.5.4集合查询(续),例48:查询计算机科学系的学生及年龄不大于19岁的学生。,SELECTDISTINCT*FROMStudentWHERESdept=CSORSage=19;,方法二:,Theoryofdatabase,98,3.5.4集合查询(续),例49:查询选修了课程1或者选修了课程2的学生。,SELECTSnoFROMSCWHERECno=1UNIONSELECTSnoFROMSCWHERECno=2;,并操作,Theoryofdatabase,99,3.5.4集合查询(续),例

30、50:查询计算机科学系的学生与年龄不大于19岁的学生的交集。,SELECT*FROMStudentWHERESdept=CSINTERSECTSELECT*FROMStudentWHERESage=19,交操作,Theoryofdatabase,100,3.5.4集合查询(续),例50:查询计算机科学系的学生与年龄不大于19岁的学生的交集。,(实际上就是查询计算机科学系中年龄不大于19岁的学生),SELECT*FROMStudentWHERESdept=CSANDSage=90;,基于视图的视图,Theoryofdatabase,120,一、建立视图(续),例5:定义一个反映学生出生年份的视图

31、。,CREATEVIEWBT_S(Sno,Sname,Sbirth)ASSELECTSno,Sname,2009-SageFROMStudent;,带表达式的视图,Theoryofdatabase,121,一、建立视图(续),例6:将学生的学号及他的平均成绩定义为一个视图。,CREATEVIEWS_G(Sno,Gavg)ASSELECTSno,AVG(Grade)FROMSCGROUPBYSno;,分组视图,Theoryofdatabase,122,一、建立视图(续),例7:将Student表中所有女生记录定义为一个视图。,CREATEVIEWF_Stu(F_Sno,name,sex,age,

32、dept)ASSELECT*FROMStudentWHERESsex=女;,缺点:修改基表Student的结构后,Student表与F_Stu视图的映象关系被破坏,导致该视图不能正确工作。,查询语句中不指定属性列,Theoryofdatabase,123,二、删除视图,语句的格式,DROPVIEW;,该语句从数据字典中删除指定的视图定义。,如果该视图上还导出了其他视图,使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除。,删除基表时,由该基表导出的所有视图定义都必须显式地使用DROPVIEW语句删除。,Theoryofdatabase,124,二、删除视图(续),例8:删除视

33、图BT_S:,DROPVIEWBT_S;,删除视图IS_S1:,DROPVIEWIS_S1;,执行此语句时由于IS_S1视图上还导出了IS_S2视图,所以该语句被拒绝执行。,使用级联删除:,DROPVIEWIS_S1CASCADE;,Theoryofdatabase,125,3.6视图,3.6.1定义视图3.6.2查询视图3.6.3更新视图3.6.4视图的作用,Theoryofdatabase,126,3.6.2查询视图,用户角度:查询视图与查询基本表相同,RDBMS实现视图查询的方法,视图消解法(ViewResolution),进行有效性检查;转换成等价的对基本表的查询;执行修正后的查询;,

34、Theoryofdatabase,127,3.6.2查询视图(续),例9:在信息系学生的视图中找出年龄小于20岁的学生。,SELECTSno,SageFROMIS_StudentWHERESage=90GROUPBYSno;,正确:,SELECTSno,AVG(Grade)FROMSCGROUPBYSnoHAVINGAVG(Grade)=90;,Theoryofdatabase,133,3.6视图,3.6.1定义视图3.6.2查询视图3.6.3更新视图3.6.4视图的作用,Theoryofdatabase,134,3.6.3更新视图,例12:将信息系学生视图IS_Student中学号20021

35、5122的学生姓名改为“刘辰”。,UPDATEIS_StudentSETSname=刘辰WHERESno=200215122;,转换后的语句:,UPDATEStudentSETSname=刘辰WHERESno=200215122ANDSdept=IS;,Theoryofdatabase,135,3.6.3更新视图(续),例13:向信息系学生视图IS_S中插入一个新的学生记录:200215129,赵新,20岁,INSERTINTOIS_StudentVALUES(95029,赵新,20);,转换为对基本表的更新:,INSERTINTOStudent(Sno,Sname,Sage,Sdept)VA

36、LUES(200215129,赵新,20,IS);,Theoryofdatabase,136,3.6.3更新视图(续),例14:删除信息系学生视图IS_Student中学号为200215129的记录。,DELETEFROMIS_StudentWHERESno=200215129;,转换为对基本表的更新:,DELETEFROMStudentWHERESno=200215129ANDSdept=IS;,Theoryofdatabase,137,3.6.3更新视图(续),更新视图的限制:一些视图是不可更新的,因为对这些视图的更新不能唯一地有意义地转换成对相应基本表的更新。,例:视图S_G为不可更新视图。,UPDATES_GSETGavg=90WHERESno=200215121;,这个对视图的更新无法转换成对基本表SC的更新。,Theoryofdatabase,138,允许对行列子集视图进行更新;对其他类型视图的更新不同系统有不同限制;,3.6.3更新视图(续),小结:,Theoryofdatabase,139,3.6视图,3.6.1定义视图3.6.2查询视图3.6.3更新视图3.6.4视图的作用,Theoryofdatabase,140,3.6.4视图的作

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论