第5章关系数据库的标准语言SQL.pdf

上传人:g****s 文档编号:86090947 上传时间:2023-04-13 格式:PDF 页数:34 大小:1.74MB
返回 下载 相关 举报
第5章关系数据库的标准语言SQL.pdf_第1页
第1页 / 共34页
第5章关系数据库的标准语言SQL.pdf_第2页
第2页 / 共34页
点击查看更多>>
资源描述

《第5章关系数据库的标准语言SQL.pdf》由会员分享,可在线阅读,更多相关《第5章关系数据库的标准语言SQL.pdf(34页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第 5 章 关系数据库的标准语言 SQL 目 录 第 5 章 关系数据库的标准语言 SQL.90 本章主要内容.90 5.1 SQL 概述.90 5.2 SQL 的数据定义.91 5.2.1 数据类型.92 5.2.2 基本表模式的定义.92 5.2.2 基本表的修改和删除.95 5.2.3 域.96 5.3 数据查询.97 5.3.1 SQL 查询语句格式.97 5.3.2 简单查询.98 5.3.3 复杂查询.100 5.4 聚集函数(Aggregation).106 5.4.1 聚集函数的运算符.106 5.4.2 数据分组.106 5.4.3 数据排序.107 5.5 数据库更新.10

2、9 5.5.1 元组插入.109 5.5.2 元组删除.109 5.5.3 元组修改.110 5.6 视图.111 5.6.1 视图定义.111 5.6.2 视图查询.112 5.6.3 视图更新.112 5.6.4 视图删除.113 5.6.5 视图的作用.113 5.7 嵌入式 SQL.114 5.7.1 程序设计环境下的 SQL.114 5.7.2 单行选择语句.116 5.7.3 游标.117 5.8 动态 SQL.120 5.8.1 非查询类动态 SQL.120 5.8.2 查询类动态 SQL.121 90 第 5 章 关系数据库的标准语言 SQL 目前大部分的 MIS/ERP 系统

3、都是建立在关系数据库基础上,都是是用户对数据库中数据进行读写操作。用户主要通过结构化查询语言 SQL(Structured Query Language)语言数据库进行各式各样的操作,例如查询、增、删、修改数据、定义和修改数据模式等。SQL 是一个通用的功能极强的关系数据库标准语言,目前,SQL 语言已经被确定为关系数据库系统的国际标准,已被绝大多数商品化的关系数据库系统采用。本章主要内容 本章介绍关系数据库标准语言 SQL。主要内容包括:数据定义、数据操纵、数据控制和数据约束等。本章的主要概念:(1)SQL 数据库的体系结构,SQL 的组成。(2)SQL 的数据定义:SQL 模式、基本表和索

4、引的创建和撤销。(3)SQL 的数据查询;SELECT 语句的句法,SELECT 语句的三种形式及各种限定,基本表的联接操作,SQL3 中的递归查询。(4)SQL 的数据更新:插入、删除和修改语句。(5)视图的创建和撤消,对视图更新操作的限制。(6)嵌入式 SQL:预处理方式,使用规定,使用技术,卷游标,动态 SQL 语句。5.1 SQL 概述 1)SQL 的发展历程 SQL 语言 1974 年由 Boyce(博伊斯)和 Chamberlin(张伯伦)提出,并首先在 IBM 公司研制的关系数据库系,统 System R 上实现。由于它具有功能丰富、使用方便灵活、语言简洁易学等突出的优真,深受计

5、算机工业界和计算机用户的欢迎。1986 年 10 月,经美国国家标准局(ANSI)的数据库委员会批准了 SQL 作为关系数据库语言的美国标准,同年公布了标准SQL 文本。1987 年 6 月国际标准化组织(ISO)将其采纳为国际标准,这个标准被称为“SQL86”。之后 SQL 标准化工作不断地进行着,相继出现了“SQL89”、“SQL2(SQL92)”、“SQL3”(1999)。SQL3 扩充了 SQL2,具有 SQL2 所没有的新特点,引人了递归、触发器和对象等概念和机制。SQL 已成为关系数据库领域中的一个主流语言,对关系数据库技术的发展和推广应用产生了非常深远的影响。首先,各个数据库产品

