数据库第三章2.ppt

上传人:苏美尔 文档编号:8918051 上传时间:2021-01-24 格式:PPT 页数:136 大小:548KB
返回 下载 相关 举报
数据库第三章2.ppt_第1页
第1页 / 共136页
数据库第三章2.ppt_第2页
第2页 / 共136页
数据库第三章2.ppt_第3页
第3页 / 共136页
数据库第三章2.ppt_第4页
第4页 / 共136页
数据库第三章2.ppt_第5页
第5页 / 共136页
点击查看更多>>
资源描述

《数据库第三章2.ppt》由会员分享,可在线阅读,更多相关《数据库第三章2.ppt(136页珍藏版)》请在三一文库上搜索。

1、数据库系统概论 An Introduction to Database System 第三章 关系数据库标准语言SQL,第三章 关系数据库标准语言SQL,3.1 SQL概述 3.2 学生-课程数据库 3.3 数据定义 3.4 数据查询 3.5 数据更新 3.6 视图 3.7 小结,数据查询,语句格式 SELECT ALL|DISTINCT , FROM , WHERE GROUP BY HAVING ORDER BY ASC|DESC ;,语句格式,SELECT子句:指定要显示的属性列 FROM子句:指定查询对象(基本表或视图) WHERE子句:指定查询条件 GROUP BY子句:对查询结果按

2、指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用集函数。 HAVING短语:筛选出只有满足指定条件的组 ORDER BY子句:对查询结果表按指定列值的升序或降序排序,3.4 数据查询,3.4.1 单表查询 3.4.2 连接查询 3.4.3 嵌套查询 3.4.4 集合查询 3.4.5 Select语句的一般形式,3.4.1 单表查询,查询仅涉及一个表: 一、 选择表中的若干列 二、 选择表中的若干元组 三、 ORDER BY子句 四、 聚集函数 五、 GROUP BY子句,查询指定列:,例1 查询全体学生的学号与姓名。 SELECT Sno,Sname FROM Student;

3、 例2 查询全体学生的姓名、学号、所在系。 SELECT Sname,Sno,Sdept FROM Student;,一、 选择表中的若干列,查询全部列,例3 查询全体学生的详细记录。 SELECT Sno,Sname,Ssex,Sage,Sdept FROM Student; 或 SELECT * FROM Student;,查询经过计算的值,SELECT子句的为表达式 算术表达式 字符串常量 函数 列别名 等,3. 查询经过计算的值,例4 查全体学生的姓名及其出生年份。 SELECT Sname,2011-Sage FROM Student; 输出结果: Sname 2011-Sage -

4、 - 李勇 1976 刘晨 1977 王名 1978 张立 1978,3. 查询经过计算的值,例5 查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。 SELECT Sname,Year of Birth: ,2011-Sage, LOWER(Sdept) FROM Student;,例题(续),输出结果: Sname Year of Birth: 2000-Sage LOWER(Sdept) - - - - 李勇 Year of Birth: 1976 cs 刘晨 Year of Birth: 1977 is 王名 Year of Birth: 1978 ma 张立 Year

5、 of Birth: 1977 is,例题(续),例5.1 使用列别名改变查询结果的列标题 SELECT Sname NAME,Year of Birth: BIRTH, 2000-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT FROM Student; 输出结果: NAME BIRTH BIRTHDAY DEPARTMENT - - - - 李勇 Year of Birth: 1976 cs 刘晨 Year of Birth: 1977 is 王名 Year of Birth: 1978 ma 张立 Year of Birth: 1977 is,二、选择表中的若

6、干元组,消除取值重复的行 查询满足条件的元组,1. 消除取值重复的行,在SELECT子句中使用DISTINCT短语 假设SC表中有下列数据 Sno Cno Grade - - - 95001 1 92 95001 2 85 95001 3 88 95002 2 90 95002 3 80,ALL 与 DISTINCT,例6 查询选修了课程的学生学号。 (1) SELECT Sno FROM SC; 或(默认 ALL) SELECT ALL Sno FROM SC; 结果: Sno - 95001 95001 95001 95002 95002,例题(续),(2) SELECT DISTINCT

