You are on page 1of 83

第三章 关系 数据 库标准 语言 SQL

本章要 点:
2. SQL 的数 据定义 功能 ;
3. SQL 的数 据查询 功能 。
4. SQL 的数 据操纵 功能 。
5. SQL 的数 据控制 功能 。
第一节 概 述

SQL 最初是在 1974 年被 吉姆 · 格雷提 出来的, 经


不断修 改、扩充和 完善,最终 发展成为国 际标准语
言。
SQL 是一种用来从 关系数据库 中获取信 息的语
言,它 使人们在使 用数据库的 过程中可以 更便捷地组
织、恢 复和调用信 息。同样 SQL 在计算 机系统网 络
技术中 也发挥着广 泛的作用, 它为 Oracle 、
Sybase 、 Informix 等美国著 名的数据库公 司提供了
核心技 术,帮助他 们在上个世 纪 80 年代跟 上了网络
的发展 步伐。
SQL 语言的出现是 现代数据库 发展中的 里程碑
事件, 如今 SQL 已经深入世界 上千百万用 户的日常
使用中 ,带来了巨 大的技术进 步和市场价 值
含义 :结 构化查 询语 言 (Structured Query
Language)
 包括 定义 、查询、 操纵和控 制四个 部分
 是一 种通用的、 功能 齐全 的关系 数据库 语言
两种 使用 方法:
 交互式 SQL :与用 户交 互的方 式联 机使 用

 宿主 型 SQL :作为子 语言 嵌入其 它程序 设计 语言


中使 用
SQL 语言支持 关系 数据库 三级 模式结 构, 下图
给出 了单 用户看 到的 关系数 据库 的三级 模式结 构示
意图 ,其 中外模 式对 应于视 图和 部分基 本表, 逻辑
模式 对应 于基本 表, 内模式 对应 于存储 文件。
SQL 用

----------------------------------------------------------------------------------------------------------------------------------------------------

视图 1 视图 2 外模式
…………………………………………………………………………………………………………………………………...

基本 表 基本表 基本 表 基本表 逻辑模


1 2 3 4 式
…………………………………………………………………………………………………………………………………...

内模式
存储文件 存储文件
1 2
SQL 的特点
1. 集数 据查 询语言 、数 据定义 语言 、数据 操纵语 言
、数 据控 制语言 的功 能于一 体, 语言风 格统一 ,
可以 独立 完成数 据库 生命周 期中 的全部 活动。
2. 高度 非过 程化。 用 SQ L 语言进 行数 据操作 ,用 户
只需 提出 “做什 么” ,而不 必指 明“怎 么做” ,
这不 但减 轻了用 户负 担,而 且有 利于提 高数据 独
立性 。
3. 面向 集合 的操作 方式 。 SQL 语言采 用集合 操作 方
式, 不仅 查找结 果可 以是元 组的 集合, 而且一 次
插入 、删 除、更 新操 作的对 象也 可以是 元组的 集
合。
4. 以同 一种 语法结 构提 供两种 使用 方式, SQL 语言
既是 自含 式语言 ,又 是嵌入 式语 言。作 为自含 式
语言 ,它 能够独 立使 用;作 为嵌 入式语 言, SQ L
语句 能够 嵌入到 高级 语言程 序中 被使用 。
1. 语言简 洁,易 学易 用,完 成数 据定义 、数
据查询 、数据 操纵 、数据 控制 的核心 功能
只用了 9 个动 词。

SQL功能 动词
数据定义 CREATE,DROP,ALTER
数据查询 SELECT
数据操纵 INSERT,UPDATE,DELETE
数据控制 GRANT,REVOKE
第二节 SQL 数据定 义功能

   SQL 的数据定义功能包括定义表、定义视图
和定义索引,如下表。

操作方式
操作对象
创 建 删 除 修 改
表 CREATE TABLE DROP TABLE ALTER TABLE
视图 CREATE VIEW DROP VIEW
索引 CREATE INDEX DROP INDEX
1. 创建基 本表

