结构化查询语言SQL课件_第1页
结构化查询语言SQL课件_第2页
结构化查询语言SQL课件_第3页
结构化查询语言SQL课件_第4页
结构化查询语言SQL课件_第5页
已阅读5页,还剩113页未读 继续免费阅读

下载本文档

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

文档简介

1、结构化查询语言SQL课件结构化查询语言SQL课件主要内容SQL概述 SQL的数据定义SQL的数据查询 数据更新 嵌入式SQL Transact SQL语言概述 主要内容SQL概述 重点(1)使用CREATE语句和DROP语句创建或撤消数据库、基本表、视图。(2)使用SELECT语句表达式查询(联结、嵌套、存在量词方式书写查询语句)。(3)使用INSERT、DELETE、UPDATE语句更新操作。(4)正确叙述SQL语句(定义、查询和更新)。(5)正确理解嵌入式SQL语句所表示的意义。难点(1)对SELECT查询语句的理解。(2)对视图更新操作的限制。(3)涉及游标的SQL DML的使用方式。本

2、章重点与难点重点本章重点与难点本章概述结构化查询语言SQL(Structured Query Language)是关系数据库的标准语言,对关系模型的发展和商用DBMS的研制起着重要的作用。SQL语言是介乎于关系代数和元组演算之间的一种语言。本章详细介绍SQL的核心部分内容:数据定义、数据查询、数据更新和嵌入式SQL。 本章概述结构化查询语言SQL(Structured Quer4.1 SQL概述 9/11/202254.1 SQL概述 9/10/20227主要内容SQL的产生与发展SQL的组成及特点主要内容SQL的产生与发展SQL的产生与发展 1970年,美国IBM研究中心的E.F.Codd连

3、续发表多篇论文,提出关系模型。1972年,IBM公司开始研制实验型关系数据库管理系统SYSTEM R,配制的查询语言称为SQUARE (Specifying Queries As Relational Expression )语言,在语言中使用了较多的数学符号。1974年,Boyce和Chamberlin把SQUARE修改为SEQUEL (Structured English QueryLanguage )语言。后来SEQUEL简称为SQL (Structured Query Language ),即“结构式查询语言”,SQL的发音仍为“sequel”。现在SQL已经成为一个标准 。SQL有两

4、个标准:ANSI SQL和1992年通过的修改版本SQL-92(简称SQL2)。还有一个新的标准SQL3,它扩充了SQL2,引入了递归、触发器和对象等概念和机制。SQL的产生与发展 1970年,美国IBM研究中心的E.F.SQL的组成及特点 SQL语言从功能上可以分为四部分:数据查(Data Query)、数据操纵(Data Manipulation)、数据定义(Data Definition)和数据控制(Data Control)。核心SQL主要有四个部分:(1) 数据定义语言,即SQL DDL,用于定义SQL模式、基本表、视图、索引等结构。(2) 数据操纵语言,即SQL DML。数据操纵分

5、成数据查询和数据更新两类。其中数据更新又分成插入、删除和修改三种操作。(3) 嵌入式SQL语言的使用规定。这一部分内容涉及到SQL语句嵌入在宿主语言程序中的规则。(4) 数据控制语言,即SQL DCL,这一部分包括对基本表和视图的授权、完整性规则的描述、事务控制等内容。SQL的组成及特点 SQL语言从功能上可以分为四部分:数据SQL的核心动词 SQL有两种使用方式:一是联机交互使用,另一种是嵌入到某种高级语言程序设计语言中去使用。SQL是一种第四代语言(4GL),用户只需提出“干什么”,无需具体指明“怎么干”,像存取路径选择和具体处理操作等,均有系统自动完成。功 能动 词数据库查询SELECT

6、数据定义CREATE,DROP数据操纵INSERT,UPDATE,DELECT数据控制GRANT,REVOKESQL的核心动词 SQL有两种使用方式:一是联机交互使用,另数据库的创建与撤销定义、修改与删除基本表建立与删除索引创建与删除视图4.2 SQL的数据定义数据库的创建与撤销4.2 SQL的数据定义SQL的数据定义操作对象操 作 方 式创 建删 除修 改数据库CREATE DATABASEDROP DATABASE表CREATE TABLEDROP TABLEALTER TABLE索 引CREATE INDEXDROP INDEX视 图CREATE VIEWDROP VIEWSQL的数据定

7、义功能包括数据库定义、表定义、视图和索引的定义。 SQL的数据定义操作对象操 作 方 式创 建删 除修 改数据SQL的数据定义(2)例4.1 定义一个教务管理数据库JWGL,它包含3个表: 学生表:S(SNO,SNAME,SEX,AGE,SDEPT) 课程表:C(CNO,CNAME,CPNO,CCREDIT) 学生选课表:SC(SNO,CNO,GRADE) SQL的数据定义(2)例4.1 定义一个教务管理数据库JWG学生表实例与选课表实例学号SNO课程号CNO成绩GRADE200915121200915121200915121200915122200915122123239285889080学

8、号SNO姓名SNAME性别SEX年龄AGE所在系SDEPT200915121200915122200915123200915125李小勇刘 晨王洪敏张 力MFFM20191819CSCSMAIS学生表实例选课表实例学生表实例与选课表实例学号SNO课程号CNO成绩GRADE2课程表实例课程号CNO课程名CNAME先修课CPNO学分CCREDIT1234567数据库数学信息系统操作系统数据结构数据处理C语言516764243424课程表实例课程表实例课程号CNO课程名CNAME先修课CPNO学分CC数据库的创建对数据库的创建可用CREATE语句实现,句法如下: CREATE DATABASE AU

9、THORIZATION 其中AUTHORIZATION 是指该用户获得授予创建和使用数据库的权限。 例如,下面语句定义了教务管理数据库的模式: CREATE DATABASE JWGL AUTHORIZATION张铭 创建的数据库名为JWGL,拥有者为张铭。数据库的创建对数据库的创建可用CREATE语句实现,句法如下数据库的撤销使用DROP语句撤消数据库。DROP语句的句法如下:DROP DATABASE CASCADE | RESTRICT撤消的方式有以下两种:CASCADE(连锁式)方式:执行DROP语句时,把数据库及其下属的基本表、视图、索引等所有元素全部撤消。 RESTRICT(约束式

10、)方式:执行DROP语句时,只有当数据库中没有任何下属元素时,才能撤消数据库,否则拒绝执行DROP语句。 例如,要撤消数据库JWGL及其下属所有的元素,可用下列语句实现: DROP DATABASE JWGL CASCADE 数据库的撤销使用DROP语句撤消数据库。DROP语句的句法基本表的定义、修改与删除数据类型 一个属性选用哪种数据类型要根据实际情况来决定,一般要从两个方面来考虑,一是取值范围,二是要做哪些运算。基本表的定义、修改与删除数据类型 数据类型数据类型含 义CHAR(n)VARCHAR(n)INTSMALLINTNUMERIC(p,d)REALDOUBLE PRECISIONFL

11、OAT(n)DATETIME度为n的定长字符串 最大长度为n的变长字符串长整数(也可以写作INTEGER)短整数定点数,由P位数字(不包括符号、小数点)组成,小数后面有d位数字取决于机器精度的浮点数取决于机器精度的双精度浮点数浮点数,精度至少为n位数字日期,包含年、月、日,格式为YYYY-MM-DD 时间,包含一日的时、分、秒,格式为HH:MM:SS不同的RDBMS中支持的数据类型不完全相同 数据类型数据类型含 义CHAR(n)度为n的定长字符定义基本表定义基本表,就是创建基本表的结构。其一般格式为: CREATE TABLE ( 列级完整性约束条件 , 列级完整性约束条件 ,); 建表的同时

12、通常还可以定义与该表有关的完整性约束条件,这些完整性约束条件被存入系统的数据字典中,当用户操作表中数据时由RDBMS自动检查该操作是否违背这些完整性约束条件。定义基本表定义基本表,就是创建基本表的结构。其一般格式为: CREATE TABLE S (SNO CHAR(9) PRIMARY KEY, /* 列级完整性约束条件,SNO是主码 */ SNAME CHAR(20) UNIQUE, /* SNAME取唯一值 */ SEX CHAR(1), AGE SMALLINT, SDEPT CHAR(20) ); 系统执行上面的CREATE TABLE语句后,就在数据库中建立一个新的空的“学生”表S

13、,并将有关“学生”表的定义及有关约束条件存放在数据字典中。例:建立学生表CREATE TABLE S 例:建立学生表例:建立学生选课表CREATE TABLE SC (SNO CHAR(9), CNO CHAR(4), GRADE SMALLINT, PRIMARY KEY(SNO,CNO), /* 主码由两个属性构成,必须作为表级完整性进行定义 */ FOREIGN KEY(SNO) REFERENCES S(SNO), /* 表级完整性约束条件,SNO是外码,被参照表是S */ FOREIGN KEY(CNO) REFERENCES C(CNO) /* 表级完整性约束条件,CNO是外码,被

14、参照表是C */ ); 例:建立学生选课表CREATE TABLE SC 修改基本表SQL语言用ALTER TABLE语句修改基本结构表,格式为: ALTER TABLE ADD 完整性约束DROP ALTER COLUMN ; 其中是要修改的基本表。ADD子句用于增加新列和新的完整性约束条件;DROP子句用于删除指定的完整性约束条件;ALTER COLUMN子句用于修改原有的列定义。包括修改列名和数据类型。 例如,向S表增加“入学时间”列,其数据类型为日期型。 ALTER TABLE S ADD S_ENTRANCE DATE; 不论基本表中原来是否已有数据,新增加的列一律为空值。修改基本表

15、SQL语言用ALTER TABLE语句修改基本结构删除基本表用DROP TABLE语句删除基本表。格式为: DROP TABLE RESTRICT | CASCADE; 若选择RESTRICT:则该表的删除是有限制条件的。欲删除的基本表不能被其他表的约束所引用(如CHECK,FOREIGN KEY等约束),不能有视图,不能有触发器(trigger),不能有存储过程或函数等。如果存在这些依赖该表的对象,则此表不能被删除。 若选择CASCADE:则该表的删除没有限制条件。在删除基本表的同时,相关的依赖对象,例如视图,都将被一起删除。 缺省情况是RESTRICT。 例4.8 删除S表。 DROP T

16、ABLE S CASCADE; 删除基本表用DROP TABLE语句删除基本表。格式为: 建立索引建立索引使用CREATE INDEX语句,格式为: CREATE UNIQUECLUSTER INDEX ON (,); 其中,是要建索引的基本表的名字。索引可以建立在该表的一列或多列上,各列名之间用逗号分隔。每个后面还可以用指定索引值的排列次序,可选ASC(升序)或DESC(降序),缺省值为ASC。 UNIQUE表明此索引的每一个索引值只对应唯一的数据记录。 CLUSTER表示要建立的索引是聚簇索引。所谓聚簇索引是指索引项的顺序与表中记录的物理顺序一致的索引组织。例: CREATE CLUSTE

17、R INDEX STUSNAME ON S(SNAME); 将会在S表的SNAME(姓名)列上建立一个聚簇索引,而且S表中的记录将按照SNAME值的升序存放。 建立索引建立索引使用CREATE INDEX语句,格式为: 删除索引索引一经建立,就由系统使用和维护它,不需用户干预。建立索引是为了减少查询操作的时间,但如果数据增删改频繁,系统会花费许多时间来维护索引,从而降低了查询效率。这时,可以删除一些不必要的索引。 删除索引使用DROP INDEX语句,其一般格式为 DROP INDEX ; 例: 删除S表的STUSNAME索引。 DROP INDEX STUSNAME; 删除索引时,系统会同时

18、从数据字典中删去有关该索引的描述。删除索引索引一经建立,就由系统使用和维护它,不需用户干预。建视图视图是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。 视图视图是从一个或几个基本表(或视图)导出的表。它与基本表不建立视图用CREATE VIEW命令建立视图,格式为:CREATE VIEW (,)AS WITH CHECK OPTION; 其中,子查询可以是任意复杂的SELECT语句,但通常不允许含有ORDER BY子句和DISTINCT短语。 WITH CHECK OPTION表示对视图进行U

19、PDATE,INSERT和DELETE操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)。建立视图用CREATE VIEW命令建立视图,格式为:组成视图的属性列名或者全部省略或者全部指定,如果省略了视图的各个属性列名,则隐含该视图由子查询中SELECT子句目标列中的诸字段组成。但在下列三种情况下必须明确指定组成视图的所有列名:某个目标列不是单纯的属性名,而是聚集函数或列表达式;多表连接时选出了几个同名列作为视图的字段;需要在视图中为某个列启用新的名字。例: 建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生。CREATE VIEW I

