第三章__关系数据库标准语言SQL-1.ppt

上传人:laozhun 文档编号:2410266 上传时间:2023-02-18 格式:PPT 页数:112 大小:824KB
返回 下载 相关 举报
第三章__关系数据库标准语言SQL-1.ppt_第1页
第1页 / 共112页
第三章__关系数据库标准语言SQL-1.ppt_第2页
第2页 / 共112页
第三章__关系数据库标准语言SQL-1.ppt_第3页
第3页 / 共112页
第三章__关系数据库标准语言SQL-1.ppt_第4页
第4页 / 共112页
第三章__关系数据库标准语言SQL-1.ppt_第5页
第5页 / 共112页
点击查看更多>>
资源描述

《第三章__关系数据库标准语言SQL-1.ppt》由会员分享,可在线阅读,更多相关《第三章__关系数据库标准语言SQL-1.ppt(112页珍藏版)》请在三一办公上搜索。

1、第三章 关系数据库标准语言SQL,结构化查询语言(Structured Query Language,简称SQL)介于关系代数与关系演算之间包括查询、操纵、定义和控制四个方面关系数据库的标准语言,第三章 关系数据库标准语言SQL,3.1 SQL概述3.2 数据定义3.3 查询3.4 数据更新3.5 视图3.6 数据控制,3.1 SQL概述,SQL的特点1.综合统一集DDL、DML、DCL于一体。2.高度非过程化不用考虑如何实现,只需提出“做什么”,不关心“怎么做“。3.面向集合的操作方式查询、插入、删除、更新操作对象及结果都是集合。4.以同一种语法结构提供两种使用方法可交互式和嵌入式使用。5.

2、语言简洁,易学易用,3.1 SQL概述,SQL语言所使用的动词,3.1 SQL概述,SQL与三级模式体系结构,第三章 关系数据库标准语言SQL,3.1 SQL概述3.2 数据定义3.3 查询3.4 数据更新3.5 视图3.6 数据控制3.7 嵌入式SQL,3.2 数据定义,SQL提供了专门的语言用来定义数据库、表、索引等数据库对象,这些语言被称作数据库定义语言(Data Definition Language,DDL)。SQL的数据定义语句:,3.2 数据定义,3.2.1 定义、删除与修改基本表3.2.2 建立与删除索引,3.2.1 定义、删除与修改基本表,一、定义基本表二、删除基本表三、修改

3、基本表,一、定义基本表,SQL 中的数据类型SMALLINT半字长二进制整数INT全字长二进制整数DECIMAL(p,q)压缩十进制数FLOAT双字长浮点数CHAR(n)长度为n的定长字符串VARCHAR(n)最大长度为n的变长字符串IMAGE 图像DATETIME日期和时间,一、定义基本表,语句格式,CREATE TABLE(,);,:所要定义的基本表的名字:组成该表的各个属性(列):涉及相应属性列的完整性约束条件:涉及一个或多个属性列的完整性约束条件,示例,一、定义基本表,常用完整性约束主码约束:PRIMARY KEY唯一性约束:UNIQUE(不能取相同值但允许多个空值)非空值约束:NOT