创建基本表的一般格式如下:
CREATE TABLE 〈表名〉
( 〈列名〉〈数据类型和长度〉[列级完整性约束条件] )
[,〈列名〉〈数据类型和长度〉[列级完整性约束条件]…

[,〈表级完整性约束条件〉];
其中 < 表名 > 是所要创建的基本表的名字,由字母开头,字母
、数字、下划线等组成,大小写无关;定义 < 列名 > 的规则同定义 <
表名 > 相同,但同一表中不允许有相同列名,一个表中最多可以定
义 254 个列名。
几种标准数据类型

说明符 数据类型
CHAR 定长字符型
VARCHAR 变长字符型
DATE 日期型
TIME 时间型
FLOAT 符点型
INT 全字长整数型
SMALLINT 半字长整数型
常用的完整性约束类型
• NOT NULL 用于定义列约束,如果表中有些列不允许出
现空值,则可以在定义该列时定义一个 NOT NULL 类型的
完整性约束。
• UNIQUE 既可以用来定义表约束,也可以用来定义列约
束,它用于指明基本表中某一列或多个列的组合上取值必
须唯一,从而保证在表中的任意两行记录在所要定义列或
列组合上不能取相同的值。在一个表中可以定义多个唯一
性约束,并且唯一性约束列可以出现空值。
• PRIMARY KEY 既可以用来定义表约束,也可以用来定义
列约束,它用来唯一地标识一个元组。在一个基本表中只
能定义一个 PRIMARY KEY 约束,并且在定义以后,该列不
允许出现空值。
• FOREIGH KEY 既可以用来定义表约束,也可以用来定
义列约束,一旦为某列定义了 FOREIGH KEY 约束,系统
将保证从表在外键上的取值要么来自主表中的主键值,
要么为空值。
• CHECK 既可以用来定义表约束,也可以用来定义列约
束,此约束用于指定基本表中的每一条记录必须满足的
条件,也可以对基本表在各列上的值做进一步的约束。
• DEFAULT 用来定义列约束,加上此约束后,当某列的
值空缺时,填以缺省值。
从表:包含外键的基本表称为从表。
主表:包含外键所要引用的主键值的表称为主
表。
职工编号 部门编号 姓名 性别 …
9801 01 张山 男
职工表
9802 02 万名 男
9803 李娟 女
9804 01 张海燕 女
从表 …

部门编号 部门名称
部门表 01 经理办公室
02 人事部
03 公关部
主表

参照完整性约束的维护采用三种形式

1) 缺省策略:拒绝非法操作。如果用户操作违背了参照完
整性约束,则拒绝该操作。
2) 级联策略:如果用户对被参照关系进行了删除操作,则
在参照关系中的相对应的元组也将被删除。如果用户对
被参照关系进行了更新操作,则在参照关系中相对应元
组外键分量的值也随之变化。
3) 置空策略:如果被参照关系的主键值发生变化,则参照
关系的相应元组的外键值将被设置为空值。一般来说,
对于删除操作采用置空策略,而对于更新操作操作采用
级联策略。
建立一个职工表 personel ,它由职工号 no 、姓名
name 、性别 sex 、年龄 age 、所在部门 dept 五个属性组
成,其职工号不能为空,并且值是唯一的。
CREATE TABLE personel
(no CHAR(5) NOT NULL UNIQUE,
name CHAR(20),
sex CHAR(2),
age INT,
dept CHAR(40)) ;
系统执行上面的语句后,就在数据库中建立一个新
的空的职工表 personel ,并将有关职工表的定义及有关
约束条件存放在数据字典中 , 定义表的各个属性时需要
指明其数据类型及长度。
在数据库管理系统中,定义基本表、视图、索引及
其它对象的信息组成了数据库一览表,被称为数据字
典。
2. 修改 基本表
修改基本表包括增加新列、增加新的完整性约束条
件、修改原有的列定义或删除已有的完整性约束条件等
, SQL 语言用 ALTER TABLE 语句修改基本表,其一般格
式为:
ALTER TABLE 〈表名〉
[ ADD[ 〈新列名〉〈数据类型〉 ] [完整性约束]

[ DROP 〈完整性约束名〉]
[ ALTER 〈列名〉〈数据类型〉];
例:向 personel 表增加“参加工作时间”列,其数据类
型为日期型。
ALTER TABLE personel ADD come DATE ;
不论基本表中原来是否已有数据,新增加的列一律为
空值。

例:向 personel 表添加一个约束列 no 为主码的主键约


束。
ALTER TABLE personel
ADD PRIMARY KEY(no) ;
例:删除关于职工号必须取唯一的约束。
ALTER TABLE personel
DROP UNIQUE(no) ;

例:将年龄的数据类型改为字符型。
ALTER TABLE personel ALTER age CHAR(3) ;
修改原有的列定义有可能会破坏已有数据。
3. 删除基本表

当某个基本表不再需要时,可以使用 SQL 语句 DROP


TABLE 进行删除,其一般格式为:
DROP TABLE 〈表名〉;

例:删除 personel 表。
DROP TABLE personel ;
基本表定义一旦被删除,表中的数据和在此表上建
立的索引都将自动被删除掉,而建立在此表上的视图虽
然保留,但已无法引用,因此执行删除操作一定要各外
小心。
4. 建立 索引

建立索引是为了加快表的查询速度,可以根
据需要在基本表上建立一个或多个索引,一般建
立与删除索引是由数据库管理员 (DBA) 或表的属
主 ( 即建立表的人 ) 负责完成。
在 SQL 语言中,建立索引使用 CREATE INDEX 语句,
其一般格式为:
CREATE [ UNIQUE ] INDEX 〈索引名〉
ON < 表名 >(< 列名 > [次序 ] [ ,< 列名 > [次序]
]… ) ;

其中, < 表名 > 指定要建索引的基本表的名字,索


引可以建在该表的一列或多列上,各列名之间用逗号分
隔,每个〈列名〉后面还可以用次序指定索引值的排列
次序,包括 ASC (升序)和 DESC (降序)两种,缺省值
为 ASC , UNIQUE 表示此索引的每一个索引值只对应唯一
的数据记录。
5. 删除索引

索引一经建立,就由系统使用和维护它,不需用户
干预,如果删除索引可以使用 DROP INDEX 语句,其一
般格式为:
DROP INDEX < 索引名 > ;
例:为职工表 personel 按职工号降序建唯一索引。
CREATE UNIQUE INDEX no_index ON personel(no
DESC);
例:为职工 personel 表建立索引,按性别和姓名降序建
唯一索引。
CREATE UNIQUE INDEX SN_index ON
personel(sex,age DESC) ;
例:删除 personel 表的 no_index 索引。
DROP INDEX personel.no_index ;
第三节 SQL 数据查 询功能

数据库查询是数据库的核心, SQL 语言提供了 SELECT 语句进行数据


库的查询,语句的一般格式是:
SELECT [ALL|DISTINCT] < 目标列表达式 > [ 别名 1][,< 目标列表达式
> [ 别名 2]]…
FROM 〈基本表 ( 或视图 ) 〉 [ 表别名 ][, 〈基本表 ( 或视图 ) 〉
[ 表别名 ]]…
[WHERE < 条件表达式 >]]

