数据库系统原理第4章.ppt

上传人:牧羊曲112 文档编号:5985736 上传时间:2023-09-11 格式:PPT 页数:83 大小:422KB
返回 下载 相关 举报
数据库系统原理第4章.ppt_第1页
第1页 / 共83页
数据库系统原理第4章.ppt_第2页
第2页 / 共83页
数据库系统原理第4章.ppt_第3页
第3页 / 共83页
数据库系统原理第4章.ppt_第4页
第4页 / 共83页
数据库系统原理第4章.ppt_第5页
第5页 / 共83页
点击查看更多>>
资源描述

《数据库系统原理第4章.ppt》由会员分享,可在线阅读,更多相关《数据库系统原理第4章.ppt(83页珍藏版)》请在三一办公上搜索。

1、1,第4章 关系数据库标准语言SQL,主要内容SQL概述 SQL的数据定义SQL的数据查询 数据更新,2,本章主要概念,(1)SQL的数据定义:SQL模式、基本表和索引的创建和撤销。(2)SQL的数据更新:插入、删除和修改语句。(3)SQL的数据查询;SELECT语句的句法,SELECT语句的三种形式及各种限定,基本表的联接操作。,3,结构化查询语言SQL(Structured Query Language)是关系数据库的标准语言,对关系模型的发展和商用DBMS的研制起着重要的作用。SQL语言是介乎于关系代数和元组演算之间的一种语言。本章详细介绍SQL的核心部分内容:数据定义、数据查询、数据更

2、新。,4,4.1 SQL概述 p66,主要内容SQL的产生与发展SQL的组成及特点,5,1、SQL的产生与发展,1970年,美国IBM研究中心的连续发表多篇论文,提出关系模型。1972年,IBM公司开始研制实验型关系数据库管理系统SYSTEM R,配制的查询语言称为SQUARE(Specifying Queries As Relational Expression)语言,在语言中使用了较多的数学符号。1974年,Boyce和Chamberlin把SQUARE修改为SEQUEL(Structured English QUEry Language)语言。后来SEQUEL简称为SQL(Structu

3、red Query Language),即“结构式查询语言”,SQL的发音仍为“sequel”。现在SQL已经成为一个标准。SQL有两个标准:ANSI SQL和1992年通过的修改版本SQL-92(简称SQL2)。还有一个新的标准SQL3,它扩充了SQL2,引入了递归、触发器和对象等概念和机制。,6,2、SQL的组成及特点,SQL语言从功能上可以分为四部分:数据查询(Data Query)、数据操纵(Data Manipulation)、数据定义(Data Definition)和数据控制(Data Control)。核心SQL主要有四个部分:(1)数据定义语言,即SQL DDL,用于定义SQ

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

5、统自动完成。,8,4.2 SQL的数据定义 P68,主要内容 数据库的创建与撤销 定义、修改与删除基本表,9,4.2.1 SQL数据库的体系结构,SQL语言可以对两种基本数据结构进行操作:“表”和“视图”视图是从一个或几个基本表导出的表。它本身不独立存储在数据库中,是一个虚表。基本表是本身独立存在的表,一个(或多个)基本表对应一个存储文件,一个表可以带若干索引,索引也存放在存储文件中。,10,SQL的数据定义功能包括数据库定义、表定义、视图和索引的定义。,11,例:定义一个教务管理数据库JWGL,它包含3个表:学生表:S(SNO,SNAME,SEX,AGE,SDEPT)课程表:C(CNO,CN

6、AME,CPNO,CCREDIT)学生选课表:SC(SNO,CNO,GRADE),学生表实例,学生表选课表实例,12,课程表实例,13,4.2.2 数据库的创建与撤销(增加),1、数据库的创建 在SQL中,一个数据库模式被定义为基本表的集合。对数据库的创建可用CREATE语句实现,其句法如下:CREATE DATABASE AUTHORIZATION 其中AUTHORIZATION 是指该用户获得授予创建和使用数据库的权限。例1,下面语句定义了教务管理数据库的模式:CREATE DATABASE JWGL AUTHORIZATION 张铭 创建的数据库名为JWGL,拥有者为张铭。,14,2、数