4、 NULL参照完整性约束:FOREIGN KEY()REFERENCES(),一、定义基本表,例1 建立一个“学生”表Student,它由学号Sno、姓名Sname、性别Ssex、年龄Sage、所在系Sdept五个属性构成。其中学号不能为空,值是唯一的,并且姓名取值也唯一。CREATE TABLE Student(Sno CHAR(5)NOT NULL UNIQUE,Sname CHAR(20)UNIQUE,Ssex CHAR(2),Sage INT,Sdept CHAR(15),PRIMARY KEY(Sno);,可换为PRIMARY KEY,一、定义基本表,例2 建立一个“学生选课”表SC

5、,它由学号Sno、课程号Cno,成绩Grade组成,其中(Sno,Cno)为主码。CREATE TABLE SC(Sno CHAR(5),Cno CHAR(3),Grade INT,PRIMARY KEY(Sno,Cno),FOREIGN KEY(Sno)REFERENCES S(Sno),FOREIGN KEY(Cno)REFERENCES C(Cno);,二、删除基本表,语句格式DROP TABLE;例3 删除Student表 DROP TABLEStudent;基本表删除后,表里的数据、表上的索引都会被删除,表上的视图往往仍然保留,但无法引用。删除基本表时,系统会从数据字典中删去有关该基

6、本表及其索引的描述。,三、修改基本表,语句格式ALTER TABLE ADD 完整性约束 DROP MODIFY;:要修改的基本表ADD子句:增加新列和新的完整性约束条件DROP子句:删除指定的完整性约束条件MODIFY子句:用于修改列名和数据类型,三、修改基本表,例4 向Student表增加“入学时间”列,其数据类型为日期型。ALTER TABLE Student ADD Scome DATETIME;注:不论基本表中原来是否已有数据,新增加的列一律为空值。例5 将年龄的数据类型改为半字长整数。ALTER TABLE Student MODIFY Sage SMALLINT;注:修改原有的列

7、定义有可能会破坏已有数据例6 删除学生姓名必须取唯一值的约束。ALTER TABLE Student DROP UNIQUE(Sname);,三、修改基本表,删除属性列间接删除把表中要保留的列及其内容复制到一个新表中删除原表再将新表重命名为原表名直接删除属性列:(SQL-99)例:ALTER TABLE Student Drop Scome;,3.2.2 建立与删除索引,一、建立索引二、删除索引,Search-key项常用的组织方式是顺序或Hash排列。单一索引(Unique Index):每一个索引值只对应唯一的数据记录。当建立单一索引后,索引项不可以再插入已有值,但可以多个空值。同样,当建

8、立单一索引时,如果待索引项存在相同值则不能建立。聚簇索引(Cluster Index):索引项顺序与表中数据记录的物理顺序一致。,Index_sno,Index_sage,索引,一、建立索引,语句格式:CREATE UNIQUE CLUSTER INDEX ON(,);用指定要建索引的基本表名字索引可以建立在该表的一列或多列上,各列名之间用逗号分隔用指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASCUNIQUE表明此索引的每一个索引值只对应唯一的数据记录CLUSTER表示要建立的索引是聚簇索引,一、建立索引,例7 为学生-课程数据库中的Student,Course,SC三个表建

9、立索引。其中Student表按学号升序建唯一索引,Course表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引。CREATE UNIQUE INDEX Stusno ON Student(Sno);CREATE UNIQUE INDEX Coucno ON Course(Cno);CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);例8 在Student表的Sname(姓名)列上建立一个聚簇索引,而且Student表中的记录将按照Sname值的升序存放。CREATE CLUSTER INDEX Stusname ON Student

10、(Sname);,二、删除索引,语句格式:DROP INDEX;注:删除索引时,系统会从数据字典中删去有关该索引的描述。例9 删除Student表的Stusname索引。DROP INDEX Stusname;SQL标准中没有定义对索引的修改功能,而采用删除后重新定义索引的方式实现。,单一索引(唯一值索引)对于已含重复值的属性列不能建UNIQUE索引对某个列建立UNIQUE索引后,插入新记录时DBMS会自动检查新记录在该列上是否取了重复值。这相当于增加了一个UNIQUE约束聚簇索引(聚集索引)建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存放。也即聚簇索引的索引项顺序与表中记录

11、的物理顺序一致在一个基本表上最多只能建立一个聚簇索引聚簇索引的用途:对于某些类型的查询,可以提高查询效率聚簇索引的适用范围 很少对基表进行增删操作 很少对其中的变长列进行修改操作,索引,建立索引是加快查询速度的有效手段建立索引DBA或表的属主(即建立表的人)根据需要建立有些DBMS自动建立以下列上的索引 PRIMARY KEY UNIQUE维护索引:DBMS自动完成使用索引:DBMS自动选择是否使用索引以及使用哪些索引,第三章 关系数据库标准语言SQL,3.1 SQL概述3.2 数据定义3.3 查询3.4 数据更新3.5 视图3.6 数据控制3.7 嵌入式SQL,3.3 查询,3.3.1 概述

12、3.3.2 单表查询3.3.3 连接查询3.3.4 嵌套查询3.3.5 集合查询3.3.6 小结,3.3.1 概述,查询语法SELECT ALL|DISTINCT,FROM,WHERE GROUP BY HAVING ORDER BY ASC|DESC;SELECT子句:指定要显示的属性列FROM子句:指定查询对象(基本表或视图)WHERE子句:指定查询条件GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用集函数。HAVING短语:筛选出只有满足指定条件的组ORDER BY子句:对查询结果按指定列值的升序或降序排序,3.3.1 概述,执行过程:1

13、)读取FROM子句中基本表、视图的数据,执行笛卡尔积操作。2)选取满足WHERE子句中给出的条件表达式的元组。3)按GROUP子句中指定列的值分组,同时提取满足HAVING短语中条件表达式的那些组。4)按SELECT子句中给出的列名或列表达式求值输出.5)ORDER子句对输出的目标表进行排序,3.3.1 概述,本节所用到的数据库:学生-课程数据库学生表:Student(Sno,Sname,Ssex,Sage,Sdept),3.3.1 概述,课程表:Course(Cno,Cname,Cpno,Ccredit),3.3.1 概述,学生选课表:SC(Sno,Cno,Grade),3.3.2 单表查询