[ORDER BY < 列名 1> [ASC | DESC]] ;


整个语句的含义是:根据 WHERE 子句的条件表达,从基本表(或视
图)中找出满足条件的元组,按 SELECT 子句中的目标列表达式的顺序,
形成新的查询表;如果有 ORDER 子句,则查询表还要根据指定的列名 1 按
升序或降序排序; DISTINCT 表示要取消查询表中重复的行。
学生 - 课程数据库 中三个表
学生表 Student
Sno Sname Ssex Sage Sdept

课程表 Course 学生选课表 SC


Cno Cname Ccredit Sno Cno grade
SQL 查询包括简单查 询、连接查 询和嵌套查 询等形式。
简单查询仅涉及数据库中的一个表,如果查询同时涉及两
个以上的表,则称为连接查询,嵌套查询是指一个查询块
可以嵌入另一个查询块之中, SQL 中允许多层嵌套。
命令 格式 :
SELECT < 表达式 1> , < 表达式 2> ,… < 表达式 n>
FROM < 关系 1> , < 关系 2> , … < 关系 m>
WHERE < 条件表达 式 >;
功能 :用于在指定的关系中,按指定的条件来查询所需要
的内容。
1. 简单 查询
在 FROM 后只跟一个表。
例 求 全体学 生的 详细信 息。
SE LE CT *
FR OM Stu den t ;
若要查 询 FR OM 后面指定 的表的 全部 属性, 可以
用‘ *’ 来表示, 所以上 面的 查询等 价:
SE LE CT Sn o,S na me ,Ss ex, Sa ge ,Sd ept
FR OM S tud ent ;
例 求 学生姓 名及 其出生 年份 。
SE LE CT Sn ame ,2 00 9-S age
FR OM S tud ent ;
SEL EC T 语句后 面可 以是字 段名 ,可 以是字 段和
常数组成 的算 术表达 式,也 可以 是字 符串常 数。
可以 重新 命名属 性
格式 为: SELECT 属性名 新 属性名
SE LE CT Sn ame ,2 009 -S age B irt h_ yea r
FR OM St ud ent ;
消除 取值 重复的 行
例 查询 学校所 有的院 系。
SE LE CT DI STI NC T Sde pt
FR OM S tud ent ;
Student
Sno Sname Ssex Sage Sdept Sdept
99001 张岩 男 20 CS
CS
99002 李晨 女 19 IS
99003 周敏 女 18 MA IS
99004 陈立 男 19 IS MA
条件查 询
通过 WHERE 子句实现条件查询, WHERE 子句
常用的查询条件如下表所示。

