幻灯片 1 - 精品课程首页 西北工业大学

Download Report

Transcript 幻灯片 1 - 精品课程首页 西北工业大学

CMU SSD7:
Database Systems
Lu Wei
School of Software
Northwestern Polytechnical
University
Unit2.1 关系数据库标准语言
• 第一节 SQL概貌及特点
• 第二节 数据定义
• 介绍postgres数据库系统安装和使用
• 第三节 查询
• 第四节 数据更新
• 第五节 视图
• 第六节 SQL的数据控制功能
• 第七节 事务
Lu Wei
2
第一节
SQL概貌及特点
• 1.SQL简介
• 2.SQL特点
• 3.SQL语言的基本概念
Lu Wei
3
1.SQL简介
结构化查询语言SQL(Structured Query
Language)是一种介于关系代数与关系演算之间
的语言,其功能包括查询、操纵、定义和控制四
个方面,是一个通用的、功能极强的关系数据库
语言。目前已成为关系数据库的标准语言。
SQL语言的版本包括:SQL-89,SQL-92,SQL3
( SQL-99 )。
Lu Wei
4
2.SQL特点
SQL语言之所以能够为用户和业界所接受,成为
国际标准,是因为它是一个综合的、通用的、功
能极强同时又简洁易学的语言。SQL语言集数据
查询(data query)、数据操纵(data
manipulation)、数据定义(data
definition)和数据控制(data control)
功能于一体,充分体现了关系数据语言的特点和
优点。
其主要特点包括:
Lu Wei
5
1.综合统一
SQL语言集数据定义语言DDL、数据操纵语言
DML、数据控制语言DCL的功能于一体,语言风格
统一,可以独立完成数据库生命周期中的全部活
动,包括定义关系模式、录入数据以建立数据库、
查询、更新、维护、数据库重构、数据库安全性
控制等一系列操作要求,这就为数据库应用系统
开发提供了良好的环境,例如用户在数据库投入
运行后,还可根据需要随时地逐步地修改模式,
并不影响数据库的运行,从而使系统具有良好的
可扩充性。
Lu Wei
6
2.高度非过程化
非关系数据模型的数据操纵语言是面向过程的
语言,用其完成某项请求,必须指定存取路径。
而用SQL语言进行数据操作,用户只需提出“做
什么”,而不必指明“怎么做”,因此用户无需
了解存取路径,存取路径的选择以及SQL语句的
操作过程由系统自动完成。这不但大大减轻了用
户负担,而且有利于提高数据独立性。
Lu Wei
7
3.面向集合的操作方式
SQL语言采用集合操作方式,不仅查找结果可
以是元组的集合,而且一次插入、删除、更新操
作的对象也可以是元组的集合。
非关系数据模型采用的是面向记录的操作方式,
任何一个操作其对象都是一条记录。例如查询所
有平均成绩在80分以上的学生姓名,用户必须说
明完成该请求的具体处理过程,即如何用循环结
构按照某条路径一条一条地把满足条件的学生记
录读出来。
Lu Wei
8
4.以同一种语法结构提供两种使用方式
SQL语言既是自含式语言,又是嵌入式语言。
作为自含式语言,它能够独立地用于联机交互
的使用方式,用户可以在终端键盘上直接键入
SQL命令对数据库进行操作。作为嵌入式语言,
SQL语句能够嵌入到高级语言(例如C、COBOL、
FORTRAN、PL/1)程序中,供程序员设计程序时
使用。而在两种不同的使用方式下,SQL语言的
语法结构基本上是一致的。这种以统一的语法结
构提供两种不同的使用方式的作法,为用户提供
了极大的灵活性与方便性。
Lu Wei
9
5.语言简洁,易学易用
SQL语言功能极强,但由于设计巧妙,语言十
分简洁,完成数据定义、数据操纵、数据控制的
核心功能只用了9个动词:CREATE、DROP、
SELECT、INSERT、UPDATE、DELETE、GRANT、
REVOKE,如表3-1所示。而且SQL语言语法简单,
接近英语口语,因此容易学习,容易使用。
Lu Wei
10
SQL语言的动词
SQL 功能
数据查询
数据定义
数据操纵
数据控制
动词
SELECT
CREATE,DROP,ALTER
INSERT,UPDATE,DELETE
GRANT,REVOKE
Lu Wei
11
3.SQL语言的基本概念
SQL语言支持关系数据库三级模式结构,如下页图
所示。其中:
外模式对应于视图(View)和部分基本表
(Base Table);
模式对应于基本表;
内模式对应于存储文件
Lu Wei
12
用户1
SQL用户
用户2
用户3
用户4
VIEW
视图V1
Base
Table
视图V2
基本表B1
基本表B2
基本表B3
基本表B4
存储文件S1
存储文件S2
存储文件S3
存储文件S4
Stored file
SQL对关系数据库的支持
Lu Wei
13
• 基本表是本身独立存在的表,在SQL中一个关系就对应一
个表。一些基本表对应一个存储文件,一个表可以带若干
索引,索引也存放在存储文件中。
• 存储文件的逻辑结构组成了关系数据库的内模式。存储文
件的物理文件结构是任意的。
• 视图是从基本表或其他视图中导出的表,它本身不独立存
储在数据库中,也就是说数据库中只存放视图的定义而不
存放视图对应的数据,这些数据仍存放在导出视图的基本
表中,因此视图是一个虚表。 用户可以用SQL语言对视
图和基本表进行查询。在用户眼中,视图和基本表都是关
系,而存储文件对用户是透明的。
Lu Wei
14
第二节
数据定义
• 1.SQL数据类型
• 2.域
• 3.完整性约束
• 4.创建删除数据库
• 5.基本表
• 6.索引
Lu Wei
15
1.SQL数据类型
1.SQL标识符(注意不能和内部标识符冲突)
2.SQL标量数据类型
3.标量运算符
Lu Wei
16
2.域
定义域的一般格式为:
CREATE DOMAIN DomainName [AS]
dataType
[DEFULT defaultOption]
[CHECK searchCondition]
删除域的一般格式为:
DROP DOMAIN DomainName
[RESTRICT|CASCADE]
Lu Wei
17
【例】
CREATE DOMAIN SexType AS CHAR
DEFAULT ‘M’
CHECK(VALUE IN(‘M’,’F’));
sex SexType NOT NULL
Lu Wei
18
3.完整性约束
1.实体完整性(通过主键和唯一键实现)
PRIMARY KEY(columnName)
columnName dataType NOT NULL
UNIQUE(columnName)
2.引用完整性(通过外键实现)
FOREIGN KEY(columnName) REFERENCES
tableName.columnName ON
[UPDATE|DELETE] [CASCADE|SET
NULL|SET DEFAULT|NO ACTION]
Lu Wei
19
3.用户定义完整性(通过检查约束实现)
CHECK(condition)
【例】
CHECK (Salary >= 0)
CREATE ASSERTION AssertionName
CHECK(condition)
Lu Wei
20
4.创建删除数据库
CREATE SCHEMA [Name|
AUTHORIZATION CreatorIdentifier]
DROP SCHMA Name [RESTRICT|CASCADE]
The Restrict option removes the schema if
the database has no data in it, that is,
if all tables are empty.
The Cascade option removes everything
including data (tuples) and definitions
(tables, domains, etc).
Lu Wei
21
5.基本表
定义基本表一般格式如下:
CREATE TABLE <表名>(<列名><数据类型>
[列级完整性约束条件] [,<列名> <数据类型>
[列级完整性约束条件]...) [,<表级完整性约
束条件>];
Lu Wei
22
其中<表名>是所要定义的基本表的名字,它
可以由一个或多个属性(列)组成。
建表的同时通常还可以定义与该表有关的完整
性约束条件,这些完整性约束条件被存入系统的
数据字典中,当用户操作表中数据时由DBMS自动
检查该操作是否违背这些完整性约束条件。
如果完整性约束条件涉及到该表的多个属性列,
则必须定义在表级上,否则既可以定义在列级也
可以定义在表级。
Lu Wei
23
下面我们以一个“学生-课程”数据库为例说明SELECT语
句的各种用法。
“学生-课程”数据库中包括三个表:
(1)“学生”表Student由学号(Sno)、姓名
(Sname)、性别(Ssex)、年龄(Sage)、所在系
(Sdept)五个属性组成,可记为:
Student(Sno,Sname,Ssex,Sage,Sdept) Sno
(2)“课程”表Course由课程号(Cno)、课程名
(Cname)、先修课号(Cpno)、学分(Ccredit)四
个属性组成,可记为:
Course(Cno,Cname,Cpno,Ccredit) Cno
Lu Wei
24
(3)“学生选课”表SC由学号(Sno)、课程号
(Cno)、成绩(Grade)三个属性组成,可记
为: SC(Sno,Cno,Grade) (SNO, CNO)
例1 建立一个“学生”表Student,它由学号Sno、
姓名Sname、性别Ssex、年龄Sage、所在系
Sdept五个属性组成,其中学号属性不能为空,
并且其值是唯一的。
Lu Wei
25
CREATE TABLE Student
(Sno CHAR(5) NOT NULL UNIQUE,
Sname CHAR(20),
Ssex CHAR(1),
Sage INT,
Sdept CHAR(15));
定义表的各个属性时需要指明其数据类型及长度。
不同的数据库系统支持的数据类型不完全相同。
Lu Wei
26
修改基本表一般格式为:
ALTER TABLE <表名>[ADD <新列名><数据类
型>[完整性约束]][DROP<完整性约束名><完整
性约束名>] [MODIFY<列名> <数据类型>];
其中<表名>指定需要修改的基本表;
ADD子句用于增加新列和新的完整性约束条件;
DROP子句用于删除指定的完整性约束条件;
MODIFY子句用于修改原有的列定义。
Lu Wei
27
例2 向Student表增加“入学时间”列,其数据类
型为日期型
ALTER TABLE Student ADD Scome DATE;
不论基本表中原来是否已有数据,新增加的列一
律为空值。
例3 将年龄的数据类型改为半字长整数
ALTER TABLE Student MODIFY Sage SMALLINT;
修改原有的列定义有可能会破坏已有数据。
例4 删除关于学号必须取唯一值的约束
ALTER TABLE Student DROP UNIQUE(Sno);
Lu Wei
28
删除基本表一般格式为:
DROP TABLE <表名> [RESTRICT|CASCADE]
With the CASCADE option, the table and all
references to it are removed. With the
RESTRICT option, the table is removed if
it is not referenced.
例5 删除Student表
DROP TABLE Student;
基本表定义一旦删除,表中的数据、在此表上建立的索引
都将自动被删除掉,而建立在此表上的视图虽仍然保留,
但已无法引用。因此执行删除操作一定要格外小心。
Lu Wei
29
6.索引
创建索引一般格式为:
CREATE [UNIQUE] [CLUSTER] INDEX <索
引名><索引名> ON <表名> (<列名>[<次序
>][,<列名>[<次序>]]...);
其中,<表名>指定要建索引的基本表的名字。
索引可以建在该表的一列或多列上,各列名之间
用逗号分隔。每个<列名>后面还可以用<次序>指
定索引值的排列次序,包括ASC(升序)和DESC
(降序)两种,缺省值为ASC。
Lu Wei
30
UNIQUE表明此索引的每一个索引值只对应唯一的数据记
录。
CLUSTER表示要建立的索引是聚簇索引。所谓聚簇索引
是指索引项的顺序与表中记录的物理顺序一致的索引组织。
例如,执行下面的CREATE INDEX语句:
CREATE CLUSTED INDEX Stusname ON
Student(Sname);
将会在Student表的Sname(姓名)列上建立一个聚簇索
引,而且Student表中的记录将按照Sno值的升序存放。
用户可以在最常查询的列上建立聚簇索引以提高查询效率。
显然在一个基本表上最多只能建立一个聚集索引。建立聚
簇索引后,更新索引列数据时,往往导致表中记录的物理
顺序的变更,代价较大,因此对于经常更新的列不宜建立
聚簇索引。
Lu Wei
31
例6 为学生-课程数据库中的Student、Couse、SC
三个表建立索引。其中Student表按学号升序建
唯一索引,Couse表按课程号升序建唯一索引,
Sno、Cno表按学号升序和课程号降序建唯一索
引。
CREATE UNIQUE INDEX Stusno ON
Student(Sno);
CREATE UNIQUE INDEX Coucno ON
Couse(Cno);
CREATE UNIQUE INDEX SCno ON SC(Sno
ASC,Cno DESC);
Lu Wei
32
删除索引一般格式为:
DROP INDEX<索引名>;
例7 删除Student表的Stusname索引
DROP INDEX Stusname;
索引一经建立,就由系统使用和维护它,不需用户干预。
建立索引是为了减少查询操作的时间,但如果数据增删
改频繁,系统会花费许多时间来维护索引。这时,可以
删除一些不必要的索引。删除索引时,系统会同时从数
据字典中删去有关该索引的描述。
Lu Wei
33
• 介绍postgres数据库系统安装和使用
Lu Wei
34
第三节
查询
一般格式为:
SELECT [ALL|DISTINCT]<目标列表达式>[,<
目标列表达式>]... FROM <表名或视图名>[,<
表名或视图名>] ... [WHERE <条件表达式>]
[GROUP BY <列名1>[HAVING <条件表达式>]]
[ORDER BY <列名2> [ASC|DESC]];
Lu Wei
35
SELECT A1 , A2 , ..., An
FROM
R1,R2,…,Rm
WHERE F

πA1,A2,...,An(σF(R1× R2×...×Rm))
Lu Wei
36
整个SELECT语句的含义是,根据WHERE子句的条件表达
式,从FROM子句指定的基本表或视图中找出满足条件的
元组,再按SELECT子句中的目标列表达式,选出元组中
的属性值形成结果表。
如果有GROUP子句,则将结果按<列名1>的值进行分组,
该属性列值相等的元组为一个组,每个组产生结果表中的
一条记录。通常会在每组中作用集函数。
如果GROUP子句带HAVING短语,则只有满足指定条件的
组才予输出。
如果有ORDER子句,则结果表还要按<列名2>的值的升序
或降序排序。
Lu Wei
37
1.单表查询
2.连接查询
3.嵌套查询
4.集合查询
Lu Wei
38
1.单表查询
一、选择表中的若干列
1.查询指定列
例1 查询全体学生的学号与姓名
SELECT Sno,Sname
FROM Student;
例2 查询全体学生的姓名、学号、所在系
SELECT Sname, Sno, Sdept
FROM Student;
Lu Wei
39
2.查询全部列
例3 查询全体学生的详细记录
SELECT *
FROM Student;
3.查询经过计算的值
SELECT子句的<目标列表达式>不仅可以是表中
的属性列,也可以是有关表达式,即可以将查询
出来的属性列经过一定的计算后列出结果。
例4 查全体学生的姓名及其出生年份
SELECT Sname, 2006-Sage
FROM Student;
Lu Wei
40
例5 查全体学生的姓名、出生年份和所有系,要求
用小写字母表示所有系名
SELECT Sname, 'Year of Birth:‘, 2006Sage, ISLOWER(Sdept)
FROM Student;
SELECT Sname NAME, 'Year of
Birth:‘ BIRTH,2006-Sage
BIRTHDAY,ISLOWER(Sdept)
DEPARTMENT
FROM Student;
Lu Wei
41
二、选择表中的若干元组
1.消除取值重复的行
例6 查所有选修过课的学生的学号
SELECT Sno
FROM SC;
SELECT DISTINCT Sno
FROM SC;
Lu Wei
42
2.查询满足条件的元组
查询满足指定条件的元组可以通过WHERE子句实现。
WHERE子句常用的查询条件如表3-3所示。
表3-3 常用的查询条件
查询条件
谓 词
比较
比较运算符
确定范围
BETWEEN AND, NOT BETWEEN AND
确定集合
IN, NOT IN
字符匹配
LIKE, NOT LIKE
空值
IS NULL, IS NOT NULL
多重条件
AND, OR
Lu Wei
43
(1)比较
例7 查计算机系全体学生的名单
SELECT Sname
FROM Student
WHERE Sdept = 'CS';
例8 查所有年龄在20岁以下的学生姓名及其年龄
SELECT Sname, Sage
FROM Student
WHERE Sage <20;
或
SELECT Sname, Sage
FROM Student
WHERE NOT Sage>= 20;
Lu Wei
44
例9 查考试成绩有不及格的学生的学号
SELECT DISTINCT Sno
FROM Course
WHERE Grade <60;
(2)确定范围
例10 查询年龄在20至23岁之间的学生的姓名、系
别、和年龄
SELECT Sname, Sdept, Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
Lu Wei
45
例11 查询年龄不在20至23岁之间的学生姓名、系
别和年龄。
SELECT Sname, Sdept, Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;
(3)确定集合
例12 查信息系(IS)、数学系(MA)和计算机科
学系(CS)的学生的姓名和性别
SELECT Sname, Ssex
FROM Student
WHERE Sdept IN ('IS', 'MA', 'CS');
Lu Wei
46
例13 查既不是信息系、数学系,也不是计算机科学系的学
生的姓名和性别
SELECT Sname, Ssex
FROM Student
WHERE Sdept NOT IN ('IS', 'MA', 'CS')
(4)字符匹配
谓词LIKE可以用来进行字符串的匹配。其一般语法格式
如下:
[NOT] LIKE ‘<匹配串>’ [ESCAPE ‘<换码字符>’]
其含义是查找指定的属性列值与<匹配串>相匹配的元组。
<匹配串>可以是一个完整的字符串,也可以含有通配符
%和_。
Lu Wei
47
%(百分号) 代表任意长度(长度可以为0)的字
符串。
_(下横线) 代表任意单个字符。
例15 查所有姓刘的学生的姓名、学号和性别
SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname LIKE ‘刘%’;
例16 查姓“欧阳”且全名为三个汉字的学生的姓
SELECT
Sname
名
FROM Student
WHERE Sname LIKE '欧阳__';
Lu Wei
48
例17 查名字中第二字为“阳”字的学生的姓名和
SELECT Sname, Sno
学号
FROM Student
WHERE Sname LIKE ‘__阳%’;
例18 查所以不姓刘的学生姓名
SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname NOT LIKE '刘%';
Lu Wei
49
例19 查DB_Design课程的课程号和学分
SELECT Cno, Ccredit
FROM Course
WHERE Cname LIKE ’DB$_Design’ ESCAPE ’$’;
例20 查以”DB_”开头,且倒数第三个字符为i的课
程的详细情况
SELECT *
FROM Course
WHERE Cname LIKE ’DB\_%i__’ ESCAPE ’\’;
Lu Wei
50
(5) 涉及空值的查询
例21
SELECT Sno, Cno
FROM SC
WHERE Grade IS NULL;
例22
SELECT Sno, Cno
FROM SC
WHERE Grade IS NOT NULL;
Lu Wei
51
(6)多重条件查询
逻辑运算符AND和OR可用来联结多个查询条件。如果这
两个运算符同时出现在同一个WHERE条件子句中,则
AND的优先级高于OR,但用户可以用括号改变优先级。
例23
SELECT Sname
FROM Student
WHERE
Sdept='CS' AND Sage<20;
例12改写
SELECT Sname, Ssex
FROM Student
WHERE Sdept='IS' OR Sdept='MA' OR
Sdept='CS';
Lu Wei
52
三、对查询结果排序
如果没有指定查询结果的显示顺序,DBMS将按其最方
便的顺序(通常是元组在表中的先后顺序)输出查询结
果。用户也可以用ORDER BY子句指定按照一个或多个
属性列的升序(ASC)或降序(DESC)重新排列查询
结果,其中升序ASC为缺省值。
例24
SELECT Sno, Grade
FROM SC
WHERE Cno='1' ORDER BY Grade DESC;
Lu Wei
53
例25查询全体学生情况,查询结果按所在系的
系号升序排序,同一系中的学生按年龄降序排序
SELECT *
FROM Student
ORDER BY Sdept, Sage DESC;
Lu Wei
54
四、使用集函数
COUNT([DISTINCT|ALL] *) 统计元组个数
COUNT([DISTINCT|ALL] <列名>) 统计一列中值的个
数
SUM([DISTINCT|ALL] <列名>) 计算一列值的总和
(此列必须是数值型)
AVG([DISTINCT|ALL] <列名>) 计算一列值的平均值
(此列必须是数值型)
MAX([DISTINCT|ALL] <列名>) 求一列值中的最大值
MIN([DISTINCT|ALL] <列名>) 求一列值中的最小值
Lu Wei
55
例26
SELECT COUNT(*)
FROM Student;
例27
SELECT COUNT(DISTINCT Sno)
FROM SC;
例28 计算1号课程的学生平均成绩
SELECT AVG(Grade)
FROM SC WHERE Cno='1';
例29 查询选修1号课程的学生最高分
SELECT MAX(Grade)
FROM SC WHERE Cno='1';
Lu Wei
56
五、对查询结果分组
GROUP BY子句可以将查询结果表的各行按一列或多列
取值相等的原则进行分组。
例30 求各个课程号及相应的选课人数
SELECT Cno, COUNT(Sno)
FROM SCG ROUP BY Cno;
例31 查询选修了3门以上课程的学生学号
SELECT Sno
FROM SC
WHERE Sdept=‘IS’
GROUP BY Sno
HAVING COUNT(*)>3;
Lu Wei
57
2.连接查询
一个数据库中的多个表之间一般都存在某种内在
联系,它们共同提供有用的信息。
前面的查询都是针对一个表进行的。若一个查询
同时涉及两个以上的表,则称之为连接查询。
连接查询主要包括等值连接、非等值连接查询、
自身连接查询(二、自身连接)、外连接查询
(连接 三、外连接)和复合条件连接查询(四、
复合条件连接)。
Lu Wei
58
一、等值与非等值连接查询
用来连接两个表的条件称为连接条件或连接谓词,其一般
格式为:
[<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2>
其中比较运算符主要有:=、>、<、>=、<=、!=<=、!=
此外连接谓词词还可以使用下面形式:
[<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2>
AND [<表名2>.]<列名3>
当连接运算符为=时,称为等值连接。使用其它运算符称为
非等值连接。
Lu Wei
59
例32 查询每个学生及其选修课的情况
SELECT Student.*, SC.*
FROM Student, SC
WHERE Student.Sno=SC.Sno;
例33
SELECT Student.Sno, Sname, Ssex,
Sage, Sdept, Cno, Grade
FROM Student, SC
WHERE Student.Sno=SC.Sno;
广义笛卡尔积与自然连接
Lu Wei
60
二、自身连接
连接操作不仅可以在两个表之间进行,也可以是
一个表与其自己进行连接,这种连接称为表的自
身连接。
例34 查询每门课的间接选修课(即先修课的先
修课)
SELECT FIRST.Cno, SECOND. Pcno
FROM Course FIRST, Course SECOND
WHERE FIRST.Pcno=SECOND.Cno;
Lu Wei
61
三、外连接
在通常的连接操作中,只有满足连接条件的元组才能作为
结果输出,如在例32和例33的结果表中没有关于95003
和95004两个学生的信息,原因在于他们没有选课,在SC
表中没有相应的元组。但是有时我们想以Student表为主
体列出每个学生的基本情况及其选课情况,若某个学生没
有选课,则只输出其基本情况信息,其选课信息为空值即
可,这时就需要使用外连接(Outer Join)。
外连接的运算符通常为*。有的关系数据库中也用+。
Lu Wei
62
SELECT Student.Sno, Sname, Ssex,
Sage, Sdept, Cno, Grade
FROM Student, SC
WHERE Student.Sno=SC.Sno(*);
上例中外连接符*出现在连接运算符的右边,所以
也称其为右外连接。相应地,如果外连接符出现
在连接运算符的左边,则称为左外连接。
Lu Wei
63
四、连接运算的计算过程
1.生成FROM子句中指定表的笛卡尔积;
2.如果存在WHERE子句,对每一个笛卡尔积结果运用查找
条件,保留那些满足条件的行,即对笛卡尔积的约束;
3.对于每个剩下的行,确定SELECT列表中每一列,并在查
询结果中产生一行
4.如果指定了SELECT DISTINCT,则消除结果中的冗余行
5.如果有ORDER BY子句,则根据要求对查询结果进行排序。
Lu Wei
64
SQL标准语法
SELECT table1.column,tabel2.column
FROM talbe1
[CROSS JOIN table2] |
[NATURAL JOIN table2] |
[JOIN table2 USING(column_name)] |
[JOIN table2
ON(table1.column_name=table2.column_name)] |
[LEFT|RIGHT|FULL OUTER JOIN table2
ON(table1.column_name=table2.column_name)];
Lu Wei
65
Creating Cross Joins
The cross join clause produce the cross product of
two tables
This is the same as a Cartesian product of the two
tables
SELECT last_name,department_name
FROM employees
CROSS JOIN departments;
SELECT last_name,department_name
FROM employees,departments;
Lu Wei
66
Creating Natural Joins
The natural join clause is based on
all columns in the two tables that
have the same name.
It select rows from the two tables
that have equal values in all
matched columns.
If the columns having the same name
have different data types,than an
error is returned.
Lu Wei
67
Retrieving Records with Natural
Joins
SELECT
department_id,department_name,location_id,city
FROM departments
NATURAL JOIN locations;
SELECT d.department_id,d.department_name,
l.location_id,l.city
FROM departments d,locations l
WHERE d.location_id= l.location_id;
Lu Wei
68
LEFT OUTER JOIN
•
•
•
•
SELECT e.last_name,e.department_id,d.department_name
FROM employees e
LEFT OUTER JOIN departments d
On(e.department_id= d.department_id);
SELECT
e.last_name,e.department_id,d.department_name
FROM employees e, departments d
WHERE e.department_id= d.department_id(+);
Lu Wei
69
五、复合条件连接
上面各个连接查询中,WHERE子句中只有一个条件,即
用于连接两个表的谓词。WHERE子句中有多个条件的
连接操作,称为复合条件连接。
例35 查询选修2号课程且成绩在90分以上的所有学生
SELECT Student.Sno, Sname
FROM Student, SC
WHERE Student.Sno=SC.Sno AND
SC.Cno='2' AND
SC.Grade>90;
Lu Wei
70
连接操作除了可以是两表连接,一个表与其自身连接外,
还可以是两个以上的表进行连接,后者通常称为多表连
接。
例36 查询每个学生的学号、姓名、选修的课程名及成绩
SELECT Student.Sno, Sname,
Course.Cname, SC.Grade
FROM Student, SC, Course
WHERE Student.Sno=SC.Sno and
SC.Cno=Course.Cno;
Lu Wei
71
六、多表连接
SELECT b.branchNo,b.city,s.staffNo,fName,
lName,propertyNo
FROM Branch b,Staff s,PropertyForRent p
WHERE b.branchNo = s.branchNo
AND s.staffNo = p.staffNo
ORDER BY b.branchNo,s.staffNo,propertyNo;
FROM (Branch b JOIN Staff s USING
branchNo) AS bs JOIN PropertyForRent p
USING staffNo;
Lu Wei
72
3.嵌套查询
在SQL语言中,一个SELECT-FROM-WHERE语句称为
一个查询块。将一个查询块嵌套在另一个查询块的
WHERE子句或HAVING短语的条件中的查询称为嵌套查
询或子查询。
一、带有IN谓词的子查询
例37 查询与“刘晨”在同一个系学习的学生
SELECT Sdept
FROM Student
WHERE Sname=‘刘晨’;
SELECT Sno, Sname, Sdept
FROM Student
WHERE Sdept='IS';
Lu Wei
73
SELECT Sno, Sname, Sdept
FROM Student S1, Student S2
WHERE S1.Sdept = S2.Sdept AND
S2.Sname=‘
刘晨‘;
SELECT Sno, Sname, Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname=‘刘晨’);
Lu Wei
74
例38 查询选修了课程名为“IS”的学生号和姓名
SELECT Sno, Sname
FROM Student
WHERE Sno IN
SELECT Sno
FROM SC
WHERE Cno IN
(SELECT Cno
FROM Course
WHERE Cname=‘信息系统’)
;
Lu Wei
75
SELECT Sno, Sname
FROM Student, SC, Course
WHERE Student.Sno=SC.Sno AND
SC.Cno=Course.Cno AND
Course.Cname=‘信息系统’;
例37和例38中的各个子查询都只执行一次,其
结果用于父查询,子查询的查询条件不依赖于父
查询,这类子查询称为不相关子查询。不相关
子查询是最简单的一类子查询。
Lu Wei
76
二、带有比较运算符的子查询
带有比较运算符的子查询是指父查询与子查询之间用比
较运算符进行连接。
当用户能确切知道内层查询返回的是单值时,可以用>、
<、 =、 >=、<=、!=或<>等比较运算符。
SELECT Sno, Sname, Sdept
FROM Student
WHERE Sdept =
(SELECT Sdept
FROM Student
WHERE Sname=‘刘晨’);
需要注意的是,子查询一定要跟在比较符之后,下列写
法是错误的:
Lu Wei
77
SELECT Sno, Sname, Sdept
FROM Student
WHERE (SELECT Sdept
FROM Student
WHERE Sname='刘晨') = Sdept;
例38可以改写如下:
SELECT Sno, Sname
FROM Student
WHERE Sno IN
SELECT Sno
FROM SC
WHERE Cno =
SELECT Cno
FROM Course
WHERE Cname=‘信息系统’ ;
Lu Wei
78
三、带有ANY或ALL谓词的子查询
子查询返回单值时可以用比较运算符。而使用ANY或ALL
谓词时则必须同时使用比较运算符。其语义为:
> ANY 大于子查询结果中的某个值
< ANY 小于子查询结果中的某个值
>= ANY 大于等于子查询结果中的某个值
<= ANY 小于等于子查询结果中的某个值
<= ANY 小于等于子查询结果中的某个值
= ANY 等于子查询结果中的某个值
!= ANY或<> ANY 不等于子查询结果中的某个值
> ALL 大于子查询结果中的所有值
Lu Wei
79
< ALL 小于子查询结果中的所有值
>= ALL 大于等于子查询结果中的所有值
<= ALL 小于等于子查询结果中的所有值
<= ALL 小于等于子查询结果中的所有值
= ALL 等于子查询结果中的所有值(通常没有实
际意义)
!= ALL或<> ALL 不等于子查询结果中的任何
一个值
Lu Wei
80
例39 查询其他系中比信息系某一学生年龄小的学生姓名和
年龄,并按年龄降序排列
SELECT Sname, Sage
FROM Student
WHERE Sage<ANY (SELECT Sage
FROM Student
WHERE Sdept="IS" )
AND Sdept <> 'IS'
ORDER BY Sage DESC;
或者(下一页)
Lu Wei
81
SELECT Sname, Sage
FROM Student
WHERE Sage <
(SELECT MAX(Sage)
FROM Student
WHERE Sdept='IS')
AND Sdept <> 'IS'
ORDER BY Sage DESC;
用集函数实现子查询通常比直接用ANY或ALL查询
效率要高。
Lu Wei
82
例40查询其他系中比信息系所有学生年龄都小的
学生姓名和年龄,并按年龄降序排列
SELECT Sname, Sage
FROM Student
WHERE Sage<ALL (SELECT Sage
FROM Student
WHERE Sdept="IS" )
AND Sdept <> 'IS'
ORDER BY Sage DESC;
Lu Wei
83
或
SELECT Sname, Sage
FROM Student
WHERE Sage <
(SELECT MIN(Sage)
FROM Student
WHERE Sdept='IS')
AND Sdept <> 'IS'
ORDER BY Sage DESC;
Lu Wei
84
表3-4 ANY、ALL谓词与集函数及IN谓词的等价转
换关系
ANY
ALL
=
IN
--
<>或!=
-NOT IN
<
<MAX
<MIN
Lu Wei
<=
<=MAX
<=MIN
>
>MIN
>MAX
>=
>=MIN
>=MAX
85
四、带有EXISTS谓词的子查询
EXISTS代表存在量词彐。带有EXISTS谓词的子查询
不返回任何实际数据,它只产生逻辑真值"true"或逻辑假
值"false"。
例41 查询所有选修了1号课程的学生姓名
SELECT Sname
FROM Student
WHERE EXISTS
(SELECT *
FROM SC
WHERE Sno=Student.Sno AND Cno='1');
Lu Wei
86
相关子查询(Correlated Subquery)和不相关
子查询的求解过程
例42查询没有选修了1号课程的学生姓名
SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE Sno=Student.Sno AND Cno='1');
Lu Wei
87
一些带EXISTS或NOT EXISTS谓词的子查询不能被其
他形式的子查询等价替换,但所有带IN谓词、比较运算
符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子
查询等价替换。
例37可以用如下带EXISTS谓词的子查询替换:
SELECT Sno, Sname, Sdept
FROM Student S1
WHERE EXISTS
SELECT *
FROM Student S2
WHERE S2.Sdept=S1.Sdept AND
S2.Sname='刘晨';
Lu Wei
88
SQL语言中没有全称量词(For all)。因此必
须利用谓词演算将一个带有全称量词的谓词转换
为等价的带有存在量词的谓词:
(x)P  ┐(x(┐P))
Lu Wei
89
例43查询选修了全部课程的学生姓名
SELECT Sname
FROM Student S
WHERE NOT EXISTS
(SELECT *
FROM Course C
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE Sno=S.Sno AND
Cno=C.Cno);
Lu Wei
90
SQL语言中也没有蕴函(Implication)逻辑运
算。因此也必须利用谓词演算将一个逻辑蕴函的
谓词转换为等价的带有存在量词的谓词:
p  q  ┐p ∨ q
(y)pq  ┐(y(┐(Pq)))
 ┐(y(┐(┐P∨q))  ┐y(P∧┐q)
Lu Wei
91
例44 查询至少选修了学生95002选修的全部课程的学生号
码
SELECT DISTINCT Sno
FROM SC SCX
WHERE NOT EXISTS
(SELECT *
FROM SC SCY
WHERE SCY.Sno='95002' AND
NOT EXISTS
(SELECT *
FROM SC SCZ
WHERE SCZ.Sno=SCX.Sno
AND SCZ.Cno=SCY.Cno);
Lu Wei
92
4.集合查询
每一个SELECT语句都能获得一个或一组元组。若要把多
个SELECT语句的结果合并为一个结果,可用集合操作来完
成。集合操作主要包括并操作UNION、交操作
INTERSECT和差操作MINUS(或者EXCEPT)。
使用UNION将多个查询结果合并起来,形成一个完整的查
询结果时,系统会自动去掉重复的元组。需要注意的是,
参加UNION操作的各数据项数目必须相同;对应项的数据
类型也必须相同。(并不是目前说有关系数据库都支持这
三种操作)
Lu Wei
93
例45查询计算机科学系的学生及年龄不大于19岁
的学生
SELECT *
FROM Student
WHERE Sdept='CS'
UNION
SELECT *
FROM Student
WHERE Sage<=19;
Lu Wei
94
例46查询选修了课程1或者选修了课程2的学生
SELECT Sno
FROM SC
WHERE Cno='1'
UNION
SELECT Sno
FROM SC
WHERE Cno='2';
Lu Wei
95
例47 交集(intersect)
SELECT *
FROM Student
WHERE Sdept='CS' AND Sage<=19;
Lu Wei
96
例48查询选修课程1的学生集合与选修课程2的学生集合
的差集
SELECT Sno
FROM SC
WHERE Cno='1' AND
Sno NOT IN
(SELECT Sno
FROM SC
WHERE Cno='2');
例49查询计算机科学系的学生与年龄不大于19岁的学生
的差集
SELECT *
• FROM Student
WHERE Sdept='CS' AND Sage>19;
Lu Wei
97
第四节
数据更新
1.插入数据
2.修改数据
3.删除数据
Lu Wei
98
1.插入数据
一、插入单个元组
插入单个元组的INSERT语句的格式为:
INSERT
INTO <表名> [(<属性列1>[,<属性列2>...)]
VALUES (<常量1> [,<常量2>]...);
如果某些属性列在INTO子句中没有出现,则新记录在
这些列上将取空值。但必须注意的是,在表定义时说明
了NOT NULL的属性列不能取空值。否则会出错。
如果INTO子句中没有指明任何列名,则新插入的记录
必须在每个属性列上均有值。
Lu Wei
99
例1将一个新学生记录(学号:95020;姓名:陈冬;性别:
男;所在系:IS;年龄:18岁)插入Student表中
INSERT
INTO Student
VALUES ('95020', '陈冬', '男', 'IS', 18);
例2插入一条选课记录('95020','1')
INSERT
INTO SC(Sno, Cno)
VALUES ('95020', '1');
Lu Wei
100
二、插入子查询结果
插入子查询结果的INSERT语句的格式为:
INSERT
INTO <表名> [(<属性列1> [,<属性列
2>...)]
子查询;
其功能是以批量插入,一次将子查询的结果全部
插入指定表中。
Lu Wei
101
例3对每一个系,求学生的平均年龄,并把结果存
入数据库
CREATE TABLE Deptage
(Sdept CHAR(15),
Avgage SMALLINT);
INSERT
INTO Deptage(Sdept, Avgage)
SELECT Sdept, AVG(Sage)
FROM Student GROUP BY Sdept;
Lu Wei
102
2.修改数据
修改操作又称为更新操作,其语句的一般格式为:
UPDATE <表名>
SET <列名>=<表达式>[,<列名>=<表达式>]...
[WHERE <条件>];
其功能是修改指定表中满足WHERE子句条件的
元组。其中SET子句用于指定修改方法,即用<
表达式>的值取代相应的属性列值。如果省略
WHERE子句,则表示要修改表中的所有元组。
Lu Wei
103
一、修改某一个元组的值
例4将学生95001的年龄改为22岁
UPDATE Student
SET Sage=22
WHERE Sno='95001';
二、修改多个元组的值
例5将所有学生的年龄增加1岁
UPDATE Student
SET Sage=Sage+1;
Lu Wei
104
三、带子查询的修改语句
例6将计算机科学系全体学生的成绩置零
UPDATE SC
SET Grade=0
WHERE ‘CS’=
(SELECT Sdept
FROM Student
WHERE Student.Sno=SC.Sno);
Lu Wei
105
四、修改操作与数据库的一致性
UPDATE语句一次只能操作一个表。这会带来一
些问题。例如,学号为95007的学生因病休学一
年,复学后需要将其学号改为96089,由于
Student表和SC表都有关于95007的信息,因此
两个表都需要修改,这种修改只能通过两条
UPDATE语句进行。
Lu Wei
106
第一条UPDATE语句修改Student表:
UPDATE Student
SET Sno='96089'
WHERE Sno='95007';
第二条UPDATE语句修改SC表:
UPDATE SC
SET Sno='96089'
WHERE Sno='95007';
在执行了第一条UPDATE语句之后,数据库中的数据已
处于不一致状态,因为这时实际上已没有学号为95007
的学生了,但SC表中仍然记录着关于95007学生的选课
信息,即数据的参照完整性受到破坏。
Lu Wei
107
但如果执行完一条语句之后,机器突然出现故障,
无法再继续执行第二条UPDATE语句,则数据库中
的数据将永远处于不一致状态。
因此必须保证这两条UPDATE语句要么都做,要
么都不做。为解决这一问题,数据库系统通常都
引入了事务(Transaction)的概念,我们将在
后面详细介绍。
Lu Wei
108
3.删除数据
删除语句的一般格式为:
DELETE
FROM <表名>
[WHERE <条件>];
DELETE语句的功能是从指定表中删除满足
WHERE子句条件的所有元组。如果省略
WHERE子句,表示删除表中全部元组,但表的
定义仍在字典中。
Lu Wei
109
一、删除某一个元组的值
例7删除学号为95019的学生记录
DELETE
FROM Student
WHERE Sno='95019';
DELETE操作也是一次只能操作一个表,因此同样会遇到
UPDATE操作中提到的数据不一致问题。比如95019学
生被删除后,有关他的选课信息也应同时删除,而这必
须用一条独立的DELETE语句完成。
Lu Wei
110
二、删除多个元组的值
例8删除所有的学生选课记录
DELETE
FROM SC;
三、带子查询的删除语句
例9删除计算机科学系所有学生的选课记录
DELETE
FROM SC
WHERE 'CS'=
(SELETE Sdept
FROM Student
WHERE Student.Sno=SC.Sno);
Lu Wei
111
第五节
Lu Wei
视图
112
第五节
视图
1.定义视图
2.查询视图
3.更新视图
4.视图的特点
Lu Wei
113
1.定义视图
一、创建视图
SQL语言用CREATE VIEW命令建立视图,其一般
格式为:
CREATE VIEW <视图名>[(<列名>[,<列名>]...)]
AS <子查询>
[WITH CHECK OPTION];
Lu Wei
114
例1建立信息系学生的视图
CREATE VIEW IS_Student
AS
SELECT Sno, Sname, Sage
FROM Student
WHERE Sdept='IS';
例2建立信息系学生的视图,并要求进行修改和插入操作时
仍须保证该视图只有信息系的学生
CREATE VIEW IS_Student
AS
SELECT Sno, Sname, Sage
FROM Student
WHERE Sdept='IS'
Wei
115
WITH CHECK LuOPTION;
例3建立信息系选修了1号课程的学生的视图
CREATE VIEW IS_S1(Sno, Sname, Grade)
AS
SELECT Student.Sno, Sname, Grade
FROM Student, SC
WHERE Sdept='IS' AND
Student.Sno=SC.Sno AND
SC.Cno='1';
Lu Wei
116
例4建立信息系选修了1号课程且成绩在90分以上
的学生的视图
CREATE VIEW IS_S2
AS
SELECT Sno, Sname, Grade
FROM IS_S1
WHERE Grade>=90;
概念:
虚拟列
带表达式的视图
Lu Wei
117
例5定义一个反映学生出生年份的视图
CREATE VIEW BT_S(Sno, Sname, Sbirth)
AS SELECT Sno, Sname, 2004-Sage
FROM Student;
例6将学生的学号及他的平均成绩定义为一个视图
CREAT VIEW S_G(Sno, Gavg)
AS SELECT Sno, AVG(Grade)
FROM SC
GROUP BY Sno;
Lu Wei
118
例7将Student表中所有女生记录定义为一个视图
CREATE VIEW
F_Student(stdnum,name,sex,age,dept)
AS SELECT *
FROM Student
WHERE Ssex=‘女’;
基本表修改后视图的处理:重建
Lu Wei
119
二、删除视图
语句的格式为:
DROP VIEW <视图名>;
一个视图被删除后,由此视图导出的其他视图也将失效,
用户应该使用DROP VIEW语句将他们一一删除。
例8删除视图IS_S1
DROP VIEW IS_S1;
执行此语句后,IS_S1视图的定义将从数据字典中删除。
由IS_S1视图导出的IS_S2视图的定义虽仍在数据字典中,
但该视图已无法使用了,因此应该同时删除。
Lu Wei
120
2.查询视图
视图定义后,用户就可以象对基本表进行查询一样对视图
进行查询了。
DBMS执行对视图的查询时:
①首先进行有效性检查,检查查询涉及的表、视图等是否
在数据库中存在,
②如果存在,则从数据字典中取出查询涉及的视图的定义,
把定义中的子查询和用户对视图的查询结合起来,转换成
对基本表的查询,然后再执行这个经过修正的查询。
将对视图的查询转换为对基本表的查询的过程称为视图的
消解(View Resolution)。
Lu Wei
121
Oracle Server
USER_VIEWS
EMPVU80
SELECT employee_id,
last_name,
salary
FROM
employees
WHERE department_id=80;
iSQL*Plus
SELECT *
FROM empvu80;
EMPLOYEES
Lu Wei
122
例1在信息系学生的视图中找出年龄小于20岁的学生
SELECT Sno, Sage
FROM IS_Student
WHERE Sage<20;
DBMS执行此查询时,将其与IS_Student视图定义中的子
查询
SELECT Sno, Sname, Sage
FROM Student
WHERE Sdept="IS" ;
结合起来,转换成对基本表Student的查询,修正后的查
询语句为:
Lu Wei
123
SELECT Sno, Sage
FROM Student
WHERE Sdept="IS" AND Sage<20;
例2查询信息系选修了1号课程的学生
SELECT Sno, Sname
FROM IS_Student, SC
WHERE IS_Student.Sno=SC.Sno AND
SC.Cno='1';
Lu Wei
124
例3在S_G视图中查询平均成绩在90分以上的学生学号和
平均成绩
SELECT *
FROM S_G
WHERE Gavg>=90;
S_G视图定义为:
SELECT Sno, AVG(Grade)
FROM SC
GROUP BY Sno;
Lu Wei
125
SELECT Sno, AVG(Grade)
FROM SC
WHERE AVG(Grade)>=90
GROUP BY Sno;
SELECT Sno, AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=90;
Lu Wei
126
3.更新视图
更新视图包括插入(INSERT)、删除(DELETE)和修改
(UPDATE)三类操作。
由于视图是不实际存储数据的虚表,因此对视图的更新,
最终要转换为对基本表的更新。
为防止用户通过视图对数据进行增删改时,无意或故意操
作不属于视图范围内的基本表数据,可在定义视图时加上
WITH CHECK OPTION子句,这样在视图上增删改数据时,
DBMS会进一步检查视图定义中的条件,若不满足条件,
则拒绝执行该操作。
Lu Wei
127
例1将信息系学生视图IS_Student中学号为95002的学生姓
名改为“刘辰”
UPDATE IS_Student
SET Sname='刘辰'
WHERE Sno='95002';
DBMS执行此语句时,首先进行有效性检查,检查所涉及
的表、视图等是否在数据库中存在;如果存在,则从数
据字典中取出该语句涉及的视图的定义,把定义中的子
查询和用户对视图的更新操作结合起来,转换成对基本
表的更新,然后再执行这个经过修正的更新操作。
UPDATE Student
SET Sname='刘辰'
WHERE Sno='95002' AND Sdept='IS';
Lu Wei
128
例2向信息系学生视图IS_S中插入一个新的学生记录,其
中学号为95029,姓名为赵新,年龄为20岁
INSERT
INTO IS_Student
VALUES(‘95029’, ‘赵新’, 20);
INSERT
INTO Student(Sno,Sname,Sage,Sdept)
VALUES('95029', '赵新', 20, 'IS');
这里系统自动将系名'IS'放入VALUES子句中。
Lu Wei
129
例3删除计算机系学生视图CS_S中学号为95029的
记录
DELETE
FROM IS_Student
WHERE Sno='95029';
DELETE
FROM Student
WHERE Sno='95029' AND Sdept='IS';
Lu Wei
130
在关系数据库中,并不是所有的视图都是可更新的,
因为有些视图的更新不能唯一地有意义地转换成
对相应基本表的更新。
Lu Wei
131
4.视图的特点
1.视图能够简化用户的操作
2.视图使用户能以多种角度看待同一数据
3.视图对重构数据库提供了一定程度的逻辑独立性
4.视图能够对机密数据提供安全保护
Lu Wei
132
第六节
SQL的数据控制功能
1.数据控制简介
2.授权语句
3.收权语句
Lu Wei
133
1.数据控制简介
由DBMS提供统一的数据控制功能是数据库系统的
特点之一。数据控制亦称为数据保护,包括数据
的安全性控制(连接第九章 数据库安全性)、完
整性控制(连接第十章 数据库完整性)、并发控
制和恢复(连接第八章 并发控制)。这里主要介
绍SQL的数据控制功能。
SQL语言提供了数据控制功能,能够在一定程度
上保证数据库中数据的安全性、完整性,并提供
了一定的并发控制及恢复能力。
Lu Wei
134
SQL语言定义完整性约束条件的功能主要体现在CREATE
TABLE语句中,可以在该语句中定义码、取值唯一的列、
参照完整性及其他一些约束条件。我们前面已经介绍。
并发控制指的是当多个用户并发地对数据库进行操作时,
对他们加以控制、协调,以保证并发操作正确执行,并保
持数据库的一致性。
恢复指的是当发生各种类型的故障,使数据库处于不一致
状态时,将数据库恢复到一致状态的功能。SQL语言也提
供了并发控制及恢复的功能,支持事务、提交、回滚等概
念,SQL语言在这方面的能力我们在第八章中做进一步介
绍。
Lu Wei
135
数据库的安全性是指保护数据库,防止不合法的
使用所造成的数据泄露和破坏。
数据库系统中保证数据安全性的主要措施是进行
存取控制,即规定不同用户对于不同数据对象所
允许执行的操作,并控制各用户只能存取他有权
存取的数据。
不同的用户对不同的数据应具有何种操作权力,
是由DBA和表的建立者(即表的属主)根据具体
情况决定的,SQL语言则为DBA和表的属主定义与
回收这种权力提供了手段。
Lu Wei
136
2.授权语句
SQL语言用GRANT语句向用户授予操作权限,
GRANT语句的一般格式为:
GRANT <权限>[,<权限>]...
[ON <对象类型> <对象名>]
TO <用户>[,<用户>]...|PUBLIC
[WITH GRANT OPTION];
Lu Wei
137
例1把查询Student表权限授给用户U1
GRANT SELECT ON TABLE Student TO U1;
例2把对Student表和Course表的全部权限授予用户U2和
U3
GRANT ALL PRIVILIGES ON TABLE Student,
Course TO U2, U3;
例3把对表SC的查询权限授予所有用户
GRANT SELECT ON TABLE SC TO PUBLIC;
例4把查询Student表和修改学生学号的权限授给用户U4
GRANT UPDATE(Sno), SELECT ON TABLE
Student TO U4;
Lu Wei
138
例5把对表SC的INSERT权限授予U5用户,并允许他再将
此权限授予其他用户
GRANT INSERT ON TABLE SC TO U5 WITH GRANT
OPTION;
U5可以将此权限授予U6:
GRANT INSERT ON TABLE SC TO U6 WITH GRANT
OPTION;
同样,U6还可以将此权限授予U7:
GRANT INSERT ON TABLE SC TO U7;
因为U6未给U7传播的权限,因此U7不能再传播此权限。
例6DBA把在数据库S_C中建立表的权限授予用户U8
GRANT CREATETAB ON
Lu WeiDATABASE S_C TO U8; 139
3.收权语句
授予的权限可以由DBA或其他授权者用REVOKE语句收
回,REVOKE语句的一般格式为:
REVOKE <权限>[,<权限>]...
[ON <对象类型> <对象名>]
FROM <用户>[,<用户>]...;
例7把用户U4修改学生学号的权限收回
REVOKE UPDATE(Sno) ON TABLE Student FROM U4;
例8收回所有用户对表SC的查询权限
REVOKE SELECT ON TABLE SC FROM PUBLIC;
Lu Wei
140
例9把用户U5对SC表的INSERT权限收回
REVOKE INSERT ON TABLE SC FROM U5;
在例5中,U5又将对SC表的INSERT权限授予了U6,而
U6又将其授予了U7,执行此REVOKE语句后,DBMS
在收回U5对SC表的INSERT权限的同时,还会自动收回
U6和U7对SC表的INSERT权限,即收回权限的操作会
级联下去的。
但如果U6或U7还从其他用户处获得对SC表的INSERT权
限,则他们仍具有此权限,系统只收回直接或间接从U5
处获得的权限。
Lu Wei
141
第七节
事务
transaction is a sequence of database statements
that needs to execute atomically .
A database transaction consists of
one of the following:
 DML statements which constitute one
consistent change to the data
 One DDL statement
 One DCL statement
We will discuss it in detail
latter.
Lu Wei
142