14、,查询仅涉及一个表,是一种最简单的查询操作一、选择表中的若干列二、选择表中的若干元组三、对查询结果排序四、使用集函数五、对查询结果分组,一、选择表中的若干列(),例1 查询全体学生的学号与姓名。SELECT Sno,SnameFROM Student;/等价于 sno,Sname(Student)例2 查询全体学生的姓名、学号、所在系。SELECT Sname,Sno,SdeptFROM Student;例3 查询全体学生的详细记录。SELECT Sno,Sname,Ssex,Sage,Sdept FROM Student;或SELECT*/表示将表中的列全部按序输出FROM Student;

15、,一、选择表中的若干列,1)目标列(SELECT子句)为表达式的查询目标列形式:算术表达式、字符串常量、函数、列别名等。例4 查全体学生的姓名及其出生年份。SELECT Sname,1996-SageFROM Student;,输出结果:Sname 1996-Sage-李勇 1976 刘晨 1977 王敏 1978 张立 1977,一、选择表中的若干列,例5 查询全体学生的姓名、出生年份和所在系,要求用小写字母表示所在系名。SELECT Sname,Year of Birth:,1996-Sage,ISLOWER(Sdept)FROM Student;,输出结果:Sname Year of B

16、irth:1996-Sage ISLOWER(Sdept)-李勇 Year of Birth:1976 cs 刘晨 Year of Birth:1977 is 王敏 Year of Birth:1978 ma 张立 Year of Birth:1977 is,2)使用列别名改变查询结果的列标题例5.1(上例)查询全体学生的姓名、出生年份和所在系,并将输出字段依次更名为:NAME、BIRTH、BIRTHDAY、DEPARTMENT。SELECT Sname NAME,Year of Birth:BIRTH,1996-Sage BIRTHDAY,ISLOWER(Sdept)DEPARTMENT F

17、ROM 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,3)消除结果中取值重复的行在SELECT子句中使用DISTINCT短语。例6 查询选修了课程的学生学号。,(1)SELECT SnoFROM SC;或(默认 ALL)SELECT ALL SnoFROM SC;,结果:Sno-95001 95001 95001 95002 95002,(2)SELEC

18、T DISTINCT Sno FROM SC;,结果:Sno-95001 95002,一、选择表中的若干列,注意:DISTINCT短语的作用范围是所有目标列例:查询选修课程的各种成绩错误的写法SELECT DISTINCT Cno,DISTINCT GradeFROM SC;正确的写法SELECT DISTINCT Cno,GradeFROM SC;注:在投影()运算的定义中直接去掉了结果中的重复元组,在SQL中必须在SELECT子句中用DISTINCT明确指定才能去掉重复列。,二、选择表中的若干元组(),使用WHERE子句WHERE子句常用的查询条件:,二、选择表中的若干元组(),1)使用比

19、较运算符确定元组例7 查询计算机系全体学生的信息。SELECT*FROM StudentWHERE Sdept=CS;/等价于Sdept=CS(Student)例8 查询所有年龄在20岁以下的学生姓名及其年龄。SELECT Sname,Sage FROM Student WHERE Sage=20;,二、选择表中的若干元组(),2)确定范围例10 查询年龄在2023岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。SELECT Sname,Sdept,SageFROM StudentWHERE Sage BETWEEN 20 AND 23;例11 查询年龄不在2023岁之间的学生姓名、系别

20、和年龄。SELECT Sname,Sdept,SageFROM StudentWHERE Sage NOT BETWEEN 20 AND 23;,二、选择表中的若干元组(),3)确定集合例12 查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。SELECT Sname,SsexFROM StudentWHERE Sdept IN(IS,MA,CS);例13 查询不是信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。SELECT Sname,SsexFROM StudentWHERE Sdept NOT IN(IS,MA,CS);,二、选择表中的若干元

