关系代数
关系代数是一种抽象的查询语言,它用对关系的运算来表达查询。
任何一种运算都是将一定的运算符作用于一定的运算对象上,得到预期的运算结果。所以运算对象、运算符、运算结果是运算的三大要素。
关系代数的运算对象是关系,运算结果亦为关系。关系代数用到的运算符包括两类:集合运算符和专门的关系运算符,如下表所示。

关系代数的运算按运算符的不同可分为传统的集合运算和专门的关系运算两类。其中,传统的集合运算将关系看成元组的集合,其运算是从关系的“水平”方向,即行的角度来进行;而专门的关系运算不仅涉及行,而且涉及列。比较运算符和逻辑运算符是用来辅助专门的关系运算符进行操作的。
传统的集合运算
传统的集合运算是二目运算,包括并、差、交、笛卡儿积4种运算。
设关系R和关系S具有相同的目n(即两个关系都有n个属性),且相应的属性取自同一个域,t是元组变量,t∈R表示t是R的一个元组。
可以定义并、差、交、笛卡儿积运算如下。
①并(union)
关系R与关系S的并记作
RUS = { t | t∈R V t∈S }
其结果仍为n目关系,由属于R或属于S的元组组成。
②差(except)
关系R与关系S的差记作
R-S = { t | t∈R ∧ t∉S }
其结果关系仍为n目关系,由属于R而不属于S的所有元组组成。
③交(intersection)
关系R与关系S的交记作
R∩S = { t | t∈R ∧ t∈S }
其结果关系仍为n目关系,由既属于R又属于S的元组组成。关系的交可以用差来表示,即R∩S=R-(R-S)。
④笛卡儿积(cartesian product)
这里的笛卡儿积严格地讲应该是广义的笛卡儿积(extended cartesian product),因为这里笛卡儿积的元素是元组。
两个分别为n目和m目的关系R和S的笛卡儿积是一个(n+m)列的元组的集合。元组的前n列是关系R的一个元组,后m列是关系S的一个元组。若R有k1个元组,S有k2个元组,则关系R和关系S的笛卡儿积有k1×k2个元组。记作
R×S = { trts | tr∈R ∧ ts∈S }
下图(a)、图(b)分别为具有三个属性列的关系R、S。图(c)为关系R与S的并。图(d)为关系R与S的交。图(e)为关系R和S的差。图(f)为关系R和S的笛卡儿积。

专门的关系运算
专门的关系运算包括选择、投影、连接、除运算等。为了叙述上的方便,先引入几个记号。


下面给出这些专门的关系运算的定义。
①选择(selection)
选择又称为限制(restriction)。它是在关系R中选择满足给定条件的诸元组,记作
σF(R)={ t | t∈R ∧ F(t)=‘真’}

其中F表示选择条件,它是一个逻辑表达式,取逻辑值“真”或“假”。
逻辑表达式F的基本形式为
X1θY1
其中θ表示比较运算符,它可以是>,≥,<,≤,=或<>。X1,Y1等是属性名,或为常量,或为简单函数;属性名也可以用它的序号来代替。在基本的选择条件上可以进一步进行逻辑运算,即进行求非(┐)、与(∧)、或(V)运算。条件表达式中的运算符如下表所示。

图2.3

选择运算实际上是从关系R中选取使逻辑表达式F为真的元组。这是从行的角度进行的运算。
设有一个学生-课程数据库,包括学生关系Student、课程关系Course和选修关系SC。如下图所示。下面的多个例子将对这三个关系进行运算。



【例1】查询信息系(IS系)全体学生。
σ Sdept=‘IS’ (Student)
结果如下图所示。

【例2】查询年龄小于20岁的学生。
σ Sage<20 (Student)
结果如下图所示。

②投影(projection)
关系R上的投影是从R中选择出若干属性列组成新的关系。记作
∏A(R) = { t[A] | t∈R }
其中A为R中的属性列。
投影操作是从列的角度进行的运算。
【例3】查询学生的姓名和所在系,即求Student关系上学生姓名和所在系两个属性上的投影。
∏Sname,Sdept(Student)
结果如下图(a)所示。

