关系微积分是一种逻辑符号,其中的查询是通过公式表示答案里的记录必须满足的某些逻辑约束来表示的。
PROJECT (π):从一个关系里面抽取指明的属性(列)。令 R 为一个包含一个属性 X 的关系。πX(R) = {t(X) &mid t ∈R},这里 t(X) 表示记录 t 里的属性 X 的值。
PRODUCT (×):计算两个关系的笛卡儿乘积。令R 为含有 k1 个元的表而令 S 为含有 k2 个元的表。R × S 是所有含有 k1 + k2 个元记录的集合,其前面 k1 个元构成 R 里的一条记录而后面 k2 个元构成 S 里的一条记录。
UNION (∪):计算两个表的集合理论上的联合。给出表 R 和 S (两者有相同元/列数), R ∪ S 的联合就是所有在 R 里面有或 S 里面有或在两个表里面都有的记录的集合。
INTERSECT (∩):计算两个表集合理论上的交集。给出表 R 和 S,R ∩ S 是同时在 R 和 S 里面的记录的集合。我们同样要求 R 和 S 拥有相同的元/列数。
DIFFERENCE (- 或 &setmn):计算两个表的区别的集合。令 R 和 S 还是拥有相同元/列的表。R - S 是在 R 里面但是不在 S 里面的记录的集合。
JOIN (∏):通过共同属性联接两个表。令 R 为一个有属性 A,B
和 C 的表,而令 S 为一个有属性 C,D
和 E 的表。两个表有一个共同的属性,属性 C。R ∏ S = πR.A,R.B,R.C,S.D,S.E(σR.C=S.C(R
× S))。我们在这里干了社呢们?首先我们计算笛卡儿乘积 R × S。然后我们选择那些公共属性
C
的数值相同(σR.C = S.C)的字段。这时我们拥有一个包含属性
C
两次的表,然后我们把重复的列去掉以后得出我们要的结果。
让我们看看计算一个联合需要的各个步骤产生的表。给出下面两个表:
R A | B | C S C | D | E ---+---+--- ---+---+--- 1 | 2 | 3 3 | a | b 4 | 5 | 6 6 | c | d 7 | 8 | 9
R x S A | B | R.C | S.C | D | E ---+---+-----+-----+---+--- 1 | 2 | 3 | 3 | a | b 1 | 2 | 3 | 6 | c | d 4 | 5 | 6 | 3 | a | b 4 | 5 | 6 | 6 | c | d 7 | 8 | 9 | 3 | a | b 7 | 8 | 9 | 6 | c | d在选择 σR.C=S.C(R × S) 后我们得到:
A | B | R.C | S.C | D | E ---+---+-----+-----+---+--- 1 | 2 | 3 | 3 | a | b 4 | 5 | 6 | 6 | c | d删除重复的列 S.C 我们用下面的操作:πR.A,R.B,R.C,S.D,S.E(σR.C=S.C(R × S)) 将其选出,得到:
A | B | C | D | E ---+---+---+---+--- 1 | 2 | 3 | a | b 4 | 5 | 6 | c | dDIVIDE (÷):令 R 是一个有属性 A,B,C 和 D 的表,并且令 S 是一个有着属性 C 和 D 的表。然后我们把除定义为:R ÷ S = {t &mid &forall ts ∈ S &exist tr ∈ R 令 tr(A,B)=t∧tr(C,D)=ts} 这里 tr(x,y) 代表表 R 里只包含元素 x 和 y 的记录。注意记录 t 只包含关系 R 里的元素 A 和 B。
给出下面的表
R A | B | C | D S C | D ---+---+---+--- ---+--- a | b | c | d c | d a | b | e | f e | f b | c | e | f e | d | c | d e | d | e | f a | b | d | eR ÷ S 生成
A | B ---+--- a | b e | d关于关系代数的更详细的描述和定义,请参考[Ullman, 1988] 或 [Date, 1994]。
回忆一下我们阐明的所有可以用语从数据库里检索数据的关系操作符。现在我们可以回到前一章的例子里(关系数据模型里的操作),那时我们需要知道销售部件 Screw 的所有供应商的名称。现在我们可以用下面的关系代数的操作回答这个问题了:
πSUPPLIER.SNAME(σPART.PNAME='Screw'(SUPPLIER × SELLS × PART))我们称这样的操作是一次查询。如果我们对我们的例子表(The Suppliers and Parts Database)进行上述查询计算,我们将获得下面结果:
SNAME ------- Smith Adams
记录关系微积分(Tuple Relational Calculus)(TRC),其变量代表记录。
如果我们想用 TRC 回答例子 一个使用关系代数的查询 里的问题,我们可以写出下面查询:
{x(SNAME) &mid x ∈ SUPPLIER ∧ \nonumber
&exist y ∈ SELLS &exist z ∈ PART (y(SNO)=x(SNO) ∧ \nonumber
z(PNO)=y(PNO) ∧ \nonumber
z(PNAME)='Screw')} \nonumber
对 供应商和部件数据库 计算这个查询同样得出与
一个使用关系代数的查询相同的结果。有时候我们说基于关系微积分的语言比基于关系代数的语言是更 "高级的" 或者 "更描述性的" 语言,因为代数(部分上)说明了操作的过程而微积分把这些过程留给编译器或者解释器以决定计算的最有效顺序。