常用的8种关系代数:
集合运算 | |
交 | ∩ |
并 | ∪ |
差 | - |
笛卡尔积 | × |
自然运算 | |
投影 | R[ ] |
选择 | R where C |
连接 | ▷◁ |
除 | ÷ |
兼容表:
对于表R和表S:
1.R和S具有相同的属性集
2.对于每个属性有相同的域
3.每个属性表示的意义是相同的
则称R和S是兼容表
1.R和S具有相同的属性集
2.对于每个属性有相同的域
3.每个属性表示的意义是相同的
则称R和S是兼容表
- 交,并,差运算没有什么好说的,它们只适用于兼容表。
- 乘法有点小意思。对于表T:Head(T)=att1 att2...attN 如果试图用表T和他本身去做笛卡尔积,则结果如:head(T×T)=T.att1 T.att2...T.attN T.att1 T.att2...T.attN 这个时候问题就暴露出来了,即使用了完全限定名,依然不能区分结果表中的一堆属性。因此形如T×T的笛卡尔积是不被允许的,理论上只能将一个T赋上别名,比如T:=R,然后T×R 。别名的重要性或许在RDBMS的系统中看不出多少,但在ORDBMS中,正式地访问某个对象的属性必须要用别名限定。
- 投影运算,可以看成是对列的选择,选择完成后会去除那些相同的行。所以投影运算具有distinct的特征。
- 选择运算,可以看成是对行的选择
- 关于连接运算的蜕化:
- 如果表R和表S没有任何共同属性,R▷◁S=R×S
- 如果表R和表S具有相同的属性集,R▷◁S=R∩S
- 结合律:(R ×S) ×T=R ×(S ×T)
(R▷◁S)▷◁T=R▷◁(S▷◁T)
- 交换律: R×S=S×R
R▷◁S=S▷◁R
在8种运算中,基本的是5种,并,差,乘,选择,投影。
也就是说,所有的关系代数问题都以通过这5种运算来进行。
1.对于交运算∩,有 :R∩S=R-(R-S) 。所以∩可以单纯通过-来代替。
2.对于连接运算▷◁,( R▷◁S= (R×S) where R.attr=S.attr and ...)[attr1,attr2,...]。一目了然,连接可以用乘法,选择,投影来代替。
3.对于除法运算÷,R÷S= R[投影到S没有的属性]-((R[投影到S没有的属性]×S)-R)[投影到S没有的属性],即除法可以用乘法,投影,差运算来代替。
关于除法运算用乘法,投影,差代替的证明:
例如有两个表 :Head(R)=(A,B) Head(S)=(B) (注:A,B不是表单个属性,而是属性的集合)
1)R[A]表示什么?三种情况:
跟S中B属性的每一行都发生关系的A1,
跟S中B属性若干行发生关系的A2,
不跟S中B属性发生关系的A3
简单说,R可以表示成
A1 | B |
A2 | B' |
A3 | C |
2)R[A]×S 表示所有A属性跟B属性发生关系的集合,即:
A1 | B |
A2 | B |
A3 | B |
3)那么R[A]×S-R的意义就是:它汇集了所有 不跟B属性发生关系的A3,以及所有跟B属性若干行发生关系的A2。
只有全部跟S中的B发生联系的A1才能被去掉. R[A]×S-R如下:
A2 | B-B' |
A3 | B |
4)很显然,我们所求的就是上面的被去掉的A1,即R[A]-(R[A]×S-R)[A]