6、厂家纷纷推出了自己的支持 SQL 的软件或与 SQL 接口的软件。而且发展趋势是:各种计算机(不管是微机、小型机或是大型机)上的数据库系统,都采用 SQL 作为共同的数据存取语言和标准接口。其次,SQL 在数据库以外的其他领域也受到了重视。不少软件产品将 SQL 的数据检索功能与面向对象技术、图形技术、软件工程工具、软件开发工具、人工智能语言等相结合,开发出功能更强的软件产品。2)SQL 数据库的体系结构:SQL 数据库的体系结构基本上也是三级模式结构(如图 5-1 所示)。91 图 5-1 SQL 数据库的体系结构 由 SQL 数据库的体系结构可以看出,在 SQL 中,视图对应于关系模型的外

7、模式,基本表对应于关系模型的模式,存储文件对应于关系模型的内模式。下面对基本表、视图、存储文件等 SQL 数据库中的基本概念作以简单的介绍:(1)基本表(Base Table)。简称基本表,是数据库中实际存在的关系。(2)视图。SQL 用视图(View)概念支持非标准的外模式概念。视图是从一个或几个基本表导出的表,虽然它也是关系形式,但它本身不实际存储在数据库中,只存放对视图的定义信息(没有对应的数据)。因此,视图是一个虚表(Virtual Table)或虚关系(详见 5.7 节),而基本表是一种实关系(Practical Relation)。(3)存储文件。每个基本表对应一个存储文件,一个基

8、本表还可以带一个或几个索引,存储文件和索引一起构成了关系数据库的内模式。SQL 数据库的体系结构具有如下特征:一个 SQL 模式是表和约束的集合。一个表(TABLE)是行的集合。每行是列的序列,每列对应一个数据项。一个表可以是一个基本表,也可以是一个视图。基本表是实际存储在数据库中的表,视图是从基本表或其他视图中导出的表。视图是一个虚表,它存储在数据库中只是其定义,而不存放视图的数据,视图中的数据仍存放在导出该视图的基本表中。一个基本表可以跨一个或多个存储文件,一个存储文件也可存储一个或多个基本表。用户可以用 SQL 语句对视图和基本表进行查询等操作。SQL 用户可以是应用程序,也可以是终端用

9、户。3)SQL 的组成 SQL 语言从功能上可以分为四部分:数据定义、数据查询、数据操纵、和数据控制。(1)数据定义语言(Data Definition Language,简称 DDL)用于定义 SQL 模式、基本表、视图和索引。(2)查询语言(Query Language,简称 QL)用于数据查询。(3)数据操纵语言(Data Manipulation Language,简称 DML)用于数据的增、删、修改。(4)数据控制语言(Data Control Language,简称 DCL)用于数据访问权限的控制。5.2 SQL 的数据定义 视图 V1 用户 1 视图 V2 基本表 B1 基本表

10、B2 基本表 B3 基本表 B4 存储文件 S1 存储文件 S2 存储文件 S3 存储文件 S4 用户 2 用户 3 用户 4 SQL 用户 外模式 模式 内模式 92 5.2.1 数据类型 所有的关系属性都用一个数据类型加以描述,定义基本表时必须明确说明每个属性的数据类型。SQL 提供的基本数据类型有:定长或变长字符串,定长或变长位串,整型数,浮点数,日期型和时间型等。如表 51 所示。数据类型 说明符 备注 定义字符串 CHAR(n)按固定长度 n 存储字符串,如果实际字符串长度长小于 n,后面填空格符;如果实际字符串长大小 n,则报错。变长字符串 VARCHAR(n)按实际字符串长度存储

11、,但字符长度不得超过 n,则报错。整数 INT 常见的长整数,字长 32 位 短整数 SMALLINT 字长 16 位 十进制数 DECIMAL(n,d)n 为十进制数总位数(包括小数点),d 为小数据点后的十进制位数 浮点数 FLOAT 一般指双精度浮点数,即字长 64 位 定长位串 BIT(n)二进制位串,长度为 n,n 的缺省值为 1 变长位串 BITVARING(n)按实际二进制位串存储,但最长不得超过 n 位,否则报错 日期 DATE 格式为“yyyymmdd”,yyyy 表示年份,范围为 00019999;mm表示月份,范围为 112;dd 表示日,范围为 131。时间 TIME

12、格式为“hhmmss”,hh 表示小时,范围为 024;mm 为分钟,ss 表示秒,范围都是 059 时标 TIMESTAMP 格式为“yyyymmddhhmmssnnnnnn”,其中“nnnnnn”表示微秒,范围为 099999,其他符号的意义同上。5.2.2 基本表模式的定义 定义基本表模式的语句格式如图 52 所示。93 图中椭圆形框中的内容是关键字,方框中的内容是非终结符,圆圈中的内容是终结符。对表的每一个列除了说明列名和类型为,还有两个选项:1)是 NOT NULL,是个可选项,加上此选项后,则此列不得设置为 NULL,在 NOT NULL 后可加 UNIQUE 选项,表示该列值不得