21、组(),4)字符串匹配NOT LIKE ESCAPE:指定匹配模板。匹配模板:固定字符串或含通配符的字符串。当匹配模板为固定字符串时,可以用=运算符取代LIKE 谓词,用!=或 运算符取代 NOT LIKE 谓词。%(百分号):代表任意长度(长度可以为0)的字符串例:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab 等都满足该匹配串。_(下横线):代表任意单个字符例:a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串当用户要查询的字符串本身就含有%或 _ 时,要使用ESCAPE 短语对通配符进行转义。,二、选择表中的若干元组(),匹配

22、模板为固定字符串 例14 查询学号为95001的学生的详细情况。SELECT*FROM Student WHERE Sno LIKE 95001;等价于:SELECT*FROM Student WHERE Sno=95001;,二、选择表中的若干元组(),匹配模板为含通配符的字符串例15 查询所有姓刘学生的姓名、学号和性别。SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE 刘%;例16 查询姓欧阳且全名为三个汉字的学生的姓名。SELECT Sname FROM Student WHERE Sname LIKE 欧阳_ _;例17 查询名字中

23、第2个字为阳字的学生的姓名和学号。SELECT Sname,Sno FROM Student WHERE Sname LIKE _ _阳%;,例18 查询所有不姓刘的学生姓名。SELECT Sname FROM Student WHERE Sname NOT LIKE 刘%;用转义符将通配符转义为普通字符例19 查询DB_Design课程的课程号和学分。SELECT Cno,Ccredit FROM Course WHERE Cname LIKE DB_Design ESCAPE 例20 查询以DB_开头,且倒数第3个字符为 i的课程的详细情况。SELECT*FROM Course WHERE

24、 Cname LIKE DB_%i_ _ ESCAPE;,5)涉及空值的查询使用谓词 IS NULL 或 IS NOT NULL“IS NULL”不能用“=NULL”代替例21 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。SELECT Sno,CnoFROM SCWHERE Grade IS NULL;例22 查询所有有成绩的学生学号和课程号。SELECT Sno,CnoFROM SC WHERE Grade IS NOT NULL;,二、选择表中的若干元组(),二、选择表中的若干元组(),6)多重条件查询用逻辑运算符AND和 OR来

25、联结多个查询条件AND的优先级高于OR可以用括号改变优先级可用来连接多种其他谓词条件,如:A BNOT BETWEEN AND NOT INLIKE,NOT LIKEIS NULL,IS NOT NULL可用作其他部分谓词条件的等价替换NOT BETWEEN AND NOT IN,二、选择表中的若干元组(),例23 查询计算机系年龄在20岁以下的学生姓名。SELECT SnameFROM StudentWHERE Sdept=CS AND Sage=20 AND Sage=23;,例12 查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。SELECT Sname,Sse

26、xFROM StudentWHERE Sdept IN(IS,MA,CS);可改写为:SELECT Sname,SsexFROM StudentWHERE Sdept=IS OR Sdept=MA OR Sdept=CS;SQL代码优化:如果建立了WHERE子句中的属性列的索引,NOT BETWEEN AND 和 NOT IN将不会利用索引提高查询效率,应改为多重条件查询,如上两例。,三、对查询结果排序输出,使用ORDER BY子句可以按一个或多个属性列排序升序:ASC;降序:DESC;缺省值为升序当排序列含空值时ASC:排序列为空值的元组最后显示DESC:排序列为空值的元组最先显示(将空值作

27、为最大值来理解),三、对查询结果排序输出,例24 查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。SELECT Sno,GradeFROM SCWHERE Cno=3 ORDER BY Grade DESC;,查询结果:Sno Grade-95001 88 95002 80,三、对查询结果排序输出,例25 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。SELECT*FROM StudentORDER BY Sdept,Sage DESC;,查询结果:Sno SnameSsexSage Sdept-95001 李勇 男 20 CS 95002 刘

28、晨 女 19 IS 95004 张立 男 19 IS 95003 王敏 女 18 MA,四、使用集函数(Aggregate Functions),5类主要集函数:(1)计数COUNT(DISTINCT|ALL*)COUNT(DISTINCT|ALL)(2)计算总和SUM(DISTINCT|ALL)(3)计算平均值AVG(DISTINCT|ALL)(4)求最大值MAX(DISTINCT|ALL)(5)求最小值MIN(DISTINCT|ALL),四、使用集函数(Aggregate Functions),例26 查询学生总人数。SELECT COUNT(*)FROM Student;例27 查询选修

