ImageVerifierCode 换一换
格式:PPT , 页数:172 ,大小:2.44MB ,
资源ID:10977207      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-10977207.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据库精品课(仅供个人学习)第三章2.ppt)为本站会员(精品资料)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

数据库精品课(仅供个人学习)第三章2.ppt

1、数 据 库 原 理 Theory of Database第三章 关系数据库标准语言SQL,Theory of database,2,第三章 关系数据库标准语言SQL,3.1 SQL概述 3.2 学生-课程数据库 3.3 数据定义 3.4 数据更新 3.5 数据查询 3.6 视图 3.7 小结,Theory of database,3,3.5 数据查询,语句格式:,SELECT ALL|DISTINCT , FROM , WHERE GROUP BY HAVING ORDER BY ASC|DESC ;,Theory of database,4,3.5 数据查询,3.5.1 单表查询 3.5.2

2、 连接查询 3.5.3 嵌套查询 3.5.4 集合查询 3.5.5 Select语句的一般形式,Theory of database,5,3.5.1 单表查询,查询仅涉及一个表:,一、选择表中的若干列,二、选择表中的若干元组,三、ORDER BY子句,四、聚集函数,五、GROUP BY子句,Theory of database,6,一、 选择表中的若干列,查询指定列,例1:查询全体学生的学号与姓名。SELECT Sno,SnameFROM Student;,例2:查询全体学生的姓名、学号、所在系。SELECT Sname,Sno,SdeptFROM Student;,Theory of dat

3、abase,7,一、 选择表中的若干列(续),查询全部列,选出所有属性列: 在SELECT关键字后面列出所有列名 将指定为 *,SELECT Sno,Sname,Ssex,Sage,Sdept FROM Student; 或 SELECT * FROM Student;,例3:查询全体学生的详细记录。,Theory of database,8,算术表达式 字符串常量 函数 列别名,一、 选择表中的若干列(续),查询经过计算的值,SELECT子句的可以为:,Theory of database,9,一、 选择表中的若干列(续),例4:查询全体学生的姓名及其出生年份。SELECT Sname,20

4、04-Sage /*假定当年的年份为2004年*/FROM Student;,输出结果:,算术表达式,Theory of database,10,一、 选择表中的若干列(续),例5:查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。SELECT Sname,Year of Birth: ,2004-Sage,ISLOWER(Sdept)FROM Student;,输出结果:,Theory of database,11,NAME BIRTH BIRTHDAY DEPARTMENT- - - -李勇 Year of Birth: 1984 cs刘晨 Year of Birth: 1

5、985 is王敏 Year of Birth: 1986 ma张立 Year of Birth: 1985 is,一、 选择表中的若干列(续),使用列别名改变查询结果的列标题:,SELECT Sname NAME,Year of Birth: BIRTH,2000-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT FROM Student;,使用别名,输出结果:,Theory of database,12,二、选择表中的若干元组,消除取值重复的行,两个本来并不完全相同的元组,投影到指定的某些列上后,可能变成相同的行了,可以用DISTINCT取消它们。,例6:查询选修了

6、课程的学生学号。SELECT Sno FROM SC;,输出结果:,出现重复行,Theory of database,13,SELECT DISTINCT Sno FROM SC;,二、选择表中的若干元组(续),如果想去掉结果表中的重复行,必须指定DISTINCT关键词。,输出结果:,Theory of database,14,二、选择表中的若干元组(续),如果没有指定DISTINCT关键词,则缺省为ALL,即保留结 果表中取值重复的行。,SELECT Sno FROM SC;SELECT ALL Sno FROM SC;,等价于:,Theory of database,15,表3.4 常用的