13、重复;2)是 DEFAULT,加上此选项后,当此列的值空缺时,填以缺省值。缺省值有三种:一种是事先定义的字值,例如类型为数值的列置为 0 等;另一种是用户标识符,这在某些应用中很有用处,例如银行储蓄常常须在其帐目上加本储蓄所名,有了这种缺省值后,可以在输入时避免多次重复输入本储蓄所名,而由系统按缺省规则自动填补;最后一种是置为 NULL,当然在此情况下,前面不能再加 NOT NULL 任选项。在定义基本表时,可以定义一个主键和多个外健,这也是任选项。在定义外健时,要用关键字 REFERENCES 定义外键来自的表名,即主表名;还可以加引用完整性任选项 ON DELETE,即当主表中被引用的主健

14、姗除时,为了不破坏引用完整性约束,提供了三种可能的处理办法:一是用 RESTRICT 选项,凡是被基本表所引用的主健,不得删除;二是用 CASCADE 选项,如主表中删除了某一主键,则加此选项的基本表中引用此主健的行也随之被删除;三是用 SET NULL 选项,当然,该列应无 NOT NULL 说明。其中 RESTRICT 为其缺省选项。在基本表定义中,还加了一个可选的 CHECK 子句。利用此子句,可以说明各列的值应满足的限制条件,例如年龄不得为负,工龄不得大于年龄等。1)基本表的定义 定义基本表的语句格式为 CREATE TABLE表名(属性名 1类型 1NOT NULL UNIQUE,属

15、性名 2类型 2 NOT NULL UNIQUE)其他参数;其中,带有任选项“NOT NULL”的属性的值不允许为空值,而任选项“UNIQUE表示该属性上的值不得重复;“其他参数”是与物理存储有关的参数,因具体系统而异。例 5-1:学生成绩数据库含有三张表:学生关系:S(SNO,SNAME,SEX,AGE,DNAME)课程关系:C(CNO,CNAME,CREDIT,PRE_CNO)选课关系:SC(SNO,CNO,SCORE),可用下列 SQL 语句来实现:CREATE TABLE S (SNO CHAR(6)PRIMARY KEY,SNAME CHAR(8)NOT NULL,SEX CHAR(

16、1),AGE SMALLINT,DNAME VARCHAR(12);CREATE TABLE C (CNO CHAR(2)NOT NULL,CNAME VARCHAR(24)NOT NULL,CREDIT SMALLINT,PRE_CNO CHAR(2),94 PRIMARY KEY(CNO);CREATE TABLE SC (SNO CHAR(6)NOT NULL,CNO CHAR(2)NOT NULL,SCORE SMALLINT,PRIMARY KEY(SNO,CNO),FOREIGN KEY(SNO)REFERENCES S ON DELETE CASCADE,FOREIGN KEY(

17、CNO)REFERENCES C ON DELETE RESTRICT);该语句执行后,就在数据库中建立三个新的空表 S,C,SC,并将关于该表的定义信息存放在数据字典中。注意:SQL 中空值的概念。空值是一种不知道或不能引用的值,既不是空字符串,也不是数值零。任何属性都可以有空值,除非像例 5-1 中的 SNO 和 SNAME 那样,被说明为 NOT NULL。2)主关键字定义 关键字是关系数据库中最为重要的约束。在 CREATE TABLE 中声明一个主关键字的方法有两种:一是使用保留字 PRIMARY KEY 主关键字)。二是使用保留字 UNIQUE。在一个表中只有一个 PRIMARY

18、KEY,但可能有几个 UNIQUE。一个关系的主关键字由一个或几个属性构成,在 CREATE TABLE 中声明主关键字的方法是:(1)在列出关系模式的属性时,在属性及其类型后加上保留字 PRIMARY KEY,表示该属性是主关键字;(2)在列出关系模式的所有属性后,再附加一个声明:PRIMARY KEY(,)如果关键字由多个属性构成,则必须使用第二种方法。例如,若要把例 5-1 中的课程关系用第二种方法来创建的。如果使用保留字 UNIQUE 来说明关键字,则它可以出现在 PRIMARY KEY 出现的任何地方,不同的是,它可以在同一个关系模式中出现多次。例如,在不出现同名同姓的情况下也可以将

