第3章_关系数据库标准语言SQL_第1页
第3章_关系数据库标准语言SQL_第2页
第3章_关系数据库标准语言SQL_第3页
第3章_关系数据库标准语言SQL_第4页
第3章_关系数据库标准语言SQL_第5页
已阅读5页,还剩152页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第三章关系数据库标准语言第三章关系数据库标准语言SQLSQL 3.1 SQL 概述概述3.2 数据查询数据查询3.3 数据定义数据定义3.4 数据更新数据更新3.5 存取控制存取控制3.6 空值的处理空值的处理3.7 小结小结3.1 SQL 概述概述一、一、SQL的产生和发展的产生和发展SQL的最早版本是由的最早版本是由IBM开发的。开发的。SQL语言的前身是语言的前身是1972年提出的年提出的SQUARE(Specifying Queries As Relational Expression)语言,在语言,在1974年修改为年修改为SEQUEL(Structured English Quer

2、y Language),简称),简称SQL。1986年年10月美国国家标准局(月美国国家标准局(American National Standard Institute,简称,简称ANSI)的数据库)的数据库委员会委员会X3H2批准了批准了SQL作为关系数据库语言的美国作为关系数据库语言的美国标准。同年公布了标准。同年公布了SQL标准文本(简称标准文本(简称SQL-86)。)。 3.1 SQL 概述概述一、一、SQL的产生和发展的产生和发展1987年国际标准化组织(年国际标准化组织(International Organization for Standardization,简称,简称ISO)

3、也通过了)也通过了SQL-86标准。标准。ANSI于于1989年公布了年公布了SQL-89标准。标准。1992年公布了年公布了SQL-92标准(标准(SQL2)。)。1999年公布了年公布了SQL-1999标准(标准(SQL3)。)。2003年公布了年公布了SQL-2003标准(标准(SQL4)。)。3.1 SQL 概述概述二、二、SQL的组成的组成1、操作对象、操作对象表和视图是表和视图是SQL的操作对象。的操作对象。表就是关系模型中的关系。表有表名、表就是关系模型中的关系。表有表名、表结构(关系模式)和数据三部分组成。表结构(关系模式)和数据三部分组成。表的名字和结构存储在表的名字和结构存

4、储在DBMS的数据字典的数据字典中,表中的数据保存在数据库中。中,表中的数据保存在数据库中。视图是一个特殊的表,基本上可以把它视图是一个特殊的表,基本上可以把它当作表使用。当作表使用。3.1 SQL 概述概述二、二、SQL的组成的组成2、操作分类、操作分类SQL语言包括了对数据库的所有操作,在功能上可以语言包括了对数据库的所有操作,在功能上可以分为以下四个部分:分为以下四个部分:(1)数据定义语言()数据定义语言(Data Definition Language,DDL)(2)数据操纵语言()数据操纵语言(Data Manipulation Lauguage, DML)(3)数据控制()数据控

5、制(Data Control Language,DCL)(4)嵌入式)嵌入式SQL和动态和动态SQL(Embeded SQL and Dynamic SQL )3.1 SQL 概述概述三、三、SQL的特点的特点1、综合统一、综合统一2、高度非过程化、高度非过程化3、面向集合的操作方式、面向集合的操作方式4、以同一种语法结构提供两种使用方式、以同一种语法结构提供两种使用方式5、语言简捷,易学易用、语言简捷,易学易用3.1 SQL 概述概述SQL语言的动词语言的动词SQL 功能 动 词 数 据 查 询 SELECT 数 据 定 义 CREATE,DROP,ALTER 数 据 操 纵 INSERT,

6、UPDATE,DELETE 数 据 控 制 GRANT,REVOkE 3.2 数据查询数据查询数据查询是数据库的核心操作。 SELECT语句的格式为:SELECT ALL|DISTINCT 别名 , 别名 FROM 别名 , 别名 WHERE GROUP BY HAVING ORDER BY ASC|DESC, ASC|DESC;3.2 数据查询数据查询3.2.1 单表查询单表查询一、一、SELECT语句语句SELECT子句是关系代数中的投影运算,子句是关系代数中的投影运算,用来选择表中的全部列或部分列。用来选择表中的全部列或部分列。1、查询指定列、查询指定列在很多情况下,用户只对表中的一部分

7、在很多情况下,用户只对表中的一部分列感兴趣,这时可以通过在列感兴趣,这时可以通过在SELECT子句子句的的中指定要查询的列。中指定要查询的列。3.2 数据查询数据查询3.2.1 单表查询单表查询SnoSname2000012 王林 2000113 张大民 2000256 顾芳 2000278姜凡 2000014 葛波 例例1 查询全体学生的学查询全体学生的学号与姓名。号与姓名。SELECT Sno, SnameFROM Student;3.2 数据查询数据查询3.2.1 单表查询单表查询2. 查询全部列查询全部列查询的是要显示表的所有内容,关键是查询的是要显示表的所有内容,关键是如何在如何在S

