1、第三章 关系数据库标准语言SQL,An Introduction to Database System,第三章 关系数据库标准语言SQL,3.1 SQL概述 3.2 数据定义 3.3 查询 3.4 数据更新 3.5 视图 3.6 数据控制 3.7 嵌入式SQL 3.8 小结,An Introduction to Database System,3.1 SQL概述,SQL-结构化查询语言的英文简称,是一种通用的、功能极强的、标准的关系数据库语言。 大部分关系数据库系统均采用SQL作为共同的数据库存取语言和标准接口。 SQL由Boyce和Chamberlin于1974年提出,并在IBM的Syste
2、m R上实现。 1987年,ISO通过了SQL标准文本。 SQL标准进程(教材第76页表3.1),An Introduction to Database System,3.1 SQL概述,SQL集数据查询、数据操纵、数据定义和数据控制功能为一体,具有很多特点。 SQL的特点:综合统一高度非过程化面向集合的操作方式以同一种语法结构提供两种使用方法语言简洁,易学易用,An Introduction to Database System,SQL的特点(续),An Introduction to Database System,SQL语言的基本概念,SQL支持三级模式(如图3.1) 外模式视图与部分基
3、本表 模 式基本表 内模式存储文件 基本表和视图都是关系 基本表是独立存在的表,一个关系对应一个表,一个基本表对应一个存储文件 一个表可有多个索引,索引存储在文件中 视图是从基本表导出的表,是一个虚表 存储文件的物理结构是任意的,对用户透明,An Introduction to Database System,第三章 关系数据库标准语言SQL,3.1 SQL概述 3.2 数据定义 3.3 查询 3.4 数据更新 3.5 视图 3.6 数据控制 3.7 嵌入式SQL 3.8 小结,An Introduction to Database System,学生-课程数据库(S-T),逻辑结构:学生表:
4、Student(Sno,Sname,Ssex,Sage、Sdept)课程表:Course(Cno,Cname,Cpno,Ccredit)学生选课表:SC(Sno,Cno,Grade) 关系的主码用下划线表示。由此可以画出Student、Course、SC的二维表。它们都是基本表。(图3.2),An Introduction to Database System,3.2 数 据 定 义,An Introduction to Database System,关系数据库系统支持三级模式结构,其模式、外模式和内模式中的基本对象有模式、表、视图和索引等。SQL的数据定义就包括了模式定义、表定义、视图和索
5、引定义等。,3.2.1 定义语句格式,一、定义基本表CREATE TABLE ( , , ); :所要定义的基本表的名字 :组成该表的各个属性(列) :涉及相应属性列的完整性约束条件 :涉及一个或多个属性列的完整性约束条件 表的定义与有关的约束条件存放在数据字典中,An Introduction to Database System,例题,例1 建立一个“学生”表Student,它由学号Sno、姓名Sname、性别Ssex、年龄Sage、所在系Sdept五个属性组成。其中学号不能为空,值是唯一的,并且姓名取值也唯一。CREATE TABLE Student( Sno CHAR(5) PRIMA
6、RY KEY NOT NULL UNIQUE, Sname CHAR(20) UNIQUE, Ssex CHAR(1) ,Sage INT,Sdept CHAR(15);,An Introduction to Database System,例题,例建立课程表CourseCREATE TABLE Course( Cno CHAR(5) PRIMARY KEY , Cname CHAR(40) NOT NULL, Cpno CHAR(4) ,Ccrdit SMALLINT,FORRIGN KEY(Cpno) REFERENCES Course(Cno);,例题,例建立学生选课表SCCREATE
7、TABLE SC( Sno CHAR(9) , Cno CHAR(4) , Grade SMALLINT,PRIMARY KEY (Sno,Cno),FORRIGN KEY(Sno) REFERENCES Student(Sno),FORRIGN KEY(Cno) REFERENCES Course(Cno);,定义基本表(续),常用完整性约束 主码约束: PRIMARY KEY 唯一性约束:UNIQUE 非空值约束:NOT NULL 表级完整性约束条件(如参照完整性约束)PRIMARY KEY与 UNIQUE的区别?,An Introduction to Database System,数据
8、类型,关系模型中一个很重要的概念是域。每个属性来自一个域,它的取值必须是域中的值。 SQL中域的概念用数据类型实现。 常用的数据类型:教材第83页表3.4 属性选择何种数据类型要视具体情况而定,主要考虑两点: 取值范围 用何种运算,An Introduction to Database System,模式和表,一个DBMS的实例中可以建立多个数据库,一个数据库中可以有多个模式,一个模式下通常包含多个表、视图和索引等数据库对象。 每个基本表都属于某个模式,一个模式包含多个基本表。 先有模式,才有表。 当用户创建基本表时若没有指定模式,系统将自动以默认的方式确定模式。 在数据系统中,定义模式实际上
9、就是定义一个命名空间,在这个空间中可以进一步定义该模式包含的数据库对象。,An Introduction to Database System,二、修改基本表,ALTER TABLE ADD 完整性约束 ADD DROP CONSTRAINT CASCADE | RESTRICT DROP CASCADE | RESTRICT ALTER COLUMN ;,An Introduction to Database System,例题,例2 向Student表增加“入学时间”列,其数据类型为日期型。ALTER TABLE Student ADD Scome DATE;不论基本表中原来是否已有数据,
10、新增加的列一律为空值。,An Introduction to Database System,例题,例3 将年龄的数据类型有字符型改为整型。ALTER TABLE Student ALTER COLUMN Sage INT;注:修改原有的列定义有可能会破坏已有数据,An Introduction to Database System,例题,例 增加课程名称必须取唯一值的约束条件。ALTER TABLE Course ADD UNIQUE(Cname);,An Introduction to Database System,语句格式(续),删除属性列 间接删除 把表中要保留的列及其内容复制到一个
11、新表中 删除原表 再将新表重命名为原表名 直接删除属性列: 例:ALTER TABLE Student Drop Scome;,An Introduction to Database System,例题,例4 删除学生姓名必须取唯一值的约束。ALTER TABLE Student DROP UNIQUE(Sname);,An Introduction to Database System,三、删除基本表,DROP TABLE CASCADE | RESTRICT ; 注意:若无限制(CASCADE),则表中的数据、表上的索引、表上的视图都删除;有限制(RESTRICT)则不能删除。默认情况是有
12、限制的(RESTRICT)。删除基本表时,系统会从数据字典中删去有关该基本表及其索引的描述,An Introduction to Database System,例题,例5 删除Student表DROP TABLE Student ;DROP TABLE Student CASCADE;,An Introduction to Database System,3.2.2 建立与删除索引,建立索引是加快查询速度的有效手段。索引属于内模式范畴。 建立索引 由DBA或表的属主(即建立表的人)根据需要建立 有些DBMS自动建立以下列上的索引PRIMARY KEYUNIQUE 维护索引DBMS自动完成。
13、使用索引DBMS自动选择是否使用索引以及使用哪些索引,An Introduction to Database System,一、建立索引,语句格式 CREATE UNIQUE CLUSTER INDEX ON (, ); 用指定要建索引的基本表名字 索引可以建立在该表的一列或多列上,各列名之间用逗号分隔 用指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASC UNIQUE表明此索引的每一个索引值只对应唯一的数据记录 CLUSTER表示要建立的索引是聚簇索引,An Introduction to Database System,例题,例6 为学生-课程数据库中的Student,Co
14、urse,SC三个表建立索引。其中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);,An Introduction to Database System,建立索引 (续),唯一值索引 对于已含重复值的属性列不能建UNIQUE索引 对某个列建立UNIQUE索引后
15、,插入新记录时DBMS会自动检查新记录在该列上是否取了重复值。这相当于增加了一个UNIQUE约束,An Introduction to Database System,建立索引 (续),聚簇索引 建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存放。也即聚簇索引的索引项顺序与表中记录的物理顺序一致 例: CREATE CLUSTER INDEX Stusname ONStudent(Sname); 在Student表的Sname(姓名)列上建立一个聚簇索引,而 且Student表中的记录将按照Sname值的升序存放,An Introduction to Database Syst
16、em,建立索引 (续),在一个基本表上最多只能建立一个聚簇索引 聚簇索引的用途:对于某些类型的查询,可以提高查询效率 聚簇索引的适用范围很少对基表进行增删操作很少对其中的变长列进行修改操作,An Introduction to Database System,二、删除索引,DROP INDEX ; 删除索引时,系统会从数据字典中删去有关该索引的描述。 例7 删除Student表的Stusname索引。DROP INDEX Stusname;,An Introduction to Database System,3.2.4 数据字典,数据字典是DBMS内部的一组系统表,它记录了数据库中所有的定义
17、信息,包括关系模式定义、表的定义、视图定义、索引定义、完整性约束定义、各类用户对数据库的操作权限、统计信息等。 DBMS在执行SQL的数据定义语句时,实际上就是在更新数据字典表中的相应信息。 在查询优化和查询处理时,数据字典中的信息是其重要的依据。,An Introduction to Database System,3.3 查 询,3.3.1 概述 3.3.2 单表查询 3.3.3 连接查询 3.3.4 嵌套查询 3.3.5 集合查询 3.3.6 小结,An Introduction to Database System,3.3.1 概述,语句格式 SELECT ALL|DISTINCT ,
18、 FROM , WHERE GROUP BY HAVING ORDER BY ASC|DESC ;含义:根据WHERE子句条件从FROM子句指定的基本表、视图或派生表中找出满足条件的元组,再按SELECT子句中的目标列选出元组中的属性值形成结果表。,An Introduction to Database System,语句格式,SELECT子句:指定要显示的属性列 FROM子句:指定查询对象(基本表或视图) WHERE子句:指定查询条件GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。如果GROUP BY子句带HAVING短语,则只有满
19、足指定条件的组才能输出。 HAVING短语:筛选出只有满足指定条件的组 ORDER BY子句:对查询结果表按指定列值的升序或降序排序,An Introduction to Database System,示例数据库,学生-课程数据库 学生表:Student(Sno,Sname,Ssex,Sage,Sdept) 课程表:Course(Cno,Cname,Cpno,Ccredit)学生选课表:SC(Sno,Cno,Grade),An Introduction to Database System,3.3 查 询,3.3.1 概述 3.3.2 单表查询 3.3.3 连接查询 3.3.4 嵌套查询 3
20、.3.5 集合查询 3.3.6 小结,An Introduction to Database System,3.3.2 单表查询,查询仅涉及一个表,是一种最简单的查询操作。通常有如下查询操作: 一、选择表中的若干域(列) 二、选择表中的若干元组(行) 三、对查询结果排序 四、使用聚集函数(分类) 五、对查询结果分组 (分类),An Introduction to Database System,1、查询指定域(列)-投影,例1 查询全体学生的学号与姓名。 SELECT Sno,Sname FROM Student; 例2 查询全体学生的姓名、学号、所在系。 SELECT Sname,Sno,S
21、dept FROM Student; 注:目标列表达式中,各列的先后顺序可以与表中的顺序不一致。用户可以根据应用的需要改变列的显示顺序。,An Introduction to Database System,2、查询全部列,例3 查询全体学生的详细记录。 SELECT Sno,Sname,Ssex,Sage,Sdept FROM Student; 或 SELECT * FROM Student;,An Introduction to Database System,3、 查询经过计算的值,SELECT子句的不仅可以是表中的属性列,也可以是表达式 算术表达式 字符串常量 函数 列别名,An In
22、troduction to Database System,3. 查询经过计算的值,例4 查全体学生的姓名及其出生年份。 SELECT Sname,2005-Sage FROM Student; 输出结果:Sname 2005-Sage- -李勇 1976刘晨 1977王名 1978张立 1978,An Introduction to Database System,不是列名,而是一个计算表达式。,3. 查询经过计算的值,例5 查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。SELECT Sname,Year of Birth: ,2005-Sage,LOWER(Sdept)
23、 FROM Student;,An Introduction to Database System,不是列名,而是一个字符串。,例题(续),输出结果:Sname Year of Birth: 2000-Sage ISLOWER(Sdept)- - - -李勇 Year of Birth: 1976 cs刘晨 Year of Birth: 1977 is王名 Year of Birth: 1978 ma张立 Year of Birth: 1977 is,An Introduction to Database System,例题,使用列别名改变查询结果的列标题 SELECT Sname NAME,
24、Year of Birth: BIRTH,2000-Sage BIRTHDAY,ISLOWER(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,An Introduction to Database System,二、选择表中的若干元组 -选择,消除取值重复的行 查询满足条件的元组,An Intr
25、oduction to Database System,1. 消除取值重复的行,在SELECT子句中使用DISTINCT短语 假设SC表中有下列数据 Sno Cno Grade- - -95001 1 9295001 2 8595001 3 8895002 2 9095002 3 80,An Introduction to Database System,ALL 与 DISTINCT,例6 查询选修了课程的学生学号。 (1) SELECT SnoFROM SC; 或 SELECT ALL SnoFROM SC;结果: Sno - 95001 95001 95001 95002 95002,An
26、 Introduction to Database System,默认 ALL,例题(续),(2) SELECT DISTINCT SnoFROM SC;结果:Sno - 95001 95002,An Introduction to Database System,例题(续),注意:DISTINCT短语的作用范围是所有目标列 例:查询选修课程的各种成绩 错误的写法 SELECT DISTINCT Cno,DISTINCT Grade FROM SC; 正确的写法SELECT DISTINCT Cno,GradeFROM SC;,An Introduction to Database Syste
27、m,2.查询满足条件的元组,WHERE子句常用的查询条件,An Introduction to Database System,(1) 比较大小,在WHERE子句的中使用比较运算符 =,=,!,!= 20;,An Introduction to Database System,(2) 确定范围,使用谓词 BETWEEN AND NOT BETWEEN AND 例10 查询年龄在2023岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23;,An Introduct
28、ion to Database System,例题(续),例11 查询年龄不在2023岁之间的学生姓名、系别和年龄。SELECT Sname,Sdept,Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23;,An Introduction to Database System,(3) 确定集合,使用谓词 IN (值表), NOT IN (值表):用逗号分隔的一组取值 例12查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。 SELECT Sname,Ssex FROM Student WHERE Sdept IN ( I
29、S,MA,CS );,An Introduction to Database System,(3) 确定集合,例13查询既不是信息系、数学系,也不是计算 机科学系的学生的姓名和性别。 SELECT Sname,Ssex FROM StudentWHERE Sdept NOT IN ( IS,MA,CS );,An Introduction to Database System,(4) 字符串匹配,NOT LIKE ESCAPE 含义:查找指定的属性列值与相匹配的元组。 其中: :指定匹配模板匹配模板:固定字符串或含通配符的字符串当匹配模板为固定字符串时,可以用 = 运算符取代 LIKE 谓词用
30、 != 或 运算符取代 NOT LIKE 谓词,An Introduction to Database System,通配符,% (百分号) :代表任意长度(长度可以为0)的字符串 例:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab 等都满足该匹配串_ (下横线) 代表任意单个字符 例:a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串,An Introduction to Database System,ESCAPE 短语:,NOT LIKE ESCAPE 含义:查找指定的属性列值与相匹配的元组。但是 当用户要查询的字符串本身就含
31、有 % 或 _ 时,要使用ESCAPE 短语对通配符进行转义。,An Introduction to Database System,例题,1) 匹配模板为固定字符串 例14 查询学号为95001的学生的详细情况。SELECT * FROM Student WHERE Sno LIKE 95001; 等价于: SELECT * FROM Student WHERE Sno = 95001;,An Introduction to Database System,例题(续),2) 匹配模板为含通配符的字符串例15 查询所有姓刘学生的姓名、学号和性别。SELECT Sname,Sno,SsexFRO
32、M StudentWHERE Sname LIKE 刘%;,An Introduction to Database System,例题(续),匹配模板为含通配符的字符串(续)例16 查询姓“欧阳“且全名为三个汉字的学生的姓名。SELECT SnameFROM StudentWHERE Sname LIKE 欧阳_; 注意:数据库字符集为ASCII时,一个汉字需要两个_ ;当字符集为GBK时只需要一个_ 。,An Introduction to Database System,例题(续),匹配模板为含通配符的字符串(续)例17 查询名字中第2个字为“阳“字的学生的姓名和学号。SELECT Sna
33、me,SnoFROM StudentWHERE Sname LIKE _阳%;,An Introduction to Database System,例题(续),匹配模板为含通配符的字符串(续)例18 查询所有不姓刘的学生姓名。SELECT Sname,Sno,SsexFROM StudentWHERE Sname NOT LIKE 刘%;,An Introduction to Database System,例题(续),3) 使用换码字符将通配符转义为普通字符例19 查询DB_Design课程的课程号和学分。SELECT Cno,CcreditFROM CourseWHERE Cname L
34、IKE DB_Design ESCAPE 说明:ESCAPE后的为换码字符。表示匹配串_中后面的_不是通配符,转义为普通的_字符。,An Introduction to Database System,例题(续),使用换码字符将通配符转义为普通字符(续)例20 查询以“DB_“开头,且倒数第3个字符为 i的课程的详细情况。SELECT *FROM CourseWHERE Cname LIKE DB_%i_ _ ESCAPE ;,An Introduction to Database System,(5) 涉及空值的查询,使用谓词 IS NULL 或 IS NOT NULL“IS NULL” 不
35、能用 “= NULL” 代替 例21 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。SELECT Sno,CnoFROM SCWHERE Grade IS NULL;,An Introduction to Database System,例题(续),例22 查所有有成绩的学生学号和课程号。SELECT Sno,CnoFROM SCWHERE Grade IS NOT NULL;,An Introduction to Database System,(6) 多重条件查询,用逻辑运算符AND和 OR来联结多个查询条件AND的优先级高于OR可
36、以用括号改变优先级 可用来实现多种其他谓词NOT INNOT BETWEEN AND ,An Introduction to Database System,例题,例23 查询计算机系、年龄在20岁以下的学生姓名。SELECT SnameFROM StudentWHERE Sdept= CS AND Sage20;,An Introduction to Database System,改写例12,例12 查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。 SELECT Sname,Ssex FROM Student WHERE Sdept IN ( IS,MA,CS )
37、 可改写为: SELECT Sname,Ssex FROM Student WHERE Sdept= IS OR Sdept= MA OR Sdept= CS ;,An Introduction to Database System,改写例10,例10 查询年龄在2023岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。 SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23;可改写为:SELECT Sname,Sdept,Sage FROM StudentWHERE Sage=20 AND Sage=23;,An
38、 Introduction to Database System,3.3.1 概述,语句格式 SELECT ALL|DISTINCT , FROM , WHERE GROUP BY HAVING ORDER BY ASC|DESC ;含义:根据WHERE子句条件从FROM子句指定的基本表、视图或派生表中找出满足条件的元组,再按SELECT子句中的目标列选出元组中的属性值形成结果表。,An Introduction to Database System,三、对查询结果排序,使用ORDER BY子句可以按一个或多个属性列排序升序:ASC;降序:DESC;缺省值为升序 当排序列含空值时 ASC:排序
39、列为空值的元组最后显示 DESC:排序列为空值的元组最先显示,An Introduction to Database System,对查询结果排序(续),例24 查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。SELECT Sno,GradeFROM SCWHERE Cno= 3 ORDER BY Grade DESC;,An Introduction to Database System,查询结果,Sno Grade- -950109502495007 9295003 8295010 8295009 7595014 6195002 55,An Introduction to
40、Database System,对查询结果排序(续),例25 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。SELECT *FROM StudentORDER BY Sdept,Sage DESC;,An Introduction to Database System,3.3.1 概述,语句格式 SELECT ALL|DISTINCT , FROM , WHERE GROUP BY HAVING ORDER BY ASC|DESC ;含义:根据WHERE子句条件从FROM子句指定的基本表、视图或派生表中找出满足条件的元组,再按SELECT子句中的目标列选出元组
41、中的属性值形成结果表。,An Introduction to Database System,可以使用集函数,可以使用集函数,四、使用集函数,5类主要集函数 计数 COUNT(DISTINCT|ALL *) COUNT(DISTINCT|ALL ) 计算总和 SUM(DISTINCT|ALL ) 计算平均值 AVG(DISTINCT|ALL ),An Introduction to Database System,使用集函数(续),求最大值 MAX(DISTINCT|ALL ) 求最小值 MIN(DISTINCT|ALL ) DISTINCT短语:在计算时要取消指定列中的重复值 ALL短语:不
42、取消重复值 ALL为缺省值,An Introduction to Database System,使用集函数 (续),例26 查询学生总人数。SELECT COUNT(*)FROM Student;例27 查询选修了课程的学生人数。SELECT COUNT(DISTINCT Sno)FROM SC; 注:用DISTINCT以避免重复计算学生人数,An Introduction to Database System,使用集函数 (续),例28 计算1号课程的学生平均成绩。SELECT AVG(Grade)FROM SCWHERE Cno= 1 ;例29 查询选修1号课程的学生最高分数。SELEC
43、T MAX(Grade)FROM SCWHER Cno= 1 ;,An Introduction to Database System,使用集函数 (续),例3.45 查询学号为201215012的学生选修课程的总学分数。SELECT SUM(Ccredit)FROM SC, CourseWHERE SC.Sno= 201215012 AND SC.Cno=Course.Cno;注意:(1)当聚集函数遇到空值时,除COUNT(*)外,都跳过空值而只处理非空值。COUNT(*)是对元组进行计数,某个元组的一个或部分列取空值不影响COUNT的统计结果。(2)WHERE子句中是不能使用聚集函数作为条
44、件表达式的。聚集函数只能用于SELECT子句和GROUP BY子句中的HAVING子句。,An Introduction to Database System,3.3.1 概述,语句格式 SELECT ALL|DISTINCT , FROM , WHERE GROUP BY HAVING ORDER BY ASC|DESC ;含义:根据WHERE子句条件从FROM子句指定的基本表、视图或派生表中找出满足条件的元组,再按SELECT子句中的目标列选出元组中的属性值形成结果表。,An Introduction to Database System,五、对查询结果分组,GROUP BY子句将查询结果
45、按某一列或多列的值分组,值相等的为一组。 若分组后还要求按一定的条件对这些组进行筛选,最终只输出满足指定条件的组,则可以使用HAVING短语指定筛选条件。 分组的目的:细化集函数的作用对象若未对查询结果分组,集函数将作用于整个查询结果若对查询结果分组,集函数将分别作用于每个组,即每一组都有一个函数值。,An Introduction to Database System,使用GROUP BY子句分组,例30 求各个课程号及相应的选课人数。SELECT Cno,COUNT(Sno)FROM SCGROUP BY Cno; 结果Cno COUNT(Sno)1 222 343 444 335 48,
46、An Introduction to Database System,对查询结果分组 (续),GROUP BY子句的作用对象是查询的中间结果表 分组方法:按指定的一列或多列值分组,值相等的为一组 使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和集函数,An Introduction to Database System,使用HAVING短语筛选最终输出结果,例31 查询选修了3门以上课程的学生学号。SELECT SnoFROM SCGROUP BY SnoHAVING COUNT(*) 3;,An Introduction to Database System,例题,
47、例32 查询有3门及以上课程是90分以上的学生的学号及(90分以上的)课程数SELECT Sno, COUNT(*)FROM SCWHERE Grade=90GROUP BY SnoHAVING COUNT(*)=3;,An Introduction to Database System,使用HAVING短语筛选最终输出结果,只有满足HAVING短语指定条件的组才输出。 HAVING短语与WHERE子句的区别:作用对象不同 WHERE子句作用于基表或视图,从中选择满足条件的元组。不能用聚集函数作为条件表达式。 HAVING短语作用于组,从中选择满足条件的组。可以用聚集函数作为条件表达式。,An Introduction to Database System,3.3 查 询,3.3.1 概述 3.3.2 单表查询 3.3.3 连接查询 3.3.4 嵌套查询 3.3.5 集合查询 3.3.6 小结,