查询条件 运算符或谓词
比较 =,>,<,≥,≤,!=,<>,!>,!<
确定范围 BETWEEN AND ,NOT BETWEEN AND
确定集合 IN, NOT IN
字符匹配 LIKE ,NOT LIKE
空值 IS NULL, IS NOT NULL
多重条件 AND ,OR
例 求年龄在 20 岁与 22 岁之间的学生姓名和年
龄。
SELECT Sname , Sage
FROM Student
WHERE Sage BETWEEN 20 AND 22 ;
BETWEEN 后面是低值, AND 后面是高值

例 求学号为 99001 的学生的详细情况。


SELECT *
FROM Student
WHERE Cno LIKE ′99001′
LIKE 谓词的一般形式是:
 列名 LIKE 字符串常数
这里,列名的类型必须是字符串或变长字符
串,在字符串常数中字符的含意如下:
 字符 _( 下划线 ) 表示可以和任意的单个字符匹
配。如 x_y 表示以 x 开头,以 y 结尾长度为 3 的任
意字符串,象 xgy , xhy 。
 字符 %( 百分号 ) 表示可以和任意长的 ( 长度可以
为零 ) 字符串匹配。如 x%y 表示以 x 开头,以 y 结
尾的任意长度的字符串,象 xsy , xdcy 等都满足
该匹配。
涉及空值 NULL 的查询

例 求缺少学习成绩的学生学号和课程号。
SELECT Sno , Cno
FROM SC
WHERE grade IS NULL ;
涉及空值的谓词的一般形式是:
列名 IS [ NOT ] NULL 。
注意,不能写成:列名 =NULL 。
多重条件查询
例 查询信息系中年龄低于 20 岁的学生。
SELECT * FROM Student
WHERE Sage<20 AND Sdept LIKE ‘IS’ ;

对查询结果排序

例 查询全体学生情况,查询结果按所在系排
列,同一系中的学生按年龄降序排列。
SELECT * FROM Student
ORDER BY Sdept , Sage DESC ;
使用集函数
COUNT (*) 统计元组个数
COUNT (< 列名 >) 统计一列中值的个数
SUM (< 列名 >)
计算一列值的总和(此列必须是数值型)
AVG (< 列名 >)
计算一列值的平均值(此列必须是数值型)
MAX ([DISTINCT]< 列名 >) 求一列值中的最大值
MIN ([DISTINCT]< 列名 >) 求一列值中的最小值
如果指定 DISTINCT 短语,表示计算时取消指定列中
的重复值。
例 查询学生总人数。
SELECT COUNT ( * ) Stud_number
FROM Student ;
例 查询信息系所有学生的平均年龄。
SELECT AVG ( Sage ) Average_age
FROM Student
WHERE Sdept=‘IS’ ;
例:查询选课表中学生 3 号课程的平均成
绩、最高成绩和最低成绩。
SELECT avg(grade) avg , max(grade)
max , min(grade) min
FROM Sc ;
WHERE Cno=‘3’;
2. 连接查询
若查询同时涉及两个以上的表,则称之为连
接查询。连接查询是关系数据库最主要的查询,
包括等值连接、非等值连接、自身连接和外连接
查询等。
连接查询中连接条件的一般格式为:
[< 表名 1>.]< 列名 1> < 比较运算符 > [< 表名 2>.]< 列
名 2>
其中比较运算符主要有:
= 、 > 、 < 、 >= 、 <= 、! = 。
当连接运算符为 = 时,称为等值连接,使用其他运
算符称为非等值连接,连接条件中的各连接字段类型必
须是可比的。
例 查询每个学生及其选修课情况。
SELECT Student.* , SC.*
FROM Student X,SC Y
WHERE X.Sno=Y.Sno ;
上面查询中并没有去掉重复列,若去掉重复列,可以
写成:
SELECT
Student.Sno , Sname,Ssex,Sage,Sdept,Cno,grade
FROM Student X,SC Y
WHERE X.Sno=Y.Sno ;
说明 :
2. 若不同 关系中具有 相同的属性 名,为免混淆 ,须
在前面 冠以别名用 圆点分开;
3. 如果用 户没有起别 名,可用关 系的原名。
例 查询课程号等于学分的课程名称。
SELECT Cname
FROM Course
WHERE Cno=Ccredit ;
一个表与自身进行的连接称为自连接。
3. 嵌套查询
嵌套查询是指一个查询块可以嵌入另一个查
询块之中, SQL 中允许多层嵌套。

