关系数据库的关系代数运算符有8种,分为两大类,如下表所示:

分类运算符含义
传统关系运算符 ∪ ∪
− −
∩ ∩
× × ×笛卡尔积
专用关系运算符σ选择
投影
连接
÷

1 传统的关系运算

传统的集合运算是二元运算,包括并、差、交、笛卡尔积4种运算。设有两关系R、S。

1.1 并 union

关系R与关系S的并记作: R ∪ S = { t   ∣   t ∈ R ∨ t ∈ S } R\cup S=\{t\ |\ t\in R \lor t\in S\} RS={t  tRtS}合并R和S所有元组

1.2 交 intersection

关系R与关系S的交记作: R ∩ S = { t   ∣   t ∈ R ∧ t ∈ S } R\cap S=\{t\ |\ t\in R \land t\in S\} RS={t  tRtS}关系的交也可用差来表示: R ∩ S = R − ( R − S ) R\cap S=R-(R-S) RS=R(RS)取出R与S中共有的元组

1.3 差 except

关系R与关系S的差记作: R − S = { t   ∣   t ∈ R ∧ t ∉ S } R- S=\{t\ |\ t\in R \land t\notin S\} RS={t  tRt/S}去掉R中属于S的元素

1.4 笛卡尔积 cartesian product

关系R与关系S的并记作: R × S = { t R t S ⌢   ∣   t R ∈ R ∧ t S ∈ S } R\times S=\{\overset{\large\frown}{t_Rt_S}\ |\ t_R\in R \land t_S\in S\} R×S={tRtS  tRRtSS}这里的笛卡尔积指的是广义笛卡尔积,对元组进行笛卡尔积有点类似于小学数学课上学过的握手游戏。

对于 R × S R\times S R×S来说,表示每个R中的元组都要与S中的元组连接一次
在这里插入图片描述

1.5 传统关系运算举例

R R R:

colorpatternsize
A5
B10
B5

S S S:

colorpatternsize
B10
C10
B5

则有:

  • R R R S S S的并 R ∪ S R\cup S RS:
colorpatternsize
A5
B10
B5
C10
  • R R R S S S的交 R ∩ S R\cap S RS:
colorpatternsize
B10
B5
  • R R R S S S的差 R − S R- S RS:
colorpatternsize
A5
  • R R R S S S的笛卡尔积 R × S R\times S R×S
R.colorR.patternR.sizeS.colorS.patternS.size
A5B10
A5C10
A5B5
B10B10
B10C10
B10B5
B5B10
B5C10
B5B5

2 专用的关系运算

专用的关系运算符包括选择、投影、连接、除运算

在具体介绍运算符之前为了方便表达,先引入几个符号:

  • R R R:关系。 R = { r 1 , r 2 , . . . , r n } R=\{r_1,r_2,...,r_n\} R={r1,r2,...,rn},其中 r i r_i ri表示 R R R中的列。类似的, S S S等符号也代表一个关系
  • t t t:元组。 t t t代表 R R R的某一行,称 t t t为元组。
  • t [ r i ] t[r_i] t[ri]:分量。 t [ r i ] t[r_i] t[ri]表示 t t t行中 r i r_i ri列的值,称 t [ r i ] t[r_i] t[ri]为分量。
  • Z t [ r i ] Z_{t[r_i]} Zt[ri]:象集。 Z t [ r i ] Z_{t[r_i]} Zt[ri]表示 t t t行中除 r i r_i ri列外其他列的值,称 Z t [ r i ] Z_{t[r_i]} Zt[ri]为象集。
  • θ \theta θ:比较运算符。比较运算符有6种,分别是 = = = > > > ≥ \geq < < < ≤ \leq < > <> <>
2.1 选择 selection

选择关系运算记作: σ r i θ t [ r i ] ( R ) = {   t   ∣   t ∈ R ∧ r i θ t [ r i ] = t r u e } \sigma_{r_i\theta t[r_i]}(R)=\{\ t\ |\ t\in R\land r_i\theta t[r_i]=true\} σriθt[ri](R)={ t  tRriθt[ri]=true}即取出 R R R表中 r i r_i ri列的值与 t [ r i ] t[r_i] t[ri]具有 θ \theta θ关系的行
例如:
σ S a g e < 20 ( S t u d e n t ) \sigma_{Sage<20}(Student) σSage<20(Student)表示取出 S t u d e n t Student Student表中 S a g e Sage Sage列值小于数值20的行
σ S n a m e = ′ 李 勇 ′ ( S t u d e n t ) \sigma_{Sname='李勇'}(Student) σSname=(Student)表示取出 S t u d e n t Student Student表中 S n a m e Sname Sname列值等于字符串李勇的行

2.2 投影 projection

投影关系运算记作: ∏   r i ( R ) = { t [ r i ]   ∣   t ∈ R } \prod\ _{r_i}(R)=\{t[r_i]\ |\ t\in R\}  ri(R)={t[ri]  tR}即取出 R R R表中的 r i r_i ri
例如:
∏   S a g e ( S t u d e n t ) \prod\ _{Sage}(Student)  Sage(Student)表示从表 S t u d e n t Student Student取出 S a g e Sage Sage列形成新的关系
∏   S a g e , S n a m e ( S t u d e n t ) \prod\ _{Sage,Sname}(Student)  Sage,Sname(Student)表示从表 S t u d e n t Student Student取出 S a g e Sage Sage S n a m e Sname Sname列形成新的关系

2.3 连接 join