7、查询条件,二、选择表中的若干元组(续),查询满足条件的元组,Theory of database,16,1.比较大小,二、选择表中的若干元组(续),例7:查询计算机科学系全体学生的名单。,例8:查询所有年龄在20岁以下的学生姓名及其年龄。,例9:查询考试成绩有不及格的学生的学号。,谓词:=,等等。,SELECT Sname FROM Student WHERE Sdept=CS;,SELECT Sname,Sage FROM Student WHERE Sage20;,SELECT DISTINCT Sno FROM SC WHERE Grade60;,Theory of database,1

8、7,二、选择表中的若干元组(续),2.确定范围,谓词: BETWEEN AND ;NOT BETWEEN AND ,例10:查询年龄在2023岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。,例11:查询年龄不在2023岁之间的学生姓名、系别和年龄。,SELECT Sname,Sdept,Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23;,SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23;,Theory of database,18,二、选择表中的若干元组

9、(续),3.确定集合,谓词:IN , NOT IN ,例12:查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。,SELECT Sname,Ssex FROM Student WHERE Sdept IN ( IS,MA,CS );,例13:查询既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别。,SELECT Sname,Ssex FROM StudentWHERE Sdept NOT IN ( IS,MA,CS );,Theory of database,19,二、选择表中的若干元组(续),4.字符匹配,谓词: NOT LIKE ESCAPE ,匹配串为固定

10、字符串,例14:查询学号为200215121的学生的详细情况。,SELECT * FROM Student WHERE Sno LIKE 200215121;,等价于: SELECT * FROM Student WHERE Sno = 200215121 ;,Theory of database,20,二、选择表中的若干元组(续),4.字符匹配,匹配串为含通配符的字符串 %: 任意长的任意字符串; _: 任意单个字符,例15:查询所有姓刘学生的姓名、学号和性别。,SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE 刘%;,例16:查询姓“欧

11、阳“且全名为三个汉字的学生的姓名。,SELECT Sname FROM Student WHERE Sname LIKE 欧阳_;,Theory of database,21,二、选择表中的若干元组(续),4.字符匹配,匹配串为含通配符的字符串 %: 任意长的任意字符串; _: 任意单个字符,例17:查询名字中第2个字为“阳“字的学生的姓名和学号。,SELECT Sname,Sno FROM Student WHERE Sname LIKE _阳%;,例18:查询所有不姓刘的学生姓名。,SELECT Sname,Sno,Ssex FROM Student WHERE Sname NOT LIK

12、E 刘%;,Theory of database,22,二、选择表中的若干元组(续),4.字符匹配,使用换码字符将通配符转义为普通字符,例19:查询DB_Design课程的课程号和学分。,SELECT Cno,Ccredit FROM Course WHERE Cname LIKE DB_Design ESCAPE ;,例20:查询以“DB_”开头,且倒数第3个字符为 i的课 程的详细情况。,SELECT * FROM Course WHERE Cname LIKE DB_%i_ _ ESCAPE ;,表示“ ” 为换码字符,Theory of database,23,二、选择表中的若干元组(

13、续),5.涉及空值的查询,谓词: IS NULL 或 IS NOT NULL(注意:“IS” 不能用 “=” 代替),例21:某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。,SELECT Sno,Cno FROM SC WHERE Grade IS NULL;,例22:查所有有成绩的学生学号和课程号。,SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL;,Theory of database,24,二、选择表中的若干元组(续),6.多重条件查询,逻辑运算符:AND和 OR来联结多个查询条件,AN

14、D的优先级高于OR,可以用括号改变优先级,可用来实现多种其他谓词,NOT IN,NOT BETWEEN AND ,Theory of database,25,例23:查询计算机系年龄在20岁以下的学生姓名。SELECT SnameFROM StudentWHERE Sdept= CS AND Sage20;,二、选择表中的若干元组(续),6.多重条件查询,多重条件,Theory of database,26,二、选择表中的若干元组(续),6.多重条件查询,改写例12:,查询信息系(IS)、数学系(MA)和计算机科学系(CS) 学生的姓名和性别。,原查询语句: SELECT Sname,Ssex

