1、第五章第五章 关系数据库标准语关系数据库标准语言言SQLSQL本章教学目标、重点和难点本章教学目标、重点和难点 1.1.本章教学目标:本章教学目标:使学生了解SQL的功能和语言特点;熟练掌握用SQL进行表的定义、数据查询和数据更新,掌握SQL的数据控制方法。2.2.教学重点:教学重点:SQL的数据定义、数据查询、数据维护和数据控制表示方法 3.3.教学难点:教学难点:用SQL实现嵌套查询、组合查询、使用分组和SQL函数查询。本章内容1.1.SQLSQL的功能及特点的功能及特点2.2.数据定义语句数据定义语句3.3.数据查询语句数据查询语句4.4.数据更新语句数据更新语句5.5.嵌入式嵌入式SQ
2、LSQL6.6.数据控制机制和语句数据控制机制和语句SQLSQL的功能及特点的功能及特点19741975-19791986-198719921999由由Boyce和和Chamberlin提出提出IBM公司研制了关系公司研制了关系DBMS原型,原型,并实现该语言并实现该语言美国批准美国批准SQL作为美国标准,作为美国标准,随后随后ISO也通过这一标准也通过这一标准公布了公布了SQL-92标准标准公布了公布了SQL-99,也称作,也称作SQL3SQLSQL的功能及特点的功能及特点数据定义数据定义数据控制数据控制数据操纵数据操纵SQL语句分类语句分类SQLSQL的功能及特点的功能及特点SQL语句分类
3、语句分类数据定义数据定义数据操纵数据操纵数据控制数据控制定义关系数据库的模式、外模式和内模式,以实现对基本表、定义关系数据库的模式、外模式和内模式,以实现对基本表、视图以及索引文件的定义、修改和删除等操作。视图以及索引文件的定义、修改和删除等操作。包括数据查询和数据更新两种数据操作语句:包括数据查询和数据更新两种数据操作语句:数据查询指对数据库中的数据查询、统计、分组、排序操作;数据查询指对数据库中的数据查询、统计、分组、排序操作;数据更新指数据的插入、删除、修改等数据维护操作。数据更新指数据的插入、删除、修改等数据维护操作。通过对数据库用户的授权和收权命令来实现有关数据的存通过对数据库用户的
4、授权和收权命令来实现有关数据的存取控制,以保证数据库的安全性。取控制,以保证数据库的安全性。SQLSQL的功能及特点的功能及特点SQL的特点的特点1)SQL具有自主式语言和嵌入式语言两种使用方式;2)SQL具有语言简洁、易学易用的特点;SQL功能命令动词数据定义(数据模式定义、删除、修改)Create、Drop、Alter数据操纵(数据查询和维护)Select、Insert、Update、Delete数据控制(数据存取控制权和收权)Grant、RemoveSQLSQL的功能及特点的功能及特点SQL的特点的特点3)SQL支持三级模式结构存储文件1存储文件2基本表1基本表2基本表3基本表4视图1视
5、图2SQL外模式外模式模式模式内模式内模式数据定义语句数据定义语句操作对象操作对象创建语句创建语句删除语句删除语句修改语句修改语句基本表Create tableDrop tableAlter table索引Create indexDrop index视图Create viewDrop view数据库Create databaseDrop databaseAlter database1.1.语句格式约定符号语句格式约定符号尖括号尖括号中括号大括号或分隔符|,n实际语义实际语义任选项必选项,必选其中一项前面的项可重复多次数据定义语句数据定义语句2.2.一般语法规定一般语法规定SQL中的数据项(包括
6、列项、表和视图)分隔符为“,”,其字符串常数的定界符用单引号“”表示3.SQL3.SQL特殊语法规定特殊语法规定SQL的关键词一般使用大写字母表示;语句的结束符为“;”语句一般应采用格式化书写方式数据定义语句数据定义语句基本表的定义和维护基本表的定义和维护1.1.基本表的定义基本表的定义定义基本表语句的一般格式为:定义基本表语句的一般格式为:CREATE TABLE CREATE TABLE 库名库名 表名表名(列名列名数据类型数据类型 列级完整性约束条件列级完整性约束条件 ,列名列名数据类型数据类型 列级完整性约束条件列级完整性约束条件 ,nn ,表级完整性约束条件表级完整性约束条件 ,n)
7、n);数据定义语句数据定义语句建立基本表:建立基本表:学生学生(学号,姓名,年龄,性别,所在系学号,姓名,年龄,性别,所在系);课程课程(课程号,课程名,先行课课程号,课程名,先行课);选课选课(学号,课程号,成绩学号,课程号,成绩).).CREATE TABLE CREATE TABLE 课程课程(课程号课程号 CHAR(5)CHAR(5)PRIMARY KEYPRIMARY KEY,课程名课程名 CHAR(20)CHAR(20),先行课先行课 CHAR(5)CHAR(5);数据定义语句数据定义语句(1 1)SQLSQL支持的数据类型支持的数据类型类型表示类型表示类型说明类型说明数值型数据S
8、MALLINT半字长二进制证书,15bit数据INTEGER或INT全字长(4字长)整数,31bit数据DECIMAL(p,q)十进制数,共p位,其中小数点后q位,0qp,q=0时可省略不写FLOAT双字长浮点数字符型数据CHARTER(n)或CHAR(n)长度为n的定长图形字符串VARCHAR(n)最大长度为n的变长字符串特殊数据类型GRAPHIC(n)长度为n的定长图形字符串VARGRAPHIC(n)最大长度为n的变长图形字符串日期时间型DATE日期型,格式为YYYY-MM-DDTIME时间型,格式为HH.MM.SSTIMESTAMP日期加时间数据定义语句数据定义语句(2 2)列级完整性的
9、约束条件)列级完整性的约束条件1)NOT NULL或NULL约束NOT NULL约束不允许字段值为空而NULL约束允许字段值为空。2)UNIQUE约束UNIQUE约束是惟一性约束,即不允许列中出现重复的属性值。3)DEFAULT约束DEFAULT为默认值约束。DEFAULTDEFAULT约束名约束名默认值默认值FORFOR列名列名4)CHECK约束CHECK为检查约束。CONSTRAINTCONSTRAINT约束名约束名CHECKCHECK(约束条件表达式约束条件表达式)数据定义语句数据定义语句建立基本表:建立基本表:学生学生(学号,姓名,年龄,性别,所在系学号,姓名,年龄,性别,所在系);课
10、程课程(课程号,课程名,先行课课程号,课程名,先行课);选课选课(学号,课程号,成绩学号,课程号,成绩).).CREATE TABLE 学生学生(学号学号 CHAR(5)NOT NULL UNIQUE,姓名姓名 CHAR(8)NOT NULL,年龄年龄 SMALLINT,性别性别 CHAR(2),所在系所在系 CHAR(20),DEFAULT C1 20 FOR 年龄,年龄,CONSTRAINT C2 CHECK(性别性别 IN(男男,女女);数据定义语句数据定义语句(3 3)表级完整性的约束条件)表级完整性的约束条件1)UNIQUE约束UNIQUE约束是惟一性约束,当要求列祖的值不能有重复值
11、时,使用UNIQUE约束定义。2)PRIMARY KEY约束定义主码,保证惟一性和非空性。CONTRAINTCONTRAINT约束名约束名PRIMARYPRIMARY KEY CLUSTERED KEY CLUSTERED (列组列组)3)FOREIGN KEY约束用于定义参照完整性。CONTRAINTCONTRAINT约束名约束名FOREIGNFOREIGN KEY(KEY(外码外码)REFERENCESREFERENCES被参照表名被参照表名(与外码对应的主码名与外码对应的主码名)数据定义语句数据定义语句建立基本表:建立基本表:学生学生(学号,姓名,年龄,性别,所在系学号,姓名,年龄,性别
12、,所在系);课程课程(课程号,课程名,先行课课程号,课程名,先行课);选课选课(学号,课程号,成绩学号,课程号,成绩).).CREATE TABLE CREATE TABLE 选课选课(学号学号 CHAR(5)CHAR(5),课程号课程号 CHAR(5)CHAR(5),成绩成绩 SMALLINTSMALLINT,CONSTRAINT C3 CHECK(CONSTRAINT C3 CHECK(成绩成绩 BETWEEN 0 AND 100)BETWEEN 0 AND 100),CONSTRAINT C4 PRIMARY KEY(CONSTRAINT C4 PRIMARY KEY(学号,课程号学号,
13、课程号),CONSTRAINT C5 FOREIGN KEY(CONSTRAINT C5 FOREIGN KEY(学号学号)REFERENCES)REFERENCES 学生学生(学号学号),CONSTRAINT C6 FOREIGN KEY(CONSTRAINT C6 FOREIGN KEY(课程号课程号)REFERENCES)REFERENCES 课程课程(课程号课程号);数据定义语句数据定义语句2.2.修改基本表修改基本表ALTER TABLEALTER TABLE表名表名 ADD(ADD(新列名新列名数据类型数据类型 完整性约束完整性约束 ,n)n)DROP DROP完整性约束名完整性约
14、束名 MODIFY(MODIFY(列名列名数据类型数据类型,n)n);(1)(1)使用使用ADDADD子句增加新列子句增加新列【例5-2】向课程表中增加“学时”字段。ALTER TABLE 课程 ADD 学时 SMALLINT;(2)(2)使用使用MODIFYMODIFY子句修改列的原定义:子句修改列的原定义:MODIFYMODIFY子句主要用于加宽原列的子句主要用于加宽原列的宽度宽度(3)(3)使用使用DROPDROP子句删除指定的完整性约束条件子句删除指定的完整性约束条件【例5-3】删除学生表中对年龄的默认值的定义。ALTER TABLE 学生 DROP C1;数据定义语句数据定义语句3.
15、3.删除基本表删除基本表删除基本表的一般格式为:删除基本表的一般格式为:DROP DROP TABLETABLE表名表名;数据定义语句数据定义语句索引的定义和维护索引的定义和维护1.1.索引的作用索引的作用1)使用索引可以明显地加快数据查询的速度;使用索引可以明显地加快数据查询的速度;先将索引文件读入内存,根据索引项找到元组的地址,然后再根据先将索引文件读入内存,根据索引项找到元组的地址,然后再根据地址将元组数据直接读入计算机。地址将元组数据直接读入计算机。由于索引文件中只含有索引项和元组地址,所以文件小,一般可一由于索引文件中只含有索引项和元组地址,所以文件小,一般可一次读入内存次读入内存索
16、引文件中的索引项是经过排序的,可以很快地找到索引项值和元索引文件中的索引项是经过排序的,可以很快地找到索引项值和元组地址组地址数据定义语句数据定义语句索引的定义和维护索引的定义和维护1.1.索引的作用索引的作用1)使用索引可以明显地加快数据查询的速度;使用索引可以明显地加快数据查询的速度;2)使用索引可保证数据的惟一性;使用索引可保证数据的惟一性;3)使用索引可以加快连接速度。使用索引可以加快连接速度。2.2.建立索引的原则建立索引的原则1)索引的建立和维护由索引的建立和维护由DBA和和DBMS完成;完成;2)大表应当建索引,小表则不必建索引;大表应当建索引,小表则不必建索引;3)对于一个基本
17、表,不要建立过多的索引;对于一个基本表,不要建立过多的索引;4)根据查询要求建索引。根据查询要求建索引。数据定义语句数据定义语句3.3.建立索引的格式建立索引的格式建立格式为:CREATE UNIQUE CLUSTER INDEX索引名 ON表名(列名次序,列名次序);1)1)是要建索引的基本表的名字;是要建索引的基本表的名字;2)2)每个每个 后面还可以用后面还可以用 指定索引值的排列次序,次序可选指定索引值的排列次序,次序可选ASCASC(升序)或(升序)或DESCDESC(降序),默认值为(降序),默认值为ASCASC;3)3)UNIQUEUNIQUE表示该索引的每一个索引值只对应唯一的
18、数据记录;表示该索引的每一个索引值只对应唯一的数据记录;4)4)CLUSTERCLUSTER表示要建立的索引是聚簇索引,使基本表中数据的物理顺序表示要建立的索引是聚簇索引,使基本表中数据的物理顺序与索引项的排列顺序一致。与索引项的排列顺序一致。数据定义语句数据定义语句3.3.建立索引的格式建立索引的格式 【例5-4】为学生_课程数据库中的学生、课程和选课三个表建立索引。其中,学生表按学号升序建立索引;课程表按课程号升序建惟一索引;选课表按学号升序和课程号降序建惟一索引。CREATE UNIQUE INDEX 学号 ON 学生(学号);CREATE UNIQUE INDEX 课程号 ON 课程(
19、课程号);CREATE UNIQUE INDEX 选课号 ON 选课(学号 ASC,课程号 DESC);数据定义语句数据定义语句4.4.删除索引删除索引删除索引格式为:DROP INDEX 索引名;例:删除学生表的学生姓名索引DROP INDEX 学生姓名数据定义语句数据定义语句视图的定义和维护视图的定义和维护1.1.视图的优点视图的优点视图是根据子模式设计的关系,由一个或几个基本表导出的虚表。1)1)视图能够简化用户的操作;视图能够简化用户的操作;视图机制可以减少用户对数据库中数据结构的调整操作,使用户将注视图机制可以减少用户对数据库中数据结构的调整操作,使用户将注意力集中在所关心的数据上。
20、意力集中在所关心的数据上。2 2)视图机制可以使用户以不同的方式看待同一数据;)视图机制可以使用户以不同的方式看待同一数据;当多用户共享同一个数据库的数据时,通过视图机制可以实现各个用当多用户共享同一个数据库的数据时,通过视图机制可以实现各个用户对数据的不同使用要求。户对数据的不同使用要求。3 3)视图可以对机密的数据提供安全保护)视图可以对机密的数据提供安全保护数据定义语句数据定义语句1.1.视图的优点视图的优点4 4)视图对数据库的重构提供了一定程度的逻辑独立性;)视图对数据库的重构提供了一定程度的逻辑独立性;在关系数据库中,数据库的重构往往是不可避免的。但由于视图机制,在关系数据库中,数
21、据库的重构往往是不可避免的。但由于视图机制,将为应用程序提供了原来使用的关系,保持外模式。将为应用程序提供了原来使用的关系,保持外模式。原表:学生(学号,姓名,性别,年龄,所在系)分成:SX(学号,姓名,年龄)SY(学号,性别,所在系)CREATE VIEW 学生(学号,姓名,性别,年龄,所在系)AS SELECT SX.学号,SX.姓名,SX.性别,SY.年龄,SY.所在系FROM SX,SYWHERE SX.学号=SY.学号;数据定义语句数据定义语句2.2.视图定义的格式视图定义的格式一般格式为:一般格式为:CREATE VIEWCREATE VIEW视图名视图名(列名组列名组)AS AS
22、子查询子查询 WITH CHECK OPTION WITH CHECK OPTION;(1 1)WITH CHECK OPTIONWITH CHECK OPTION选项选项 表示在对视图进行UPDATE、INSERT和DELETE操作时,要保证操作的数据满足视图定义中的谓词条件。该谓词条件是视图子查询中的WHERE子句的条件。数据定义语句数据定义语句2.2.视图定义的格式视图定义的格式一般格式为:一般格式为:CREATE VIEWCREATE VIEW视图名视图名(列名组列名组)AS AS子查询子查询 WITH CHECK OPTION WITH CHECK OPTION;(2 2)组成视图的
23、属性列名全部省略或者全部指定)组成视图的属性列名全部省略或者全部指定 若省略了视图的各个属性列名,则由子查询中的SELECT子句的目标列代替 必须明确指定列名的情况某个目标列是集函数或列表达式;子查询中使用多个表(或视图),并且目标列中含有相同的属性名;需要在视图中改用新的、更合适的列名。数据定义语句数据定义语句2.2.视图定义的格式视图定义的格式【例5-6】建立计算机系学生的视图。CREATE VIEW 计算机系学生 AS SELECT SELECT 学号,姓名,年龄学号,姓名,年龄 FROM 学生 WHERE 所在系=计算机系;数据定义语句数据定义语句2.2.视图定义的格式视图定义的格式【
24、例5-7】由学生、课程和选课三个表,定义一个计算机系的学生成绩视图,其属性包括学号、姓名、课程名和成绩CREATE VIEW CREATE VIEW 学生成绩学生成绩(学号,姓名,课程名,成绩学号,姓名,课程名,成绩)AS SELECT AS SELECT 学生学生.学号,学生学号,学生.姓名,课程姓名,课程.课程名,选课课程名,选课.成绩成绩 FORM FORM 学生,课程,选课学生,课程,选课 WHERE WHERE 学生学生.学号学号=选课选课.学号学号 AND AND 程程.课程名课程名=选课选课.课程号课程号 AND AND 学生学生.所在系所在系=计算机系计算机系;数据定义语句数据
25、定义语句2.2.视图定义的格式视图定义的格式【例5-8】将学生的学号、总成绩、平均成绩定义成一个视图。CREATE CREATE VIEW VIEW 学生学生成绩统计成绩统计(学号学号,总成绩,平均成绩,总成绩,平均成绩)AS SELECT AS SELECT 学学号号,SUMSUM(成绩),(成绩),AVGAVG(成绩)(成绩)FORM FORM 选课选课 GROUP BY GROUP BY 学号;学号;3.3.视图的删除视图的删除 DROP VIEW DROP VIEW 数据定义语句数据定义语句4.4.视图的查询和维护视图的查询和维护视图可以和基本表一样被查询,其使用方法与基本表相同,但利
26、用视图进行数据增、删、改操作,会受到一定的限制。一般的数据库系统不支持对下列几种情况的视图进行数据更新操作。1)由两个以上基本表导出的视图2)视图的字段来自字段表达式函数3)视图中有分组子句或使用了DISTINCT短语4)视图定义中有嵌套查询,且内层查询中涉及了与外层一样的导出该视图的基本表5)在一个不允许更新的视图上定义的视图数据查询语句数据查询语句数据查询的基本语法数据查询的基本语法1.SELECT1.SELECT语句的语法语句的语法SELECT目标列组目标列组 FROM数据源数据源 WHERE元组选择条件元组选择条件 GROUP BY分列组分列组HAVING 组选择条件组选择条件 ORD
27、ER BY排序列排序列1排序要求排序要求1,n;数据查询语句数据查询语句1.SELECT1.SELECT语句的语法语句的语法(1)(1)SELECTSELECT子句:子句:指明目标列(字段、表达式、函数表达式、常量)。基指明目标列(字段、表达式、函数表达式、常量)。基本表中相同的列名表示为:本表中相同的列名表示为:表名表名.列名列名(2)(2)FROMFROM子句:子句:指明数据源。表间用指明数据源。表间用“,”分割。数据源不在当前数据库分割。数据源不在当前数据库中,使用中,使用“数据库名数据库名.表名表名”表示。一表多用,用别名标识。表示。一表多用,用别名标识。定义表别名:定义表别名:表名表
28、名.别名别名(3)(3)WHEREWHERE子句:子句:元组选择条件元组选择条件。数据查询语句数据查询语句1.SELECT1.SELECT语句的语法语句的语法学生课程库结构为:学生学生课程库结构为:学生(学号,姓名,年龄,所在系学号,姓名,年龄,所在系);课程课程(课程号,课程名,先行课课程号,课程名,先行课);选课选课(学号,课程号,成绩学号,课程号,成绩).).【例5-9】求数学系学生的学号和姓名。SELECT 学号,姓名 FROM 学生 WHERE 所在系=数学系;【例5-10】求选修了课程的学生学号。SELECT DISTINCT 学号 FROM 选课;数据查询语句数据查询语句1.SE
29、LECT1.SELECT语句的语法语句的语法(4)GROUP BY(4)GROUP BY子句:子句:结果集分组。当目标列中有统计函数,则统结果集分组。当目标列中有统计函数,则统计为分组统计,否则为对整个结果集统计。子句后带上计为分组统计,否则为对整个结果集统计。子句后带上HAVINGHAVING子句表达组选择条件(带函数的表达式)。子句表达组选择条件(带函数的表达式)。(5)ORDER BY(5)ORDER BY子句:子句:排序。当排序要求为排序。当排序要求为ASCASC时升序排序;排序时升序排序;排序要求为要求为DESCDESC时降序排列。时降序排列。【例5-11】求选修C1课程的学生学号和
30、成绩,并要求对查询结果按成绩的降序排列,如果成绩相同则按学号的升序排列。SELECT 学号,成绩 FROM 选课 WHERE 课程号=C1 ORDER BY 成绩 DESC,学号 ASC;数据查询语句数据查询语句2.SELECT2.SELECT语句的操作符语句的操作符(1)(1)算术操作符算术操作符+(加号)、(减号)、*(乘号)和/(除号)。(2)(2)比较操作符比较操作符=(等于)、(大于)、(小于)、=(大于等于)、!=(不等于)、(小于大于)、!(不大于)和!ANY ANY(数据表(数据表|子查询)子查询)全部全部(每个每个)ALLALL字段字段比较符比较符ALL ALL(数据表(数据
31、表|子查询)子查询)例:例:字段字段 ALL ALL(数据表(数据表|子查询)子查询)不不 存在存在EXISTSEXISTSEXISTS(EXISTS(子查询子查询)在在 不在不在 范围范围NOT BETWEENANDNOT BETWEENAND字段字段NOT BETWEEN NOT BETWEEN 小值小值 AND AND 大值大值是是 不是不是 空值空值IS NOT NULLIS NOT NULL字段字段 IS NOT NULL IS NOT NULL模式比较模式比较NOT LIKENOT LIKE字段字段 NOT LIKE NOT LIKE 字符常数字符常数 其中,其中,“_”_”单字符
32、通配符和单字符通配符和“%”%”多字符通配符多字符通配符与运算与运算ANDAND条件条件1 1ANDAND条件条件2 2或运算或运算OROR条件条件1 1OROR条件条件2 2非运算非运算NOTNOTNOTNOT条件条件数据查询语句数据查询语句(4)(4)组合查询操作符组合查询操作符SQLSQL的组合查询操作符是针对传统关系运算的操作符,包括的组合查询操作符是针对传统关系运算的操作符,包括UNIONUNION(并(并查询)、查询)、MINUSMINUS(差查询)和(差查询)和INTERSECTINTERSECT(交查询)(交查询)其格式为:其格式为:21)UNION:并查询,并在结果集中去掉重
33、复行。2)MINUS:差查询操作。3)INTERSECT:交查询操作。4)*:取全部字段。格式为:格式为:*或或表名表名.*5)ALL:全部。保留重复值(有统计函数时要求计算重复值)。格式为:格式为:ALLALL字段或字段或 ALLALL字段组字段组6)DISTINCT:去掉重复值。在结果集中去掉重复值,或在统计函数中不计重复值。格式为:格式为:DISTINCTDISTINCT字段或字段或 DISTINCTDISTINCT字段组字段组数据查询语句数据查询语句【例5-12】求选修课程C1且成绩在8090之间的学生学号和成绩,并将成绩乘以系数0.8输出。SELECT SELECT 学号,学号,成绩
34、成绩*0.80.8 FROM FROM 选课选课 WHERE WHERE 课程号课程号 =C1=C1 ANDAND 成绩成绩 BETWEENBETWEEN 80 80 ANDAND 90 90;【例5-13】求数学系或计算机系姓张的学生的信息。SELECT SELECT*FROM FROM 学生学生 WHERE WHERE 所在系所在系 ININ(数学系数学系,计算机系计算机系 )AND)AND 姓名姓名 LIKELIKE 张张%;1.1.简单查询实例简单查询实例数据查询语句数据查询语句【例5-14】求缺少了成绩的学生的学号和课程号。SELECT SELECT 学号,课程号学号,课程号 FRO
35、M FROM 选课选课 WHERE WHERE 成绩成绩 IS NULLIS NULL;数据查询语句数据查询语句2.2.连接查询实例连接查询实例连接查询中的连接条件通过WHERE子句表达,连接条件和元组选择条件之间用AND(与)操作符衔接(1)(1)等值连接和非等值连接等值连接和非等值连接 表名表名1 1.列名列名1 1比较运算符比较运算符 表名表名2 2.列名列名2 2比较运算符:比较运算符:=、=、=9090;数据查询语句数据查询语句(2)(2)自身连接操作自身连接操作例如,课程表中的先行课是在上学期应开设的,先行课的先行课,即间接先行课应提前一学年开设。如果求查询某门课的间接先行课或全部
36、课程的间接先行课,就需要对课程表进行自身连接。课程号课程号课程名课程名先行课先行课C1C1计算机引论计算机引论C2C2PASCALPASCAL语言语言C1C1C3C3数据结构数据结构C2C2C4C4数据库数据库C3C3C5C5软件工程软件工程C4C4课程的先行关系链为:课程的先行关系链为:C5C4C3C2C1C5C4C3C2C1,课程的间接关系链为:课程的间接关系链为:C5C3C1C5C3C1。数据查询语句数据查询语句(2)(2)自身连接操作自身连接操作课程号课程名先行课课程号课程名先行课C1计算机引论C1计算机引论C2Pascal语言C1C2Pascal语言C1C3数据结构C2C3数据结构C
37、2C4数据库C3C4数据库C3C5软件工程C4C5软件工程C4数据查询语句数据查询语句(2)(2)自身连接操作自身连接操作A.课程号A.课程名B.先行课C2Pascal语言C3数据结构C1C4数据库C2C5软件工程C3数据查询语句数据查询语句(3)(3)外部连接操作外部连接操作 左外部连接操作是在结果集中保留连接表达式左表中的非匹配记录;右外部连接操作是在结果集中保留连接表达式右表中的非匹配记录。外部连接符号为“*=”,右外部连接符号为“=*”。外部连接中不匹配的分量用NULL表示。职工号职工号姓名姓名性别性别年龄年龄所在部门所在部门部门号部门号部门名称部门名称电话电话10101010李勇李勇
38、男男202011111111生产科生产科56656610111011刘晨刘晨女女19191212计划科计划科57857810121012王敏王敏女女222212121313一车间一车间46746710141014张立张立男男212113131414科研所科研所数据查询语句数据查询语句(3)(3)外部连接操作外部连接操作职工号职工号姓名姓名性别性别年龄年龄所在部门所在部门部门名称部门名称电话电话10101010李勇李勇男男20201111生产科生产科56656610121012王敏王敏女女22221212计划科计划科57857810141014张立张立男男21211313一车间一车间467467
39、内连接的结果集数据查询语句数据查询语句(3)(3)外部连接操作外部连接操作左连接的结果集职工号职工号姓名姓名性别性别年龄年龄所在部门所在部门部门名称部门名称电话电话10101010李勇李勇男男20201111生产科生产科56656610111011刘晨刘晨女女191910121012王敏王敏女女22221212计划科计划科57857810141014张立张立男男21211313一车间一车间467467数据查询语句数据查询语句(3)(3)外部连接操作外部连接操作右连接的结果集职工号职工号姓名姓名性别性别年龄年龄所在部门所在部门部门名称部门名称电话电话10101010李勇李勇男男20201111生
40、产科生产科56656610121012王敏王敏女女22221212计划科计划科57857810141014张立张立男男21211313一车间一车间467467科研所科研所数据查询语句数据查询语句(3)(3)外部连接操作外部连接操作【例5-19】用SQL表达职工和部门之间的内连接、左外部连接和右外部连接的语句内连接:内连接:SELECT SELECT 职工职工.*,部门名称,电话,部门名称,电话 FROM FROM 职工,部门职工,部门 WHERE WHERE 职工职工.所在部门所在部门=部门部门.部门号;部门号;左外部连接:左外部连接:SELECT SELECT 职工职工.*,部门名称,电话,
41、部门名称,电话 FROM FROM 职工,部门职工,部门 WHERE WHERE 职工职工.所在部门所在部门*=部门部门.部门号;部门号;右外部连接:右外部连接:SELECT SELECT 职工职工.*,部门名称,电话,部门名称,电话 FROM FROM 职工,部门职工,部门 WHERE WHERE 职工职工.所在部门所在部门 =*部门部门.部门号;部门号;数据查询语句数据查询语句3.3.嵌套查询嵌套查询在SQL语言中,一个SELECTFROMWHERE语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。(1)(1)使用使用ININ操
42、作符的嵌套查询操作符的嵌套查询【例5-20】求选修了高等数学的学生学号和姓名。SELECT SELECT 学号,姓名学号,姓名 FROM FROM 学生学生 WHERE WHERE 学号学号 IN(SELECT IN(SELECT 学号学号 FROM FROM 选课选课 WHERE WHERE 课程号课程号 IN(SELECT IN(SELECT 课程号课程号 FROM FROM 课程课程 WHERE WHERE 课程名课程名=高等数学高等数学);数据查询语句数据查询语句3.3.嵌套查询嵌套查询在SQL语言中,一个SELECTFROMWHERE语句称为一个查询块。将一个查询块嵌套在另一个查询块
43、的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。(1)(1)使用使用ININ操作符的嵌套查询操作符的嵌套查询【例5-20】求选修了高等数学的学生学号和姓名。该题也可以使用下面的连接查询表达。该题也可以使用下面的连接查询表达。SELECT SELECT 学生学生.学号,姓名学号,姓名 FROM FROM 学生,课程,选课学生,课程,选课 WHERE WHERE 学生学生.学号学号=课程课程.学号学号 AND AND 课程课程.课程号课程号=选课选课.课程号课程号 AND AND 课程课程.课程名课程名=高等数学高等数学;数据查询语句数据查询语句3.3.嵌套查询嵌套查询(2)(2)使
44、用比较符的使用比较符的嵌套查询嵌套查询【例5-21】求C1课程的成绩高于张三的学生学号和成绩。SELECT SELECT 学号,成绩学号,成绩 FROM FROM 选课选课 WHERE WHERE 课程号课程号=C1 AND=C1 AND 成绩成绩 (SELEC (SELEC 成绩成绩 FROM FROM 选课选课 WHERE WHERE 课程号课程号=C1AND=C1AND 学号学号=(SELECT (SELECT 学号学号 FROM FROM 学生学生 WHERE WHERE 姓名姓名=张三张三);数据查询语句数据查询语句(3)(3)使用使用ANYANY或或ALLALL操作符的嵌套查询操作
45、符的嵌套查询其格式为:其格式为:ANY|ALL ANY|ALL 操作符语意ANY大于子查询结果中的某个值,即表示大于查询结果中最小值ALL大于子查询结果中的所有值,即表示大于查询结果中最大值ANY小于子查询结果中的某个值,即表示小于查询结果中最大值=ANY大于等于子查询结果中的某个值,即表示大于等于结果集中最小值=ALL大于等于子查询结果中的所有值,即表示大于等于结果集中最大值数据查询语句数据查询语句(3)(3)使用使用ANYANY或或ALLALL操作符的嵌套查询操作符的嵌套查询其格式为:其格式为:ANY|ALL ANY|ALL 操作符语意=ANY小于等于子查询结果中的某个值,即表示小于等于结
46、果集中最大值=ALL小于等于子查询结果中的所有值,即表示小于等于结果集中最小值=ANY等于子查询结果中的某个值,即相当于IN=ALL等于子查询结果中的所有值(通常没有实际意义)!=(或)ANY不等于子查询结果中的某个值,!=(或)ALL不等于子查询结果中的任何一个值,即相当于NOT IN数据查询语句数据查询语句(3)(3)使用使用ANYANY或或ALLALL操作符的嵌套查询操作符的嵌套查询其格式为:其格式为:ANY|ALL ANY|ALL 【例5-22】求其他系中比计算机系某一学生年龄小的学生。SELECT SELECT*FROM FROM 学生学生 WHERE WHERE 年龄年龄 ANY(
47、SELECT ANY(SELECT 年龄年龄 FROM FROM 学生学生 WHERE WHERE 所在系所在系=计算机系计算机系 )AND)AND 所在系所在系计算机系计算机系;数据查询语句数据查询语句(3)(3)使用使用ANYANY或或ALLALL操作符的嵌套查询操作符的嵌套查询其格式为:其格式为:ANY|ALL ANY|ALL 【例5-23】求其他系中比计算机系学生年龄都小的学生。SELECT SELECT*FROM FROM 学生学生 WHERE WHERE 年龄年龄 ALL(SELECT ALL(SELECT 年龄年龄 FROM FROM 学生学生 WHERE WHERE 所在系所在
48、系=计算机系计算机系)AND)AND 所在系所在系 计算计算机系机系;数据查询语句数据查询语句(4)(4)使用使用EXISTSEXISTS操作符的嵌套查询操作符的嵌套查询【例5-24】求选修了C2课程的学生姓名。SELECT SELECT 姓名姓名 FROM FROM 学生学生 WHERE EXISTS(SELECT WHERE EXISTS(SELECT*FROM FROM 选课选课 WHERE WHERE 学生学生.学号学号=学号学号 AND AND 课程号课程号=C2)=C2);Select 姓名From 学生,选课Where 学生.学号=选课.学号 and 课程号=c2数据查询语句数据
49、查询语句(4)(4)使用使用EXISTSEXISTS操作符的嵌套查询操作符的嵌套查询【例5-25】求没有选修C2课程的学生姓名。SELECT SELECT 姓名姓名 FROM FROM 学生学生 WHERE NOT EXISTS(SELECT WHERE NOT EXISTS(SELECT*FROM FROM 选课选课 WHERE WHERE 学生学生.学号学号=学号学号 AND AND 课程号课程号=C2)=C2);不能不能写写成以下:成以下:Select 姓名From 学生,选课Where 学生.学号=选课.学号 and 课程号c2数据查询语句数据查询语句(4)(4)使用使用EXISTSE
50、XISTS操作符的嵌套查询操作符的嵌套查询【例5-26】查询选修了全部课程的学生的姓名。SELECT SELECT 姓名姓名 FROM FROM 学生学生 WHERE NOT EXISTS(SELECT WHERE NOT EXISTS(SELECT*FROM FROM 课程课程 WHERE NOT EXISTSWHERE NOT EXISTS (SELECT (SELECT*FROM FROM 选课选课 WHERE WHERE 学生学生.学号学号=学号学号 ANDAND 课程课程.课程号课程号=课程课程号号);由于由于SQLSQL没有全称量词的操作符,该题转换为查询这样的学生:没有全称量词的