29、了课程的学生人数。SELECT COUNT(DISTINCT Sno)FROM SC;注:用DISTINCT以避免重复计算学生人数例28 查询选修1号课程的学生最高分数。SELECT MAX(Grade)FROM SC WHER Cno=1;,五、对查询结果分组输出,使用GROUP BY子句分组 作用:细化集函数的作用对象 未对查询结果分组,集函数将作用于整个查询结果 对查询结果分组后,集函数将分别作用于每个组 GROUP BY子句的作用对象是查询的中间结果表分组方法:按指定的一列或多列值分组,值相等的为一组使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和集函数,五、

30、对查询结果分组输出,例29 求各个课程号及相应的选课人数。SELECT Cno,COUNT(Sno)FROM SCGROUPBY Cno;,查询结果:Cno COUNT(Sno)1 222 343 444 335 48,五、对查询结果分组输出,例30 查询选修了3门以上课程的学生学号。SELECT SnoFROM SC GROUP BY Sno HAVING COUNT(*)3;例31 查询有3门以上课程是90分以上的学生的学号及(90分以上的)课程数。SELECT Sno,COUNT(*)FROM SC WHERE Grade=90 GROUP BY Sno HAVING COUNT(*)=

31、3;,3.3 查询,3.3.1 概述3.3.2 单表查询3.3.3 连接查询3.3.4 嵌套查询3.3.5 集合查询3.3.6 小结,3.3.3 连接查询,连接查询将两个(以上)表连接进行查询同时涉及多个表的查询连接查询的意义等价于关系代数中的连接、等值连接和自然连接。一、等值与非等值连接查询例32 查询每个学生及其选修课程的情况。SELECT Student.*,SC.*FROM Student,SCWHERE Student.Sno=SC.Sno;/等值连接或SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,GradeFROM Student,SCW

32、HERE Student.Sno=SC.Sno;/自然连接注:WHERE子句中参与比较的两个属性名若在另一表中存在,则要加所属表名作前缀以区别,无同名则可省前缀。,一、等值与非等值连接查询,连接操作的执行过程(1)首先在表1中找到第一个元组,然后从头开始扫描表2,逐一查找满足连接件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。(2)表2全部查找完后,再找表1中第二个元组,然后再从头开始扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第二个元组与该元组拼接起来,形成结果表中一个元组。(3)重复上述操作,直到表1中的全部元组都处理完毕 提高查询效率的方法对表2