7、 Sno FROM SC; 结果: Sno - 95001 95002,例题(续),注意 DISTINCT短语的作用范围是所有目标列 例:查询选修课程的各种成绩 错误的写法 SELECT DISTINCT Cno,DISTINCT Grade FROM SC; 正确的写法 SELECT DISTINCT Cno,Grade FROM SC;,查询满足条件的元组,表3.4 常用的查询条件,(1) 比较大小,在WHERE子句的中使用比较运算符 =,=,!,!= 20;,(2) 确定范围,使用谓词 BETWEEN AND NOT BETWEEN AND 例10 查询年龄在2023岁(包括20岁和23

8、岁)之间的 学生的姓名、系别和年龄。 SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23;,例题(续),例11 查询年龄不在2023岁之间的学生姓名、 系别和年龄。 SELECT Sname,Sdept,Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23;,(3) 确定集合,使用谓词 IN , NOT IN :用逗号分隔的一组取值 例12查询信息系(IS)、数学系(MA)和计算 机科学系(CS)学生的姓名和性别。 SELECT Sname,Ssex FROM Stu

9、dent WHERE Sdept IN ( IS,MA,CS );,(3) 确定集合,例13查询既不是信息系、数学系,也不是计算 机科学系的学生的姓名和性别。 SELECT Sname,Ssex FROM Student WHERE Sdept NOT IN ( IS,MA,CS );,(4) 字符串匹配,NOT LIKE ESCAPE :指定匹配模板 匹配模板:固定字符串或含通配符的字符串 当匹配模板为固定字符串时, 可以用 = 运算符取代 LIKE 谓词 用 != 或 运算符取代 NOT LIKE 谓词,通配符,% (百分号) 代表任意长度(长度可以为0)的字符串 例:a%b表示以a开头,

10、以b结尾的任意长度的字符串。如acb,addgb,ab 等都满足该匹配串 _ (下横线) 代表任意单个字符 例:a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串,ESCAPE 短语:,当用户要查询的字符串本身就含有 % 或 _ 时,要使用ESCAPE 短语对通配符进行转义。,例题,1) 匹配模板为固定字符串 例14 查询学号为95001的学生的详细情况。 SELECT * FROM Student WHERE Sno LIKE 95001; 等价于: SELECT * FROM Student WHERE Sno = 95001;,例题(续),2) 匹配模板

11、为含通配符的字符串 例15 查询所有姓刘学生的姓名、学号和性别。 SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE 刘%;,例题(续),匹配模板为含通配符的字符串(续) 例16 查询姓“欧阳”且全名为三个汉字的学生的姓 名。 SELECT Sname FROM Student WHERE Sname LIKE 欧阳_;,例题(续),匹配模板为含通配符的字符串(续) 例17 查询名字中第2个字为“阳”字的学生的姓名 和学号。 SELECT Sname,Sno FROM Student WHERE Sname LIKE _阳%;,例题(续),匹

12、配模板为含通配符的字符串(续) 例18 查询所有不姓刘的学生姓名。 SELECT Sname,Sno,Ssex FROM Student WHERE Sname NOT LIKE 刘%;,例题(续),3) 使用换码字符将通配符转义为普通字符 例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_ _ ES

13、CAPE ;,(5) 涉及空值的查询,使用谓词 IS NULL 或 IS NOT NULL “IS NULL” 不能用 “= NULL” 代替 例21 某些学生选修课程后没有参加考试,所以有选课记 录,但没有考试成绩。查询缺少成绩的学生的学号 和相应的课程号。 SELECT Sno,Cno FROM SC WHERE Grade IS NULL;,例题(续),例22 查所有有成绩的学生学号和课程号。 SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL;,(6) 多重条件查询,用逻辑运算符AND和OR来联结多个查询条件 AND的优先级高于OR 可以用括号