19、上面的定义改写为:CREATE TABLE S (SNO CHAR(6)UNIQUE,SNAME CHAR(8)UNIQUE,SEX CHAR(1),AGE SMALLINT,DNAME VARCHAR(12);3)外部关键字的定义 参照完整性是关系模式的另一种重要约束。根据参照完整性的概念,当一个关系(称为主关系或主表)的某个或某几个属性被说明为外部关键字的时候,要引用或参照第二个关系(被参照关系)的某个或某几个属性。这意味着:(1)被参照属性必须是该关系的主关键字。95(2)对于主关系中外部关键字的任何值,也必须出现在被参照关系的相应属性上,即,参照完整性约束把这两个属性或属性集联系起来了

20、。在 SQL 中,有两种方法用于说明一个外部关键字:第一种方法是,如果外部关键字只有一个属性,可以在它的属性名和类型后面直接用REFERENCES说明它参照了某个表的某些属性(必须是主关键字),其格式为:REFERENCES 表名(属性)另一种方法是,在 CREATE TABLE 语句的属性列表后面增加一个或几个外部关键字说明,其格式为:FOREIGN KEY 属性 REFERENCES 表名()其中,第一个“属性”是外部关键字,第二个“属性”是被参照的属性。例 5.2 例如在例 5.1 中的选课关系 SC 就是采用后一种方法创建的。5.2.2 基本表的修改和删除 在基本表建立后,可以根据实际

21、需要对基本表的结构进行修改,即增加新的属性和删除原有的属性。1)增加新的属性的语句为 ALTER TABLE 表的创建者名.表名 ADD属性名类型;例如:在表 S 中增加属性“BIRTHDATE”,“HOSTADDR”和“COMMADDR”:ALTER TABLE S ADD BIRTFIDATE DATE;ALTER TABLE S ADD HOSTADDR VARCHAR(32);ALTER TABLE S ADD COMMADDR VARCHAR(32);2)删除原有属性的语句为 ALTER TABLE 表名 DROP 属性名 CASCADE|RESTRICT;此外 CASCADE 方式

22、表示:在基本表中删除某属性时,所有引用到该属性的视图和约束也要一起自动删除。而 RESTRICT 方式表示在没有视图或约束引用属性时,才能在基本表中删除该属性,否则拒绝删除操作。注意,若一个属性被说明为 NOT NULL,则不允许修改或删除。例如:在表 S 中“AGE”:ALTER TABLE S DROP AGE;3)基本表的删除 在 SQL 中删除一个无用表的操作是非常简单的,其语句格式为:DROP TABLE 表名;执行该语句后,将把一个基本表的定义信息连同表中的所有记录、该表的所有索引以及根据该表导出的所有视图一并删除,并释放相应的存储空间。4)补充定义主键 由于 SQL 并不要求每个

23、表都定义主键,在需要时可以通过补充定义主键命令来定义主键。ALTER TABLE 表名 ADD PRIMARY KEY();5)撤销主键定义 如果定义了主键,系统一般在主键自动建立索引,并在插入新行时,进行主键唯一性检查。这在插入大批数据行时,会严重地影响系统的性能,可以利用下列的主键撤销命令,来 96 暂时撤销主键定义。ALTER TABLE 表名 DROP PRIMARY KEY;6)补充定义外键 ALTER TABLE 表名 ADD FOREIGN KEY 属性 REFERENCES 表名()ON DELETE RESTRICT|CASCADE|SET NULL;7)撤消外键定义 ALT

24、ER TABLE 表名 DROP FOREIGN KEY 5.2.3 域 说明属性类型的另一种方法是,首先定义一个域(Domain),作为某个数据类型的新的名称,然后引用该域名来说明属性类型。几个属性可以公用同一个域名。定义一个域的方法是 CREATE DOMAIN 域名 AS 数据类型;通过已定义域名来说明一个属性类型,其格式是:属性名 1,属性名 2,域名;例如:为表 S 的 HOSTADDR 和 COMMADDR 定义一个域 ADDRDOMAIN:CREATE DOMAIN ADDRDOMAIN AS VARCHAR(36)DEFAULT unknow;域“ADDRDOMAIN”可用于同

25、时说明属性“HOSTADDR”和“COMMADDR”的类型。例如“HOSTADDR,COMMADDR ADDRDOMAIN;删除一个域定义的语句是:DROP DOMAIN 域名;5.2.5 索引的建立和删除 在关系数据库中,为了提高检索数据库基本表的效率和速度,往往采用索引技术。借助于索引结构,可以迅速查找到某个属性 A 具有指定值的那些元组。对一个基本表,可以按需要建立若干个索引,以便提供多种存取路径。例如,在表 S 中可以根据 SNO,SNAME 等单个属性分别建立相应的索引,还可以把SNAME,SEX,AGE 等属性组合起来建立索引(线性组合索引)。索引的建立和删除必须是DBA 或表的主

