1、关系数据库基本原理 (2)SQL语言,王传栋 南京邮电大学计算机学院,2,内容与要求,知识点 (1)知识点一:关系模型概述 (2)知识点二:关系数据结构 (3)知识点三:关系代数理论 (4)知识点四:关系数据库标准语言SQL (5)知识点五:关系数据库的规范化理论 实验1 SQL语言的应用 教学基本要求 了解关系数据结构的基本概念,了解关系模型的各种操作和关系代数的基本原理,掌握关系数据模型的完整性约束机制,掌握SQL语言,了解函数依赖等基本概念,掌握关系模式的规范化概念、方法、原理与过程。,3,引言,数据库的应用平台,嵌入式 SQL,交互式SQL,4,引言,SQL是关系数据库的标准语言 对关
2、系模型的发展和商用DBMS的研制起着重要的作用 SQL语言是介乎于关系代数和元组演算之间的一种语言 SQL语言的9个核心词汇 Create, Alter, Drop, Select, Insert, Update, Delete Grant, Revoke 本章详细介绍SQL的核心部分内容 数据定义 数据查询 数据更新 嵌入式SQL,5,SQL简介,SQL发展史 1970年 美国IBM研究中心的E.F.Codd连续发表多篇论文,提出关系模型 1972年 IBM公司开始研制实验型关系数据库管理系统SYSTEM R,配制的查询语言称为SQUARE语言 1974年 把SQUARE修改为SEQUEL语
3、言 1978年, SEQUEL简称为SQL,即“结构式查询语言” SQL的发音仍为“sequel”,现在SQL已经成为一个标准 ,其发音更倾向于发“ess-cue-ell ”,6,SQL简介,SQL发展史 SQL86 1986年10月,ANSI SQL标准 1987年6月,ISO SQL标准 SQL2 1992年8月,ISO SQL标准 SQL3 1999年,ISO SQL标准 在未来很长一段时间,SQL仍将是关系数据库领域的主流语言 在软件工程、人工智能领域,SQL已显示出相当大的潜力,7,SQL简介,SQL数据库的体系结构,8,SQL简介,SQL数据库的体系结构 1)一个SQL模式(Sch
4、ema)是表和约束的集合 2)一个表由行集构成,一行是列的序列 3)表类型:基本表、视图和导出表 4)基本表与存储文件是M:N联系 存储文件与外部存储器的物理文件是一一对应的 5)SQL语句执行对基本表和视图查询等操作 在用户看来,两者是一样的,都是表 6)SQL用户可以是应用程序,也可以是终端用户 注:虽然SQL是国际公认的关系数据库标准,但标准的SQL文档中并没有使用“关系”和“数据库”这两个名词,9,SQL简介,SQL组成 1)数据定义语言,即SQL DDL 用于定义SQL模式、基本表、视图、索引等结构 2)数据操纵语言,即SQL DML 数据查询 数据更新:包括插入、删除和修改三种操作
5、 3)嵌入式SQL语言规则 SQL语句嵌入在宿主语言程序中的规则 4)数据控制语言,即SQL DCL 授权、完整性规则的描述、事务控制等,10,SQL简介,SQL特点 1)灵活和强大的查询功能 SELECT语句能完成相当复杂的查询操作 2)SQL不是一个应用开发语言 只提供对数据库的操作功能,不能完成屏幕控制、菜单管理、报表生成等功能 3)SQL是国际标准语言 有利于各种数据库之间交换数据,有利于程序的移植,有利于实现高度的数据独立性,有利于实现标准化 4)SQL的词汇不多 完成核心功能只用了9个英语动词,它的语法结构接近英语,因此容易学习和使用,11,SQL的数据定义,SQL模式的创建和撤销
6、 注 模式(Schema)一词,来自于“ISO SQL标准”协议 Schema在SQL数据库中相当于一个容器 数据库所有的对象如表、视图、索引、用户、存储过程、触发器等都位于容器内 创建SQL模式,就是定义一个存储空间 在商业DBMS中,大多都使用Database代替Schema,12,SQL的数据定义,SQL模式的创建和撤销 创建 CREATE SCHEMA AUTHORIZATION 撤销 DROP SCHEMA CASCADERESTRICT 方式 CASCADE(级联式) RESTRICT(约束式) 商业DBMS中 CREATE Database DROP Database ,13,S
7、QL的数据定义,常用数据类型 1)数值型:Integer,Smallint,Numeric(p, d) / DEC(p,d) 2)字符串型:Char(n),Varchar(n) 3)位串型:Bit(n),Bit Varying(n) 4)时间型:DATE,TIME 注 在很多DBMS中支持自定义数据类型,如在Oracle中 CREATE DOMAIN AS 列级完整性约束 ; DROP DOMAIN ;,14,SQL的数据定义,常用数据类型 示例:在Oracle中定义数据类型与应用 定义 Create domain COLOR Char(6) Default ?Constraint VALID
8、_COLORSCheck ( value in (Red, Yellow, Green, ? ) ) ; 使用 Create Table PART ( partcolor COLOR , ) ;,15,SQL的数据定义,基本表的创建、修改和撤销 表的创建 句法 CREATE TABLE ( 域完整性约束条件 , 域完整性约束条件 , ) ; 域完整性约束条件 NOT NULL / NULL :列值是否可以为空 UNIQUE :列值唯一,不得重复 DEFAULT :列值空缺时,由系统填写默认值,16,SQL的数据定义,基本表的创建、修改和撤销 表的创建 表级完整性约束条件 主键(PRIMARY
9、KEY)子句 格式:PRIMARY KEY ( ) 作用:提供实体完整性约束的说明 说明 系统一般自动在主键上建索引 主键为单属性时,可直接在属性后的域完整性约束条件中,使用PRIMARY KEY定义主键,17,SQL的数据定义,基本表的创建、修改和撤销 表的创建 表级完整性约束条件 外键(FOREIGN KEY)子句 格式:Foreign key 外键名 ( )references (列名表2) on delete 作用:提供参照完整性约束的说明,18,SQL的数据定义,基本表的创建、修改和撤销 表的创建 表级完整性约束条件 外键(FOREIGN KEY)子句on delete 子句的说明
10、RESTRICT :主表的主键值行不得删除 CASCADE :主表主键值行删除,从表的相关行随之删除 SET NULL :主表主键值行删除,从表的相关行的列值设为NULL,前提是该列的值可以为NULL,19,SQL的数据定义,基本表的创建、修改和撤销 表的创建 表级完整性约束条件 检查(CHECK)子句 格式:CHECK (约束表达式) 作用:对某元组某属性取值的约束说明 说明 表创建后是一个空表,需要使用DML(insert,update,delete)语句装入或维护数据行,20,SQL的数据定义,基本表的创建、修改和撤销 表的创建 示例,21,SQL的数据定义,基本表的创建、修改和撤销 表
11、的创建 示例,22,SQL的数据定义,基本表的创建、修改和撤销 表的创建 示例,23,SQL的数据定义,基本表的创建、修改和撤销 表的创建 问关于表T、S、C、SC的创建顺序,下列选项正确的是? A) C T SC S B) T S C SC C) S T C SC D) S T SC C E) T C S SC F) SC C S T G) SC C T S,24,SQL的数据定义,基本表的创建、修改和撤销 表的修改 句法 ALTER TABLE 增加属性 Alter table add ; 删除属性 Alter table drop cascaderestrict CASCADE:引用该列
12、的视图和约束随之删除 RESTRICT:只在没有被引用时才可删除 不是所有的DBMS都支持,25,SQL的数据定义,基本表的创建、修改和撤销 表的修改 句法 ALTER TABLE 修改属性的类型 Alter table modify modify alter column 其他修改,如 补充定义主键,撤销主键定义 补充定义外键,撤销外键定义 定义和撤销别名,26,SQL的数据定义,基本表的创建、修改和撤销 表的撤销 句法 DROP TABLE cascaderestrict 说明 CASCADE:删除该基本表时,所有引用该基本表的视图和约束一起自动被删除 RESTRICT:没有视图和约束引用
13、该基本表时,才能撤销,27,SQL的数据定义,索引的建立和撤销 索引概念 是物理存取路径,不属于逻辑数据模式 RDBMS通常在主键上自动建立索引 查询、更新时自动起作用(适当建立索引会提高查询速度) 句法 创建索引 CREATE UNIQUE INDEX ON 基表名 ( ASCDESC , ASCDESC ) ; 撤销索引DROP INDEX ;,UNIQUE索引,只能建立在候选键上,28,SQL的数据定义,索引的建立和撤销 示例 Create index Age_Index on S(Age) ; Create unique index Age_Index on S(Age ASC) ;
14、Create unique index SC_Indexon SC(SNO, CNO DESC) ; Drop index Age_Index, SC_Index ; Create index C_Indexon C(TNO DESC,Credit DESC) ;,29,SQL的数据更新,数据插入 句法 1)单元组的插入 INSERT INTO 基本表名 (列名表) VALUES(元组值) 2)多元组的插入:不是所有版本的DBMS都支持 INSERT INTO 基本表名 (列名表)VALUES (元组值), , (元组值) 3)查询结果的插入 INSERT INTO 基本表名 (列名表) 4)
15、表的插入: INSERT INTO 基本表名1 (列名表) TABLE 基本表名2,30,SQL的数据更新,数据插入 说明 若插入的元组值,其属性个数、次序和域,与表结构的定义一致,则列名表可以省略 否则需要列名表,且列名表的属性个数和次序,需与待插入值一一对应 数据插入受关系完整性约束的制约 数据类型 实体完整性:主键值唯一,非空 参照完整性:不允许引用不存在的实体 用户自定义的完整性,31,SQL的数据更新,数据插入 示例 Insert Into S(Sno, Sname, Age, Sex, NativePlace)Values(S5, GU, 20, M, NULL) ; Insert
16、 Into S Values(S5, GU, 20, M, NULL) ; Insert Into S(Sno, Sname, Age, Sex)Values(S5, GU, 20, M) ; Insert Into S(Sname, Sno, Sex, Age)Values(GU, S5, M, 20) ; Insert Into SC(S#, C#) Values(S5, C8); Insert Into SC Values(S5, C8, NULL);,32,数据插入 示例 Insert Into S_Grade(S#, AVG_Grade)Select Sno, AVG(Grade)
17、From SCWhere Sno in (Select Sno From S Where SexM)Group By SnoHaving AVG(Grade)80 ;Insert Into SC(Sno, Cno) TABLE SC4 ;,SQL的数据更新,33,SQL的数据更新,数据插入 示例,问: Insert Into SC Values(S4, C569, 105) ;Insert Into SC Values(S4, C5,105) ;,34,SQL的数据更新,数据插入 示例,问: Insert Into SC Values(S4, C5, 95) ;Insert Into SC V
18、alues(S4, C4, 95) ;如图示4条相关数据的插入顺序是什么?,35,SQL的数据更新,数据删除 句法 DELETE FROM WHERE 条件表达式 语义 是从基本表中删除满足条件表达式的元组 注意 DELETE语句只能从一个基本表中删除元组 WHERE子句中条件可以嵌套,也可以是来自几个基本表的复合条件 如果没有WHERE子句,则删除表的所有元组,表成为空表,36,SQL的数据更新,数据删除 示例 Delete From SC Where Grade is NULL ; Delete From C Where Cname Like %M% ; Delete From SC Wh
19、ere Cno in (Select Cno From C Where Cname = MATHS ) ; Delete From SC, CWhere SC.Cno = C.Cno and Cname = MATHS ; Delete From SC Where Cno = C4 and Grade ( Select AVG(Grade) From SC Where Cno = C4 );,37,SQL的数据更新,数据删除 示例,问 Delete From S Where Sname Like %U% ;,38,SQL的数据更新,数据删除 示例,问 Delete From S Where S
20、name Like %U% ;Delete From SC Where Sno in (Select Sno From SWhere Sname Like %U% );Delete From S Where Sname Like %U% ;,39,SQL的数据更新,数据删除 示例,问 如图示4条相关数据的删除顺序是什么? Drop Table SC 与Delete From SC的区别是什么 TRUNCATE TABLE SC,40,SQL的数据更新,数据删除 当LIU老师不再教授课程时,删除其基本信息 Delete From TWhere Tname = LIUAND Tno Not in
21、( Select TnoFrom C) 当PM课程没人选修时,删除这门课程信息 当WANG同学不再选修课程时,删除其基本信息,41,SQL的数据更新,数据删除 TRUNCATE TABLE 与 DELETE From 功能上相同:均删除表中的全部行 但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少 DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项 TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放,42,SQL的数据更新,数据删除 TRUNCATE TABLE 与 DELETE Fr
22、om TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变;新行标识所用的计数值重置为该列的种子,如果想保留标识计数值,应使用 DELETE 如果要删除表定义及其数据,应使用 DROP TABLE 语句 对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句 由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器 TRUNCATE TABLE 不能用于参与了索引视图的表,43,SQL的数据更新,数据修改 句法 UPDATE SET 列名=值表达式,列名=值表达式
23、ROW = (元组) WHERE 条件表达式 语义 修改基本表中满足条件表达式元组的指定属性值 说明 WHERE子句表示要修改的元组需满足的条件 SET子句表示要修改的列及其新值或元组值 UPDATE语句一次只能修改一个表中的元组,44,SQL的数据更新,数据修改 示例 Update C Set Cname=SE Where Cno=C3 ; Update SC Set Grade = Grade * 1.1Where Sno in (Select Sno From S Where Sex = F ) ; Update SC, S Set Grade = Grade * 1.1Where SC
24、.Sno = S.Snoand Sex = F ;,45,SQL的数据更新,数据修改 示例 Update SC Set Grade = Grade * 1.05Where CnoC4 and Grade (Select AVG(Grade) From SC Where C#C4); Update CSet Row = (C3, SE, 4, 64 , C1, T2 )Where Cno = C3 ;,46,SQL的数据更新,数据修改 示例 Update SC Set Grade = 60Where Grade is NULL ;Update SC Set Grade = Grade + 60W
25、here Grade is NULL ;,47,SQL的数据更新,数据修改 示例 Update SC Set Grade is NULLWhere Grade = 70 and Cno in (Select Cno From C Where Cname = MATH ) ;Update SC Set Grade = NULLWhere Grade = 70 and Cno in (Select Cno From C Where Cname = MATH ) ;,48,SQL的数据更新,数据修改 示例 Update SC Set Grade = Grade * 1.5Where Sno= S2
26、and Cno= C3 ;Update C Set Tno = T3 Where Cno= C3 ;,49,SQL的数据更新,数据修改 示例 Update C Set Cno = C3 Where Cno= C4 ;Delete From SC Where Cno= C4 ; Update C Set Cno = C3 Where Cno= C4 ; Update CSet Cno=NULLWhere Cno= C4 ;,50,SQL的数据查询,SELECT语句的基本结构 句型 SELECT FROM WHERE 只有SELECT和FROM子句是每个SQL查询语句所必需的 语义示例 查询选修了
27、DB课程的学生的姓名,51,SQL的数据查询,SELECT语句的基本结构 示例 SNAME(CNAME=DB AND S.SNO=SC.SNO AND SC.CNO=C.CNO(SSCC) Select Sname From S, SC, CWhere Cname=DBAnd S.Sno=SC.SnoAnd SC.Cno=C.Cno,52,SQL的数据查询,SELECT语句的基本结构 示例 SNAME(CNAME=DB(SSCC)DBMS的优化SNAME(SNO,SNAME(S)SNO(CNO(CNAME=DB(C)SNO,CNO(SC) Select Sname From SWhere Sn
28、o in ( Select Sno From SCWhere Cno in ( Select Cno From CWhere Cname=DB ) ;,53,SQL的数据查询,SELECT语句的基本结构 常见的3种SELECT语句写法 示例:查询选修C2课程的学生学号和姓名 1)连接查询 Select S.Sno, SnameFrom S, SCWhere S.Sno=SC.Sno and Cno=C2 语句的执行步骤 1)笛卡尔积 2)等值连接 2)选择和投影,54,SQL的数据查询,SELECT语句的基本结构 常见的3种SELECT语句写法 示例:查询选修C2课程的学生学号和姓名 2)IN
29、嵌套查询 Select Sno, Sname From S Where Sno in( Select Sno From SC Where Cno=C2 ) ; Select Sno, Sname From S Where C2 in( Select Cno From SC Where Sno=S.Sno ) ; 区别 1)由里到外,内层查询(执行1次)结果供给外层使用 2)依赖于外层值,内层(执行n次)结果供给外层使用,55,SQL的数据查询,SELECT语句的基本结构 常见的3种SELECT语句写法 示例:查询选修C2课程的学生学号和姓名 3)EXISTS嵌套查询 Select Sno, S
30、name From SWhere EXISTS ( Select * From SCWhere Sno=S.Sno and Cno=C2 ) ; 说明 1)3个位置特殊,需注意 2) EXISTS表示“”,判定内层查询结果是否为非空,即至少存在一个元组(满足外查询的条件),56,SQL的数据查询,SELECT语句的完整结构 句型执行过程 读取FROM子句中的数据源,执行笛卡尔积() 选择()满足WHERE子句值的元组 按GROUP BY子句指定的列值,将元组进行分组 在分出的所有组中,选取满足HAVING子句值的组 按SELECT子句的指定项,求值投影()输出 按ORDER BY子句对式的输出
31、进行排序,57,SQL的数据查询,SELECT语句的完整结构 查询中的5个聚合函数,58,SQL的数据查询,SELECT语句的完整结构 应用示例 统计选修课程的人次数 Select COUNT(Sno) as 人次数From SC ;统计选修课程的人数 Select COUNT(Distinct Sno) as 人数From SC ;,59,SQL的数据查询,SELECT语句的完整结构 应用示例 统计男学生的总人数和平均年龄 Select COUNT(*) as 总人数,AVG(Age) as 平均年龄From SWhere Sex = M ; 按性别统计学生的总人数和平均年龄 Select
32、Sex, COUNT(*) as 总人数,AVG(Age) as 平均年龄From SGroup By Sex ;,60,SQL的数据查询,SELECT语句的完整结构 应用示例 统计每门课程的学生选修人数,要求显示课程号、课程名和学生人数 Select C.Cno, Cname, COUNT(Sno) as 学生人数From C, SCWhere C.Cno = SC.CnoGroup By C.Cno, Cname ;,61,SQL的数据查询,SELECT语句的完整结构 应用示例 按教师号统计每位教师每门课程的学生选修人数,要求: 1)仅显示选修人数在3人(=3)以上的信息 2)显示TNO、
33、CNO和选修人数 3)显示时,查询结果按选修人数降序排列,人数相同按TNO升序、 CNO降序排列,62,SQL的数据查询,SELECT语句的完整结构 应用示例 Select Tno, C.Cno, COUNT(Sno) as 选修人数From C, SCWhere C.Cno = SC.CnoGroup By Tno, C.CnoHaving COUNT(*)=3Order By 3 DESC, Tno, C.Cno DESC,63,SQL的数据查询,SELECT语句的完整结构 GROUP BY HAVING 作用 1)数据按GROUP BY子句列名序列中的列值进行分组 2)组内数据按SELE
34、CT子句中的聚合函数进行计算 3)提取满足HAVING子句的条件表达式值的分组 注意 HAVING子句支持聚合函数 WHERE子句不支持聚合函数 SELECT子句只能取聚集函数或GROUP BY子句指的列,64,SQL的数据查询,SELECT语句的完整结构 ORDER BY ASCDESC, ASCDESC 对查询结果按子句中指定列的值排序,如果ORDER BY后有多个列名 先按第一列名值排序 再对于第一列值相同的行,按第二列名值排序 依次类推 列序号是在SELECT子句中出现的序号(选的列是聚集函数或表达式时) ASC表示升序,DESC表示降序,缺省时表示升序,65,SQL的数据查询,SEL
35、ECT语句的完整结构 应用示例 问:在使用聚合函数进行数据统计时,为什么有的语句使用了Group By子句,有的没有? 什么情况下,应该有?可以没有?,66,SQL的数据查询,查询中的限制和规定 Select子句的规定 子句描述查询输出的表格结构,即输出值的列名或表达式 格式 SELECTALLDISTINCT * 释义 AllDistinct,保留消除查询结果中的重复行 * 是对From子句中表的所有列的简写 列表达式 列名、常量、算数运算符、函数、聚合函数,67,SQL的数据查询,查询中的限制和规定 别名 用关键字AS为列、表、表达式起别名,AS可以省略 集合运算 (Select查询1)
36、UNIONALL(Select查询2) (Select查询1) INTERSECTALL(Select查询2) (Select查询1) EXCEPTALL(Select查询2) 备注 并交差运算的前提:相同的关系模式 关键字ALL,表示保留运算后的重复元组,68,SQL的数据查询,查询中的限制和规定 示例 Select NativePlace, Sname, Sex From S ;Select Sno, Sname, Age, Sex, NativePlaceFrom S ; Select * From S ;,69,SQL的数据查询,查询中的限制和规定 示例 Select Sname, Y
37、ear(getdate() Age as BirthYearFrom S AS X ; Select Sname as 姓名, BirthYear : as BIRTH,2011 Age as YEAY, Lower(Sex) as 性别 From S ;说明 函数getdate(), year(), month(), day() 函数upper(), lower(),70,SQL的数据查询,查询中的限制和规定 示例 Select *From SWhere Sex=F Or NativePlace=四川 (Select * From S Where Sex=F)UNION(Select * F
38、rom S Where NativePlace=四川) (Select * From S Where Sex=F)UNION ALL(Select * From S Where NativePlace=四川),71,SQL的数据查询,查询中的限制和规定 示例 Select SnoFrom SC ; Select All SnoFrom SC ; Select Distinct SnoFrom SC ; Select top 5 SnoFrom SC ;,72,SQL的数据查询,条件表达式中的比较操作 构成Where语句的条件运算符,73,SQL的数据查询,条件表达式中的比较操作 算数比较运算
39、查询学号是S3的学生姓名 Select Sname From S Where Sno = S3 ; 查询年龄小于18的学生姓名 Select Sname From S Where Age 18 ; 查询性别为男的学生的姓名、年龄和籍贯 Select Sname, Age, NativePlaceFrom SWhere Sex = M ;,74,SQL的数据查询,条件表达式中的比较操作 区间运算 查询年龄不在17 19岁之间的学生的学号 Select Sno From S Where Age Between 17 and 19 ; Select Sno From S Where Age=17 a
40、nd Age=17 and Age19 ;,75,SQL的数据查询,条件表达式中的比较操作 字符匹配运算 查询籍贯不是上海的学生姓名 Select Sname From S Where NativePlace = 上海 ; Select Sname From SWhere NativePlace Like %上海% ; Select Sname From SWhere NativePlace Like %上%海% ; Select Sname From S Where NativePlace 上海 ; Select Sname From SWhere NativePlace Not Like
41、%上海% ;,76,SQL的数据查询,条件表达式中的比较操作 字符匹配运算 注解 LIKE与通配符“%”和“_” 使用格式:not Like Escape “%” :字符串中所处位置的0n个字符 “_” :字符串中所处位置的 1 个字符 换码字符 查询课程名以“DB_C%A”开头的课程号和学分 Select Cno, Credit From CWhere Cname like DB_C%A% Escape ;,77,SQL的数据查询,条件表达式中的比较操作 空值比较运算 查询未缺考学生的学号和课程号 Select Sno, Cno From SCWhere Grade is Null ; Se
42、lect Sno, Cno From SCWhere Grade is not Null ; 说明,在Where语句中 “is NULL”不能用“= NULL”替换 “is not NULL”不能用“ NULL”替换,78,SQL的数据查询,条件表达式中的比较操作 空值比较运算 查询未缺考过的学生的学号 Select Distinct Sno From SCWhere Grade is Null ; Select Distinct Sno From SCWhere Grade is not Null ; Select Sno From SWhere Sno not in ( Select Sn
43、o From SCWhere Grade is Null ) ;,79,SQL的数据查询,条件表达式中的比较操作 集合成员运算 查询未选修C2或C3课程的学生学号 Select Sno From SCWhere Cno = C2 or Cno = C3 ; Select Sno From SCWhere Cno = (C2, C3) ; Select Sno From SC Where Cno in (C2, C3) ; Select Sno From SC Where Cno =SOME(C2, C3) ; Select Sno From SC Where Cno not in (C2, C
44、3) ; Select Sno From SC Where Cno ALL(C2, C3) ;,80,SQL的数据查询,条件表达式中的比较操作 集合成员运算 查询未选修C2或C3课程的学生学号 Select Sno From SWhere Sno not in (Select Sno from SCWhere Cno in (C2, C3) ) ; Select Sno From SWhere Sno ALL (Select Sno from SCWhere Cno in (C2, C3) ) ;,81,SQL的数据查询,条件表达式中的比较操作 集合成员运算 查询未选修LIU老师所授课程的学生
45、学号 Select Sno From SC, C, TWhere Tname=LIUand SC.Cno=C.Cno and C.TNO=T.Tno ; Select Sno From SC Where Cno in (Select Cno From C Where Tno in (Select Tno From T Where Tname=LIU ) ) ; Select Sno From S Where Sno not in( 选过的学号 ) ;,82,SQL的数据查询,条件表达式中的比较操作 集合成员运算 查询选修了LIU老师所授全部课程的学生姓名 Select Sname From S
46、 Where not Exists (Select * From CWhere Tno in (Select Tno From TWhere Tname=LIU )and not Exists ( Select * From SCWhere Sno=S.Snoand Cno=C.Cno) );,83,SQL的数据查询,条件表达式中的比较操作 集合成员运算 查询至少有一门成绩超过S4一门成绩的学生学号 Select Distinct Sno From SCWhere Grade Some(Select Grade From SCWhere Sno=S4 ) ;,84,SQL的数据查询,条件表达式
47、中的比较操作 集合成员运算 查询平均成绩最高的学生学号 使用导出表 Select S#From ( Select Sno, AVG(Grade)From SC Group By Sno) AS TmpTable(S#, AVG_Grade)Where AVG_Grade = ALL ( Select AVG(Grade)From SCGroup By Sno ) ;,85,SQL的数据查询,条件表达式中的比较操作 集合空否的测试 Select From RWhere NOTEXISTS ( Select * From SWhere S.A=R.A and ) ; 说明 当内层集合非空,返回Tr
48、ue,否则返回False,86,SQL的数据查询,条件表达式中的比较操作 集合中是否有重复元组的判定 查询只选修了一门课的学生的学号和姓名 Select Sno, Sname From SWhere unique( Select Sno From SCWhere Sno=S.Sno ) ; Select S.Sno, SnameFrom S, SCWhere S.Sno=SC.SnoGroup by S.Sno, SnameHaving Count(Cno) = 1 ;,87,SQL的数据查询,嵌套查询的改进写法 导出表 在From子句中使用子查询,子查询必须起别名 命名的导出表只在From中起作用,离开From子句失效 WITH语句和临时视图(SQL Server 2005以上版本) 作用类同于导出表,但语句的逻辑组织比含导出表更清晰 WITH TmpTable(S#, AVG_Grade) ASSelect Sno, AVG(Grade) From SC Group By SnoSelect S# From TmpTableWhere AVG_Grade = ALL ( Select AVG_Grade From TmpTable ) ;,