15、 FROM Student WHERE Sdept IN ( IS,MA,CS ),SELECT Sname,Ssex FROM Student WHERE Sdept= IS OR Sdept= MA OR Sdept= CS ;,可改写为:,Theory of database,27,三、ORDER BY子句,ORDER BY子句,可以按一个或多个属性列排序; 升序:ASC;降序:DESC;缺省值为升序;,当排序列含空值时,,ASC: 排序列为空值的元组最后显示。 DESC:排序列为空值的元组最先显示。,Theory of database,28,三、ORDER BY子句(续),例24:查

16、询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。,SELECT Sno,Grade FROM SC WHERE Cno= 3 ORDER BY Grade DESC;,例25:查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。,SELECT * FROM Student ORDER BY Sdept,Sage DESC;,Theory of database,29,四、聚集函数,聚集函数:,计数,计算总和,SUM(DISTINCT|ALL ),计算平均值,AVG(DISTINCT|ALL ),最大最小值,COUNT(DISTINCT|ALL *) 统

17、计行数,COUNT(DISTINCT|ALL )统计列的取值个数,MAX(DISTINCT|ALL ),MIN(DISTINCT|ALL ),Theory of database,30,四、聚集函数(续),例26:查询学生总人数。,SELECT COUNT(*) FROM Student;,例27:查询选修了课程的学生人数。,SELECT COUNT(DISTINCT Sno) FROM SC;,例28:计算1号课程的学生平均成绩。,SELECT AVG(Grade) FROM SC WHERE Cno= 1 ;,Theory of database,31,四、聚集函数(续),例29:查询选修

18、1号课程的学生最高分数。,SELECT MAX(Grade) FROM SC WHER Cno= 1 ;,例30:查询学生200215012选修课程的总学分数。,SELECT SUM(Ccredit) FROM SC, Course WHER Sno=200215012 AND SC.Cno=Course.Cno;,Theory of database,32,五、GROUP BY子句(分组查询),语句格式,SELECT DISTINCT FROM WHERE GROUP BY HAVING ORDER BY ASC|DESC ;,Theory of database,33,五、GROUP BY

19、子句(续),GROUP BY子句分组:,细化聚集函数的作用对象,未对查询结果分组,聚集函数将作用于整个查询结果,对查询结果分组后,聚集函数将分别作用于每个组,作用对象是查询的中间结果表,按指定的一列或多列值分组,值相等的为一组,Theory of database,34,五、GROUP BY子句(续),例31:求各个课程号及相应的选课人数。,SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno;,查询结果:,Theory of database,35,五、GROUP BY子句(续),例32:查询选修了3门以上课程的学生学号。,SELECT Sno FROM SC

20、 GROUP BY Sno HAVING COUNT(*) 3;,HAVING短语与WHERE子句的区别: 作用对象不同 WHERE子句作用于基表或视图,从中选择满足条 件的元组 HAVING短语作用于组,从中选择满足条件的组。,Theory of database,36,3.5 数据查询,3.5.1 单表查询 3.5.2 连接查询 3.5.3 嵌套查询 3.5.4 集合查询 3.5.5 Select语句的一般形式,Theory of database,37,3.5.2 连接查询,连接查询:同时涉及多个表的查询,连接条件或连接谓词:用来连接两个表的条件,一般格式:,. .,. BETWEEN