8、ELECT子句中指定表中所有的列。子句中指定表中所有的列。一种方法是用枚举的方法给出所有的列名,一种方法是用枚举的方法给出所有的列名,前提是要知道表的关系模式,另一种方法前提是要知道表的关系模式,另一种方法是用符号是用符号*代表所有的列。代表所有的列。3.2 数据查询数据查询3.2.1 单表查询单表查询例例2 查询所有课程的详细记录。方法一:SELECT Cno, Cname, Cpno, CcreditFROM Course;方法二:SELECT *FROM Course; 3.2 数据查询数据查询3.2.1 单表查询单表查询3. 查询经过计算的值例例3 查全体学生的姓名及其出生年份。SEL

9、ECT Sname, 2001 - Sage FROM Student;Sname 2001 - Sage王林 1982 张大民 1983顾芳 1982姜凡 1982葛波 19833.2 数据查询数据查询3.2.1 单表查询单表查询将列名将列名2001 Sage重重命名为命名为BirthYear,SQL语句为:语句为:SELECT Sname,2001 - Sage AS BirthYearFROM Student;Sname BirthYear王林 1982 张大民 1983顾芳 1982姜凡 1982葛波 19833.2 数据查询数据查询3.2.1 单表查询单表查询4、过滤掉重复元组例例

10、4 列出表Student中所有的系。SELECT SdeptFROM Student;Sdept计算机 管理 管理 管理 计算机 3.2 数据查询数据查询3.2.1 单表查询单表查询用以下的语句去掉重复的元组:SELECT Distinct SdeptFROM Student;Sdept计算机 管理 3.2 数据查询数据查询3.2.1 单表查询单表查询二、二、WHERE子句子句查 询 条 件 谓 词 比 较 =,=,=, 确定范围BETWEEN AND,NOT BETWEEN AND 确定集合IN,NOT IN 字符匹配LIKE,NOT LIKE 空 值IS NULL,IS NOT NULL

11、逻辑运算符 AND,OR,NOT 常用的运算符常用的运算符3.2 数据查询数据查询3.2.1 单表查询单表查询1、比较大小、比较大小比较运算符包括:=(等于),(大于),=(大于等于),=(小于等于),!= 或 (不等于)。用比较运算符构成的选择条件的形式是:列名 运算符 常数列名 运算符 列名常数 运算符 列名 3.2 数据查询数据查询3.2.1 单表查询单表查询例例5 查询计算机系学生的详细信息。SELECT *FROM StudentWHERE Sdept = 计算机计算机;3.2 数据查询数据查询3.2.1 单表查询单表查询例例6 查询所有年龄在查询所有年龄在19岁以下的学生的姓岁以下

12、的学生的姓名和年龄。名和年龄。SELECT Sname, Sage FROM StudentWHERE Sage 19;3.2 数据查询数据查询3.2.1 单表查询单表查询2、确定范围、确定范围谓词谓词BETWEENAND用于查找列值在用于查找列值在指定范围内的元组,其中指定范围内的元组,其中BETWEEN后是后是范围的下限(即低值),范围的下限(即低值),AND后是范围的后是范围的上限(即高值),格式为:上限(即高值),格式为:列名列名 BETWEENAND3.2 数据查询数据查询3.2.1 单表查询单表查询例例7 查询年龄在查询年龄在1820岁(包括岁(包括18岁和岁和20岁)之间的学生的

13、姓名、系别和年龄。岁)之间的学生的姓名、系别和年龄。SELECT Sname, Sdept, SageFROM StudentWHERE Sage BETWEEN 18 AND 20;3.2 数据查询数据查询3.2.1 单表查询单表查询3、确定集合、确定集合谓词谓词IN用来查找某个列值属于指定集合的元用来查找某个列值属于指定集合的元组,格式为:组,格式为:列名列名 IN 集合集合如果一个元组在指定列上的值出现在集合中,如果一个元组在指定列上的值出现在集合中,则该元组满足选择条件,出现在选择操作的结果则该元组满足选择条件,出现在选择操作的结果中。在中。在SQL中,将集合中的元素放在左括号中,将集

14、合中的元素放在左括号“(”和右括号和右括号“)”中,元素之间用逗号中,元素之间用逗号“,”分隔。分隔。3.2 数据查询数据查询3.2.1 单表查询单表查询例例8 查询计算机系和管理系的学生的姓名查询计算机系和管理系的学生的姓名和年龄。和年龄。计算机系和管理系构成的集合表示为:计算机系和管理系构成的集合表示为:( 计算机计算机, 管理管理 )SELECT Sname, SageFROM StudentWHERE Sdept IN ( 计算机计算机, 管理管理 );3.2 数据查询数据查询3.2.1 单表查询单表查询4、字符串匹配、字符串匹配谓词谓词LIKE可以用来进行字符串的匹配。可以用来进行字