26、人,而存取路径的选择则由系统自动进行。建立索引的语句格式为:CREATE UNIQUE INDEX 索引名 ON 基本表名(ASC|DESC,ASC|DESC);其中:ASC 表示升序,DESC 表示降序),默认值为 ASC;任选项UNIQUE表示,若表中有多个记录的索引关键字的值相同,则只有排在最前面的那个关键字值进入索引,这时,每一个索引项只对应惟一的数据记录。若省略任选项“UNIQUE,则所有记录的索引关键字值全部进入索引文件。例如,对表 S 建立以下索引 CREATE UNIQUE INDEX SNO_INDEX ON S(SNO);CREATE UNIQUE INDEX SNAME_

27、ADDR_INDEX ON S(SNAME ASC,HOSTADDR DESC);当需要删除一个索引的时候,可使用下面的语句:DROP INDEX 索引名;执行该语句后,在删除索引的同时,也把有关索引的描述信息从数据字典中删除了。97 5.3 数据查询 5.3.1 SQL 查询语句格式 数据查询是 SQL 的核心功能。查询语句的基本部分是一个 SELECT-FROM-WHERE 查询块:SELECT FROM(或视图)WHERE 条件表达式;其含义是,根据 WHERE 子句中的条件表达式,从基本表中找出满足条件的元组,并按 SELECT 子句中指出的属性,选出元组中的分量形成结果表。实际上,S

28、ELECT 子句所完成的功能类似于关系代数中的投影运算,而 WHERE 子句的功能类似于关系代数中的选择运算。下面我们再回顾一下在前面第四章关系数据库方法已介绍过的关系代数中最常用的一个表达式:)RR(n1A,Am1F 这里 R1,,Rm为关系;F 是公式,A1,,An为属性。针对上述表达式,SQL 为此设计了 SELECTFROMWHERE 句型为:SELECT A1,,An FROM R1,,Rm WHERE F 可见SELECTFROMWHERE这个句型是从关系代数表达式演变而来的,但WHERE子句中的条件表达式 F 要比关系代数中的公式更加灵活。在 WHERE 子句的条件表达式 F 中

29、可使用下列运算符:算术比较运算符:、或!。逻辑运算符:AND、OR、NOT。集合运算符:IN、NOT IN。谓词:EXISTS(存在量词)、ALL、SOME、UNIQUE。聚合函数:AVG、MIN、MAX、SUM、COUNT。F 中运算对象还可以是另一个 SELECT 语句,即 SELECT 语句可以嵌套。SQL 中 SELECT 语句的格式为:SELECT DISTINCT FROM(或视图)WHERE 条件表达式;GROUP BY HAVING ORDER BY 属性列 1ASC|DESC,SELECT 语句包括 SELECT 子句、FROM 子句两个基本子名,还包括:WHERE 子句(行

30、条件子句)、GROUP BY 子句(分组子句)、HAVING 子句(组条件子句)、ORDER BY 子句(排序子句)等可选子句。整个 SELECT 语句的执行过程如下:(1)读取 FROM 子句中基本表、视图的数据,执行笛卡儿积操作。(2)选取满足 WHERE 子句中给出的条件表达式的元组。(3)按 GROUP 子句中指定的属性列的值分组,同时提取满足 HAVING 子句中组条件表 98 达式的那些元组。(4)按 SELECT 子句中给出的属性列或列表达式求值输出。(5)ORDER 子句对输出的结果进行排序,按 ASC 升序排列或 DESC 降序排列。SQL 查询语句的格式用图表示如下:5.3

31、.2 简单查询 最简单的 SQL 查询只涉及到一个关系,类似于关系代数中的选择运算。例如:关系代数中的选择运算DNAME计算机(S)的 SQL 查询语句如下例 5-5。例 5-5:在表 S 中找出计算机系学生的学号、姓名等信息。SELECT SNO,SNAME,ADDR,SEX,AGE,DNAME FROM S WHERE DNAME计算机;例如在上一章中的学生关系表的数据如图(a)所示,查询结果如图(b)所示:(a)学生关系表 SNO SNAME AGE SEX DNAME S1 程宏 19 男 计算机 S3 刘莎莎 18 女 电子 S4 李刚 20 男 自动化 S6 蒋天峰 19 男 电气

32、 S9 王敏 20 女 计算机 (b)例 5-5 查询结果 SNO SNAME AGE SEX DNAME S1 程宏 19 男 计算机 S9 王敏 20 女 计算机 99 本例中用 WHERE 子句给出限定条件,用 SELECT 子句指定结果表中的属性。但是,这种一一列出所有属性名的方法太烦琐了,可用通配符“*”简化表示。例 5-6:求计算机系学生的详细信息。SELECT*FROM S WHERE DNAME=计算机;1)SQL 中的投影 利用 SELECT 子句指定属性的功能完成关系代数中的投影运算。例 5-7:在表 S 中找出计算机系学生的学号和姓名。SELECT SNO,SNAME F