14、改变优先级 可用来实现多种其他谓词 NOT IN NOT BETWEEN AND ,例题,例23 查询计算机系年龄在20岁以下的学生姓名。 SELECT Sname FROM Student WHERE Sdept= CS AND Sage20;,改写例12,例12 查询信息系(IS)、数学系(MA)和计算 机科学系(CS)学生的姓名和性别。 SELECT Sname,Ssex FROM Student WHERE Sdept IN ( IS,MA,CS ) 可改写为: SELECT Sname,Ssex FROM Student WHERE Sdept= IS OR Sdept= MA OR

15、 Sdept= CS ;,改写例10,例10 查询年龄在2023岁(包括20岁和23岁)之 间的学生的姓名、系别和年龄。 SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23; 可改写为: SELECT Sname,Sdept,Sage FROM Student WHERE Sage=20 AND Sage=23;,三、对查询结果排序,使用ORDER BY子句 可以按一个或多个属性列排序 升序:ASC;降序:DESC;缺省值为升序 当排序列含空值时 ASC:排序列为空值的元组最后显示 DESC:排序列为空值的元组最先

16、显示,对查询结果排序(续),例24 查询选修了3号课程的学生的学号及其成 绩,查询结果按分数降序排列。 SELECT Sno,Grade FROM SC WHERE Cno= 3 ORDER BY Grade DESC;,查询结果,Sno Grade - - 95010 95024 95007 92 95003 82 95010 82 95009 75 95014 61 95002 55,对查询结果排序(续),例25 查询全体学生情况,查询结果按所在系的 系号升序排列,同一系中的学生按年龄降 序排列。 SELECT * FROM Student ORDER BY Sdept,Sage DESC

17、;,四、使用集函数,5类主要集函数 计数 COUNT(DISTINCT|ALL *) COUNT(DISTINCT|ALL ) 计算总和 SUM(DISTINCT|ALL ) 计算平均值 AVG(DISTINCT|ALL ),使用集函数(续),求最大值 MAX(DISTINCT|ALL ) 求最小值 MIN(DISTINCT|ALL ) DISTINCT短语:在计算时要取消指定列中的重复值 ALL短语:不取消重复值 ALL为缺省值,使用集函数 (续),例26 查询学生总人数。 SELECT COUNT(*) FROM Student; 例27 查询选修了课程的学生人数。 SELECT COUN

18、T(DISTINCT Sno) FROM SC; 注:用DISTINCT以避免重复计算学生人数,使用集函数 (续),例28 计算1号课程的学生平均成绩。 SELECT AVG(Grade) FROM SC WHERE Cno= 1 ; 例29 查询选修1号课程的学生最高分数。 SELECT MAX(Grade) FROM SC WHER Cno= 1 ;,五、对查询结果分组,使用GROUP BY子句分组 细化集函数的作用对象 未对查询结果分组,集函数将作用于整个查询结果 对查询结果分组后,集函数将分别作用于每个组,使用GROUP BY子句分组,例30 求各个课程号及相应的选课人数。 SELEC

19、T Cno,COUNT(Sno) FROM SC GROUP BY Cno; 结果 Cno COUNT(Sno) 1 22 2 34 3 44 4 33 5 48,对查询结果分组 (续),GROUP BY子句的作用对象是查询的中间结果表 分组方法:按指定的一列或多列值分组,值相等的为一组 使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和集函数,使用HAVING短语筛选最终输出结果,只有满足HAVING短语指定条件的组才输出 HAVING短语与WHERE子句的区别:作用对象不同 WHERE子句作用于基表或视图,从中选择满足条件的元组。 HAVING短语作用于组,从中选择