15、符串的匹配。其一般语法格式如下:其一般语法格式如下:列名列名 LIKE ESCAPE 其含义是查找列值与其含义是查找列值与相匹配的相匹配的元组。元组。 3.2 数据查询数据查询3.2.1 单表查询单表查询一般情况下,一般情况下,有通配符有通配符 % 和和 _ 。其。其中:中: % (百分号百分号) 代表任意长度(长度可以为代表任意长度(长度可以为0)的字符串。例如的字符串。例如a%b表示以表示以a开头,以开头,以b结尾的任结尾的任意长度的字符串。字符串意长度的字符串。字符串acb,addgb,ab 等都等都满足该匹配串。满足该匹配串。_ (下横线下横线) 代表任意单个字符。例如代表任意单个字符

16、。例如a_b表示表示以以a开头,以开头,以b结尾的长度为结尾的长度为3的任意字符串。如的任意字符串。如acb,afb等都满足该匹配串。等都满足该匹配串。3.2 数据查询数据查询3.2.1 单表查询单表查询例例9 查询所有姓王的学生的姓名、学号和查询所有姓王的学生的姓名、学号和性别。性别。SELECT Sname, Sno, SsexFROM StudentWHERE Sname LIKE 王王%;3.2 数据查询数据查询3.2.1 单表查询单表查询例例10 查询课程号以查询课程号以113开头的课程编号和开头的课程编号和课程名称。课程名称。SELECT Cno, CnameFROM Course

17、WHERE Cno LIKE 113_;3.2 数据查询数据查询3.2.1 单表查询单表查询例例11 查询查询DB_Design课程的课程号和学分。课程的课程号和学分。SELECT Cno, CcreditFROM CourseWHERE Cname LIKE DB_Design ESCAPE ;ESCAPE 短语表示短语表示 为换码字符,这样匹为换码字符,这样匹配串中紧跟在配串中紧跟在 后面的字符后面的字符“_”不再具有通配符不再具有通配符的含义,转义为普通的的含义,转义为普通的“_”字符。字符。3.2 数据查询数据查询3.2.1 单表查询单表查询5、空值的判断、空值的判断谓词谓词IS NU

18、LL用于判断某列的值是否为用于判断某列的值是否为空值,格式如下:空值,格式如下:列名列名 IS NULL如果某个元组在指定列上的值为空值,如果某个元组在指定列上的值为空值,则这个元组满足则这个元组满足IS NULL条件,它出现在条件,它出现在选择操作的结果中。选择操作的结果中。3.2 数据查询数据查询3.2.1 单表查询单表查询例例12查询缺少成绩的学生的学号和相应的查询缺少成绩的学生的学号和相应的课程号。课程号。SELECT Sno, CnoFROM SCWHERE Grade IS NULL;注意:这里的注意:这里的IS NULL不能用等号不能用等号 = NULL代替。代替。3.2 数据查

19、询数据查询3.2.1 单表查询单表查询6、逻辑运算、逻辑运算逻辑运算符逻辑运算符AND和和OR可用来联结多个可用来联结多个查询条件。查询条件。AND的优先级高于的优先级高于OR,可以用,可以用括号改变优先级。括号改变优先级。3.2 数据查询数据查询3.2.1 单表查询单表查询例例13 查询年龄在查询年龄在19岁以下的计算机系的岁以下的计算机系的学生的姓名。学生的姓名。SELECT SnameFROM StudentWHERE Sdept= 计算机计算机 AND Sage 19;3.2 数据查询数据查询3.2.1 单表查询单表查询例例14 查询计算机系和管理系的学生的姓查询计算机系和管理系的学生

20、的姓名。名。SELECT SnameFROM StudentWHERE Sdept= 计算机计算机 OR Sdept= 管理管理;3.2 数据查询数据查询3.2.1 单表查询单表查询例例15 查询不是计算机系和管理系的所有查询不是计算机系和管理系的所有学生的姓名。学生的姓名。SELECT SnameFROM StudentWHERE NOT (Sdept= 计算机计算机 OR Sdept= 管理管理);3.2 数据查询数据查询3.2.1 单表查询单表查询例例16 查询年龄不在查询年龄不在1820岁之间的学生的岁之间的学生的姓名、系别和年龄。姓名、系别和年龄。 SELECT Sname, Sde

21、pt, SageFROM StudentWHERE NOT Sage BETWEEN 18 AND 20;3.2 数据查询数据查询3.2.1 单表查询单表查询三、三、ORDER BY 语句语句由由SELECT-FROM-WHERE子句构成的子句构成的SELECT语句完成对表的选择和投影操作,得到语句完成对表的选择和投影操作,得到一个新表,还可以对得到的新表做进一步的操作。一个新表,还可以对得到的新表做进一步的操作。ORDER BY子句对查询结果进行排序。可以子句对查询结果进行排序。可以按照一个或多个属性列的升序(按照一个或多个属性列的升序(ASC)或降序)或降序(DESC)排列,默认情况下按升

22、序排序。)排列,默认情况下按升序排序。3.2 数据查询数据查询3.2.1 单表查询单表查询例例17 查询选修了课程号为查询选修了课程号为1156学生的学学生的学号及其成绩,查询结果按成绩的降序排列。号及其成绩,查询结果按成绩的降序排列。SELECT Sno, GradeFROM SCWHERE Cno= 1156ORDER BY Grade DESC;3.2 数据查询数据查询3.2.1 单表查询单表查询例例18 查询全体学生的详细信息,查询结查询全体学生的详细信息,查询结果先按照系名升序排列,同一系中的学生果先按照系名升序排列,同一系中的学生再按年龄降序排列。再按年龄降序排列。SELECT *