7、据库的撤消 当一个数据库及其所属的基本表、视图等元素都不需要时,可以用DROP语句撤消这个数据库。DROP语句的句法如下:DROP DATABASE CASCADE|RESTRICT撤消的方式有以下两种:CASCADE(连锁式)方式:执行DROP语句时,把数据库及其下属的基本表、视图、索引等所有元素全部撤消。RESTRICT(约束式)方式:执行DROP语句时,只有当数据库中没有任何下属元素时,才能撤消数据库,否则拒绝执行DROP语句。例2,要撤消数据库JWGL及其下属所有的元素,可用下列语句实现:DROP DATABASE JWGL CASCADE,15,4.2.3 基本表的定义与删改P68,

8、数据类型 一个属性选用哪种数据类型要根据实际情况来决定,一般要从两个方面来考虑:一是取值范围,二是要做哪些运算。,16,1、定义基本表 定义基本表,就是创建基本表的结构。其一般格式为:CREATE TABLE(列级完整性约束条件,列级完整性约束条件,);建表的同时通常还可以定义与该表有关的完整性约束条件,这些完整性约束条件被存入系统的数据字典中,当用户操作表中数据时由RDBMS自动检查该操作是否违背这些完整性约束条件。注:可选项,可选项,|-在多个短语中选一个。,17,其中:列级完整性约束条件:NOT NULL:限制列取值非空DEFAULT:给定列的默认值UNIQUE:限制列取值不重复CHEC

