文章目录
第4讲 关系代数
关系运算
关系运算包括集合运算和纯关系运算:
- 集合运算:并( ∪ \cup ∪)、交( ∩ \cap ∩)、差( − - −)、Cartesian积( × \times ×)
- 纯关系运算:投影( Π \Pi Π)、选择( σ \sigma σ)、连接( ⋈ \Join ⋈)、除( ÷ \div ÷)、更名( ρ \rho ρ)
关系的基本运算包括并( ∪ \cup ∪)、差( − - −)、Cartesian积( × \times ×)、投影( Π \Pi Π)、选择( σ \sigma σ),所有的关系运算都可由关系的基本运算组合而得。
并相容性
在运算时,参与运算的两个关系间必须有一定的对应性、可比性或意义关联性。
定义:关系 R ( A 1 , A 2 , ⋯ , A n ) R(A_1,A_2,\cdots,A_n) R(A1,A2,⋯,An)与关系 S ( B 1 , B 2 , ⋯ , B m ) S(B_1,B_2,\cdots,B_m) S(B1,B2,⋯,Bm)存在相容性,当且仅当
- n = m n=m n=m;
- d o m A i = d o m B i \mathop{\mathrm{dom}}A_i=\mathop{\mathrm{dom}}B_i domAi=domBi, i = 1 , 2 , ⋯ , n i=1,2,\cdots,n i=1,2,⋯,n。
更名运算符
使用 ρ T ′ ( T ) \rho_{T'}(T) ρT′(T)将表 T T T更名为 T ′ T' T′。
更名运算常见于连接运算中。
关系的基本运算
并(Union)
- 定义:若关系 R R R与关系 S S S是并相容的,则 R ∪ S = { t ∣ t ∈ R ∨ t ∈ S } R\cup S=\{t\mid t\in R\lor t\in S\} R∪S={t∣t∈R∨t∈S}。
- 描述: R ∪ S R\cup S R∪S是将关系 R R R与关系 S S S合并在一起,并去掉重复的元组得到的关系。
- 性质: R ∪ S = S ∪ R R\cup S=S\cup R R∪S=S∪R。
差(Difference)
- 定义:若关系 R R R与关系 S S S是并相容的,则 R − S = { t ∣ t ∈ R ∧ t ∉ S } R-S=\{t\mid t\in R\land t\notin S\} R−S={t∣t∈R∧t∈/S}。
- 描述: R − S R-S R−S由在关系 R R R中但不在关系 S S S中的元组构成。
注意: R − S ≠ S − R R-S\ne S-R R−S=S−R。
Cartesian积(Cartesian Product)
- 定义: R × S = { ⟨ r , s ⟩ ∣ r ∈ R ∧ s ∈ S } R\times S=\{\langle r,s\rangle\mid r\in R\land s\in S\} R×S={⟨r,s⟩∣r∈R∧s∈S}。
- 描述: R × S R\times S R×S由关系 R R R中的任一元组与关系 S S S中的所有元组拼接而成。
- 性质:
- R × S = S × R R\times S=S\times R R×S=S×R;
- deg R × S = deg R + deg S \deg R\times S=\deg R+\deg S degR×S=degR+degS;
- ∣ R × S ∣ = ∣ R ∣ ⋅ ∣ S ∣ |R\times S|=|R|\cdot|S| ∣R×S∣=∣R∣⋅∣S∣.
注意:关系的Cartesian积与集合论中的不同。在集合论中, R × S R\times S R×S为一个序对,因此 R × S ≠ S × R R\times S\ne S\times R R×S=S×R,而在关系代数中,关系的属性与位置无关,因此 R × S = S × R R\times S=S\times R R×S=S×R。
投影(Project)
- 定义:设 R ( A 1 , A 2 , ⋯ , A n ) R(A_1,A_2,\cdots,A_n) R(A1,A2,⋯,An),则 Π A i 1 , A i 2 , ⋯ , A i k ( R ) = { ⟨ t [ A i 1 ] , t [ A i 2 ] , ⋯ , t [ A i k ] ⟩ ∣ t ∈ R } \Pi_{A_{i_1},A_{i_2},\cdots,A_{i_k}}(R)=\left\{\left\langle t[A_{i_1}],t[A_{i_2}],\cdots,t[A_{i_k}]\right\rangle\mid t\in R\right\} ΠAi1,Ai2,⋯,Aik(R)={⟨t[Ai1],t[Ai2],⋯,t[Aik]⟩∣t∈R},其中 { A i 1 , A i 2 , ⋯ , A i k } ⊆ { A 1 , A 2 , ⋯ , A n } \{A_{i_1},A_{i_2},\cdots,A_{i_k}\}\subseteq\{A_1,A_2,\cdots,A_n\} {Ai1,Ai2,⋯,Aik}⊆{A1,A2,⋯,An}, t [ A i ] t[A_i] t[Ai]为元组 t t t中属性 A i A_i Ai的分量。
选择(Select)
- 定义: σ c o n ( R ) = { t ∣ t ∈ R ∧ c o n ( t ) = 1 } \sigma_{con}(R)=\{t\mid t\in R\land con(t)=1\} σcon(R)={t∣t∈R∧con(t)=1}。
- 描述: σ c o n ( R ) \sigma_{con}(R) σcon(R)由关系 R R R中满足条件表达式 c o n con con的所有元组构成。
关系的扩展运算
交(Intersection)
- 定义:若关系 R R R与关系 S S S是并相容的,则 R ∩ S = { t ∣ t ∈ R ∧ t ∈ S } R\cap S=\{t\mid t\in R\land t\in S\} R∩S={t∣t∈R∧t∈S}。
- 描述: R ∩ S R\cap S R∩S由同时存在于关系 R R R与关系 S S S的元组构成。
- 性质:
- R ∩ S = S ∩ R R\cap S=S\cap R R∩S=S∩R;
- R ∩ S = R − ( R − S ) R\cap S=R-(R-S) R∩S=R−(R−S)。
θ \theta θ-连接(Theta-Join)
- 定义: R ⋈ A θ B S = σ r [ A ] θ s [ B ] ( R × S ) R\mathop{\Join}\limits_{A\theta B}S=\sigma_{r[A]\theta s[B]}(R\times S) RAθB⋈S=σr[A]θs[B](R×S),其中 θ \theta θ是比较运算符。
等值连接(Equi-Join)
- 定义: R ⋈ A = B S = σ r [ A ] = s [ B ] ( R × S ) R\mathop{\Join}\limits_{A=B}S=\sigma_{r[A]=s[B]}(R\times S) RA=B⋈S=σr[A]=s[B](R×S)。
自然连接(Natural Join)
- 定义: R ⋈ S = σ r [ A i 1 , A i 2 , ⋯ , A i k ] = s [ A i 1 , A i 2 , ⋯ , A i k ] ( R × S ) R\mathop{\Join}S=\sigma_{r[A_{i_1},A_{i_2},\cdots,A_{i_k}]=s[A_{i_1},A_{i_2},\cdots,A_{i_k}]}(R\times S) R⋈S=σr[Ai1,Ai2,⋯,Aik]=s[Ai1,Ai2,⋯,Aik](R×S)。
关系的复杂扩展运算
除(Division)
- 定义: R ÷ S = { t ∣ t ∈ Π R − S ( R ) ∧ ∀ u ∈ S , t u ∈ R } R\div S=\{t\mid t\in\Pi_{R-S}(R)\land\forall u\in S,tu\in R\} R÷S={t∣t∈ΠR−S(R)∧∀u∈S,tu∈R}。
- 性质: R ÷ S = Π R − S ( R ) − Π R − S ( ( Π R − S ( R ) × S ) − R ) R\div S=\Pi_{R-S}(R)-\Pi_{R-S}((\Pi_{R-S}(R)\times S)-R) R÷S=ΠR−S(R)−ΠR−S((ΠR−S(R)×S)−R)。
外连接(Outer Join)
外连接不易理解,先来看一个例子:
现有某公司的员工表和工资表,假设员工王五的工资正在商议。若想统计全体员工的工号、姓名和工资,可以使用自然连接运算:
员工
⋈
工资
\text{员工}\Join\text{工资}
员工⋈工资,结果为:
由于王五未在工资表中存在记录,因此查询结果缺少员工王五,但这显然不是正确的结果。
当关系 R R R中某些元组在关系 S S S中不存在公共属性上值相等的元组时,这些 R R R中的元组将被舍弃,称这些被舍弃的元组为悬浮元组(Dangling Tuple)。
为了将悬浮元组保存在查询结果中,可以在其他属性上填充空值,定义这样的连接为外连接(Outer Join)。
特别地,如果只需将左值的悬浮元组保存在查询结果中,则使用左外连接(Left Join);如果只需将右值的悬浮元组保存在查询结果中,则使用右外连接(Left Join)。