21、. AND .,连接条件中的各连接列必须是可比的,但名字不必相同。,Theory of database,38,连接操作的执行过程,嵌套循环法(NESTED-LOOP),首先在表1中找到第一个元组,然后从头开始扫描表2, 逐一查找满足连接件的元组,找到后就将表1中的第一 个元组与该元组拼接起来,形成结果表中一个元组;,表2全部查找完后,再找表1中第二个元组,然后再从头 开始扫描表2,逐一查找满足连接条件的元组,找到后 就将表1中的第二个元组与该元组拼接起来,形成结果 表中一个元组;,重复上述操作,直到表1中的全部元组都处理完毕。,Theory of database,39,连接操作的执行过程(

22、续),排序合并法法(SORT-MERGE),注意:常用于=连接,首先按连接属性对表1和表2排序;,对表1的第一个元组,从头开始扫描表2, 顺序查找满足连接条件的元组,找到后就 将表1中的第一个元组与该元组拼接起来, 形成结果表中一个元组。当遇到表2中第一 条不等于表1连接字段值的元组时,对表2 的查询不再继续;,Theory of database,40,连接操作的执行过程(续),排序合并法法(SORT-MERGE),找到表1的第二条元组,然后从刚才的中断点处继续 顺序扫描表2,查找满足条件的元组,找到后就将表1 中的第一个元组与该元组拼接起来,形成结果表中 一个元组,直接遇到表2中不等于表1

23、连接字段值的 元组时,对表2的查询不再继续;,重复上述操作,直到表1或表2中的全部元组都处理 完毕为止。,Theory of database,41,连接操作的执行过程(续),索引连接(INDEX-JOIN),对表2按连接字段建立索引;,对表1中的每个元组,依次根据其连接 字段值查询表2的索引,从中找到满足 条件的元组,找到后就将表1中的第一 个元组与该元组拼接起来,形成结果表 中一个元组。,Theory of database,42,一、等值与非等值连接查询 二、自身连接 三、外连接 四、复合条件连接,3.5.2 连接查询(续),Theory of database,43,一、等值与非等值连

24、接查询,等值连接:连接运算符为 =,例33:查询每个学生及其选修课程的情况。,SELECT Student.*,SC.* FROM Student,SC WHERE Student.Sno = SC.Sno;,查询结果:,Theory of database,44,一、等值与非等值连接查询(续),自然连接:若在等值连接中把目标列中重复的属性列去掉则为自然连接。,例34:对例33用自然连接完成。,SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,GradeFROM Student,SCWHERE Student.Sno = SC.Sno;,Theory o

25、f database,45,二、自身连接,需要给表起别名以示区别;,由于所有属性名都是同名属性,因此必须使用别名前缀。,例35:查询每一门课的间接先修课(即先修课的先修课)。,SELECT FIRST.Cno,SECOND.Cpno FROM Course FIRST,Course SECOND WHERE FIRST.Cpno = SECOND.Cno;,自身连接:一个表与其自己进行连接。,Theory of database,46,FIRST表(Course表),二、自身连接(续),为Course表取别名:,Theory of database,47,SECOND表(Course表),二、

26、自身连接(续),为Course表取别名:,Theory of database,48,二、自身连接(续),SECOND表,FIRST表,Theory of database,49,二、自身连接(续),查询结果:,Theory of database,50,三、外连接,主体表,外连接与普通连接的区别,普通连接操作只输出满足连接条件的元组;,外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出。,例 36:改写例33:查询每个学生及其选修课程的情况。,SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student LE

27、FT OUT JOIN SC ON (Student.Sno=SC.Sno);,Theory of database,51,执行结果:,三、外连接(续),Theory of database,52,三、外连接(续),左外连接,列出左边关系(如本例Student)中所有的元组,右外连接,列出右边关系中所有的元组,Theory of database,53,第十五讲,数据库原理,SQL数据查询(三),主讲:樊金生,Theory of database,54,复习: SQL查询语句,语句格式:,SELECT ALL|DISTINCT , FROM , WHERE GROUP BY HAVING OR

28、DER BY ASC|DESC ;,Theory of database,55,表3.4 常用的查询条件,Theory of database,56,复合条件连接,复合条件连接:WHERE子句中含多个连接条件,例37:查询选修2号课程且成绩在90分以上的所有学生。,SELECT Student.Sno, Sname FROM Student, SC WHERE Student.Sno = SC.Sno AND /* 连接谓词*/SC.Cno= 2 AND SC.Grade 90;/* 其他限定条件 */,例38:查询每个学生的学号、姓名、选修的课程名及成绩。,SELECT Student.Sn