33、ROM S WHERE DNAME=计算机;提问:大家想一想例5-7的关系代数表达式如何描述,以及执行的结果是什么?有时候,我们希望结果表中的某些属性名不同于基本表中的属性名,这时,可以在SELECT 子句中增加保留字“AS”和相应的别名。例 5-8:将例 5-7 结果表中的 SNO 换名为 XH,将 SNAME 改为 XM:SELECT SNO AS XH,SNAME AS XM FROM S WHERE DNAME计算机;SELECT 子句中可以出现计算表达式,从而可以查询经过计算的值。例 5-9:求学生的学号和出生年份。SELECT SNO,2004-AGE FROM S;SELECT

34、后面可以是属性名,也可以是属性名与常数组成的算术表达式,还可以是字符串。例 5-10:将例 5-9 改为:SELECT SNO,BIRTH_ YEAR:,2004-AGE FROM S;2)SQL 中的选择运算 通过在 WHERE 子句中指定相应的条件表达式,完成关系代数中的选择运算。WHERE中条件表达式 F 在上一节(5.3.1)已介绍过。例 5-11:列出表 S 中计算机系年龄小于 20 岁的学生的情况。SELECT FROM S WHERE DNAME 计算机 AND AGE20;3)字符串的比较 SQL 允许说明不同类型的字符串,如定长字符串或变长字符串,它们的实际存储方式依赖于具体

35、系统。通过比较运算符可以对字符串进行比较。比较时按照字典序进行。例如,设有字符串 A=ala2an和 B=b1b2bm,如果 a1 b1,或者 al=b1,且 a2b2等等,则 AB。SQL 还提供了根据模式匹配原理比较字符串的能力,其格式是:s LIKE p 其中:s 是字符串,p 是一个模式。模式 p 中可以出现两个特殊的字符“”和“_”(半字下划线)。如果 p 中不出现这两个特殊字符,则 p 中的字符只与 s 中相应位置上的字符匹配。当 p 100 中含有时,它可以与 s 中任何序列的 0 个或多个字符进行匹配;而当 p 中出现符号“_”时,它可以与 s 中任何一个字符匹配。当且仅当字符

36、串 s 与模式 p 相匹配时,表达式 s LIKE p 的值才为真。反之,当且仅当字符串 s 不与模式 p 匹配时,表达式 s NOT LIKE p 的值才为真。在我们 MIS/ERP 系统中大都是采用这种模式匹配功能来实现模糊查询的。例 5-12:在表 S 中找出其姓名中含有“李”的学生。SELECT*FROM S WHERE SNAME LIKE李;5.3.3 复杂查询 SQL 可以表达复杂的查询条件,进行多表连接的复杂查询运算。SQL 的查询条件的格式如图所示。101 下面列举一些特例,来描述一下 SQL 复杂查询运算:1)SQL 中的笛卡儿积和连接运算 SQL 在一个查询中建立几个关系

37、之间联系的方法非常简单,只要在 FROM 子句中列出这些关系就可以了,然后,在 SELECT 和 WHERE 子句就可以引用这些关系中的任何属性。为了避免几个关系中具有相同的属性名时而引起的混淆,引用时可以采用属性名或*的方式。如例 5-14:查询所有学生的情况以及他们选修课程的课程号和得分。SELECT S.*,SC.CNO,SC.SCORE FROM S,SC WHERE S.SNOSC.SNO;其中,WHERE 后面的条件称为连接条件或连接谓词。自然连接见例 5-15:例 5-15:自然连接查询 SELECT S.SNO,S.SNAME,C.CNAME,SC.SCORE FROM S,C