Select
from 父查询
where
(select
from 子查询
where
);
例 求选修了课程号为“ 3” 的学生姓名和学
号。
SELECT Sname,Sno
FROM Student
WHERE Sno IN
(SELECT Sno
FROM SC
说明 :
WHERE Cno=‘3’) ;
2. 在嵌套 查询中, WHERE 子句的的条件 常用到谓词
IN , IN 操作可 以用来查询 属性只属于某 个集合的元 组;
3. 在嵌套 查询中, IN 不能用一 系列 OR 来替代。
Student
Sno Sname Ssex Sage Sdept
99001 张岩 男 20 CS
99002 李晨 女 19 IS
99003 周敏 女 18 MA
99004 陈立 男 19 IS

SC 查询结 果:
Sno Cno grade Sno Sname
99001 3 89
99001 张岩
99002 2 93
99002 3 88
99002 李晨
 例 : 查询 与“李 晨” 在同一 个系 学习的 学

SELECT Sno, Sname, Sdept
FROM Student
WHERE Sdept IN  
      (SELECT Sdept
      FROM Student
      WHERE Sname=‘ 李晨’ );
 本例中的查询也 可以用表的 自连接查
询来完成:
SELECT S1.Sno, S1.Sname, S1.Sdept
FROM Student S1, Student S2
WHERE S1.Sdept = S2.Sdept
AND S2.Sname=‘ 李晨 ';
第四节 SQL 数据操 纵功能

SQL 的数据 操作语 句包 括修改 ,删 除和 插入三


类语 句。
修改操作 语句 的一般 格式 为:
UPD AT E < 表名 >
SET < 列名 >= < 表达式 >[ ,< 列名 >=< 表达式
> ]…
[WH ER E 谓词 ];
修改指定 表中 满足谓 词的 元组, 把这 些元组 按
SE T 子句 中的 表达式 修改 相应字 段上 的值。
例 单记录修改,把学生“张岩”的姓名改为“
张兰”,
UPDATE Student
SET Sname=‘ 张兰’
WHERE Sname=‘ 张岩’;
例 多记录修改,把所有学生的年龄加 2 。
UPDATE Student
SET Sage=Sage+2 ;
删除语句的一般格式为:
DELETE
FROM 表名
[ WHERE 谓词];
从指定表中删除满足谓词的那些记录,没有
WHERE 子句时表示删去此表中的全部记录,但此
表的定义仍在数据字典中。 DELETE 语句删除的
是表中的数据,而不是关于表的定义。
例 单记录删除。把学生 99001 删除。
DELETE
FROM Student
WHERE Sno=‘99001’ ;
例 多记录删除。删除所有的学生选课记录。
DELETE
FROM SC ;
SC 成为一个空表。
插入语句的一般格式有两种:
①. 插入一个元组
INSERT
INTO 表名[ ( 字段名[,字段名]… ) ]
VALUES( 常量[,常量]… ) ;
②. 插入子查询结果
INSERT
INTO 表名[ ( 字段名[,字段名]… ) ]
子查询;
第一种格式把一个新记录插入指定的表中,第二种
格式把子查询的结果插入表中,若表中有些字段在插入
语句中没有出现,则这些字段上的值取空值 NULL 。
例 单记录插入。
把一个新学生:学号‘ 99006’ ,姓名‘
张明’ ,‘ 男’, 20 岁,所在系‘ IS’ ,插入
表中。
INSERT
INTO Student
VALUES(‘99006’,‘ 张
明’ ,‘ 男’ ,20,‘IS’) ;
插入和删除与更新操作一样,都会引起完
整性被破坏,支持关系模型的系统应该自动地
检查,对破坏完整性的插入操作拒绝执行。
第五 节 视图

