笛卡尔乘积(cross-product)×
例:
R1
sid | bid | day |
---|---|---|
22 | 101 | 10/10/96 |
58 | 103 | 11/12/96 |
S1
sid | sname | rating | age |
---|---|---|---|
22 | dustin | 7 | 45.0 |
31 | lubber | 8 | 55.5 |
58 | rusty | 10 | 35.0 |
R1和S1作笛卡尔乘积的结果是,R1和S1中的各个元组做两两拼接,即笛卡尔乘积的结果有2 * 3 = 6 条元组:
(sid) | sname | rating | age | (sid) | bid | day |
---|---|---|---|---|---|---|
22 | dustin | 7 | 45.0 | 22 | 101 | 10/10/96 |
22 | dustin | 7 | 45.0 | 58 | 103 | 11/12/96 |
31 | lubber | 8 | 55.5 | 22 | 101 | 10/10/96 |
31 | lubber | 8 | 55.5 | 58 | 103 | 11/12/96 |
58 | rusty | 10 | 35.0 | 22 | 101 | 10/10/96 |
58 | rusty | 10 | 35.0 | 58 | 103 | 11/12/96 |
注:1. 这两张表里都有sid这个属性。在同一张表里,不能有两个属性同名,这里存在一个冲突。在关系代数中,提供了Renaming operator:
ρ
(
C
(
1
→
s
i
d
1
,
5
→
s
i
d
2
)
)
,
S
1
×
S
2
\rho \left( {C\left( {1 \to {\rm{sid}}1,{\kern 1pt} 5 \to sid2} \right)} \right),S1 \times S2
ρ(C(1→sid1,5→sid2)),S1×S2
上式中,1表示笛卡尔乘积结果中的第一个属性,5表示第五个属性。将第一个属性重命名为sid1,第5个属性重命名为sid2.
2. 笛卡尔乘积的结果常常拼接出很多没有意义的元组。我们更多时候要的是连接操作。
连接(Joins)
条件连接(Conditon Join)⋈这个云算符打不出来,以下用其他符号近似替代:
R ▹ ◃ C S = σ C ( R × S ) R \triangleright { \triangleleft _C}S = {\kern 1pt} {\kern 1pt} {\sigma _C}\left( {R \times S} \right) R▹◃CS=σC(R×S)
S
1
▹
◃
S
1.
s
i
d
<
R
1
.
s
i
d
R
1
S1 \triangleright { \triangleleft _{S1.{\rm{sid}}{\kern 1pt} {\rm{ < }}{\kern 1pt} {\rm{R1}}{\rm{.sid}}}}R1
S1▹◃S1.sid<R1.sidR1
S1和R1的条件c的条件连接结果:S1和R1做笛卡尔乘积,再按条件C做选择操作:
(sid) | sname | rating | age | (sid) | bid | day |
---|---|---|---|---|---|---|
22 | dustin | 7 | 45.0 | 58 | 103 | 11/12/96 |
31 | lubber | 8 | 55.5 | 58 | 103 | 11/12/96 |
注:
1. 先做笛卡尔乘积,在选择,效率较低。有其他效率高的办法,查询优化的时候再提。
2. 条件连接也叫theta-join.
等值连接(equal join):条件C中,全是等值判断的连接。
S
1
▹
◃
s
i
d
R
1
S1 \triangleright { \triangleleft _{sid}}R1
S1▹◃sidR1:按S1和R1 sid相等做等值连接。结果:
(sid) | sname | rating | age | bid | day |
---|---|---|---|---|---|
22 | dustin | 7 | 45.0 | 101 | 10/10/96 |
58 | rusty | 10 | 35.0 | 103 | 11/12/96 |
注:
等值属性去掉一列。
自然连接(Natural Join):两张表在它们所有公共属性上都做等值连接。
在上面等值连接的例子中,等值连接实际上就是自然连接,因为两个表只有一个公共属性sid。
除法操作(Dvision):除法操作并不是关系运算中的基本操作,但在实际应用开发中常用到。其适用于类似于下面的问题:
找到预定了所有船的水手。
假设A有两个属性:x和y;B有一个属性y,那么定义:
A
/
B
=
{
⟨
x
⟩
∣
∃
⟨
x
,
y
⟩
∈
A
∀
⟨
y
⟩
∈
B
}
A/B{\kern 1pt} {\kern 1pt} {\kern 1pt} = {\kern 1pt} {\kern 1pt} {\kern 1pt} \left\{ {\left\langle x \right\rangle {\kern 1pt} {\kern 1pt} |{\kern 1pt} {\kern 1pt} {\kern 1pt} \exists {\kern 1pt} {\kern 1pt} \left\langle {x,y} \right\rangle {\kern 1pt} \in {\kern 1pt} A{\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} \forall \left\langle y \right\rangle \in B} \right\}
A/B={⟨x⟩∣∃⟨x,y⟩∈A∀⟨y⟩∈B}
即A/B的结果是,对关系B中任意一个y值,在关系A中都能找到<x,y>∈A,这样的x,就是符合除法条件的x。(即在关系A中与关系b里所有y值都有联系的x值)
通常,x和y可以是属性集合。
例 A/B
A
sno | pno |
---|---|
s1 | p1 |
s1 | p2 |
s1 | p3 |
s1 | p4 |
s2 | p1 |
s2 | p2 |
s3 | p2 |
s4 | p2 |
s4 | p4 |
B1
pno |
---|
p2 |
B2
pno |
---|
p2 |
p4 |
则A/B1:
sno |
---|
s1 |
s2 |
s3 |
s4 |
A/B2:
sno |
---|
s1 |
s4 |