20、满足条件的组。,使用HAVING短语筛选最终输出结果,例31 查询选修了3门以上课程的学生学号。 SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) 3;,例题,例32 查询有3门以上课程是90分以上的学生的 学号及(90分以上的)课程数 SELECT Sno, COUNT(*) FROM SC WHERE Grade=90 GROUP BY Sno HAVING COUNT(*)=3;,3.3 查询,3.3.1 概述 3.3.2 单表查询 3.3.3 连接查询 3.3.4 嵌套查询 3.3.5 集合查询 3.3.6 小结,3.3.3 连接查询,同时

21、涉及多个表的查询称为连接查询 用来连接两个表的条件称为连接条件或连接谓词 一般格式: . . 比较运算符:=、=、. BETWEEN . AND . 连接字段 连接谓词中的列名称为连接字段 连接条件中的各连接字段类型必须是可比的,但不必是相同的,连接操作的执行过程,嵌套循环法(NESTED-LOOP) 首先在表1中找到第一个元组,然后从头开始扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。 表2全部查找完后,再找表1中第二个元组,然后再从头开始扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第二个元组与该元组拼接起来,形成结果表

22、中一个元组。 重复上述操作,直到表1中的全部元组都处理完毕,排序合并法(SORT-MERGE),常用于=连接 首先按连接属性对表1和表2排序 对表1的第一个元组,从头开始扫描表2,顺序查找满足连接条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。当遇到表2中第一条大于表1连接字段值的元组时,对表2的查询不再继续,排序合并法,找到表1的第二条元组,然后从刚才的中断点处继续顺序扫描表2,查找满足连接条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。直接遇到表2中大于表1连接字段值的元组时,对表2的查询不再继续 重复上述操作,直到表1或表2

23、中的全部元组都处理完毕为止,索引连接(INDEX-JOIN),对表2按连接字段建立索引 对表1中的每个元组,依次根据其连接字段值查询表2的索引,从中找到满足条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组,连接查询 (续),SQL中连接查询的主要类型 广义笛卡尔积 等值连接(含自然连接) 非等值连接查询 自身连接查询 外连接查询 复合条件连接查询,一、广义笛卡尔积,不带连接谓词的连接 很少使用 例: SELECT Student.* , SC.* FROM Student, SC,二、等值与非等值连接查询,等值连接、自然连接、非等值连接 连接运算符为 = 的连接操

24、作 . = . 任何子句中引用表1和表2中同名属性时,都必须加表名前缀。引用唯一属性名时可以加也可以省略表名前缀。 例32 查询每个学生及其选修课程的情况。 SELECT Student.*,SC.* FROM Student,SC WHERE Student.Sno = SC.Sno;,二、等值与非等值连接查询,自然连接,等值连接的一种特殊情况,把目标列中重复的属性列去掉。 例33 对例32用自然连接完成。 SELECT Student.Sno,Sname,Ssex,Sage, Sdept,Cno,Grade FROM Student,SC WHERE Student.Sno = SC.Sn

25、o;,非等值连接查询,连接运算符 不是 = 的连接操作 . 比较运算符:、=、. BETWEEN . AND .,三、自身连接,一个表与其自己进行连接,称为表的自身连接 需要给表起别名以示区别 由于所有属性名都是同名属性,因此必须使用别名前缀,自身连接(续),例34 查询每一门课的间接先修课(即先修课的先 修课) SELECT FIRST.Cno,SECOND.Cpno FROM Course FIRST,Course SECOND WHERE FIRST.Cpno = SECOND.Cno;,自身连接(续),FIRST表(Course表),SECOND表(Course表),自身连接(续),查

26、询结果,四、外连接,外连接与普通连接的区别 普通连接操作只输出满足连接条件的元组 外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出 例 36 改写例33 SELECT Student.Sno,Sname,Ssex, Sage,Sdept,Cno,Grade FROM Student LEFT OUT JOIN SC ON (Student.Sno=SC.Sno);,外连接(续),执行结果:,外连接(续),左外连接 列出左边关系(如本例Student)中所有的元组 右外连接 列出右边关系中所有的元组,五、复合条件连接,WHERE子句中含多个连接条件时,称为复合条件连接 例35