视图是从一个或几个基本表(或视图)导出的
表,它与基本表不同,是一个虚表。数据库中只存
放视图的定义,而不存放视图对应的数据,这些数
据仍存放在原来的基本表中。基本表中的数据发生
变化,从视图中查询出的数据也就随之改变了。
视图一经定义,就可以和基本表一样被查询、
被删除,也可以在一个视图之上再定义新的视图,
但对视图的更新(增、删、改)操作则有一定的限
制。
定义视图
定义视图包括建立视图和删除视图。
SQL 语言用 CREATE VIEW 命令建立视图,其一般格式为

CREATE VIEW < 视图名 >[(< 列名 >[ , < 列名 > ]
…)]
AS <子查询>
[WITH CHECK OPTION] ;
WITH CHECK OPTION 表示对视图进行
UPDATE , INSERT 和 DELETE 操作时要保证更新、插入或
删除的行满足子查询中的条件表达式。
如果 CREATE VIEW 语句仅指定了视图名,省略了组
成视图的各个属性列名,则隐含该视图由子查询中
SELECT 子句目标列中的各个字段组成。
例 建立计算机系学生的视图。
CREATE VIEW C_Student
AS
SELECT Sno , Sname , Sage
FROM Student
WHERE Sdept =′ CS′ ;
本例中省略了视图 C_Student 的列名,隐含了该视
图由子查询中 SELECT 子句中的 3 个目标列名组成。
例 建立电子商务系学生的视图,并要求进行修改和插
入操作时仍须保证该视图只有电子商务系的学生。
CREATE VIEW EC_Student
AS
SELECT Sno, Sname, Sage
FROM Student
WHERE Sdept=′EC′
WITH CHECK OPTION ;
由于在定义 EC_Student 视图时加上了 WITH CHECK
OPTION 子句,以后对该视图进行插入和修改操作时,
DBMS 会自动加上 Sdept =‘ EC’ 的条件。
建立在多个基本表上的视图

例 建立信息系选修 2 号课程的学生的视图。
CREATE VIEW IS1 ( Sno , Sname , grade )
AS
SELECT Student.Sno, Sname, grade
FROM Student,SC
WHERE Sdept=′IS′AND
Student . Sno = SC.Sno AND
SC.Cno=′2′ ;
由于视图 IS1 的属性列中包含了 Student 表与 SC 表
的同名列 Sno ,所以必须在视图名后面明确说明视图的
各个属性列名。
建立在基本表与视图上的视图
例 建立信息系选修了 2 号课程且成绩在 90 分以上的学
生的视图。
CREATE VIEW IS2
AS
SELECT Sno , Sname , grade
FROM IS1
WHERE grade >= 90 ;
这里的视图 IS2 就是建立在视图 IS1 之上的。
带虚拟列的视图

例 定义一个反映学生出生年份的视图。
CREATE VIEW birthday ( Sno , Sname , birth )
AS SELECT Sno , Sname , 2009-Sage
FROM Student ;
由于 birthday 视图中的出生年份值是通过一个表达
式计算得到的,不是单纯的属性名,所以定义视图时必
须明确定义该视图的各个属性列名, birthday 视图是一
个带表达式的视图。
例 将 Student 表中所有女生记录定义为一个视
图。
CREATE VIEW F_Student(stdnum,name,sex,age,dept)
AS SELECT *
FROM Student
WHERE Ssex=′ 女′;
视图 F_Student 是由子查询“ SELECT *” 建立的,
该视图一旦建立后, Student 表就构成了视图定义的一
部分,如果以后修改了基本表 Student 的结构,则
Student 表与 F_Student 视图的映象关系受到破坏,因而
该视图就不能正确工作了。
① .建立视图时明确指明属性列名,而不是简单地用
SELECT * ,即
CREATE VIEW F_Student(stdnum,name,sex,age,dept)
AS SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student
WHERE Ssex=′ 女′;
这样,如果为 Student 表增加新列,原视图仍能正
常工作,只是新增的列不在视图中而已。
② .在修改基本表之后删除原来的视图,然后重建视图
,这是最保险的方法。
删除 视图

视图建好后,若导出此视图的基本表被删除
了,该视图将失效,但一般不会被自动删除。删
除视图使用 DROP VIEW 语句,该语句的格式为
DROP VIEW <视图名>;
一个视图被删除后,由该视图导出的其他视
图也将失效,用户应该使用 DROP VIEW 语句将
他们一一删除。
例 删除视图 IS1 。
DROP VIEW IS1 ;
执行此语句后, IS1 视图的定义将从
数据字典中删除,由 IS1 视图导出的 IS2
视图的定义虽仍在数据字典中,但该视图
已无法使用了,因此应该同时删除。
查询 视图