23、FROM StudentORDER BY Sdept, Sage DESC;3.2 数据查询数据查询3.2.1 单表查询单表查询四、聚集函数四、聚集函数SQL提供了若干聚集函数。提供了若干聚集函数。COUNT(DISTINCT|ALL * ) 统计元组个数统计元组个数COUNT(DISTINCT|ALL )统计一列中值的个数)统计一列中值的个数SUM(DISTINCT|ALL ) 计算一列值的总和计算一列值的总和(此列必须是数值型)(此列必须是数值型)AVG(DISTINCT|ALL )计算一列值的平均值)计算一列值的平均值(此列必须是数值型)(此列必须是数值型)MAX(DISTINCT|AL

24、L )求一列值中的最大值)求一列值中的最大值MIN(DISTINCT|ALL ) 求一列值中的最小值求一列值中的最小值3.2 数据查询数据查询3.2.1 单表查询单表查询例例19 查询学生总人数。查询学生总人数。学生人数即表学生人数即表Student中元组的个数,使用中元组的个数,使用count(*)函数,函数,SQL语句为:语句为:SELECT COUNT(*)FROM Student;3.2 数据查询数据查询3.2.1 单表查询单表查询例例20 查询选修了课程号查询选修了课程号1156或者或者1136的的学生总人数。学生总人数。SELECT COUNT(DISTINCT Sno)FROM

25、SCWHERE Cno= 1156 OR Cno= 1136;3.2 数据查询数据查询3.2.1 单表查询单表查询例例21 求出所有学生的平均年龄。求出所有学生的平均年龄。SELECT AVG(Sage)FROM Student;例例22 查询选修查询选修1156号课程的学生最高分数。号课程的学生最高分数。SELECT MAX(Grade)FROM SCWHERE Cno= 1156;3.2 数据查询数据查询3.2.1 单表查询单表查询五、五、GROUP BY子句子句SQL提供了对查询结果进行分组的功能。分提供了对查询结果进行分组的功能。分组后聚集函数将作用于每一个组,即每一组都有组后聚集函数

26、将作用于每一个组,即每一组都有一个函数值。一个函数值。SQL用用GROUP BY子句实现分组功能,格式子句实现分组功能,格式为:为:GROUP BY 列名表描述了分组特征,同一组的元组在这列名表描述了分组特征,同一组的元组在这些列上的值一定相同。列名表又叫做分组列。些列上的值一定相同。列名表又叫做分组列。 3.2 数据查询数据查询3.2.1 单表查询单表查询例例23 统计每门课程的选课人数。统计每门课程的选课人数。表表SC中记录了选修课程信息。要统计每门课中记录了选修课程信息。要统计每门课程的选修人数,需要先按照列程的选修人数,需要先按照列Cno进行分组,然后,进行分组,然后,计算每组中的元组

27、个数。计算每组中的元组个数。SQL语句为:语句为:SELECT Cno, COUNT(*)FROM SCGROUP BY Cno;CnoCOUNT(*)102421136211373115643.2 数据查询数据查询3.2.1 单表查询单表查询例例24 统计各个学院男生和女生的人数。统计各个学院男生和女生的人数。按照题意,首先要按照按照题意,首先要按照Sdept对学生进行分对学生进行分组,然后,再对每个分组按照组,然后,再对每个分组按照Ssex分组。分组。SQL语句为:语句为:SELECT Sdept, Ssex, COUNT(*)FROM StudentGROUP BY Sdept, Sse

28、x;3.2 数据查询数据查询3.2.1 单表查询单表查询六、六、HAVING子句子句对分组进行选择操作由对分组进行选择操作由HAVING子句完成。子句完成。AVING子句作用于执行子句作用于执行SELECT-FROM-WHERE-GROUP BY后得到的分组,从中选择满后得到的分组,从中选择满足条件的分组。足条件的分组。HAVING子句的格式同子句的格式同WHERE子句,但其条子句,但其条件表达式是由分组列、聚集函数和常数构成的有件表达式是由分组列、聚集函数和常数构成的有意义的式子。意义的式子。HAVING 3.2 数据查询数据查询3.2.1 单表查询单表查询例例25 求选课人数超过求选课人数

29、超过2人的课程编号和具人的课程编号和具体的选课人数。体的选课人数。SELECT Cno, COUNT(*) FROM SCGROUP BY CnoHAVING COUNT(*) 2;3.2 数据查询数据查询3.2.1 单表查询单表查询例例26 求选课人数超过求选课人数超过2人并且课程编号中人并且课程编号中包含字符包含字符7的课程编号和具体的选课人数。的课程编号和具体的选课人数。SELECT Cno, COUNT(*) FROM SCGROUP BY CnoHAVING Cno LIKE %7% AND COUNT(*) 2;3.2 数据查询数据查询3.2.1 单表查询单表查询七、注释七、注释和

