数据库系统概论--关系代数
关系代数
关系代数是一种抽象的查询语言,是关系数据操纵语言的一种传统表达方。式,它是用对关系的运算来表达查询的。
任何一种运算都是将一定的运算符作用于一定的运算对象上,得到预期的运算结果。所以运算对象、运算符、运算结果是运算的三大要素。
关系代数的运算对象是关系,运算结果亦为关系。关系代数用到的运算符包括四类:集合运算符、专门的关系运算符、算术比较符和逻辑运算符,如表1所示。
表1 关系代数运算符
关系代数的运算按运算符的不同可分为传统的集合运算和专门的关系运算两类。
其中传统的集合运算将关系看成元组的集合,其运算是从关系的“水平”方向即行的角度来进行。而专门的关系运算不仅涉及行而且涉及列。比较运算符和逻辑运算符是用来辅助专门的关系运算符进行操作的。
一 传统的集合运算
传统的集合运算是二目运算,包括并、差、交、广义笛卡尔积四种运算。
前提:关系R 和关系S 具有相同的目n (即两个关系都有n 个属性),且相应的属性取自同一个域(即有相同的列)
则可以定义并、差、交运算如下:
1. 并(Union)
关系R 与关系S 的并集记作:
R ∪ S = { t | t ∈ R ∨ t ∈ S }
其结果仍为n 目关系,由属于R 或属于S 的元组组成。
2. 差(Difference)
关系R 与关系S 的差集记作:
R-S = { t | t ∈ R ∧ t /∈ S }
其结果关系仍为n 目关系,由属于R 而不属于S 的所有元组组成。
3. 交( Intersection)
关系R 与关系S 的交集记作:
R ∩ S = { t | t ∈ R ∧ t ∈ S }
其结果关系仍为n 目关系,由既属于R 又属于S 的元组组成。关系的交可以用差来表示,即R ∩ S=R- (R -S )。
4. 广义笛卡尔积(Extended Cartesian Product)
两个分别为 n 目和m 目的关系 R 和S 的广义笛卡尔积是一个(n +m )列的元组的集合。(列数 =n + m)
元组的前n 列是关系R 的一个元组,后m 列是关系S 的一个元组。
若R 有k 1 个元组,S 有k 2 个元组,则关系R 和关系S 的广义笛卡尔积有k 1 × k 2 个元组(行数 = n * m)。
记作:
R × S = { tr ts | tr ∈ R ∧ ts ∈ S }
图1(a)、图1(b)分别为具有三个属性列的关系R ,S 。图1(c)为关系R 与S 的并。图1(d)为关系R 与S 的交。图1(e)为关系R 和S 的差。图1(f)为关系R 和S 的广义笛卡尔积。
(a) (b)
(c) (d) (e)
(f)
图1 传统集合运算举例
二 专门的关系运算
专门的关系运算包括选择、投影、连接、除等。为了叙述上的方便,先引入几个记号。
(1)设关系模式为R (A 1 ,A 2 ,…,An )。它的一个关系设为R 。t ∈ R 表示t 是R 的一个元组。t [Ai ]则表示元组t 中相应于属性Ai 的一个分量。
(2)若A ={Ai 1 ,Ai 2 ,…,Aik },其中Ai 1 ,Ai 2 ,…,Aik 是A 1 ,A 2 ,…,An 中的一部分,则A 称为属性列或域列。t [A ]=(t [Ai 1 ],t [Ai 2 ]…,t [Aik ])表示元组t 在属性列A 上诸分量的集合。A 则表示{A 1 ,A 2 ,…,An }中去掉{Ai 1 ,Ai 2 ,…,Aik }后剩余的属性组。
(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 为属性组。定义,当t [X ]= x 时,x 在 R 中的象集(Images Set)为:
Zx ={ t [Z ] | t ∈ R ,t [X ] = x }
它表示R 中属性组X 上值为x 的诸元组在Z 上分量的集合。
下面给出这些关系运算的定义:
1. б 选择限制( Selection) 即条件where
它是在关系R 中选择满足给定条件的诸元组,记作:
б F (R )= { t | t ∈ R ∧ F(t ) =’真’ }
其中F表示选择条件,它是一个逻辑表达式,取逻辑值“真”或“假”。
逻辑表达式F由逻辑运算符 ┐ ,∧ ,∨ 连接各算术表达式组成。算术表达式的基本形式为:
X 1 θ Y 1
其中θ 表示比较运算符,它可以是>,≥ ,<,≤ ,=或 ≠ 。
X 1 ,Y 1 等是属性名,或为常量,或为简单函数;属性名也可以用它的序号来代替。
选择运算实际上是从关系R 中选取使逻辑表达式产为真的元组。这是从行的角度进行的运算。
设有一个学生-课程数据库,包括学生关系Student、课程关系Course和选修关系SC,如图2所示。下面的许多例子将对这三个关系进行运算。
(a)
(b)
(c)
图2 学生-课程数据库
例1 查询信息系(IS系)全体学生
δ Sdept = ’ IS ’ (Student)
或 δ 5 = ’ IS ’ (Student)
其中下角标“ 5”为 Sdept的属性序号。结果如图3(a)所示。
例2 查询年龄小于20岁的学生
δ Sage <20 (Student)
或 δ 4 <20 (Student)
结果如图3(b)所示。
(a)
(b)
图3 选择运算举例
2.π 投影( Projection)
关系R 上的投影是从R 中选择出若干属性列组成新的关系。记作:
π A (R )= { t [A ] | t ∈ R }
其中A 为R 中的属性列。
投影操作是从列的角度进行的运算。
例3 查询学生的姓名和所在系,即求Student关系在学生姓名和所在系两个属性上的投影。
π Sname, Sdept (Student)
或 π2, 5 (Student)
结果如图4(a)。
投影之后不仅取消了原关系中的某些列,而且还可能取消某些元组,因为取消了某些属性列后,就可能出现重复行,应取消这些完全相同的行。
例4 查询学生关系Student中都有哪些系,即查询关系Student在所在系属性上的投影。
π Sdept (Student)
结果如图 4(b)。Student关系原来有四个元组,而投影结果取消了重复的IS元组,因此只有三个元组。
(a) (b)
图4 投影运算举例
3. 连接( Join)
连接也称为 θ 连接。它是从两个关系的笛卡尔积中选取属性间满足一定条件的元组。记作:
其中A 和B 分别为R 和S 上度数相等且可比的属性组。θ 是比较运算符。连接运算从R 和 S 的广义笛卡尔积R | × |S 中选取(R 关系)在A 属性组上的值与(S 关系)在B 属性组上值满足比较关系 θ 的元组。
连接运算中有两种最为重要也最为常用的连接,一种是等值连接(equal-join),一种是自然连接(Natural-join)。
θ 为“=”的连接运算称为等值连接。它是从关系R 与S 的广义笛卡尔积中选取A ,B 属性值相等的那些元组,即等值连接为:
自然连接(Natural-join)是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。即若R 和S 具有相同的属性组B,则自然连接可记作:
一般的连接操作是从行的角度进行运算。但自然连接还需要取消重复列,所以是同时从行和列的角度进行运算。
例5 设图 5(a)和(b)分别为关系R 和关系 S ,图5(c)为 的结果,图5(d)为等值连接 的结果。图5(e)为自然连接R | × |S 结果。
(a) (b) (c)
(d) (e)
图5 连接运算举例
4. 除( Division)
给定关系R ( X ,Y )和S (Y ,Z ),其中X Y ,Z 为属性组。R 中的Y 与S 中的Y 可以有不同的属性名,但必须出自相同的域集。R 与S 的除运算得到一个新的关系P (X ),P 是 R 中满足下列条件的元组在 X 属性列上的投影:元组在X 上分量值x 的象集Yx 包含S 在Y 上投影的集合。记作:
其中Yx 为x 在R 中的象集,x =tr {X }
除操作是同时从行和列角度进行运算。
例6 设关系 R,S分别为图6中的(a)和(b),R ÷ S的结果为图6(c)。
在关系R 中,A 可以取四个值{a 1 ,a 2 ,a 3 ,a 4 }, 其中:
a 1 的象集为{(b 1 ,c 2 ),(b 2 ,c 3 ),(b 2 ,c 1 )}
a 2 的象集为{(b 3 ,c 7 ),(b 2 ,c 3 )}
a 3 的象集为{ (b 4 ,c 6 ) }
a 4 的象集为{ (b 6 ,c 6 )}
S 在(B ,C )上的投影为 {(b 1 ,c 2 ),(b 2 ,c 1 ),(b 2 ,c 3 )}
显然只有a 1 的象集(B ,C )a 1 包含了S 在(B ,C )属性组上的投影,所以R ÷ S ={a 1 }。
(a) (b) (c)
图 6 除运算举例
下面再以学生-课程数据库为例,给出几个综合应用多种关系代数运算进行查询的例子。
例7 查询至少选修1号课程和3号课程的学生号码。
首先建立一个临时关系K :
|
Cno |
|
1 3 |
然后求: πSno,Cno (SC)÷K
结果为: { 95001 }
求解过程与例6类似,先对SC关系在Sno和Cno属性上投影,然后对其中每个元组逐一求出每一学生的象集,并依次检查这些象集是否包含K 。
例8 查询选修了2号课程的学生的学号。
πSno, (бno=’2’ (SC))={ 95001,95002 }
例9 查询至少选修了一门其直接先行课为5号课程的学生姓名。
πSname, (бCpno=’5’ (Course) |×| SC |×|πSno,Sname (Student))
或
πSname, ( πSno (бCpno=’5’ (Course) |×| SC) |×|πSno,Sname (Student))
例10 查询选修了全部课程的学生号码和姓名。
πSno,Cno (SC) ÷ πCno (Course) |×| πSno,Sname (Student)
本节介绍了8种关系代数运算,其中并、差、笛卡尔积、投影和选择5种运算为基本的运算。其他3种运算,即交、连接和除,均可以用这5种基本运算来表达。引进它们并不增加语言的能力,但可以简化表达。
关系代数中,这些运算经有限次复合后形成的式子称为关系代数表达式。
关系代数语言中比较典型的例子是查询语言 ISBL ( Information System Base Language )。 ISBL 语言由 IBM United Kingdom 研究中心研制,用于 PRTV ( Peterlee Relational Test Vehicle )实验系统。
浙公网安备 33010602011771号