27、查询选修2号课程且成绩在90分以上的所有学生 的学号、姓名 SELECT Student.Sno, student.Sname FROM Student, SC WHERE Student.Sno = SC.Sno AND /* 连接谓词*/ SC.Cno= 2 AND /* 其他限定条件 */ SC.Grade 90; /* 其他限定条件 */,多表连接,例36 查询每个学生的学号、姓名、选修的课程名及成绩。 SELECT Student.Sno,Sname,Cname,Grade FROM Student,SC,Course WHERE Student.Sno = SC.Sno and S

28、C.Cno = Course.Cno; 结果: Student.Sno Sname Cname Grade 95001 李勇 数据库 92 95001 李勇 数学 85 95001 李勇 信息系统 88 95002 刘晨 数学 90 95002 刘晨 信息系统 80,3.3 查 询,3.3.1 概述 3.3.2 单表查询 3.3.3 连接查询 3.3.4 嵌套查询 3.3.5 集合查询 3.3.6 小结,3.3.4 嵌套查询,嵌套查询概述 嵌套查询分类 嵌套查询求解方法 引出子查询的谓词,嵌套查询(续),嵌套查询概述 一个SELECT-FROM-WHERE语句称为一个查询块 将一个查询块嵌套在

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

30、子查询的结果用于建立其 父查询的查找条件。,嵌套查询求解方法(续),相关子查询 首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表; 然后再取外层表的下一个元组; 重复这一过程,直至外层表全部检查完为止。,引出子查询的谓词,带有IN谓词的子查询 带有比较运算符的子查询 带有ANY或ALL谓词的子查询 带有EXISTS谓词的子查询,一、带有IN谓词的子查询,例37 查询与“刘晨”在同一个系学习的学生。 此查询要求可以分步来完成 确定“刘晨”所在系名 SELECT Sdept FROM Student WHERE Sname=

31、 刘晨 ; 结果为: Sdept IS,带有IN谓词的子查询(续), 查找所有在IS系学习的学生。 SELECT Sno,Sname,Sdept FROM Student WHERE Sdept= IS ; 结果为: Sno Sname Sdept 95001 刘晨 IS 95004 张立 IS,构造嵌套查询,将第一步查询嵌入到第二步查询的条件中 SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN (SELECT Sdept FROM Student WHERE Sname= 刘晨 ); 此查询为不相关子查询。DBMS求解该查询时也 是分步去做

32、的。,带有IN谓词的子查询(续),用自身连接完成本查询要求 SELECT S1.Sno,S1.Sname,S1.Sdept FROM Student S1,Student S2 WHERE S1.Sdept = S2.Sdept AND S2.Sname = 刘晨;,带有IN谓词的子查询(续),父查询和子查询中的表均可以定义别名 SELECT Sno,Sname,Sdept FROM Student S1 WHERE S1.Sdept IN ( SELECT Sdept FROM Student S2 WHERE S2.Sname= 刘晨 );,带有IN谓词的子查询(续),例38查询选修了课程

