第四章 关系数据库
4.1 关系模型的基本概念
4.1.1 数学定义
定义 4.1 域 (Domain)是值的集合,
定义 4.2 给定一组域 D1,D2,…,D n,这些域中可以有相同的
D1,D2,…,D n的笛卡尔积 (Cartesian Product)为
D1× D2× … × Dn={(d1,d2,…,d n)│di∈ Di,i=1,2,…,n }
其中每一个元素 (d1,d2,…,d n)叫作一个 n元组,或简称
为元素,元素中每一个值 di叫做一个分量,
若 Di(i=1,2,…,n) 为有限集,其基数为 mi(i=1,2,…,n),
则 D1× D2× … × Dn的基数为 m=∏mi
n
i =1
定义 4.3 D1× D2× … × Dn 的子集叫做在域 D1,D2,…,Dn上的关系,
用 R(D1,D2,…,Dn) 表示,这里 R表示关系的名字,n是关系的目或度,
当 n=1时,称为单元关系,
当 n=2时,称为二元关系,
关系是一张二维表,表的每一行对应一个元组,表的每一列对应一
个域,由于域可以相同,为了加以区分,对每列取一个名字,称为属性,n目
关系必有 n个属性,
在上述例子中取出笛卡尔积的一个子集来构造一个关系,这个关
系的名字为 FAMILY(家庭 ),属性名就取域名,即 MAN,WOMAN与
CHILD.这个关系可表示为 FAMILY(MAN,WOMAN,CHILD).
MAN WOMAN CHILD
王 兵 丁 梅 王 一
李 平 吴 芳 李 一
李 平 吴 芳 李 二
FAMILY
在关系数据库中,我们能否把关系 FAMILY定义成如下的形式呢?
MAN WOMAN CHILD
FIRST SECOND
王兵 丁梅 王一
李平 吴芳 李一 李二
数据库中的关系有以下性质,
1、列是同性质的,即每一列中的分量是同一类型的数据,来自同一个域。
2、不同的列可出自同一个域,每一列称为属性,要给予不同的属性名。
3、列的顺序无所谓,即列的次序可以任意交换。
4、任意两个元组不能全同。
5、行的顺序无所谓,即行的次序可以任意交换。
6、每一分量必须是不可分的数据项。
4.1.2 关 系 模 型
一、单一的数据结构 —— 关系
1、码
(1),候选码
(2),主码、主属性
2、关系模式
关系的描述称为关系模式。通常记为:
R(A1,A2…,An)。 R为关系名,A1,A2…,An为属性名,属性向域的
映象常常直接说明为属性的类型、长度。
3、关系数据库
(1).关系数据库的型
(2).关系数据库的值
二、关系操作
关系模型给出了关系操作的能力和特点,但不对 DBMS的语言
给出具体的语法要求。关系语言的特点是高度非过程化。
关系模型中,关系操作的能力可用关系代数来表示。常用的几
种如下:
1,θ选择
2,投影
3,θ连接
4,除
5,并
6,交
7,差
三、关系模型的三类完整性
实体完整性、参照完整性和用户定义的完整性。
1、实体完整性
设属性 A是基本关系 R的主码组成成分(主属性),则属性 A
不能取空值。
对实体完整性的 4点说明:
2、参照完整性
若基本关系 R中含有与另一个基本关系 S的主码 Ks相对应的属性
组 F,则对于 R中每个元组在 F上的值必须为,(1)取空值,(2)或者等于 S
中某个元组的主码值。
如职工关系 EMP(ENO,ENAME,DNO)与
部门关系 DEPT(DNO,DNAME)
3、用户定义完整性
4.2 关系数据语言概述
关系的数据操纵语言按照表达查询的方式可分为两大类,
1,用对关系的运算来表达查询的方式,称为关系代数,
2,用谓词来表达查询要求的方式,称为关系演算,
(1)元主关系演算
(2)域关系演算
关系代数和两种关系演算均是抽象的查询语言,
这三种语言在表达能力上是彼此等价的,它们能用作评估实际
系统中查询语言能力的标准或基础,
实际的查询语言除了提供关系代数的功能外,还提供了许多附加
的功能,如库函数、关系赋值、算术运算等功能。
4.3 关 系 代 数
一、关系代数的运算的分类
1,传统的集合运算
2,专门的关系运算
关系代数的运算对象是关系,运算结果亦为关系。
二、关系代数用到的运算符
(1)集合运算符, ∪ (并 ),- (差 ),∩(交 ),× (广义笛卡尔积 )
(2)专门的关系运算符, σ(选择 ),π(投影 ),(连接 ),÷ (除 )
(3)算术比较符 θ={>,≥,<,≤,=,≠}
(4)逻辑运算符, ┐,∧,∨
4.3.1 传统的集合运算
设关系 R和关系 S具有相同的目 n,且相应的属性取自同一个域,
则可以定义四种运算如下,
1,并 (Union)
关系 R和关系 S的并记为 R∪ S,结果仍为 n目关系,由属于 R或属
于 S的元组组成, R∩S
2,差 (Difference)
关系 R和关系 S的差记为 R-S.结果仍为 n目关系,由属于 R而不属
于 S的元组组成,
3,交 (Intersection)
关系 R和关系 S的交记为 R ∩ S,结果仍为 n目关系,由既属于 R有
属于 S的元组组成, 关系的交可由关系的差表示,即 R∩S=R-(R-S).
4,广义笛卡尔积 (Extended cartesian product)
两个分别为 n,m目阿关系 R和 S的广义笛卡尔积 R× S是一个
(n+m)元组的集合,元组的前 n个分量是 R的一个元组,后 m个分量是 S
的一个元组,若 R有 k1个元组,S有 k2个元组,则 R× S有 k1× k2个元组,
A B C
a1
a1
a2
b1
b2
b2
c1
c2
c1
A B C
a1
a1
a2
b2
b3
b2
c2
c2
c1
R S
A B C
a1
a1
a2
a1
b1
b2
b2
b3
c1
c2
c1
c3
A B C
a1 b1 c1
A B C
a1
a2
b2
b2
c2
c1
图 4-1 ( c )R∪ S 图 4-1 ( e )R∩S图 4-1 ( d ) R-S
( a ) ( b )
4.3.2 专门的关系运算
一, 几个记号
1,设关系模式为 R(A1,A2,…,An),它的一个关系设为 R,T∈ R
表示 t是 R的一个元组。 T[Ai]则表示元组 t中相应属于 Ai的一个分量。
2.若 A={Ai1,Ai2,Ai3,…,Aik},其中 Ai1,Ai2,Ai3,…,Aik 是
A1,A2,A3,…,An 中的一部分,则 A称为属性列或域列,A则表示
{A1,A2,A3,…,An} 中去掉 {Ai1,Ai2,Ai3,…,Aik} 后剩余的属性
组,t[A]=(t[Ai1],t[Ai2],…,t[Aik]) 表示元组 t在属性列 A上诸分量的集合,
3,R为 n目关系,S为 m目关系
tr ∈ R,ts ∈ S
tr ts 称为元组的连串 (Concatenation).这是一个 (n+m)元组,前 n个
分量是 R的一个 n元组,后 m个分量是 S中的一个 m元组,
4,给定一个关系 R(X,Z),X,Z为属性组, 我们定义当 X=x时,x在
R中的象集 (Image Set)为,
Zx={t[z]| t∈ R,t[X]=x}
表示 R中属性组 X上值为 x的诸元组在 Z上分量的集合,