30、其它语言一样,SQL语言中也有注释,SQL语言的注释是一个以两个减号开始,以回车换行为结束的字符串。下面的SQL语句中有两处注释。-查询计算机系学生的详细信息查询计算机系学生的详细信息SELECT * FROM StudentWHERE Sdept = 计算机 -选择条件选择条件3.2 数据查询数据查询3.2.2 多表查询多表查询多表查询涉及到多个表,在多表查询涉及到多个表,在FROM子句子句中出现多个表。从概念上讲,中出现多个表。从概念上讲,FROM子句子句先对这些表做笛卡尔积操作,得到一个临先对这些表做笛卡尔积操作,得到一个临时表,以后的选择、投影等操作都是针对时表,以后的选择、投影等操作

31、都是针对这个临时表,从而将多表查询转换为单表这个临时表,从而将多表查询转换为单表查询。查询。3.2 数据查询数据查询3.2.2 多表查询多表查询一、笛卡尔积一、笛卡尔积笛卡尔积是关系代数的集合运算之一。将两个表的元笛卡尔积是关系代数的集合运算之一。将两个表的元组两两首尾相连就得到笛卡尔积的一个元组。假设两个表组两两首尾相连就得到笛卡尔积的一个元组。假设两个表分别有分别有m和和n个元组,则笛卡尔积有个元组,则笛卡尔积有mn个元组。具有以个元组。具有以下特点:下特点:笛卡尔积的输入是两个表(表笛卡尔积的输入是两个表(表1、表、表2),输出是一个),输出是一个新表。新表。新表的列是表新表的列是表1或

32、表或表2中的某一列,二者的名字也一样。中的某一列,二者的名字也一样。新表的列数是两个表列数之和。新表的列数是两个表列数之和。表表1的一个元组和表的一个元组和表2的一个元组首尾相连形成了新表的一个元组首尾相连形成了新表的一个元组的一个元组3.2 数据查询数据查询3.2.2 多表查询多表查询例例1 求表Student和表SC的笛卡尔积。SELECT * FROM Student, SC;3.2 数据查询数据查询3.2.2 多表查询多表查询二、条件连接二、条件连接从关系代数的连接运算的定义可以看出,笛从关系代数的连接运算的定义可以看出,笛卡尔积实际上是一种无条件连接操作,条件连接卡尔积实际上是一种无

33、条件连接操作,条件连接是对笛卡尔积再进行选择操作。是对笛卡尔积再进行选择操作。例例2 查询学生王林所选修的课程的编号和成绩。查询学生王林所选修的课程的编号和成绩。SELECT Cno, Grade FROM Student, SCWHERE Student.Sno = SC.Sno and Sname = 王林王林;3.2 数据查询数据查询3.2.2 多表查询多表查询例例3 查询学生王林所选修的课程的编号和查询学生王林所选修的课程的编号和成绩,并按成绩排序。成绩,并按成绩排序。SELECT Cno, Grade FROM Student, SCWHERE Student.Sno = SC.Sn

34、o and Sname = 王林王林ORDER BY Grade;3.2 数据查询数据查询3.2.2 多表查询多表查询例例4 查询某门课程考试成绩为优良的学生的学号,姓名以及所在院系。 SELECT Student.Sno, Sname, SdeptFROM Student, SCWHERE Student.Sno = SC. Sno AND Grade=80;3.2 数据查询数据查询3.2.2 多表查询多表查询例例5 查询英语课程的最高成绩和最低成绩。查询英语课程的最高成绩和最低成绩。SELECT max(grade),min(grade) FROM Course, SCWHERE Cour

35、se.Cno = SC.Cno and Cname = 英语英语;3.2 数据查询数据查询3.2.2 多表查询多表查询例例6 查询每个学生的学号、姓名、选修的查询每个学生的学号、姓名、选修的课程名及成绩。课程名及成绩。SELECT Student.Sno, Sname, Cname, GradeFROM Student, SC, CourseWHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno;3.2 数据查询数据查询3.2.2 多表查询多表查询例例7 查询每一门课的间接先修课(即先修课的先查询每一门课的间接先修课(即先修课的先修课)。修课)。S

36、ELECT A.Cno, B.CpnoFROM Course A, Course BWHERE A.Cpno = B.Cno;第第1个个Course的被重命名为的被重命名为A,第,第2个个Course的新名是的新名是B,SQL就认为一个表的名字是就认为一个表的名字是A,另外,另外一个的名字是一个的名字是B,这样同一个表就被看作两个不,这样同一个表就被看作两个不同的表。同的表。3.2 数据查询数据查询3.2.2 多表查询多表查询三、外连接三、外连接在条件连接操作中,只有满足连接条件的元在条件连接操作中,只有满足连接条件的元组才能作为最终结果而被输出。假设表组才能作为最终结果而被输出。假设表A和和