33、名为“信息系统”的学生学号和姓名 SELECT Sno,Sname 最后在Student关系中 FROM Student 取出Sno和Sname WHERE Sno IN (SELECT Sno 然后在SC关系中找出选 FROM SC 修了3号课程的学生学号 WHERE Cno IN (SELECT Cno 首先在Course关系中找出“信 FROM Course 息系统”的课程号,结果为3号 WHERE Cname= 信息系统);,带有IN谓词的子查询(续),结果: Sno Sname - - 95001 李勇 95002 刘晨,带有IN谓词的子查询(续),用连接查询 SELECT Sno,

34、Sname FROM Student,SC,Course WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno AND Course.Cname=信息系统;,二、带有比较运算符的子查询,当能确切知道内层查询返回单值时,可用 比较运算符(,=,)。 与ANY或ALL谓词配合使用,带有比较运算符的子查询(续),例:假设一个学生只可能在一个系学习,并且必须 属于一个系,则在例37可以用 = 代替IN : SELECT Sno,Sname,Sdept FROM Student WHERE Sdept = SELECT Sdept FROM Student

35、 WHERE Sname= 刘晨 ;,带有比较运算符的子查询(续),子查询一定要跟在比较符之后 错误的例子: SELECT Sno,Sname,Sdept FROM Student WHERE ( SELECT Sdept FROM Student WHERE Sname= 刘晨 ) = Sdept;,三、带有ANY或ALL谓词的子查询,谓词语义 ANY:任意一个值 ALL:所有值,带有ANY或ALL谓词的子查询(续),需要配合使用比较运算符 ANY大于子查询结果中的某个值 ALL大于子查询结果中的所有值 = ANY大于等于子查询结果中的某个值 = ALL大于等于子查询结果中的所有值 )ANY

36、不等于子查询结果中的某个值 !=(或)ALL不等于子查询结果中的任何一个值,带有ANY或ALL谓词的子查询(续),例39 查询其他系中比信息系任意一个(其中某一 个)学生年龄小的学生姓名和年龄 SELECT Sname,Sage FROM Student WHERE Sage IS ; /* 注意这是父查询块中的条件 */,带有ANY或ALL谓词的子查询(续),结果 Sname Sage 王敏 18 执行过程 1.DBMS执行此查询时,首先处理子查询,找出 IS系中所有 学生的年龄,构成一个集合(19,18) 2. 处理父查询,找所有不是IS系且年龄小于 19 或18的学生,带有ANY或ALL

37、谓词的子查询(续),ANY和ALL谓词有时可以用集函数实现 ANY与ALL与集函数的对应关系,用集函数实现子查询通常比直接用ANY或ALL查询效率要高,因为前者通常能够减少比较次数,带有ANY或ALL谓词的子查询(续),例39:用集函数实现例39 SELECT Sname,Sage FROM Student WHERE Sage IS ;,带有ANY或ALL谓词的子查询(续),例40 查询其他系中比信息系所有学生年龄都小的学生姓名及年龄。 方法一:用ALL谓词 SELECT Sname,Sage FROM Student WHERE Sage IS ; 查询结果为空表。,带有ANY或ALL谓词

38、的子查询(续),方法二:用集函数 SELECT Sname,Sage FROM Student WHERE Sage IS ;,四、带有EXISTS谓词的子查询,1. EXISTS谓词 2. NOT EXISTS谓词 3. 不同形式的查询间的替换 4. 相关子查询的效率 5. 用EXISTS/NOT EXISTS实现全称量词(略) 6. 用EXISTS/NOT EXISTS实现逻辑蕴函(略),带有EXISTS谓词的子查询(续),1. EXISTS谓词 存在量词 带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。 若内层查询结果非空,则返回真值 若内

39、层查询结果为空,则返回假值 由EXISTS引出的子查询,其目标列表达式通常都用* ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义 2. NOT EXISTS谓词,带有EXISTS谓词的子查询(续),例41 查询所有选修了1号课程的学生姓名。 用嵌套查询 SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC /*相关子查询*/ WHERE Sno=Student.Sno AND Cno= 1 ); 求解过程,带有EXISTS谓词的子查询(续),思路分析: 本查询涉及Student和SC关系。 在Student中依次取每