20、S_S1 AS SELECT SNO,SNAME,AGE FROM S WHERE SDEPT=IS WITH CHECK OPTION; 加上了WITH CHECK OPTION子句,以后对该视图进行插入、修改和删除操作时,RDBMS会自动加上SDEPT=IS的条件。 视图中的字段组成视图的属性列名或者全部省略或者全部指定,如果省略了视图的视图若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了主码,我们称这类视图为行列子集视图。视图不仅可以建立在单个基本表上,也可以建立在多个基本表上。例:建立信息系选修了l号课程的学生的视图。CREATEVIEWIS_S2(SNO

21、,SNAME,GRADE)ASSELECTS.SNO,SNAME,GRADEFROMS,SCWHERESDEPT=ISANDS.SNO=SC.SNOANDSC.CNO=1;由于视图IS_S2的属性列中包含了S表与SC表的同名列SNO,所以必须在视图名后面明确说明视图的各个属性列名。视图不仅可以建立在一个或多个基本表上,也可以建立在一个或多个已定义好的视图上,或建立在基本表与视图上。视图若一个视图是从单个基本表导出的,并且只是去掉了基本表的某该语句的一般格式为: DROP VIEW CASCADE; 视图删除后,视图的定义将从数据字典中被删除。如果该视图上还导出了其他视图,则使用CASCADE级