视图定义后,用户就可以象对基本表进行查
询一样对视图进行查询了。 DBMS 执行对视图的
查询时,首先进行有效性检查,检查查询涉及的
表、视图等是否在数据库中存在,如果存在,则
从数据字典中取出查询涉及的视图的定义,把其
转换成对基本表的查询。
例 在电子商务系学生的视图中找出年龄
小于 20 岁的学生。
SELECT Sno , Sage
FROM EC_Student
WHERE Sage<20 ;
更新 视图

更新视图包括插入 (INSERT) 、删除


(DELETE) 和修改 (UPDATE) 三类操作。
由于视图是不实际存储数据的虚表,因此对
视图的更新,最终要转换为对基本表的更新。
例 将计算机系学生视图 C_Student 中学号为 99002 的
学生姓名改为“李旭”。
UPDATE C_Student
SET Sname =′李旭′
WHERE Sno =′ 99002′ ;
DBMS 执行此语句时,首先进行有效性检查,检查所
涉及的表、视图等是否在数据库中存在,如果存在,则
从数据字典中取出该语句涉及的视图的定义,把其转换
成对基本表的更新,然后再执行这个经过转换的更新操
作,转换后的更新语句为
UPDATE Student
SET Sname=′ 李旭′
WHERE Sno=′99002′ AND Sdept =′ CS′ ;
例 删除计算机系学生视图 C_Student 中学号为
99004 的记录。
DELETE
FROM C_Student
WHERE Sno=′99004′ ;
DBMS 将其转换为对基本表的更新:
DELETE
FROM Student
WHERE Sno=′99004′AND Sdept=′CS′ ;
需要注 意的是 并不 是所有 视图 都可
以对其 进行更 新操 作,在 以下 环境中 ,不 能
对视图 进行相 应的 更新操 作。
 在多 个表 上建立 的视 图不能 使用 DELETE 语句;
 不能 使用 INSERT 语句,除 非基 本表的 所有 NOT
NULL 列都包含 在视 图列表 中;
 如果 在视 图定义 中使 用了 DISTINCT 语句, 则不能
使用 视图 修改或 插入 数据;
 不能 修改 一个虚 拟列 (一个 表达 式或函 数结果 组
成的 列) 。
视图的作用

• 视图能够简化用户的操作,使用户可以将注
意力集中在他所关心的数据上。
• 视图能使不同的用户以不同的方式看待同一
数据。
• 视图对重构数据库提供了一定程度的逻辑独
立性。
• 视图能够对机密数据提供安全保护。
第六节 SQL 数据控 制功能

SQL 中数据控制功能包括数据库的恢复、并
发控制、数据库的安全性和完整性。数据库管
理系统保证数据安全的主要措施是进行存取控
制,即规定不同用户对于不同数据对象所允许
执行的操作。
创建用户

sp_addlogin[@loginame=]‘login’  
          [,[ @passwd=]‘password’]  
          [,[ @defdb= ]‘database’]  