投影之后不仅取消了原关系中的某些列,而且还可能取消某些元组,因为取消了某些属性列后,就可能出现重复行,应取消这些完全相同的行。
【例4】
查询学生关系Student中都有哪些系,即查询关系Student上所在系属性上的投影。
∏Sdept(Student)
结果如上图(b)所示。Student关系原来有4个元组,而投影结果取消了重复的CS元组,因此只有三个元组。
③连接(join)
连接也称为θ连接。它是从两个关系的笛卡儿积中选取属性间满足一定条件的元组。记作

其中,A和B分别为R和S上列数相等且可比的属性组,θ是比较运算符。连接运算从R和S的笛卡儿积R×S中选取R关系在A属性组上的值与S关系在B属性组上的值满足比较关系θ的元组。
连接运算中有两种最为重要也最为常用的连接,一种是等值连接(equijoin),另一种是自然连接(natural join)。
θ为“=”的连接运算称为等值连接。它是从关系R与S的广义笛卡儿积中选取A、B属性值相等的那些元组,即等值连接为

自然连接是一种特殊的等值连接。它要求两个关系中进行比较的分量必须是同名的属性组,并且在结果中把重复的属性列去掉。即若R和S中具有相同的属性组B,U为R和S的全体属性集合,则自然连接可记作

一般的连接操作是从行的角度进行运算,但自然连接还需要取消重复列,所以是同时从行和列的角度进行运算。

两个关系R和S在做自然连接时,选择两个关系在公共属性上值相等的元组构成新的关系。此时,关系R中某些元组有可能在S中不存在公共属性上值相等的元组,从而造成R中这些元组在操作时被舍弃了,同样,S中某些元组也可能被舍弃。这些被舍弃的元组称为悬浮元组(dangling tuple)。例如,在上图(e)的自然连接中,R中的第4个元组,S中的第5个元组都是被舍弃掉的悬浮元组。
如果把悬浮元组也保存在结果关系中,而在其他属性上填空值(NULL),那么这种连接就叫做外连接(outer join);如果只保留左边关系R中的悬浮元组就叫做左外连接(left outer join或left join);如果只保留右边关系S中的悬浮元组就叫做右外连接(right outer join或right join)。在下图中,图(a)是上图中的关系R和关系S的外连接,图(b)是左外连接,图(c)是右外连接。

④除运算(division)
设关系R除以关系S的结果为关系T,则T包含所有在R但不在S中的属性及其值,且T的元组与S的元组的所有组合都在R中。
下面用象集来定义除法:
给定关系R(X,Y)和S(Y,Z),其中X、Y、Z为属性组。R中的Y与S中的Y可以有不同的属性名,但必须出自相同的域集。
R与S的除运算得到一个新的关系P(X),P是R中满足下列条件的元组在X属性列上的投影:元组在X上分量值x的象集¥包含S在Y上投影的集合。记作

其中Yx为x在R中的象集,x=tr[x]。
除操作是同时从行和列角度进行运算。
【例5】设关系R、S分别为下图中的(a)和(b),R÷S的结果为图(c)。

在关系R中,A可以取4个值{a1,a2,a3,a4}。其中:
a1的象集为{(b1,c2),(b2,c3),(b2,c1)}
a2的象集为{(b3,c7),(b2,c3)}
a3的象集为{(b4,c6)}
a4的象集为{(b6,c6)}
S在(B,C)上的投影为{(b1,c2),(b2,c1),(b2,c3)}。
显然只有a1的象集(B,C)a1包含了S在(B,C)属性组上的投影,所以
R÷S={a1}
下面再以学生-课程数据库为例,给出几个综合应用多种关系代数运算进行查询的例子。
【例6】查询至少选修1号课程和3号课程的学生号码。
首先建立一个临时关系K:如右图所示。
然后求
∏Sno,Cno(SC)÷K

结果为{201215121}。
求解过程与例5类似,先对SC关系在(Sno,Cno)属性上投影,然后逐一求出每一学生(Sno)的象集,并依次检查这些象集是否包含K。
【例7】查询选修了2号课程的学生的学号。
∏Sno(σCno=‘2’(SC))
= {201215121,201215122}
【例8】查询至少选修了一门其直接先行课为5号课程的学生姓名。

【例9】查询选修了全部课程的学生号码和姓名。

本节介绍了8种关系代数运算,其中并、差、笛卡儿积、选择和投影这5种运算为基本的运算。其他三种运算,即交、连接和除,均可以用这5种基本运算来表达。引进它们并不增加语言的能力,但可以简化表达。
关系代数中,这些运算经有限次复合后形成的表达式称为关系代数表达式。