38、,SC WHERE S.SNOSC.SNO AND C.CNOSC.CNO;以前面已列举的事例来说明一下本例自然连接查询的结果。(a)学生关系 S SNO SNAME AGE SEX DNAME S1 程宏 19 男 计算机 S3 刘莎莎 18 女 电子 S4 李刚 20 男 自动化 S6 蒋天峰 19 男 电气 S9 王敏 20 女 计算机(c)选课关系 SC SNO CNO SCORE S3 C3 87 S4 C3 79 S1 C2 88 S9 C4 83 S1 C3 76 S6 C3 68 S1 C1 78 S6 C1 88 S3 C2 64 S1 C4 86 S9 C2 78 (b)课

39、程关系 C CNO CNAME DNAME TNAME C1 计算机基础 计算机 孙立 C2 C 语言 计算机 胡恒 C3 电子学 电子 钱敏 C4 数据结构 计算机 丁伟 (d)自然连接查询的结果表 S.SNO S.SNAME C.CNAME SC.SCORE S3 刘莎莎 电子学 87 S4 李刚 电子学 79 S1 程宏 C 语言 88 S9 王敏 数据结构 83 S1 程宏 电子学 76 S6 蒋天峰 电子学 68 S1 程宏 计算机基础 78 S6 蒋天峰 计算机基础 88 S3 刘莎莎 C 语言 64 S1 程宏 数据结构 86 S9 王敏 C 语言 78 102 2)元组变量 连

40、接查询可以是两个或更多个表的连接,也可以是一个表的自身连接。在后一种情况下,查询涉及同一个关系 R 的两个甚至更多个元组,这时需要一种方法指定 R 的每一个出现值。SQL 采用的方法是在 FROM 子句中为 R 的每一个出现值指定一个别名(Alias),称之为元组变量(Tuple Variable),其格式是:FROM AS 然后,就可以在 SELECT 和 WHERE 子句中使用该别名指定属性。例 5-16:在表 C 中求每一门课程的间接先行课。SELECT FIRST.CNO,SECOND.PRE_CNO FROM C AS FIRST,C AS SECOND WHERE FIRST.PR

41、E_CNOSECOND.CNO;以上例(例 5-15)的课程关系 C 为例,来说明一下其查询过程和结果。见下表所示。图 5-2 一个表的自身连接 本例中的查询实际上是一种推理,即,若用谓词 PC(x,y)表示 y 是 x 的先行课程,谓词PPC(x,z)表示 z 是 x 的间接先行课,则上述查询完成的推理可表示为:)z,x(P P C)z,y(PC)y,x(PC(zyx 3)SQL 查询中的并、交、差运算 SQL 提供了相应的运算符:UNION,INTERSECT,EXCEPT,分别对应于集合运算的、(并、交、差)。(1)并运算的 SQL 查询语句 例 5-17:求选修了课程 C2 或 C4

42、的学生的学号和姓名。(SELECT S.SNO,S.SNAME FROM S,SC WHERE S.SNO=SC.SNO AND CNOC2)UNION (SELECT S.SNO,S.SNAME FROM S,SC WHERE S.SNO=SC.SNO AND CNOC4);注:它们用于两个查询之间,对每个查询都要用圆括号括起来。提问:以例5-15中关系模式为例,本例的结果是什么?(a)FIRST CNO PRE_CNO C1 C2 C1 C3 C1 C4 C2(b)SECOND CNO PRE_CNO C1 C2 C1 C3 C1 C4 C2 (c)结果表 CNO PRE_CNO C4 C

43、1 103(2)交运算的 SQL 查询语句 例 5-18:求选修了课程 C2 和 C4 的学生的学号和姓名。(SELECT S.SNO,S.SNAME FROM S,SC WHERE S.SNOSC.SNO AND CNO=C2)INTERSECT (SELECT S.SNO,S.SNAME FROM S,SC WHERE S.SNOSC.SNO AND CNOC4);提问:同样以例5-15中关系模式为例,本例的结果是什么?(3)差运算的 SQL 查询语句 例 5-19:求选修了课程 C2 但没有选修课程 C4 的学生的学号和姓名。(SELECT S.SNO,S.SNAME FROM S,SC

44、 WHERE S.SNOSC.SNO AND CNOC2)EXCEPT (SELECT S.SNO,S.SNAME FROM S,SC WHERE S.SNO=SC.SNO AND CNO=C4);提问:同样以例5-15中关系模式为例,本例的结果是什么?4)子查询 在前面的 SQL 查询中,都是用标量数据(整型数、实型数、字符串、日期型和时间型数据等)构成 WHERE 子句中的条件表达式,实际上,被比较的对象还可以是元组,甚至是整个关系,这些元组或关系是通过出现在条件表达式中的子查询获得的。一个子查询就是对某个关系求值的表达式,例如一个 SELECT-FROM-WHERE 查询块就是一个子查询