29、o,Sname,Cname,Grade FROM Student,SC,Course /*多表连接*/ WHERE Student.Sno = SC.Sno and SC.Cno = Course.Cno;,Theory of database,57,3.5 数据查询,3.5.1 单表查询 3.5.2 连接查询 3.5.3 嵌套查询 3.5.4 集合查询 3.5.5 Select语句的一般形式,Theory of database,58,3.5.3 嵌套查询,嵌套查询概述,一个SELECT-FROM-WHERE语句称为一个查询块;,将一个查询块嵌套在另一个查询块的WHERE子句 或HAVING

30、短语的条件中的查询称为嵌套查询;,SELECT Sname FROM Student WHERE Sno IN(SELECT Sno FROM SCWHERE Cno= 2 );,例如:,外层查询/父查询,内层查询/子查询,Theory of database,59,3.5.3 嵌套查询(续),子查询的限制,层层嵌套方式反映了 SQL语言的结构化,有些嵌套查询可以用连接运算替代,不能使用ORDER BY子句,Theory of database,60,嵌套查询求解方法,3.5.3 嵌套查询(续),不相关子查询:,子查询的查询条件不依赖于父查询,由里向外逐层处理。即每个子查询在上一级查询处理之前

31、求解,子查询的结果用于建立其父查询的查找条件。,相关子查询:,子查询的查询条件依赖于父查询,首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表;,然后再取外层表的下一个元组;,重复这一过程,直至外层表全部检查完为止。,Theory of database,61,一、带有IN谓词的子查询 二、 带有比较运算符的子查询三、 带有ANY(SOME)或ALL谓词的子查询四、 带有EXISTS谓词的子查询,3.5.3 嵌套查询(续),Theory of database,62,一、带有IN谓词的子查询,例39:查询与“刘晨”在同一个

32、系学习的学生。,(此查询要求可以分步来完成),确定“刘晨”所在系名: SELECT Sdept FROM Student WHERE Sname= 刘晨 ; 结果为: CS,Theory of database,63,一、带有IN谓词的子查询(续),例39:查询与“刘晨”在同一个系学习的学生。,(此查询要求可以分步来完成),查找所有在“CS”系学习的学生: SELECT Sno,Sname,Sdept FROM Student WHERE Sdept= CS ;,结果为:,Theory of database,64,一、带有IN谓词的子查询(续),例39:查询与“刘晨”在同一个系学习的学生。,

33、(此查询要求可以分步来完成),将第一步查询嵌入到第二步查询的条件中:,SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN(SELECT SdeptFROM StudentWHERE Sname= 刘晨 );,此查询为不相关子查询。,Theory of database,65,一、带有IN谓词的子查询(续),要求:用自身连接完成查询,SELECT S1.Sno,S1.Sname,S1.Sdept FROM Student S1,Student S2 WHERE S1.Sdept = S2.Sdept ANDS2.Sname = 刘晨;,例39:查

