本文内容系2024年北航软件学院数据管理技术课程课堂笔记,内容大部分取自课程PPT,少量来源于互联网,若有侵权请联系删除。文章内容如有错漏,敬请批评指正!
04 - 数据模型-关系代数
2.3 逻辑模型
2.3.2 关系模型
4. 关系代数(操作)
-
由来
数据库语言中查询是最主要的部分,查询的条件要使用关系运算表达式来表示。
因此,关系运算是设计关系数据语言的基础。
按表达查询的方法不同,关系运算可分为关系代数和关系演算两大类。 -
定义
-
关系代数(Relational Algebra):以关系为运算对象。
-
关系代数运算三要素:运算对象——关系、运算结果——关系、运算符——四类
-
四类关系运算符:
-
- 另一个概念:基本运算——集合并、集合差(没有交)、广义笛卡尔积、选择、投影
- 由基本运算可以推导出其他所有运算
-
集合的并、交、差运算——从行的角度进行
-
两个关系 R R R和 S S S若进行并、交、差运算,则它们必须是相容的:
- R R R和 S S S必须同元,即属性数目必须相同
- 对所有 i i i, R R R的第 i i i个属性的域必须和 S S S的第 i i i个属性的域相同
-
并运算(Union):
R ∪ S = { t ∣ t ∈ R ∨ t ∈ S } R\cup S=\{t\,|\,t\in R \vee t\in S\} R∪S={t∣t∈R∨t∈S}-
两个n元关系,且两者对应属性数据类型相同。
-
结果仍为n元关系,由属于 R R R或属于 S S S的元组构成。运算结果中应消除重复行。
-
-
差运算(Difference):
R − S = { t ∣ t ∈ R ∧ t ∉ S } R-S=\{t\,|\,t\in R\wedge t\notin S\} R−S={t∣t∈R∧t∈/S}- 结果为n元关系,由属于R且不属于S的元组构成
-
交运算(Intersection):
R ∩ S = { t ∣ t ∈ R ∧ t ∈ S } R\cap S=\{t\,|\,t\in R\wedge t\in S\} R∩S={t∣t∈R∧t∈S}-
其结果仍为n元关系,由既属于R而又属于S的元组构成。
-
可以通过差运算来重写:
R ∩ S = R − ( R − S ) R\cap S=R-(R-S) R∩S=R−(R−S)
-
-
广义笛卡尔积(Extended Cartesian Product):
-
笛卡尔积:集合运算 vs. 广义笛卡尔积:关系运算
-
两个关系 R R R, S S S,其度(degree)分别为 n n n, m m m,则它们的广义笛卡尔积是所有这样的元组集合:元组的前n个分量是 R R R中的一个元组,后m个分量是 S S S中的一个元组。
R × S = { t ∣ t = ⟨ r , s ⟩ ∧ r ∈ R ∧ s ∈ S } R\times S=\{t\,|\,t=\left\langle r,s\right\rangle\wedge r\in R\wedge s\in S\} R×S={t∣t=⟨r,s⟩∧r∈R∧s∈S}
-
R × S R\times S R×S的度为 R R R与 S S S的度之和, R × S R\times S R×S的元组个数为R和S的元组个数的乘积。
规定,当R和S之一为空集时, R × S R\times S R×S的结果为空集
-
-
-
专门的关系运算
-
选择(selection):选择运算是从指定的关系中选择某些元组形成一个新的关系,被选择的元组是用满足某个逻辑条件来制定的。
σ F ( R ) = { t ∣ t ∈ R ∧ F ( t ) = t r u e } \sigma _F(R)=\{t\,|\,t\in R\wedge F(t)=true\} σF(R)={t∣t∈R∧F(t)=true}- 其中, R R R是关系名, σ \sigma σ是选择运算符, F F F是逻辑表达式。——水平方向
- 例子:逻辑条件为 S a l a r y > 40000 Salary>40000 Salary>40000
-
投影(projection):投影运算对指定的关系进行投影操作,根据该关系分两步产生一个新关系:
- 选择指定的属性,形成一个可能含有重复行的表格
- 删除重复行,形成新的关系
Π A ( R ) = { r . A ∣ r ∈ R } \Pi_A(R)=\{r.A\,|\,r\in R\} ΠA(R)={r.A∣r∈R}
- 其中, R R R是关系名, Π \Pi Π是投影运算符, A A A是被投影的属性或属性集——垂直方向
- 投影运算可以改变关系的属性次序
- 投影后取消了某些属性列,就可能出现重复行,应该取消重复行。故投影之后,不但减少了属性,元组也可能减少,新关系与原关系不相容。
-
连接(join):
-
连接是两个表之间的运算,通常是具有一对多联系的父子关系。故连接过程一般是由参照关系的外键和被参照关系的主键来控制的,这样的属性通常被称为连接属性。
-
定义:从两个广义笛卡尔积中选取给定属性间满足 θ \theta θ操作的元组。
R ⋈ A θ B S = { t ∣ t = < r , s > ∧ r ∈ R ∧ s ∈ S ∧ r [ A ] θ s [ B ] } R\mathop{\bowtie}\limits_{A\theta B} S=\{t\,|\,t=<r,s>\wedge\ r\in R\wedge s\in S\wedge r[A]\;\theta\;s[B]\} RAθB⋈S={t∣t=<r,s>∧ r∈R∧s∈S∧r[A]θs[B]}
- θ \theta θ为算数比较符,当 θ \theta θ为等号时称为等值连接; θ \theta θ为“ < < <”时,称为小于连接; θ \theta θ为“ > > >”时,称为大于连接。此类连接被统称为** θ \;\theta\; θ连接**。
-
-
自然连接(natural join)(最常用的连接)
- 从2个关系的广义笛卡尔积中选取相同属性列上取值相等的元组,并去掉重复的属性列。
R ⋈ S = { t ∣ t = < r , s > ∧ r ∈ R ∧ s ∈ S ∧ r [ B ] = s [ B ] } R\bowtie S=\{t\,|\,t=<r,s>\wedge\ r\in R\wedge s\in S\wedge r[B]=s[B]\} R⋈S={t∣t=<r,s>∧ r∈R∧s∈S∧r[B]=s[B]}
- 等值连接:从2个关系(R、S)的笛卡尔积中选取属性(A、B)值相等的元组
- 自然连接是特殊的等值连接,即在等值连接中取消重复属性
- 派生运算:
R ⋈ S = Π X ( σ r [ A i ] = s [ B j ] ( R × S ) ) R\bowtie S=\Pi_X(\sigma_{r[A_i]=s[B_j]}(R\times S)) R⋈S=ΠX(σr[Ai]=s[Bj](R×S))
-
外连接(outer join):为避免自然连接时因失配而发生的信息丢失,可以假定往参与连接的一方表中附加一个取值全为空值的行,它和参与连接的另一方表中的任何一个未匹配上的元组都能匹配,称之为外连接。
- 外连接 = 自然连接 + 失配的元组
- 外连接的形式:左外连接 R ⟕ S R⟕S R⟕S(左边的所有元组都在,往右边的补null)、右外连接 R ⟖ S R⟖S R⟖S、全外连接 R ⟗ S R⟗S R⟗S。
- 左/右/全外连接 = 自然连接 + 左/右/两侧表中失配的元组(悬浮元组)
- 全外连接 = 左外连接 ∪ \;\cup\; ∪右外连接
-
除(divide)
- 除运算常用于包含语义“至少…”的寓意的查询或运算。
- 设 R ( X , Y ) R(X,Y) R(X,Y)和 S ( Y ) S(Y) S(Y)是两个关系,则:
R ( X , Y ) ÷ S ( Y ) = Π X ( R ) − Π X ( Π X ( R ) × Π Y ( S ) − R ) R(X,Y)\div S(Y)=\Pi_X(R)-\Pi_X(\Pi_X(R)\times \Pi_Y(S)-R) R(X,Y)÷S(Y)=ΠX(R)−ΠX(ΠX(R)×ΠY(S)−R)
- 除运算定义:设有关系 R ( X , Y ) R(X,Y) R(X,Y)和 S ( Y ) S(Y) S(Y),其中X、Y可以是单个属性或属性集,则:
R ÷ S = { r . X ∣ r ∈ R ∧ Y X ⊇ S } R\div S=\{r.X\,|\,r\in R\,\wedge Y_X \supseteq S\} R÷S={r.X∣r∈R∧YX⊇S}
书上定义:设关系 R R R除以关系 S S S的结果为关系 T T T,则 T T T包含所有在 R R R但不在 S S S中的属性及其值,且 T T T的元组与 S S S的元组的所有组合都在 R R R中。
计算方法:先算 R R R中所有 R − S R-S R−S属性的象集,再算 S S S在 R ∩ S R\cap S R∩S上的投影,看 R R R中哪个 R − S R-S R−S包含了这个投影。
-
my understanding: R与S除运算的结果是:至少拥有S表中所有属性取值的 R表中其他属性取值
-
练习:
- 查询至少选修了一门其直接先行课为5号课程的学生姓名。
Π S n a m e ( σ C p n o = 5 ( C O U R S E ) ⋈ S C ⋈ Π S n o , S n a m e ( S T U D E N T ) ) \Pi_{Sname}(\sigma_{Cpno=5}(COURSE)\bowtie SC \bowtie \Pi_{Sno,Sname}(STUDENT)) ΠSname(σCpno=5(COURSE)⋈SC⋈ΠSno,Sname(STUDENT))
- 查询选修了全部课程的学生号和姓名
( Π S n o , C n o ( S C ) ÷ Π C n o ( C O U R S E ) ) ⋈ Π S n o , S n a m e ( S T U D E N T ) (\Pi_{Sno,Cno}(SC)\div\Pi_{Cno}(COURSE))\bowtie\Pi_{Sno,Sname}(STUDENT) (ΠSno,Cno(SC)÷ΠCno(COURSE))⋈ΠSno,Sname(STUDENT)
-
思考题:查询最多选修了一门其直接先行课为5号课程的学生姓名
方法:检索两门以上先行课为5号的(在选课表中任选S1和S2,连接起来看),然后用学生全集减去
Π S n a m e ( S T U D E N T ) − Π S n a m e ( σ S 1 . C p n o = 5 ∧ S 2 . C p n o = 5 ( S 1 ⋈ S 1 . S n o = S 2 . S n o S 2 ) ) \Pi_{Sname}(STUDENT)-\Pi_{Sname}(\sigma_{S_1.Cpno=5\wedge S_2.Cpno=5}(S_1\mathop{\bowtie}\limits_{S_1.Sno=S_2.Sno}S_2)) ΠSname(STUDENT)−ΠSname(σS1.Cpno=5∧S2.Cpno=5(S1S1.Sno=S2.Sno⋈S2))
-