好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

数据库技术及应用03结构化查询语言课件.ppt

251页
  • 卖家[上传人]:re****.1
  • 文档编号:574491412
  • 上传时间:2024-08-16
  • 文档格式:PPT
  • 文档大小:3.69MB
  • / 251 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 结构化查询结构化查询SQL(Structured Query Language)是关系数据库的标准语是关系数据库的标准语言,对关系模型的发展和商用言,对关系模型的发展和商用DBMS的研制起着重要的作用的研制起着重要的作用SQL语言建立在关系运算理论基础语言建立在关系运算理论基础之上,是介于关系代数和元组演算之上,是介于关系代数和元组演算之间的一种语言,是一种通用的、之间的一种语言,是一种通用的、功能强大的关系数据库语言功能强大的关系数据库语言本章将介绍本章将介绍SQL的数据定义、数据的数据定义、数据查询、数据更新和嵌入式查询、数据更新和嵌入式SQL绪论机械工业出版社机械工业出版社0 目录目录SQL语言概述3.1SQL数据定义3.2 SQL数据查询3.3SQL数据更新3.4视图 3.5SQL 数据控制 3.6 嵌入式SQL 3.7机械工业出版社机械工业出版社1 3.1 SQL语言概述v3.1.1 SQL语言的产生与发展语言的产生与发展:: 1970 1970年,美国年,美国IBMIBM研究中心的研究中心的E.E.FF. .CoddCodd发表多篇发表多篇文章,提出了关系模型。

      文章,提出了关系模型19721972年,年,IBMIBM公司开始研制关公司开始研制关系数据库管理实验系统系数据库管理实验系统System RSystem R,配制的查询语言称,配制的查询语言称为为SQUARESQUARE语言(语言(Specifying Queries As Relational Specifying Queries As Relational ExpressionExpression),在语言中使用了大量的数学符号在语言中使用了大量的数学符号19741974年,年,BoyceBoyce和和ChamberlinChamberlin把把SQUARESQUARE语言修改为语言修改为SEQUELSEQUEL语言语言(Structured English Query Language)(Structured English Query Language)这两种语言在本质上是相同的,但后者去掉了一些数这两种语言在本质上是相同的,但后者去掉了一些数学符号,并采用英语单词表示和结构式的语法规则,学符号,并采用英语单词表示和结构式的语法规则,后来后来SEQUELSEQUEL语言简称为语言简称为SQLSQL,即结构化查询语言。

      由于,即结构化查询语言由于它功能丰富,语言简捷,倍受用户欢迎经众多计算它功能丰富,语言简捷,倍受用户欢迎经众多计算机公司的不断修改、扩充和完善,机公司的不断修改、扩充和完善,SQLSQL语言最终发展成语言最终发展成为关系数据库的标准语言为关系数据库的标准语言机械工业出版社机械工业出版社2 3.1 SQL语言概述vSQL被认为是数据库界的奇迹,几乎所有著名的关系数据库管理被认为是数据库界的奇迹,几乎所有著名的关系数据库管理系统,如系统,如Oracle、、Sybase、、Informix、、Ingres、、DB2、、SQL server都先后实现了对都先后实现了对SQL语言的支持语言的支持v1986年,美国国家标准协会年,美国国家标准协会(ANSI)发布了第一个发布了第一个SQL标准,标准,即即SQL86,并于,并于1987年获得国际标准化组织年获得国际标准化组织(ISO)的一致通的一致通过SQL86主要包括模式定义、数据操作、嵌入式主要包括模式定义、数据操作、嵌入式SQL等内容1989年,年,ISO组织在模式定义中增补了完整性描述并修订了一组织在模式定义中增补了完整性描述并修订了一些其他内容,并颁布了些其他内容,并颁布了SQL89标准。

      标准v1992年年ISO组织对组织对SQL89又进行了扩充和修改,公布了又进行了扩充和修改,公布了SQL92标准,人们习惯称为标准,人们习惯称为SQL2标准SQL2标准分为初级标准分为初级SQL2、中级、中级SQL2和完全和完全SQL2三个级别初级三个级别初级SQL2在在SQL89的基础上增加了某些功能;中级的基础上增加了某些功能;中级SQL2是在初级是在初级SQL2的的基础上扩充了数据的类型、操作的种类和完整性方面的内容;完基础上扩充了数据的类型、操作的种类和完整性方面的内容;完全全SQL2进一步扩充了中级进一步扩充了中级SQL2,放宽了对某些操作的限制,,放宽了对某些操作的限制,并增加了并增加了“BIT”的数据类型此外,的数据类型此外,SQL2还提供对网络环境和还提供对网络环境和互联网的支持,以实现对远程数据库的访问互联网的支持,以实现对远程数据库的访问 机械工业出版社机械工业出版社3 3.1 SQL语言概述语言概述v1995年美国国家标准局在年美国国家标准局在SQL2的基础上进一步扩充了面向对的基础上进一步扩充了面向对象的功能,并公布了象的功能,并公布了SQL3标准SQL3支持用户自定义数据类支持用户自定义数据类型,提供了递归操作、临时视图、嵌套查询、异步型,提供了递归操作、临时视图、嵌套查询、异步DML等新功能。

      等新功能SQL3是目前的最新标准,但由于各种历史原因,仍有一些数据是目前的最新标准,但由于各种历史原因,仍有一些数据库仅支持到库仅支持到SQL2v自自SQL成为国际标准语言以后,各个数据库厂家纷纷推出各自的成为国际标准语言以后,各个数据库厂家纷纷推出各自的SQL软件或与软件或与SQL的接口软件这就使大多数数据库均用的接口软件这就使大多数数据库均用SQL作为共同的数据存取语言和标准接口,使不同数据库系统之间的作为共同的数据存取语言和标准接口,使不同数据库系统之间的互操作有了共同的基础互操作有了共同的基础vSQL成为国际标准,对数据库以外的领域也产生了巨大影响,很成为国际标准,对数据库以外的领域也产生了巨大影响,很多软件产品将多软件产品将SQL语言的数据查询功能与图形功能、软件工程工语言的数据查询功能与图形功能、软件工程工具、软件开发工具、人工智能程序结合起来具、软件开发工具、人工智能程序结合起来SQL已成为数据库已成为数据库领域中一个主流语言,被广泛应用在各种系统中领域中一个主流语言,被广泛应用在各种系统中 机械工业出版社机械工业出版社4 3.1 SQL语言概述语言概述v3.1.2 SQL语言的基本概念语言的基本概念 SQL语言支持关系数据库的三级模式结构体系,如图语言支持关系数据库的三级模式结构体系,如图3-1所示。

      所示在在SQL中,外模式对应于视图中,外模式对应于视图(View)或部分基本表或部分基本表(Base Table),,模式对应于基本表,内模式对应于存储文件模式对应于基本表,内模式对应于存储文件(Stored File) 图图3-1 SQL数据库的体系结构数据库的体系结构机械工业出版社机械工业出版社5 3.1 SQL语言概述语言概述vSQL数据库的体系结构要点如下:数据库的体系结构要点如下:((1)一个)一个SQL模式模式(Schema)是已命名的数据组,由表、授是已命名的数据组,由表、授权、规则、约束等组成权、规则、约束等组成2)一个)一个SQL表由行表由行(Row)组成,行由列组成,行由列(Column)组成,组成,每一列对应一个数据项每一列对应一个数据项3))SQL表有三种类型:基本表、视图和导出表基本表是实表有三种类型:基本表、视图和导出表基本表是实际存储在数据库中的表,视图是由若干个基本表或其他视图际存储在数据库中的表,视图是由若干个基本表或其他视图构成的表的定义,是虚拟表,而导出表是执行查询后产生的构成的表的定义,是虚拟表,而导出表是执行查询后产生的表。

      表4)一个基本表可以跨一个或多个存储文件,一个存储文件也)一个基本表可以跨一个或多个存储文件,一个存储文件也可以存放一个或多个基本表每个存储文件与外部存储上的可以存放一个或多个基本表每个存储文件与外部存储上的一个物理文件相对应一个物理文件相对应 机械工业出版社机械工业出版社6 3.1 SQL语言概述语言概述((5)用户可以使用)用户可以使用SQL语句对基本表和视图进行查询等操作语句对基本表和视图进行查询等操作对用户来说,基本表和视图是一样的,都是表对用户来说,基本表和视图是一样的,都是表6))SQL用户可以是终端用户,也可以是应用程序也就是说,用户可以是终端用户,也可以是应用程序也就是说,SQL语言既可以作为独立的交互型语言,供交互环境下的终端语言既可以作为独立的交互型语言,供交互环境下的终端用户使用;也可以作为嵌入式语言嵌入宿主语言的程序中使用,用户使用;也可以作为嵌入式语言嵌入宿主语言的程序中使用,宿主语言可以是宿主语言可以是Visual Basic(VB)、、C语言、语言、COBOL、、 FORTRAN、、PL/1等程序设计语言等程序设计语言7)存储文件的逻辑结构组成了关系数据库的内模式。

      存储文)存储文件的逻辑结构组成了关系数据库的内模式存储文件的物理结构是任意的,对用户是透明的件的物理结构是任意的,对用户是透明的 机械工业出版社机械工业出版社7 3.1 SQL语言概述v3.1.3 SQL语言的主要特点语言的主要特点 SQL语言是介于关系数据库与关系演算之间的一种结构化查询语言虽然SQL是一种查询语言,但实际上它的功能并非查询信息那么简单,主要功能包括数据查询(Data Query)、数据操纵(Data Manipulation)、数据定义(Data Definition)和数据控制(Data Control),是一种通用的、功能强大而又简单易学的关系数据库语言,其主要特点包括以下几个方面 机械工业出版社机械工业出版社8 3.1 SQL语言概述1 1综综合合统统一一 数据库系统的主要功能是通过数据库支持的数据语言来实现层次模型、网状模型等非关系模式数据库语言大多分为模式数据定义语言(模式DDL,Schema Data Definition Language)、外模式数据定义语言(外模式DDL或子模式DDL,Subschema Data Definition Language)、与数据存储有关的描述语言(DSDL,Data Storage Description Language)及数据操纵语言(DML,Data Manipulation Language),分别用于定义模式、外模式、内模式和进行数据的存取与处置。

      不足之处是:当用户数据库投入运行之后,如果需要修改模式,必须停止现有数据库的运行,转储数据,修改模式并编译后再重装数据库,非常麻烦SQL语言集数据定义语言DDL、数据操纵语言DML、数据控制语言DCL的功能于一体,语言风格统一,可以独立完成数据库生命周期中的全部活动,包括定义关系模式、建立数据库、插入数据、查询、更新、维护、数据库重构、数据库安全控制等一系列操作要求,为数据库应用系统提供了良好的开发环境更重要的是,用户数据库在投入运行后,在不影响数据库运行的情况下,可根据需要随时修改模式,从而使系统具有良好的可扩展性机械工业出版社机械工业出版社9 3.1 SQL语言概述2 2高高度度非非过过程程化化 非关系数据模型的数据操纵语言是面向过程的语言,如果要完成某项请求,必须指出存取路径而SQL语言是高度非过程化语言,当进行数据操作时,只需要指出“做什么”,无须指明“怎么做”,存储路径对用户来说是透明的,而不需要指出存储路径,存储路径的选择和SQL语句的操作过程全部是由系统自动完成的,从而大大减轻了用户的负担,同时有利于提高数据的独立性机械工业出版社机械工业出版社10 3.1 SQL语言概述3 3面面向向集集合合的的操操作作方方 法法 非关系数据模型采用面向记录的操作方式,操作对象是一条记录。

      例如查询工资在2000元以上的员工姓名,用户必须要编写一段处理程序,指明具体处理过程,包括按照哪条存储路径、如何循环等,才能一条一条地把满足要求的员工记录查找出来而SQL语言采用面向集合的操作方式,不仅操作对象、查找结果可以是元组的集合,而且一次插入、删除、更新操作的对象也可以是元组的集合机械工业出版社机械工业出版社11 3.1 SQL语言概述4 4以同以同一种一种语言语言结构结构提供提供两种两种使用使用方式方式 SQL语言提供两种工作方式:一种是交互式命令方式,另一种是嵌入式程序方式第一种方式是用户可以在终端键盘上输入SQL命令,对数据库进行操作,能够独立地用于联机交互的使用方式,所以称为自含式语言;第二种方式是将SQL语句嵌入到高级程序设计语言(如C语言、C++语言、COBOL、 FORTRAN、PowerBuilder、PL/1)程序中,供程序员设计程序时使用,因此又称为嵌入式语言而在以上两种不同的使用方式下,SQL语言的语法结构基本上是一致的这种以统一的语法结构提供两种不同的使用方式的做法,提供了极大的灵活性和方便性机械工业出版社机械工业出版社12 3.1 SQL语言概述5 5语言语言简洁简洁,,易学易学易用易用 SQL语言不仅功能强大,而且十分简洁,完成核心功能只用了9个动词,如表3-1所示。

      SQL语言接近英语口语,因此容易学习,方便使用 表3-1 SQL语言功能表SQL功能 动 词 数据查询SELECT数据定义CREATE,DROP,ALTER数据操纵INSERT,UPDATE,DELETE数据控制GRANT,REVOKE机械工业出版社机械工业出版社13 3.2 SQL数据定义 关系数据库系统支持三级模式结构,其模式、外模式和内模式中的基本对象有表、视图和索引因此SQL的数据定义功能包括定义表、定义视图和定义索引,具体命令如表3-2所示 机械工业出版社机械工业出版社14 3.2 SQL数据定义数据定义表表3-2 SQL的数据定义语句的数据定义语句 操作对象操作对象 操操 作作 方方 式式 创创 建建删删 除除修修 改改表表CREATETABLEDROPTABLEALTERTABLE视图视图CREATE VIEWDROP VIEW索引索引CREATE INDEX DROP INDEX 机械工业出版社机械工业出版社15 3.2 SQL数据定义 在数据库中独立存在的表称为基本表,一个基本表对应一个基本关系,它是由CREATE TABLE命令来创建的。

      基本表的定义是指建立基本的关系模式,基本表的变更是指对数据库中已存在的基本表进行修改或删除数据库通常是包含多个基本表的一个数据集 机械工业出版社机械工业出版社16 3.2 SQL数据定义 一个基本表可以建立若干索引,它们都依附于基本表且存放在存储文件中索引属于物理存储概念,而不是逻辑概念有些关系型数据库同时包括索引机制和主键机制,相比而言,主键机制占用系统资源较少,并且效率较高 机械工业出版社机械工业出版社17 3.2 SQL数据定义 视图对应于外模式,它是从现有的一个或几个基本表中抽取若干子集组成的“虚表” 视图可以通过SQL中的CREATE VIEW命令来来创建,创建视图只是把视图的定义存放在系统中,而不是直接存储视图相应的数据,这些数据仍然存放在导出视图的基本表中只有当用户使用该视图时,才从相应的表中获取数据SQL在查询视图时与基本表完全相同,并且用户可以在视图上再定义视图,但用视图对数据库中的数据进行增加、删除、修改等更新操作时有一定的限制v本节将介绍如何定义基本表和索引,视图的定义方法将在3.5节介绍机械工业出版社机械工业出版社18 3.2 SQL数据定义数据定义v3.2.1 基本数据类型基本数据类型 不不同同的的数数据据库库系系统统支支持持的的数数据据类类型型不不完完全全相相同同。

      SQL提提供供的的主主要要数数据据类类型(也称为型(也称为“域类型域类型”)有以下几种:)有以下几种:((1))数值型数值型 INTEGER 全字长二进制整数(也可写成全字长二进制整数(也可写成INT)) SMALLINT 半字长二进制整数半字长二进制整数 REAL 取决于机器精度的浮点数取决于机器精度的浮点数 DOUBLE PRECISION 取决于机器精度的双精度浮点数取决于机器精度的双精度浮点数 FLOAT(n) 浮点数,精度至少为浮点数,精度至少为n位数字位数字 NUMERIC(p,d) 定点数,由定点数,由p位数字(不包括符号、位数字(不包括符号、 小数点小数点)组组 成,小数点后面有成,小数点后面有d位数字位数字 (也可以写成也可以写成 DECIMAL(p,d)DEC(p,d))机械工业出版社机械工业出版社19 3.2 SQL数据定义数据定义((2))字符串型字符串型 CHAR(n) 长度为长度为n的定长字符串的定长字符串 VARCHAR(n) 具有最大长度为具有最大长度为n的变长字符串的变长字符串 GRAPHIC(n) 长度为长度为n的定长图形字符串的定长图形字符串 VARGRAPHIC(n) 具有最大长度为具有最大长度为n的定长图形字符串的定长图形字符串((3))位串型位串型 BIT(n) 长度为长度为n的二进制位串的二进制位串 BIT VARYING(n) 最大长度为最大长度为n的变长二进制位串的变长二进制位串((4))时间型时间型 DATE 日期型,格式为日期型,格式为YYYY-MM-DD TIME 时间型,格式为时间型,格式为HH:MM:SS TIMESTAMP 日期加时间日期加时间机械工业出版社机械工业出版社20 3.2 SQL数据定义数据定义v3.2.2 创建、修改和删除基本表创建、修改和删除基本表 如如果果在在系系统统中中创创建建了了一一个个数数据据库库,,那那么么就就可可以以在在数数据据库库中中定定义义基基本本表表。

      对对基基本表的操作包括创建、修改和删除本表的操作包括创建、修改和删除1.基本表的创建.基本表的创建 建立数据库最基本、最重要的一步就是创建基本表,也就是定义基本表的建立数据库最基本、最重要的一步就是创建基本表,也就是定义基本表的结构SQL语言使用语言使用CREATE TABLE语句创建基本表,其一般格式为:语句创建基本表,其一般格式为:CREATE TABLE <表名表名> (<列名列名> <数据类型数据类型> [列级完整性约束条件列级完整性约束条件] [,,<列名列名> <数据类型数据类型> [列级完整性约束条件列级完整性约束条件]]… [,,<表级完整性约束条件表级完整性约束条件>]); 其中,其中,<表名表名>是所要定义的基本表的名字,基本表可以由一个或多个属是所要定义的基本表的名字,基本表可以由一个或多个属性(列)组成,每个列的类型可以是基本数据类型,也可以是用户预先定义的性(列)组成,每个列的类型可以是基本数据类型,也可以是用户预先定义的域名。

      域名机械工业出版社机械工业出版社21 3.2 SQL数据定义 建立基本表的同时通常还可以定义与该表有关的完整性约束条件,这些完整性约束条件被存储在系统的数据字典中,当用户操作表中数据时,由DBMS自动检查该操作是否违背这些完整性约束条件如果完整性约束条件涉及该表的多个属性列,则必须定义在表级上,否则既可以定义在列级上,也可以定义在表级上 机械工业出版社机械工业出版社22 3.2 SQL数据定义 例3.1 设教学管理数据库S-C中有三个基本表:学生表STUDENT、学生选课表SC和课程表COURSE其中学生表由学号SNO、姓名SNAME、性别SSEX、年龄SAGE、所在系SDEPT五个属性组成;学生选课表由学号SNO、课程号CNO、成绩GRADE三个属性组成;课程表由课程号CNO、课程名CNAME、先修课程号CPNO、学分CREDITS 四个属性组成 STUDENT (SNO, SNAME, SSEX, SAGE, SDEPT) SC (SNO, CNO, GRADE) COURSE (CNO, CNAME, CPNO, CREDITS)机械工业出版社机械工业出版社23 3.2 SQL数据定义v基本表STUDENT可用下列命令创建: CREATE TABLE STUDENT (SNO CHAR(5) NOT NULL UNIQUE, /*列级完整性约 束条件, SNO、SNAME不能为空值,取值唯一*/ SNAME CHAR(8) NOT NULL UNIQUE, SSEX CHAR(2), SAGE INT, SDEPT CHAR(20), PRIMARY KEY(SNO)); 机械工业出版社机械工业出版社24 3.2 SQL数据定义 系统执行上面的系统执行上面的CREATE TABLE命令后,就在命令后,就在数据库中建立一个新的空表数据库中建立一个新的空表STUDENT,并将有关表,并将有关表的定义以及有关约束条件存放在数据字典中。

      定义表的定义以及有关约束条件存放在数据字典中定义表的各个属性时需要指明其数据类型及长度的各个属性时需要指明其数据类型及长度 SQL中允许列值是空值,但当要求某一列的值不中允许列值是空值,但当要求某一列的值不允许为空值时,就应在定义该列时写上关键字允许为空值时,就应在定义该列时写上关键字“NOT NULL”,例如这里的学号,例如这里的学号SNO、学生姓名、学生姓名SNAME后都有后都有“NOT NULL”字样PRIMARY KEY(SNO)表示定义主码为表示定义主码为SNO 机械工业出版社机械工业出版社25 3.2 SQL数据定义数据定义对于基本表对于基本表SC、、COURSE可以用下列语句创建:可以用下列语句创建:CREATE TABLE SC (SNO CHAR(5), CNO CHAR(4), GRADE INT, PRIMARY KEY(SNO,CNO), FOREIGN KEY(SNO) REFERENCES STUDENT(SNO), FOREIGN KEY(CNO) REFERENCES COURSE(CNO), CHECK (GRADE BETWEEN 0 AND 100));CREATE TABLE COURSE (CNO CHAR(4) NOT NULL, CNAME CHAR(10) NOT NULL, CPNO CHAR(4), CREDITS INT, PRIMARY KEY(CNO); 机械工业出版社机械工业出版社26 3.2 SQL数据定义数据定义 在基本表在基本表SC的定义中说明有三个属性列,主键是的定义中说明有三个属性列,主键是(SNO,CNO)。

      还定义了两个外码,并指出外码还定义了两个外码,并指出外码SNO和基本表和基本表STUDENT中的中的SNO相对应,外码相对应,外码CNO和和基本表基本表COURSE中的中的CNO相对应在本例中对应的相对应在本例中对应的属性列名称恰好同名,实际上也可以不同名,只要指属性列名称恰好同名,实际上也可以不同名,只要指出其对应性即可外码体现了关系数据库的参照完整出其对应性即可外码体现了关系数据库的参照完整性定义中还使用了一个检查子句,指出成绩性定义中还使用了一个检查子句,指出成绩GRADE的值应在的值应在0~100之间 在基本表在基本表COURSE的定义中也说明有三个属性列,的定义中也说明有三个属性列,主码是主码是CNO,同时属性,同时属性CNO和和CNAME不允许为空不允许为空值 机械工业出版社机械工业出版社27 3.2 SQL数据定义数据定义 2.基本表的修改.基本表的修改 在基本表建立后,可根据实际需要对基本表的结构进行修改,在基本表建立后,可根据实际需要对基本表的结构进行修改,可以增加新的属性列和新的完整性约束条件、删除指定列的完整可以增加新的属性列和新的完整性约束条件、删除指定列的完整性约束条件,还可以修改数据类型、宽度等。

      性约束条件,还可以修改数据类型、宽度等SQL语言用语言用ALTER TABLE语句修改基本表,其一般格式为:语句修改基本表,其一般格式为: ALTER TABLE <表名表名> [ADD <新列名新列名> <数据类型数据类型> [完整性约束完整性约束]] [DORP <完整性约束名完整性约束名>] [MODIFY <列名列名> <数据类型数据类型>];; 其中其中<表名表名>指出要修改的基本表;指出要修改的基本表;ADD子句用于增加新列和新的子句用于增加新列和新的完整性约束条件;完整性约束条件;DORP子句用于删除指定的完整性约束条件;子句用于删除指定的完整性约束条件;MODFIY子句用于修改原有的列定义,包括修改列名和数据类型子句用于修改原有的列定义,包括修改列名和数据类型 机械工业出版社机械工业出版社28 3.2 SQL数据定义 ((1)增加列)增加列 例例3.2 在基本表STUDENT中增加一个地址列ADDRESS, 可用下列语句实现: ALTER TABLE STUDENT ADD ADDRESS CHAR(30) 应该注意的是,不论基本表中原来是否已有数据,新增加 的列不能定义为“NOT NULL”,基本表在增加一个属性列后,原有元组在新增加的列上的值都被定义为空值NULL。

      机械工业出版社机械工业出版社29 3.2 SQL数据定义 (2)补充定义主码 由于SQL并不要求每个基本表在建立时都定义主码,因此提供了一个补充定义主码的命令,在需要时定义主码被定义为主码的列名表必须满足NOT NULL和唯一性条件ALTER TABLE <表名> ADD PRIMARY KEY(<列名表>); 机械工业出版社机械工业出版社30 3.2 SQL数据定义 (3)撤销主码定义 如果定义了主码,系统一般在主码上自动建立索引,并在插入新的元组时,进行主码唯一性检验这在插入大量数据时,会严重影响系统的性能利用下面的命令,可以暂时撤销主码定义 ALTER TABLE <表名> DORP PRIMARY KEY; 机械工业出版社机械工业出版社31 3.2 SQL数据定义 (4)补充定义外码 ALTER TABLE <表名1> ADD FOREIGN KEY [<外码名>)](<列表名>) REFERENCES <表名2> [ON DELETE{RESTRICT|CASCADE|SET NULL}]; 上述命令中,花括号表示任选三项中的一项,RESTRICT为默认值。

      机械工业出版社机械工业出版社32 3.2 SQL数据定义 (5)撤销外码定义 定义了外码,必须引用完整性检验,这在有些情况下会影响系统的性能为此,SQL提供了撤销外码的命令,在必要时暂时撤销外码 ALTER TABLE <表名> DORP <外码名>;(6)修改属性的数据类型及约束条件 机械工业出版社机械工业出版社33 3.2 SQL数据定义例例3.3 将表STUDENT中年龄的数据类型改为半字长整数(SMALLINT) ALTER TABLE STUDENT MODIFY SAGE SMALLINT; 修改原有的属性列定义有可能会破坏已有的数据例例3.4 删除表STUDENT中学生姓名必须取唯一值的约束 ALTER TABLE STUDENT DORP UNIQUE(SNAME); 标准SQL没有提供删除属性列的语句,用户只能间接实现这一功能,可以先把表中要保留的属性列及其内容复制到一个新表中,然后删除原表,再建新表重新命名为原表名。

      机械工业出版社机械工业出版社34 3.2 SQL数据定义3.基本表的删除 当某个基本表不再需要时,用户可以使用DORP TABLE命令删除它其一般格式为:DORP TABLE <表名>; 基本表一旦删除,表中的数据以及此表上建立的索引和视图都将自动被删除掉因此执行删除基本表的操作一定要格外谨慎例例3.5 删除STUDENT表 DORP TABLE STUDENT;机械工业出版社机械工业出版社35 3.2 SQL数据定义v3.2.3 创建和维护索引 索引属于物理存储的路径概念,而不是逻辑的概念在定义基本表时定义索引,就会把数据库的物理结构和逻辑结构混在一起建立索引是加快查询速度的有效手段用户可以根据应用环境的需要,在基本表上建立一个或多个索引,以提供多种存取路径,加快查找速度一般来说,建立与删除索引由数据库管理员DBA或表的属主(即建立该表的人)负责完成系统在存取数据时会自动选择合适的索引作为存取路径,用户不必也不能选择索引 机械工业出版社机械工业出版社36 3.2 SQL数据定义v1.索引的建立 在SQL语言中,建立索引使用CREATE INDEX语句,其一般格式为: CREATE [UNIQUE][CLUSTER] INDEX <索引名> ON <表名> (<列名>[<次序>][,<列名>[<次序 >]]…); 机械工业出版社机械工业出版社37 3.2 SQL数据定义数据定义 其中,其中,〈〈表名表名〉〉是要建立索引的基本表的名字。

      索引可是要建立索引的基本表的名字索引可以建立在该表的一列或多列上,各列名之间用逗号分隔以建立在该表的一列或多列上,各列名之间用逗号分隔每个每个〈〈列名列名〉〉后面还可以用后面还可以用〈〈次序次序〉〉指定索引值的排列指定索引值的排列次序,可选次序,可选ASC(升序)或(升序)或DESC(降序),默认值为(降序),默认值为ASC UNIQUE表明此索引的每一个索引值只对应唯一的数据表明此索引的每一个索引值只对应唯一的数据记录 CLUSTER表示要建立的索引是聚簇索引所谓聚簇索表示要建立的索引是聚簇索引所谓聚簇索引是指索引项的顺序与表中记录的物理顺序一致的索引引是指索引项的顺序与表中记录的物理顺序一致的索引组织机械工业出版社机械工业出版社38 3.2 SQL数据定义 例例3.6 在基本表在基本表STUDENT中的中的SNAME(姓名)列(姓名)列 上建立一个聚簇索引,并且上建立一个聚簇索引,并且STUDENT表中的记录将表中的记录将按照按照SNAME值的降序存放值的降序存放 CREATE CLUSTER INDEX STU-SNAME ON STUDENT (SNAME DESC);; 用户可以在最常查询的列上建立聚簇索引以提高查询效率。

      值得注意的是,每个基本表上最多只能建立一个聚簇索引建立聚簇索引后,更新索引列上的数据时,往往导致基本表中元组的物理顺序的变更,时间开销较大,因此对于经常更新的列不易建立聚簇索引机械工业出版社机械工业出版社39 3.2 SQL数据定义数据定义 例例3.7 为教学管理数据库中的为教学管理数据库中的STUDENT、、SC、、COURSE三个表建立索引其中三个表建立索引其中STUDENT表按学号表按学号((SNO)升序建立唯一索引,)升序建立唯一索引,SC表按学号(表按学号(SNO)升序和成)升序和成绩(绩(GRADE)降序建立唯一索引,)降序建立唯一索引,COURSE表按课程号表按课程号((CNO)升序建立唯一索引升序建立唯一索引 CREATE UNIQUE INDEX STU-SNO ON STUDENT (SNO ASC); CREATE UNIQUE INDEX SC-SNO ON SC (SNO ASC, GRADE DESC); CREATE UNIQUE INDEX C-CNO ON COURSE (CNO ASC);机械工业出版社机械工业出版社40 3.2 SQL数据定义2.索引的删除 索引建立以后,就由系统使用和维护它,不需用户干预。

      建立索引是为了减少查询操作的时间但如果数据增加和修改频繁,系统会花费许多时间来维护索引这时可以删除不必要的索引 在SQL语言中,删除索引使用DORP INDEX语句,其一般格式为:DORP INDEX <表名,索引名表名,索引名>;机械工业出版社机械工业出版社41 3.2 SQL数据定义 例例3.8 删除基本表STUDENT中的STU-SNAME索引DORP INDEX ; 删除索引时,系统会同时从数据字典中删去有关该索引的描述机械工业出版社机械工业出版社42 3.3 SQL数据查询v3.3.1 SELECT查询命令 数据查询是数据库的核心操作数据查询是数据库的核心操作SQL提供了提供了SELECT语语句进行数据库的查询,该语句具有灵活的使用方式和丰富的功句进行数据库的查询,该语句具有灵活的使用方式和丰富的功能其一般格式为:能其一般格式为: SELECT [ALL|DISTINCT] <目标列表达式目标列表达式>[,<目标列表达式目标列表达式>]… FROM <表名或视图名表名或视图名>[,<表名或视图名表名或视图名>]… [WHERE <条件表达式条件表达式>] [GROUP BY <列名列名1> [HAVING <条件表达式条件表达式>]] [ORDER BY <列名列名2> [ASC|DESC]];机械工业出版社机械工业出版社43 3.3 SQL数据查询 整整个个SELECT语语句句的的含含义义是是::根根据据WHERE子子句句给给出出的的条条件件表表达达式式,,从从FROM子子句句指指定定的的基基本本表表 或或 视视 图图 中中 找找 出出 满满 足足 条条 件件 的的 元元 组组 ,, 再再 按按 照照SELECT子子句句中中的的目目标标列列表表达达式式,,选选出出元元组组中中的的属属性性值值形形成成结结果果表表。

      如如果果有有GROUP子子句句,,则则将将结结果果按按<列列名名1>的的值值进进行行分分组组,,该该属属性性列列值值相相等等的的 元元 组组 为为 一一 个个 组组 如如 果果 GROUP子子 句句 带带 有有HAVING短短语语,,则则只只输输出出满满足足指指定定条条件件的的组组如如果果有有ORDER子子句句,,则则结结果果表表还还要要按按<列列名名2>的的值的升序或降序排序值的升序或降序排序机械工业出版社机械工业出版社44 3.3 SQL数据查询 SELECT语句既可以完成简单的单表查询,也可以完成复杂的连接查询和嵌套查询,SELECT语句能表达所有的关系代数表达式下面以教学管理数据库S-C为例说明SELECT语句的各种用法 教学管理数据库中包含三个基本表:教学管理数据库中包含三个基本表:l学生表:STUDENT(SNO,SNAME,SSEX,SAGE,SDEPT) STUDENT由学号(SNO)、姓名(SNAME)、性 别(SSEX)、年龄(SAGE)、所在系(SDEPT) 五个属性组成,其中SNO为主码。

      机械工业出版社机械工业出版社45 3.3 SQL数据查询数据查询l课程表课程表:: CORUSE(CNO,CNAME,CPNO,CREDITS) CORUSE有课程号(有课程号(CNO)、课程名)、课程名 ((CNAME)、选修课号()、选修课号(CPNO)、学分)、学分 ((CREDITS)四个属性组成,其中)四个属性组成,其中CNO为主码l学生选课表学生选课表::SC(SNO,CNO,GRADE) SC由学号(由学号(SNO)、课程号()、课程号(CNO)、成绩)、成绩 ((GRADE)三个属性组成,其中主码为)三个属性组成,其中主码为 ((SNO,CNO)机械工业出版社机械工业出版社46 3.3 SQL数据查询数据查询SNOSNAMESSEXSAGESDEPTS8201王晨王晨男男21计算机系计算机系S8202李俊李俊女女20计算机系计算机系S8203刘利敏刘利敏女女19计算机系计算机系S8204张海张海男男20计算机系计算机系S8801吴浩吴浩男男18数学系数学系S8802程小磊程小磊男男20数学系数学系S8803张建超张建超男男19数学系数学系S9101李云鹏李云鹏男男18自动化系自动化系S9102刘一鸣刘一鸣女女20自动化系自动化系表表3-3 基本基本STUDENT机械工业出版社机械工业出版社47 3.3 SQL数据查询数据查询CNOCCNAMECPNOCREDITS1高等数学高等数学 22英语英语43C语言语言44数据结构数据结构345操作系统操作系统446离散数学离散数学137数据库数据库438网络原理网络原理53表表3-4 基本表基本表COURSE机械工业出版社机械工业出版社48 3.3 SQL数据查询SNOCNOGRADES8201195S8201385S8202188S8202274S8202383S8203194S8203291S82044 75S8204590S8801486表3-5 基本表SC机械工业出版社机械工业出版社49 3.3 SQL数据查询v3.3.2 简单查询 简单查询是指数据源只涉及一个基本表或一个视图的查询。

      1.选择表中的若干列 选择表中的若干列,既可以是选择表中的全部列,也可以是选择表中的部分列选择表中的全部列或部分列,这就是投影运算 (1) 查询指定列 在多数情况下,用户只对表中的一部分属性列感兴趣,这时可通过在SELECT子句的〈目标列表达式〉中指定要查询的属性列机械工业出版社机械工业出版社50 3.3 SQL数据查询数据查询 例例3.9 查询全体学生的学号、姓名和所在系查询全体学生的学号、姓名和所在系SELECT SNO, SNAME, SEPTFROM STUDENT; 查询结果如表查询结果如表3-6所示机械工业出版社机械工业出版社51 3.3 SQL数据查询数据查询SNOSNAMESDEPTS8201王晨王晨计算机系计算机系S8202李俊李俊计算机系计算机系S8203刘利敏刘利敏计算机系计算机系S8204张海张海计算机系计算机系S8801吴浩吴浩数学系数学系S8802程小磊程小磊数学系数学系S8803张建超张建超数学系数学系S9101李云鹏李云鹏自动化系自动化系S9102刘一鸣刘一鸣自动化系自动化系表表3-6 查询学号、姓名和所在系结果查询学号、姓名和所在系结果机械工业出版社机械工业出版社52 3.3 SQL数据查询数据查询例例3.10 查询全体学生的姓名、学号、性别和所在系。

      查询全体学生的姓名、学号、性别和所在系SELECT SNAME, SNO, SSEX, SEPTFROM STUDENT;查询结果如表查询结果如表3-7所示 机械工业出版社机械工业出版社53 3.3 SQL数据查询数据查询SNOSNAMESSEXSDEPTS8201王晨王晨男男计算机系计算机系S8202李俊李俊女女计算机系计算机系S8203刘利敏刘利敏女女计算机系计算机系S8204张海张海男男计算机系计算机系S8801吴浩吴浩男男数学系数学系S8802程小磊程小磊男男数学系数学系S8803张建超张建超男男数学系数学系S9101李云鹏李云鹏男男自动化系自动化系S9102刘一鸣刘一鸣女女自动化系自动化系表表3-7查询学号、姓名、性别和所在系结果查询学号、姓名、性别和所在系结果〈〈目标列表达式目标列表达式〉〉中各个列的先后顺序可以与表中的顺序不一致,用户可以根据应中各个列的先后顺序可以与表中的顺序不一致,用户可以根据应用的需要改变列的显示顺序用的需要改变列的显示顺序机械工业出版社机械工业出版社54 3.3 SQL数据查询(2) 查询全部列查询全部列 如果要查询表中的所有属性列,可以使用两种方法:一种方法是在〈目标列表达式〉中列出所有的列名;另一种方法是如果列的显示顺序与基本表中定义的顺序相同,则可以简单地将〈目标列表达式〉指定为星号“*”。

      例3.11 查询全体学生的记录SELECT SNO, SNAME, SAGE, SSEX, SEPTFROM STUDENT; 等价于: SELECT * FROM STUDENT;查询结果如表3-8所示机械工业出版社机械工业出版社55 3.3 SQL数据查询例例3.10 查询全体学生的姓名、学号、性别和所在系SELECT SNAME, SNO, SSEX, SEPTFROM STUDENT;查询结果如表3-7所示 机械工业出版社机械工业出版社56 3.3 SQL数据查询数据查询SNOSNAMESSEXSAGESDEPTS8201王晨王晨男男21计算机系计算机系S8202李俊李俊女女20计算机系计算机系S8203刘利敏刘利敏女女19计算机系计算机系S8204张海张海男男20计算机系计算机系S8801吴浩吴浩男男18数学系数学系S8802程小磊程小磊男男20数学系数学系S8803张建超张建超男男19数学系数学系S9101李云鹏李云鹏男男18自动化系自动化系S9102刘一鸣刘一鸣女女20自动化系自动化系表表3-8 查询全体学生记录结果查询全体学生记录结果机械工业出版社机械工业出版社57 3.3 SQL数据查询(3)查询经过计算的列查询经过计算的列 SELECT子句中的〈目标列表达式〉可以是表中存在的属性列,也可以是表达式、常量或函数。

      例例3.12 查询全体学生的姓名和出生年份 在STUDENT表中只记录了学生的年龄,而没有记录学生的出生年份,但可以经过计算得到出生年份,即用当前年(假设为2007年)减去年龄,得到出生年份因此,实现此功能的查询语句为:SELECT SNAME,2007-SAGEFROM STUDENT;查询结果如表3-9所示机械工业出版社机械工业出版社58 3.3 SQL数据查询SNAMESSEX王晨1986李俊1987刘利敏1988张海1987吴浩1989程小磊1987张建超1988李云鹏1989刘一鸣1987表3-9 查询姓名和出生年份结果机械工业出版社机械工业出版社59 3.3 SQL数据查询例例3.13 查询全体学生的姓名和出生年份,并在出生年 份列前加入一个列,此列的每行数据均为“YEAR OF BIRTH”常量值SELECT SNAME, ‘YEAR OF BIRTH’,2007-SAGEFROM STUDENT;查询结果如表3-10所示机械工业出版社机械工业出版社60 3.3 SQL数据查询表3-10 查询并加入新列结果SNAME王晨YEAROFBIRTH 1986李俊YEAROFBIRTH1987刘利敏YEAROFBIRTH1988张海YEAROFBIRTH1987吴浩YEAROFBIRTH1989程小磊YEAROFBIRTH1987张建超YEAROFBIRTH1988李云鹏YEAROFBIRTH1989刘一鸣YEAROFBIRTH1987注意,选择列表中的常量和计算是对表中的每一行进行的。

      机械工业出版社机械工业出版社61 3.3 SQL数据查询例3.14 查询全体学生的姓名、出生年份和所在系,要求用小写字母表示学号中的字母 SELECT ISLOWER(SNO) ,SNAME, ‘YEAR OF BIRTH’,2007-SAGEFROM STUDENT;查询结果如表3-11所示机械工业出版社机械工业出版社62 3.3 SQL数据查询表3-11 查询并用小写字母标示系名结果SNAMES8201王晨YEAROFBIRTH 1986S8202李俊YEAROFBIRTH1987S8203刘利敏YEAROFBIRTH1988S8204张海YEAROFBIRTH1987S8801吴浩YEAROFBIRTH1989S8802程小磊YEAROFBIRTH1987S8803张建超YEAROFBIRTH1988S9101李云鹏YEAROFBIRTH1989S9102刘一鸣YEAROFBIRTH1987机械工业出版社机械工业出版社63 3.3 SQL数据查询 可以看出经过计算的列、函数的列和常量列显示结果都没有列标题,通过指定列的别名可以改变查询结果的列标题,这对于算数表达式、常量、函数名的目标列尤其有用。

      改变列标题的语法格式为:改变列标题的语法格式为:列名|表达式 [AS] 列标题或列标题=列名|表达式机械工业出版社机械工业出版社64 3.3 SQL数据查询例如,对于例3.14,可以定义如下列别名:SELECT ISLOWER(SNO) LSNO,SNAME, ‘YEAR OF BIRTH’ BRITH, 2007-SAGE BRITHDAYFROM STUDENT;查询结果间如表3-12所示机械工业出版社机械工业出版社65 3.3 SQL数据查询表3-12 查询并定义别名结果LSNO SNAMEBIRTHBRITHDAYS8201王晨YEAROFBIRTH 1986S8202李俊YEAROFBIRTH1987S8203刘利敏YEAROFBIRTH1988S8204张海YEAROFBIRTH1987S8801吴浩YEAROFBIRTH1989S8802程小磊YEAROFBIRTH1987S8803张建超YEAROFBIRTH1988S9101李云鹏YEAROFBIRTH1989S9102刘一鸣YEAROFBIRTH1987机械工业出版社机械工业出版社66 3.3 SQL数据查询2.选择表中的若干元组 上面介绍的例子全部都是选择表中的所有记录,而没有对表中的记录进行任何有条件的选择。

      事实上,在查询的过程中,除了可以选择列之外,还可以对行进行选择,使查询结果更加满足用户的要求1)消除取值相同的元组消除取值相同的元组 本来在数据库表中不存在取值完全相同的元组,但在进行了对列的选择后,在查询结果中就有可能出现取值完全相同的行了取值相同的行在结果中是没有意义的,因此应消除掉机械工业出版社机械工业出版社67 3.3 SQL数据查询例3.15 在基本表SC中查询选修了课程的学生学号SELECT SNO FROM SC;查询结果如表3-13所示SNOS8201S8202S8203S8204S8801S8802S8803S9101S9102 表3-13 查询学号结果机械工业出版社机械工业出版社68 3.3 SQL数据查询 在这个查询结果中有许多重复的元组,一个学生选修了多少门课程,其学号就在结果中重复几次如果想去掉结果表中的重复行,必须指定DISTINCT短语:SELECT DISTINCT SNO FROM SC;执行结果如表3-14所示机械工业出版社机械工业出版社69 TableSNOS8201S8202S8203S8204S8801表3-14去掉重复行结果 DISTINCT关键字在SELECT的后边,目标列表达式的前边。

      如果没有指定DISTINCT短语,则默认ALL,即保留结果表中取值重复的行SELECT SNO FROM SC;等价于:SELECT ALL SNO FROM SC;机械工业出版社机械工业出版社70 3.3 SQL数据查询(2)查询满足条件的元组查询满足条件的元组查询满足条件的元组是通过WHERE子句来实现的WHERE子句常用的查询条件如表3-15所示查询条件谓 词比较(比较运算符)=,>,<,>=,<=,!=,<>,!>,!<,NOT+上述比较运算符确定范围BETWEEN AND,NOT BETWEEN AND确定集合IN,NOT IN字符匹配LIKE,NOT LIKE空值IS NULL,IS NOT NULL多重条件(逻辑谓词)AND,OR表3-15 常用的查询条件机械工业出版社机械工业出版社71 3.3 SQL数据查询①比较大小的查询例例3.16 查询计算机系的所有学生的学号、姓名SELECT SNO, SNAMEFROM STUDENTWHERE SDEPT=’计算机系’;查询结果如表3-16所示SNOSNAMES8201王晨S8202李俊S8203刘利敏S8204张海表3-16 查询计算机系学生学号、姓名结果机械工业出版社机械工业出版社72 3.3 SQL数据查询例3.17 查询所有年龄在21岁以下的学生姓名及年龄。

      SELECT SNAME, SAGEFROM STUDENTWHERE SAGE<21;等价于:SELECT SNAME, SAGEFROM STUDENTWHERE NOT SAGE>=21;查询结果如表3-17所示SNAMESAGE李俊20刘利敏19张海20吴浩18程小磊20张建超19李云鹏18刘一鸣20表3-17 查询21岁以下的学生结果机械工业出版社机械工业出版社73 3.3 SQL数据查询例例3.18 查询考试成绩在85分以上(包括85分)的学生学号SELECT SNOFROM COURSEWHERE GRADE>=85;查询结果如表3-18所示SNO GRADES820192S820185S820288S820394S820391S820490S880186表3-18 查询成绩在85分以上的结果机械工业出版社机械工业出版社74 3.3 SQL数据查询②确定范围的查询 BETWEEN…AND和NOT BETWEEN…AND是逻辑运算符,可以用来查找属性值在或不在指定范围内的元组,其中BETWEEN后面指定范围的下限,AND后面指定范围的上限使用BETWEEN…AND的格式为:列名|表达式 [NOT] BETWEEN 下限值 AND 上限值 BETWEEN…AND一般用于对数值型数据进行比较。

      列名或表达式的类型要与下限值或上限值的类型相同 “BETWEEN 下限值 AND 上限值”的含义是:如果列或表达式的值在下限值和上限值范围内,则结果为TRUE,表明此记录符合查询条件,否则结果为FALSE,表明此记录不符合查询条件 “NOT BETWEEN 下限值 AND 上限值”的含义正好相反:如果列或表达式的值在下限值和上限值范围内,则结果为FALSE,表明此记录不符合查询条件,否则结果为TRUE,表明此记录符合查询条件机械工业出版社机械工业出版社75 3.3 SQL数据查询例例3.19 查询年龄在19~21岁之间的学生学号、 姓名和年龄SELECT SNO, SNAME, SAGEFROM STUDENTWHERE SAGE BETWEEN 19 AND 21;查询结果如表3-19所示机械工业出版社机械工业出版社76 3.3 SQL数据查询SNOSNAMESAGES8201王晨21S8202李俊20S8203刘利敏19S8204张海20S8802程小磊20S8803张建超19S9102刘一鸣20表3-19 查询年龄19~21岁学生结果等价于:SELECT SNO, SNAME, SAGEFROM STUDENTWHERE SAGE>=19 AND SAGE<=21;机械工业出版社机械工业出版社77 3.3 SQL数据查询例例3.20 查询年龄不在19~21岁之间的学生学号、姓名和年龄。

      SELECT SNO, SNAME, SAGEFROM STUDENTWHERE SAGE NOT BETWEEN 19 AND 21;等价于:SELECT SNO, SNAME, SAGEFROM STUDENTWHERE SAGE<19 OR SAGE>21;查询结果如表3-20所示SNOSNAMESAGES8801吴浩18S9101李云鹏18表3-20查询不在年龄19~21岁学生结果机械工业出版社机械工业出版社78 3.3 SQL数据查询③确定集合的查询 如果要查找属性值属于指定集合的元组,可以使用一个逻辑运算符IN,使用IN的格式为:列名[NOT] IN <常量1,常量2,…,常量n> 用IN进行比较的数据大多为字符型数据,也可以是数值型数据 IN的含义为:当列的值与IN中的某个常量值相同时,则结果为TRUE,表明此记录符合查询条件NOT IN的含义正好相反,当列的值与某个常量相同时,则结果为FALSE,表明此记录不符合查询条件机械工业出版社机械工业出版社79 3.3 SQL数据查询例3.21查询计算机系和数学系学生的学号、姓名和性别SELECT SNO, SNAME, SSEXFROM STUDENTWHERE SDEPT IN (‘计算机系’, ‘数学系’);等价于:SELECT SNO, SNAME, SSEXFROM STUDENTWHERE SDEPT =‘计算机系’ OR SDEPT =‘数学系’;查询结果如表3-21所示。

      机械工业出版社机械工业出版社80 3.3 SQL数据查询SNOSNAMESSEXS8201王晨男S8202李俊女S8203刘利敏女S8204张海男S8801吴浩男S8802程小磊男S8803张建超男表3-21 查询计算机系和数学系学生结果机械工业出版社机械工业出版社81 3.3 SQL数据查询例例3.22 查询既不是计算机系,也不是数学系学生的学号、姓名、性别和年龄SELECT SNO, SNAME, SSEX, SAGEFROM STUDENTWHERE SDEPT NOT IN (‘计算机系’, ‘数学系’);等价于:SELECT SNO, SNAME, SSEX, SAGEFROM STUDENTWHERE SDEPT! =‘计算机系’ OR SDEPT!= ‘数学系’;查询结果如表3-22所示表3-22查询既不是计算机系也不是数学系学生结果机械工业出版社机械工业出版社82 3.3 SQL数据查询④字符匹配的查询 LIKE用于查找指定列值与匹配串常量匹配的元组匹配串是一种特殊的字符串,其特殊之处在于它不仅可以包含普通字符,而且还可以包含通配符通配符用于表示任意的字符或字符串。

      在实际应用中,如果需要从数据库中检索一批记录,但又不能给出精确的字符查询条件,这时就可以使用LIKE运算符和通配符来实现模糊查询在LIKE运算符前边也可以使用NOT运算符,表示对结果取反,其一般格式为:[NOT] LIKE ‘匹配串’ [ESCAPE ‘<换码字符>’]机械工业出版社机械工业出版社83 3.3 SQL数据查询 其含义是查找指定的属性列值与匹配串相匹配的元组匹配串可以是一个完整的字符串,也可以含有通配符%和_其中:§%(百分号)代表任意长度(长度可以为0)的字符串例如,a%b表示以a开头,以b结尾的任意长度的字符串如acb、adertb、artghklb等§_(下横线)表示任意单个字符例如,a_b表示以a开头,以b结尾的长度为3的任意字符串如adb、agb等都满足该匹配串机械工业出版社机械工业出版社84 3.3 SQL数据查询例3.23 查询数学系学生的信息SELECT *FROM STUDENTWHERE SDEPT LIKE ‘数学系’;等价于:SELECT *FROM STUDENTWHERE SDEPT= ‘数学系’;如果LIKE后面的匹配串中不含通配符,则可以用=(等于)运算符代替LIKE谓词,用!=或<>(不等于)运算符取代NOT LIKE谓词。

      查询结果如表3-23所示机械工业出版社机械工业出版社85 3.3 SQL数据查询SNOSNAMESSEXSAGESDEPTS8801吴浩男18数学系S8802程小磊男20数学系S8803张建超男19数学系表3-23查询数学系学生结果机械工业出版社机械工业出版社86 3.3 SQL数据查询例3.24 查询所有姓李的学生信息SELECT *FROM STUDENTWHERE SNAME LIKE ‘李%’;查询结果如表3-24所示SNOSNAMESSEXSAGESDEPTS8202李俊女20计算机系S9101李云鹏男18自动化系表3-24 查询所有姓李的学生结果机械工业出版社机械工业出版社87 3.3 SQL数据查询例3.25 查询姓名中第二个字为“小”的学生信息SELECT *FROM STUDENTWHERE SNAME LIKE ‘_ _小%’;注意:因为一个汉字要占两个字符的位置,所以匹配串“小”前面需要两个“_”查询结果如表3-25所示表3-25查询姓名中第二个字为“小”的学生结果SNOSNAMESSEXSAGESDEPTS8802程小磊男20数学系机械工业出版社机械工业出版社88 3.3 SQL数据查询例3.26 查询所有不姓刘的学生信息。

      SELECT *FROM STUDENTWHERE SNAME NOT LIKE ‘刘%’;查询结果如表3-26所示机械工业出版社机械工业出版社89 3.3 SQL数据查询SNOSNAMESSEXSAGESDEPTS8201王晨男21计算机系S8202李俊女20计算机系S8204张海男20计算机系S8801吴浩男18数学系S8802程小磊男20数学系S8803张建超男19数学系S9101李云鹏男18自动化系表3-26 查询所有不姓刘的学生结果假如用户要查询的字符串本身就含有%和_,这时就要使用ESCAPE‘<换码字符>’短语对通配符进行转义机械工业出版社机械工业出版社90 3.3 SQL数据查询例3.27 假设课程表COURSE中有课程DB_Design,查询该课程的课程号和学分SELECT CNO, CREDITSFROM COURSEWHERE CNAME LIKE ‘DB\_Design’ ESCAPE ’\’; ESCAPE ‘\’短语表示\为换码字符,这样匹配字符串中紧跟在\后面的字符_不再具有通配符的含义,转义为普通的_字符机械工业出版社机械工业出版社91 3.3 SQL数据查询⑤涉及空值的查询 空值(NULL)在数据库中具有特殊的含义,它表示不确定的值。

      例如,某些学生选修课程后还没有参加考试,所以这些学生有选课记录,但没有考试成绩,因此考试成绩为空值判断某个值是否为NULL值,不能使用普通的比较运算符(=、!=),而只能使用专门的判断NULL值的子句来完成机械工业出版社机械工业出版社92 3.3 SQL数据查询判断取值为空的语句格式为:列名IS NULL判断取值不为空的语句格式为:列名IS NOT NULL例3.28 查询无考试成绩的学生学号及相应的课程号SELECT SNO, CNOFROM SCWHERE GRADE IS NULL;机械工业出版社机械工业出版社93 3.3 SQL数据查询⑥多重条件的查询 在WHERE子句中可以使用逻辑运算符AND和OR来组成多条件查询用AND连接的条件表示必须全部满足所有条件的结果才为TRUE,用OR连接的条件表示只要满足其中一个条件的结果即为TRUEAND的优先级高于OR,但用户可以用括号改变优先级机械工业出版社机械工业出版社94 3.3 SQL数据查询例3.29 查询数学系中年龄在20岁以下的学生信息SELECT *FROM STUDENTWHERE SDEPT=‘数学系’ AND SAGE<20;查询结果如表3-27所示。

      表3-27查询数学系中年龄在20岁以下的学生信息结果SNOSNAMESSEXSAGESDEPTS8801吴浩男18数学系S8803张建超男19数学系机械工业出版社机械工业出版社95 3.3 SQL数据查询3.对查询结果进行排序 对查询输出的结果有时希望能按照一定的顺序排列,比如按考试成绩从高到低输出学生的考试情况SQL语句支持将查询的结果按用户指定的列进行排序的功能,而且查询结果既可以按一个列排序,也可以按多个列进行排序,排序可以从小到大(升序),也可以从大到小(降序)排序子句的格式为:ORDER BY <列名> [ASC|DESC] [,… n]其中,〈列名〉为排序的依据列,可以是列名或列的别名ASC表示对列进行升序排列,DESC表示对列进行降序排列如果没有指定排序方式,则默认的排序方式为升序排列机械工业出版社机械工业出版社96 3.3 SQL数据查询 如果在ORDER BY子句中使用多个列进行排序,则这些列在该子句中出现的顺序决定了对查询结果集进行排序的方式当指定多个排序依据列时,首先对排在最前的列进行排序,如果排序后存在两个或两个以上列值相同的记录,则对这些值相同的记录再依据排在第二位的列进行排序,依此类推。

      机械工业出版社机械工业出版社97 3.3 SQL数据查询例3.30 查询选修了“2”号课程的学生学号及其成绩,查询结果按成绩升序排列SELECT SNO,CNO,GRADEFROM SCWHERE CNO=‘2’ ORDER BY GRADE ASC;查询结果如表3-28所示表3-28查询选修 “2”号课程的学生结果SNOCNOGRADES8202274S8203291机械工业出版社机械工业出版社98 3.3 SQL数据查询例例3.31 查询全体学生的信息,查询结果按所在系的系名降序排列,同系的学生按年龄升序排列,年龄相同的学生按学号升序排列SELECT *FROM STUDENTORDER BY SDEPT DESC, SAGE, SNO;查询结果如表3-29所示机械工业出版社机械工业出版社99 3.3 SQL数据查询SNOSNAMESSEXSAGESDEPTS9101李云鹏男18自动化系S9102刘一鸣女20自动化系S8801吴浩男18数学系S8803张建超男19数学系S8802程小磊男20数学系S8203刘利敏女19计算机系S8202李俊女20计算机系S8204张海男20计算机系S8201王晨男21计算机系表3-29查询结果对于空值,若按升序排列,含空值的元组将排在最后,若按降序排列,含空值的元组将排在最前面。

      机械工业出版社机械工业出版社100 3.3 SQL数据查询4.使用集函数 为了方便用户,进一步增强查询功能,SQL提供了一些集函数,常用的有以下几种:COUNT([DISTINCT|ALL]*) 统计表中元组的个数COUNT([DISTINCT|ALL] <列名>) 统计一个列中值的个数SUM(([DISTINCT|ALL] <列名>) 计算一列值的总和(此 列必须是数值型数据)AVG([DISTINCT|ALL] <列名>) 计算一列值的平均值 (此列必须是数值型数据)MAX([DISTINCT|ALL] <列名>) 求一个列中的最大值MIN([DISTINCT|ALL] <列名>) 求一个列中的最小值机械工业出版社机械工业出版社101 3.3 SQL数据查询 如果指定DISTINCT短语,则表示在计算时要取消指定列中的重复值。

      如果不指定DISTINCT短语或指定ALL短语(ALL为缺省值),则表示不取消重复值上述函数中除COUNT外,其他函数在计算过程中均忽略NULL值例3.32 查询全体学生的总人数SELECT COUNT(*)FROM STUDENT;例3.33 查询选修了课程的学生人数SELECT COUNT(DISTINCT SNO)FROM SC;学生每选修一门课,在基本表SC中就有一条相应的记录一个学生可以选修多门课程,为避免重复计算学生人数,必须在COUNT函数中使DISTINCT短语机械工业出版社机械工业出版社102 3.3 SQL数据查询例3.34 计算选修3号课程的学生平均成绩SELECT AVG(GRADE)FROM SCWHERE CNO=’3’;例3.35 查询选修3号课程的学生最高成绩SELECT MAX(GRADE)FROM SCWHERE CNO=’3’;机械工业出版社机械工业出版社103 3.3 SQL数据查询5.对查询结果分组 GROUP BY子句将查询结果表按某一列或多列值分组,值相等的为一组 对查询结果分组的目的是为了细化集函数的作用对象如果未对查询结果分组,集函数将作用于整个查询结果,如上面的例3.32、例3.33、例3.34、例3.35,分组后集函数将作用于每一组,使每一组都有一个函数值。

      在一个查询语句中,可以使用多个列进行分组如果使用了分组子句,则查询列表中的每个列要么是分组依据列(在GROUP BY后边的列),要么是集函数 使用GROUP BY时,如果在SELECT语句的查询列表中包含计算函数,则是针对每个组计算出一个汇总值,从而实现对查询结果的分组统计机械工业出版社机械工业出版社104 3.3 SQL数据查询分组语句跟在WHERE子句后面,它的一般格式为:GROUP BY <分组依据列> [,… n][HAVING <组提取条件>]HAVING短语用于对分组后的结果再进行过滤,它的功能类似于WHERE子句,但它用于组而不是单个记录在HAVING短语中可以使用计算函数,但在WHERE子句中则不能HAVING短语通常与GROUP BY子句一起使用机械工业出版社机械工业出版社105 3.3 SQL数据查询例3.36 求各个课程号及相应的选课人数 SELECT CNO, COUNT(SNO) CNTSNO FROM SC GROUP BY CNO;该命令对查询结果按CNO的值分组,所有具有相同CNO值的元组为一组,然后对每一组用集函数COUNT计算,以求得该组的学生人数。

      查询结果如表3-30所示机械工业出版社机械工业出版社106 3.3 SQL数据查询表3-30 各个课程号及相应的选课人数 如果分组后还要求按一定条件对这些组进行筛选,最终只输出满足指定条件的组,则可以使用HAVING短语指定筛选条件CNOCNTSNO1322324251机械工业出版社机械工业出版社107 3.3 SQL数据查询例例3.37 查询选修了2门以上课程的学生学号 SELECT SNO FROM SC GROUP BY SNO HAVING COUNT(*)>2; 该命令先用GROUP BY子句按SNO进行分组,再用集函数COUNT对每一组计数HAVING短语指定选择组的条件,只有满足条件(即元组个数>2,表示该学生选修的课程超过2门)的组才会被选出来 WHERE子句和HAVING短语的区别在于作用的对象不同,WHERE子句作用于基本表或视图,从中选择满足条件的元组HAVING短语作用于组,从中选择满足条件的组机械工业出版社机械工业出版社108 3.3 SQL数据查询3.3.3 连接查询 前面介绍的查询都是针对一个表进行的,但有时需要从多个表中获取信息,因此,查询时就会涉及多个表。

      若一个查询涉及两个表或两个以上的表,则称之为连接查询连接查询是关系数据库中最主要的查询,主要包括等值查询、自然连接查询、非等值连接查询、自身连接查询、外连接查询和复合条件连接查询机械工业出版社机械工业出版社109 3.3 SQL数据查询1.不同表之间的等值与非等值连接查询 连接查询中用来连接两个表的条件称为连接条件或连接谓词不同表之间的连接查询,主要是WHERE子句中的连接条件及两个表的属性列名,其连接条件的一般格式为:[<表名1>.] <列名1> <比较运算符> [<表名2>.] <列名2>此外连接条件还可以使用下面的形式:[<表名1>.] <列名1> BETWEEN [<表名2>.] <列名2> AND [<表名3>.] <列名3>其中比较运算符主要有:=、>、<、>=、<=、!=当连接的比较运算符为“=”时,称为等值连接,使用其它运算符称为非等值连接连接条件中列名对应属性的类型必须是可比的,但不必是相同的机械工业出版社机械工业出版社110 3.3 SQL数据查询 DBMS执行连接操作的过程是:首先在表1中找到第1个元组,然后从头开始扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第1个元组与该元组拼接起来,形成结果表中的第1个元组。

      表2全部查找完后,再找表1中的第2个元组,然后再从头开始扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第2个元组与该元组拼接起来,形成结果表中的第2个元组重复上述操作,直到表1中的所有元组都处理完毕为止机械工业出版社机械工业出版社111 3.3 SQL数据查询例3.38 查询每个学生及其选修课程的情况 SELECT STUDENT.*, SC.* FROM STUDENT, SC WHERE STUDENT.SNO=SC.SNO; 该命令中WHERE子句将表STUDENT和表SC中同一学号的元组连接起来了 查询结果如表3-31所示机械工业出版社机械工业出版社112 3.3 SQL数据查询表3-31查询每个学生及其选修课程结果SNOSNAMESSEXSAGESDEPTSNOCNOGRADES8201王晨男21计算机系S8201192S8201王晨男21计算机系S8201385S8202李俊女20计算机系S8202188S8202李俊女20计算机系S8202274S8202李俊女20计算机系S8202383S8203刘利敏女19计算机系S8203194S8203刘利敏女19计算机系S8203291S8204张海男20计算机系S8204475S8204张海男20计算机系S8204590S8801吴浩男18数学系S8801486为了避免混淆,本例中的SELECT子句与WHERE子句中的属性名前都加上了表名前缀。

      如果属性名在参加连接的各表中是唯一的,则可以省略表名前缀机械工业出版社机械工业出版社113 3.3 SQL数据查询数据查询 连接运算中有两种特殊情况,一种为自然连接,另一连接运算中有两种特殊情况,一种为自然连接,另一种为广义笛卡尔积连接种为广义笛卡尔积连接 广义笛卡尔积是不带连接谓词的连接两个表的广义广义笛卡尔积是不带连接谓词的连接两个表的广义笛卡尔积即是两个表中元组的交叉乘积,其连接的结果会笛卡尔积即是两个表中元组的交叉乘积,其连接的结果会产生一些没有意义的元组,因此实际上这种运算很少使产生一些没有意义的元组,因此实际上这种运算很少使用 若把等值连接中目标列中重复的属性去掉则称为自然连若把等值连接中目标列中重复的属性去掉则称为自然连接 机械工业出版社机械工业出版社114 3.3 SQL数据查询数据查询例例3.39 对例对例3-38用自然连接完成用自然连接完成 SELECT STUDENT.SNO, SNAME, SSEX, SAGE, SDEPT, CNO, GRADE FROM STUDENT, SC WHERE STUDENT.SNO=SC.SNO; 本例中,由于本例中,由于SNAME、、SSEX、、SAGE、、SDEPT、、CNO和和GRADE属性列在表属性列在表STUDENT和和SC中是唯一的,因此引用时可中是唯一的,因此引用时可以以不带表名前缀。

      而不带表名前缀而SNO在两个表中都出现了,因此引用时必须加在两个表中都出现了,因此引用时必须加上表名前缀上表名前缀机械工业出版社机械工业出版社115 3.3 SQL数据查询数据查询2.自身连接查询.自身连接查询 连接操作不仅可以在两个表之间进行,一个表也可以与自己连接操作不仅可以在两个表之间进行,一个表也可以与自己进行连接,称为表的自身连接进行连接,称为表的自身连接例例3.40 查询每一门课程的间接先修课(即先修课的先修课)查询每一门课程的间接先修课(即先修课的先修课) 在表在表COURSE中,只有每门课的直接先修课信息,而没有先中,只有每门课的直接先修课信息,而没有先修课的先修课信息,要得到这个信息,必须先对一门课找到其先修课的先修课信息,要得到这个信息,必须先对一门课找到其先修课,再按此先修课的课程号,查找它的先修课,即可得到所需修课,再按此先修课的课程号,查找它的先修课,即可得到所需的查询结果这需要将表的查询结果这需要将表COURSE与其自身连接为方便连接运与其自身连接为方便连接运算,这里为表算,这里为表COURSE取两个别名分别为取两个别名分别为A、、B机械工业出版社机械工业出版社116 3.3 SQL数据查询数据查询 SELECT A.CNO, A.CNAME,B.CPNO FROM COURSE A, COURSE B WHERE A.CPNO=B.CNO;查询结果如表查询结果如表3-32所示。

      所示表表3-32 查询间接先修课结果查询间接先修课结果CNOCNAMECPNO5操作系统操作系统37数据库数据库38网络原理网络原理4机械工业出版社机械工业出版社117 3.3 SQL数据查询数据查询3.外连接查询.外连接查询 在通常的连接操作中,只有满足连接条件的元组才能作为结在通常的连接操作中,只有满足连接条件的元组才能作为结果输出,如例果输出,如例3.38和例和例3.39的结果中没有学号为的结果中没有学号为S8802、、S8803、、S9101、、S9102四个学生的信息,原因在于他们没有四个学生的信息,原因在于他们没有选课,在表选课,在表SC中没有相应的元组若想以中没有相应的元组若想以STUDENT表为主体列表为主体列出每个学生的基本信息及其他选课情况,且没有选课的学生也希出每个学生的基本信息及其他选课情况,且没有选课的学生也希望输出其基本信息,这时就需要使用外连接(望输出其基本信息,这时就需要使用外连接(Outer Join)外连接分为左外连接和右外连接两种类型标准连接分为左外连接和右外连接两种类型标准SQL规定的外连接规定的外连接的表示方法是在连接条件的左(右)边加上符号的表示方法是在连接条件的左(右)边加上符号*(有的数据库系(有的数据库系统中用统中用+),就分别表示左(右)连接。

      如果外连接符出现在连接),就分别表示左(右)连接如果外连接符出现在连接条件的右边,称其为右外连接;如果外连接符出现在连接条件的条件的右边,称其为右外连接;如果外连接符出现在连接条件的左边,则称其为左外连接左边,则称其为左外连接机械工业出版社机械工业出版社118 3.3 SQL数据查询例3.41 把例3-39中的自然连接改为右外连接 SELECT STUDENT.SNO, SNAME, SSEX, SAGE, SDEPT, CNO, GRADE FROM STUDENT, SC WHERE STUDENT.SNO=SC.SNO(*);执行结果如表3-33所示机械工业出版社机械工业出版社119 3.3 SQL数据查询数据查询表表3-33右外连接执行结果右外连接执行结果SNOSNAMESSEXSAGESDEPTSNOGRADES8201王晨王晨男男21计算机系计算机系S820192S8201王晨王晨男男21计算机系计算机系S820185S8202李俊李俊女女20计算机系计算机系S820288S8202李俊李俊女女20计算机系计算机系S820274S8202李俊李俊女女20计算机系计算机系S820283S8203刘利敏刘利敏女女19计算机系计算机系S820394S8203刘利敏刘利敏女女19计算机系计算机系S820391S8204张海张海男男20计算机系计算机系S820475S8204张海张海男男20计算机系计算机系S820490S8801吴浩吴浩男男18数学系数学系S880186S8802程小磊程小磊男男20数学系数学系S8803张建超张建超男男19数学系数学系S9101李云鹏李云鹏男男18自动化系自动化系S9102刘一鸣刘一鸣女女20自动化系自动化系机械工业出版社机械工业出版社120 3.3 SQL数据查询 外连接就好像是为符号*所在边的表(本例是表SC)增加了一个“万能”的行,这个行全部由空值组成。

      它可以和另一边的表(本例是表STUDENT)中属于不满足连接条件的元组进行连接本例中即与STUDENT表的S8802、S8803、S9101、S9102元组进行连接由于这个“万能”行的各列全部是空值,因此在连接结果中S8802、S8803、S9101、S9102四行中来自SC表的属性全部为空值机械工业出版社机械工业出版社121 3.3 SQL数据查询4.复合条件连接查询 上面各个连接查询中,WHERE子句中只有一个条件,即连接谓词WHERE子句中可以有多个连接条件,称为复合条件查询例例3.42 查询选修1号课程且成绩在90分以上的所有学生 SELECT STUDENT.SNO, SNAME, SC.CNO, GRADE FROM STUDENT, SC WHERE STUDENT.SNO=SC.SNO AND SC.CNO=‘1’ AND SC.GRADE>90; 查询结果如表3-34所示 机械工业出版社机械工业出版社122 3.3 SQL数据查询表3-34查询选修1号课程且成绩在90分以上的结果 连接操作除了可以是两个表连接、一个表与其自身连接外,还可以是两个以上的表进行连接,后者通常称为多表连接。

      SNOSNAMECNOGRADES8201王晨192S8203刘利敏194机械工业出版社机械工业出版社123 3.3 SQL数据查询例3.43 查询每个学生的学号、姓名、选课的课程名及成绩 SELECT STUDENT.SNO, SNAME, CNAME, GRADE FROM STUDENT, SC, COURSE WHERE STUDENT.SNO=SC.SNO AND SC.CNO=COURSE.CNO; 查询结果如表3-35所示机械工业出版社机械工业出版社124 3.3 SQL数据查询数据查询SNOSNAMECNAMEGRADES8201王晨王晨高等数学高等数学92S8201王晨王晨C语言语言85S8202李俊李俊高等数学高等数学88S8202李俊李俊英语英语74S8202李俊李俊C语言语言83S8203刘利敏刘利敏高等数学高等数学94S8203刘利敏刘利敏英语英语91S8204张海张海数据结构数据结构75S8204张海张海操作系统操作系统90S8801吴浩吴浩数据结构数据结构86表表3-35查询结果查询结果机械工业出版社机械工业出版社125 3.3 SQL数据查询3.3.4 嵌套查询 在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块。

      将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询例如: SELECT SNAME FROM STUDENT WHERE SNO IN (SELECT SNO FROM SC WHERE CNO=’2’); 机械工业出版社机械工业出版社126 3.3 SQL数据查询 本例中,下层查询块SELECT SNO FROM SC WHERE CNO=‘2’是嵌套在上层查询块SELECT SNAME FROM STUDENT WHERE SNO IN的WHERE条件中的上层的查询块称为外层查询或父查询,下层查询称为内层查询或子查询SQL语言允许多层嵌套查询,即一个子查询中还可以嵌套其他子查询需要注意的是,子查询的SELECT语句不能使用ORDER BY子句,ORDER BY子句只能对最终查询结果排序 嵌套查询一般的求解方法是由里向外处理即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查询条件。

      机械工业出版社机械工业出版社127 3.3 SQL数据查询 嵌套查询可以使用多个简单查询构成复杂的查询,从而增添了SQL语言的查询能力,以层层查询的方式来构造程序正是SQL中“结构化”的含义所在1.带谓词IN的嵌套查询 在嵌套查询中,子查询的结果往往是一个集合,所以谓词IN是嵌套查询中最常使用的谓词例例3.44 查询与“李俊”在同一个系学习的学生学号、姓名、性别和系别先分步来完成此查询,然后再构造嵌套查询机械工业出版社机械工业出版社128 3.3 SQL数据查询①确定“李俊”所在的系名; SELECT SDEPT FROM STUDENT WHERE SNAME= ‘李俊’ ;查询结果如表3-36所示 表3-36 确定系名SDEPT计算机系计算机系机械工业出版社机械工业出版社129 3.3 SQL数据查询②查询所有在计算机系学习的学生; SELECT SNO, SNAME, SSEX, SDEPT FROM STUDENT WHERE SDEPT= ‘计算机系’ ;查询结果如表3-37所示。

      表3-37 确定在计算机系学习的学生SNOSNAMESSEXSDEPTS8201王晨男计算机系S8202李俊女计算机系S8203刘利敏女计算机系S8204张海男计算机系机械工业出版社机械工业出版社130 3.3 SQL数据查询 将第①步查询插入到第②步查询的条件中,构造嵌套查询,SQL语句如下: SELECT SNO, SNAME, SSEX, SDEPT FROM STUDENT WHERE SDEPT IN (SELECT SDEPT FROM STUDENT WHERE SNAME= ‘李俊’ ); DBMS求解该查询时,实际上也是分步去实现的,类似于上面的分步过程机械工业出版社机械工业出版社131 3.3 SQL数据查询 本例中的查询也可以用自身连接来完成: SELECT S1.SNO, S1.SNAME, S1.SSEX, S1.SDEPT FROM STUDENT S1, STUDENT S2 WHERE S1.SDEPT=S2. SDEPT AND S2.SNAME=‘李俊’; 由以上例子可以看出,实现一个查询可以有多种方法,当然不同的方法其执行效率可能会不同,甚至差别会很大。

      机械工业出版社机械工业出版社132 3.3 SQL数据查询 本例中父查询和子查询都引用了STUDENT表,可以像自身连接那样用别名将父查询中的STUDENT表与子查询中STUDENT表区分开来 SELECT SNO, SNAME, SSEX, SDEPT FROM STUDENT S1 WHERE S1.SDEPT IN (SELECT SDEPT FROM STUDENT S2 WHERE S2.SNAME= ‘李俊’ );机械工业出版社机械工业出版社133 3.3 SQL数据查询例例3.45 查询选修了课程名为“高等数学”的学生信息 本查询涉及学生的信息,学生信息存放在STUDENT表中,而课程名存放在COURSE表中,但表STUDENT和表COURSE之间没有直接联系,必须通过SC表建立它们之间的联系,所以本查询实际上涉及了三个表SELECT * ③最后在STUDENT表中找出学生信息FROM STUDENT WHERE SNO IN (SELECT SNO ②然后在SC表中找出选修了 FROM SC 1号课程的学生的学号 WHERE CNO IN (SELECT CNO ①首先在COURSE表中找出 FROM COURSE “高等数学”的课程号,结果为1 WHERE CNAME=’高等数学’)); 查询结果如表3-38所示。

      机械工业出版社机械工业出版社134 3.3 SQL数据查询SNOSNAMESSEXSAGESDEPTS8201王晨男21计算机系S8202李俊女20计算机系S8203刘利敏女19计算机系表3-38 查询选修了课程名为“高等数学”的学生结果本例同样可以用连接查询实现:SELECT *FROM STUDENT, SC, COURSEWHERE STUDENT.SNO=SC. SNO AND SC.CNO=COURSE.CNO AND COURSE.CNAME= ‘高等数学’;机械工业出版社机械工业出版社135 3.3 SQL数据查询 从例3.44和例3.45可以看出,查询涉及多个表时,用嵌套查询逐步求解,层次清楚,易于构造,具有结构化程序设计的优点另外,有些嵌套查询可以用连接运算替代,有些是不能替代的 例3.44和例3.45中的各个子查询都只执行了一次,其结果用于父查询子查询的查询条件不依赖于父查询,这类查询称为不相关子查询不相关子查询是最简单的一类查询机械工业出版社机械工业出版社136 3.3 SQL数据查询 2.带有比较运算符的子查询 带有比较运算符的子查询是指父查询与子查询之间用比较运算符进行连接。

      当用户能确切知道内层查询返回的是单值时,可以用>、<、=、>=、<=、!=或<>等比较运算符 例如,在例3.44种,由于一个学生只能在一个系学习,也就是说内查询的结果是一个单值,因此可以用=代替IN,其SQL语句如下: SELECT SNO, SNAME, SSEX, SDEPT FROM STUDENT WHERE SDEPT= (SELECT SDEPT FROM STUDENT WHERE SNAME= ‘李俊’ );机械工业出版社机械工业出版社137 3.3 SQL数据查询 需要注意的是,子查询一定要跟在比较运算符之后,下列写法是错误的的: SELECT SNO, SNAME, SSEX, SDEPT FROM STUDENT WHERE (SELECT SDEPT FROM STUDENT WHERE SNAME= ‘李俊’ ) =SDEPT;机械工业出版社机械工业出版社138 3.3 SQL数据查询3.带有ANY或ALL谓词的子查询 子查询返回单值时可以用比较运算符,而使用ANY或ALL谓词时则必须同时使用比较运算符,其语义如表3-39所示。

      表3-39 比较运算符语义>ANY大于子查询结果中的某个值>ALL大于子查询结果中的所有值=ANY大于等于子查询结果中的某个值>=ALL大于等于子查询结果中的所有值<=ANY小于等于子查询结果中的某个值<=ALL小于等于子查询结果的中所有值=ANY等于子查询结果中的某个值=ALL等于子查询结果中的所有值!=(或<>ANY)不等于子查询结果中的某个值!=(或<>ALL)不等于子查询结果中的任何一个值机械工业出版社机械工业出版社139 3.3 SQL数据查询例3.46 查询非计算机系的、且不超过计算机系所有学生年龄的学生信息 SELECT * FROM STUDENT WHERE SDEPT<>‘计算机系’ AND SAGE<=ALL (SELECT SAGE FROM STUDENT WHERE SDEPT=‘计算机系’ );查询结果如表3-40所示。

      机械工业出版社机械工业出版社140 3.3 SQL数据查询表3-40 查询结果SNOSNAMESSEXSAGESDEPTS8801吴浩男18数学系S8803张建超男19数学系S9101李云鹏男18自动化系 DBMS执行此查询时,首先处理子查询,找出计算机系中所有学生的年龄,构成一个集合{19,20,21},然后处理父查询,找出所有不是计算机系且年龄不超过19、20和21的学生本查询也可以使用集函数来实现,其SQL语句如下: SELECT * FROM STUDENT WHERE SDEPT<>‘计算机系’ AND SAGE<= (SELECT MIN(SAGE) FROM STUDENT WHERE SDEPT=‘计算机系’ );机械工业出版社机械工业出版社141 3.3 SQL数据查询 一般来说,用集函数实现子查询通常比直接用ANY或ALL查询效率要高ANY和ALL与集函数的对应关系如表3-41所示。

      表3-41 ANY和ALL谓词与集函数及IN谓词的等价转换关系4.带有EXISTS谓词的子查询 EXISTS表示存在量词,带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“TRUE”或逻辑假值“FALSE”<>或!=<<=>>=ANYIN—MIN>=MINALL—NOT INMAX>=MAX机械工业出版社机械工业出版社142 3.3 SQL数据查询例例3.47 查询所有选修了3号课程的学生信息 本查询涉及表STUDENT和表SC可以在表STUDENT中依次取出每一个元组的SNO值,去检查表SC,若SC中存在和该SNO值相等且CNO=‘3’的元组,则取STUDENT中该元组送入查询结果中其SQL语句如下: SELECT * FROM STUDENT WHERE EXISTS (SELECT * FROM SC WHERE SNO=STUDENT.SNO AND CNO=’3’);查询结果如表3-42所示。

      机械工业出版社机械工业出版社143 3.3 SQL数据查询表3-42查询所有选修了3号课程的学生结果 由EXISTS引出的子查询,其目标属性列表达式一般用*表示,因为带EXISTS的子查询只返回真值或假值,给出列名没有实际意义若内层子查询结果非空,则外层的WHERE子句条件为真(TRUE),否则为假(FALSE) 这类查询与前面介绍的不相关子查询有明显的区别:子查询的查询条件依赖于外层父查询某个属性值,称这类查询为相关子查询求解相关子查询不能像求解不相关子查询那样,一次将子查询求解出来,然后求解父查询内层查询由于与外层查询有关,因此必须反复求值SNOSNAMESSEXSAGESDEPTS8201王晨男21计算机系S8202李俊女20计算机系机械工业出版社机械工业出版社144 3.3 SQL数据查询 相关子查询的一般处理过程为:首先取外层查询STUDENT表中的第1个元组,根据它与内层查询相关的属性值(学号SNO值)处理内层子查询,若WHERE子句返回值为真,则取此元组放入查询结果表中,然后再取STUDENT表的下一个元组重复这一过程,直到外层STUDENT表全部检查完为止。

      与EXISTS谓词相对应的是NOT EXISTS谓词,使用存在量词NOT EXISTS后,若内层子查询结果为空,则外层查询的WHERE子句返回真值,否则返回假值 一些带有EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换,但所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换机械工业出版社机械工业出版社145 3.3 SQL数据查询例例3.48 将例3.44改为带谓词EXISTS的查询 SELECT SNO, SNAME, SSEX, SDEPT FROM STUDENT S1 WHERE EXISTS (SELECT * FROM STUDENT S2 WHERE S2.SDEPT=S1.SDEPT AND S2.SNAME= ‘李俊’ ); 由于带EXISTS谓词的相关子查询只关心内层子查询是否有返回值,并不需要查询具体值,因此其效率并不一定低于不相关子查询,有时是高效的方法。

      机械工业出版社机械工业出版社146 3.3 SQL数据查询3.3.5集合查询 SELECT语句的查询结果是元组的集合,所以多个SELECT语句的查询结果可以进行集合操作集合操作主要包括并操作UNION、交操作INTERSECT和差操作MINUS例例3.49 查询数学系的学生及年龄小于20岁的学生 SELECT * FROM STUDENT WHERE SDEPT=‘数学系’ UNION SELECT * FROM STUDENT WHERE SAGE<20;查询结果如表3-43所示机械工业出版社机械工业出版社147 3.3 SQL数据查询表3-43查询数学系的学生及年龄小于20岁的学生结果 这个查询实际上是求数学系的所有学生与年龄小于20岁的学生的并集使用UNION将多个查询结果合并起来时,系统会自动取消重复元组需要注意的是,参加UNION操作的各结果表的列数必须相同,对应的数据类型也必须相同SNOSNAMESSEXSAGESDEPTS8801吴浩男18数学系S8802程小磊男20数学系S8803张建超男19数学系S8203刘利敏女19计算机系S9101李云鹏男18自动化系机械工业出版社机械工业出版社148 3.3 SQL数据查询例3.50 查询选修了课程1或课程3的学生。

      即查询选修了课程1的学生集合与选修了课程3的学生集合的并集 SELECT * FROM SC WHERE CNO=’1’ UNION SELECT * FROM SNO WHERE CNO=’3’; 标准SQL语言没有直接提供集合交操作和集合差操作,但可以用其他方法来实现机械工业出版社机械工业出版社149 3.3 SQL数据查询例3.51 查询计算机系的学生与年龄不大于20岁的学生的交集即查询计算机系中年龄不大于20岁的学生 SELECT * FROM STUDENT WHERE SDEPT=‘计算机系’ AND SAGE<=20;机械工业出版社机械工业出版社150 3.4 SQL数据更新 上节讨论了如何使用SELECT语句对数据库中的数据进行检索,SELECT语句可以返回由行和列组成的结果,但查询操作不会使数据库中的数据发生任何变化SQL中数据更新包括插入数据(INSERT)、修改数据(UPDATE)和删除数据(DELETE)三条句机械工业出版社机械工业出版社151 3.4 SQL数据更新v3.4.1 插入数据记录 SQL的数据插入语句通常有两种形式,一种是插入一个元组,另一种是插入子查询结果。

      后者可以一次插入多个元组1.向表中插入单个元组向表中插入单个元组的INSERT语句格式为: INSERT INTO <表名> [(<属性列1>[,<属性列2>…])] VALUES (<常量1>[,<常量2>]…); 该命令的功能是将一个新元组插入到指定的表中其中,新元组属性列1的值取值常量1,属性列2的值取值常量2,依次类推INTO子句中没有出现的属性列,其新元组在这些列上将取空值但若在CREATE定义时使用了NOT NULL约束的属性列不能取空值,否则会出现错误 机械工业出版社机械工业出版社152 3.4 SQL数据更新 如果INTO子句中没有指明任何列名,则新插入的元组必须在每个属性列上均有值例例3.52 将一个学生元组(S8804,刘红英,女,20,数学系)插入到基本表STUDENT中 INSERT INTO STUDENT VALUES (‘S8804’, ‘刘红英’, ‘女’,20, ‘数学系’); 使用同样的命令可以将其他学生的元组插入到基本STUDENT中,用同样的命令还可以将课程信息和学生选课的元组分别插入到基本表COURSE和SC中。

      机械工业出版社机械工业出版社153 3.4 SQL数据更新例例3.53 插入一条选课记录(‘S8802’, ‘2’)到基本表SC中 INSERT INTO SC(SNO,CNO) VALUES (‘S8804’ ,’2’);新插入的记录在GRADE列上取空值机械工业出版社机械工业出版社154 3.4 SQL数据更新2.向表中插入查询子结果 子查询不仅可以嵌套在SELECT语句中,用以构造父查询的条件,也可以嵌套在INSERT语句中,用以生成批量插入的数据 插入子查询结果的INSERT语句的格式为: INSERT INTO <表名> [(<属性列1>[,<属性列2>…])]子查询; 如果表中包含一个主码,需要确定新插入的记录主码值唯一并且非空机械工业出版社机械工业出版社155 3.4 SQL数据更新例3.54 设数据库中已有一个表HISTORY-STUDENT,其关系模式与STUDENT完全相同,试将表STUDENT中的所有元组插入到表HISTORY-STUDENT中去。

      INSERT INTO HISTORY-STUDENT SELECT * FROM STUDENT; 这个命令在教学管理中非常有用,表STUDENT一般保存在校学生的信息,当学生毕业后就可将其转到历史表HISTORY-STUDENT中,这样既提高系统运行效率,又可以保证数据不丢失机械工业出版社机械工业出版社156 3.4 SQL数据更新例例3.55 对每一个学生,求其所选课程的总成绩,并把结果存入数据库 首先在数据库中建立一个新表,其中一列存放学号,另一列存放该学生的总成绩 CREATE TABLE TG(SNO CHAR(8),TGRADE INT); 然后对SC表按学号对成绩求和,再把学号和总成绩存入新表中 INSERT INTO TG(SNO,TGRADE) SELECT SNO,SUM(GRADE) FROM SC GROUP BY SNO;机械工业出版社机械工业出版社157 3.4 SQL数据更新3.4.2 修改数据记录 修改操作语句的一般格式为: UPDATE <表名> SET <列名1>=<表达式1>[,<列名2>=<表达式2>…] [WHERE <条件>]; 其功能是修改指定表中满足WHERE子句条件的元组,其中,SET子句由<表达式>的值取代相应<列名>的值。

      如果省略WHERE子句,则表示要修改表中的所有元组机械工业出版社机械工业出版社158 3.4 SQL数据更新例例3.56 将学号为S8801的学生的年龄改为19岁即要修改满足条件的一个元组的属性值 UPDATE STUDENT SET SAGE=19 WHERE SNO=’ S8801’;例例3.57 将所有学生的年龄增加1岁即要修改多个元组的值. UPDATE STUDENT SET SAGE=SAGE+1;机械工业出版社机械工业出版社159 3.4 SQL数据更新例例3.58 将数学系所有学生的成绩置为0UPDATE SCSET GRADE=0 WHERE ‘数学系’= (SELECT SDEPT FROM STUDENT WHERE STUDENT.SNO=SC.SNO);机械工业出版社机械工业出版社160 3.4 SQL数据更新3.4.3 删除数据记录 删除操作语句的一般格式为: DELETE FROM <表名> [WHERE <条件>]; DELETE语句的功能是从指定的表中删除满足WHERE子句条件的所有元组。

      如果省略WHERE子句,表示删除表中的所有元组,使表成为空表,但表的定义仍然在数据字典中即DELETE语句删除的是表中的数据,而不是关于表的定义机械工业出版社机械工业出版社161 3.4 SQL数据更新例例3.59 删除学号为S8203的学生记录 DELETE FROM STUDENT WHERE SNO=‘S8203’;例例3.60 删除学号为S8204的学生选修的课程号为‘4’的记录 DELETE FROM SC WHERE SNO=‘S8204’ AND CNO=‘4’;例例3.61 删除所有学生的选课记录 DELETE FROM SC;这条命令将删除表SC中的所有元组,使表SC成为空表机械工业出版社机械工业出版社162 3.4 SQL数据更新例3.62 删除计算机系所有学生的选课记录 DELETE FROM SC WHERE ‘计算机系’= (SELECT SDEPT FROM STUDENT WHERE STUDENT.SNO=SC.SNO); 需要注意的是,由于增加、删除、修改操作只能对一个表操作,如果不注意关系之间的参照完整性和操作顺序,就会操作失败,甚至发生数据库的不一致问题。

      例如,学号为S8801的学生退学而删除其在表STUDENT中的相关信息,若他在表SC中的选课信息没有同时删除,就会引起数据库的数据不一致问题因此有关参照表的元组必须同时删除机械工业出版社机械工业出版社163 3.4 SQL数据更新 当删除主表中的元组(例如学号为S8801的学生),通常使用以下两种方法:•系统自动地删除参照表(如SC)中相应(学号为S8801的选课)的元组•系统检查参照表中相应的元组,如果存在,则操作失败 如果在创建表STUDENT、COURSE和SC时定义了参照完整性约束,则当向参照表中插入元组时,系统将自动地检查被参照表中是否存在相应的元组,如果都存在则操作成功,否则操作失败 例如,向表SC中插入元组(‘S8803’, ‘5’)时,系统将自动检查被参照表STUDEN和COURSE中是否存在相应的元组,如果表STUDENT中存在学号为S8803的记录,并且表COURSE中存在课程号为5的记录,则插入操作可以成功实现否则操作失败机械工业出版社机械工业出版社164 3.5 视图 视图是关系数据库系统提供给用户以多种角度观察数据库数据的重要机制。

      视图是从一个或几个基本表(或视图)导出的表,它与基本表不同,是一个虚表数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中所以当基本表中的数据发生变化时,从视图中查询出的数据也就随之改变了从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化 视图一经定义,就可以和基本表一样被查询和删除也可以在一个视图之上再定义新的视图,但对视图的更新(增加、删除、修改)操作则有一定的限制机械工业出版社机械工业出版社165 3.5 视图3.5.1 视图的定义和删除1.定义视图SQL语言用CREATE VIEW命令建立视图,其一般格式为: CREATE VIEW <视图名> [(<列名>[,<列名>]…)] AS 可以是任意复杂的SELECT语句,但通常不允许含有ORDER BY子句和DISTINCT短语 WITH CHECK OPTION表示用视图进行UPDATE、INSERT和DELETE操作时要保证更新、插入或删除的元组满足视图定义中的谓词条件(即子查询中的条件表达式)。

      机械工业出版社机械工业出版社166 3.5 视图视图 组成视图的属性列名要么全部省略,要么全部指定如果视图定义中省略了属性列名,则隐含该视图由子查询中SELECT子句的目标列组成但在下列三种情况下必须指定组成视图的所有列名:(1)某个目标列不是单纯的属性名,而是集函数或列表达式某个目标列不是单纯的属性名,而是集函数或列表达式2)多表连接导出的视图中有几个同名列作为该视图的属性列名多表连接导出的视图中有几个同名列作为该视图的属性列名3)需要在视图中为某个列启用新的更合适的名字需要在视图中为某个列启用新的更合适的名字机械工业出版社机械工业出版社167 3.5 视图例例3.63 建立计算机系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有计算机系的学生,视图的属性名为SNO、SNAME、SAGE、SDEPT CREATE VIEW C-STUDENT AS SELECT SNO, SNAME, SAGE, SDEPT FROM STUDENT WHERE SDEPT=‘计算机系’ WITH CHECK OPTION; 由于在定义C-STUDENT视图时加上了WITH CHECK OPTION子句,以后对该视图进行插入、修改和删除操作时,DBMS会自动检查或加上SDEPT=‘计算机系’的条件。

      视图不仅可以建立在单个基本表上,也可以建立在多个基本表上机械工业出版社机械工业出版社168 3.5 视图例例3.64 建立学生的学号(SNO)、姓名(SNAME)、选修课程名(CNAME)及成绩(GRADE)的视图 本视图由三个基本表的连接操作导出,其SQL语句如下: CREATE VIEW STUDENT-CG1 AS SELECT STUDENT.SNO, SNAME, CNAME, GRADE FROM STUDENT, COURSE, SC WHERE STUDENT.SNO=SC.SNO AND SC.CNO=COURSE.CNO; DBMS执行CREATE VIEW语句的结果只是把视图的定义存入数据字典,并不执行其中的SELECT语句只是在对视图进行查询时,才按视图的定义从基本表中将数据查出 机械工业出版社机械工业出版社169 3.5 视图 视图不仅可以建立在一个或多个基本表上,也可以建立在一个或多个已定义好的视图上,或建立在基本表与视图上。

      例例3.65 建立选修课程的成绩在85分以上的学生视图 CREATE VIEW STUDENT-CG2 AS SELECT SNO, SNAME, CNAME, GRADE FROM STUDENT-CG1 WHERE GRADE>=85; 本例中的视图STUDENT-CG2是建立在视图STUDENT-CG1之上的 机械工业出版社机械工业出版社170 3.5 视图 定义基本表时,为了减少数据库中数据冗余问题,表中只存放基本数据,由基本数据经过各种计算派生出的数据一般是不存储的但由于视图中的数据并不实际存储,所以定义视图时可以根据应用的需要,设置一些派生属性列这些派生属性列由于在基本表中并不实际存在,因此称之为虚拟列带虚拟列的视图称为带表达式的视图例3.66 定义一个反映学生出生年份的视图 CREATE VIEW STUDENT-BRITH (SNO, SNAME, SBRITH) AS SELECT SNO, SNAME, 2007-SAGE FROM STUDENT; 本例中视图STUDENT-BRITH是一个带表达式的视图,其中的属性列SBRITH(出生年份)是通过计算得到的,即虚拟列。

      机械工业出版社机械工业出版社171 3.5 视图 还可以用带有集函数和GROUP BY子句的查询来定义视图,这种视图称为分组视图例3.67 将学生的学号及他的平均成绩定义为一个视图 CREATE VIEW STUDENT-CG3 (SNO, GAVG) AS SELECT SNO, AVG(GRADE) FROM SC GROUP BY SNO; 由于AS子句中SELECT语句的目标列平均成绩是通过作用集函数得到的,所以CREATE VIEW中必须明确定义组成STUDENT-CG3视图的各个属性列名,STUDENT-CG3是一个分组视图机械工业出版社机械工业出版社172 3.5 视图2.删除视图 删除视图的语句格式为:DROP VIEW <视图名>; 视图删除后视图的定义将从数据字典中删除,但是由该视图导出的其他视图的定义仍在数据字典中,不过该视图已失效用户使用时会出错,因此要用DROP VIEW语句将它们一一删除 就像基本表删除后,由该基本表导出的所有视图(定义)没有被删除,但均已无法使用了。

      删除这些视图(定义)需要使用DROP VIEW语句机械工业出版社机械工业出版社173 3.5 视图例3.68 删除视图STUDENT-CG1DROP VIEW STUDENT-CG1; 执行该语句后,STUDENT-CG1视图的定义将从数据字典中删除由STUDENT-CG1视图导出的STUDENT-CG2视图的定义虽然仍在数据字典中,但是该视图已无法使用了,因此应该同时删除机械工业出版社机械工业出版社174 3.5 视图3.5.2 查询视图 视图定义后,用户就可以像查询基本表一样使用视图了例3.69 在计算机系学生的视图C-STUDENT中找出年龄小于21岁的学生的学号、姓名和年龄 SELECT SNO, SNAME, SAGE FROM C-STUDENT WHERE SAGE<21; 机械工业出版社机械工业出版社175 3.5 视图 DBMS执行对视图的查询时,首先进行有效性检查,检查要查询的表或视图是否存在如果存在,则从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后再执行修正了的查询。

      这一转换过程称为视图消解(View Resolution)本例转换后的查询语句为: SELECT SNO, SNAME, SAGE FROM STUDENT WHERE SDEPT =‘计算机系’ AND SAGE<21;机械工业出版社机械工业出版社176 3.5 视图例3.70 查询计算机系选修了1号课程的学生 SELECT SNO, SNAME FROM C-STUDENT, SC WHERE C-STUDENT.SNO=SC.SNO SND SC.CNO=‘1’; 本查询涉及了虚表C-STUDENT和基本表SC,通过这两个表的连接来完成用户的请求在一般情况下,视图查询的转换是直接进行的但有些情况下,这种转换不能直接进行,查询时就会出现问题机械工业出版社机械工业出版社177 3.5 视图例例3.71 在STUDENT-CG3视图中查询平均成绩在80分以上的学生学号和平均成绩 SQL语句为: SELECT * FROM STUDENT-CG3 WHERE GAVG>=80; STUDENT-CG3视图定义为: CREATE VIEW STUDENT-CG3 (SNO, GAVG) AS SELECT SNO, AVG(GRADE) FROM SC GROUP BY SNO;机械工业出版社机械工业出版社178 3.5 视图将上面查询语句与子查询结合后,形成下列查询语句: SELECT SNO, AVG(GRADE) FROM SC WHERE AVG(GRADE)>=80 GROUP BY SNO; 前面介绍过WHERE子句中是不能使用集函数作为条件表达式的,因此执行此修正后的查询语句将会出现语法错误。

      机械工业出版社机械工业出版社179 3.5 视图 正确的查询语句应该是: SELECT SNO, AVG(GRADE) FROM SC GROUP BY SNO HAVING AVG(GRADE)>=80; 目前大多数关系数据库系统对行列子集视图的查询均能进行正确转换但对非行列子集的查询就不一定能做转换了,因此这类查询应该直接对基本表进行机械工业出版社机械工业出版社180 3.5 视图3.5.3 更新视图 视图更新是指通过视图来插入(INSERT)、删除(DELETE)和修改(UPDATE)数据由于视图实际上是不存储数据的虚表,因此对视图的更新,最终要转换为对基本表的更新 为防止用户通过视图对基本表进行增加、删除和修改时,可在定义视图时加上WITH CHECK OPTION字句这样在视图上增加、删除和修改数据时,DBMS会检查视图定义中的条件,若不满足条件,则拒绝执行该操作机械工业出版社机械工业出版社181 3.5 视图例3.72 将计算机系学生视图C-STUDENT中学号为S8204的学生姓名改为张大海。

      UPDATE C-STUDENT SET SNAME=‘张大海’ WHERE SNO=’S8204’; DBMS自动转换为对基本表的更新语句如下: UPDATE STUDENT SET SNAME=‘张大海’ WHERE SNO=‘S8204’ AND SDEPT=‘计算机系’;机械工业出版社机械工业出版社182 3.5 视图例3.73 向计算机系学生视图C-STUDENT中插入一个新的学生记录,其学号为S8205,姓名为李红,年龄为18岁 INSERT INTO C-STUDENT VALUES (‘S8205’, ‘李红’,18, ‘计算机系’);转换为对基本表的更新: INSERT INTO STUDENT(SNO,SNAME,SAGE,SDEPT) VALUES (‘S8205’, ‘李红’,18, ‘计算机系’);机械工业出版社机械工业出版社183 3.5 视图视图 由于在定义视图C-STUDENT时应用了“WITH CHECK OPTION”短语,其作用是限制SDEPT的值必须是“计算机系”才允许由视图C-STUDENT插入,若换成其他任何字符,DBMS都拒绝执行插入操作。

      若定义视图C-STUDENT时不用“WITH CHECK OPTION”短语,则以上VSLUES短语中改为(‘S8205’, ‘李红’,18, ‘数学系’),仍然可以完成插入操作,但用SELECT * FROM C-STUDEBT命令则看不到刚插入的元组机械工业出版社机械工业出版社184 3.5 视图例3.74 删除计算机系学生视图C-STUDENT中学号为S8203的学生记录 DELETE FROM C-STUDENT WHERE SNO=‘S8203’;转换为对基本表的更新: DELETE FROM STUDENT WHERE SNO=‘S8203’ AND SDEPT=‘计算机系’;机械工业出版社机械工业出版社185 3.5 视图 在关系数据库中,并不是所有的视图都可以进行更新的,因为有些视图的更新不能唯一地有意义地转换成为对相应基本表的更新 目前,各个关系数据库系统一般都只允许对行列子集视图进行更新,而且各个系统对视图的更新还有更进一步的规定,由于各系统实现方法上的差异,这些规定也不尽相同。

      例如DB2规定: (1)若视图是由两个以上基本表导出的,则此视图不允许更新 (2)若视图的字段来自表达式或常数,则不允许对此视图执行INSERT和UPDATE操作,但允许执行DELETE操作机械工业出版社机械工业出版社186 3.5 视图(3)若视图的字段来自集函数,则此视图不允许更新4)若视图定义中含有GROUP BY子句,则此视图不允许更新5)若视图定义中含有DISTINCT短语,则此视图不允许进行更新6)若视图定义中有嵌套查询,并且内层查询的FROM子句中涉及的表也是导出该视图的基本表,则视图不允许更新,例如,将SC中成绩在平均成绩之上的元组定义成一个视图GOOD-SC:机械工业出版社机械工业出版社187 3.5 视图 CREATE VIEW GOOG-SC AS SELECT SNO, CNO, GRADE FROM SC WHERE GRADE> (SELECT AVG(GRADE) FROM SC);导出视图GOOD-SC的基本表是SC,内层查询中涉及的表也是SC,所以视图GOOD-SC是不允许更新的。

      7)一个不允许更新的视图上定义的视图也不允许更新 应该注意的是,不可更新的视图和不允许更新的视图是两个不同的概念前者指理论上已证明其是不可更新的视图后者指实际系统中不支持更新,但它本身有可能是可更新的视图机械工业出版社机械工业出版社188 3.5 视图v3.5.4 视图的优点 视图最终是定义在基本表之上的,对视图的一切操作最终也要转换为对基本表的操作而且对于非行列子集视图进行查询或更新时还有可能出现问题既然如此,为什么还要定义视图呢?这是因为合理使用视图能够带来许多好处 1.视图能够简化用户的操作 视图机制使用户可以将注意力集中在所关心的数据上如果这些数据不是直接来自基本表,则可以通过定义视图,使数据库看起来结构简单、清晰,并且可以简化用户的数据查询操作例如,那些定义了若干张表连接的视图,就将表与表之间的连接操作对用户隐蔽起来了换句话说,用户所做的只是对一个虚表的简单查询,而这个虚表是怎样得来的,用户无需了解机械工业出版社机械工业出版社189 3.5 视图 2. 视图使用户能以多种角度看待同一数据 视图机制能使不同的用户以不同的方式看待同一数据,当许多不同种类的用户共享同一数据库时,这种灵活性是非常重要的。

      3. 视图对重构数据库提供了一定程度的逻辑独立性 在前面章节中已经介绍过数据库的物理独立性和逻辑独立性的概念数据的物理独立性是指用户和用户程序不依赖于数据库的物理结构数据的逻辑独立性是指当数据库重构时,如增加新的关系或对原有关系增加新的字段等,用户和用户程序不会受影响层次数据库和网状数据库一般能较好地支持数据的物理独立性,而对于逻辑独立性则不能完全支持机械工业出版社机械工业出版社190 3.5 视图 在关系数据库中,数据库的重构往往是不可避免的重构数据库最关键的是将一个基本表“垂直”地分成多个基本表例如,将学生关系 STUDENT(SNO,SNAME,SSEX,SAGE,SDEPT) 分为 SX(SNO,SNAME,SAGE) 和 SY(SNO,SSEX,SDEPT)两个关系这时原表STUDENT为表SX和表SY自然连接的结果机械工业出版社机械工业出版社191 3.5 视图如果建立一个视图STUDENT: CREATE VIEW STUDENT(SNO,SNAME,SSEX,SAGE,SDEPT) AS SELECT SX.SNO, SX.SNAME, SY.SSEX, SX.SAGE, SY.SDEPT FROM SX,SY WHERE SX.SNO=SY.SNO; 这样尽管数据库的逻辑结构改变了,但应用程序不必修改,因为新建立的视图定义了用户原来的关系,使用户的外模式保持不变,用户的应用程序通过视图仍然能够查找数据。

      当然,视图只能在一定程度上提供数据的逻辑独立性,比如由于对视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会因基本表结构的改变而改变机械工业出版社机械工业出版社192 3.5 视图 4. 视图能够对机密数据提供安全保护 有了视图机制,就可以在设计数据库应用系统时,对不同的用户定义不同的视图,使机密数据不出现在不应看到这些数据的用户视图上,这样视图机制就自动提供了对机密数据的安全保护功能例如STUDENT表涉及三个系的学生数据,可以在其上定义三个视图,每个视图只包含一个系的学生数据,并只允许每个系的系主任查询自己系的学生视图机械工业出版社机械工业出版社193 3.6 SQL 数据控制v3.6 SQL 数据控制 SQL中数据控制功能包括事务管理功能和数据保护功能,即数据库的恢复、并发控制、数据库的安全性和完整性控制等本节主要介绍SQL语言的安全性控制功能,即SQL如何控制用户对数据库的存取权限问题,其他概念和技术将在后面的章节中详细介绍 SQL语言定义完整性约束条件的功能主要体现在CREATE TABLE语句和ALTER TABLE中,可以在这些语句中定义码、取值唯一的列、不允许空值的列、外码(参照完整性)及其它一些约束条件。

      SQL语言也提供了并发控制及恢复的功能,支持事务、提交、回滚等概念,SQL语言在这方面的功能将在后面章节做进一步介绍 机械工业出版社机械工业出版社194 3.6 SQL 数据控制3.6.1 权限与角色1.权限 一般情况下,数据库中的权限分为两类:一类是维护数据库管理系统的权限,另一类是操作数据库中的对象和数据的权限后者又可分为两种:一种是操作数据库对象的权限,包括创建、删除和修改数据库对象的权限;另一种是操作数据库数据的权限,包括对表、视图数据的增加、删除、修改和查询操作2.角色 在数据库中,为便于管理用户及权限,可以将一组具有相同权限的用户组织在一起,这一组具有相同权限的用户就称为角色(Role)在SQL Server 2000中,角色分为系统预定义的固定角色和用户根据自己的需要定义的用户角色系统角色又根据其作用范围分为固定的服务器角色和固定的数据库角色,服务器角色是为整个服务器设置的,而数据库角色是为具体的数据库设置的机械工业出版社机械工业出版社195 3.6 SQL 数据控制3.6.2 权限与角色的授予与收回 一个用户对某类数据具有何种操作权限是个政策问题而不是技术问题。

      数据库管理系统的功能是保证这些决定的执行为此DBMS必须就有以下功能: (1)把权限的决定告知系统,这是由SQL语言的GRANT和REVOKE语句来完成的 (2)把授权的结果存入数据字典 (3)当用户提出操作请求时,根据授权情况进行检查,以决定是否执行操作请求机械工业出版社机械工业出版社196 3.6 SQL 数据控制1.授权 SQL语言用GRANT语句向用户授予操作权限,GRANT语句的一般格式为: GRANT <权限> [,<权限>]… [ON <对象类型> <对象名>] TO <用户> [,<用户>]… [WITH GRANT OPTION]; 其功能是将对指定操作对象的指定操作权限授予指定的用户对不同类型的操作对象有不同的操作权限,常见的操作权限如表3-44所示机械工业出版社机械工业出版社197 3.6 SQL 数据控制表3-44 不同对象类型允许的操作权限对 象对 象 类 型操 作 权 限属性列TABLESELECT, INSERT, UPDATE, DELETE, ALL PRIVILEGES 视 图TABLESELECT, INSERT, UPDATE, DELETE, ALL PRIVILEGES 基本表TABLESELECT, INSERT, UPDATE, DELETE, ALTER, INDEX,ALL PRIVILEGES数据库DATABASECREATETAB 对属性列和视图的操作权限有:查询(SELECT)、插入(INSERT)、修改(UPDATE)、删除(DELETE)以及这四种权限的总合(ALL PRIVILEGES)。

      对基本表的操作权限有:查询(SELECT)、插入(INSERT)、修改(UPDATE)、删除(DELETE)、修改表(ALTER)和建立索引(INDEX)以及这六种权限的总合(ALL PRIVILEGES)机械工业出版社机械工业出版社198 3.6 SQL 数据控制 对数据库可以有建立表(CREATETAB)的权限,该权限属于DBA,可由DBA授予普通用户,普通用户拥有此权限后可以建立基本表,并成为该表的属主(Owner)基本表的属主拥有对该表的一切操作权限 接受权限的用户可以是一个或多个具体用户,也可以是PUBLIC,即全体用户 如果指定了WITH GRANT OPTION子句,则获得某种权限的用户还可以把这种权限再授予其他的用户如果没有指定WITH GRANT OPTION子句,则获得这种权限的用户只能使用该权限,但不能传播该权限机械工业出版社机械工业出版社199 3.6 SQL 数据控制例3.75 把对基本表STUDENT的查询权限授予用户USER1 GRANT SELECT ON TABLE STUDENT TO USER1;例3.76 把对基本表STUDENT和COURSE的全部操作权限授予用户USER2和USER3。

      GRANT ALL PRIVILEGES ON TABLE STUDENT, COURSE TO USER2, USER3;机械工业出版社机械工业出版社200 3.6 SQL 数据控制例3.77 把对基本表SC的查询操作权限授予所有用户 GRANT SELECT ON TABLE SC TO PUBLIC;例3.78 把对基本表STUDENT的查询和修改学生姓名(SNAME)的操作权限授予用户USER4 GRANT UPDATE(SNAME),SELECT ON TABLE STUDENT TO USER4; 这实际上是授予用户USER4对基本表STUDENT的SELECT权限和对属性列SNAME的UPDATE权限授予关于属性列的权限时必须明确指出相应的属性列名机械工业出版社机械工业出版社201 3.6 SQL 数据控制 例3.79 把对基本表SC的INSERT权限授予用户USER5,并允许他将此权限授予其他用户。

      GRANT INSERT ON TABLE SC TO USER5 WITH GRANT OPTION; 执行此SQL语句后,用户USER5不仅拥有了对表SC的INSERT权限,还可以传播此权限,即用户USER5可以使用GRANT命令给其他用户授权例如,用户USER5可以将此权限授予用户USER1:机械工业出版社机械工业出版社202 3.6 SQL 数据控制 GRANT INSERT ON TABLE SC TO USER1; 因为用户USER5未给USER1传播授权的权限,因此用户USER1不能再能传播此授权例3.80 DBA把在数据库S-C中建立表的权限授予用户USER6 GRANT CREATETAB ON DATABASE S-C TO USER6;机械工业出版社机械工业出版社203 3.6 SQL 数据控制 从上面的例子可以看出,GRANT语句可以一次向一个用户授权,也可以一次向多个用户授权,还可以一次传播多个同类对象的权限,甚至一次可以完成对基本表、视图和属性列这些不同对象的授权,但授予关于DATABASE的权限必须与授予关于TABLE的权限分开,因为它们的对象类型不同。

      机械工业出版社机械工业出版社204 3.6 SQL 数据控制2.收回 向用户授予的权限可以由DBA或其他授权用户用REVOKE语句收回,REVOKE语句的一般格式为: REVOKE <权限> [,<权限>]… [ON <对象类型> <对象名>] FROM <用户> [,<用户>]…;例3.81 把用户USER4修改学生姓名(SNAME)的权限收回 REVOKE UPDATE(SNAME) ON TABLE STUDENT FROM USER4;机械工业出版社机械工业出版社205 3.6 SQL 数据控制例3.82 收回所有用户对基本表SC的查询权限 REVOKE SELECT ON TABLE SC FROM PUBLIC;例3.83把用户USER5对基本表SC的INSERT权限收回 REVOKE INSERT ON TABLE SC FROM USER5;机械工业出版社机械工业出版社206 3.6 SQL 数据控制 在例3.79中,用户USER5将对表SC的INSERT权限授予了用户USER1,执行例3.83的REVOKE语句后,DBMS在收回用户USER5对表SC的INSERT权限的同时,还会自动收回用户USER1对表SC的INSERT权限,即收回权限的操作会级联下去。

      但如果过户USER1还从其他用户处获得对SC表的INSERT权限,则仍具有此权限,系统只收回直接或间接从USER5处获得的权限 可见,SQL提供了非常灵活的授权机制DBA拥有对数库中所有对象的所有权限,并可以根据应用的需要将不同的权限授予不同的用户机械工业出版社机械工业出版社207 3.7 嵌入式SQLv3.7 嵌入式SQL 前面介绍的SQL语言是作为独立语言在终端交互方式下使用的,是面向集合的描述性语言,是非过程化的,每条语句都是独立执行的,与上下文无关的,这样使用的SQL称为交互式SQL(Interactive SQL)但许多实际应用都是过程化的,需要根据不同的条件来执行不同的任务此外,实际应用不仅需要读取数据,而且还要对读取的数据进行处理,因此,单纯使用SQL语言是很难实现这类应用的 为了解决这一问题,SQL语言提供了另一种使用方式,即将SQL语言嵌入到某种高级语言中使用,利用高级语言的过程性结构来弥补SQL语言实现复杂应用方面的不足这种方式下使用的SQL语言称为嵌入式SQL(Embedded SQL),而嵌入SQL的高级语言称为主语言或宿主语言 交互式SQL和嵌入式SQL的语法结构基本上是一致的,只是细节上有些差别,在程序设计的环境下,SQL语句要作某些必要的扩充。

      机械工业出版社机械工业出版社208 3.7 嵌入式SQL3.7.1 嵌入式SQL的一般形式 对宿主语言中的嵌入式SQL,DBMS可采取两种处理方法,一种是预编译的方法,另一种是修改和扩充主语言使之能处理SQL语句目前采用较多的是预编译的方法即由DBMS的预处理程序对源程序进行扫描,识别出SQL语句,把它们转换成主语言调用语句,以使主语言编译程序能识别它,最后由主语言的编译程序将整个源程序编译成目标码 在嵌入式SQL中,为了能够区分SQL语句与主语言语句,多数高级语言要求在嵌入的SQL语句前加前缀EXEC SQL,而有的主语言则通过结束标志来区分有些语言则把SQL作为它的语言的一部分,这时在使用上同交互式SQL就没有区别了总之,区分主语言与SQL语句的标志一般随主语言的不同而不同机械工业出版社机械工业出版社209 3.7 嵌入式SQL 几种常用高级语言中使用嵌入式SQL的格式和删除表STUDENT的例子1)在PL/1和C中使用SQL语言时以EXEC SQL开始,以分号“;”结束,其格式为: EXEC SQL ; 删除表STUDENT的命令为: EXEC SQL DROP TABLE STUDENT;(2)在COBOL中以EXEC SQL开始,以END-EXEC结束: EXEC SQL END-EXEC; 删除表STUDENT的命令为: EXEC SQL DROP TABLE STUDENT END-EXEC;机械工业出版社机械工业出版社210 3.7 嵌入式SQL(3)在PowerBuilder中使用嵌入式SQL同标准SQL没有任何区别,语句前无需加EXEC SQL,只需用分号作为语句结束标记。

      删除表STUDENT的命令为: DROP TABLE STUDENT;(4)在Visual FoxPro中使用SQL时,语句前无需加ESEC,结束标记是回车(Enter),而分号“;”是SQL的续行符,而不是结束符删除表STUDENT的命令为: DROP TABLE STUDENT 机械工业出版社机械工业出版社211 3.7 嵌入式SQL 嵌入式SQL语句根据其作用的不同,可以分为可执行语句和说明性语句两类可执行语句又分为数据定义、数据控制、数据操纵三种 在宿主语言编写的程序(简称宿主程序)中,任何允许出现高级语言语句的地方,都可以写可执行的SQL语句,任何允许出现说明性高级语言语句的地方,都可以写说明性SQL语句 下面将通过一些例子来说明SQL嵌入在其他高级语言中的用法机械工业出版社机械工业出版社212 3.7 嵌入式SQL3.7.2 嵌入式SQL语句与主语言之间的通信 将SQL嵌入到高级语言中混合编程,SQL语句负责操纵数据库,高级语言语句负责控制程序流程和处理数据,这时程序中会含有两种不同计算模式的语句,一种是描述性的面向集合的操作语句SQL,一种是过程性的高级语言语句,因此,它们之间必须互相通信才能协调工作。

      数据库工作单元与源程序工作单元之间的通信主要包括:(1)向主语言传递SQL语句的执行状态信息,使主语言能够据此信息控制程序流程,主要用SQL通信区(SQLCA,SQL Communication Area)实现2)主语言向SQL语句提供参数,主要用主语言中声明的变量——主变量(Host Variable)实现3)将SQL语句查询数据库的结果数据交给主语言进行进一步的处理,这主要用主变量和游标(Cursor)实现机械工业出版社机械工业出版社213 3.7 嵌入式SQL1.SQL通信区 SQL语句执行后,DBMS要反馈给应用程序若干信息,主要包括描述系统当前工作状态和运行环境的各种数据这些信息将送到SQL通信区SQLCA中应用程序从SQLCA中取出这些状态信息,并根据这些状态信息决定接下来将要执行的语句 SQLCA是一个数据结构,其定义方法随主语言的不同而不同有的应用程序中用EXEC SQL INCLUDE SQLCA加以定义SQLCA中有一个存放每次执行SQL语句后返回代码(成功与否)的变量SQLCODE应用程序每执行完一条SQL语句之后都应该测试一下SQLCODE的值,以了解SQL语句的执行情况,并做出相应处理。

      如果SQLCODE等于预定义的常量SUCCESS(有的规定为0),则表示SQL语句执行成功,否则在SQLCODE中存放表示错误的代码机械工业出版社机械工业出版社214 3.7 嵌入式SQL例如,在执行删除语句DELETE后,不同的执行情况SQLCA中有下列不同的信息:§成功删除,并有删除的行数(SQLCODE=SUCCESS);§无条件删除告警信息;§违反数据保护规则,拒绝操作;§没有满足条件的行,一行也没有删除;§由于各种原因,执行出错机械工业出版社机械工业出版社215 3.7 嵌入式SQL2.主变量 嵌入式SQL语句中可以使用主语言的程序变量来输入或输出数据SQL语句中使用主语言程序定义的变量称为主变量 主变量根据其作用的不同,分为输入主变量和输出主变量输入主变量由应用程序对其赋值,SQL语句引用;输出主变量由SQL语句对其赋值或设置状态信息,返回给应用程序一个主变量有可能既是输入主变量又是输出主变量利用输入主变量,可以指定向数据库中插入的数据,可以将数据库中的数据修改为指定值,可以指定WHERE子句或HAVING子句中的条件利用输出主变量,可以得到SQL语句的执行结果数据和状态信息。

      机械工业出版社机械工业出版社216 3.7 嵌入式SQL 一个主变量可以附带一个任选的指示变量(Indicator Variable)指示变量是一个整型变量,用来“指示”所指主变量的值或条件指示变量可以指示输入主变量是否为空值,可以检测输出主变量是否为空值,值是否被截断等 主变量和指示变量的声明方法随着主语言的不同而有所变化声明了主变量之后,可以在SQL语句中任何一个能够使用表达式的地方使用主变量,为了与数据库对象名(表名、视图名、列名等)区别,SQL语句中的主变量名前必须添加冒号“:”作为标志同样,SQL语句中的指示变量前也必须加冒号,并且要紧跟在所指主变量之后而在SQL语句之外的其他地方,主变量和指示变量均可以直接使用,不必加冒号机械工业出版社机械工业出版社217 3.7 嵌入式SQL 3.游标 SQL语言与主语言具有不同的数据处理方式SQL语言是面向集合的,一条SQL语句原则上可以产生或处理多条记录而主语言则是面向记录的,一组主变量只能存放一条记录所以仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求,为此嵌入式SQL引入了游标的概念,用游标来协调这两种不同的处理方式。

      游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果,每个游标区都有一个名字用户可以通过游标逐一读取数据记录,然后赋值给主变量,再交给主语言程序做进一步的处理机械工业出版社机械工业出版社218 3.7 嵌入式SQL3.7.3 不用游标的SQL语句 本节主要介绍不用游标的SQL语句,主要包括:u说明性语句u数据定义语句u数据控制语句u查询结果为单记录的SELEST语句u非CURRENT形式的UPDATE语句u非CURRENT形式的DELETE语句uINSERT语句机械工业出版社机械工业出版社219 3.7 嵌入式SQL 所有的说明性语句及数据定义与控制语句都不需要使用游标它们是嵌入式SQL中最简单的一类语句,不需要返回结果数据,也不需要使用主变量在主语言中嵌入说明性语句及数据定义与控制语句,只要给语句加上前缀EXEC SQL和语句结束符即可 INSERT语句也不需要使用游标,但通常需要使用主变量 SELECT语句、UPDATE语句、DELETE语句则要复杂一些1.说明性语句 说明性语句是专为嵌入式SQL中说明主变量等而设置的,主要有两条语句: EXEC SQL BEGIN DECLARE SECTION;和 EXEC SQL END DECLARE SECTION;两条语句必须配对出现,相当于一个括号,两条语句中间是主变量的说明。

      机械工业出版社机械工业出版社220 3.7 嵌入式SQL 2.数据定义语句例3.84 建立一个“学生”表STUDENT EXEC SQL CREATE TABLE STUDENT; (SNO CHAR(5) NOT NULL UNION, SNAME CHAR(8), SSEX CHAR(2), SAGE INT, SDEPT CHAR(20)); EXEC SQL DROP TABLE STUDENT; 数据定义语句中不允许使用主变量例如下列语句是错误的: EXEC SQL DROP TABLE :table-name;机械工业出版社机械工业出版社221 3.7 嵌入式SQL3.数据控制语句例3.85 把查询表STUDENT的权限授给用户USER1 EXEC SQL GRANT SELECT ON TABLE STUDENT TO USER1;4.查询结果为单记录的SELECT语句 在嵌入式SQL中,查询结果为单记录的SELECT语句需要用INTO子句指定查询结果的存放地点。

      该语句的一般格式为:机械工业出版社机械工业出版社222 3.7 嵌入式SQL EXEC SQL SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>]… INTO <主变量> [<指示变量>][,<主变量>[<指示变量 >]]… FROM <表名或视图名> [,<表名或视图名>]… [WHERE <条件表达式>] [GROUP BY <列名1> [HAVING <条件表达式>]] [ORDER BY <列名2> [ASC|DESC]]; 该语句对交互式SELECT语句的扩充就是多了一个INTO子句把从数据库中找到的符合条件的记录,放到INTO子句指出的主变量中去其他子句的含义不变使用该语句需要注意以下几点:机械工业出版社机械工业出版社223 3.7 嵌入式SQL §INTO子句、WHERE子句的条件表达式、HAVING短语的条件表达式均可以使用主变量§查询返回的记录中,可能某些列为空值NULL。

      如果INTO子句中主变量后面跟有指示变量,则当查询得出的某个数据项为空值时,系统就会自动将相应主变量后面的指示变量置为负值,而不再向该主变量赋值,即主变量值仍为执行SQL语句之前的值所以当指示变量为负值时,不管主变量为何值,均应认为主变量值为NULL指示变量只能用于INTO子句中§如果数据库中没有满足条件的记录,则DBMS将SQLCODE的值置为100§如果查询结果实际上并不是单个记录,而是多条记录,则程序出错,DBMS会在SQLCODE中返回错误信息机械工业出版社机械工业出版社224 3.7 嵌入式SQL例3.86 根据学生学号查询学生信息假设已将要查询的学生的学号赋给了主变量givensno EXEC SQL SELECT SNO, SNAME, SSEX, SAGE, SDEPT INTO :HNO,:HNAME,:HSEX,:HAGE,:HDEPT FROM STUDENT WHERE SNO=:givensno;机械工业出版社机械工业出版社225 3.7 嵌入式SQL例3.87 查询某个学生选修某门课程的成绩。

      假设已将要查询的学生的学号赋给了主变量givensno,将课程号赋给了主变量givencno EXEC SQL SELECT SNO, CNO, GRADE INTO :HNO,:HCNO,:HGRADE:Gradeid FROM SC WHERE SNO=:givensno AND CNO=:givencno; 由于学生选修一门课程后有可能没有参加考试,也就是说其成绩可能为空值,所以在INTO子句中加了指示变量Gradeid,用于指示主变量HGRADE是否为空值执行此语句后,如果Gradeid小于0,则不论HGRADE为何值,均认为该学生的该门课程成绩为空值机械工业出版社机械工业出版社226 3.7 嵌入式SQL5.非CURRENT形式的UPDATE语句 在UPDATE语句中,SET子句和WHERE子句均可以使用主变量,其中SET子句中还可以使用指示变量例3.88 将全体学生的2号课程的考试成绩增加若干分假设增加的分数赋给了主变量Raise EXEC SQL UPDATE SC SET GRADE=GRADE+:Raise WHERE CNO=‘2’; 机械工业出版社机械工业出版社227 3.7 嵌入式SQL例3.89 修改某个学生3号课程的成绩。

      假设该学生的学号已赋给主变量givensno,修改后的成绩已赋给主变量newgrade EXEC SQL UPDATE SC SET GRADE=:newgrade WHERE SNO=:givensno AND CNO=‘3’; 机械工业出版社机械工业出版社228 3.7 嵌入式SQL例3.90 将计算机系的全体学生的年龄置为空值NULL EXEC SQL UPDATE STUDENT SET SAGE=:Raise:Sageid WHERE SDEPT=‘计算机系’; 将指示变量Sageid赋一个负值后,无论主变量Raise为何值,DBMS都会将计算机系的所有学生的年龄置为空值它等价于: EXEC SQL UPDATE STUDENT SET SAGE=NULL WHERE SDEPT=‘计算机系’;机械工业出版社机械工业出版社229 3.7 嵌入式SQL6.非CURRENT形式的DELETE语句 DELETE语句的WHERE子句可以使用主变量指定删除条件。

      例3.91 某个学生退学后,要将有关该学生的所有选课记录删除掉假设该学生的姓名已赋给主变量stuname EXEC SQL DELETE FROM SC WHERE SNO= (SELECT SNO FROM STUDENT WHERE SNAME=:stuname);机械工业出版社机械工业出版社230 3.7 嵌入式SQL 另一种等价的实现方法为: EXEC SQL DELETE FROM SC WHERE :stuname= (SELECT SNAME FROM STUDENT WHERE STUDENT.SNO=SC.SNO);第一种方法更直接,从而效率也更高。

      机械工业出版社机械工业出版社231 3.7 嵌入式SQL7. INSERT语句INSERT语句的VALUES子句中可以使用主变量和指示变量例3.92 某个学生新选修了某门课程,将有关记录插入到表SC中假设该学生的学号已赋给主变量stuno,课程号已赋给主变量couno gradeid=-1; EXEC SQL INSERT INTO SC(SNO,CNO,GRADE) VALUES(:stuno,:couno,:gr:gradeid); 由于该学生刚选修某门课程,尚未考试,成绩应为空,因此要把指示变量gradeid赋为负值机械工业出版社机械工业出版社232 3.7 嵌入式SQL3.7.4 使用游标的SQL语句必须使用游标的SQL语句有:•查询结果为多条记录的SELECT语句•CURRENT形式的UPDATE语句•CURRENT形式的DELETE语句1. 查询结果为多条记录的SELECT语句 一般情况下,SELECT语句查询的结果都是多条记录,而高级语言一次只能处理一条记录,因此需要使用游标机制,将多条记录一次一条送至宿主程序进行处理,从而把对集合的操作转换为对单条记录的处理。

      机械工业出版社机械工业出版社233 3.7 嵌入式SQL使用游标的步骤为:(1)说明游标用DECLARE语句为一条SELECT语句定义游标DECLARE语句的一般形式为: EXEC SQL DECLARE <游标名> CURSOR FOR ;其中SELECT语句可以是简单查询,也可以是复杂的连接查询和嵌套查询 定义游标仅仅是一条说明性语句,这时DBMS并不执行SELECT语句机械工业出版社机械工业出版社234 3.7 嵌入式SQL(2)打开游标用OPEN语句将定义的游标打开OPEN语句的一般形式为:EXEC SQL OPEN <游标名>; 打开游标实际上是执行相应的SELECT语句,把查询结果取到缓冲区中这时游标处于活动状态,指针指向查询结果集中的第1条记录机械工业出版社机械工业出版社235 3.7 嵌入式SQL(3)推进游标指针并取当前记录由FETCH语句把游标指针向前推进一条记录,同时将缓冲区中的当前记录取出来送至主变量供主语言进一步处理FETCH语句的一般形式为: EXEC SQL FETCH <游标名> INTO <主变量> [<指示变量>] [,<主变量>[<指示变 量>]]…;其中主变量必须与SELECT语句中的目标列表达式具有一一对应关系。

      机械工业出版社机械工业出版社236 3.7 嵌入式SQL FETCH语句通常用在一个循环结构中,通过循环执行FETCH语句逐条取出结果集中的行进行处理 为进一步方便用户处理数据,现在许多关系数据库管理系统对FETCH语句做了扩充,允许向任意方向、以任意步长移动游标指针,而不仅仅是把游标指针向前推进一行4)关闭游标用CLOSE语句关闭游标,释放结果集占用的缓冲区及其他资源CLOSE语句的一般形式为: EXEC SQL CLOSE <游标名>; 游标被关闭后,就不再和原来的查询结果集相联系但被关闭的游标可以再次被打开,与新的查询结果相联系机械工业出版社机械工业出版社237 3.7 嵌入式SQL例例3.93 查询某个系全体学生的信息要查询的系名由用户在程序运行过程中指定,放在主变量deptname中…………EXEC SQL BEGIN DECLARE SECTION;……/*说明主变量deptname、Hsno、Hsname、Hssex、Hsage等*/……EXEC SQL END DECLARE SECTION;……gets(deptname); /*为主变量deptname赋值*/……EXEC SQL DECLARE SX CURSOR FOR /*说明游标SX,将SX与查询结 果集相联系*/机械工业出版社机械工业出版社238 3.7 嵌入式SQLSELECT SNO,SNAME,SSEX,SAGE FROM STUDENT WHERE SDPET=:deptname;EXEC SQL OPEN SX /*打开游标*/ WHILE(1) /*用循环结构逐条处理结果集中的记录*/ { EXEC SQL FETCH SX INTO :Hsno,:Hsname,:Hssex;:Hsage; /*游标指针向前推进一行,从结果集中取当前行,送给相应主变量*/ if (sqlca.sqlcode<>SUCCESS) /*若所有查询结果均已处理完或出现 break; 错误,则退出循环*/ …… /*由主语言语句进行进一步处理*/};EXEC SQL CLOSE SX; /*关闭游标SX*/…… 被关闭的游标SX实际上可以再次被打开,与新的查询结果相联系。

      例如,可以在例3.93中再加上一层外层循环,每次对deptname赋新的值,这样游标SX每次就和不同的系的学生集合相联系 机械工业出版社机械工业出版社239 3.7 嵌入式SQL2. CURRENT形式的UPDATE语句和DELETE语句 UPDATE语句和DELETE语句都是集合操作,如果只想修改或删除其中某个记录,则需要用带游标的SELECT语句查询所有满足条件的记录,从中进一步找出要修改或删除记录,然后用CURRENT形式的UPDATE和DELETE语句修改或删除之具体步骤是:(1)用DECLARE语句说明游标如果是为CURRENT形式的UPDATE语句做准备,则SELECT语句中要用 FOR UPDATE OF <列名>来指明检索出的数据在指定列是可修改的如果是为CURRENT形式的DELETE语句做准备,则不必使用上述子句机械工业出版社机械工业出版社240 3.7 嵌入式SQL(2)用OPEN语句打开游标,把所有满足查询条件的记录从指定表取到缓冲区中3)用FETCH语句推进游标指针,并把当前记录从缓冲区中取出送至主变量4)检查该记录是否是要修改或删除的记录。

      如果是,则用UPDATE语句或DELEDTE语句修改或删除该记录这时UPDATE语句和DELETE语句中要用子句 WHERE CURRENT OF <游标名>来表示修改或删除的是最近一次取出的记录,即游标指针指向的记录 机械工业出版社机械工业出版社241 3.7 嵌入式SQL 第(3)和(4)步通常用在一个循环结构中,通过循环执行FETCH语句,逐条取出结果集中的记录进行判断和处理5)处理完毕用CLOSE语句关闭游标,释放结果集占用的缓冲区和其他资源例例3.94 查询某个系全体学生的信息,然后根据用户的要求修改其中某些记录的年龄字段假定要查询的系名由主变量deptname指定……EXEC SQL BEGIN DECLARE SECTION;……/*说明主变量deptname、Hsno、Hsname、Hssex、Hsage、NEWAge等*/……机械工业出版社机械工业出版社242 3.7 嵌入式SQLEXEC SQL END DECLARE SECTION;……gets(deptname); /*为主变量deptname赋值*/……EXEC SQL DECLARE SX CURSOR FOR SELECT SNO,SNAME,SSEX,SAGE FROM STUDENT WHERE SDPET=:deptnameFOR UPDATE OF SAGE; /*说明游标,为CURRENT UPDATE 做准备*/EXEC SQL OPEN SX /*打开游标*/ WHILE(1) /*用循环结构逐条处理结果集中的记录*/ { EXEC SQL FETCH SX INTO :Hsno,:Hsname,:Hssex;:Hsage; /*游标指针向前推进一行,然后从结果集中取当前行,送给相应主变量*/ 机械工业出版社机械工业出版社243 3.7 嵌入式SQLif (sqlca.sqlcode<>SUCCESS) /*若所有查询结果均已处理完或出现 break; 错误,则退出循环*/ printf(“%s, %s, %d”, SNO,SNAME,SSEX,SAGE); /*显示该记录*/printf(“UPDATE AGE?”); /*询问用户是否修改年龄*/scanf(“%c”, &yn);if (yn=’y’ or yn=’Y’) /*需要修改*/{ printf(“INPUT NEW AGE:”); scanf(“%d”, &NEWAge); /*输入新的年龄值*/ EXEC SQL UPDATE STUDENT SET SAGE=:NEWAge WHERE CURRENT OF SX; /*修改当前记录的年龄字段*/};……}; EXEC SQL CLOSE SX; /*关闭游标SX*/…… 注意:当游标中的SELECT语句带有UNION或ORDER BY子句时,或者该SELECT语句相当于定义了一个不可更新的视图时,不能使用CURRENT形式的UPDATE语句和DELETE语句。

      机械工业出版社机械工业出版社244 3.7 嵌入式SQL3.7.5动态SQL简介 在3.7.3节和3.7.4节中介绍的嵌入式SQL语句为编程提供了一定的灵活性,使用户可以在程序运行过程中根据实际需要输入WHERE子句或HAVING短语中某些变量的值这些SQL语句的共同特点是:语句中主变量的个数与数据类型在预编译时都是确定的,只有主变量的值是程序运行过程中动态输入的,称这类嵌入式SQL语句为静态SQL语句 静态SQL语句提供的编程灵活性在许多情况下仍显得不足,有时候需要编写更为通用的程序例如对SC表,任课教师想查询选修了他所教授课程的学生学号及成绩;班主任想查询某个学生选修的课程号及相应成绩;学生想查询自己某门课程的成绩也就是说查询条件、要查询的属性列是不确定的,这时就无法用一条静态SQL语句实现了机械工业出版社机械工业出版社245 3.7 嵌入式SQL 如果在预编译时下列信息不能确定,就必须使用动态SQL技术,如:(1)SQL语句正文(2)主变量个数(3)主变量的数据类型(4)SQL语句中引用的数据库对象(例如列、索引、基本表、视图等)机械工业出版社机械工业出版社246 3.7 嵌入式SQL 动态SQL方法允许在程序运行过程中临时“组装”SQL语句,主要有三种形式:1. 语句可变 允许用户在程序运行时临时输入完整的SQL语句。

      2. 条件可变 对于非查询语句,条件子句有一定的可变性例如删除学生选课记录,既可以是因某门课程临时取消,需要删除有关该课程的所有选课记录,也可以是因为某个学生退学,需要删除该学生的所有选课记录 机械工业出版社机械工业出版社247 3.7 嵌入式SQL 对于查询语句,SELECT子句是确定,即语句输出是确定的,其他子句(如WHERE子句、HAVING短语)有一定的可变性例如查询学生人数,可以是查询某个系的学生总数,查询某个性别的学生人数,查询某个系某个年龄段的学生人数等,这时SELECT子句的目标列表达式是确定的(COUNT(*)),但WHERE子句的条件是不确定的机械工业出版社机械工业出版社248 3.7 嵌入式SQL3. 数据库对象、查询条件可变 对于查询语句,SELECT子句中的列名、FROM子句中的表名或视图名、WHERE子句和HAVING短语中的条件等均可由用户临时构造,即语句的输入和输出可能都是不确定的例如前面查询学生选课表SC的例子对于非查询语句,涉及的数据库对象及条件也是可变的 这几种动态形式几乎可以覆盖所有的可变要求为了实现上述三种可变形式,SQL提供了相应的语句,例如EXECUTE IMMEDIATE、PREPARE、EXECUTE、DESCRIBE等。

      使用动态SQL技术更多的是涉及程序设计方面的知识,而不是SQL语句本身,所以这里就不详细介绍了,有兴趣的读者可以参阅有关书籍机械工业出版社机械工业出版社249 3.7 嵌入式SQL小结小结 本章详细介绍了SQL语言SQL语言是关系数据库语言的工业标准各个数据库厂商支持的SQL语言在遵循标准的基础上常常做不同的扩充或修改,本章介绍的是标准SQL因此,本章中绝大多数例子能在不同的数据库系统中运行,个别例子需稍作修改后才能在某些系统上运行 SQL语言可以分为数据定义、数据查询、数据更新、数据控制四大部分,有时数据更新也可称为数据操纵,或把数据查询与数据更新合称为数据操纵本章主要介绍这四部分的内容 视图是关系数据库系统的重要概念,合理使用视图有许多优点SQL语言的数据查询功能是最丰富,也是最复杂的,需要加强练习,熟练掌握机械工业出版社机械工业出版社250 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.