9、K:限制列的取值范围PRIMARY KEY:指定本列为主码FOREIGN KEY:定义本列为引用其他表的外码,形式如下 FOREIGN KEY()REFERENCES()表级完整性约束性条件:除NOT NULL和DEFAULT不能定义外,其他都可定义,18,例3 建立一个“学生”表S。CREATE TABLE S(SNO CHAR(9)PRIMARY KEY,/*列级完整性约束条件,SNO 是主码*/SNAME CHAR(20)UNIQUE,/*SNAME取唯一值*/SEX CHAR(1),AGE SMALLINT,SDEPT CHAR(20)系统执行上面的CREATE TABLE语句后,就在

10、数据库中建立一个新的空的“学生”表S,并将有关“学生”表的定义及有关约束条件存放在数据字典中。,19,例4 建立“课程”表C。CREATE TABLE C(CNO CHAR(2)PRIMARY KEY,/*列级完整性约束条件,SNO 是主码*/CNAME CHAR(20)UNIQUE,/*CNAME取唯一值*/CPNO CHAR(2),CCREDIT SMALLINT),20,例5 建立学生选课表SC。CREATE TABLE SC(SNO CHAR(9),CNO CHAR(2),GRADE SMALLINT,PRIMARY KEY(SNO,CNO),/*主码由两个属性构成,必须作 为表级完整

11、性进行定义*/FOREIGN KEY(SNO)REFERENCES S(SNO),/*表级完整性约束条件,SNO是外码,被参照表是S*/FOREIGN KEY(CNO)REFERENCES C(CNO)/*表级完整性约束条件,CNO是外码,被参照表是C*/),21,2、修改基本表 SQL语言用ALTER TABLE语句修改基本结构表,其一般格式为:ALTER TABLE ADD COLUMN 完整性约束|DROP COLUMN|ALTER COLUMN;|ADD PRIMARY KEY(列名,n)|ADD FOREIGN KEY(列名)REFERENCES 表名列名 其中是要修改的基本表。AD

12、D子句用于增加新列和新的完整性约束条件;DROP子句用于删除指定的完整性约束条件;ALTER COLUMN子句用于修改原有的列定义。包括修改列名和数据类型。,22,例6 向S表增加“入学时间”列,其数据类型为日期型。ALTER TABLE S ADD S_ENTRANCE DATE;不论基本表中原来是否已有数据,新增加的列一律为空值。,23,3、删除基本表用DROP TABLE语句删除基本表。其一般格式为:DROP TABLE,RESTRICT|CASCADE;若选择RESTRICT:则该表的删除是有限制条件的。欲删除的基本表不能被其他表的约束所引用(如CHECK,FOREIGN KEY等约束

13、),不能有视图,不能有触发器(trigger),不能有存储过程或函数等。如果存在这些依赖该表的对象,则此表不能被删除。若选择CASCADE:则该表的删除没有限制条件。在删除基本表的同时,相关的依赖对象,例如视图,都将被一起删除。缺省情况是RESTRICT。,24,例 删除S表。DROP TABLE S CASCADE,25,4.3 SQL的数据查询 P71,主要内容SELECT语句格式单表查询聚集函数数据分组多表查询集合操作,26,SELECT语句格式,SELECTFROMWHERE句型在关系代数中最常用的式子是下列表达式:A1,An(F(R1Rm)这里R1、Rm为关系,F是公式,A1、An为

14、属性。,27,针对上述表达式,SQL为此设计了SELECTFROMWHERE句型:SELECT A1,AnFROM R1,RmWHERE F 这个句型是从关系代数表达式演变来的,但WHERE子句中的条件表达式F要比关系代数中公式更灵活。,28,SELECT语句的一般格式:SELECT INTO FROM WHERE GROUP BY HAVING ORDER BY ASC|DESC,,主语句SELECT-FROM-WHERE的含义是:根据WHERE子句的条件表达式,从FROM子句指定的基本表或视图中找出满足条件的元组,再按SELECT子句中的目标列表达式,选出元组中的属性值形成结果表。SELE

15、CT子句和FROM子句是必需的。,29,整个语句的执行过程如下:(1)读取FROM子句中基本表、视图的数据,执行笛卡尔积操作。(2)选取满足WHERE子句中给出的条件表达式的元组。(3)按GROUP子句中指定列的值分组,同时提取满足HAVING子句中组条件表达式的那些组。(4)按SELECT子句中给出的列名或列表达式求值输出。(5)ORDER子句对输出的目标表进行排序,按附加说明ASC升序排列,或按DESC降序排列。,30,4.3.1 简单查询 P71,查询表中的若干列 查询指定列 在很多情况下,用户只对表中的一部分属性列感兴趣,这时可以通过在SELECT子句的中指定要查询的属性列。例7:查询

16、全体学生的学号与姓名。SELECT SNO,SNAME FROM S 该语句的执行过程可以是这样的:从S表中取出一个元组,再取出该元组在属性SNO和SNAME上的值,形成一个新的元组作为输出。对S表中的所有元组做相同的处理,最后形成一个结果关系作为输出。显示如第四章编辑图,31,查询全部列 将表中的所有属性列都选出来,可以有两种方法。一种方法就是在SELECT关键字后面列出所有列名;另一种方法是如果列的显示顺序与其在基表中的顺序相同,也可以简单地将指定为“*”。例8:查询全体学生的详细记录。SELECT*FROM S 等价于:SELECT SNO,SNAME,SEX,AGE,SDEPT FRO

17、M S,32,选择表中的若干元组 消除取值重复的行 两个本来并不完全相同的元组,投影到指定的某些列上后,可能变成相同的行了,可以用DISTINCT取消它们。例9:查询选修了课程的学生学号。SELECT SNO FROM SC 该查询结果里包含了许多重复的行。如果想去掉结果表中的重复行,必须指定DISTINCT关键词:SELECT DISTINCT SNO FROM SC,33,查询满足条件的元组查询满足指定条件的元组可以通过WHERE子句实现。,例10:查询计算机科学系全体学生的名单。SELECT SNAME FROM S WHERE SDEPT=CS,34,范围查询谓词BETWEENAND和

18、NOT BETWEENAND可以用来查找属性值在(或不在)指定范围内的元组,其中BETWEEN后是范围的下限(即低值),AND后是范围的上限(即高值)。例11:查询年龄在2023岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。SELECT SNAME,SDEPT,AGE FROM S WHERE AGE BETWEEN 20 AND 23 与BETWEENAND相对的谓词是NOT BETWEENAND。例12:查询年龄不在2023岁之间的学生姓名、系别和年龄。SELECT SNAME,SDEPT,AGEFROM SWHERE AGE NOT BETWEEN 20 AND 23,35,确定

19、集合 谓词IN可以用来查找属性值属于指定集合的元组。例13:查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别。SELECT SNAME,SEX FROM S WHERE SDEPT IN(CS,MA,IS)与IN相对的谓词是NOT IN,用于查找属性值不属于指定集合的元组。例14:查询既不是计算机科学系、数学系,也不是信息系的学生的姓名和性别。SELECT SNAME,SEX FROM S WHERE SDEPT NOT IN(CS,MA,IS),36,字符匹配谓词LIKE可以用来进行字符串的匹配。其一般语法格式如下:NOT LIKE ESCAPE其含义是查找指定的属性

20、列值与相匹配的元组。可以是一个完整的字符串,也可以含有通配符%和_。其中:%(百分号)代表任意长度(长度可以为0)的字符串。例如a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab等都满足该匹配串。_(下划线)代表任意单个字符。例如a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串。,37,例15:查询学号为200915121的学生的详细情况。SELECT*FROM S WHERE SNO LIKE 200915121 等价于:SELECT*FROM S WHERE SNO=200915121如果LIKE后面的匹配串中不含通配符,则可以用

21、=(等于)运算符取代LIKE谓词,用!=或(不等于)运算符取代NOT LIKE谓词。例16:查询所有姓刘的学生的姓名、学号和性别。SELECT SNAME,SNO,SEX FROM S WHERE SNAME LIKE 刘%,38,涉及空值的查询例例17:某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。SELECT SNO,CNO FROM SC WHERE GRADE IS NULL/*分数GRADE是空值*/,39,多重条件查询可用逻辑运算符AND和OR来联结多个查询条件。AND的优先级高于OR,但可以用括号改变优先级。例18:查询计

22、算机科学系年龄在20岁以下的学生姓名。SELECT SNAME FROM S WHERE SDEPT=CS AND AGE20,40,ORDER BY子句用户可以用ORDER BY子句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排列,缺省值为升序。例19 查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列。SELECT SNO,GRADE FROM SC WHERE CNO=3 ORDER BY GRADE DESC对于空值,若按升序排列,含空值的元组将在最后显示。若按降序排列,空值的元组将在最前面显示。,41,以上查询针对的是一个表的查询,若一个查询涉及到两

23、个或两个以上的表,则称之为连接查询。连接查询包括内连接、外连接和交叉查询。在多表查询中,如果要引用不同关系中的同名属性,则需要在属性名前加关系名,即用“关系名.属性名”的形式表示,以便区分。,4.3.2 连接查询 P75,42,连接查询 内连接查询 若两个表的相关字段满足连接条件,则从这两个表中提取数据并组合成新的记录。基本格式:FORM 表1 INNER JOIN 表2 ON,43,连接查询的JOIN子句中用来连接两个表的条件称为连接条件或连接谓词,其一般格式为:.其中比较运算符主要有:=、=、)等。当比较符为等号(=)时,称为等值连接,使用其他运算符的连接称为非等值连接。,44,例20:查

24、询每个学生及其选修课程的情况。学生情况存放在S表中,学生选课情况存放在SC表中,所以本查询实际上涉及S与SC两个表。这两个表之间的联系是通过公共属性SNO实现的。SELECT S.*,SC.*FROM S JOIN SC ON S.SNO=SC.SNO/*将S与SC中同一学生的元组连接起来*/,45,执行步骤:首先在表S中找到第一个元组,然后从头开始扫描SC表,逐一查找与S第一个元组的SNO相等的SC元组,找到后就将S中的第一个元组与该元组拼接起来,形成结果表中一个元组。SC全部查找完后,再找S中第二个元组,然后再从头开始扫描SC,逐一查找满足连接条件的元组,找到后就将S中的第二个元组与该元组

25、拼接起来,再形成结果表中一个元组。重复上述操作,直到S中的全部元组都处理完毕为止。这就是循环嵌套算法的基本思想。,46,(2)自身连接 连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,称为表的自身连接。,47,例21:查询每一门课的间接先修课(即先修课的先修课)。在C表中,只有每门课的直接先修课信息,而没有先修课的先修课。要得到这个信息,必须先对一门课找到其先修课,再按此先修课的课程号,查找它的先修课程。这就将C表与其自身连接。为此,要为C表取两个别名,一个是FIRST,另一个是SECOND。完成该查询的SQL语句为 SELECT FIRST.CNO,SECOND.CPNO

26、FROM C FIRST,C SECOND WHERE FIRST.CPNO=SECOND.CNO,48,(3)外连接如果想输出一些不满足连接条件的元组的信息,只能使用外连接。外连接是只限制一张表中的数据必须满足连接条件,而另一张表中的数据可以不满足连接条件。一般格式:FROM 表1 LEFT|RIGHT OUTER JOIN 表2 ON其中:LEFT OUTER称为左外连接,其含义是:限制表2中的数据必须满足连接条件,而不管表1中的数据是否满足连接条件,均输出表1中的内容;RIGHT OUTER 称为右外连接,其含义是:限制表1中的数据必须满足连接条件,而不管表2中的数据是否满足连接条件,均

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

28、ERE语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询(nested query),也称为子查询。并允许多层嵌套。可以出现在任何能够使用表达式的地方。但ORDER不能出现在子查询中。,51,使用子查询进行基于集合的测试 使用运算符IN或NOT IN,将一个表达式的值与子查询返回的结果进行比较,若该表达式的值与集合中的某个值相等,则测试结果为TRUE;若均不相等,则返回FALSE。,52,例23:查询与“刘晨”在同一个系学习的学生。先分步来完成此查询,然后再构造嵌套查询。,确定“刘晨”所在系名 SELECT SDEPT FROM S

29、WHERE SNAME=刘晨结果为:CS,查找所有在CS系学习的学生。SELECT SNO,SNAME,SDEPT FROM S WHERE SDEPT=CS,53,将第一步查询嵌人到第二步查询的条件中,构造嵌套查询如下:SELECT SNO,SNAME,SDEPT FROM S WHERE SDEPT IN(SELECT SDEPT FROM S WHERE SNAME=刘晨)本例中,子查询的查询条件不依赖于父查询,称为不相关子查询。一种求解方法是由里向外处理,即先执行子查询,子查询的结果用于建立其父查询的查找条件。,54,例24:查询选修了课程名为“信息系统”的学生学号和姓名。本查询涉及学

30、号、姓名和课程名3个属性。学号和姓名存放在S表中,课程名存放在C表中,但S与C两个表之间没有直接联系,必须通过SC表建立它们二者之间的联系。所以本查询实际上涉及3个关系。SELECT SNO,SNAME/*外层在S关系中取出SNO和SNAME*/FROM S WHERE SNO IN(SELECT SNO/*在SC关系中找出选修了3号课程的学生学号*/FROM SC WHERE CNO IN(SELECT CNO/*在C关系中找出“信息系统”的课 FROM C 程号,结果为3号*/WHERE CNAME=信息系统),55,本查询同样可以用连接查询实现:SELECT S.SNO,SNAME FR

31、OM S,SC,C WHERE S.SNO=SC.SNO AND SC.CNO=C.CNO AND C.CNAME=信息系统 说明:有些嵌套查询可以用连接运算替代,有些是不能替代的。,56,2、使用子查询进行比较测试如果子查询的查询条件依赖于父查询,这类子查询称为相关子查询(Correlated Subquery)。通过比较运算符(=、=、=(SELECT AVG(GRADE)/*某学生的平均成绩*/FROM SC Y WHERE Y.SNO=X.SNO),57,例26:查询其他系中比计算机科学系某一学生年龄小的学生的姓名和年龄。SELECT SNAME,AGE FROM S WHERE AG

32、ECS,注意这是父查询块中的条件,RDBMS执行此查询时,首先处理子查询,找出CS系中所有学生的年龄,构成一个集合(20,19)。然后处理父查询,找所有不是CS系且年龄小于20或l9的学生。,58,3、使用子查询进行存在性测试使用EXISTS谓词,当子查询中有满足条件的数据时,EXISTS返回的结果为真值,否则为假值。例27:找出学习课程为“数据库”的学生姓名。SELECT SNAME FROM SWHERE EXISTS(SELECT*FROM SC,CWHERE S.SNO=SC.SNO AND C.CNAME=数据库)注意:先执行外层查询,再执行内层查询在子查询中的目标列名序列通常都用“

33、*”,59,还可使用NOT EXISTS谓词,当子查询中至少有一个满足条件的数据时,返回的结果为假值,都不满足时为真值。例28:找出学习课程没有选修“数据库”这门课的学生姓名。SELECT SNAME FROM SWHERE NOT EXISTS(SELECT*FROM SC,CWHERE S.SNO=SC.SNO AND C.CNAME=数据库),60,子查询的结果是一个关系,可用于这个关系的SQL运算符有:IN,ALL,ANY。,61,4.3.4 使用库函数查询P81,SQL 提供的常用统计函数称为库函数。SQL还提供了聚集函数用来增强检索功能:聚合函数是涉及整个关系的另一类运算操作。通过

34、聚合函数,可以把某一列中的值形成单个值。SQL不仅允许聚合属性上的值,而且可以按照某个准则将关系中的元组分组。,62,COUNT(*)计算元组的个数。COUNT(列名)对一列中的值计算个数。SUM(列名)求某一列值的总和(此列的值必须是数值型)。AVG(列名)求某一列值的平均值(此列的值必须是数值型)。MAX(列名)求某一列值的最大值。MIN(列名)求某一列值的最小值。,如果指定在列名前面指明DISTINCT短语,则表示在计算时要取消指定列中的重复值。如果不指定DISTINCT短语或指定ALL短语(ALL为缺省值),则表示不取消重复值。,63,例29:查询选修了课程的学生人数。SELECT C

35、OUNT(DISTINCT SNO)FROM SC 学生每选修一门课,在SC中都有一条相应的记录。一个学生要选修多门课程,为避免重复计算学生人数,必须在COUNT函数中用DISTINCT短语。,64,例30:计算选修1号课程的学生平均成绩。SELECT AVG(GRADE)FROM SC WHERE CNO=1 例31:查询选修1号课程的学生最高分数。SELECT MAX(GRADE)FROM SC WHER CNO=1,65,关系是元组的集合,可以进行集合运算。集合运算包括:并UNION、差MINUS、交INTERSECTION。SELECT语句的查询结果是元组的集合,所以多个SELECT语

36、句的结果可进行集合操作。,4.3.5 集合运算查询P84,66,例32:查询计算机科学系的学生及年龄不大于19岁的学生。SELECT*FROM S WHERE SDEPT=CS UNION SELECT*FROM S WHERE AGE=19 本查询实际上是求计算机科学系的所有学生与年龄不大于19岁的学生的并集。使UNION将多个查询结果合并起来时,系统会自动去掉重复元组。如果要保留重复元组则需要换为UNION ALL操作符。,67,例33:查询既选修了1号课程又选修了2号课程的全体学生。就是查询选修1号课程的学生集合与选修2号课程的学生集合的交集。SELECT SNO FROM SC WHE

37、RE CNO=1 INTERSECTION SELECT SNO FROM SC WHERE CNO=2;本例也可以表示为 SELECT SNO FROM SC WHERE CNO=1 AND SNO IN(SELECT SNO FROM SC WHERE CNO=2),68,4.4数据更新 P85,主要内容数据插入数据删除数据修改,69,前面介绍使用SELECT 语句查询数据库中的数据,但不会使数据库中的数据发生变化。若要对数据进行各种更新的操作,如添加、修改、删除,则需使用数据修改语句INSERT、UPDATE、DELETE来完成。,70,插入数据有两种格式:一种向具体元组插入常量数据;(

38、一行)另一种是把从子查询的结果输入到另一个关系中去。(多行),4.4.1 数据插入,71,1、插入元组 插入元组的INSERT语句的格式为 INSERT INTO(,()VALUES(,)其功能是将新元组插入指定表中,其中新元组的属性列1的值为常量1,属性列2的值为常量2,。INTO子句中没有出现的属性列,新元组按表中原顺序逐一赋给对应列。但必须注意的是,在表定义时说明了NOT NULL的属性列不能取空值,否则会出错。如果INTO子句中没有指明任何属性列名,则新插入的元组必须在每个属性列上均有值。,72,例34:将一个新学生元组(学号:200915128;姓名:陈冬;性别:M;所在系:IS;年

39、龄:l8)插入到S表中。INSERT INTO S(SNO,SNAME,SEX,SDEPT,AGE)VALUES(200915128,陈冬,M,IS,l8)在INTO子句中指出了表名S,指出了新增加的元组在哪些属性上要赋值,属性的顺序可以与CREATE TABLE中的顺序不一样,VALUES子句对新元组的各属性赋值,字符串常数要用单引号(英文符号)括起来。例35:将学生张成民的信息插入到S表中。INSERT INTO S VALUES(200915126,张成民,M,18,CS),73,例36:插入一条选课记录(200915128,1)。INSERT INTO SC(SNO,CNO)VALUE

40、S(200915128,1)RDBMS将在新插入记录的GRADE列上自动地赋空值。或者:INSERT INTO SC VALUES(200915128,1,NULL)因为没有指出SC的属性名,在GRADE列上要明确给出空值。,74,2、插入子查询结果 子查询不仅可以嵌套在SELECT语句中,用以构造父查询的条件,也可以嵌套在INSERT语句中,用以生成要插入的批量数据。插入子查询结果的INSERT语句的格式为 lNSERT INTO(,)子查询,75,例37:对每一个系,求学生的平均年龄,并把结果存入数据库。首先在数据库中建立一个新表,其中一列存放系名,另一列存放相应的学生平均年龄。CREAT

41、E TABLE DEPT_AGE(SDEPT CHAR(15),AVG_AGE SMALLINT),76,然后对S表按系分组求平均年龄,再把系名和平均年龄存入新表中。INSERT INTO DEPT_AGE(SDEPT,AVG_AGE)SELECT SDEPT,AVG(AGE)FROM S GROUP BY SDEPT,77,修改操作又称为更新操作,其语句的一般格式为 UPDATE SET=,=WHERE;其功能是修改指定表中满足WHERE子句条件的元组。其中SET子句给出的值用于取代相应的属性列值。如果省略WHERE子句,则表示要修改表中的所有元组。修改某一个元组的值;修改多个元组的值;带子

42、查询的修改语句。,4.4.2 数据修改 P86,78,例38:将学生200915121的年龄改为22岁。UPDATE S SET AGE=22 WHERE SNO=200915121 例39:将所有学生的年龄增加l岁。UPDATE S SET AGE=AGE+1 例40:将计算机科学系全体学生的成绩置零。UPDATE SC SET GRADE=0 WHERE CS=(SELETE SDEPT FROM S WHERE S.SNO=SC.SNO),修改一个元组的值,修改多个元组的值,带子查询的修改语句,79,SQL的删除操作是指从基本表中删除元组,其句法如下:DELETE FROM 基本表名WH

43、ERE 条件表达式 其语义是从基本表中删除满足条件表达式的元组。删除语句实际上是“SELECT*FROM基本表名WHERE条件表达式”和DELETE操作的结合,每找到一个元组,就把它删去。应该注意,DELETE语句只能从一个基本表中删除元组。WHERE子句中条件可以嵌套,也可以是来自几个基本表的复合条件。,4.4.3 数据删除 P86,80,三种删除方式删除某一个元组的值删除多个元组的值带子查询的删除语句,81,例41:删除学号为200915128的学生记录。DELETE FROM S WHERE SNO=200915128,删除某一个元组的值,例42:删除所有的学生选课记录。DELETE FROM SC 这条DELETE语句将使SC成为空表,它删 除了SC的所有元组。,删除多元组的值,82,例43:删除计算机科学系所有学生的选课记录。DELETE FROM SC WHERE CS=(SELECT SDEPT FROM S WHERE S.SNO=SC.SNO),带子查询的删除语句,83,作业:P87:2,3上机P284实验3P289实验4,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号