45、,这种子查询可以嵌入另一个查询块中,所以又称嵌套查询。下面首先看如何建立其值是关系的查询,然后学习如何在 WHERE 子句中对元组和关系进行比较。(1)产生标量值的子查询 一般来说,子查询的结果是一个关系,但我们可能只对其中某个属性的单个值感兴趣,故用一个用圆括号括起来的子查询产生这样的值。这个子查询可以出现在 WHERE 子句中任何希望有一个常量或属性值的地方,例如,把子查询的结果与某个常量或属性值进行比较。例 5-20:求选修了学生 S3 所选修的课程的那些学生的学号。SELECT SNO FROM SC WHERE CNO (SELECT CNO FROM SC WHERE SNOS3)

46、;以例 5-5 中的事例为例,本例先执行括号里面的 SELECT 语句,即查出学生 S3 的所选修的课程是 C2 和 C3,再查找出选修了课程 C2 和 C3 的学生,这里只有 C1。104(2)包含几个关系的条件 一般来说,SELECT-FROM-WHERE 子查询的结果是一个关系R,可用于这个关系的 SQL运算符有 IN、ALL、ANY 等,并产生一个布尔值。这些运算符也涉及到标量值 s。EXISTS R 是一个条件,当且仅当 R 非空时,该条件为真。EXISTS 相当于离散数学中的存在量词。s IN R 为真,当且仅当 s 等于 R 中的一个值。类似地,s NOT IN R 为真,当且仅

47、当s 不等于 R 中的值。IN 的含义相当于集合论中的“属于”()。类似地,s NOT IN R,表示 s不属于 R。、运算要求 SELECT-FROM-WHERE 子查询 R 是个单元关系,对于 R 是个二元关系,其运算参见、。sALL R 为真,当且仅当 s 大于二元关系 R 中的每一个值。同样可以使用其他五个比较运算符(=、=、=、)。例如,sALL R,表示 s NOT IN R。sANY R 为真,当且仅当 s 至少大于二元关系 R 中的一个值。同样可以使用其他五个比较运算符(=、=、=、)。例如,s=ANY R 表示 s IN R。下面用列举书上的几个事例来说明这几个包含多关系条件

48、的 SQL 查询语句运算。例 5-21:使用运算符 IN,求选修了“数据结构”课程的学生的学号和姓名。SELECT SNO,SNAME FROM S WHERE SNO IN (SELECT SNO FROM SC WHERE CNO IN (SELECT CNO FROM C WHERE CNAME=数据结构);该例是一个典型的子查询嵌套,执行时自里(III 层)向外逐层处理,每一个子查询在上一级查询处理之前先求解,这样,外层子查询就可以利用内层子查询的结果。以例 5-15 中的事例,来分析一下其执行过程(如下表所示):先执行最里层(III 层)的 SELECT 语句,从课程关系中查出 CN

49、AME=数据结构的课程号 CNO 是 C4;再执行次里层(II 层)从选课关系表(选课关系表)中查找出选修课程 C4 的学生学号,满足条件的有 S9、S1;最后执行外层,从学生关系表中查找出 S9、S1 的姓名:王敏、程宏。结果为:由例 5-21 可以看到,嵌套子查询具有结构化程序设计的优点。(c)结果表 S.SNO S.SNAME S9 王敏 S1 程宏 (a)执行 III 层 C.CNO C4 (b)执行 II 层 SC.SNO S9 S1 105 例 5-22:使用存在量词 EXISTS 求选修了 C2 课程的学生的姓名。SELECT SNAME FROM S WHERE EXISTS

50、(SELECT*FROM SC WHERE S.SNO=SC.SNO AND CNOC2);本例中,若内层子查询非空,则外层查询中 WHERE 后面的条件为真,否则为假。还应指出,与例 5-21 不同,本例中的内层查询不是只执行一次,因为内层查询还和条件 S.SNO 有关,外层查询中表 S 的不同行具有不同的 SNO,对应每一个 SNO,都要处理一次内层查询。我们把这种内层子查询中查询条件依赖于外层查询中某个值的嵌套查询,称为相关子查询(Correlated Subquery)。如果在含有 EXISTS,ALL,ANY 运算符的整个表达式的前面加上 NOT,就可以对它们作否定运算。从而有:NO

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 文案大全

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