三级数据库第六章考试要点
第六章
一、SQL概述(一)结构化查询语言SQL
SQL(Structured Query Language)称为结构化查询语言。由于SQL使用方便、功能丰富、语言简洁易学,很快得到推广和应用。例如关系数据库产品SQL/DS,DB2,Oracle,SYBASE等都实现了SQL语言。自SQL成为国际标准语言以后,各个数据库厂家纷纷推出各自支持的SQL软件或SQL接口的软件。这就有可能使大多数数据库均用SQL作为共同的数据库语言和标准接口,使不同数据库系统之间的互操作有了共同的基础。而且对数据库以外的领域也产生了很大影响,有不少软件产品将SQL语言的数据查询功能与图形功能、软件工程工具、软件开发工具、人工智能程序结合起来。SQL已成为关系数据库领域中一个主流语言。
(二)SQL的特点
其主要特点包括:
(1)综合统一
(2)高度非过程化
(3)面向集合的操作方式
(4)以同一种语法结构提供两种使用方式
(5)语言简洁,易学易用
(三)SQL数据库的体系结构
SQL语言支持数据库三级模式结构,在SQL中,模式对应于“基本表(base table)”,内模式对应于“存储文件”,外模式对应于“视图(view)”和部分基本表。元组对应于表中的“行(row)”,属性对应于表中的
“列(column)”。
(1)一个SQL数据库是表(table)的汇集。
(2)一个SQL表由行集构成,一行是列的序列,每列对应一个数据项。
(3)一个表可以带若干索引,索引也存放在存储文件中。
(4)存储文件的逻辑结构组成了关系数据库的内模式。存储文件的物理结构是任意的,对用户是透明的。
(5)一个表或者是一个基本表,或者是一个视图。
(6)一个基本表可以跨一个或多个存储文件存放,一个存储文件可以存放一个或多个基本表。每个存储文件与外部存储器上一个物理文件对应。
(7)SQL用户可以是应用程序,也可以是终端用户。SQL的宿主语言有FORTARAN,COBOL,Pascal,PL/I、C和Ada语言等。SQL也能作为独立的用户接口,供交互环境下的终端用户使用。
二、SQL的数据定义
关系数据库是由模式、外模式和内模式组成,即关系数据库的基本对象是表、视图和索引。因此,SQL的数据定义功能包括定义表、定义视图和定义索引,由于视图是基于基本表的虚表,索引是依附于基本表的,因此SQL通常不提供修改视图定义和修改索引定义的操作。用户如果想修改视图定义或索引定义,只能先将它们删除掉,然后再重建。
(一)基本表
1.创建基本表
SQL语言使用CREATE TABLE语句创建基本表,其一般格式如下:CREATE TABLE〈表名〉(〈列名〉〈数据类型〉[列级完整性约束] [,〈列名〉〈数据类型〉[列级完整性约束]…] [,〈表级完整性约束〉] [其他参数]);
2.修改基本表
随着应用环境和应用需求的变化,有时需要修改已建立好的基本表,包括增加新列、增加新的完整性约束条件、修改原有的定义或删除已有的完整性约束条件等。SQL语言用ALTER TABLE语句修改基本表,其一般格式为:ALTER TABLE〈表名〉 [ADD〈新列名〉〈数据类型〉[完整性约束]] [DROP〈完整性约束名〉] [MODIFY〈列名〉〈数据类型〉];其中,〈表名〉为指定需要修改的基本表名,ADD子句用于增加新列和新的完整性约束,DROP子句用于删除指定的完整性约束,MODIFY子句用于修改原有的列定义。
3.删除基本表
当某个基本表不再需要时,可以使用SQL语句DROP TABLE进行删除,其一般格式为: DROP TABLE〈表名〉;
(二)索引
1.创建索引
在SQL语言中,创建索引使用CREATE INDEX语句,其一般格式为:CREATE[UNIQUE][CLUSTER]INDEX〈索引名〉 ON〈表名〉(〈列名〉[顺序][,〈列名〉[顺序]]…);
2.删除索引
索引一经建立,就由系统使用和维护它,不需用户干预。创建索引是为了减少查询操作的时间,但如果数据增、删频繁,系统会花费许多时间来维护索引。这时,可以删除一些不必要的索引。在SQL语言中,删除索引使用DROP INDEX语句,其一般格式为: DROP INDEX〈索引名〉;
三、SQL的数据操纵(一)SQL的查询语句
数据库查询是数据库操作的核心。SQL语言提供了SELECT语句进行数据库的查询,该语句的一般格式是:SELECT [ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]… FROM〈基本表(或视图)〉[,〈基本表(或视图)〉]… [WHERE<条件表达式>] [GROUP BY<列名1>[HAVING<内部函数表达式>]] [ORDER BY<列名2>[ASC|DESC]];
1.简单查询
简单查询仅涉及数据库中的一个表。
(1)查询表中的若干列。
(2)查询经过计算的值。
(3)消除取值重复的行。
(4)条件查询。通过WHERE子句实现条件查询,WHERE子句常用的查询条件如下表所示。
WHERE子句常用的查询条件
查询条件 谓词
比较 =,>,<,≥,≤,!=,<>,!>,!<;NOT+上述比较运算符
确定范围 BETWEEN AND,NOT BETWEEN AND
确定集合 IN,NOT IN
字符匹配 LIKE,NOT LIKE
空值 IS NULL,IS NOT NULL
多重条件 AND,OR
WHERE子句中还可使用BETWEEN进行查询。
(5)利用LIKE的查询。
(6)涉及空值NULL的查询。
(7)对查询结果排序。
(8)使用集函数。SQL提供的集函数主要有:
COUNT([DISTINCT|ALL]*) 统计元组个数
COUNT([DISTINCT|ALL]<列名>)统计一列中值的个数
SUM([DISTINCT|ALL]<列名>) 计算一列值的总和(此列必须是数值型)
AVG([DISTINCT|ALL]<列名>) 计算一列值的平均值(此列必须是数值型)
MAX([DISTINCT|ALL]<列名>) 求一列值中的最大值
MIN([DISTINCT|ALL]<列名>) 求一列值中的最小值
如果指定DISTINCT短语,表示计算时取消指定列中的重复值。
(9)对查询结果分组。GROUP BY子句将查询结果表按某一列或多列值分组,值相等的为一组。
2.连接查询
若查询同时涉及两个以上的表,则称之为连接查询。连接查询是关系数据库最主要的查询,包括等值连接、自然连接、非等值连接、自身连接、外连接和复合连接查询。
(1)等值与非等值连接查询。连接查询中连接条件的一般格式为:[<表名1>.]〈列名1〉〈比较运算符〉[〈表名2〉.]〈列名2〉其中,比较运算符有:、=、>、<、>=、<=、!=。连接谓词还可以采用下面形式:[<表名1>.]〈列名1〉BETWEEN [〈表名2〉.]〈列名2〉AND[〈表名2〉.]〈列名3〉当连接运算符为“=”时,称为等值连接。使用其他运算符称为非等值连接。连接谓词中的列名称为连接字符。连接条件中的各连接字段类型必须是可比的。
(2)自身连接。一个表与其本身进行连接。
(3)外连接。外连接的表示方法:在连接谓词的某一边加上符号*(有的数据库系统中用+),它可以和另一边的表中所有不满足连接条件的元组进行连接。如果外连接符在连接条件的右边,称为右外连接,如果外连接符出现在连接条件的左边,则称为左外连接。(4)复合条件连接。复合条件连接指WHERE子句有多个连接条件。
3.嵌套查询
嵌套查询亦称子查询。嵌套查询是指一个SELECT-FROM-WHERE查询块可以嵌入在另一个查询块之中。SQL中允许多层嵌套。每个子查询在上一级查询处理之前求解,即嵌套查询是由里向外处理的,这样外层查询可以利用内层查询的结果。查询涉及多个关系时用嵌套查询逐次求解层次分明,容易理解与容易书写,具有结构化程序设计的优点。
(1)由谓词IN引导的子查询。在嵌套查询中,最常用的是谓词IN。
(2)谓词是比较运算符的子查询。若能确切知道内层查询返回的是单值,则可以用比较运算符。
(3)由[NOT]EXISITS谓词引导的子查询。EXISTS代表存在量词,若内层查询结果非空,则外层查询的WHERE后面的条件为真,否则为假。一般地,要使EXISTS为真,当且仅当其后的SELECT语句查询结果非空。由[NOT]EXISTS引出的子查询,其目标列表达式通常都用*,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义。
(4)集合查询。多个SELECT语句的结果可进行集合操作。集合操作中用得最多的是并操作UNION。
(二)SQL的修改语句
SQL的修改语句包括更新、删除和插入三类语句。
1.更新(UPDATE)
更新操作语句的一般格式为:UPDATE<表名>SET<列名>=<表达式>[,<列名>=<表达式>]…[WHERE谓词];更新指定表中满足谓词的元组,把这些元组按SET子句中的表达式修改相应字段上的值。
2.删除(DELETE)
删除语句的一般格式为ELETE FROM表名 [
WHERE谓词];
从指定表中删除满足谓词的那些记录,没有WHERE子句时表示删去此表中的全部记录,但此表的定义仍在数据字典中。DELETE语句删除的是表中的数据,而不是关于表的定义。
3.插入(INSERT)
插入语句的一般格式有两种:
(1)插入一个元组
INSERT INTO表名[(字段名[,字段名]…)] VALUES(常量[,常量]…);
(2)插入子查询结果
INSERT INTO表名[字段名[,字段名]…)] 子查询;第一种格式把一个新记录插入指定的表中;第二种格式把子查询的结果插入指定的表中。若表中有些字段在插入语句中没有出现,则这些字段上的值取空值NULL。当然在表定义中说明了NOT NULL的字段在插入时不能取NULL。若插入语句中没有指出字段名,则新记录必须在每个字段上均有值。
四、视图
视图是关系数据库提供给用户以多种角度观察数据库中数据的重要机制。视图是从一个或几个基本表(或其他视图)导出的表,它与基本表不同,是一个虚表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。因此若基本表中的数据发生变化,从视图中查询得出的数据也就随之改变了。视图一经定义,就可以和基本表一样被查询和删除,也可以在一个视图之上再定义新的视图,但对视图的修改(插入、删除、更新)操作则有一定的限制。
(一)定义视图
其一般格式为: CREATE VIEW <视图名>[(<列名>[,<列名>]…])] A1.创建视图
SQL语言用CREATE VIEW命令创建视图,S <子查询>[WITH CHECK OPTION];其中:子查询通常是不含有ORDER BY子句和DISTNCT短语的任意的SELECT语句。可选择项WITH CHECK OPTION表示当对视图进行UPDATE、INSERT和DELETE操作时,保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)。如果CREATE VIEW语句仅指定了视图名,省略了组成视图的各个属性列名,则隐含该视图由子查询中SELECT子句目标列中的诸字段组成。但在下列3种情况下必须明确指定组成视图的所有列名:
(1)其中某个目标列不是单纯的属性名,而是集合函数或列表达式。
(2)多表连接时选出了几个同名列作为视图的字段。
(3)需要在视图中为某个列启用新的更合适的名字(重新命名列名)。需要说明的是,组成视图的属性列名必须依照上面的原则,或者全部省略或者全部指定。
2.删除视图
视图创建好后,若导出此视图的基本表被删除了,该视图将失效,但一般不会被自动删除。删除视图通常需要显式地使用DROP VIEW语句进行。该语句的格式为ROP VIEW<视图名>;一个视图被删除后,由该视图导出的其他视图也将失效,用户应该使用DROP VIEW语句将它们一一删除。
(二)查询视图
通过视图进行查询,首先要进行有效性检查,检查查询涉及的表、视图等是否在数据库中存在,如果存在,则从数据字典中取出查询涉及的视图的定义,把定义中的子查询和用户对视图的查询结合起来,转换成对基本表的查询,然后再执行这个经过修正的查询。视图的消解(view resolution):把对视图的查询转换为对基本表的查询的过程称为视图的消解。
(三)修改视图
修改视图包括插入(INSERT)、删除(DELETE)和更新(UPDATE)三类操作。由于视图是虚表,因此对视图的更新,最终要转换为对基本表的更新。为防止用户通过视图对数据进行插入、删除和更新时,无意或故意操作不属于视图范围内的基本表数据,可在定义视图时加上WITH CHECK OPTION子句,这样在视图上进行修改数据时DBMS会进一步检查视图定义中的条件,若不满足条件,则拒绝执行该操作。
(四)视图的作用
合适地定义和合理地使用视图的优点有:
(1)视图能够简化用户的操作视图机制使用户可以将注意力集中在他所关心的数据上。如果这些数据不是直接来自基本表,则可以通过定义视图,使用户眼中的数据库结构简单、清晰,并且可以简化用户的数据查询操作。例如,对于那些经常要通过计算或要从若干张表连接来获得数据的查询,可将这类查询定义为一个视图,然后就可容易地对该视图进行操作。
(2)视图使用户能以多种角度观察同一数据视图机制能使不同的用户以不同的方式观察同一数据,当许多不同种类的用户使用同一个数据库时,这种灵活性是非常重要的。
(3)视图对重构数据库提供了一定程度的逻辑独立性数据的逻辑独立性是指当数据库重构造时,如增加新的关系或对原有关系增加新的字段等,用户和用户程序不会受影响。在关系数据库中,数据库的重构造往往是不可避免的。
(4)视图能够对机密数据提供安全保护有了视图机制,就可以在设计数据库应用系统时,对不同的用户定义不同的视图,使机密数据不出现在不应看到这些数据的用户视图上,这样就由视图的机制自动提供了对机密数据的安全保护功能。例如,student表涉及3个系的学生数据,可以在其上定3个视图,每个视图只包含1个系的学生数据,并只允许每个系的学生查询自己所在系的学生视图。
五、SQL的数据控制语句(一)授予权限
SQL语言用GRANT语句向用户授予数据访问的权限,GRANT语句的一般格式为:
GRANT<权限>[,<权限>]…
[ON<对象类型><对象名>]
TO<用户>[,<用户>]… [WITH GRANT OPTION];其语义为:将对指定操作对象的指定操作权限授予指定的用户。
对不同类型的操作对象有不同的操作权限,常见的操作权限如下表所示。
不同对象类型允许的操作权限
对象 对象类型 操作权限
属性列 TABLE SELECT,INSERT,UPDATE,DELETE,ALL PRIVILEGES
视图 TABLE SELECT,INSERT,UPDATE,DELETE,ALL PRIVILEGES
基本表 TABLE SELECT,INSERT,UPDATE,DELETE,ALTER,INDEX,ALL PRIVILEGES
数据库 DATABASE CREATE TABLE
(二)收回权限
授予的权限可以由DBA或其他授权者用REVOKE语句收回,REVOKE语句的一般格式为:
REVOKE<权限>[,<权限>]…
[ON<对象类型><对象名>]
FROM<用户>[,<用户>]…;
六、嵌入式SQL
SQL语言可以作为独立语言在终端交互式下使用,在这种方式下使用的SQL语言是面向集合的描述性语言,是非过程性的,即大多数语句都是独立执行,与上下文无关的。
SQL语言还可以嵌入到某种高级语言中使用,利用高级语言的过程性结构来弥补SQL语言实现复杂应用方面的不足。这种方式下使用的SQL语言称为嵌入式SQL(Embedded SQL),能嵌入SQL的高级语言称为主语言或宿主语言。把SQL嵌入主语言使用时必须解决3个问题:
(1)区分SQL语句与主语言语句
(2)数据库工作单元和程序工作单元之间的通信
(3)一个SQL语句原则上可产生或处理一组记录,而主语言一次只能处理一个记录,为此必须协调两种处理方式。这是用游标(cursor)来解决的。