22、联删除语句,就可以把该视图和由它导出的所有视图一起删除。 基本表删除后,由该基本表导出的所有视图(定义)没有被删除,但均已无法使用了。删除这些视图(定义)需要使用DROP VIEW语句。 例:删除视图BT_S: DROP VIEW BT_S; 删除视图IS_S1: DROP VIEW IS_S1; 删除视图该语句的一般格式为: 删除视图4.3 SQL的数据查询9/11/2022314.3 SQL的数据查询9/10/202233主要内容SELECT语句格式单表查询聚集函数数据分组多表查询集合操作主要内容SELECT语句格式 SELECT语句格式SELECTFROMWHERE句型在关系代数中最常用

23、的式子是下列表达式: A1,An(F(R1Rm) 这里R1、Rm为关系,F是公式,A1、An为属性。针对上述表达式,SQL为此设计了SELECTFROMWHERE句型:SELECT A1,AnFROM R1,RmWHERE F 这个句型是从关系代数表达式演变来的,但WHERE子句中的条件表达式F要比关系代数中公式更灵活。 SELECT语句格式SELECTFROMWHERE句型SELECT语句格式SELECT语句完整的句法如下: SELECT 目标表的列名或列表达式序列 FROM 基本表名和(或)视图序列 WHERE 行条件表达式 GROUP BY 列名序列 HAVING 组条件表达式 ORDE

24、R BY 列名 ASC|DESC , 主语句SELECT-FROM-WHERE的含义是: 根据WHERE子句的条件表达式,从FROM子句指定的基本表或视图中找出满足条件的元组,再按SELECT子句中的目标列表达式,选出元组中的属性值形成结果表。 SELECT语句格式SELECT语句完整的句法如下: 整个语句的执行过程如下:(1) 读取FROM子句中基本表、视图的数据,执行笛卡尔积操作。(2) 选取满足WHERE子句中给出的条件表达式的元组。(3) 按GROUP子句中指定列的值分组,同时提取满足HAVING子句中组条件表达式的那些组。(4) 按SELECT子句中给出的列名或列表达式求值输出。(5

25、) ORDER子句对输出的目标表进行排序,按附加说明ASC升序排列,或按DESC降序排列。SELECT语句格式整个语句的执行过程如下:SELECT语句格式单表查询 查询指定列 在很多情况下,用户只对表中的一部分属性列感兴趣,这时可以通过在SELECT子句的中指定要查询的属性列。 例:查询全体学生的学号与姓名。 SELECT SNO,SNAME FROM S; 该语句的执行过程可以是这样的:从S表中取出一个元组,再取出该元组在属性SNO和SNAME上的值,形成一个新的元组作为输出。对S表中的所有元组做相同的处理,最后形成一个结果关系作为输出。单表查询 查询指定列 查询全部列将表中的所有属性列都选

26、出来,可以有两种方法。一种方法就是在SELECT关键字后面列出所有列名;另一种方法是如果列的显示顺序与其在基表中的顺序相同,也可以简单地将指定为“*”。 例:查询全体学生的详细记录。 SELECT * FROM S; 等价于: SELECT SNO,SNAME,SEX,AGE,SDEPT FROM S; 查询全部列将表中的所有属性列都选出来,可以有两种方法。一种方选择表中的若干元组 消除取值重复的行 两个本来并不完全相同的元组,投影到指定的某些列上后,可能变成相同的行了,可以用DISTINCT取消它们。 例:查询选修了课程的学生学号。 SELECT SNO FROM SC; 该查询结果里包含了

27、许多重复的行。如果想去掉结果表中的重复行,必须指定DISTINCT关键词: SELECT DISTINCT SNO FROM SC; 选择表中的若干元组 消除取值重复的行 查询满足条件的元组 查询满足指定条件的元组可以通过WHERE子句实现。例:查询计算机科学系全体学生的名单。 SELECT SNAME FROM S WHERE SDEPT=CS;查 询 条 件谓 词比较确定范围确定集合字符匹配空 值多重条件(逻辑运算)=,=,=,!=,!,!,NOT+上述运算符BETWEEN AND,NOT BETWEEN ANDIN,NOT INLIKE,NOT LIKE IS NULL,IS NOT N

28、ULL AND,OR,NOT 查询满足条件的元组 查询满足指定条件的元组可以通过WHE范围查询谓词BETWEENAND和NOT BETWEENAND可以用来查找属性值在(或不在)指定范围内的元组,其中BETWEEN后是范围的下限(即低值),AND后是范围的上限(即高值)。例:查询年龄在2023岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。 SELECT SNAME,SDEPT,AGE FROM S WHERE AGE BETWEEN 20 AND 23; 与BETWEENAND相对的谓词是NOT BETWEENAND。例:查询年龄不在2023岁之间的学生姓名、系别和年龄。 SELECT

29、 SNAME,SDEPT,AGE FROM SWHERE AGE NOT BETWEEN 20 AND 23; 范围查询谓词BETWEENAND和NOT BETWEEN确定集合谓词IN可以用来查找属性值属于指定集合的元组。例:查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别。 SELECT SNAME,SEX FROM S WHERE SDEPT IN(CS,MA,IS);与IN相对的谓词是NOT IN,用于查找属性值不属于指定集合的元组。例:查询既不是计算机科学系、数学系,也不是信息系的学生的姓名和性别。 SELECT SNAME,SEX FROM S WHERE S

30、DEPT NOT IN(CS,MA,IS); 确定集合谓词IN可以用来查找属性值属于指定集合的元组。字符匹配谓词LIKE可以用来进行字符串的匹配。其一般语法格式如下:NOT LIKE ESCAPE其含义是查找指定的属性列值与相匹配的元组。可以是一个完整的字符串,也可以含有通配符%和_。%(百分号)代表任意长度(长度可以为0)的字符串。例如a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab等都满足该匹配串。_(下划线)代表任意单个字符。例如a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串。字符匹配谓词LIKE可以用来进行字符串的匹配。其

31、一般语法格式例:查询学号为200915121的学生的详细情况。 SELECT * FROM S WHERE SNO LIKE 200915121; 等价于: SELECT * FROM S WHERE SNO=200915121;如果LIKE后面的匹配串中不含通配符,则可以用=(等于)运算符取代LIKE谓词,用!=或(不等于)运算符取代NOT LIKE谓词。例: 查询所有姓刘的学生的姓名、学号和性别。 SELECT SNAME,SNO,SEX FROM S WHERE SNAME LIKE 刘%; 单表查询举例 例:查询学号为200915121的学生的详细情况。单表查询举 涉及空值的查询例例:

32、某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。 SELECT SNO,CNO FROM SC WHERE GRADE IS NULL; /* 分数GRADE是空值 */ 多重条件查询可用逻辑运算符AND和OR来联结多个查询条件。AND的优先级高于OR,但可以用括号改变优先级。例:查询计算机科学系年龄在20岁以下的学生姓名。 SELECT SNAME FROM S WHERE SDEPT=CS AND AGE20; 单表查询举例 涉及空值的查询例单表查询举例 用户可以用ORDER BY子句对查询结果按照一个或多个属性列的升序(ASC)或降

33、序(DESC)排列,缺省值为升序。例:查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列。 SELECT SNO,GRADE FROM SC WHERE CNO=3 ORDER BY GRADE DESC;对于空值,若按升序排列,含空值的元组将在最后显示。若按降序排列,空值的元组将在最前面显示。ORDER BY子句用户可以用ORDER BY子句对查询结果按照一个或多个属性列 聚合函数是涉及整个关系的另一类运算操作。通过聚合函数,可以把某一列中的值形成单个值。SQL不仅允许聚合属性上的值,而且可以按照某个准则将关系中的元组分组。COUNT(*) 计算元组的个数。COUNT(列名)

34、对一列中的值计算个数。SUM(列名) 求某一列值的总和(此列的值必须是数值型)。AVG(列名) 求某一列值的平均值(此列的值必须是数值型)。MAX(列名) 求某一列值的最大值。MIN(列名) 求某一列值的最小值。 如果指定在列名前面指明DISTINCT短语,则表示在计算时要取消指定列中的重复值。如果不指定DISTINCT短语或指定ALL短语(ALL为缺省值),则表示不取消重复值。 聚集函数 (1) 聚合函数是涉及整个关系的另一类运算操作。通过聚合函数,例:查询选修了课程的学生人数。 SELECT COUNT(DISTINCT SNO) FROM SC;学生每选修一门课,在SC中都有一条相应的记

35、录。一个学生要选修多门课程,为避免重复计算学生人数,必须在COUNT函数中用DISTINCT短语。例: 计算选修l号课程的学生平均成绩。 SELECT AVG(GRADE) FROM SC WHERE CNO=1;例:查询选修l号课程的学生最高分数。 SELECT MAX(GRADE) FROM SC WHERE CNO=1; 聚集函数 (2) 例:查询选修了课程的学生人数。 聚集函数 (2) 对查询结果分组的目的是为了细化聚集函数的作用对象。如果未对查询结果分组,聚集函数将作用于整个查询结果。在实际应用中,经常需要将查询结果进行分组,然后再对每个分组进行统计。GROUP BY子句将查询结果按

36、某一列或多列的值分组,值相等的为一组,分组后聚集函数将作用于每一个组,即每一组都有一个函数值。 例: 求各个课程号及相应的选课人数。 SELECT CNO,COUNT(SNO) FROM SC GROUP BY CNO;该语句对查询结果按CNO的值分组,所有具有相同CNO值的元组为一组,然后对每一组作用聚集函数COUNT计算,以求得该组的学生人数。如果分组后还要求按一定的条件对这些组进行筛选,最终只输出满足指定条件的组,则可以使用HAVING短语指定筛选条件。 数据分组对查询结果分组的目的是为了细化聚集函数的作用对象。如果未对查在多表查询中,如果要引用不同关系中的同名属性,则需要在属性名前加关

37、系名,即用“关系名.属性名”的形式表示,以便区分。连接查询 等值与非等值连接查询 连接查询的WHERE子句中用来连接两个表的条件称为连接条件或连接谓词,其一般格式为: . .其中比较运算符主要有:=、=、=、!=(或)等。 此外连接谓词还可以使用下面形式: . BETWEEN . AND . 多表查询 (1) 在多表查询中,如果要引用不同关系中的同名属性,则需要在属性名 例:查询每个学生及其选修课程的情况。 学生情况存放在S表中,学生选课情况存放在SC表中,所以本查询实际上涉及S与SC两个表。这两个表之间的联系是通过公共属性SNO实现的。 SELECT S.*,SC.* FROM S,SC W

38、HERE S.SNO=SC.SNO; /* 将S与SC中同一学生的元组连接起来 */ 执行步骤:首先在表S中找到第一个元组,然后从头开始扫描SC表,逐一查找与S第一个元组的SNO相等的SC元组,找到后就将S中的第一个元组与该元组拼接起来,形成结果表中一个元组。SC全部查找完后,再找S中第二个元组,然后再从头开始扫描SC,逐一查找满足连接条件的元组,找到后就将S中的第二个元组与该元组拼接起来,再形成结果表中一个元组。重复上述操作,直到S中的全部元组都处理完毕为止。这就是循环嵌套算法的基本思想 。多表查询 (2) 例:查询每个学生及其选修课程的情况。多表查询 (2) (2) 自身连接连接操作不仅可

39、以在两个表之间进行,也可以是一个表与其自己进行连接,称为表的自身连接。例:查询每一门课的间接先修课(即先修课的先修课)。在C表中,只有每门课的直接先修课信息,而没有先修课的先修课。要得到这个信息,必须先对一门课找到其先修课,再按此先修课的课程号,查找它的先修课程。这就将C表与其自身连接。为此,要为C表取两个别名,一个是FIRST,另一个是SECOND。完成该查询的SQL语句为 SELECT FIRST.CNO,SECOND.CPNO FROM C FIRST,C SECOND WHERE FIRST.CPNO=SECOND.CNO; (2) 自身连接连接操作不仅可以在两个表之间进行,也可以是一

40、有时想以S表为主体列出每个学生的基本情况及其选课情况。若某个学生没有选课,仍把舍弃的表S元组保存在结果关系中,而在SC表的属性上填空值(NULL),这时就需要使用外连接。例4.56 查询每个学生及其选修课程的情况。 : SELECT S.SNO,SNAME,SEX,AGE,SDEPT,CNO,GRAGE FROM S LEFT OUT JOIN SC ON(S.SNO=SC.SNO); /* 也可以使用USING来去掉结果中的重复值: FROM S LEFT OUT JOIN SC USING(SNO); */ (3) 外连接有时想以S表为主体列出每个学生的基本情况及其选课情况。若某个(4)

41、复合条件连接WHERE子句中可以有多个连接条件,称为复合条件连接。例: 查询选修2号课程且成绩在90分以上的所有学生的学号和姓名。 SELECT S.SNO,SNAME FROM S,SC WHERE S.SNO=SC.SNO AND SC.CNO=2 AND SC.GRADE90; 该查询的一种优化(高效)的执行过程是先从SC中挑选出CNO=2并且GRADE90的元组形成一个中间关系,再和S中满足连接条件的元组进行连接得到最终的结果关系。 (4) 复合条件连接WHERE子句中可以有多个连接条件,称为嵌套查询 确定“刘晨”所在系名 SELECT SDEPT FROM S WHERE SNAME

42、=刘晨;结果为:CS 查找所有在CS系学习的学生。 SELECT SNO,SNAME,SDEPT FROM S WHERE SDEPT=CS; 在SQL语言中,一个SELECTFROMWHERE语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询(nested query)。 带有IN谓词的子查询 例:查询与“刘晨”在同一个系学习的学生。先分步来完成此查询,然后再构造嵌套查询。嵌套查询 确定“刘晨”所在系名 查找所有在CS系学将第一步查询嵌人到第二步查询的条件中,构造嵌套查询如下: SELECT SNO,SNAME,SDEPT FROM

43、 S WHERE SDEPT IN (SELECT SDEPT FROM S WHERE SNAME=刘晨 ); 本例中,子查询的查询条件不依赖于父查询,称为不相关子查询。一种求解方法是由里向外处理,即先执行子查询,子查询的结果用于建立其父查询的查找条件。 嵌套查询将第一步查询嵌人到第二步查询的条件中,构造嵌套查询如下:嵌套例: 查询选修了课程名为“信息系统”的学生学号和姓名。 本查询涉及学号、姓名和课程名3个属性。学号和姓名存放在S表中,课程名存放在C表中,但S与C两个表之间没有直接联系,必须通过SC表建立它们二者之间的联系。所以本查询实际上涉及3个关系。 SELECT SNO,SNAME

44、/* 外层在S关系中取出SNO和SNAME */ FROM SWHERE SNO IN (SELECT SNO /* 在SC关系中找出选修了3号课程的学生学号 */ FROM SC WHERE CNO IN (SELECT CNO /* 在C关系中找出“信息系统”的课 FROM C 程号,结果为3号 */ WHERE CNAME=信息系统 ) ); 嵌套查询例: 查询选修了课程名为“信息系统”的学生学号和姓名。 本查询同样可以用连接查询实现: SELECT S.SNO,SNAME FROM S,SC,C WHERE S.SNO=SC.SNO AND SC.CNO=C.CNO AND C.CNA

45、ME=信息系统; 说明: 有些嵌套查询可以用连接运算替代,有些是不能替代的。如果子查询的查询条件依赖于父查询,这类子查询称为相关子查询(Correlated Subquery)。 例: 找出每个学生超过他选修课程平均成绩的课程号。 SELECT SNO,CNO FROM SC X WHERE GRADE=(SELECT AVG(GRADE) /* 某学生的平均成绩 */ FROM SC Y WHERE Y.SNO=X.SNO); 嵌套查询本查询同样可以用连接查询实现:嵌套查询例:查询其他系中比计算机科学系某一学生年龄小的学生姓名和年龄。 SELECT SNAME,AGE FROM S WHER

46、E AGE ANY(SELECT AGE FROM S WHERE SDEPT=CS) AND SdeptCS; 嵌套查询注意这是父查询块中的条件 RDBMS执行此查询时,首先处理子查询,找出CS系中所有学生的年龄,构成一个集合(20,19)。然后处理父查询,找所有不是CS系且年龄小于20或l9的学生。 例:查询其他系中比计算机科学系某一学生年龄小的学生姓名和年龄 子查询的结果是一个关系,可用于这个关系的SQL运算符有:IN,ALL,ANY。多表查询 子查询的结果是一个关系,可用于这个关系的SQL运算符有:I例 对基本表S、SC、C的数据进行检索。 (1) 检索至少有一门成绩超过学生S4一门成

47、绩的学生学号。 SELECT S# FROM SC WHERE GRADESOME(SELECT GRADE FROM SC WHERE S#=S4)多表查询例 对基本表S、SC、C的数据进行检索。多表查询 (2) 检索平均成绩最高的学生学号。 SELECT S# FROM SC GROP BY S# HAVING AVG(GRADE)=ALL(SELECT AVG(GRADE) FROM SC GROUP BY S#); 为什么要这个语句?例:使用运算符IN,求选修了C4课程的学生的学号和姓名。 SELECT S#,SNAME FROM S WHERE S# IN (SELECT S# FR

48、OM SC WHERE C# IN(SELECT C# FROM C WHERE C#=C4) 执行子查询嵌套时由内层向外层逐层处理,外层利用内层的结果。多表查询 (2) 检索平均成绩最高的学生学号。为什么要这个语句?例:多表查询一些带EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换,但所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换。 例:查询与“刘晨”在同一个系学习的学生。 SELECT SNO,SNAME,SDEPT FROM S S1 WHERE EXISTS (SELECT * FROM S S2 WHERE

49、S2.SDEPT=S1.SDEPT AND S2.SNAME=刘晨); 多表查询一些带EXISTS或NOT EXISTS谓词的子查询例: 查询选修了全部课程的学生姓名。 SQL中没有全称量词(FOR ALL)。可将题目的意思转换成等价的形式:查询这样的学生,没有一门课程是他不选修的。其SQL语句为: SELECT SNAME FROM S WHERE NOT EXISTS (SELECT * FROM C WHERE NOT EXlSTS (SELECT * FROM SC WHERE SNO=S.SNO AND CNO=C.CNO); 从而用EXIST/NOT EXIST来实现带全称量词的查

50、询。 多表查询例: 查询选修了全部课程的学生姓名。 多表查询例: 查询至少选修了学生200915122选修的全部课程的学生号码。 本查询可以用逻辑蕴涵来表达:查询学号为x的学生,对所有的课程y,只要200915122学生选修了课程y,则x也选修了y。 也可以将语义表达为:不存在这样的课程y,学生200915122选修了y,而学生x没有选,用SQL语言表示如下: SELECT DISTINCT SNO FROM SC SCX WHERE NOT EXISTS (SELECT * FROM SC SCY WHERE SCY.SNO=200915122 AND NOT EXISTS (SELECT

51、* FROM SC SCZ WHERE SCZ.SNO=SCX.SNO AND SCZ.CNO=SCY.CNO); 多表查询例: 查询至少选修了学生200915122选修的全部课程的学SELECT语句的查询结果是元组的集合,所以多个SELECT语句的结果可进行集合操作。 例: 查询计算机科学系的学生及年龄不大于19岁的学生。 SELECT * FROM S WHERE SDEPT=CS UNION SELECT * FROM S WHERE AGE=19; 本查询实际上是求计算机科学系的所有学生与年龄不大于19岁的学生的并集。使UNION将多个查询结果合并起来时,系统会自动去掉重复元组。如果要

52、保留重复元组则需要换为UNION ALL操作符。 集合操作 (1) SELECT语句的查询结果是元组的集合,所以多个SELECT例: 查询既选修了1号课程又选修了2号课程的全体学生。就是查询选修1号课程的学生集合与选修2号课程的学生集合的交集。 SELECT SNO FROM SC WHERE CNO=l INTERSECT SELECT SNO FROM SC WHERE CNO=2; 本例也可以表示为 SELECT SNO FROM SC WHERE CNO=1 AND SNO IN (SELECT SNO FROM SC WHERE CNO=2); 集合操作 (2) 例: 查询既选修了1

53、号课程又选修了2号课程的全体学生。就是4.4数据更新9/11/2022674.4数据更新9/10/202269主要内容数据插入数据删除数据修改对视图的更新操作主要内容数据插入插入元组 插入元组的INSERT语句的格式为 INSERT INTO (,(属性列2) VALUES( ,);其功能是将新元组插入指定表中,其中新元组的属性列1的值为常量1,属性列2的值为常量2,。INTO子句中没有出现的属性列,新元组在这些列上将取空值。但必须注意的是,在表定义时说明了NOT NULL的属性列不能取空值,否则会出错。如果INTO子句中没有指明任何属性列名,则新插入的元组必须在每个属性列上均有值。数据插入插

54、入元组 数据插入例:将一个新学生元组(学号:200915128;姓名:陈冬;性别:M;所在系:IS;年龄:l8)插入到S表中。 INSERT INTO S(SNO,SNAME,SEX,SDEPT,AGE) VALUES(200915128,陈冬,M,IS,l8);在INTO子句中指出了表名S,指出了新增加的元组在哪些属性上要赋值,属性的顺序可以与CREATE TABLE中的顺序不一样,VALUES子句对新元组的各属性赋值,字符串常数要用单引号(英文符号)括起来。例: 将学生张成民的信息插入到S表中。 INSERT INTO S VALUES(200915126,张成民,M,18,CS); 数据

55、插入例:将一个新学生元组(学号:200915128;姓名:陈冬;例: 插入一条选课记录(200915128,1)。 INSERT INTO SC(SNO,CNO) VALUES(200915128,1); RDBMS将在新插入记录的GRADE列上自动地赋空值。 或者: INSERTINTO SC VALUES(200915128,1,NULL); 因为没有指出SC的属性名,在GRADE列上要明确给出空值。 数据插入例: 插入一条选课记录(200915128,1)。 插入子查询结果 子查询不仅可以嵌套在SELECT语句中,用以构造父查询的条件,也可以嵌套在INSERT语句中,用以生成要插入的批量

56、数据。 插入子查询结果的INSERT语句的格式为 lNSERT INTO ( ,) 子查询;例: 对每一个系,求学生的平均年龄,并把结果存入数据库。首先在数据库中建立一个新表,其中一列存放系名,另一列存放相应的学生平均年龄。 CREATE TABLE DEPT_AGE (SDEPT CHAR(15) AVG_AGE SMALLINT ); 数据插入插入子查询结果 数据插入然后对S表按系分组求平均年龄,再把系名和平均年龄存入新表中。 INSERT INTO DEPT_AGE(SDEPT,AVG_AGE) SELECT SDEPT,AVG(AGE) FROM SGROUP BY SDEPT; 数据

57、插入然后对S表按系分组求平均年龄,再把系名和平均年龄存入新表中。 SQL的删除操作是指从基本表中删除元组,其句法如下:DELETE FROM 基本表名WHERE 条件表达式 其语义是从基本表中删除满足条件表达式的元组。删除语句实际上是“SELECT * FROM基本表名WHERE条件表达式”和DELETE操作的结合,每找到一个元组,就把它删去。应该注意,DELETE语句只能从一个基本表中删除元组。WHERE子句中条件可以嵌套,也可以是来自几个基本表的复合条件。三种删除方式删除某一个元组的值删除多个元组的值带子查询的删除语句数据删除 SQL的删除操作是指从基本表中删除元组,其句法如下:三例: 删

58、除学号为200915128的学生记录。 DELETE FROM S WHERE SNO=200915128; 删除某一个元组的值 例: 删除所有的学生选课记录。 DELETE FROM SC; 这条DELETE语句将使SC成为空表,它删 除了SC的所有元组。 删除多元组的值例: 删除计算机科学系所有学生的选课记录。 DELETE FROM SC WHERE CS= (SELECT SDEPT FROM S WHERE S.SNO=SC.SNO); 带子查询的删除语句数据删除例: 删除学号为200915128的学生记录。 删除修改操作又称为更新操作,其语句的一般格式为 UPDATE SET =

59、,= WHERE ;其功能是修改指定表中满足WHERE子句条件的元组。其中SET子句给出的值用于取代相应的属性列值。如果省略WHERE子句,则表示要修改表中的所有元组。 修改某一个元组的值; 修改多个元组的值; 带子查询的修改语句。 数据修改修改操作又称为更新操作,其语句的一般格式为 数据修改例: 将学生200915121的年龄改为22岁。 UPDATE S SET AGE=22 WHERE SNO=200915121; 例: 将所有学生的年龄增加l岁。 UPDATE S SET AGE=AGE+1; 例:将计算机科学系全体学生的成绩置零。 UPDATE SC SET GRADE=0 WHER

60、E CS= (SELETE SDEPT FROM S WHERE S.SNO=SC.SNO); 修改一个元组的值修改多个元组的值带子查询的修改语句数据修改例: 将学生200915121的年龄改为22岁。 修改视图定义后,就可以像对待基本表一样对视图进行查询(SELECT)操作。但对视图中的元组进行更新操作就不一样了。这是由于视图是不实际存储数据的虚表,对视图的更新最终要转换为对基本表的更新。对于视图元组的更新操作(INSERT、DELETE、UPDATA),有以下三条规则: 如果一个视图是从多个基本表使用联接操作导出的,那么不允许对这个视图执行更新操作。 如果在导出视图的过程中,使用了分组和聚

温馨提示

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

评论

0/150

提交评论