数据库原理第三章课件.ppt
《数据库原理第三章课件.ppt》由会员分享,可在线阅读,更多相关《数据库原理第三章课件.ppt(82页珍藏版)》请在三一办公上搜索。
1、第三章 关系数据库语言SQL(续),概述 SQL的数据定义 SQL的数据操纵 SQL的视图定义 SQL的数据控制 嵌入式SQL,第三章关系数据库语言SQL,联接查询(1 of 8),联接查询:涉及至少两个表的查询。SQL中没有专门的JOIN命令,而是通过SELECT语句中的WHERE子句来达到联接运算的目的,因此更加灵活、简便。,联接查询(2 of 8),联接条件的一般格式为:表名1.列名1比较运算符表名2.列名2 其中:比较运算符主要有:=、=、=和!=;联接谓词中的列名称为联接字段。联接条件中,联接字段类型必须是可比的,但联接字段不一定是同名的。,例1:(简单的联接查询)求选修C2课程的学
2、生学号、姓名和成绩。SELECT Student.Sno,Sname,Grade FROM Student,SC WHERE Student.Sno=SC.Sno AND SC.Cno=C2;,Example-联接查询(3 of 8),例2:(多表联接)求学生学号、姓名、选修课程名、成绩。,Example-联接查询(4 of 8),Student:Sno Sname Ssex Sdept Sage,Course:Cno Cname Cpno Ccredit,C1 G 1C2 H C1 2C3 I C1 3C4 J C2 2C5 K C4 2,S1 C1 AS1 C2 AS1 C3 AS1 C5
3、 BS2 C1 BS2 C2 CS2 C4 CS3 C2 BS3 C3 CS3 C4 BS4 C3 BS4 C5 DS5 C2 CS5 C3 BS5 C5 BS6 C4 AS6 C5 A,S1 A 1 CS 20S2 B 1 CS 21S3 C 0 MA 19S4 D 0 CI 19S5 E 1 MA 20S6 F 0 CS 22,直观的查找过程,SELECT Student.Sno,Sname,Cname,GradeFROM Student,Course,SCWHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;,例2续:(多表联接)求学生学号、姓名、
4、选修课程名、成绩。,Example-联接查询(5 of 8),Example-联接查询(6 of 8),例3:(单表或自身联接)求每一门课的间接先行课。,SELECT FIRST.Cno,SECOND.CpnoFROM Course FIRST,Course SECONDWHERE FIRST.Cpno=SECOND.Cno;,SQL语句为:,直观的查找过程,FIRST,SECOND,查询结果为:Cno Cpno C4 C1 C5 C2,Example-联接查询(7 of 8),例4:(外部连接)查询每个学生及其选修课程的情况包括没有选修课程的学生 SELECT Student.Sno,Sna
5、me,Ssex,Sage,Sdept,Cno,Grade FROM Student,SC WHERE Student.Sno=SC.Sno(*);,左外部连接:外连接符(*)出现在连接条件的左边右外部连接:外连接符(*)出现在连接条件的右边外部连接中不匹配的分量用NULL表示,S1 A 1 CS 20S2 B 1 CS 21S3 C 0 MA 19,Student:Sno Sname Ssex Sdept Sage,S1 C1 AS1 C2 AS2 C1 B,右外连接结果,S1 A 1 CS 20 C1 AS1 A 1 CS 20 C2 AS2 B 1 CS 21 C1 BS3 C 0 MA
6、19,Student.Sno Sname Ssex Sdept Sage Cno Grade,Example-联接查询(8 of 8),嵌套查询(子查询),概述带有IN谓词的子查询带有比较运算符的子查询带有ANY或ALL谓词的子查询带有EXISTS谓词的子查询,嵌套查询(子查询),嵌套查询(子查询)嵌套查询由内向外处理 SQL允许多层嵌套嵌套查询中最常用的谓词是IN嵌套查询层次分明、容易理解,SELECT Sno,SnameFROM StudentWHERE Sno IN(SELECT SnoFROM SCWHERE Cno IN(SELECT Cno FROM Course WHERE Cn
7、ame=J);,将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询,子查询,父查询,限制:子查询不能使用ORDER BY子句,嵌套查询的分类,不相关子查询:子查询的查询条件不依赖于父查询由里向外逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。相关子查询:子查询的查询条件依赖于父查询首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表;然后再取外层表的下一个元组;重复这一过程,直至外层表全部检查完为止。,例1:查询与A在同一个系学习的学生,SELE
8、CT S1.*FROM Student S1WHERE S1.Sdept IN(SELECT Sdept FROM Student S2 WHERE S2.Sname=A);,带IN谓词的子查询(1 of 5),SELECT*FROM StudentWHERE Sdept IN(SELECT Sdept FROM Student WHERE Sname=A);,分析:可以用联接实现,SELECT S1.*FROM Student S1,Student S2,WHERE S1.Sdept=S2.Sdept AND S2.Sname=A;,但最后结果只包含Student中的字段,应考虑更为有效直观
9、的方法:确定A同学所在系名 找在该系学习的学生,back,例2:嵌套查询:求选修了课程名为J的学生学号和姓名。,在Course中找课程J的编号 在SC中找选修该课的学生学号 在Student中找选修该课的学生姓名,带IN谓词的子查询(2 of 5),分析:可以用联接来实现,但最后结果只包含Student中的字段,应考虑更有效、直观的方法:,带IN谓词的子查询(3 of 5),S1 C1 AS1 C2 AS1 C3 AS1 C5 BS2 C1 BS2 C2 CS2 C4 CS3 C2 BS3 C3 CS3 C4 BS4 C3 BS4 C5 DS5 C2 CS5 C3 BS5 C5 BS6 C4
10、AS6 C5 A,Course:Cno Cname Cpno Ccredit,S1 A 1 CS 20S2 B 1 CS 21S3 C 0 MA 19S4 D 0 CI 19S5 E 1 MA 20S6 F 0 CS 22,C1 G 1C2 H C1 2C3 I C1 3C4 J C2 3C5 K C4 2,Student:Sno Sname Ssex Sdept Sage,在Course中找课程J的编号,在SC中找选修该课的学生学号,在Student中找选修该课的学生学号和姓名,SELECT CnoFROM CourseWHERE Cname=J;,SELECT SnoFROM SCWHER
11、E Cno IN(C4);,SELECT Sno,SnameFROM StudentWHERE Sno IN(S2,S3,S6);,带IN谓词的子查询(4 of 5),最后的查询语句:,SELECT Sno,SnameFROM StudentWHERE Sno IN(SELECT Sno FROM SC WHERE Cno IN(SELECT Cno FROM Course WHERE Cname=J);,SELECT Sno,SnameFROM StudentWHERE Sno IN(SELECT Sno FROM SC WHERE Cno IN(SELECT Cno FROM Course
12、 WHERE Cname=J);,带IN谓词的子查询(5 of 5),用连接查询实现本例:,SELECT Sno,Sname FROM Student,SC,Course WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno AND Course.Cname=J;,例1、2是相关子查询还是不相关子查询?,带有比较运算符的子查询(1 of 2),当能确切知道内层查询返回单值时,可用比较运算符(,=,)与ANY或ALL谓词配合使用,带有比较运算符的子查询(2 of 2),又看例1:查询与A在同一个系学习的学生,SELECT*FROM StudentWHERE
13、 Sdept IN(SELECT Sdept FROM Student WHERE Sname=A);,SELECT*FROM StudentWHERE Sdept=(SELECT Sdept FROM Student WHERE Sname=A);,SELECT*FROM StudentWHERE(SELECT Sdept FROM Student WHERE Sname=A)=Sdept;,子查询应跟在比较符之后,带有ANY或ALL谓词的子查询(1 of 5),谓词语义ANY:某一个值ALL:所有值使用ANY 或ALL谓词时必须同时使用比较运算符,ANYALL,=,带有ANY或ALL谓词的
14、子查询(2 of 5),例1:查询其他系中比IS系某一学生年龄小的学生姓名和年龄,SELECT Sname,SageFROM StudentWHERE Sage IS;,其他方法?,带有ANY或ALL谓词的子查询(3 of 5),例1:查询其他系中比IS系某一学生年龄小的学生姓名和年龄用集函数:,SELECT Sname,SageFROM StudentWHERE Sage IS;,效率更高,带有ANY或ALL谓词的子查询(4 of 5),例2:查询其他系中比IS系所有学生年龄都小的学生姓名和年龄,SELECT Sname,SageFROM StudentWHERE Sage IS;,SELE
15、CT Sname,SageFROM StudentWHERE Sage IS;,带有ANY或ALL谓词的子查询(5 of 5),ANY,ALL与集函数及IN谓词的对应关系,带有EXISTS谓词的子查询(1 of 15),EXISTS谓词与NOT EXISTS谓词不同形式的查询间的替换用EXISTS/NOT EXISTS实现全称量词用EXISTS/NOT EXISTS实现逻辑蕴函,带有EXISTS谓词的子查询(2 of 15),EXISTS谓词存在量词 带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”若内层查询结果非空,则返回真值若内层查询结果为空,
16、则返回假值,带有EXISTS谓词的子查询(3 of 15),例1:查询所有选修了1号课程的学生姓名,SELECT SnameFROM StudentWHERE EXISTS(SELECT*FROM SC WHERE Sno=Student.Sno AND Cno=1);,相当于一个变量,根据它的值处理内层查询Student中有多少个学号,内层查询就进行多少次,属于相关子查询:查询条件依赖于外层查询中某个值,带有EXISTS谓词的子查询(4 of 15),例1:查询所有选修了1号课程的学生姓名,SELECT SnameFROM StudentWHERE EXISTS(SELECT*FROM SC
17、 WHERE Sno=Student.Sno AND Cno=1);,由EXISTS引出的子查询,其目标列表达式通常都用*,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义,其他方法?,用联结、相关、不相关子查询实现,带有EXISTS谓词的子查询(5 of 15),例2:查询没有选修1号课程的学生姓名,SELECT SnameFROM StudentWHERE NOT EXISTS(SELECT*FROM SC WHERE Sno=Student.Sno AND Cno=1);,此例用连接运算难于实现,SELECT SnameFROM Student,SCWHERE Studen
18、t.Sno=SC.Sno AND Cno1;,带有EXISTS谓词的子查询(6 of 15),不同形式的查询间的替换一些带EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换。,带有EXISTS谓词的子查询(7 of 15),例:再看“查询与A在同一个系学习的学生”,SELECT*FROM Student S1 WHERE EXISTS SELECT*FROM Student S2 WHERE S2.Sdept=S1.Sdept AND S2.Sname=A;,back,带有E
19、XISTS谓词的子查询(8 of 15),用EXISTS/NOT EXISTS实现全称量词(难点)SQL语言中没有全称量词(For all)可以把带有全称量词的谓词转换为等价的带有存在量词的谓词:,带全称量词的谓词,带存在量词的谓词,(x)P(x),(x(P(x),带有EXISTS谓词的子查询(9 of 15),例:查询选修了全部课程的学生姓名,带全称量词的谓词,带存在量词的谓词,(x)P(x),(x(P(x),本例变为:选这样的学生姓名,没有一门课程是他不选修的,选这样的学生姓名,没有一门课程是他不选修的,分析:任给一学号Sno,若不存在他不选修的课,则显示他的姓名,(Cno(学号为Sno的
20、学生没修课程Cno),(Cno(在SC中不存在选课单(Sno,Cno,),例:查询选修了全部课程的学生姓名,带有EXISTS谓词的子查询(1 0of 15),SELECT SnameFROM StudentWHERE NOT EXISTS(SELECT*FROM Course WHERE NOT EXISTS(SELECT*FROM SC WHERE Sno=Student.Sno AND Cno=Course.Cno);,带有EXISTS谓词的子查询(11 of 15),带有EXISTS谓词的子查询(12 of 15),用EXISTS/NOT EXISTS实现逻辑蕴函(难点)SQL语言中没有
21、蕴函(Implication)逻辑运算可以利用谓词演算将逻辑蕴函谓词等价转换为:p q pq,带有EXISTS谓词的子查询(13 of 15),例、查询至少选修了学生95002选修的全部课程的学生号码分析:用逻辑蕴函表达:查询学号为x的学生,对所有的课程y,只要95002学生选修了课程y,则x也选修了y。形式化表示:用P表示谓词“学生95002选修了课程y”用q表示谓词“学生x选修了课程y”则上述查询为:(y)p q,带有EXISTS谓词的子查询(14 of 15),等价变换:(y)p q(y(p q)(y(p q)y(pq)变换后语义:不存在这样的课程y,学生95002选修了y,而学生x没有
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 原理 第三 课件
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-6578456.html