二, 关系运算
1,选择 (Selection),亦称为限制 (Restriction).
在关系 R中选择满足给定条件的诸元组,记为,
σF( R)={t|t∈ R∧ F(t)=‘真’ }
F是一个公式,它的取值为‘真’或‘假’,
F由逻辑运算符 (∧,∨,┐)连接各算术表达式组成,
选择运算是从关系 R中选取使公式 F为真的元组,这是从行的角度
进行的运算,
举例说明选择运算,
设有学生 —— 课程关系数据库,学生关系 S、课程关系 C和学
生选课关系 SC,分别如图 4-2 (a ),( b ),( c )所示
S# SN SD SA
S1
S2
S3
S4
S5
S6
A
B
C
D
E
F
CS
CS
MA
CI
MA
CS
20
21
19
19
20
22
S
C# CN PC#
C1
C2
C3
C4
C5
G
H
I
J
K
——
C1
C1
C2
C4
C
S# C# G
S1
S1
S1
S1
S2
S2
S2
S3
S3
S3
S4
S4
S5
S5
S5
S6
S6
C1
C2
C3
C5
C1
C2
C4
C2
C3
C4
C3
C5
C2
C3
C5
C4
C5
A
A
A
B
B
C
C
B
C
B
B
D
C
B
B
A
A
SC
( a )
( b )
( c )图 4-2
例 1,求计算机科学系 CS的学生
解, 在学生关系中找出 SD为‘ CS’的学生,
σSD=‘CS’(S)或 σ3=‘CS’(S)
结果如图 4-3.
S# SN SD SA
S1
S2
S6
A
B
F
CS
CS
CS
20
21
22
图 4-3
例 2,求年龄大于或等于 20的元组,
解, 在学生关系中找出 SA大于或等于 20的学生,
即, σ SA≥‘20’(S)或 σ4≥‘20’(S)
S# SN SD SA
S1
S2
S5
S6
A
B
E
F
CS
CS
MA
CS
20
21
20
22
结果如图 4-4
图 4-4
2,投影 (Projection)
关系 R上的投影是从 R中选择若干属性列组成新的关系,记作,
πA( R )={t[A] | t ∈ R}
A为 R中的属性列,
例 3,求学生关系 S在学生姓名和所在系这两个属性上的投影,
解, πSN,SD( S )或 π2,3( S )
结果如图 4-5所示,
例 4,⑴ 求学生选课关系 SC在学号和成绩两个属性上的投影,
⑵ 求学生选课关系 SC在课程号和成绩两个属性上的投影,
解, ⑴, πS#,G( SC )或 π1,3( SC ) 结果如图 4-6 ( a )
⑵, πC#,G( SC )或 π2,3( SC ) 结果如图 4-6 ( b )
3,连接 (Join)亦称为 θ连接
连接运算是从两个关系的笛卡尔积中选取属性间满足一定条件
的元组,记作,
R∞S = { tr ts | tr∈ R∧ ts∈ S ∧ tr[A] θts[B]}AθB ⌒
自然连接 (Natural join)是一种特殊而常用的连接,若 R和 S具有
相同的属性组 B,则自然连接定义如下,
R∞S = { tr ts[B] | tr∈ R∧ ts∈ S ∧ tr[B] =ts[B]}⌒
例 5,设关系 R,S分别为图 4-7中的 ( a),(b ).
R∞S 的结果如图 4-7( c ).
R∞S 自然连接的结果如图 4-7( d ).
C<E
4,除 (Division)
给定关系 R(X,Y)与 S(Y,Z),其中 X,Y,Z为属性列,R中的 Y与 S中的
Y可以有不同的属性名,但必须出自相同的域集,定义除法,
R÷ S={tr[X] | tr∈ R∧ Yx πr(S )}
Yx为 x在 R中象集,x= tr[X],
除法结果是 R中满足下列条件的元组在 X属性列上的投影,
元组在 X上分量值 x的象集 Yx包含 S在 Y上投影的集合,