34、询与“刘晨”在同一个系学习的学生。,返回,Theory of database,66,一、带有IN谓词的子查询(续),例40:查询选修了课程名为“信息系统”的学生学号和姓名。,SELECT Sno,Sname FROM Student WHERE Sno IN(SELECT SnoFROM SCWHERE Cno IN(SELECT CnoFROM CourseWHERE Cname= 信息系统);, 首先在Course关系中找出“信息系统”的课程号,结果为3号, 然后在SC关系中找出选修了3号课程的学生学号, 最后在Student关系中取出Sno和Sname,Theory of databa

35、se,67,一、带有IN谓词的子查询(续),例40:查询选修了课程名为“信息系统”的学生学号和姓名。,要求:用连接查询实现查询,SELECT Sno,Sname FROM Student,SC,Course WHERE Student.Sno = SC.Sno ANDSC.Cno = Course.Cno ANDCourse.Cname=信息系统;,Theory of database,68,二、带有比较运算符的子查询,当能确切知道内层查询返回单值时,可用比较 运算符(,=,)。,注意:与ANY或ALL谓词配合使用。,例:假设一个学生只可能在一个系学习,并且必须属于一个系,则在例39可以用 =

36、 代替IN :,SELECT Sno,Sname,Sdept FROM Student WHERE Sdept =(SELECT SdeptFROM StudentWHERE Sname= 刘晨);,用=代替IN,Theory of database,69,二、带有比较运算符的子查询(续),子查询一定要跟在比较符之后。,错误的例子:,SELECT Sno,Sname,Sdept FROM Student WHERE ( SELECT SdeptFROM StudentWHERE Sname= 刘晨 ) = Sdept;,子查询没有跟在比较符之后。,Theory of database,70,相

37、关子查询,二、带有比较运算符的子查询(续),例41:找出每个学生超过他选修课程平均成绩的课程号。,SELECT Sno,Cno FROM SC x WHERE Grade =(SELECT AVG(Grade) FROM SC yWHERE y.Sno=x.Sno);,Theory of database,71,二、带有比较运算符的子查询(续),相关子查询可能的执行过程:,从外层查询中取出SC的一个元组x,将元组x的Sno值 (200215121)传送给内层查询。,SELECT AVG(Grade) FROM SC y WHERE y.Sno=200215121;,执行内层查询,得到值88(近

38、似值),用该值代替内 层查询,得到外层查询:,SELECT Sno,Cno FROM SC x WHERE Grade =88;,Theory of database,72,二、带有比较运算符的子查询(续),执行这个查询,得到,(200215121,1) (200215121,3),然后外层查询取出下一个元组重复做上述1至3步骤, 直到外层的SC元组全部处理完毕。结果为:,(200215121,1) (200215121,3) (200215122,2),相关子查询可能的执行过程:,Theory of database,73,谓词语义,ANY:任意一个值,ALL:所有值,需要配合使用比较运算符

39、, ANY 大于子查询结果中的某个值 ALL 大于子查询结果中的所有值 = ANY 大于等于子查询结果中的某个值 = ALL 大于等于子查询结果中的所有值,三、带有ANY(SOME)或ALL谓词的子查询,Theory of database,74,三、带有ANY(SOME)或ALL谓词的子查询,)ANY 不等于子查询结果中的某个值 !=(或)ALL 不等于子查询结果中的任何一个值,谓词语义,ANY:任意一个值,ALL:所有值,需要配合使用比较运算符(续),Theory of database,75,三、带有ANY(SOME)或ALL谓词的子查询,例42:查询其他系中比计算机科学某一学生年龄小的

40、学生姓名和年龄。,SELECT Sname,Sage FROM Student WHERE Sage CS ; /*父查询块中的条件 */,Theory of database,76,三、带有ANY(SOME)或ALL谓词的子查询,例42:查询其他系中比计算机科学某一学生年龄小的学生姓名和年龄。,结果:,执行过程:,1.RDBMS执行此查询时,首先处理子查询,找出CS系中所有学生的年龄,构成一个集合(20,19);,2. 处理父查询,找所有不是CS系且年龄小于 20 或 19的学生。,Theory of database,77,三、带有ANY(SOME)或ALL谓词的子查询,(要求用聚集函数实

41、现查询),例42:查询其他系中比计算机科学某一学生年龄小的学生姓名和年龄。,SELECT Sname,Sage FROM Student WHERE Sage CS ;,Theory of database,78,三、带有ANY(SOME)或ALL谓词的子查询,例43:查询其他系中比计算机科学系所有学生年龄都小的学生姓名及年龄。,(方法一:用ALL谓词),SELECT Sname,Sage FROM Student WHERE Sage CS ;,Theory of database,79,三、带有ANY(SOME)或ALL谓词的子查询,例43:查询其他系中比计算机科学系所有学生年龄都小的学生