37、B作条作条件连接,有时候,件连接,有时候,A中会有某个元组中会有某个元组t,由于在,由于在B中没有任何一个元组满足与中没有任何一个元组满足与t的连接条件,的连接条件,t的身的身影不会出现在影不会出现在A和和B的连接结果中。为了解决参与的连接结果中。为了解决参与连接的表的某些元组没有出现在连接结果的问题,连接的表的某些元组没有出现在连接结果的问题,需要使用左外连接、右外连接和全外连接运算。需要使用左外连接、右外连接和全外连接运算。3.2 数据查询数据查询3.2.2 多表查询多表查询假设表假设表A和表和表B做左外连接,其过程是先按照做左外连接,其过程是先按照连接条件对表做条件连接,得到一个结果。如

38、果连接条件对表做条件连接,得到一个结果。如果表表A的某个元组的某个元组t没有出现在结果中,则将没有出现在结果中,则将t和和B中中的一个万能元组作连接,这个万能元组在所有的的一个万能元组作连接,这个万能元组在所有的列上取空值,即(列上取空值,即(NULL,NULL),形成),形成一个新元组(一个新元组(t,NULL,NULL)加入到)加入到最终结果。请注意,万能元组实际上不存在,是最终结果。请注意,万能元组实际上不存在,是为了叙述方便而想象出来的。为了叙述方便而想象出来的。3.2 数据查询数据查询3.2.2 多表查询多表查询例例8 统计每一门课程的选修人数。SELECT Cname,COUNT(

39、*)FROM Course,SCWHERE Course.Cno *= SC.CnoGROUP BY Cname;3.2 数据查询数据查询3.2.3 集合操作集合操作SELECT语句的结果是元组的集合,所以两个SELECT语句的结果可进行集合操作,但要求两个表的列的个数一致,并且同一个位置上的列具有相同的数据类型。集合操作包括并UNION、交INTERSECT和差EXCEPT。3.2 数据查询数据查询3.2.3 集合操作集合操作例例 1 查询计算机系的学生的学号和选修了查询计算机系的学生的学号和选修了“管理学管理学”的的学生的学号。学生的学号。(SELECT SnoFROM StudentWH

40、ERE Sdept= 计算机计算机)UNION(SELECT SnoFROM Sc A,Course BWHERE A.Cno = B.Cno AND B.Cname=管理学管理学);3.2 数据查询数据查询3.2.3 集合操作集合操作例例 2 查询计算机系的学生与年龄不大于查询计算机系的学生与年龄不大于19岁的学岁的学生的交集。生的交集。(SELECT *FROM StudentWHERE Sdept = 计算机计算机)INTERSECT(SELECT *FROM StudentWHERE Sage 19);3.2 数据查询数据查询3.2.3 集合操作集合操作例例3 查询计算机系的学生与年龄