例, 求至少选修 C1,C3课程的学生的学号 (图 4-2P101)
解, 设一个临时关系 K,C#
C1
C3
则所求结果为,
π S#,C#(SC)÷ K={S1}
4.4 关系演算
关系演算按谓词变元的不同可分为元组关系演算和域关系演算,
我们首先介绍元组关系演算然后介绍域关系演算,都是先讨论抽象语
言然后介绍一种实际语言。
4.4.1 元组关系演算
元组关系演算用表达式
{t | φ(t)} [说明,φ应为小写,因计算机中无此符号 ]
来表示,其中 t为元组变量, φ(t)是由原子公式和运算符组成的公式,
一, 原子公式,
1,R(t).R是关系名,t是元组变量,R(t)表示 t是 R中的一个元组,即 t∈ R.
2,t[i]θu[j],t 和 u是元组变量,θ是算术比较符,
3,t[i]θC 或 Cθ t[i],表示? t的第 i个分量与常量 C之间满足比较
关系 θ”.
二, 公式可以递归定义
1,每个原子公式是一个公式,
2,设 φ1和 φ2是公式,则 ┐φ1,φ1∧ φ2,φ1∨ φ2也是公式,
3,若 φ是公式,t是元组变量,则 ( t )φ ( t) φ也是公式,
4,公式中运算符的优先次序为,
( ) 算术比较符 量词 (, ) ┐ ∧ ∨
5,公只限于上述这些,
E A
A E
元组关系表达式 {t | φ(t)},表示使 φ为真的元组集合,
三, 用关系演算表达式表示 5种关系代数的基本运算,
1,并
R∪ S={ t |R( t)∨ S(t )}
2,差
R-S={t | R(t)∧ ┐S(t)}
3,笛卡尔积
4,投影
πi1,i2,…,ik (R)={t | ( u)(R(u)∧ t[1]=u(i1)∧ …t[k]=u[i k])}(k) E
5,选择
σF(R)={ t| R(t)∧ F’}
四, 举例
例 1 求计算机科学系 CS的学生
SCS={ t| S( t) ∧ t[3]=‘CS’}
例 2,求年龄大于或等于 20的学生,
S20={ t| S( t) ∧ t[4]≥‘20’}
例 3,求学生姓名及所在的系
S1={t | ( u)(R(u)∧ t[1]=u[2])∧ t[2]=u[3])}(2) E
五, 元组演算表达式的安全性
1、无限关系
{t | ┐R(t)}表示所有不属于 R的元组。
2、安全表达示
* 安全表达式
* 安全限制
* DOM(φ)—— 一个有限符号集
当满足下列条件时,元组演算表达式 {t | φ( t)}是安全的,
1,如果 t使 φ( t)为真,则 t的每个分量是 DOM(φ)中的元素,
2,对于 φ中每一个形如 ( u) (w(u))的子表达式,若 u使 w(u)为真,
则 u的每个分量是 DOM(φ)中的元素,
3,对于 φ中每一个形如 ( u) (w(u))的子表达式,若 u使 w(u)为假,
则 u的每个分量必属于 DOM(φ).换言之,若 u的某一分量不属于
DOM(φ),则 w(u)为真,
E
A
例, 设有关系 R如图 4-8( a),S={t | ┐R( t)},若不进行安全限制,则
可能是一个无限关系,所以令
DOM(φ)=πA(R)∪ πB( R)∪ πC(R)
={{a1,a2},{b1,b2},{c1,c2}}
则 S是 DOM(φ)中各元素的笛卡尔积与 R的差集,结果如图 4-8(b).
4.4.2 一种元组关系演算语言 —— ALPHA
★ ALPHA语言的基本格式
操作语句 工作空间名 (表达式 ),公式
各部分的具体说明,
<操作语句 >::=GET | PUT | HOLD | UPDATA | DELETE |DROP
<表达式 >::=(<简单项 1>,<简单项 2>,…,< 简单项 n>).
<简单项 1>::=<关系名 >|<关系名 >.<属性名 >|<元组变量 >.<属性名 >
公式的基本元素是原子公式
<公式 >::=<原子公式 >|┐ <公式 >| <公式 >∧ <公式 >| <公式 > ∨ <
公式 >| x <公式 >| x <公式 > | <公式 > <公式 > |<空 >
<原子公式 >::=<简单项 >关系算符 <简单项 >| <简单项 >关系算符 <常量 >
E A
一, 检索操作
1,简单检索
例 1,求所有被选修的课程的课程号码,
GET W (SC.C#)例 2,求所有学生的数据,
GET W (S)
2,限定的检索
例 3,求数学系 (MA)中年龄小于 20岁的学生的学号和年龄,
GET W (S.S#,S.SA),S.SD=‘MA’∧ S.SA<’20’
3,带排序的检索
例 4,求计算机科学系 (CS)的学生的学号和年龄,并按年龄降序排列,
GET W (S.S#,S.SA),S.SD=‘CS’ DOWN S.SA
4,带定额的检索
例 5,取出一个计算机科学系学生的学号,
GET W (1) (S.S#),S.SD=‘CS’
5,用元组变量的检索
例 6,求选修课程 C2的学生的学号 S#.
设学生选修课程的关系名不是 SC,而是 STUDENT-COURSE.
RANGE STUDENT-COURSE X
GET W (X.S#),X.C#=‘C2’
6,用存在量词的检索
例 7.求选修课程 C2的学生的名字,
RANGE SC Y
GET W (S.SN),x (X.S#=S.S#∧ X.C# =‘C2’)E
例 8.求选修某课程的学生的学号,课程的条件是其直接先行课程是 C1。
RANGE C XC
GET W (SC.S#),CX (CX.C# =SC.C#∧ CX.PC# =‘C1’)E
(7) 带有多个关系的表达式的检索,
例 10.求成绩为 A的学生的名字与课程名字,
查询的结果 SN和 CN分别在 S和 C两个关系中,
RANGE SC SCX
GET W (S.SN,C.CN),SCX (SCX.G=‘A’∧ SCX.S# =S.S#) ∧ C.C#=SCX.C#)E
(8) 用全称量词的检索
例 11.求不选修课程 C1的学生的名字,
RANGE SC SCX
GET W (S.SN),SCX (SCX.S#≠S.S#∨ SCX.C# ≠‘C1’)A
(9) 用两种量词的检索
例 12.求选修全部课程的学生的名字,
RANGE C CX
RANGE SC SCX
GET W (S.SN),CX SCX (SCX.S#=S.S#∧ SCX.C# =CX.C#)EA
(9) 用蕴函 (Implication)的检索
例 13.求最少选修 S2所选的课程的学生的学号,
RANGE C CX
SC SCX
SC SCY
GET W (S.S#),CX( SCX (SCX.S#=‘S2’∧ SCX.C# =CX.C#)
SCY (SCY.S#=S.S#∧ SCY.C# =CX.C#)E
A E
(11) 库函数 (build-in function)
库函数也称集函数 (Aggregation-function).常用的主要有,
对元组计数, COUNT 求和, TOTAL
最大值, MAX 最小值, MIN
平均值, AVG
例 14,求学生所在系的数目
GET W (COUNT(S.SD))
例 15,求计算机科学系学生的平均年龄,
GET W (AVG(S.SA):S.SD=‘CS’)
二、存储操作
(1),修改操作,操作语句为,UPDATE
例 1,S2从数学系转到计算机科学系,
解, 应先将欲修改的数据读出来,然后修改,最后送回,
HOLD W (S.S#,S.SD),S.S# =‘S2’
MOVE ‘CS’ TO W.SD
UPDATE W
(2),插入操作,操作语句为,PUT
例 1,插入课程元组 (C7,MIS,C4).
解, MOVE ‘C7’ TO W.C#
MOVE ‘MIS TO W.CN
MOVE ‘C4’ TO W.PC#
PUT W (C)
(3),删除操作,操作语句为,DELETE
例 1,删除全部学生,
解, HOLD W (S )
DELETE W
HOLD W( SC) 相应地也应删除 SC关系中的全部元组,
DELETE
4.4.3 * 域关系演算
域演算利用与元组关系演算相同的运算符建立,主要区别是公
式中的变量不是元组变量而是元组分量的变量,简称域变量,
一, 域演算表达的形式为,
{x1,x2,…,x k|φ(x1,x2,…,x k ) }
其中 x1,x2,…,x k是域变量,φ是由原子公式和运算符组成的公式,
二, 三类原子公式
1,R(x1,x2,…,x k ).R是 K元关系,Xi是域变量或常量,R(x1,x2,…,x k )
表示由分量 x1,x2,…,x k组成的元组属于 R.
2,xθy x,y是域变量,θ是算术比较符,表示 x和 y之间满足比较关系 θ.
3,xθC 或 Cθx 表示域变量 x与常量 C之间满足比较关系 θ.
域演算表达式 {x1,x2,…,x k|φ(x1,x2,…,x k ) }表示所有使得 φ为真的
那些 x1,x2,…,x k 组成的元组的集合,
三, 关系代数表达式、元组演算表达式和域关系演算表达是
的关系
1,每一个关系代数表达式有一个等价的安全的元组演算表达式,
2,每一个安全的元组演算表达式有一个等价的安全的域演算表达式,
3,每一个安全的域演算表达式有一个等价的关系代数表达式,
4.4.4 一种域演算语言 —— QBE
一,检索操作
例 1,求信息系全体学生名字,
解, 这要在关系 S上查找,具体步骤是,
(1).用户提出要求,
(2)机器显示空白表格,
(3)用户输入关系名 S.
(4) 机器显示栏名,即属性名,本题显示如图 4-9
S S# SN SD SA
图 4-9
关系名
属性名
(5) 提出查询要求,如图 4-10
S S# SN SD SA
P.T CI
例 2,简单查询,求学生的全部数据
S S# SN SD SA
P.S10 P.V P.CI P.20
S S# SN SD SA
P.
也可以用下面的简单表示
课间休息
注意时间
例 3,条件查询,求信息系年龄大于 19岁的学生的学号,
S S# SN SD SA
P.S8
P.S8
CI
CI
>19
P.>19
例 4,条件查询,求信息系或者年龄大于 19岁的学生的学号,
S S# SN SD SA
P.S8
P.S9
CI
>19
只打印学号不打印年龄
打印学号且打印年龄
例 5,条件查询,找选修 C1和 C2两门课程的学生的学号,
SC S# C# G
P.S4
S4
C1
C1
例 6,涉及多个关系的查询,求选修 C2课程的学生名字,
SC S# C# G
S7 C2
S S# SN SD SA
S7 P.K
例 7,用逻辑非的查询, 求不学 C2课程的学生名字,
S S# SN SD SA
S1 P.W
SC S# C# G
┐ S1 C2
例 8,在一个表内连接的查询,求有两个人以上选修的课程号码,
SC S# C# G
S1
┐S1
P,C1
C1
二, 存储操作
1,修改操作 (U)
例 10,把 S1学生的年龄改为 18.
S S# SN SD SA
U.
S1
S1
U.18
18
把计算机科学系的学生的年龄都加 1,
S S# SN SD SA
U.
S1
S1
CS x
x+1
3.删除操作 (D)
例 11,删除学生 S6.
S S# SN SD SA
D,S6
2,插入操作 ( I )
例 11,把学生 S10,姓名 K,所属系 CI,年龄 20存入数据库
S S# SN SD SA
I,S10 k CI 20
SC S# C# G
D,S6
如果 S6选修了课程,则
还应将 SC中 S6所选修的有
关 SC元组删除,
第四章结束