连接关系运算记作: r i θ r j R ⋈ S = { t R t S   ∣ t R ∈ R ∧ t S ∈ R ∧ t R [ r i ] θ t S [ r j ]   ⌢ } \overset{R\Join S}{_{r_{i}\theta r_{j}}}=\{\overset{\large\frown}{t_Rt_S\ |t_R\in R \land t_S\in R\land t_R[r_i]\theta t_S[r_j]\ }\} riθrjRS={tRtS tRRtSRtR[ri]θtS[rj] }即选取 R R R S S S的笛卡尔积中 t R [ r i ] t_R[r_i] tR[ri] t S [ r j ] t_S[r_j] tS[rj]满足关系 θ \theta θ的行

连接有四种特殊形式:

  • 非等值连接。就是指 θ \theta θ不为等号的连接,例如 r i < r j R ⋈ S \overset{R\Join S}{_{r_{i}< r_{j}}} ri<rjRS表示连接满足 R . r i < S . r j R.r_i<S.r_j R.ri<S.rj关系的 R R R S S S中的元组
  • 等值连接。就是指 θ \theta θ为等号的连接,例如 r i = r j R ⋈ S \overset{R\Join S}{_{r_{i}=r_{j}}} ri=rjRS表示连接满足 R . r i = S . r j R.r_i=S.r_j R.ri=S.rj关系的 R R R S S S中的元组
  • 自然连接。自然连接是一种特殊的等值连接,就是 r i r_i ri r j r_j rj的属性名一致且值相等的等值连接,并在连接结果中去掉重复列,而在一般的等值连接中只需要满足 r i r_i ri r j r_j rj的值相等即可,记作 R ⋈ S R\Join S RS
  • 外连接。外连接是一种特殊的自然连接,在自然连接的过程中,若连接后元组里的某个属性出现Null值就会舍去该元组,而外连接则会保留该元组。外连接分为三种:
  • 1、外连接。保留两边关系自然连接后出现Null值属性的元组,记作 R : ⋈ : S R:\Join: S R::S
  • 2、左外连接。保留左边关系自然连接后出现Null值属性的元组,记作 R : ⋈ S R:\Join S R:S
  • 3、右外连接。保留右边关系自然连接后出现Null值属性的元组,记作 R ⋈ : S R\Join: S R:S
2.4 除 division

除关系运算记作: R ÷ S = {   t R [ r i ]   ∣   t R ∈ R ∧ ∏   r j ( S ) ⊆ r j   t R [ r i ]   } R\div S=\{\ t_R[r_i]\ |\ t_R\in R\land\prod\ _{r_j}(S)\subseteq r_{j\ t_R[r_i]}\ \} R÷S={ tR[ri]  tRR rj(S)rj tR[ri] }即取出 R R R中使 R . r j R.r_j R.rj完全等于 S . r j S.r_j S.rj R . r i R.r_i R.ri元组
例如:
∏   S n a m e , S a g e ( R ) ÷ ∏   S a g e S \prod\ _{Sname,Sage}(R)\div \prod\ _{Sage}S  Sname,Sage(R)÷ SageS表示取 R R R投影中使 R . S a g e R.Sage R.Sage完全等于 S . a g e S.age S.age R . n a m e R.name R.name元组,形成新的关系

2.5 专用关系运算举例

R R R:

colorpatternsize
A5
B6
C8
D12

S S S:

patternweight
A3
B7
C10
C2
E2
  • R R R的选择, σ c o l o r = ′ 红 ′ ( R ) \sigma_{color='红'}(R) σcolor=(R),取出 R R R表中 c o l o r color color列值为字符串’红’的行形成新的关系:
colorpatternsize
A5
B6
  • R R R的投影, ∏   c o l o r , s i z e ( R ) \prod\ _{color,size}(R)  color,size(R),从表 R R R取出 c o l o r , s i z e color,size color,size列形成新的关系:
colorsize
5
6
8
12
  • R R R S S S的连接

非等值连接, s i z e < w e i g h t R ⋈ S \overset{R\Join S}{_{size< weight}} size<weightRS,连接满足 s i z e < w e i g h t size< weight size<weight关系的 R R R S S S中的元组

colorR.patternsizeS.patternweight
A5B7
A5C10
B6B7
B6C10
C8C10

等值连接, R . p a t t e r n = S . p a t t e r n R ⋈ S \overset{R\Join S}{_{R.pattern= S.pattern}} R.pattern=S.patternRS,连接满足 R . p a t t e r n = S . p a t t e r n R.pattern= S.pattern R.pattern=S.pattern关系的 R R R S S S中的元组

colorR.patternsizeS.patternweight
A5A3
B6B7
C8C10
C8C2

自然连接, R ⋈ S R\Join S RS,连接 R R R S S S中同名属性值相等的元组:

colorpatternsizeweight
A53
B67
C810
C82

外连接, R : ⋈ : S R:\Join: S R::S,保留两边关系自然连接后出现Null值属性的元组:

colorpatternsizeweight
A53
B67
C810
C82
D12null
nullEnull2

左外连接, R : ⋈ S R:\Join S R:S,保留左边关系自然连接后出现Null值属性的元组:

colorpatternsizeweight
A53
B67
C810
C82
D12null

右外连接, R ⋈ : S R\Join: S R:S,保留右边关系自然连接后出现Null值属性的元组:

colorpatternsizeweight
A53
B67
C810
C82
nullEnull2
  • R R R的除运算
    设有除关系 K K K
colorsize
5
6

R ÷ K R\div K R÷K表示取出 R R R中使 R . c o l o r R.color R.color完全等于 S . c o l o r S.color S.color R . s i z e R.size R.size完全等于 S . s i z e S.size S.size R . p a r t t e n R.partten R.partten元组

partten
A
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