40、个元组的Sno值,用此值去检查SC关系。 若SC中存在这样的元组,其Sno值等于此Student.Sno值,并且其Cno= 1,则取此Student.Sname送入结果关系。,带有EXISTS谓词的子查询(续),用连接运算 SELECT Sname FROM Student, SC WHERE Student.Sno=SC.Sno AND SC.Cno= 1;,带有EXISTS谓词的子查询(续),例42 查询没有选修1号课程的学生姓名。 SELECT Sname FROM Student WHERE NOT EXISTS (SELECT * FROM SC WHERE Sno = Studen

41、t.Sno AND Cno=1); 此例用连接运算难于实现,带有EXISTS谓词的子查询(续),3. 不同形式的查询间的替换 一些带EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换 所有带IN谓词、比较运算符、ANY和ALL谓词 的子查询都能用带EXISTS谓词的子查询等价 替换。,带有EXISTS谓词的子查询(续),例:例37查询与“刘晨”在同一个系学习的学生。 可以用带EXISTS谓词的子查询替换: SELECT Sno,Sname,Sdept FROM Student S1 WHERE EXISTS SELECT * FROM Student S2 WHERE

42、 S2.Sdept = S1.Sdept AND S2.Sname = 刘晨 ;,带有EXISTS谓词的子查询(续),5.用EXISTS/NOT EXISTS实现全称量词(难点) SQL语言中没有全称量词 (For all) 可以把带有全称量词的谓词转换为等价的带有 存在量词的谓词: (x)P ( x( P),带有EXISTS谓词的子查询(续),例43 查询选修了全部课程的学生姓名。 SELECT Sname FROM Student WHERE NOT EXISTS (SELECT * FROM Course WHERE NOT EXISTS (SELECT * FROM SC WHERE

43、Sno= Student.Sno AND Cno= Course.Cno);,带有EXISTS谓词的子查询(续),6. 用EXISTS/NOT EXISTS实现逻辑蕴函(难点) SQL语言中没有蕴函(Implication)逻辑运算 可以利用谓词演算将逻辑蕴函谓词等价转换为: p q pq,带有EXISTS谓词的子查询(续),例44 查询至少选修了学生95002选修的全部课程的学生号码。 解题思路: 用逻辑蕴函表达:查询学号为x的学生,对所有的课程y,只要95002学生选修了课程y,则x也选修了y。 形式化表示: 用P表示谓词 “学生95002选修了课程y” 用q表示谓词 “学生x选修了课程y

44、” 则上述查询为: (y) p q,带有EXISTS谓词的子查询(续),等价变换: (y)p q (y (p q ) (y ( p q) y(pq) 变换后语义:不存在这样的课程y,学生95002选修 了y,而学生x没有选。,带有EXISTS谓词的子查询(续),用NOT EXISTS谓词表示: SELECT DISTINCT Sno FROM SC SCX WHERE NOT EXISTS (SELECT * FROM SC SCY WHERE SCY.Sno = 95002 AND NOT EXISTS (SELECT * FROM SC SCZ WHERE SCZ.Sno=SCX.Sno

45、AND SCZ.Cno=SCY.Cno);,3.3 查 询,3.3.1 概述 3.3.2 单表查询 3.3.3 连接查询 3.3.4 嵌套查询 3.3.5 集合查询 3.3.6 小结,3.3.5 集合查询,集合操作的种类 并操作UNION 交操作INTERSECT 差操作EXCEPT 参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同,1 并操作,形式 UNION 参加UNION操作的各结果表的列数必须相同;对应项的数据类型也必须相同,并操作(续),例45 查询计算机科学系的学生及年龄不大于19 岁的学生。 方法一: SELECT * FROM Student WHERE Sdept= CS UNION SELECT * FROM Student WHERE Sage=19;,并操作(续),方法二: SELECT DISTINCT * FROM Student WHERE Sdept= CS OR Sage=19;,并操作(续),例46 查询选修了课程1或者选修了课程2的学生。 方法一: SELECT Sno FROM SC WHERE Cno= 1 UNION SELECT Sno FROM SC WHERE Cno= 2

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1