42、姓名及年龄。,(方法二:用聚集函数),SELECT Sname,Sage FROM Student WHERE Sage CS ;,Theory of database,80,表3.5 ANY(或SOME),ALL谓词与聚集函数、IN谓词 的等价转换关系,三、带有ANY(SOME)或ALL谓词的子查询,Theory of database,81,四、带有EXISTS谓词的子查询,EXISTS谓词,存在量词,带有EXISTS谓词的子查询不返回任何数据, 只产生逻辑真值“true”或逻辑假值“false”。,若内层查询结果非空,则外层的WHERE子句返回真值,若内层查询结果为空,则外层的WHERE

43、子句返回假值,由EXIST引出的子查询,其目标列表达式通常都用*, 因为带EXIST的子查询只返回真值或假值,给出列名 无实际意义。,NOT EXISTS谓词,若内层查询结果非空,则外层的WHERE子句返回假值,若内层查询结果为空,则外层的WHERE子句返回真值,Theory of database,82,例44:查询所有选修了1号课程的学生姓名。,思路分析:,本查询涉及Student和SC表; 在Student中依次取每个元组的Sno值,用此值去检查SC表; 若SC中存在这样的元组,其Sno值等于此Student.Sno值,并且其Cno= 1,则取此Student.Sname送入结果中;,四

44、、带有EXISTS谓词的子查询(续),Theory of database,83,(用嵌套查询实现查询),SELECT Sname FROM Student WHERE EXISTS(SELECT *FROM SCWHERE Sno=Student.Sno AND Cno= 1 );,例44:查询所有选修了1号课程的学生姓名。,四、带有EXISTS谓词的子查询(续),Theory of database,84,四、带有EXISTS谓词的子查询(续),(用连接运算实现查询),SELECT Sname FROM Student, SC WHERE Student.Sno=SC.Sno AND SC

45、.Cno= 1;,例44:查询所有选修了1号课程的学生姓名。,Theory of database,85,四、带有EXISTS谓词的子查询(续),例45:查询没有选修1号课程的学生姓名。,SELECT Sname FROM StudentWHERE NOT EXISTS(SELECT *FROM SCWHERE Sno = Student.Sno AND Cno=1);,Theory of database,86,四、带有EXISTS谓词的子查询(续),不同形式的查询间的替换,一些带EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换;,所有带IN谓词、比较运算符、AN

46、Y和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换。,Theory of database,87,四、带有EXISTS谓词的子查询(续),例:例39中,查询与“刘晨”在同一个系学习的学生。,(可以用带EXISTS谓词的子查询替换),SELECT Sno,Sname,Sdept FROM Student S1 WHERE EXISTS(SELECT *FROM Student S2WHERE S2.Sdept = S1.Sdept AND S2.Sname = 刘晨);,例39,Theory of database,88,全称量词的实现,四、带有EXISTS谓词的子查询(续),SQL

47、语言中没有全称量词 (For all),可以把带有全称量词的谓词转换为等价的带有存在量词的谓词:(x)P ( x( P),用EXISTS/NOT EXISTS实现全称量词(难点),Theory of database,89,四、带有EXISTS谓词的子查询(续),例46:查询选修了全部课程的学生姓名。,SELECT Sname FROM Student WHERE NOT EXISTS(SELECT *FROM CourseWHERE NOT EXISTS(SELECT *FROM SCWHERE Sno= Student.SnoAND Cno= Course.Cno);, 不存在这样的课程, 这个学生没有选修,即:查询这样的学生,不存在这样的课程,这个学生没有选修,Theory of database,90,四、带有EXISTS谓词的子查询(续),逻辑蕴涵的实现,用EXISTS/NOT EXISTS实现逻辑蕴涵(难点),SQL语言中没有蕴涵(Implication)逻辑运算,可以利用谓词演算将逻辑蕴涵谓词等价转换为:p q pq,Theory of database,

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报