33、按连接字段建立索引对表1中的每个元组,依次根据其连接字段值查询表2的索引,从中找到满足条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组,一、等值与非等值连接查询,Student表,SC表,查询结果:,二、自身连接:一个表与其自己进行连接,例33 查询每一门课的间接先修课(即先修课的先修课)。,关系代数表达式:1,7(3=5(C C),二、自身连接:一个表与其自己进行连接,例33 查询每一门课的间接先修课(即先修课的先修课)。SELECT FIRST.Cno,SECOND.CpnoFROM Course FIRST,Course SECONDWHERE FIRST.

34、Cpno=SECOND.Cno;注:(1)一个表与其自己进行连接,称为表的自身连接(2)需要给表起别名以示区别(3)由于所有属性名都是同名属性,因此必须使用别名前缀,三、外连接(Outer Join),Student表,SC表,三、外连接(Outer Join),外连接与普通连接的区别普通连接操作只输出满足连接条件的元组外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出外连接的构建非主体表有一“万能”的虚行,该行全部由空值组成虚行可以和主体表中所有不满足连接条件的元组进行连接由于虚行各列全部是空值,因此与虚行连接的结果中,来自非主体表的属性值全部是空值外连接的类别左外连接在连

35、接条件的左边出现空行()右外连接在连接条件的右边出现空行()左右外连接在连接条件的左右两边出现空行(),三、外连接(Outer Join),例34 查询每个学生及其选修课程的情况(含未选课的学生信息)。SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,GradeFROM Student,SCWHERE Student.Sno=SC.Sno(*);注:在 WHERE子句中的表名后面加外连接操作符(*)指定非主体表,四、复合条件连接,WHERE子句中含多个连接条件例35 查询选修2号课程且成绩在90分以上的所有学生的学号、姓名。SELECT Student.

36、Sno,student.SnameFROM Student,SCWHERE 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 SC.Cno=Course.Cno;,3.3 查询,3.3.1 概述3.3.2 单表查询3.3.3 连接查询3.3.4 嵌套查询3.3.5 集合查询3.3.6 小结,3.3

37、.4 嵌套查询,嵌套查询一个SELECT-FROM-WHERE语句称为一个查询块将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询 SELECT Sname/外层查询/父查询 FROM Student WHERE Sno IN(SELECT Sno/内层查询/子查询 FROM SC WHERE Cno=2);子查询的限制不能使用ORDER BY子句层层嵌套方式反映了SQL语言的结构化有些嵌套查询可以用连接运算替代,一、带有IN谓词的子查询,例37 查询与“刘晨”在同一个系学习的学生。此查询要求可以分步来完成 确定“刘晨”所在系名 SELECT Sdept

38、 FROM Student WHERE Sname=刘晨;查找所有在IS系学习的学生。SELECT Sno,Sname,Sdept FROM Student WHERE Sdept=IS;,一、带有IN谓词的子查询,例37 查询与“刘晨”在同一个系学习的学生。将第一步查询嵌入到第二步查询的条件中,SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN(SELECT Sdept FROM Student WHERE Sname=刘晨);执行过程:(1)先执行子查询,得到结果集IS(2)再执行父查询WHERE Sdept IN IS这种查询称为不相关子

39、查询,即子查询的执行不依赖于父查询的条件。,一、带有IN谓词的子查询,SELECT S1.Sno,S1.Sname,S1.Sdept FROM Student S1,Student S2 WHERE S1.Sdept=S2.Sdept AND S2.Sname=刘晨;,例37 查询与“刘晨”在同一个系学习的学生。用自身连接完成本查询要求,一、带有IN谓词的子查询,例38 查询选修了课程名为“数据库”的学生学号和姓名。,SELECT Sno,SnameFROM StudentWHERE Sno IN,(SELECT Sno FROM SC WHERE Cno,(SELECT Cno FROM C

40、ourse WHERE Cname=数据库);,首先在Course关系中找出“数据库”的课程号;,然后在SC关系中找出选修了该课程的学生学号;,最后在Student关系中取出Sno和Sname。,查询执行过程:,结论:是不相关子查询,一、带有IN谓词的子查询,例38 查询选修了课程名为“数据库”的学生学号和姓名。用连接查询 SELECT Sno,Sname FROM Student,SC,Course WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno AND Course.Cname=数据库;采用不相关子查询的效率要优于连接查询。,二、带有比较运算符

41、的子查询,当能确切知道内层查询返回单值时,可用比较运算符(,=,)。例37 查询与“刘晨”在同一个系学习的学生。假设一个学生只可能在一个系学习,并且必须属于一个系,则在例37可以用=代替IN:SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN(SELECT Sdept FROM Student WHERE Sname=刘晨);,结论:是不相关子查询,二、带有比较运算符的子查询,注:子查询一定要跟在比较符之后!错误的例子:SELECT Sno,Sname,SdeptFROM StudentWHERE(SELECT Sdept FROM Stude

42、nt WHERE Sname=刘晨)=Sdept;原因:数据库中的属性名应当以变量来看待,而子查询返回的是一个数值(单元素的集合)。,三、带有ANY或ALL谓词的子查询,谓词语义:(1)ANY(SOME):某些值(2)ALL:所有值需要配合使用比较运算符 ANY大于子查询结果中的某个值 ALL大于子查询结果中的所有值=ANY大于等于子查询结果中的某个值=ALL大于等于子查询结果中的所有值)ANY不等于子查询结果中的某个值!=(或)ALL不等于子查询结果中的任何一个值,三、带有ANY或ALL谓词的子查询,例39 查询其他系中比信息IS系某些学生年龄小的学生姓名和年龄。SELECT Sname,S

43、ageFROM StudentWHERE Sage IS;/这是父查询块中的条件执行过程1.DBMS执行此查询时,首先处理子查询,找出IS系中所有学生的年龄,构成一个集合(19,18)2.处理父查询,找所有不是IS系且年龄小于19 或 18的学生结论:是不相关子查询,三、带有ANY或ALL谓词的子查询,例39 查询其他系中比信息系某些学生年龄小的学生姓名和年龄。使用集函数来实现,即其他系中比信息系最大年龄小的学生的姓名和年龄。SELECT Sname,Sage FROM Student WHERE Sage IS;结论:是不相关子查询,三、带有ANY或ALL谓词的子查询,例40 查询其他系中比

44、信息系所有学生年龄都小的学生姓名及年龄。方法一:用ALL谓词 SELECT Sname,SageFROM StudentWHERE Sage IS;,三、带有ANY或ALL谓词的子查询,例40 查询其他系中比信息系所有学生年龄都小的学生姓名及年龄。方法二:用集函数 SELECT Sname,SageFROM StudentWHERE Sage IS;,三、带有ANY或ALL谓词的子查询,ANY和ALL谓词与集函数的等价关系:,注:用集函数实现子查询通常比直接用ANY或ALL查询效率要高,因为前者通常能够减少比较次数。,四、带有EXISTS谓词的子查询,EXISTS谓词的意义:是存在量词在SQL

45、中的应用带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。若内层查询结果非空,则返回真值若内层查询结果为空,则返回假值由EXISTS引出的子查询,其目标列表达式通常都用*,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义,四、带有EXISTS谓词的子查询,例41 查询所有选修了1号课程的学生姓名。,此查询可以理解为:输出那些学生的姓名,当在选课表中存在他(她)选修1号课的记录。,SELECT SnameFROM StudentWHERE EXISTS(SELECT*FROM SC WHERE Sno=Student.Sno AND C

46、no=1);,SELECT SnameFROM StudentWHERE EXISTS(SELECT*FROM SC WHERE Sno=Student.Sno AND Cno=1);,此查询的执行过程:(1)首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表;(2)然后再取外层表的下一个元组,重复这一过程,直至外层表全部检查完为止。这种查询称为相关子查询,即子查询的条件与父查询当前值相关。,四、带有EXISTS谓词的子查询,SELECT SnameFROM Student,SCWHERE Student.Sno=SC.S

47、no AND SC.Cno=1;,例41 查询所有选修了1号课程的学生姓名。用连接运算实现:,四、带有EXISTS谓词的子查询,例42 查询没有选修1号课程的学生姓名。此查询可以理解为:输出那些学生的姓名,当在选课表中不存在他(她)选修1号课的记录。SQL语句:SELECT SnameFROM StudentWHERE NOT EXISTS(SELECT*FROM SC WHERE Sno=Student.Sno AND Cno=1);注:此例用连接运算无法实现!此查询为相关子查询。,注:(1)一些带EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换(2)所有带IN谓

48、词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换。例37 查询与“刘晨”在同一个系学习的学生。可以理解为:输出那些学生,当他(她)所在系与“刘晨”所在系相同时。用带EXISTS谓词的子查询替换:SELECT Sno,Sname,SdeptFROM Student S1WHERE EXISTS(SELECT*FROM Student S2 WHERE S2.Sdept=S1.Sdept AND S2.Sname=刘晨;,四、带有EXISTS谓词的子查询,用EXISTS/NOT EXISTS实现全称量词(难点)SQL语言中没有全称量词(For All)可以把带有全

49、称量词的谓词转换为等价的带有存在量词的谓词:(x)P(x(P)例43 查询选修了全部课程的学生姓名。,自然语义:输出这样的学生,不存在某门课程,在他的选课记录里没有选这门课。,四、带有EXISTS谓词的子查询,例43 查询选修了全部课程的学生姓名。,SQL查询语句:SELECT SnameFROM StudentWHERE NOT EXISTS(SELECT*FROM Course WHERE NOT EXISTS(SELECT*FROM SC WHERE Sno=Student.Sno AND Cno=Course.Cno);,例44 查询至少选修学生95002选修的全部课程的学生号码。自然

50、语义:输出这样的学生,不存95002选了的课程,在他的选课记录中没有出现。,SQL查询语句:SELECT DISTINCT SnoFROM SC SCXWHERE NOT EXISTS(SELECT*FROM SC SCY WHERE SCY.Sno=95002 AND NOT EXISTS(SELECT*FROM SC SCZ WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno);,连接查询与嵌套查询小结,连接查询是通过连接条件(连接、等值连接和自然连接)将多个表连接成一张大表,然后从大表中查询出结果集。嵌套查询分为相关子查询和不相关子查询(1)不相关子查询的

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

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号