41、不大于查询计算机系的学生与年龄不大于19岁的学岁的学生的差集。生的差集。(SELECT *FROM StudentWHERE Sdept = 计算机计算机)EXCEPT(SELECT *FROM StudentWHERE Sage (SELECT AVG(Grade) -子查询子查询FROM SCWHERE Cno= 1156)AND Cno = 1156;3.2 数据查询数据查询3.2.4 子查询子查询例例3 查询其它系中比管理系某一学生年龄小的学查询其它系中比管理系某一学生年龄小的学生姓名和年龄生姓名和年龄SELECT Sname, SageFROM StudentWHERE Sage S

42、OME (SELECT Sage FROM Student WHERE Sdept= 管理管理)AND Sdept 管理管理; 3.2 数据查询数据查询3.2.4 子查询子查询本查询也可以用聚集函数来实现。首先用子本查询也可以用聚集函数来实现。首先用子查询找出管理系中最大年龄(查询找出管理系中最大年龄(19),然后在父查),然后在父查询中查询所有非管理系且年龄小于询中查询所有非管理系且年龄小于19岁的学生姓岁的学生姓名及年龄。名及年龄。SQL语句如下:语句如下:SELECT Sname,SageFROM StudentWHERE Sage (SELECT MAX(Sage)FROM Stude

43、ntWHERE Sdept= 管理管理)AND Sdept 管理管理;3.2 数据查询数据查询3.2.4 子查询子查询例例4 查询其它系中比管理系所有学生年龄都小的学查询其它系中比管理系所有学生年龄都小的学生姓名及年龄。生姓名及年龄。SELECT Sname, SageFROM StudentWHERE Sage ALL (SELECT SageFROM StudentWHERE Sdept= 管理管理)AND Sdept 管理管理;3.2 数据查询数据查询3.2.4 子查询子查询本查询同样也可以用聚集函数实现。本查询同样也可以用聚集函数实现。SQL语语句如下:句如下:SELECT Sname

44、, SageFROM StudentWHERE Sage (SELECT MIN(Sage)FROM StudentWHERE Sdept= 管理管理)AND Sdept 管理管理; 3.2 数据查询数据查询3.2.4 子查询子查询 = 或!= = SOME IN - MAX MIN= MIN ALL - NOT IN MIN MAX= MAXSOME,ALL谓词与聚集函数及谓词与聚集函数及IN谓词的等价转换关系谓词的等价转换关系3.2 数据查询数据查询3.2.4 子查询子查询例例5 查询和学生查询和学生2000278年龄相同且性别相同的年龄相同且性别相同的学生的详细信息。学生的详细信息。SE

45、LECT * -父查询父查询FROM StudentWHERE (Ssex, Sage) = (SELECT Ssex, Sage -子查询子查询FROM StudentWHERE Sno= 2000278);3.2 数据查询数据查询3.2.4 子查询子查询2、IN运算符运算符例例6 查询选修课程编号为查询选修课程编号为1024的课程的学生姓的课程的学生姓名和所在系。名和所在系。SELECT Sname, Sdept FROM StudentWHERE Sno IN (SELECT Sno FROM SCWHERE Cno = 1024);3.2 数据查询数据查询3.2.4 子查询子查询例例7

46、 查询选修查询选修“管理学管理学”的学生学号和姓名。的学生学号和姓名。 SELECT Sno, Sname FROM Student WHERE Sno IN ( SELECT Sno FROM SC WHERE Cno IN ( SELECT Cno FROM Course WHERE Cname=管理学管理学) ; 3.2 数据查询数据查询3.2.4 子查询子查询查询也可以用连接查询实现:查询也可以用连接查询实现:SELECT Student.Sno, SnameFROM Student, SC, CourseWHERE Student.Sno = SC.Sno AND SC.Cno =

47、Course.Cno ANDCourse.Cname= 管理学管理学;3.2 数据查询数据查询3.2.4 子查询子查询3、EXISTS运算符运算符EXISTS运算符是一元运算符,后面跟一个集合,如运算符是一元运算符,后面跟一个集合,如果集合不是空集,则返回真,否则返回假。利用果集合不是空集,则返回真,否则返回假。利用EXISTS运算符能实现集合的包含运算。运算符能实现集合的包含运算。例例8 查询所有选修了查询所有选修了1024号课程的学生姓名。号课程的学生姓名。SELECT SnameFROM StudentWHERE Sno IN (SELECT Sno FROM SC WHERE Cno=

48、 1024);3.2 数据查询数据查询3.2.4 子查询子查询例例9 查询平均成绩不小于查询平均成绩不小于85分的学生姓名分的学生姓名和所在系。和所在系。SELECT Sname, SdeptFROM Student xWHERE (SELECT AVG(GRADE) FROM SC WHERE Sno = x.Sno) = 85;3.2 数据查询数据查询3.2.4 子查询子查询例例10 查询至少选修了学生查询至少选修了学生2000014选修的全部课程的学选修的全部课程的学生姓名及所在系。生姓名及所在系。SELECT Sname, SdeptFROM Student xWHERE NOT EX

49、ISTS (SELECT Cno -集合集合RFROM SC WHERE Sno = 2000014)EXCEPT -集合的差运算集合的差运算(SELECT Cno -集合集合SFROM SCWHERE Sno = x.Sno)AND x.Sno != 2000014; 3.2 数据查询数据查询3.2.4 子查询子查询例例11 查询和学生查询和学生2000014选修相同课程的学生姓名。选修相同课程的学生姓名。SELECT Sname, SdeptFROM Student xWHERE NOT EXISTS (SELECT Cno -集合集合RFROM SC yWHERE Sno = 20000

50、14 AND NOT EXISTS(SELECT Cno -集合集合SFROM SCWHERE Sno = x.Sno AND Cno=y.Cno)AND NOT EXISTS (SELECT Cno -集合集合S FROM SC z WHERE Sno = x.Sno AND NOT EXISTS(SELECT Cno -集合集合RFROM SCWHERE Sno=2000014 AND Cno=z.Cno)AND x.Sno != 2000014;3.2 数据查询数据查询3.2.4 子查询子查询例例12 查询选修了某些学生查询选修了某些学生2000014所选修课程的所选修课程的学生的姓名。

51、学生的姓名。SELECT SnameFROM Student xWHERE EXISTS(SELECT R.Cno -集合集合RSFROM SC R, SC SWHERE R.Sno = 2000014 AND S.Sno = x.Sno AND R.Cno = S.Cno)AND Sno != 2000014; 3.2 数据查询数据查询3.2.4 子查询子查询二、二、FROM子句中的子查询子句中的子查询前面介绍过,前面介绍过,FROM子句指定查询要使用的表,子句指定查询要使用的表,一般情况下,这些表是关系数据库中物理存在的一般情况下,这些表是关系数据库中物理存在的表,如事例数据库中的表,如事

52、例数据库中的Student、Course和和SC表。表。子查询的结果是一个表,但只是一个中间结果,子查询的结果是一个表,但只是一个中间结果,并没有存放在关系数据库中。为了在并没有存放在关系数据库中。为了在FROM子句子句中使用子查询,要给子查询生成的临时表命名,中使用子查询,要给子查询生成的临时表命名,有时还要对临时表的列命名。有时还要对临时表的列命名。3.2 数据查询数据查询3.2.4 子查询子查询例例13 查询每门课程的名称和平均成绩查询每门课程的名称和平均成绩SELECT Cno, AVG(Grade)FROM SCGROUP BY Cno;3.2 数据查询数据查询3.2.4 子查询子查

53、询例例14 查询学生王林所选修课程的课程编查询学生王林所选修课程的课程编号和成绩号和成绩SELECT Cno, GradeFROM Student JOIN SC ON Student.Sno = SC.Sno WHERE Sname = 王林王林;3.2 数据查询数据查询3.2.4 子查询子查询例例15 查询学生王林所选修课程的课程名称查询学生王林所选修课程的课程名称和成绩和成绩SELECT Cname, GradeFROM (Student JOIN SC ON Student.Sno = SC.Sno) JOIN Course ON SC.Cno = Course.CnoWHERE Sn

54、ame = 王林王林;3.2 数据查询数据查询3.2.4 子查询子查询例例16 查询学生查询学生2000012和和2000014选修课程的选修课程的交集(只要求输出课程编号)。交集(只要求输出课程编号)。SELECT A.CnoFROM (SELECT CnoFROM SCWHERE Sno = 2000012) A JOIN(SELECT CnoFROM SCWHERE Sno = 2000014) BON A.Cno = B.Cno;3.2 数据查询数据查询3.2.4 子查询子查询例例17 查询学生查询学生2000012和和2000014选修课程的差集(只选修课程的差集(只要求输出课程编号

55、)。要求输出课程编号)。SELECT R.CnoFROM (SELECT * - 集合集合RFROM SCWHERE Sno = 2000012) R LEFT OUTER JOIN(SELECT * -集合集合SFROM SCWHERE Sno = 2000014) SON R.Cno = S.CnoWHERE S.Cno IS NULL:3.3 数据定义数据定义表、视图、索引是数据库中的主体。表、视图、索引是数据库中的主体。SQL提提供数据定义语句对这些主体进行管理供数据定义语句对这些主体进行管理 SQL的数据定义语句 操 作 对 象操 作 方 式创 建删 除修 改表CREATE TABL

56、EDROP TABLEALTER TABLE视 图CREATE VIEWDROP VIEW索 引CREATE INDEXDROP INDEX3.3 数据定义数据定义3.3.1 表的定义表的定义SQL语言使用语言使用CREATE TABLE语句定语句定义表,其一般格式如下:义表,其一般格式如下:CREATE TABLE ( 列级完整性约束条列级完整性约束条件件 , 列级完整性约列级完整性约束条件束条件 ) , ;3.3 数据定义数据定义3.3.1 表的定义表的定义1、数据类型、数据类型数据类型含 义CHAR(n)长度为n的定长字符串VARCHAR(n)最大长度为n的变长字符串INT长整数(也可以

57、写作INTEGER)SMALLINT短整数NUMERIC(p,d)定点数,由p位数字(不包括符号、小数点)组成,小数后面有d位数字数据类型数据类型3.3 数据定义数据定义3.3.1 表的定义表的定义数据类型数据类型(续表续表)数据类型含 义REAL取决于机器精度的浮点数DOUBLE PRECISION取决于机器精度的双精度浮点数FLOAT(n)浮点数,精度至少为n位数字DATE日期,包含年、月、日,格式为YYYY-MM-DDTIME时间,包含时、分、秒,格式为HH:MM:SS3.3 数据定义数据定义3.3.1 表的定义表的定义2、实体完整性、实体完整性例例1 建立建立Student表,表,Sn

58、o作为主码。作为主码。CREATE TABLE Student (Sno CHAR(7) PRIMARY KEY, Sname CHAR(8), Ssex CHAR(2) , Sage SMALLINT, Sdept CHAR(20) );3.3 数据定义数据定义3.3.1 表的定义表的定义例例2 建立建立SC表,表,Sno和和Cno是主码。是主码。CREATE TABLE SC (Sno CHAR(7), Cno CHAR(4), Grade SMALLINT, PRIMARY KEY (Sno,Cno);3.3 数据定义数据定义3.3.1 表的定义表的定义3、参照完整性、参照完整性例例3

59、建立建立SC表,表,Sno和和Cno是主码,且是主码,且Sno和和Cno也是外码,分别也是外码,分别引用引用Student表的表的Sno列和列和Course表的表的Cno列。列。CREATE TABLE SC (Sno CHAR(7), Cno CHAR(4), Grade SMALLINT, PRIMARY KEY (Sno,Cno),FOREIGN KEY (Sno) REFERENCES Student(Sno), FOREIGN KEY (Cno) REFERENCES Course(Cno);3.3 数据定义数据定义3.3.1 表的定义表的定义例例4 建立建立Course表,表,Cn

60、o是主码,是主码,Cpno是外码,引用是外码,引用Course表的表的Cno列。列。CREATE TABLE Course (Cno CHAR(4) PRIMARY KEY, Cname CHAR(40), Cpno CHAR(4) , Ccredit SMALLINT,FOREIGN KEY (Cpno) REFERENCES Course(Cno);3.3 数据定义数据定义3.3.1 表的定义表的定义4、属性值约束、属性值约束非空值限制非空值限制指定允许的取值范围指定允许的取值范围当往表中插入元组或修改属性的值时,当往表中插入元组或修改属性的值时,数据库管理系统就检查属性上的限制是否数据库

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论