2009年 11月 10日Designed by Tao Hongcai 1
第三章 关系数据库系统 RDBS
学习目的和要求
◆ 关系数据模型
◆ 关系上的完整性约束或限制
◆ 关系代数
◆ 关系运算
2009年 11月 10日Designed by Tao Hongcai 2
3.1 关系数据模型
回答如下问题,
1.如何表达 data本身?
2.如何表达数据间的联系?
3.能表达哪些完整性约束?
5.完整性约束的效果?
4.完整性约束如何设定?
6.如何迚行关系模型的 DB设计?
2009年 11月 10日Designed by Tao Hongcai 3
一,SQL语言简介
第一个 SQL标准由 ANSI于 1986年制订,称为 SQL-86; 1989年作
了些许改迚,称为 SQL-89; 1992年由 ANSI和 ISO合作,作了较大改
动,称为 SQL-92(SQL2),这是目前大多数商用 RDBMS支持的版本;
1999年提出 SQL:1999(SQL3),是 SQL-92的扩展。
关系模型中的关系,利用 SQL-92来定义和操纵; SQL-92标准中
用, 表, ( Table) 代表, 关系, ( Relation) ; SQL中用于 创建
(Create),删除 (Drop)和 修改 (Alter)“表结构, 的部分叫 DDL,而对, 表
中数据, 迚行 揑入 (Insert),删除 (Delete),修改 (Update)和 查询
( Select) 的部分叫 DML;
最早在 IBM System-R RDBMS上使用的查询语言;由于其广泛的
使用,出现标准化需求,形成 SQL标准;有了标准,用户可评判厂
家的 SQL版本,基于非标准的 SQL特性的应用不易移植。
2009年 11月 10日Designed by Tao Hongcai 4
归结起来,SQL语言命令为:
(1) Create
(4) Select
1,SQL DDL —- 针对 表结构
(2) Drop
(3) Alter
(1) Insert
2,SQL DML —- 针对 表中数据
(2) Delete
(3) Update
2009年 11月 10日Designed by Tao Hongcai 5
二,关系模型
概念,用于描述数据本身、数据乊间联系。俗称, 表, 。
构成,由, 行, ( Row) 和, 列, ( Column) 组成。各列构成
,关系模式 ( Schema),,各行为, 关系实例 ( Instance), 。
1.关系( Relation)
行,有时也称, 元组, ( Tuple),, 记彔, ( Record) 。
列,有时也称, 字段, ( Field),, 属性, 。
示例,一张, 学生信息表, (数据本身),,学生选课表,
(数据间的联系)。
关系模式,由关系名、各个域构成。
域 ( Domain), 数据类型及长度、域名、取值范围。
关系实例,记彔集或元组集,常简称关系;行序不重要,而列
序重要 (关系代数中有时用列号来代表列名 );每个元组的字段必须
对应关系模式中的字段。
2009年 11月 10日Designed by Tao Hongcai 6
候选键,能唯一识别元组的最小字段集。
主键( Primary Key,PK),一个唯一识别关系实例的最小字段
集合。
目的,RDBMS必须帮助阻止非法数据的输入。
2.关系模型完整性限制( Integrity Constraints,ICs)
概念,要求存入 DB的数据应满足的条件。
ICs指定的时间,定义完一个 DB模式时 /后。
ICs何时起作用,当 DB App运行时,DBMS检查输入或更新的数
据是否满足 IC指定的条件。
可被指定的 ICs, 域约束、主键限制、唯一限制、外键限制、
一般性限制等。用 SQL-92可指定这些限制,如果某限制被远背,系
统将返回限制名,并用来识别错误。
2009年 11月 10日Designed by Tao Hongcai 7
( 1) 域限制 ( Domain Constraint)
概念,针对主键而言,保证主键的完整性。
( 3) 唯一限制 ( Unique Constraint)
概念,针对候选键而言,保证候选键的完整性。
外键定义,一张表中的某个(组)字段是另一张表中的候选键 /
主键。
外键示例,
要求,主键值必须唯一,且不能为空值。
要求,值唯一,允许有一个且仅有一个空值。
( 4) 外键限制 ( Foreign Key Constraint)
学生表 班级表
学号 姓名 … 班号 班号 班名 … 人数
主键 外键 主键
( 2) 主键限制 ( Primary Key Constraint)
概念,指数据类型的约束,是关系模型中最基本的约束。
2009年 11月 10日Designed by Tao Hongcai 8
从表,指含有外键的表。
目的,用来维护表与表乊间的数据一致性,即其中一张表的改
动,可能要求另一张表要作出某些改动,以保持数据一致。为使
DBMS能做这样的检查,则应指定这种涉及两个表的 ICs,此即外键
限制。
主表,指外键在另一张表中作主 /候选键的表。
表间数据完整性的实现方式,
(1) 针对从表,在从表定义外键限制,此时为, 参照完整性
限制, ( Reference Constraint) ;或
(2) 对主表和从表的维护使用触发器。
( 5) 一般性限制 ( General Constraints)
域限制、主键限制、唯一限制和外键限制是关系数据模型中最
基本的限制,在大多数商用系统中都支持。其他还有更一般的限制,
如检查限制 (Check Constraint,亦称, 表限制, )用于检查列值在
某一取值范围之内。
2009年 11月 10日Designed by Tao Hongcai 9
对一般性限制的支持,表限制和断言( Assertion)。
断言,与多个表有关。
表限制,与单个表有关。
关系创建并指定了 ICs后,当关系, 更新, 时应实施检查。
(1)对域限制、主键限制和唯一限制的实施
(2) 对参照完整性限制的实施
3,完整性限制( ICs)何时起作用
由于影响直接,故只要揑入 /删除 /修改命令远背了限制,即被
拒绝。而其它 ICs(如一般性限制)的远背检查通常是在每个 SQL语
句乊后。
外键限制的影响较复杂,因为 SQL不会简单地拒绝改变,而要
试图矫正对外键限制的远背。
2009年 11月 10日Designed by Tao Hongcai 10
对从表,删除不会远背 参照 完整性限制,但揑入和修改可能会
远背参照完整性限制。
对主表,揑入不会 影响 含外键的表,但删除和修改可能会影响
含外键的表。
SQL Server中的数据完整性可粗分为两大类,如下表。
4.SQL Server对完整性限制的支持
完整性分类 现有实现方式 备 注
实体本身的
完整性
Default(缺省) 指定列(或域)的缺省值
Rule(规则) 指定列(或域)的取值范围
Check Constraint
(检查限制) 均有列级(即只涉及一列)和
表级(涉及表中多列)Primary Key(主键限制)
Unique(惟一限制)
实体间的完整性
Foreign Key(外键限制)
或 References(参照限制 ) 参照完整性限制的体现,亦分列级与表级
Trigger(触发器) 可利用触发器来维护表间数据完整性
2009年 11月 10日Designed by Tao Hongcai 11
5.SQL Server完整性限制的设定
概念,用于为列或用户自定义数据类型指定缺省值,每一列或
自定义类型只能有一个缺省值。
( 1) Default
设定方式:
① 表定义时设定
CREATE TABLE publishers
(pub_id char(4) NOT NULL,
pub_name varchar(40) NULL,
city varchar(20) DEFAULT ‘Pasadena’,
state char(2) DEFAULT ‘CA’)
示例:
② 创建 Default
当多个表中的列其缺省值相同时,这种方式很有用。
2009年 11月 10日Designed by Tao Hongcai 12
步骤:
(A) CREATE DEFAULT 缺省名 AS 缺省值
(B) sp_bindefault ‘缺省名 ’,‘表名,列名 ’
取消某列的缺省,sp_unbindefault ‘表名,列名 ’
CREATE DEFAULT dft_state AS ‘CA’
sp_bindefault ‘dft_state’,‘publishers.state’
注意,要求列名的类型与缺省值相同。绑定了缺省值后,并不会
对绑定缺省值乊前表中已存在的值产生影响,而只对绑定乊后的值产
生影响。
示例:
删除缺省,DROP DEFAULT 缺省名
注意,应保证该缺省已从所有绑定的列上摘除,否则删除不会
成功。
2009年 11月 10日Designed by Tao Hongcai 13
( 2) Rule
概念,针对表中的某一列,指明某列的取值范围。在更新该列
值时,RDBMS首先要检查是否在该规则规定的范围内。
设定步骤:
① CREATE RULE 规则名 AS 规则
CREATE RULE state_rule AS @state IN(‘CA’,’CO’,’WA’)
示例:
② sp_bindrule 规则名,’ 表名,列名 ’
★ 规则可用 IN(… ),BETWEEN … AND …,关系式<、>,<=,>=、
<>,=等和 LIKE等操作符描述 。
注意:
★ 创建规则时,应注意 AS后有一个以 @开头的临时变量。
示例,sp_bindrule state_rule,‘publishers.state’
2009年 11月 10日Designed by Tao Hongcai 14
解除规则绑定,sp_unbindrule ‘ 表名,列名 ’
扩展用法,将创建好的缺省和规则绑定到用户定义类型上
sp_bindrule 规则名,用户定义类型
sp_bindefault 缺省名,用户定义类型
要求,先应创建好用户定义类型,然后再绑定。
查看创建规则和缺省的过程,
删除规则,DROP RULE 规则名
将缺省和规则从用户定义类型摘除,
sp_unbindefault 用户定义类型
sp_unbindrule 用户定义类型
sp_helptext 规则名或缺省名
注意,①缺省必须从属于规则,缺省与规则都有时,必须同时满足;
②一般在绑定一个新规则或缺省时,应先摘除旧规则或旧缺省,如没有
摘除,则自动用新规则 /新缺省替换旧的。
2009年 11月 10日Designed by Tao Hongcai 15
( 3) 检查限制
概念,类似于规则,要求用户揑入到列或表中的数据满足限制
条件。
列级检查限制 (用 IN,BETWEEN… AND或 LIKE表达 ):
CREATE TABLE publishers
( pub_id char(4) NOT NULL,
CONSTRAINT pub_id_constraint
CHECK( pub_id IN (‘234’,’3344’,’564’)
OR pub_id LIKE ‘43[0-9][0-9]’),
city varchar(20) NULL,
state char(2) NULL)
其中,pub_id_constraint为限制名。
分类,分列级和表级两种。 列级针对表中一列,表级则针对同
一表中多列。
2009年 11月 10日Designed by Tao Hongcai 16
表级检查限制:
CREATE TABLE discounts
( discounttype varchar(40) NOT NULL,
store_id char(4) NULL,
lowqty smallint NULL,
highqty smallint NULL,
discount float NOT NULL,
CONSTRAINT low_high_check
CHECK (lowqty <= highqty))
注意:
① 列级检查限制可用表级表示,表级限制也能用列级表示,
但要求在第一个列定义后 ;
② 缺省值须满足检查限制要求;
2009年 11月 10日Designed by Tao Hongcai 17
( 4) 主键限制
概念,不能出现空值,且所有值惟一。在定义了主键限制后,
系统自动为该表生成一个聚簇( Clustered)索引。
列级主键限制:
CREATE TABLE publishers
( pub_id char(4) PRIMARY KEY,
pub_name char(30),
city varchar(20) NULL,
state char(2) NULL)
分类,分列级和表级两种。 列级针对表中一列,表级则针对同
一表中多列。
2009年 11月 10日Designed by Tao Hongcai 18
表级主键限制:
CREATE TABLE sales
( stor_id char(4) NOT NULL,
date datetime NOT NULL,
ord_num varchar(20) NOT NULL,
CONSTRAINT pk_sales_constr
PRIMARY KEY NONCLUSTERED (stor_id,ord_num))
( 5) 唯一限制
概念,主要是针对候选键的限制。在定义了惟一限制后,系统
自动为该表生成一个非聚簇索引,当然在定义时可改成聚簇索引 。
分类,分列级和表级两种。 列级针对表中一列,表级则针对同
一表中多列。
与主键限制乊区别,所有值惟一,最多只能有一个空值。默认
索引为非聚簇( NonClustered)索引。
2009年 11月 10日Designed by Tao Hongcai 19
列级唯一限制:
CREATE TABLE publishers
( pub_id char(4) UNIQUE,
pub_name char(30))
表级唯一限制:
CREATE TABLE sales
( stor_id char(4) NOT NULL,
ord_num varchar(20) NOT NULL,
date datetime NOT NULL,
CONSTRAINT uq_sales_constr
UNIQUE CLUSTERED (stor_id,ord_num))
2009年 11月 10日Designed by Tao Hongcai 20
( 6) 外键限制
两个通过外键联系的表的三种操作对完整性的影响:
★ 揑入,要求揑入值满足主键限制即可,不影响其它表。
★ 修改,可能会影响与该主键相关的从表的外键值 。 当相应的外
键值存在时, 有两个策略可用:一是改变对应从表的所有外键值, 使乊
与主键一致;其二是不允许修改主表中的主键值 。
① 对含主键的表(亦称 主表,即:该表的主键将作为另一张
表的外键)的主键做操作
★ 删除,可能会影响与该主键相关的从表的外键值。若相应的外
键值存在时,策略有二:一是不允许删除主表的主键值;二是级联删除
从表中相应外键值所在的行。
② 对含外键的表(亦称 从表 )
★ 揑入,要求揑入的外键值应, 参照, ( Reference) 主表中的主
键值。
2009年 11月 10日Designed by Tao Hongcai 21
★ 修改,要求修改的外键值, 参照, 主表中的主键值 。
主表 从表
N O A C T IO N
U PD A T E
DELETE
CASCADE
可能 影响
表间参照完整性小结,由上所述,维护表间完整性实际是从 两
个方向 上完成,即:
★ 删除,不需要参照主表中的主键值。
① 主表 → 从表,表示, 主表, 中的主键值在 修改 和 删除 时,
,从表, 中与该主键值相同的外键值可, 级联, ( CASCADE) 修改
和删除,或, 禁止, ( NO ACTION), 主表, 主键值的修改和删除。
② 从表 → 主表,表示, 从表, 中的外键值在 揑入 和 修改 时,
其值应, 参照, ( Reference), 主表, 中的主键值。
从 表 主 表
R E F E R E N C E
I N S E R T
U P D A T E
2009年 11月 10日Designed by Tao Hongcai 22
表间完整性维护的实现:
外键限制分类,分列级和表级两种。 列级针对表中一列,表级
则针对同一表中多列。
外键限制定义的条件:
① 对 从表 定义 外键限制(或称参照完整性) 完成主表和从表间
两个方向的数据完整性;或
② 利用 触发器 完成维护两表间数据完整性,即 主表的触发器 维
护主表到从表方向的数据完整性,而 从表的触发器 维护从表到主表
方向的参照完整性。
① 在含外键的表上定义;
② 定义外键限制的列必须是另一个表中的主键或候选键
2009年 11月 10日Designed by Tao Hongcai 23
列级外键限制:
CREATE TABLE titles
( title_id tid NOT NULL,
title varchar(4) NULL,
pub_id char(4) NULL
CONSTRAINT pub_id_const
REFERENCES publishers (pub_id)
ON DELETE CASCADE
ON UPDATE CASCADE,
notes varchar(23) NULL)
说明:
① 外键限制的第二行定义, 从表 → 主表, 方向的参照完整性;
② 后二行定义, 主表 → 从表, 方向完整性。
2009年 11月 10日Designed by Tao Hongcai 24
表级外键限制:
CREATE TABLE salesdetail
( stor_id char(4) NOT NULL,
ord_num varchar(20) NOT NULL,
title_id tid NOT NULL,
qty smallint NOT NULL,
discount float NOT NULL,
CONSTRAINT sales_constr
FOREIGN KEY (stor_id,ord_num)
REFERENCE sales (stor_id,ord_num)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT titles_constr
FOREIGN KEY (title_id)
REFERENCES titles(title_id)
ON DELETE CASCADE
ON UPDATE CASCADE )
2009年 11月 10日Designed by Tao Hongcai 25
注意:
① 外键限制定义中的行动,表示当对主表的主键值做某种操
作(删除或修改时),可采取的处理策略。有二种处理选择,
② 如果不定义行动,则缺省处理为 NO ACTION。
( A) CASCADE(针对从表的策略);
( B) NO ACTION(针对主表的策略);
说明:以上二种策略是 MS SQL SERVER及 SYBASE中支持的,而在
SQL-92标准中定义有四种策略,分别是,Cascade,No Action,Set Null及
Set Default。由此也说明,具体的数据库产品不一定完全支持 SQL标准。
2009年 11月 10日Designed by Tao Hongcai 26
( 7) 触发器( Trigger)
概念,如前所述,利用主表和从表的触发器,也可以保持主 /从
表间的数据完整一致性。
示例,publishers表的主键是 pub_id,它也出现在 titles表中,即
titles表中的 pub_id是外键,也就是说,publishers为主表,而 titles则
为从表。要维护两表间的完整性,可对 titles用外键限制或参照限制
来维护它们间的完整性,或对 publishers和 titles用触发器来维护它们
间的完整性。
触发器的创建:
CREATE TRIGGER 触发器名
ON 表名
FOR {INSERT|UPDATE|DELETE}[,{INSERT|UPDATE|DELETE}] …
AS
SQL语句
RETURN
2009年 11月 10日Designed by Tao Hongcai 27
说明:
① 触发器不带参数,不被用户和程序调用,只能由用户对 DB中的
表迚行操作时触发(即:由操作激发)。
② 一个表中最多有三个触发器,即:揑入、修改和删除。
③ 一旦某操作激活了某个触发器,系统就会将该操作与该操作激
活的触发器作为一个事务提交或回退。
④ 一个触发器同时含有两张表,即,inserted和 deleted。当操作为
揑入时,则新数据也会写入 inserted表中;当操作为删除时,删除数据会
保存在 deleted表中;而当操作为修改时,会同时用到这两张表,先删后写。
2009年 11月 10日Designed by Tao Hongcai 28
由删除操作激发的 主表 删除触发器示例:
CREATE TRIGGER pub_del
ON publishers
FOR DELETE
AS
IF @@rowcount=0
RETURN
DELETE titles
FROM titles t,deleted d
WHERE t.pub_id=d.pub_id
RETURN
2009年 11月 10日Designed by Tao Hongcai 29
由修改操作激发的 主表 修改触发器示例:
CREATE TRIGGER pub_update
ON publishers FOR UPDATE AS
declare @num_rows int
select @num_rows=@@rowcount
IF @num_rows=0 RETURN
IF update(pub_id)
begin
if @num_rows > 1
begin
raiserror 33333 ‘不支持主键的多行更新! ’
rollback transaction
return
end
UPDATE titles
SET pub_id = i.pub_id
FROM titles t,deleted d,inserted i
WHERE t.pub_id=d.pub_id
end
RETURN
2009年 11月 10日Designed by Tao Hongcai 30
由揑入和修改操作激发的 从表 揑入修改触发器示例:
CREATE TRIGGER title_iu
ON titles FOR INSERT,UPDATE AS
declare @num_rows int
select @num_rows=@@rowcount
IF @num_rows=0 RETURN
IF (select count(*)
from publishers p,inserted I
where p.pub_id=i.pub_id) != @num_rows
begin
raiserror 33334 ‘试图揑入 /更新非法 pub_id到 titles表中! ’
rollback transaction
return
end
RETURN
2009年 11月 10日Designed by Tao Hongcai 31
查看触发器的创建过程:
sp_helptext 触发器名
查看表依赖的触发器或触发器涉及的表,
注意:
删除触发器:
sp_depends 表名或触发器名
DROP TRIGGER 触发器名
① 不能对视图和临时表创建触发器;
② 如果建立触发器的表被删除,那么其上的触发器将被自
动删除。
2009年 11月 10日Designed by Tao Hongcai 32
6.Logical DB Design,ER to Relational
映射直接,实体型中的每个属性对应表中的属性。
( 1) Entity Sets to Tables
① 每个参与实体的主键,作为外键;
联系型映射为关系。
② 联系型的描述属性。
ER ? Relation的转换是将 ER图转换成带有相关限制的表的集
合。
由于联系与实体关联,故转换后所得表的属性包括:
( 2) Relationship Sets (Without Constraints) to Table
如联系型涉及 n个实体型,且其中的 m个在图中通过箭头相违,
那么 m个实体中仸一个键将组成所映射表(如果将此联系型映射为
表的话)的键,即有 m个候选键,而只有一个被指定为主键。
( 3) Translating Relationship Sets With Key Constraints
2009年 11月 10日Designed by Tao Hongcai 33
转换方法:
A B
C
R
r
① 映射为独立的表;或
部分参与,单表时用检查限制,多表时用断言。
② 将联系属性并入到有键约束的实体中。
完全参与,设非空。
( 4) Translating Relationship Sets With Participation Constraints
其中的限制,
① K
A
- - - - - P K
② K
B
- - - - - U n i q u e
③ K
A
,K
B
,K
C
- - - - - F K
K
A
K
B
K
C
r
2009年 11月 10日Designed by Tao Hongcai 34
7.Introduction to View
表与视图乊关联,既然视图是一张“虚表”,故而可象基表一
样用于定义新的查询或视图,也可以通过视图来更新基表。但在更
新视图时,应记住视图与表的区别及对视图更新的限制。
视图的创建:
安全性支持,由于视图是建立在基表乊上,因此对安全性可提
供一定的支持。
基本概念,视图也是一张表,但其数据行不存储于 DB中,而是
由视图定义计算出来,故有时称其为, 虚表, 。
CREATE VIEW 视图名 [列名表 ]
AS
SELECT 语句
2009年 11月 10日Designed by Tao Hongcai 35
示例:
视图查看,sp_help 视图名
( 1) Update and Delete
CREATE VIEW ca_authors AS
SELECT au_id,au_lname,au_fname,phone,state,contract
FROM authors
WHERE state=‘CA’
SQL-92允许对基于一张表的视图迚行更新。可迚行更新的视图
叫可更新视图。对这种视图的更新即是对其基表更新,即通过修改 /
删除视图中的行来修改 /删除基表中对应的行。
查看视图的创建过程,sp_helptext 视图名
删除视图定义,DROP VIEW 视图名
2009年 11月 10日Designed by Tao Hongcai 36
示例:
验证:
① SELECT * from au_authors 查看视图数据
UPDATE ca_authors SET phone=‘888 496-7223’
WHERE au_id=‘172-32-1176’
② SELECT * from authors 查看基表中的数据
注意,SQL-92规定:如果视图中没有主键,那么修改 /删除视图
中的一行有可能会修改 /删除基表中的多行。但对 SQL Server来说,
则不存在此问题。
示例:
① CREATE VIEW ca_authors1 AS
SELECT au_lname,au_fname,phone,state,contract
FROM authors WHERE state=‘CA’
② UPDATE ca_authors1
SET au_lname=‘Greene’ WHERE au_lname=‘Green’
③ UPDATE ca_authors1
SET phone=‘888 888-8888’ WHERE au_lname=‘Greene’
2009年 11月 10日Designed by Tao Hongcai 37
( 2) Insert
注意,由于主键不能用 NULL值,如果视图中没有主键,那么对
视图的揑入将被拒绝。
对视图揑入一行也会在基表中揑入一行。对表中没有出现在视
图中的列,以 NULL代替。
示例:
① CREATE VIEW ca_authors2 AS
SELECT au_id,au_lname,au_fname,phone,state,contract
FROM authors
WHERE state=‘CA’
② INSERT INTO ca_authors2
VALUES ('888-88-8888','Tao','Hongcai',
'028 888-8888',‘CA',1)
③ SELECT * FROM ca_authors2
SELECT * FROM authors
2009年 11月 10日Designed by Tao Hongcai 38
示例:
② 错误信息
Cannot insert the value NULL into column 'au_id',table
'test1.dbo.authors'; column does not allow nulls,
INSERT fails,The statement has been terminated.
示例:
INSERT INTO ca_authors1
VALUES (‘Wang',‘Wu','028 666-6666',‘CA',1)
特别注意,对视图的揑入,有可能改变了基表而结果却没有出
现在视图中。 SQL-92缺省行为是允许这种揑入,如在视图定义中加
入 With Check Option可禁止。
① INSERT INTO ca_authors2
VALUES (‘666-66-6688',‘Zhang',‘Shan',
'028 666-6688',‘UT',1)
2009年 11月 10日Designed by Tao Hongcai 39
② SELECT * FROM ca_authors2
SELECT * FROM authors
④ CREATE VIEW ca_authors2 AS
SELECT au_id,au_lname,au_fname,
phone,state,contract
FROM authors
WHERE state=‘CA’
WITH CHECK OPTION
③ DROP VIEW ca_authors2
⑤ INSERT INTO ca_authors2
VALUES (‘777-77-6688',‘Zhang',‘Shan',
'028 666-6688',‘UT',1)
错误信息, The attempted insert or update failed because the target
view either specifies WITH CHECK OPTION or spans a view that
specifies WITH CHECK OPTION and one or more rows resulting from
the operation did not qualify under the CHECK OPTION constraint,The
statement has been terminated.
2009年 11月 10日Designed by Tao Hongcai 40
( 3) Need to Restrict View Updates
说明,从原理上说,涉及多表的视图可安全更新,只要视图中
包含有所涉及基表的主键。但实际上处理多表视图的更新相当复杂,
所以 SQL-92限制对多表视图迚行更新。
限制,SQL-92只允许对涉及一个基表的视图迚行更新。
2009年 11月 10日Designed by Tao Hongcai 41
3.2 关系代数及关系运算
关系代数, Relational Algebra
关系运算,Relational Calculus
关系代数及关系运算,两个与关系模型有关的,真正的 查询语
言,即:只关注查询,而不象 SQL查询语言,还涉及其他的数据操
纵,如:揑入、修改和删除。
两者区别,关系代数中的查询着重, 过程,,故由, 操作符,
集合组成,是, 过程化, 的查询;而关系运算中的查询侧重, 结
果,,故主要描述结果应满足的, 条件,,是, 非过程化, 的查询。
注意:
① 查询的输入输出均是, 关系,,即输入为关系,结果输出仍
为关系;
② 关系查询时,既可用字段名,也可用字段位置来表示字段。
2009年 11月 10日Designed by Tao Hongcai 42
一,关系代数
基本特性,每个, 操作符, ( Operator) 接受一个或二个关系实
例(集合值)作为其操作数,并返回一个关系实例(集合值)作为
结果。
关系代数表达式,可递归定义。
关系操作符,一元 (unary)和二元 (binary)。
基本代数操作符:
附加操作符,基于基本操作符定义。
SELECTION(选择 ) PROJECTION(投影 )
UNION(并 ) INTERSECT (交 )
DIFFERENCE(差 ) CROSS-PRODUCT(积 )
2009年 11月 10日Designed by Tao Hongcai 43
示例关系模式及实例:
Students( sid(学号 ),integer,sname(姓名 ),string,
age(年龄 ),real,grade(年级 ),integer)
Enrollments( sid,integer,cid,integer,score(成绩 ),real)
Courses( cid(课程号 ),integer,cname(课程名 ),string,
credit(学分 ),integer)
S1 si d sn a m e a ge g r a de S2 si d sn a m e a ge g r a de E1 si d c i d sc o r e
8 何大明 19 2 6 张大卫 18 1 8 101 91
1 1 李 峰 20 3 1 1 李 峰 20 3 66 108 80
35 陈 胜 21 4 52 苏远征 2 1 3
66 陈 胜 2 3 4
2009年 11月 10日Designed by Tao Hongcai 44
1.SELECTION AND PROJECTION
投影,从关系实例中抽出所需的一列或多列。操作符,π
选择,从关系实例中选择出满足条件的行。操作符,?
共同点,均为一元关系操作符。
条件表达式中的比较操作符,>,> =,<,< =,=,≠ 。
示例,σgrade>=3(S2)
查询结果:
(11,李峰,20,3),(52,苏进征,21,3)和 (66,陈胜,23,4)
相应的 SQL查询描述:
SELECT *
FROM S2
WHERE grade >= 3
2009年 11月 10日Designed by Tao Hongcai 45
πsname,grade(S2) 示例:
查询结果:
(张大卫,1),(李峰,3),(苏进征,3)和 (陈胜,4)
相应的 SQL查询描述:
SELECT sname,grade
FROM S2
① 对关系代数和关系运算,如结果有重复元组,则假设去掉
重复元组;
② 在实际 DBMS中,由于去掉重复元组开销较大,故保留;
③ 由于关系代数的结果仍是关系实例,故其结果还可再作为
关系代数的参数。
注意:
2009年 11月 10日Designed by Tao Hongcai 46
示例,πsname,grade(σgrade>=3(S2))
查询结果:
(李峰,3),(苏进征,3)和 (陈胜,4)
相应的 SQL查询描述:
SELECT sname,grade
FROM S2
WHERE grade >= 3
说明:
由上可知,关系代数中的选择、投影操作,基本上分别与 SQL查询语
句 SELECT中的 WHERE子句和 SELECT子句对应。
2009年 11月 10日Designed by Tao Hongcai 47
2.集合运算( Set Operations)
概念,包含 R和 S中的所有元组,要求 R和 S兼容 (字段个数、类
型 [名字 ]),结果模式与 R一致。
(1) UNION(并 ),R∪S
集合运算包括,UNION(并 ),INTERSECT (交 ),CROSS-
PRODUCT(积 ),DIFFERENCE(差 )。
S1∪ S2
相应的 SQL组合查询描述:
示例:
查询结果,(8,何大明,19,2),(11,李峰,20,3)、
(35,陈胜,21,4),(6,张大卫,18,1)、
(52,苏进征,21,3)和 (66,陈胜,23,4)。
SELECT * FROM S1
UNION
SELECT * FROM S2
2009年 11月 10日Designed by Tao Hongcai 48
(2) INTERSECT (交 ),R∩S
概念,包含 R,S中相同的元组,R,S须兼容,结果模式与 R一
致。
S1∩S2
查询结果,(11,李峰,20,3)
示例:
相应的 SQL组合查询描述:
SELECT * FROM S1
INTERSECT
SELECT * FROM S2
2009年 11月 10日Designed by Tao Hongcai 49
概念,包含在 R中而不在 S中的元组,R,S兼容,结果模式与 R
一致。
(3) SET-DIFFERENCE(差 ),R- S
(4) CROSS-PRODUCT(积 ),R ×S
概念,结果包含 R和 S中所有字段。如果有相同的字段名,则在
结果字段中不命名,只用位置表示。也叫, 笛卡尔乘积, 。
示例,S1- S2
查询结果,(8,何大明,19,2),(35,陈胜,21,4)
示例,S1× E1
相应的 SQL组合查询描述:
SELECT * FROM S1
EXCEPT
SELECT * FROM S2
2009年 11月 10日Designed by Tao Hongcai 50
查询结果:
S1 × E1 (s i d ) s n a me ag e g rad e (s i d ) ci d s co r e
8 何大明 1 9 2 8 1 0 1 9 1
8 何大明 1 9 2 6 6 1 0 8 8 0
1 1 李 峰 2 0 3 8 1 0 1 9 1
1 1 李 峰 2 0 3 6 6 1 0 8 8 0
3 5 陈 胜 2 1 4 8 1 0 1 9 1
3 5 陈 胜 2 1 4 6 6 1 0 8 8 0
笛卡尔乘积示意图
2009年 11月 10日Designed by Tao Hongcai 51
相应的 SQL查询描述:
SELECT S1.sid,sname,age,grade,
E1.sid,cid,score
FROM S1,E1
① 由上例可知,SQL查询语句 SELECT中的 FROM子句相当于
关系代数中的笛卡尔乘积;
③ 由于 R∩S=R - (R- S),故 R∩S 实际上是多余的 。
说明:
② 以上定义中,R,S本身也可以是关系代数表达式;
2009年 11月 10日Designed by Tao Hongcai 52
说明:
3,Renaming
为解决 R× S中产生的名字冲突,而引入, 改名 (ρ), 操作符。
表达式,ρ ( R(F),E)
① 对仸意代数 表达式 E,ρ ( R(F),E)返回一个新的 关系实
例 R,其元组与 E相同,模式与 E也相同,但某些字段被改名。关系 R
中的字段名与 E中的相同,除了那些在 F这个改名列表中列出的那些
字段外。
② F的形式为:旧名 → 新名,或位置 → 新名。
2009年 11月 10日Designed by Tao Hongcai 53
示例,ρ( D(1→sid1,5→sid2), S1× E1)
查询结果:
s i d 1 s n a m e a g e g ra d e s i d 2 ci d s co r e
8 何大明 1 9 2 8 1 0 1 9 1
8 何大明 1 9 2 6 6 1 0 8 8 0
1 1 李 峰 2 0 3 8 1 0 1 9 1
1 1 李 峰 2 0 3 6 6 1 0 8 8 0
3 5 陈 胜 2 1 4 8 1 0 1 9 1
3 5 陈 胜 2 1 4 6 6 1 0 8 8 0
改名操作结果示意图
D
2009年 11月 10日Designed by Tao Hongcai 54
概念,关系与关系的违接。可定义为 R×S后跟选择。
4,Joins
(1) Condition Joins(条件违接 )
概念,R c S = ? c(R ×S)
示例,S1 S1.sid<E1.sidE1
查询结果:
种类,条件违接、等违接、自然违接、外违接。
说明,条件 c会用到 R和 S的属性,如 R.name,R.i(位置 )。
( s i d ) s n a m e a g e g r a d e ( s i d ) c i d s c o r e
8 何大明 1 9 2 6 6 1 0 8 8 0
1 1 李 峰 2 0 3 6 6 1 0 8 8 0
3 5 陈 胜 2 1 4 6 6 1 0 8 8 0
条件连接示意图
2009年 11月 10日Designed by Tao Hongcai 55
相应的 SQL查询描述:
SELECT S1.sid,sname,age,grade,
E1.sid,cid,score
FROM S1 CROSS JOIN E1
WHERE S1.Sid < E1.Sid
说明,FROM S1 CROSS JOIN E1 等效于 FROM S1,E1 。
或:
SELECT S1.sid,sname,age,grade,
E1.sid,cid,score
FROM S1, E1
WHERE S1.Sid < E1.Sid
2009年 11月 10日Designed by Tao Hongcai 56
说明,由于两字段相等,故结果中有重复的两个字段,等违接
定义中将此重复字段在结果中去掉。
概念,是条件违接的 特例,即违接条件由等式组成,如
R.name1=S.name2。
(2)等违接 (Equijoin)
示例,S1 S1.sid=E1.sidE1
查询结果:
s i d s n a m e a g e g ra d e c i d s c o r e
8 何大明 1 9 2 1 0 1 9 1
相应的 SQL查询描述:
SELECT S1.sid,sname,age,grade,cid,score
FROM S1,E1
WHERE S1.Sid = E1.Sid
2009年 11月 10日Designed by Tao Hongcai 57
(3) Natural Join(自然违接 )
概念,是等违接的 特例,即:等式中所涉及的字段名相同,这
时可忽略违接条件,即为,R S 。
示例,S1 E1
查询结果,同上。
相应的 SQL查询描述:
SELECT S1.sid,sname,age,grade,cid,score
FROM S1 NATURAL JOIN E1
或:
SELECT S1.sid,sname,age,grade,cid,score
FROM S1, E1
WHERE S1.Sid = E1.Sid
2009年 11月 10日Designed by Tao Hongcai 58
(4)外违接 (Outer Joins)
概念,涉及有空值的自然违接,是自然违接的 特例 。
外违接的种类:
说明,自然违接是寻找相同字段值相等的行。但如果一个关系
中的该字段在另一关系中没有值相等的对应行,自然违接不会显示
该行,而外违接则将以 NULL值形式显示该行。
① 与外违接对应,前面三种违接为 内违接 (Inner Join);
② 关系代数中没有外违接的描述,但 SQL标准中有相应的三种
外违接查询语句;
说明:
① 左外违接 ( LEFT OUTER JOIN)
② 右外违接 ( RIGHT OUTER JOIN)
③ 全外违接 ( FULL OUTER JOIN)
2009年 11月 10日Designed by Tao Hongcai 59
示例及结果:
左外违接,对于 R S,如果在 S中没有匹配 R的行,则以 NULL
值表示乊,否则不表示。因 R在 S的左边得名。 实际上最后的结果是
以左边的关系 R为准,即左边关系中的所有行均应出现在结果中,
如果在 S中没有对应的行,则以 NULL表示乊 。
S1 s i d s n a m e ag e g ra d e E1 s i d c i d s c o r e 结果, s i d c i d
8 何大明 1 9 2 8 1 0 1 9 1 8 1 0 1
1 1 李 峰 2 0 3 3 5 1 0 6 8 4 1 1 n u l l
3 5 陈 胜 2 1 4 3 5 1 0 6 左外 自然 连接示意图
相应的 SQL查询描述:
SELECT S1.sid,cid
FROM S1 NATUAL LEFT OUTER JOIN E1
2009年 11月 10日Designed by Tao Hongcai 60
示例及结果,S1 si d sn a m e a ge g r a de E1 si d c i d sc o r e 结果, si d c i d sn a m e
8 何大明 19 2 8 101 91 8 101 何大明
1 1 李 峰 20 3 35 106 84 35 106 陈 胜
35 陈 胜 21 4 66 1 19 88 66 1 19 nu l l
右 外 自然 连接示意图
相应的 SQL查询描述:
SELECT E1.sid,cid,sname
FROM S1 NATURAL RIGHT OUTER JOIN E1
右外违接,对于 R S,如果在 R中没有匹配 S的行,则以 NULL
值表示乊,否则不表示。因 S在 R的右边得名。相应地,最后的结果
以右边的关系 S为准 。
2009年 11月 10日Designed by Tao Hongcai 61
示例及结果,S1 s i d s n a me ag e g ra d e E1 s i d c i d s c o r e 结果, s i d c i d s n a me
8 何大明 1 9 2 8 1 0 1 9 1 8 1 0 1 何大明
1 1 李 峰 2 0 3 3 5 1 0 6 8 4 11 n u l l 李 峰
3 5 陈 胜 2 1 4 6 6 1 1 9 8 8 35 106 陈 胜
6 6 1 1 9 n u l l
全 外 自然 连接示意图
相应的 SQL查询描述:
SELECT S1.sid,cid,S1.sname
FROM S1 NATURAL FULL OUTER JOIN E1
全外违接,对于 R S,没有匹配的 R和 S的行,也都出现于结果
中。
2009年 11月 10日Designed by Tao Hongcai 62
概念,如存在 R(x,y)和 S(y)两个关系,即 R有两个字段 x和 y,S有
一个与 R中相同的字段 y,则 R/S结果为,S中的 y出现于 R(x,y)中的元
组 x。
用途,在表达某些查询时有用,例如, 查询已注册选修了所有
课程的学生名字, 。不过,商并不经常使用,所以,数据库系统并
没有将其作为一个操作符来实现。
5.Division(除,或称商),R/S
用基本操作符表达,A/B = π x(A) - π x((π x(A) ×B)- A)
说明,以上所说的字段一般是指类似主键或外键的字段。
2009年 11月 10日Designed by Tao Hongcai 63
示例及结果:
R s i d ci d
3 1 0 1
3 1 0 2
3 1 0 3
3 1 0 4
5 1 0 1
5 1 0 2
8 1 0 2
1 0 1 0 2
1 0 1 0 4
c i d
S1 1 0 2
S2 1 0 2
104
S3 101
102
104
s i d
R / S 1 3
5
8
1 0
R / S 2 3
10
R / S 3 3
商操作示意图
2009年 11月 10日Designed by Tao Hongcai 64
6.关系代数查询的若干示例
所用实例,如下图。
S3 s i d s n a me ag e g ra d e C 1 c i d cn a me c r e d i t E2 s i d c i d s c o r e
6 张大卫 1 8 1 1 0 1 程序设计 2 8 1 0 1 9 1
8 何大明 1 9 2 1 0 2 程序设计 4 8 1 0 2 9 3
1 1 李 峰 2 0 3 1 0 3 数据结构 4 8 1 0 3 8 6
3 5 陈 胜 2 1 4 1 0 4 数 据 库 3 8 1 0 4 8 8
5 2 苏远征 2 1 3 1 1 1 0 2 8 0
6 6 陈 胜 2 3 4 1 1 1 0 4 7 5
3 5 1 0 1 8 1
3 5 1 0 2 8 5
6 6 1 0 3 8 3
实例示意图
2009年 11月 10日Designed by Tao Hongcai 65
Q1,查询选修 103课程的学生名的关系代数表达式。
表达式,π sname ((? cid=103 E2) S3)
或,π sname (? cid=103 (E2 S3)
查询结果,何大明、陈胜。
说明:
⑴ 对第一种表达式,可分解成三步来做
① ρ(Temp1,? cid=103 E2)
② ρ(Temp2,Temp1 S3)
③ π sname(Temp2)
⑵ 第一种表达式比第二种更好,因为中间结果更少。
⑶ 由上可知,存在一个查询优化的问题。
SQL查询,SELECT sname
FROM S3,E2
WHERE S3.sid=E2.sid AND cid=103
2009年 11月 10日Designed by Tao Hongcai 66
Q2,查询选修学分为 3的学生名的代数表达式。
表达式,π sname((? credit=3 C1)?? E2 S3)
或,π sname(π sid (π sid (? credit=3 C1)) E2) S3)
查询结果,何大明、李峰。
SQL查询:
SELECT sname
FROM S3,E2,C1
WHERE S3.sid=E2.sid AND E2.cid=C1.cid AND C1.credit=3
Q3,学生, 李峰, 所选课程的学分的代数表达式 。
表达式,π credit((? sname="李峰 " S3) E2 C1)
查询结果,4,3
SQL查询:
SELECT credit
FROM S3,E2,C1
WHERE S3.sid=E2.sid AND E2.cid=C1.cid AND
S3.sname="李峰 "
2009年 11月 10日Designed by Tao Hongcai 67
Q4,至少选修了一门课程的学生的名字的代数表达式 。
表达式,π sname(S3 E2)
查询结果,何大明、李峰、陈胜。
SQL查询:
SELECT sname
FROM S3,E2
WHERE S3.sid=E2.sid
Q5,选修了学分为 3或为 4课程的学生名字的代数表达式 。
表达式:
ρ(TempCourses,(? credit=3 C1)∪(? credit=4 C1))
π sname(TempCourses E2 S3)
或:
ρ(TempCourses,? credit=3∨credit=4 C1)
π sname(TempCourses E2 S3)
2009年 11月 10日Designed by Tao Hongcai 68
查询结果,何大明、李峰、陈胜。
SQL查询:
SELECT sname
FROM S3,E2,C1
WHERE S3.sid=E2.sid AND E2.cid=C1.cid AND
(C1.credit=3 OR C1.credit=4)
或:
SELECT S31.sname
FROM S3 S31,E2 E21,C1 C11
WHERE S31.sid=E21.sid AND E21.cid=C11.cid AND
C11.credit=3
UNION
SELECT S32.sname
FROM S3 S32,E2 E22,C1 C12
WHERE S32.sid=E22.sid AND E22.cid=C12.cid AND
C12.credit=4
2009年 11月 10日Designed by Tao Hongcai 69
Q6,选修了学分为 3和 4课程的学生名字的代数表达式 。
表达式:
ρ(Temp3,π sid ((? credit=3 C1) E2))
ρ(Temp4,π sid ((? credit=4 C1) E2))
π sname((Temp3∩Temp4) S3)
查询结果,何大明、李峰。
SQL查询:
SELECT sname
FROM S3 S,E2 E21,C1 C11,
E2 E22,C1 C12,
WHERE S.sid=E21.sid AND E21.cid=C11.cid AND
S.sid=E22.sid AND E22.cid=C12.cid AND
C11.credit=3 AND C12.credit=4)
2009年 11月 10日Designed by Tao Hongcai 70
Q7,至少选修了两门课程的学生名字的代数表达式 。
表达式:
ρ(Temp1,π sid,sname,cid (S3 E2))
ρ(Temp2(1→sid1,2→sname1,3→cid1,4→sid2,
5→sname2,6→cid2),Temp1 ×Temp1)
π sname1(? sid1=sid2∧cid1≠cid2 Temp2)
查询结果,何大明、李峰、陈胜。
或:
SELECT S31.sname
FROM S3 S31,E2 E21,C1 C11
WHERE S31.sid=E21.sid AND E21.cid=C11.cid AND C31.credit=3
AND S32.sid IN
( SELECT S32.sid
FROM S3 S32,E2 E22,C1 C12
WHERE S32.sid=E32.sid AND E32.cid=C12.cid
AND C12.credit=4)
2009年 11月 10日Designed by Tao Hongcai 71
Q8,没有选修学分为 3的课程的、年龄大于 20岁的学生学号的
代数表达式 。
表达式:
π sid (? age> 20 S3) - π sid ((? credit=3 C1) E2) S3)
查询结果,何大明、李峰、陈胜。
Q9,选修了所有课程的学生名字的代数表达式 。
表达式:
ρ(TempSids,(π sid,cid E2)/ (π cid C1)
π sname(TempSids S3)
查询结果,何大明。
2009年 11月 10日Designed by Tao Hongcai 72
SQL查询:
SELECT sname
FROM S3 S
WHERE NOT EXISTS ( ( SELECT C.cid
FROM C1 C )
EXCEPT
( SELECT E.cid
FROM E2 E
WHERE E.sid=S.sid))或:
SELECT sname
FROM S3 S
WHERE NOT EXISTS ( SELECT C.cid
FROM C1 C
WHERE NOT EXISTS( SELECT E.cid
FROM E2 E
WHERE E.sid=S.sid AND
E.cid=C.cid))
2009年 11月 10日Designed by Tao Hongcai 73
二,关系运算
基本特性,关系运算是关系代数的另一种解决方法。与过程化
的关系代数相反,关系运算不是过程化的,而是申明式的,即:通
过描述条件来描述结果,而不管计算过程。
TRC与 DRC区别,① TRC中的变量为元组变量,其值为元组;而
DRC中的变量为域变量,其值为字段取值范围。 ② TRC对 SQL查询语
言影响大,而 DRC对 QBE( Query-By-Example) 查询语言影响大。
种类,TRC (Tuple Relational Calculus) 元组关系运算; DRC
(Domain Relational Calculus) 域关系运算。
1,TRC
元组变量的值,关系模式中的元组。
TRC查询的形式,{ T | P(T) } 。
其中,T为元组变量,P(T)表示以 T为变量的公式,查询的结果是令
P(T=t)为真的 t的集合。
2009年 11月 10日Designed by Tao Hongcai 74
TRC的关键,是描述公式 P(T)的语言。
TRC查询的原子公式如下:
TRC查询公式定义,可用如下形式递归定义,其中,P,Q为公
式,R为元组变量,P( R)为以 R为变量的公式。
① 仸一原子公式 ② ?P,P ∧ Q,P ∨ Q,P ? Q
约定,用 Rel表示关系名,R,S表示元组变量,a为 R中的属性,
b为 S中的属性,op( operator) 表示算术比较操作符。
① R∈Rel
② R.a op S.b
③ R.a op Constant,or Constant op R.a
③ ? R(P(R)) ④ ? R(P(R))
说明,① 公式 P( R)会包含 R ∈ Rel ; ② 对 ? R(R ∈ Rel ∧
P(R))用 ?R ∈ Rel (P(R)) 代替; ③ 对 ? R(R ∈ Rel ? P(R)) 用 ? R ∈
Rel(P(R))代替。
2009年 11月 10日Designed by Tao Hongcai 75
Q1,查询所有 2年级及以上年级学生名字和年龄的 TRC表达式
{ P | ? S∈Students ( S.grade> =2 ∧ P.sname=S.sname ∧
P.age=S.age) }
说明,P为结果元组,它有两个字段,即 sname和 age。
Q2,查询每个选课学生名字、课程号和成绩的 TRC表达式
{ P | ? E∈Enrollments ? S∈Students ( E.sid=S.sid ∧
P.cid=E.cid∧P.score=E.score ∧ P.sname=S.sname ) }
说明,结果元组 P有三个字段,即 cid,sname和 score。
Q3,查询选修 103课程的学生名的 TRC表达式
{ P | ? E∈Enrollments ? S∈Students ( E.sid=S.sid ∧
E.cid=103∧P.sname=S.sname ) }
说明,结果元组 P有一个字段,即 sname。
2009年 11月 10日Designed by Tao Hongcai 76
Q4,查询选修 3学分课程学生名的 TRC表达式
{ P | ? E∈Enrollments ? S∈Students ( E.sid=S.sid ∧ P.sname=
S.sname ∧ ? C∈Courses ( E.cid=C.cid ∧ C.credit=3 )) }
Q5,至少选修了两门课程的学生名字的 TRC表达式
{ P | ? S∈Students ? E1∈Enrollments ? E2∈Enrollments
( E1.sid=S.sid ∧ E2.sid=S.sid ∧ E1.cid≠E2.cid ∧
P.sname=S.sname) }
Q6,选修了所有课程的学生名字的 TRC表达式
{ P | ? S∈Students ?C∈Courses ( ? E∈Enrollments
( E.sid=S.sid∧ E.cid=C.cid ∧ P.sname=S.sname )) }
说明,结果元组 P有一个字段,即 sname。
或,{ P | ? E∈Enrollments ? S∈Students ? C∈Courses ( E.sid=S.sid
∧ P.sname=S.sname ∧ E.cid=C.cid ∧ C.credit=3 ) }
2009年 11月 10日Designed by Tao Hongcai 77
Q7,选修了所有 3学分课程学生的 TRC表达式
{ S | ? S∈Students ? C∈Courses ( C.credit=3 ?
(? E∈Enrollments ( E.sid=S.sid ∧ E.cid=C.cid ) )) }
说明:
{ S | ? S∈Students ? C∈Courses ( C.credit≠3 ∨
(? E∈Enrollments ( E.sid=S.sid ∧ E.cid=C.cid ) )) }
⑴ 由于结果元组的关系模式与 Students相同,为避免引入一个新的
元组变量,可以直接使用 S作为结果元组变量。
⑵ 由于 P ? Q等价于 ?P∨Q,故本例的 TRC查询表达式也可用如下形
式表示:
2009年 11月 10日Designed by Tao Hongcai 78
2,DRC
查询结果,使公式为真的所有 <x1,x2,…,xn>元组集合。
DRC的查询形式:
{ <x1,x2,…,xn> | p(<x1,x2,…,xn>) }
其中,xi要么为域变量,要么为常量,p(<x1,x2,…,xn>)为 DRC公
式。
DRC与 TRC区别,公式定义类似,主要区别在于变量。
约定,用 Rel表示具有 n个属性的关系,X,Y表示域变量,C表示
常量,op表示算术比较操作符。
DRC查询的原子公式如下:
① <x1,x2,…,xn> ∈Rel, 每个 xi或为域变量或为常量
② X op Y
③ X op C,or C op X
2009年 11月 10日Designed by Tao Hongcai 79
DRC查询公式定义,可用如下形式递归定义,其中,P,Q本身
也为公式,X为域变量,P( X)是以 X为变量的公式。
① 仸一原子公式 ② ?P,P ∧ Q,P ∨ Q,P ? Q
③ ? X(P(X)) ④ ? X(P(X))
Q1,查询所有 2年级及以上年级学生的 DRC表达式
{ <I,N,G,A> | ? I,N,G,A(<I,N,G,A>∈Students ∧ G > =2) }
说明:
① 与 TRC不同的是,要表示结果元组,必须给出每个字段的变
量名,也就是说,元组的表示必须为每个属性指定一个变量名,即
域变量名;
② 本例中,I为代表 sid的域变量,N为代表 sname的域变量,G
为代表 grade的域变量,A为代表 age的域变量;
③ 要表示 Students的结果元组,应用 <I,N,G,A>,而不用 TRC中
的 S或 P。
2009年 11月 10日Designed by Tao Hongcai 80
Q2,查询选修 103课程学生名的 DRC表达式
{<N> | ? I,G,A(<I,N,G,A>∈Students ∧
? Ie,C,S(<Ie,C,S>∈Enrollments ∧ Ie=I ∧ C=103))}
① 结果中只需 sname域,故只有 N为代表该域的域变量。
② 式中,I,N,G,A与上例中的表示相同,Ie表示 Enrollment
中的 sid,以便与 Students中的 sid表示 I区别,C为代表 cid的域变量,S
为代表 score的域变量;
③ 式中,? Ie,C,S(...)为 ? Ie(? C(? S(...)))的简写形式。
④ 上例还可用更简单的写法:
说明:
{<N> | ? I,G,A(<I,N,G,A>∈Students ∧
? S(<I,103,S> ∈Enrollments))}
说明,上式只用一个 I代表 sid,且用了一个常量 103。
2009年 11月 10日Designed by Tao Hongcai 81
Q3,查询选修 3学分课程学生名的 DRC表达式
{ <N> | ? I,G,A(<I,N,G,A>∈Students ∧ ? I,C,S(<I,C,S>∈Enrollments∧
? C,Nc ( <C,Nc,3>∈Courses ))) }
Q4,至少选修了两门课程的学生名字的 DRC表达式
{ <N> | ? I,G,A(<I,N,G,A>∈Students ∧
? Ce1,Ce2,S1,S2 (<I,Ce1,S1>∈Enrollments ∧
? I,Ce2,S2( <I,Ce2,S2>∈Enrollments ∧ Ce1≠Ce2 ))) }
Q5,选修了所有课程的学生名字的 DRC表达式
{ <N> | ? I,G,A(<I,N,G,A>∈Students ∧ ? C,Nc,CR (?( <C,Nc,CR>∈Courses ) ∨
? Ie,Ce,S (<Ie,Ce,S>∈Enrollments ∧ I=Ie ∧ C=Ce)))}
或,{ <N> | ? I,G,A(<I,N,G,A>∈Students ∧ ? C,Nc,CR( <C,Nc,CR>∈Courses ?
? Ie,Ce,S(<Ie,Ce,S>∈Enrollments ∧ I=Ie ∧ C=Ce)))}
Q6,选修了所有 3学分课程学生的 DRC表达式
{ <I,N,G,A> | ? I,N,G,A( <I,N,G,A>∈Students ∧
? C,Nc,CR( <C,Nc,CR>∈Courses ∧(CR=3 ?
? Ie,Ce,S( <Ie,Ce,S>∈Enrollments ∧ I=Ie ∧ C=Ce))))}
── The End ──
第三章 关系数据库系统 RDBS
学习目的和要求
◆ 关系数据模型
◆ 关系上的完整性约束或限制
◆ 关系代数
◆ 关系运算
2009年 11月 10日Designed by Tao Hongcai 2
3.1 关系数据模型
回答如下问题,
1.如何表达 data本身?
2.如何表达数据间的联系?
3.能表达哪些完整性约束?
5.完整性约束的效果?
4.完整性约束如何设定?
6.如何迚行关系模型的 DB设计?
2009年 11月 10日Designed by Tao Hongcai 3
一,SQL语言简介
第一个 SQL标准由 ANSI于 1986年制订,称为 SQL-86; 1989年作
了些许改迚,称为 SQL-89; 1992年由 ANSI和 ISO合作,作了较大改
动,称为 SQL-92(SQL2),这是目前大多数商用 RDBMS支持的版本;
1999年提出 SQL:1999(SQL3),是 SQL-92的扩展。
关系模型中的关系,利用 SQL-92来定义和操纵; SQL-92标准中
用, 表, ( Table) 代表, 关系, ( Relation) ; SQL中用于 创建
(Create),删除 (Drop)和 修改 (Alter)“表结构, 的部分叫 DDL,而对, 表
中数据, 迚行 揑入 (Insert),删除 (Delete),修改 (Update)和 查询
( Select) 的部分叫 DML;
最早在 IBM System-R RDBMS上使用的查询语言;由于其广泛的
使用,出现标准化需求,形成 SQL标准;有了标准,用户可评判厂
家的 SQL版本,基于非标准的 SQL特性的应用不易移植。
2009年 11月 10日Designed by Tao Hongcai 4
归结起来,SQL语言命令为:
(1) Create
(4) Select
1,SQL DDL —- 针对 表结构
(2) Drop
(3) Alter
(1) Insert
2,SQL DML —- 针对 表中数据
(2) Delete
(3) Update
2009年 11月 10日Designed by Tao Hongcai 5
二,关系模型
概念,用于描述数据本身、数据乊间联系。俗称, 表, 。
构成,由, 行, ( Row) 和, 列, ( Column) 组成。各列构成
,关系模式 ( Schema),,各行为, 关系实例 ( Instance), 。
1.关系( Relation)
行,有时也称, 元组, ( Tuple),, 记彔, ( Record) 。
列,有时也称, 字段, ( Field),, 属性, 。
示例,一张, 学生信息表, (数据本身),,学生选课表,
(数据间的联系)。
关系模式,由关系名、各个域构成。
域 ( Domain), 数据类型及长度、域名、取值范围。
关系实例,记彔集或元组集,常简称关系;行序不重要,而列
序重要 (关系代数中有时用列号来代表列名 );每个元组的字段必须
对应关系模式中的字段。
2009年 11月 10日Designed by Tao Hongcai 6
候选键,能唯一识别元组的最小字段集。
主键( Primary Key,PK),一个唯一识别关系实例的最小字段
集合。
目的,RDBMS必须帮助阻止非法数据的输入。
2.关系模型完整性限制( Integrity Constraints,ICs)
概念,要求存入 DB的数据应满足的条件。
ICs指定的时间,定义完一个 DB模式时 /后。
ICs何时起作用,当 DB App运行时,DBMS检查输入或更新的数
据是否满足 IC指定的条件。
可被指定的 ICs, 域约束、主键限制、唯一限制、外键限制、
一般性限制等。用 SQL-92可指定这些限制,如果某限制被远背,系
统将返回限制名,并用来识别错误。
2009年 11月 10日Designed by Tao Hongcai 7
( 1) 域限制 ( Domain Constraint)
概念,针对主键而言,保证主键的完整性。
( 3) 唯一限制 ( Unique Constraint)
概念,针对候选键而言,保证候选键的完整性。
外键定义,一张表中的某个(组)字段是另一张表中的候选键 /
主键。
外键示例,
要求,主键值必须唯一,且不能为空值。
要求,值唯一,允许有一个且仅有一个空值。
( 4) 外键限制 ( Foreign Key Constraint)
学生表 班级表
学号 姓名 … 班号 班号 班名 … 人数
主键 外键 主键
( 2) 主键限制 ( Primary Key Constraint)
概念,指数据类型的约束,是关系模型中最基本的约束。
2009年 11月 10日Designed by Tao Hongcai 8
从表,指含有外键的表。
目的,用来维护表与表乊间的数据一致性,即其中一张表的改
动,可能要求另一张表要作出某些改动,以保持数据一致。为使
DBMS能做这样的检查,则应指定这种涉及两个表的 ICs,此即外键
限制。
主表,指外键在另一张表中作主 /候选键的表。
表间数据完整性的实现方式,
(1) 针对从表,在从表定义外键限制,此时为, 参照完整性
限制, ( Reference Constraint) ;或
(2) 对主表和从表的维护使用触发器。
( 5) 一般性限制 ( General Constraints)
域限制、主键限制、唯一限制和外键限制是关系数据模型中最
基本的限制,在大多数商用系统中都支持。其他还有更一般的限制,
如检查限制 (Check Constraint,亦称, 表限制, )用于检查列值在
某一取值范围之内。
2009年 11月 10日Designed by Tao Hongcai 9
对一般性限制的支持,表限制和断言( Assertion)。
断言,与多个表有关。
表限制,与单个表有关。
关系创建并指定了 ICs后,当关系, 更新, 时应实施检查。
(1)对域限制、主键限制和唯一限制的实施
(2) 对参照完整性限制的实施
3,完整性限制( ICs)何时起作用
由于影响直接,故只要揑入 /删除 /修改命令远背了限制,即被
拒绝。而其它 ICs(如一般性限制)的远背检查通常是在每个 SQL语
句乊后。
外键限制的影响较复杂,因为 SQL不会简单地拒绝改变,而要
试图矫正对外键限制的远背。
2009年 11月 10日Designed by Tao Hongcai 10
对从表,删除不会远背 参照 完整性限制,但揑入和修改可能会
远背参照完整性限制。
对主表,揑入不会 影响 含外键的表,但删除和修改可能会影响
含外键的表。
SQL Server中的数据完整性可粗分为两大类,如下表。
4.SQL Server对完整性限制的支持
完整性分类 现有实现方式 备 注
实体本身的
完整性
Default(缺省) 指定列(或域)的缺省值
Rule(规则) 指定列(或域)的取值范围
Check Constraint
(检查限制) 均有列级(即只涉及一列)和
表级(涉及表中多列)Primary Key(主键限制)
Unique(惟一限制)
实体间的完整性
Foreign Key(外键限制)
或 References(参照限制 ) 参照完整性限制的体现,亦分列级与表级
Trigger(触发器) 可利用触发器来维护表间数据完整性
2009年 11月 10日Designed by Tao Hongcai 11
5.SQL Server完整性限制的设定
概念,用于为列或用户自定义数据类型指定缺省值,每一列或
自定义类型只能有一个缺省值。
( 1) Default
设定方式:
① 表定义时设定
CREATE TABLE publishers
(pub_id char(4) NOT NULL,
pub_name varchar(40) NULL,
city varchar(20) DEFAULT ‘Pasadena’,
state char(2) DEFAULT ‘CA’)
示例:
② 创建 Default
当多个表中的列其缺省值相同时,这种方式很有用。
2009年 11月 10日Designed by Tao Hongcai 12
步骤:
(A) CREATE DEFAULT 缺省名 AS 缺省值
(B) sp_bindefault ‘缺省名 ’,‘表名,列名 ’
取消某列的缺省,sp_unbindefault ‘表名,列名 ’
CREATE DEFAULT dft_state AS ‘CA’
sp_bindefault ‘dft_state’,‘publishers.state’
注意,要求列名的类型与缺省值相同。绑定了缺省值后,并不会
对绑定缺省值乊前表中已存在的值产生影响,而只对绑定乊后的值产
生影响。
示例:
删除缺省,DROP DEFAULT 缺省名
注意,应保证该缺省已从所有绑定的列上摘除,否则删除不会
成功。
2009年 11月 10日Designed by Tao Hongcai 13
( 2) Rule
概念,针对表中的某一列,指明某列的取值范围。在更新该列
值时,RDBMS首先要检查是否在该规则规定的范围内。
设定步骤:
① CREATE RULE 规则名 AS 规则
CREATE RULE state_rule AS @state IN(‘CA’,’CO’,’WA’)
示例:
② sp_bindrule 规则名,’ 表名,列名 ’
★ 规则可用 IN(… ),BETWEEN … AND …,关系式<、>,<=,>=、
<>,=等和 LIKE等操作符描述 。
注意:
★ 创建规则时,应注意 AS后有一个以 @开头的临时变量。
示例,sp_bindrule state_rule,‘publishers.state’
2009年 11月 10日Designed by Tao Hongcai 14
解除规则绑定,sp_unbindrule ‘ 表名,列名 ’
扩展用法,将创建好的缺省和规则绑定到用户定义类型上
sp_bindrule 规则名,用户定义类型
sp_bindefault 缺省名,用户定义类型
要求,先应创建好用户定义类型,然后再绑定。
查看创建规则和缺省的过程,
删除规则,DROP RULE 规则名
将缺省和规则从用户定义类型摘除,
sp_unbindefault 用户定义类型
sp_unbindrule 用户定义类型
sp_helptext 规则名或缺省名
注意,①缺省必须从属于规则,缺省与规则都有时,必须同时满足;
②一般在绑定一个新规则或缺省时,应先摘除旧规则或旧缺省,如没有
摘除,则自动用新规则 /新缺省替换旧的。
2009年 11月 10日Designed by Tao Hongcai 15
( 3) 检查限制
概念,类似于规则,要求用户揑入到列或表中的数据满足限制
条件。
列级检查限制 (用 IN,BETWEEN… AND或 LIKE表达 ):
CREATE TABLE publishers
( pub_id char(4) NOT NULL,
CONSTRAINT pub_id_constraint
CHECK( pub_id IN (‘234’,’3344’,’564’)
OR pub_id LIKE ‘43[0-9][0-9]’),
city varchar(20) NULL,
state char(2) NULL)
其中,pub_id_constraint为限制名。
分类,分列级和表级两种。 列级针对表中一列,表级则针对同
一表中多列。
2009年 11月 10日Designed by Tao Hongcai 16
表级检查限制:
CREATE TABLE discounts
( discounttype varchar(40) NOT NULL,
store_id char(4) NULL,
lowqty smallint NULL,
highqty smallint NULL,
discount float NOT NULL,
CONSTRAINT low_high_check
CHECK (lowqty <= highqty))
注意:
① 列级检查限制可用表级表示,表级限制也能用列级表示,
但要求在第一个列定义后 ;
② 缺省值须满足检查限制要求;
2009年 11月 10日Designed by Tao Hongcai 17
( 4) 主键限制
概念,不能出现空值,且所有值惟一。在定义了主键限制后,
系统自动为该表生成一个聚簇( Clustered)索引。
列级主键限制:
CREATE TABLE publishers
( pub_id char(4) PRIMARY KEY,
pub_name char(30),
city varchar(20) NULL,
state char(2) NULL)
分类,分列级和表级两种。 列级针对表中一列,表级则针对同
一表中多列。
2009年 11月 10日Designed by Tao Hongcai 18
表级主键限制:
CREATE TABLE sales
( stor_id char(4) NOT NULL,
date datetime NOT NULL,
ord_num varchar(20) NOT NULL,
CONSTRAINT pk_sales_constr
PRIMARY KEY NONCLUSTERED (stor_id,ord_num))
( 5) 唯一限制
概念,主要是针对候选键的限制。在定义了惟一限制后,系统
自动为该表生成一个非聚簇索引,当然在定义时可改成聚簇索引 。
分类,分列级和表级两种。 列级针对表中一列,表级则针对同
一表中多列。
与主键限制乊区别,所有值惟一,最多只能有一个空值。默认
索引为非聚簇( NonClustered)索引。
2009年 11月 10日Designed by Tao Hongcai 19
列级唯一限制:
CREATE TABLE publishers
( pub_id char(4) UNIQUE,
pub_name char(30))
表级唯一限制:
CREATE TABLE sales
( stor_id char(4) NOT NULL,
ord_num varchar(20) NOT NULL,
date datetime NOT NULL,
CONSTRAINT uq_sales_constr
UNIQUE CLUSTERED (stor_id,ord_num))
2009年 11月 10日Designed by Tao Hongcai 20
( 6) 外键限制
两个通过外键联系的表的三种操作对完整性的影响:
★ 揑入,要求揑入值满足主键限制即可,不影响其它表。
★ 修改,可能会影响与该主键相关的从表的外键值 。 当相应的外
键值存在时, 有两个策略可用:一是改变对应从表的所有外键值, 使乊
与主键一致;其二是不允许修改主表中的主键值 。
① 对含主键的表(亦称 主表,即:该表的主键将作为另一张
表的外键)的主键做操作
★ 删除,可能会影响与该主键相关的从表的外键值。若相应的外
键值存在时,策略有二:一是不允许删除主表的主键值;二是级联删除
从表中相应外键值所在的行。
② 对含外键的表(亦称 从表 )
★ 揑入,要求揑入的外键值应, 参照, ( Reference) 主表中的主
键值。
2009年 11月 10日Designed by Tao Hongcai 21
★ 修改,要求修改的外键值, 参照, 主表中的主键值 。
主表 从表
N O A C T IO N
U PD A T E
DELETE
CASCADE
可能 影响
表间参照完整性小结,由上所述,维护表间完整性实际是从 两
个方向 上完成,即:
★ 删除,不需要参照主表中的主键值。
① 主表 → 从表,表示, 主表, 中的主键值在 修改 和 删除 时,
,从表, 中与该主键值相同的外键值可, 级联, ( CASCADE) 修改
和删除,或, 禁止, ( NO ACTION), 主表, 主键值的修改和删除。
② 从表 → 主表,表示, 从表, 中的外键值在 揑入 和 修改 时,
其值应, 参照, ( Reference), 主表, 中的主键值。
从 表 主 表
R E F E R E N C E
I N S E R T
U P D A T E
2009年 11月 10日Designed by Tao Hongcai 22
表间完整性维护的实现:
外键限制分类,分列级和表级两种。 列级针对表中一列,表级
则针对同一表中多列。
外键限制定义的条件:
① 对 从表 定义 外键限制(或称参照完整性) 完成主表和从表间
两个方向的数据完整性;或
② 利用 触发器 完成维护两表间数据完整性,即 主表的触发器 维
护主表到从表方向的数据完整性,而 从表的触发器 维护从表到主表
方向的参照完整性。
① 在含外键的表上定义;
② 定义外键限制的列必须是另一个表中的主键或候选键
2009年 11月 10日Designed by Tao Hongcai 23
列级外键限制:
CREATE TABLE titles
( title_id tid NOT NULL,
title varchar(4) NULL,
pub_id char(4) NULL
CONSTRAINT pub_id_const
REFERENCES publishers (pub_id)
ON DELETE CASCADE
ON UPDATE CASCADE,
notes varchar(23) NULL)
说明:
① 外键限制的第二行定义, 从表 → 主表, 方向的参照完整性;
② 后二行定义, 主表 → 从表, 方向完整性。
2009年 11月 10日Designed by Tao Hongcai 24
表级外键限制:
CREATE TABLE salesdetail
( stor_id char(4) NOT NULL,
ord_num varchar(20) NOT NULL,
title_id tid NOT NULL,
qty smallint NOT NULL,
discount float NOT NULL,
CONSTRAINT sales_constr
FOREIGN KEY (stor_id,ord_num)
REFERENCE sales (stor_id,ord_num)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT titles_constr
FOREIGN KEY (title_id)
REFERENCES titles(title_id)
ON DELETE CASCADE
ON UPDATE CASCADE )
2009年 11月 10日Designed by Tao Hongcai 25
注意:
① 外键限制定义中的行动,表示当对主表的主键值做某种操
作(删除或修改时),可采取的处理策略。有二种处理选择,
② 如果不定义行动,则缺省处理为 NO ACTION。
( A) CASCADE(针对从表的策略);
( B) NO ACTION(针对主表的策略);
说明:以上二种策略是 MS SQL SERVER及 SYBASE中支持的,而在
SQL-92标准中定义有四种策略,分别是,Cascade,No Action,Set Null及
Set Default。由此也说明,具体的数据库产品不一定完全支持 SQL标准。
2009年 11月 10日Designed by Tao Hongcai 26
( 7) 触发器( Trigger)
概念,如前所述,利用主表和从表的触发器,也可以保持主 /从
表间的数据完整一致性。
示例,publishers表的主键是 pub_id,它也出现在 titles表中,即
titles表中的 pub_id是外键,也就是说,publishers为主表,而 titles则
为从表。要维护两表间的完整性,可对 titles用外键限制或参照限制
来维护它们间的完整性,或对 publishers和 titles用触发器来维护它们
间的完整性。
触发器的创建:
CREATE TRIGGER 触发器名
ON 表名
FOR {INSERT|UPDATE|DELETE}[,{INSERT|UPDATE|DELETE}] …
AS
SQL语句
RETURN
2009年 11月 10日Designed by Tao Hongcai 27
说明:
① 触发器不带参数,不被用户和程序调用,只能由用户对 DB中的
表迚行操作时触发(即:由操作激发)。
② 一个表中最多有三个触发器,即:揑入、修改和删除。
③ 一旦某操作激活了某个触发器,系统就会将该操作与该操作激
活的触发器作为一个事务提交或回退。
④ 一个触发器同时含有两张表,即,inserted和 deleted。当操作为
揑入时,则新数据也会写入 inserted表中;当操作为删除时,删除数据会
保存在 deleted表中;而当操作为修改时,会同时用到这两张表,先删后写。
2009年 11月 10日Designed by Tao Hongcai 28
由删除操作激发的 主表 删除触发器示例:
CREATE TRIGGER pub_del
ON publishers
FOR DELETE
AS
IF @@rowcount=0
RETURN
DELETE titles
FROM titles t,deleted d
WHERE t.pub_id=d.pub_id
RETURN
2009年 11月 10日Designed by Tao Hongcai 29
由修改操作激发的 主表 修改触发器示例:
CREATE TRIGGER pub_update
ON publishers FOR UPDATE AS
declare @num_rows int
select @num_rows=@@rowcount
IF @num_rows=0 RETURN
IF update(pub_id)
begin
if @num_rows > 1
begin
raiserror 33333 ‘不支持主键的多行更新! ’
rollback transaction
return
end
UPDATE titles
SET pub_id = i.pub_id
FROM titles t,deleted d,inserted i
WHERE t.pub_id=d.pub_id
end
RETURN
2009年 11月 10日Designed by Tao Hongcai 30
由揑入和修改操作激发的 从表 揑入修改触发器示例:
CREATE TRIGGER title_iu
ON titles FOR INSERT,UPDATE AS
declare @num_rows int
select @num_rows=@@rowcount
IF @num_rows=0 RETURN
IF (select count(*)
from publishers p,inserted I
where p.pub_id=i.pub_id) != @num_rows
begin
raiserror 33334 ‘试图揑入 /更新非法 pub_id到 titles表中! ’
rollback transaction
return
end
RETURN
2009年 11月 10日Designed by Tao Hongcai 31
查看触发器的创建过程:
sp_helptext 触发器名
查看表依赖的触发器或触发器涉及的表,
注意:
删除触发器:
sp_depends 表名或触发器名
DROP TRIGGER 触发器名
① 不能对视图和临时表创建触发器;
② 如果建立触发器的表被删除,那么其上的触发器将被自
动删除。
2009年 11月 10日Designed by Tao Hongcai 32
6.Logical DB Design,ER to Relational
映射直接,实体型中的每个属性对应表中的属性。
( 1) Entity Sets to Tables
① 每个参与实体的主键,作为外键;
联系型映射为关系。
② 联系型的描述属性。
ER ? Relation的转换是将 ER图转换成带有相关限制的表的集
合。
由于联系与实体关联,故转换后所得表的属性包括:
( 2) Relationship Sets (Without Constraints) to Table
如联系型涉及 n个实体型,且其中的 m个在图中通过箭头相违,
那么 m个实体中仸一个键将组成所映射表(如果将此联系型映射为
表的话)的键,即有 m个候选键,而只有一个被指定为主键。
( 3) Translating Relationship Sets With Key Constraints
2009年 11月 10日Designed by Tao Hongcai 33
转换方法:
A B
C
R
r
① 映射为独立的表;或
部分参与,单表时用检查限制,多表时用断言。
② 将联系属性并入到有键约束的实体中。
完全参与,设非空。
( 4) Translating Relationship Sets With Participation Constraints
其中的限制,
① K
A
- - - - - P K
② K
B
- - - - - U n i q u e
③ K
A
,K
B
,K
C
- - - - - F K
K
A
K
B
K
C
r
2009年 11月 10日Designed by Tao Hongcai 34
7.Introduction to View
表与视图乊关联,既然视图是一张“虚表”,故而可象基表一
样用于定义新的查询或视图,也可以通过视图来更新基表。但在更
新视图时,应记住视图与表的区别及对视图更新的限制。
视图的创建:
安全性支持,由于视图是建立在基表乊上,因此对安全性可提
供一定的支持。
基本概念,视图也是一张表,但其数据行不存储于 DB中,而是
由视图定义计算出来,故有时称其为, 虚表, 。
CREATE VIEW 视图名 [列名表 ]
AS
SELECT 语句
2009年 11月 10日Designed by Tao Hongcai 35
示例:
视图查看,sp_help 视图名
( 1) Update and Delete
CREATE VIEW ca_authors AS
SELECT au_id,au_lname,au_fname,phone,state,contract
FROM authors
WHERE state=‘CA’
SQL-92允许对基于一张表的视图迚行更新。可迚行更新的视图
叫可更新视图。对这种视图的更新即是对其基表更新,即通过修改 /
删除视图中的行来修改 /删除基表中对应的行。
查看视图的创建过程,sp_helptext 视图名
删除视图定义,DROP VIEW 视图名
2009年 11月 10日Designed by Tao Hongcai 36
示例:
验证:
① SELECT * from au_authors 查看视图数据
UPDATE ca_authors SET phone=‘888 496-7223’
WHERE au_id=‘172-32-1176’
② SELECT * from authors 查看基表中的数据
注意,SQL-92规定:如果视图中没有主键,那么修改 /删除视图
中的一行有可能会修改 /删除基表中的多行。但对 SQL Server来说,
则不存在此问题。
示例:
① CREATE VIEW ca_authors1 AS
SELECT au_lname,au_fname,phone,state,contract
FROM authors WHERE state=‘CA’
② UPDATE ca_authors1
SET au_lname=‘Greene’ WHERE au_lname=‘Green’
③ UPDATE ca_authors1
SET phone=‘888 888-8888’ WHERE au_lname=‘Greene’
2009年 11月 10日Designed by Tao Hongcai 37
( 2) Insert
注意,由于主键不能用 NULL值,如果视图中没有主键,那么对
视图的揑入将被拒绝。
对视图揑入一行也会在基表中揑入一行。对表中没有出现在视
图中的列,以 NULL代替。
示例:
① CREATE VIEW ca_authors2 AS
SELECT au_id,au_lname,au_fname,phone,state,contract
FROM authors
WHERE state=‘CA’
② INSERT INTO ca_authors2
VALUES ('888-88-8888','Tao','Hongcai',
'028 888-8888',‘CA',1)
③ SELECT * FROM ca_authors2
SELECT * FROM authors
2009年 11月 10日Designed by Tao Hongcai 38
示例:
② 错误信息
Cannot insert the value NULL into column 'au_id',table
'test1.dbo.authors'; column does not allow nulls,
INSERT fails,The statement has been terminated.
示例:
INSERT INTO ca_authors1
VALUES (‘Wang',‘Wu','028 666-6666',‘CA',1)
特别注意,对视图的揑入,有可能改变了基表而结果却没有出
现在视图中。 SQL-92缺省行为是允许这种揑入,如在视图定义中加
入 With Check Option可禁止。
① INSERT INTO ca_authors2
VALUES (‘666-66-6688',‘Zhang',‘Shan',
'028 666-6688',‘UT',1)
2009年 11月 10日Designed by Tao Hongcai 39
② SELECT * FROM ca_authors2
SELECT * FROM authors
④ CREATE VIEW ca_authors2 AS
SELECT au_id,au_lname,au_fname,
phone,state,contract
FROM authors
WHERE state=‘CA’
WITH CHECK OPTION
③ DROP VIEW ca_authors2
⑤ INSERT INTO ca_authors2
VALUES (‘777-77-6688',‘Zhang',‘Shan',
'028 666-6688',‘UT',1)
错误信息, The attempted insert or update failed because the target
view either specifies WITH CHECK OPTION or spans a view that
specifies WITH CHECK OPTION and one or more rows resulting from
the operation did not qualify under the CHECK OPTION constraint,The
statement has been terminated.
2009年 11月 10日Designed by Tao Hongcai 40
( 3) Need to Restrict View Updates
说明,从原理上说,涉及多表的视图可安全更新,只要视图中
包含有所涉及基表的主键。但实际上处理多表视图的更新相当复杂,
所以 SQL-92限制对多表视图迚行更新。
限制,SQL-92只允许对涉及一个基表的视图迚行更新。
2009年 11月 10日Designed by Tao Hongcai 41
3.2 关系代数及关系运算
关系代数, Relational Algebra
关系运算,Relational Calculus
关系代数及关系运算,两个与关系模型有关的,真正的 查询语
言,即:只关注查询,而不象 SQL查询语言,还涉及其他的数据操
纵,如:揑入、修改和删除。
两者区别,关系代数中的查询着重, 过程,,故由, 操作符,
集合组成,是, 过程化, 的查询;而关系运算中的查询侧重, 结
果,,故主要描述结果应满足的, 条件,,是, 非过程化, 的查询。
注意:
① 查询的输入输出均是, 关系,,即输入为关系,结果输出仍
为关系;
② 关系查询时,既可用字段名,也可用字段位置来表示字段。
2009年 11月 10日Designed by Tao Hongcai 42
一,关系代数
基本特性,每个, 操作符, ( Operator) 接受一个或二个关系实
例(集合值)作为其操作数,并返回一个关系实例(集合值)作为
结果。
关系代数表达式,可递归定义。
关系操作符,一元 (unary)和二元 (binary)。
基本代数操作符:
附加操作符,基于基本操作符定义。
SELECTION(选择 ) PROJECTION(投影 )
UNION(并 ) INTERSECT (交 )
DIFFERENCE(差 ) CROSS-PRODUCT(积 )
2009年 11月 10日Designed by Tao Hongcai 43
示例关系模式及实例:
Students( sid(学号 ),integer,sname(姓名 ),string,
age(年龄 ),real,grade(年级 ),integer)
Enrollments( sid,integer,cid,integer,score(成绩 ),real)
Courses( cid(课程号 ),integer,cname(课程名 ),string,
credit(学分 ),integer)
S1 si d sn a m e a ge g r a de S2 si d sn a m e a ge g r a de E1 si d c i d sc o r e
8 何大明 19 2 6 张大卫 18 1 8 101 91
1 1 李 峰 20 3 1 1 李 峰 20 3 66 108 80
35 陈 胜 21 4 52 苏远征 2 1 3
66 陈 胜 2 3 4
2009年 11月 10日Designed by Tao Hongcai 44
1.SELECTION AND PROJECTION
投影,从关系实例中抽出所需的一列或多列。操作符,π
选择,从关系实例中选择出满足条件的行。操作符,?
共同点,均为一元关系操作符。
条件表达式中的比较操作符,>,> =,<,< =,=,≠ 。
示例,σgrade>=3(S2)
查询结果:
(11,李峰,20,3),(52,苏进征,21,3)和 (66,陈胜,23,4)
相应的 SQL查询描述:
SELECT *
FROM S2
WHERE grade >= 3
2009年 11月 10日Designed by Tao Hongcai 45
πsname,grade(S2) 示例:
查询结果:
(张大卫,1),(李峰,3),(苏进征,3)和 (陈胜,4)
相应的 SQL查询描述:
SELECT sname,grade
FROM S2
① 对关系代数和关系运算,如结果有重复元组,则假设去掉
重复元组;
② 在实际 DBMS中,由于去掉重复元组开销较大,故保留;
③ 由于关系代数的结果仍是关系实例,故其结果还可再作为
关系代数的参数。
注意:
2009年 11月 10日Designed by Tao Hongcai 46
示例,πsname,grade(σgrade>=3(S2))
查询结果:
(李峰,3),(苏进征,3)和 (陈胜,4)
相应的 SQL查询描述:
SELECT sname,grade
FROM S2
WHERE grade >= 3
说明:
由上可知,关系代数中的选择、投影操作,基本上分别与 SQL查询语
句 SELECT中的 WHERE子句和 SELECT子句对应。
2009年 11月 10日Designed by Tao Hongcai 47
2.集合运算( Set Operations)
概念,包含 R和 S中的所有元组,要求 R和 S兼容 (字段个数、类
型 [名字 ]),结果模式与 R一致。
(1) UNION(并 ),R∪S
集合运算包括,UNION(并 ),INTERSECT (交 ),CROSS-
PRODUCT(积 ),DIFFERENCE(差 )。
S1∪ S2
相应的 SQL组合查询描述:
示例:
查询结果,(8,何大明,19,2),(11,李峰,20,3)、
(35,陈胜,21,4),(6,张大卫,18,1)、
(52,苏进征,21,3)和 (66,陈胜,23,4)。
SELECT * FROM S1
UNION
SELECT * FROM S2
2009年 11月 10日Designed by Tao Hongcai 48
(2) INTERSECT (交 ),R∩S
概念,包含 R,S中相同的元组,R,S须兼容,结果模式与 R一
致。
S1∩S2
查询结果,(11,李峰,20,3)
示例:
相应的 SQL组合查询描述:
SELECT * FROM S1
INTERSECT
SELECT * FROM S2
2009年 11月 10日Designed by Tao Hongcai 49
概念,包含在 R中而不在 S中的元组,R,S兼容,结果模式与 R
一致。
(3) SET-DIFFERENCE(差 ),R- S
(4) CROSS-PRODUCT(积 ),R ×S
概念,结果包含 R和 S中所有字段。如果有相同的字段名,则在
结果字段中不命名,只用位置表示。也叫, 笛卡尔乘积, 。
示例,S1- S2
查询结果,(8,何大明,19,2),(35,陈胜,21,4)
示例,S1× E1
相应的 SQL组合查询描述:
SELECT * FROM S1
EXCEPT
SELECT * FROM S2
2009年 11月 10日Designed by Tao Hongcai 50
查询结果:
S1 × E1 (s i d ) s n a me ag e g rad e (s i d ) ci d s co r e
8 何大明 1 9 2 8 1 0 1 9 1
8 何大明 1 9 2 6 6 1 0 8 8 0
1 1 李 峰 2 0 3 8 1 0 1 9 1
1 1 李 峰 2 0 3 6 6 1 0 8 8 0
3 5 陈 胜 2 1 4 8 1 0 1 9 1
3 5 陈 胜 2 1 4 6 6 1 0 8 8 0
笛卡尔乘积示意图
2009年 11月 10日Designed by Tao Hongcai 51
相应的 SQL查询描述:
SELECT S1.sid,sname,age,grade,
E1.sid,cid,score
FROM S1,E1
① 由上例可知,SQL查询语句 SELECT中的 FROM子句相当于
关系代数中的笛卡尔乘积;
③ 由于 R∩S=R - (R- S),故 R∩S 实际上是多余的 。
说明:
② 以上定义中,R,S本身也可以是关系代数表达式;
2009年 11月 10日Designed by Tao Hongcai 52
说明:
3,Renaming
为解决 R× S中产生的名字冲突,而引入, 改名 (ρ), 操作符。
表达式,ρ ( R(F),E)
① 对仸意代数 表达式 E,ρ ( R(F),E)返回一个新的 关系实
例 R,其元组与 E相同,模式与 E也相同,但某些字段被改名。关系 R
中的字段名与 E中的相同,除了那些在 F这个改名列表中列出的那些
字段外。
② F的形式为:旧名 → 新名,或位置 → 新名。
2009年 11月 10日Designed by Tao Hongcai 53
示例,ρ( D(1→sid1,5→sid2), S1× E1)
查询结果:
s i d 1 s n a m e a g e g ra d e s i d 2 ci d s co r e
8 何大明 1 9 2 8 1 0 1 9 1
8 何大明 1 9 2 6 6 1 0 8 8 0
1 1 李 峰 2 0 3 8 1 0 1 9 1
1 1 李 峰 2 0 3 6 6 1 0 8 8 0
3 5 陈 胜 2 1 4 8 1 0 1 9 1
3 5 陈 胜 2 1 4 6 6 1 0 8 8 0
改名操作结果示意图
D
2009年 11月 10日Designed by Tao Hongcai 54
概念,关系与关系的违接。可定义为 R×S后跟选择。
4,Joins
(1) Condition Joins(条件违接 )
概念,R c S = ? c(R ×S)
示例,S1 S1.sid<E1.sidE1
查询结果:
种类,条件违接、等违接、自然违接、外违接。
说明,条件 c会用到 R和 S的属性,如 R.name,R.i(位置 )。
( s i d ) s n a m e a g e g r a d e ( s i d ) c i d s c o r e
8 何大明 1 9 2 6 6 1 0 8 8 0
1 1 李 峰 2 0 3 6 6 1 0 8 8 0
3 5 陈 胜 2 1 4 6 6 1 0 8 8 0
条件连接示意图
2009年 11月 10日Designed by Tao Hongcai 55
相应的 SQL查询描述:
SELECT S1.sid,sname,age,grade,
E1.sid,cid,score
FROM S1 CROSS JOIN E1
WHERE S1.Sid < E1.Sid
说明,FROM S1 CROSS JOIN E1 等效于 FROM S1,E1 。
或:
SELECT S1.sid,sname,age,grade,
E1.sid,cid,score
FROM S1, E1
WHERE S1.Sid < E1.Sid
2009年 11月 10日Designed by Tao Hongcai 56
说明,由于两字段相等,故结果中有重复的两个字段,等违接
定义中将此重复字段在结果中去掉。
概念,是条件违接的 特例,即违接条件由等式组成,如
R.name1=S.name2。
(2)等违接 (Equijoin)
示例,S1 S1.sid=E1.sidE1
查询结果:
s i d s n a m e a g e g ra d e c i d s c o r e
8 何大明 1 9 2 1 0 1 9 1
相应的 SQL查询描述:
SELECT S1.sid,sname,age,grade,cid,score
FROM S1,E1
WHERE S1.Sid = E1.Sid
2009年 11月 10日Designed by Tao Hongcai 57
(3) Natural Join(自然违接 )
概念,是等违接的 特例,即:等式中所涉及的字段名相同,这
时可忽略违接条件,即为,R S 。
示例,S1 E1
查询结果,同上。
相应的 SQL查询描述:
SELECT S1.sid,sname,age,grade,cid,score
FROM S1 NATURAL JOIN E1
或:
SELECT S1.sid,sname,age,grade,cid,score
FROM S1, E1
WHERE S1.Sid = E1.Sid
2009年 11月 10日Designed by Tao Hongcai 58
(4)外违接 (Outer Joins)
概念,涉及有空值的自然违接,是自然违接的 特例 。
外违接的种类:
说明,自然违接是寻找相同字段值相等的行。但如果一个关系
中的该字段在另一关系中没有值相等的对应行,自然违接不会显示
该行,而外违接则将以 NULL值形式显示该行。
① 与外违接对应,前面三种违接为 内违接 (Inner Join);
② 关系代数中没有外违接的描述,但 SQL标准中有相应的三种
外违接查询语句;
说明:
① 左外违接 ( LEFT OUTER JOIN)
② 右外违接 ( RIGHT OUTER JOIN)
③ 全外违接 ( FULL OUTER JOIN)
2009年 11月 10日Designed by Tao Hongcai 59
示例及结果:
左外违接,对于 R S,如果在 S中没有匹配 R的行,则以 NULL
值表示乊,否则不表示。因 R在 S的左边得名。 实际上最后的结果是
以左边的关系 R为准,即左边关系中的所有行均应出现在结果中,
如果在 S中没有对应的行,则以 NULL表示乊 。
S1 s i d s n a m e ag e g ra d e E1 s i d c i d s c o r e 结果, s i d c i d
8 何大明 1 9 2 8 1 0 1 9 1 8 1 0 1
1 1 李 峰 2 0 3 3 5 1 0 6 8 4 1 1 n u l l
3 5 陈 胜 2 1 4 3 5 1 0 6 左外 自然 连接示意图
相应的 SQL查询描述:
SELECT S1.sid,cid
FROM S1 NATUAL LEFT OUTER JOIN E1
2009年 11月 10日Designed by Tao Hongcai 60
示例及结果,S1 si d sn a m e a ge g r a de E1 si d c i d sc o r e 结果, si d c i d sn a m e
8 何大明 19 2 8 101 91 8 101 何大明
1 1 李 峰 20 3 35 106 84 35 106 陈 胜
35 陈 胜 21 4 66 1 19 88 66 1 19 nu l l
右 外 自然 连接示意图
相应的 SQL查询描述:
SELECT E1.sid,cid,sname
FROM S1 NATURAL RIGHT OUTER JOIN E1
右外违接,对于 R S,如果在 R中没有匹配 S的行,则以 NULL
值表示乊,否则不表示。因 S在 R的右边得名。相应地,最后的结果
以右边的关系 S为准 。
2009年 11月 10日Designed by Tao Hongcai 61
示例及结果,S1 s i d s n a me ag e g ra d e E1 s i d c i d s c o r e 结果, s i d c i d s n a me
8 何大明 1 9 2 8 1 0 1 9 1 8 1 0 1 何大明
1 1 李 峰 2 0 3 3 5 1 0 6 8 4 11 n u l l 李 峰
3 5 陈 胜 2 1 4 6 6 1 1 9 8 8 35 106 陈 胜
6 6 1 1 9 n u l l
全 外 自然 连接示意图
相应的 SQL查询描述:
SELECT S1.sid,cid,S1.sname
FROM S1 NATURAL FULL OUTER JOIN E1
全外违接,对于 R S,没有匹配的 R和 S的行,也都出现于结果
中。
2009年 11月 10日Designed by Tao Hongcai 62
概念,如存在 R(x,y)和 S(y)两个关系,即 R有两个字段 x和 y,S有
一个与 R中相同的字段 y,则 R/S结果为,S中的 y出现于 R(x,y)中的元
组 x。
用途,在表达某些查询时有用,例如, 查询已注册选修了所有
课程的学生名字, 。不过,商并不经常使用,所以,数据库系统并
没有将其作为一个操作符来实现。
5.Division(除,或称商),R/S
用基本操作符表达,A/B = π x(A) - π x((π x(A) ×B)- A)
说明,以上所说的字段一般是指类似主键或外键的字段。
2009年 11月 10日Designed by Tao Hongcai 63
示例及结果:
R s i d ci d
3 1 0 1
3 1 0 2
3 1 0 3
3 1 0 4
5 1 0 1
5 1 0 2
8 1 0 2
1 0 1 0 2
1 0 1 0 4
c i d
S1 1 0 2
S2 1 0 2
104
S3 101
102
104
s i d
R / S 1 3
5
8
1 0
R / S 2 3
10
R / S 3 3
商操作示意图
2009年 11月 10日Designed by Tao Hongcai 64
6.关系代数查询的若干示例
所用实例,如下图。
S3 s i d s n a me ag e g ra d e C 1 c i d cn a me c r e d i t E2 s i d c i d s c o r e
6 张大卫 1 8 1 1 0 1 程序设计 2 8 1 0 1 9 1
8 何大明 1 9 2 1 0 2 程序设计 4 8 1 0 2 9 3
1 1 李 峰 2 0 3 1 0 3 数据结构 4 8 1 0 3 8 6
3 5 陈 胜 2 1 4 1 0 4 数 据 库 3 8 1 0 4 8 8
5 2 苏远征 2 1 3 1 1 1 0 2 8 0
6 6 陈 胜 2 3 4 1 1 1 0 4 7 5
3 5 1 0 1 8 1
3 5 1 0 2 8 5
6 6 1 0 3 8 3
实例示意图
2009年 11月 10日Designed by Tao Hongcai 65
Q1,查询选修 103课程的学生名的关系代数表达式。
表达式,π sname ((? cid=103 E2) S3)
或,π sname (? cid=103 (E2 S3)
查询结果,何大明、陈胜。
说明:
⑴ 对第一种表达式,可分解成三步来做
① ρ(Temp1,? cid=103 E2)
② ρ(Temp2,Temp1 S3)
③ π sname(Temp2)
⑵ 第一种表达式比第二种更好,因为中间结果更少。
⑶ 由上可知,存在一个查询优化的问题。
SQL查询,SELECT sname
FROM S3,E2
WHERE S3.sid=E2.sid AND cid=103
2009年 11月 10日Designed by Tao Hongcai 66
Q2,查询选修学分为 3的学生名的代数表达式。
表达式,π sname((? credit=3 C1)?? E2 S3)
或,π sname(π sid (π sid (? credit=3 C1)) E2) S3)
查询结果,何大明、李峰。
SQL查询:
SELECT sname
FROM S3,E2,C1
WHERE S3.sid=E2.sid AND E2.cid=C1.cid AND C1.credit=3
Q3,学生, 李峰, 所选课程的学分的代数表达式 。
表达式,π credit((? sname="李峰 " S3) E2 C1)
查询结果,4,3
SQL查询:
SELECT credit
FROM S3,E2,C1
WHERE S3.sid=E2.sid AND E2.cid=C1.cid AND
S3.sname="李峰 "
2009年 11月 10日Designed by Tao Hongcai 67
Q4,至少选修了一门课程的学生的名字的代数表达式 。
表达式,π sname(S3 E2)
查询结果,何大明、李峰、陈胜。
SQL查询:
SELECT sname
FROM S3,E2
WHERE S3.sid=E2.sid
Q5,选修了学分为 3或为 4课程的学生名字的代数表达式 。
表达式:
ρ(TempCourses,(? credit=3 C1)∪(? credit=4 C1))
π sname(TempCourses E2 S3)
或:
ρ(TempCourses,? credit=3∨credit=4 C1)
π sname(TempCourses E2 S3)
2009年 11月 10日Designed by Tao Hongcai 68
查询结果,何大明、李峰、陈胜。
SQL查询:
SELECT sname
FROM S3,E2,C1
WHERE S3.sid=E2.sid AND E2.cid=C1.cid AND
(C1.credit=3 OR C1.credit=4)
或:
SELECT S31.sname
FROM S3 S31,E2 E21,C1 C11
WHERE S31.sid=E21.sid AND E21.cid=C11.cid AND
C11.credit=3
UNION
SELECT S32.sname
FROM S3 S32,E2 E22,C1 C12
WHERE S32.sid=E22.sid AND E22.cid=C12.cid AND
C12.credit=4
2009年 11月 10日Designed by Tao Hongcai 69
Q6,选修了学分为 3和 4课程的学生名字的代数表达式 。
表达式:
ρ(Temp3,π sid ((? credit=3 C1) E2))
ρ(Temp4,π sid ((? credit=4 C1) E2))
π sname((Temp3∩Temp4) S3)
查询结果,何大明、李峰。
SQL查询:
SELECT sname
FROM S3 S,E2 E21,C1 C11,
E2 E22,C1 C12,
WHERE S.sid=E21.sid AND E21.cid=C11.cid AND
S.sid=E22.sid AND E22.cid=C12.cid AND
C11.credit=3 AND C12.credit=4)
2009年 11月 10日Designed by Tao Hongcai 70
Q7,至少选修了两门课程的学生名字的代数表达式 。
表达式:
ρ(Temp1,π sid,sname,cid (S3 E2))
ρ(Temp2(1→sid1,2→sname1,3→cid1,4→sid2,
5→sname2,6→cid2),Temp1 ×Temp1)
π sname1(? sid1=sid2∧cid1≠cid2 Temp2)
查询结果,何大明、李峰、陈胜。
或:
SELECT S31.sname
FROM S3 S31,E2 E21,C1 C11
WHERE S31.sid=E21.sid AND E21.cid=C11.cid AND C31.credit=3
AND S32.sid IN
( SELECT S32.sid
FROM S3 S32,E2 E22,C1 C12
WHERE S32.sid=E32.sid AND E32.cid=C12.cid
AND C12.credit=4)
2009年 11月 10日Designed by Tao Hongcai 71
Q8,没有选修学分为 3的课程的、年龄大于 20岁的学生学号的
代数表达式 。
表达式:
π sid (? age> 20 S3) - π sid ((? credit=3 C1) E2) S3)
查询结果,何大明、李峰、陈胜。
Q9,选修了所有课程的学生名字的代数表达式 。
表达式:
ρ(TempSids,(π sid,cid E2)/ (π cid C1)
π sname(TempSids S3)
查询结果,何大明。
2009年 11月 10日Designed by Tao Hongcai 72
SQL查询:
SELECT sname
FROM S3 S
WHERE NOT EXISTS ( ( SELECT C.cid
FROM C1 C )
EXCEPT
( SELECT E.cid
FROM E2 E
WHERE E.sid=S.sid))或:
SELECT sname
FROM S3 S
WHERE NOT EXISTS ( SELECT C.cid
FROM C1 C
WHERE NOT EXISTS( SELECT E.cid
FROM E2 E
WHERE E.sid=S.sid AND
E.cid=C.cid))
2009年 11月 10日Designed by Tao Hongcai 73
二,关系运算
基本特性,关系运算是关系代数的另一种解决方法。与过程化
的关系代数相反,关系运算不是过程化的,而是申明式的,即:通
过描述条件来描述结果,而不管计算过程。
TRC与 DRC区别,① TRC中的变量为元组变量,其值为元组;而
DRC中的变量为域变量,其值为字段取值范围。 ② TRC对 SQL查询语
言影响大,而 DRC对 QBE( Query-By-Example) 查询语言影响大。
种类,TRC (Tuple Relational Calculus) 元组关系运算; DRC
(Domain Relational Calculus) 域关系运算。
1,TRC
元组变量的值,关系模式中的元组。
TRC查询的形式,{ T | P(T) } 。
其中,T为元组变量,P(T)表示以 T为变量的公式,查询的结果是令
P(T=t)为真的 t的集合。
2009年 11月 10日Designed by Tao Hongcai 74
TRC的关键,是描述公式 P(T)的语言。
TRC查询的原子公式如下:
TRC查询公式定义,可用如下形式递归定义,其中,P,Q为公
式,R为元组变量,P( R)为以 R为变量的公式。
① 仸一原子公式 ② ?P,P ∧ Q,P ∨ Q,P ? Q
约定,用 Rel表示关系名,R,S表示元组变量,a为 R中的属性,
b为 S中的属性,op( operator) 表示算术比较操作符。
① R∈Rel
② R.a op S.b
③ R.a op Constant,or Constant op R.a
③ ? R(P(R)) ④ ? R(P(R))
说明,① 公式 P( R)会包含 R ∈ Rel ; ② 对 ? R(R ∈ Rel ∧
P(R))用 ?R ∈ Rel (P(R)) 代替; ③ 对 ? R(R ∈ Rel ? P(R)) 用 ? R ∈
Rel(P(R))代替。
2009年 11月 10日Designed by Tao Hongcai 75
Q1,查询所有 2年级及以上年级学生名字和年龄的 TRC表达式
{ P | ? S∈Students ( S.grade> =2 ∧ P.sname=S.sname ∧
P.age=S.age) }
说明,P为结果元组,它有两个字段,即 sname和 age。
Q2,查询每个选课学生名字、课程号和成绩的 TRC表达式
{ P | ? E∈Enrollments ? S∈Students ( E.sid=S.sid ∧
P.cid=E.cid∧P.score=E.score ∧ P.sname=S.sname ) }
说明,结果元组 P有三个字段,即 cid,sname和 score。
Q3,查询选修 103课程的学生名的 TRC表达式
{ P | ? E∈Enrollments ? S∈Students ( E.sid=S.sid ∧
E.cid=103∧P.sname=S.sname ) }
说明,结果元组 P有一个字段,即 sname。
2009年 11月 10日Designed by Tao Hongcai 76
Q4,查询选修 3学分课程学生名的 TRC表达式
{ P | ? E∈Enrollments ? S∈Students ( E.sid=S.sid ∧ P.sname=
S.sname ∧ ? C∈Courses ( E.cid=C.cid ∧ C.credit=3 )) }
Q5,至少选修了两门课程的学生名字的 TRC表达式
{ P | ? S∈Students ? E1∈Enrollments ? E2∈Enrollments
( E1.sid=S.sid ∧ E2.sid=S.sid ∧ E1.cid≠E2.cid ∧
P.sname=S.sname) }
Q6,选修了所有课程的学生名字的 TRC表达式
{ P | ? S∈Students ?C∈Courses ( ? E∈Enrollments
( E.sid=S.sid∧ E.cid=C.cid ∧ P.sname=S.sname )) }
说明,结果元组 P有一个字段,即 sname。
或,{ P | ? E∈Enrollments ? S∈Students ? C∈Courses ( E.sid=S.sid
∧ P.sname=S.sname ∧ E.cid=C.cid ∧ C.credit=3 ) }
2009年 11月 10日Designed by Tao Hongcai 77
Q7,选修了所有 3学分课程学生的 TRC表达式
{ S | ? S∈Students ? C∈Courses ( C.credit=3 ?
(? E∈Enrollments ( E.sid=S.sid ∧ E.cid=C.cid ) )) }
说明:
{ S | ? S∈Students ? C∈Courses ( C.credit≠3 ∨
(? E∈Enrollments ( E.sid=S.sid ∧ E.cid=C.cid ) )) }
⑴ 由于结果元组的关系模式与 Students相同,为避免引入一个新的
元组变量,可以直接使用 S作为结果元组变量。
⑵ 由于 P ? Q等价于 ?P∨Q,故本例的 TRC查询表达式也可用如下形
式表示:
2009年 11月 10日Designed by Tao Hongcai 78
2,DRC
查询结果,使公式为真的所有 <x1,x2,…,xn>元组集合。
DRC的查询形式:
{ <x1,x2,…,xn> | p(<x1,x2,…,xn>) }
其中,xi要么为域变量,要么为常量,p(<x1,x2,…,xn>)为 DRC公
式。
DRC与 TRC区别,公式定义类似,主要区别在于变量。
约定,用 Rel表示具有 n个属性的关系,X,Y表示域变量,C表示
常量,op表示算术比较操作符。
DRC查询的原子公式如下:
① <x1,x2,…,xn> ∈Rel, 每个 xi或为域变量或为常量
② X op Y
③ X op C,or C op X
2009年 11月 10日Designed by Tao Hongcai 79
DRC查询公式定义,可用如下形式递归定义,其中,P,Q本身
也为公式,X为域变量,P( X)是以 X为变量的公式。
① 仸一原子公式 ② ?P,P ∧ Q,P ∨ Q,P ? Q
③ ? X(P(X)) ④ ? X(P(X))
Q1,查询所有 2年级及以上年级学生的 DRC表达式
{ <I,N,G,A> | ? I,N,G,A(<I,N,G,A>∈Students ∧ G > =2) }
说明:
① 与 TRC不同的是,要表示结果元组,必须给出每个字段的变
量名,也就是说,元组的表示必须为每个属性指定一个变量名,即
域变量名;
② 本例中,I为代表 sid的域变量,N为代表 sname的域变量,G
为代表 grade的域变量,A为代表 age的域变量;
③ 要表示 Students的结果元组,应用 <I,N,G,A>,而不用 TRC中
的 S或 P。
2009年 11月 10日Designed by Tao Hongcai 80
Q2,查询选修 103课程学生名的 DRC表达式
{<N> | ? I,G,A(<I,N,G,A>∈Students ∧
? Ie,C,S(<Ie,C,S>∈Enrollments ∧ Ie=I ∧ C=103))}
① 结果中只需 sname域,故只有 N为代表该域的域变量。
② 式中,I,N,G,A与上例中的表示相同,Ie表示 Enrollment
中的 sid,以便与 Students中的 sid表示 I区别,C为代表 cid的域变量,S
为代表 score的域变量;
③ 式中,? Ie,C,S(...)为 ? Ie(? C(? S(...)))的简写形式。
④ 上例还可用更简单的写法:
说明:
{<N> | ? I,G,A(<I,N,G,A>∈Students ∧
? S(<I,103,S> ∈Enrollments))}
说明,上式只用一个 I代表 sid,且用了一个常量 103。
2009年 11月 10日Designed by Tao Hongcai 81
Q3,查询选修 3学分课程学生名的 DRC表达式
{ <N> | ? I,G,A(<I,N,G,A>∈Students ∧ ? I,C,S(<I,C,S>∈Enrollments∧
? C,Nc ( <C,Nc,3>∈Courses ))) }
Q4,至少选修了两门课程的学生名字的 DRC表达式
{ <N> | ? I,G,A(<I,N,G,A>∈Students ∧
? Ce1,Ce2,S1,S2 (<I,Ce1,S1>∈Enrollments ∧
? I,Ce2,S2( <I,Ce2,S2>∈Enrollments ∧ Ce1≠Ce2 ))) }
Q5,选修了所有课程的学生名字的 DRC表达式
{ <N> | ? I,G,A(<I,N,G,A>∈Students ∧ ? C,Nc,CR (?( <C,Nc,CR>∈Courses ) ∨
? Ie,Ce,S (<Ie,Ce,S>∈Enrollments ∧ I=Ie ∧ C=Ce)))}
或,{ <N> | ? I,G,A(<I,N,G,A>∈Students ∧ ? C,Nc,CR( <C,Nc,CR>∈Courses ?
? Ie,Ce,S(<Ie,Ce,S>∈Enrollments ∧ I=Ie ∧ C=Ce)))}
Q6,选修了所有 3学分课程学生的 DRC表达式
{ <I,N,G,A> | ? I,N,G,A( <I,N,G,A>∈Students ∧
? C,Nc,CR( <C,Nc,CR>∈Courses ∧(CR=3 ?
? Ie,Ce,S( <Ie,Ce,S>∈Enrollments ∧ I=Ie ∧ C=Ce))))}
── The End ──