参数
• [@loginame=]‘login’  
登录的名称。 login 的数据类型为 sysname ,没有默认
设置。
• [@passwd=]‘password’  
登录密码。 password 的数据类型为 sysname ,默认设
置为 NULL 。 sp_addlogin 执行后, password 被加密
并存储在系统表中。
• [@defdb=]'database'  
登录的默认数据库。 database 的数据类型为
sysname ,默认设置为 master 。  
添加用户
sp_adduser [ @loginame = ] 'login'  
          [ , [@name_in_db = ] 'user']
 
          [ , [@grpname   =  ]
'group']
• A 、添加用户
下面的示例使用现有的登录 test1 ,将用户 test1
添加到当前数据库中现有的 public 角色中。
sp_adduser 'test1', 'test1', ‘public'
• B 、添加用户名(使用相同的登录)
下面的示例为登录 test2 将默认用户名 test2 添加
到当前数据库,该用户名属于默认的 public 角色。
sp_adduser ‘test2’  
• C 、添加用户(使用不同的用户名)  
下面的示例将 test1 登录添加到当前的数据库中并使
用 test2 用户名,该用户名属于 public 角色。
sp_adduser  'test1', 'test2', ‘public’
授权
SQL 语言用 GRANT 语句向用户授予操作权限
, GRANT 语句的一般格式为:
GRANT <权限>[,<权限>]…
[ ON <对象类型><对象名>]
TO <用户>[,<用户>]…
[ WITH GRANT OPTION ];
其语义为:授予指定的用户对指定操作对象
的指定操作权限。
不同对象类型允许的操作权限
对象 对象类型 操作权限
SELECT,INSERT,UPDATE,
属性列 TABLE
DELETE,ALL PRIVILEGES
SELECT,INSERT,UPDATE,
视图 TABLE
DELETE,ALL PRIVILEGES
SELECT,INSERT,UPDATE,
基本表 TABLE DELETE,ALTER,INDEX,
ALL PRIVILEGES
数据库 DATABASE CREATE TABLE,CREATE VIEW
接受权限的用户可以是一个或多个具体用
户,也可以是 PUBLIC ,即全体用户。如果指
定了 WITH GRANT OPTION 子句,则获得某种权
限的用户还可以把这种权限再授予其他用户。
如果没有指定 WITH GRANT OPTION 子句,则获
得某种权限的用户只能使用该权限,但不能转
授该权限。
例 把查询 Course 表的权限授给用户 user1 。
GRANT SELECT
ON Course
TO user1 ;
例 把对 Student 表和 Course 表的全部操作权
限授予用户 user2 和 user3 。
GRANT ALL PRIVILEGES
ON Student,Course
TO user2,user3 ;
例 把对表 SC 的查询权限授予所有用户。
GRANT SELECT
ON SC
TO PUBLIC ;
例 把查询 SC 表和修改成绩的权限授给用户 user4 。
GRANT UPDATE(grade), SELECT
ON SC
TO user4 ;
这里实际上要授予 user4 用户的是对基本表 SC 的
SELECT 权限和对属性列 grade 的 UPDATE 权限。授予关于
属性列的权限时必须明确指出相应属性列名。
例 把对表 Student 的 INSERT 权限授予 user5 用户,并
允许将此权限再授予其他用户。
GRANT INSERT ON Student TO user5
WITH GRANT OPTION ;
执行此 SQL 语句后, user5 不仅拥有了对表 Student
的 INSERT 权限,还可以转授此权限,即由 user5 用户使
用上述 GRANT 命令给其他用户授权。
例 : user5 可以将此权限授予 user6 :
GRANT INSERT ON Student TO user6
WITH GRANT OPTION ;
user6 还可以将此权限授予 user7 :
GRANT INSERT ON Student TO user7 ;
因为 user6 未给 user7 传播的权限,因此 user7 不
能再转授此权限。
例 : DBA 把在数据库中建立表的权限授予用户 user8 。
GRANT CREATE TABLE TO user8 ;
收回权限
授予的权限可以由 DBA 或其他授权者用
REVOKE 语句收回, REVOKE 语句的一般格式为:
REVOKE [GRANT OPTION FOR]
<权限> [ ,<权限> ]…
[ON <对象类型><对象名> ]
FROM <用户> [ ,<用户> ]
[CASCADE]… ;
例 : 把用户 user4 修改学生成绩的权限收回
REVOKE UPDATE(grade)ON SC
FROM user4 ;
例 : 把用户 user5 对 Student 表的 INSERT 权限
收回
REVOKE INSERT ON Student
FROM user5 ;
例 : 收回用户 6 对表 Student 查询的转授权限
REVOKE GRANT OPTION FOR SELECT ON
Student FROM test6 CASCADE ;
作业:
建立 Stud en t 表,字 段
Sn o 、 Snam e 、 Sse x 、 Sd ept 类型为 定长 字符型 ,
长度分别 为 5 、 10 、 2 、 5 ,字段 Sa ge 类型为 全字
长整型数 。
Student
Sno Sname Ssex Sage Sdept
99001 张岩 男 20 EC
99002 李晨 女 19 C
99003 周敏 女 18 EC
99004 陈立 男 19 C
98001 李维 男 21 IS
98002 欧阳美林 女 21 IS
98003 王义平 男 22 IS
1. 补充定义 Studen t 表的主 键(属 性
Sno )。
2. 查询电子 商务 系学生 的信 息。
3. 建立电子 商务 系学生 的视 图 EC-V 。
4. 查询信息 系学 生的信 息。
5. 建立信息 系学 生的视 图 IS-V 。
小结

本章 主要介 绍了 SQL 语言的 数据定 义功


能、数 据查询 功能 、数据 操纵 功能和 数据 控
制功能 ,并能 熟练 使用 SQL 语言。

You might also like