【四】关系模型 -- 关系代数

  • 关系代数
    • 关系代数概述
      • 关系代数操作
      • 为什么要提出关系代数
    • 关系代数之基本操作
      • 并相容性
      • 1. 并(Union)
      • 2. 差(Difference)
      • 3. 广义笛卡尔积 (Cartesian Product)
      • 4. 选择(Select)
      • 5. 投影(Project)
      • 小结 - 关系代数的基本书写思路
    • 关系代数之扩展操作
      • 1. 交(Intersection)
      • 2. θ \theta θ-连接( θ \theta θ-Join, theta-Join)
      • 3. 等值连接(Equi-Join)
      • 4. 自然连接(Natural-Join)
      • 小结 - 关系代数的基本书写思路
    • 关系代数之组合与应用训练
      • 例题
      • 书写关系代数表达式的基本思路
    • 关系代数之复杂扩展操作(选学)
      • 1. 除(Division)
      • 2. 外连接(Outer-Join)
  • 内容回顾
  • 练习

关系代数

【重点与难点】

  • 关系代数基本操作:并、差、积、选择、投影、(更名)。
  • 关系代数扩展操作:交、 θ \theta θ-连接、自然连接。
  • 关系代数复杂扩展操作:除、外连接
  • 书写关系代数的基本思维训练:“一个集合,施加一个操作得到一个集合,依次施加关系代数操作,进而得到所需结果”、“以集合为中心”

关系代数概述

  • 基于集合,提供了一系列的关系代数操作:并、差、笛卡尔积(广义积)、选择、投影和更名基本操作
  • 以及 交、连接和关系除扩展操作,是一种集合思维的操作语言。
  • 关系代数操作 以一个或多个关系为输入,结果是一个新的关系
  • 用对关系的运算来表达查询,需要指明所用操作,具有一定的 过程性

在这里插入图片描述

  • 是一种抽象的语言,是学习其他数据库语言,如 SQL 等的基础。

关系代数操作

关系代数操作集合操作纯关系操作

【四】关系模型 -- 关系代数_第1张图片
集合操作包括 并、交、差 和 笛卡尔积,输入是两个关系。

【四】关系模型 -- 关系代数_第2张图片

为什么要提出关系代数

【四】关系模型 -- 关系代数_第3张图片

  • 计算机内部实际上就一些与、或、非的动作,将这些动作抽象出来名字分别为 ANDORNOT,这就是一些指令;
  • 然后我们可以用这些指令去表达一些复杂的操作,计算机去解释这种组合,按次序执行基本动作。

【四】关系模型 -- 关系代数_第4张图片

  • 类比到关系代数,我们也抽象出基本动作的指令名称,然后用这些基本动作的指令组合表示复杂动作;
  • 数据库管理系统就是用来完成解释这种组合并按次序执行基本动作的程序执行机构。

关系代数之基本操作

某些关系代数操作,如并、差、交等,需满足 “并相容性” 。

并相容性

参与运算的两个关系及其相关属性之间有一定的对应性、可比性或意义关联性。

【定义】关系 R \mathbf R R 与关系 S \mathbf S S 存在 并相容性,当且仅当:
(1) 关系 R \mathbf R R 和关系 S \mathbf S S属性数目必须相同
(2) 对于 任意 i i i关系 R \mathbf R R 的第 i i i 个属性的域必须和关系 S \mathbf S S 的第 i i i 个属性的域相同

假设: R ( A 1 , A 2 , … , A n ) \mathbf R(A_1, A_2, … , A_n) R(A1,A2,,An) S ( B 1 , B 2 , … , B m ) \mathbf S(B_1, B_2, … ,B_m) S(B1,B2,,Bm)
R \mathbf R R S \mathbf S S 满足 并相容性 n = m n = m n=m 并且 D o m a i n ( A i ) = D o m a i n ( B i ) Domain(A_i) = Domain(B_i) Domain(Ai)=Domain(Bi)

【并相容性的示例】

STUDENT(SID char(10), Sname char(8), Age char(3))
PROFESSOR(PID char(10), Pname char(8), Age char(3))

关系 S T U D E N T \mathbf {STUDENT} STUDENT 与关系 P R O F E S S O R \mathbf {PROFESSOR} PROFESSOR 是相容的,因为:
(1) 关系 R \mathbf R R 和关系 S \mathbf S S 的属性数目都是3;
(2) 关系 R \mathbf R R 的属性 SID 与关系 S \mathbf S S 的属性 PID 的域都是 char(10)
(3) 关系 R \mathbf R R 的属性 Sname 与关系 S \mathbf S S 的属性 Sname 的域都是 char(8)
(4) 关系 R \mathbf R R 的属性 Age 与关系 S \mathbf S S 的属性 Age 的域都是 char(3)

1. 并(Union)

定义:假设关系 R \mathbf R R 和关系 S \mathbf S S 是并相容的,则关系 R \mathbf R R 与关系 S \mathbf S S 的并运算结果也是一个关系,记作: R ∪ S \mathbf R∪\mathbf S RS,它由或者出现在关系 R \mathbf R R 中,或者出现在 S \mathbf S S 中的元组构成。

数学描述: R ∪ S = { t ∣ t ∈ R ∨ t ∈ S } \mathbf R∪\mathbf S = \{ t | t ∈ \mathbf R \vee t ∈ \mathbf S \} RS={ttRtS},其中 t t t 是元组。

并运算是将两个关系的元组合并成一个关系,在 合并时去掉重复的元组
R ∪ S \mathbf R ∪\mathbf S RS S ∪ R \mathbf S ∪\mathbf R SR 运算的结果是同一个关系。

【四】关系模型 -- 关系代数_第5张图片

【并操作的示例一】(抽象的)

假设 R \mathbf R R S \mathbf S S 是并相容的两个关系,则 R ∪ S \mathbf R \cup \mathbf S RS 是几个元组呢?

【四】关系模型 -- 关系代数_第6张图片

【并操作的示例二】(语义的)

查询或者参加体育队 或者 参加文艺队所有学生的信息:

【四】关系模型 -- 关系代数_第7张图片

【并操作的示例三】(语义的)

R \mathbf R R 为计算机学院的学生, S \mathbf S S 为材料学院的学生,
则: R ∪ S \mathbf R ∪\mathbf S RS 为两院所有的学生。

R \mathbf R R 为学过数据库课程的学生, S \mathbf S S 为学过自控理论课程的学生,
则: R ∪ S \mathbf R∪\mathbf S RS 为学过两门课之一的所有学生。

汉语中的 “或者…或者…” 通常意义是 并运算 的要求。

2. 差(Difference)

定义:假设关系 R \mathbf R R 和关系 S \mathbf S S 是并相容的,则关系 R \mathbf R R 与关系 S \mathbf S S 的差运算结果也是一个关系,记作: R − S \mathbf R - \mathbf S RS,它由出现在关系 R \mathbf R R 中但不出现在关系 S \mathbf S S 中的元组构成。

数学描述: R − S = { t ∣ t ∈ R ∧ t ∉ S } \mathbf R - \mathbf S = \{ t | t ∈ \mathbf R \wedge t \notin \mathbf S \} RS={ttRt/S},其中 t t t 是元组。

R − S \mathbf R - \mathbf S RS S − R \mathbf S - \mathbf R SR 是不同的。

在这里插入图片描述

【差操作的示例一】(抽象的)

假设 R \mathbf R R S \mathbf S S 是并相容的两个关系,则 R − S \mathbf R - \mathbf S RS 是? S − R \mathbf S - \mathbf R SR 是?

【四】关系模型 -- 关系代数_第8张图片
很明显, R − S \mathbf R - \mathbf S RS 就是从关系 R \mathbf R R 中去掉关系 S \mathbf S S 中的元组, S − R \mathbf S - \mathbf R SR 就是从关系 S \mathbf S S 中去掉关系 R \mathbf R R 中的元组。

【差操作的示例二】(语义的)

  • 查询 只参加 体育队而 未参加 文艺队的学生信息;
  • 查询 只参加 文艺队而 未参加 体育队的学生信息。

【四】关系模型 -- 关系代数_第9张图片

【差操作的示例三】(语义的)

R \mathbf R R 为计算机学院的学生, S \mathbf S S 为四年级的学生,则:

  • R - S \mathbf R-\mathbf S RS 为计算机学院非四年级的学生;
  • S − R \mathbf S - \mathbf R SR 为 四年级非计算机学院的学生;

R \mathbf R R 为学过数据库课程的学生, S \mathbf S S 为学过自控理论课程的学生, 则:

  • R - S \mathbf R - \mathbf S RS 为学过数据库课程但没学过自控理论课程的所有学生;

汉语中的 “是…但不含…” 通常意义是 差运算 的要求。

3. 广义笛卡尔积 (Cartesian Product)

定义:关系 R ( < a 1 , a 2 , … , a n > ) \mathbf R () R(<a1,a2,,an>) 与关系 S ( < b 1 , b 2 , … , b m > ) \mathbf S() S(<b1,b2,,bm>) 的笛卡尔积运算结果也是一个关系,记作: R × S \mathbf R × \mathbf S R×S,它由关系 R \mathbf R R 中的元组与关系 S \mathbf S S 的元组进行所有可能的拼接(或串接)构成。

数学描述: R × S = { < a 1 , a 2 , … , a n , b 1 , b 2 , … , b m > ∣ < a 1 , a 2 , … , a n >   ∈ R   ∧ < b 1 , b 2 , … , b m >   ∈ S } \mathbf R × \mathbf S = \{ | \ \in \mathbf{R} \ \wedge \ \in \mathbf{S} \} R×S={<a1,a2,,an,b1,b2,,bm><a1,a2,,an> R <b1,b2,,bm> S}

【广义积操作的示例一】(抽象的)

关系 R \mathbf R R 的元组数目是3,度数是3;关系 S \mathbf S S 的元组数目是4,度数是3;则 R × S \mathbf R × \mathbf S R×S 的元组数目是12,度数是6 ?

【四】关系模型 -- 关系代数_第10张图片
【四】关系模型 -- 关系代数_第11张图片

【广义积操作的示例二】 (抽象的)

【四】关系模型 -- 关系代数_第12张图片

【广义积操作的示例二】(语义的)

一个检索涉及到多个表 时(如学生表和课程表),便 需要将这些表串接或
拼接起来,然后才能检索
,这时,就要使用广义笛卡尔积运算,是后面学习各种连接运算的基础。

【四】关系模型 -- 关系代数_第13张图片

R × S = S × R \mathbf R × \mathbf S = \mathbf S × \mathbf R R×S=S×R

  • R × S \mathbf R × \mathbf S R×S R \mathbf R R 中的每一个元组都和 S \mathbf S S 中的所有元组进行串接;
  • S × R \mathbf S × \mathbf R S×R S \mathbf S S 中的每一个元组都和 R \mathbf R R 中的所有元组进行串接;
  • 结果是相同的。
  1. 两个关系 R \mathbf R R S \mathbf S S,它们的属性个数分别为 n n n m m m R \mathbf R R n n n 度关系, S \mathbf S S m m m 度关系),则笛卡尔积 R × S \mathbf R × \mathbf S R×S 的属性个数 = n + m = n + m =n+m

即元组的前 n n n 个分量是 R \mathbf R R 中元组的分量,后 m m m 个分量是 S \mathbf S S 中元组的分量( R × S \mathbf R × \mathbf S R×S n + m n+m n+m 度关系)。

  1. 两个关系 R \mathbf R R S \mathbf S S,它们的元组个数分别为 x x x y y y(关系 R \mathbf R R 的基数 x x x,S的基数 y y y),则笛卡尔积 R × S \mathbf R × \mathbf S R×S 的元组个数 = x × y = x × y =x×y。( R × S \mathbf R × \mathbf S R×S 的基数是 x × y x × y x×y)。

4. 选择(Select)

定义:给定一个关系 R \mathbf R R,同时给定一个选择的条件 condition(简记 con),选
择运算结果也是一个关系,记作 σ c o n ( R ) \sigma_{con}( \mathbf R) σcon(R) ,它从关系 R \mathbf R R 中选择出满足给定条件 condition 的元组构成。

数学描述: σ c o n ( R ) = { t ∣ t ∈ R ∧ c o n ( t ) = ‘ t r u e ’ } \sigma_{con}( \mathbf R) = \{ t | t \in R \wedge con(t) = ‘true’ \} σcon(R)={ttRcon(t)=true}

  • R ( A 1 , A 2 , … , A n ) \mathbf R(A_1 ,A_2 , … ,A_n) R(A1,A2,,An) t t t R \mathbf R R 的元组, t t t 的分量记为 t [ A i ] t[A_i] t[Ai],或简写为 A i A_i Ai
  • 条件 c o n con con 由逻辑运算符连接比较表达式组成;
  • 逻辑运算符: ∨ \vee ∧ \wedge ¬ \neg ¬ 或 写为 and,or,not;
  • 比较表达式: X θ Y X \theta Y Y,其中 X X X Y Y Y t t t 的分量、常量或简单函数, θ \theta θ 是比较运算符, θ ∈ { > , ≥ , < , ≤ , = , ≠ } \theta \in \{ > , ≥, < , ≤ , = , ≠ \} θ{>,,<,,=,=}

【选择操作的示例一】(抽象的)

  • 选择 A 3 A_3 A3 值大于0的元组 ?
  • 选择 A 2 A_2 A2 值为 a a a 或者 b b b 的元组 ?
  • 选择 A 3 A_3 A3 大于0且 A 1 A_1 A1 等于 A 2 A_2 A2 的元组 ?

【四】关系模型 -- 关系代数_第14张图片

【选择操作的示例二】(语义的)

【四】关系模型 -- 关系代数_第15张图片

【选择操作的示例三】(语义的)

【四】关系模型 -- 关系代数_第16张图片

【选择操作的示例四】(语义的)

  • 选择操作 从给定的关系中 选出满足条件的行
  • 条件的书写很重要,尤其是当不同运算符在一起时,要注意运算符的优先次序,优先次序自高至低{ 括号; θ \theta θ ¬ \neg ¬ ∧ \wedge ∨ \vee }。

例如:
Sage<20 ∨ Sage>18 ∧ D# = “03”(Sage<20 ∨ Sage>18) ∧ D# = “03”

5. 投影(Project)

定义:给定一个关系 R \mathbf R R,投影运算结果也是一个关系,记作 ∏ A ( R ) \prod _A(\mathbf R) A(R) ,它从关系 R \mathbf R R选出属性包含在 A A A 中的列 构成。

数学描述: ∏ A i 1 , A i 2 , … , A i k ( R ) = { < t [ A i 1 ] , t [ A i 2 ] , … , t [ A i k ] > ∣   t ∈ R } \prod_{A_{i1}, A_{i2}, … ,A_{ik}}(R) = \{ | \ t \in \mathbf R \} Ai1,Ai2,,Aik(R)={<t[Ai1],t[Ai2],,t[Aik]> tR}

  • R ( A 1 , A 2 , … , A n ) \mathbf R(A_1 ,A_2 , … ,A_n) R(A1,A2,,An)
  • { A i 1 , A i 2 , … , A i k } ⊆ { A 1 , A 2 , … , A n } \{ A_{i1}, A_{i2}, … ,A_{ik} \} \subseteq \{ A_1 ,A_2 , … ,A_n \} {Ai1,Ai2,,Aik}{A1,A2,,An}
  • t [ A i ] t[A_i] t[Ai] 表示元组 t t t 中相应于属性 A i A_i Ai 的分量;

投影运算可以 对原关系的列在投影后重新排列

【投影 VS 选择】
投影操作 从给定关系中 选出某些列 组成新的关系,而 选择操作 是从给定关系中 选出某些行 组成新的关系。

【投影操作的示例一】(抽象的)

投影出 A 3 A_3 A3 列的元组?
投影出 A 3 , A 1 A_3,A_1 A3,A1 两列的元组?

【四】关系模型 -- 关系代数_第17张图片

如果 投影后有重复元组,则应去掉

【四】关系模型 -- 关系代数_第18张图片

【投影操作的示例二】(语义的)

【四】关系模型 -- 关系代数_第19张图片

【投影与选择操作一起使用的示例】(语义的)

【四】关系模型 -- 关系代数_第20张图片

小结 - 关系代数的基本书写思路

【四】关系模型 -- 关系代数_第21张图片

关系代数的基本书写思路

  • 选出将用到的 关系/表(可能不止用到一个表);
  • “积” 运算(需要联合查询 多个表);
  • 选择 运算 保留所需的行/元组
  • 投影 运算 保留所需的列/属性

关系代数之扩展操作

1. 交(Intersection)

定义:假设关系 R \mathbf R R 和关系 S \mathbf S S 是并相容的,则关系 R \mathbf R R 与关系 S \mathbf S S 的交运算结果也是一个关系,记作: R ∩ S \mathbf R ∩\mathbf S RS,它由同时出现在关系 R \mathbf R R 和关系 S \mathbf S S 中的元组构成。

数学描述: R ∩ S = { t   ∣   t ∈ R   ∧ t ∈ S } \mathbf R ∩ \mathbf S = \{ t \ | \ t \in R \ \wedge t \in S \} RS={t  tR tS},其中 t t t 是元组

  • R ∩ S \mathbf R∩\mathbf S RS S ∩ R \mathbf S∩\mathbf R SR 运算的结果是同一个关系
  • 交运算可以通过差运算来实现: R ∩ S = R − ( R − S ) = S − ( S − R ) \mathbf R ∩ \mathbf S = \mathbf R - (\mathbf R - \mathbf S) = \mathbf S - (\mathbf S - \mathbf R) RS=R(RS)=S(SR)

【四】关系模型 -- 关系代数_第22张图片

【交操作的示例一】(抽象的)

假设 R \mathbf R R S \mathbf S S 是并相容的两个关系,则 R ∩ S \mathbf R ∩ \mathbf S RS

【四】关系模型 -- 关系代数_第23张图片

【交操作的示例二】(语义的)

查询既参加体育队又参加文艺队的学生信息:

【四】关系模型 -- 关系代数_第24张图片

【交操作的示例三】(语义的)

  • R \mathbf R R 为年龄小于20岁的学生, S \mathbf S S 为计算机学院的学生, 则: R ∩ S \mathbf R ∩ \mathbf S RS 为计算机学院并且年龄小于20岁的所有学生
  • R \mathbf R R 为学过数据库课程的学生, S \mathbf S S 为学过自控理论课程的学生,则: R ∩ S \mathbf R ∩ \mathbf S RS 为既学过数据库课程又学过自控理论课程的所有学生

汉语中的 “既…又…”,“…, 并且…” 通常意义是 交运算 的要求。

2. θ \theta θ-连接( θ \theta θ-Join, theta-Join)

投影与选择操作只是对单个关系(表)进行操作,而实际应用中往往涉及多个表之间的操作,这就需要 θ \theta θ-连接操作

比如:查询数据结构成绩在90分以上的学生姓名(涉及 S t u d e n t \mathbf Student Student(学生姓名), C o u r s e \mathbf Course Course(数据结构), S C \mathbf SC SC(成绩))

【四】关系模型 -- 关系代数_第25张图片

定义:给定关系 R \mathbf R R 和关系 S \mathbf S S R \mathbf R R S \mathbf S S θ \theta θ 连接运算结果也是一个关系,记作在这里插入图片描述,它由关系 R \mathbf R R 和关系 S \mathbf S S 的笛卡尔积中,选取 R \mathbf R R 中属性 A A A S \mathbf S S 中属性 B B B 之间满足 θ \theta θ 条件的元组构成。

数学描述:
在这里插入图片描述

  • R ( A 1 , A 2 , … , A n ) , A ∈ { A 1 , A 2 , … , A n } \mathbf R(A_1 ,A_2 , … ,A_n), A \in \{ A_1 ,A_2 , … ,A_n \} R(A1,A2,,An),A{A1,A2,,An}
  • S ( B 1 , B 2 , … , B m ) , B ∈ { B 1 , B 2 , … , B m } \mathbf S(B_1 ,B_2 , … ,B_m), B \in \{ B_1 ,B_2 , … ,B_m \} S(B1,B2,,Bm),B{B1,B2,,Bm}
  • t t t 是关系 R \mathbf R R 中的元组, s s s 是关系 S \mathbf S S 中的元组
  • 属性 A A A 和属性 B B B 具有可比性
  • θ \theta θ 是比较运算符, θ ∈ { > , ≥ , < , ≤ , = , ≠ } \theta \in \{ > , ≥ , < , ≤ , = , ≠ \} θ{>,,<,,=,=}

在实际应用中, θ \theta θ-连接操作经常与投影、选择操作一起使用。

θ \theta θ-连接( θ \theta θ-Join)操作的示例一】(抽象的)

【四】关系模型 -- 关系代数_第26张图片

θ \theta θ-连接操作的示例二】(语义的)

员工表 Worker(W#, Wname, Wsex, Wage, Degree),职位限定表 Position(Type, Limited_Degree),竞聘的岗位必须由不低于其最低学历要求的人员担任,

【四】关系模型 -- 关系代数_第27张图片

找出 所有员工的姓名 及其可能 竞聘职位 的名称:

【四】关系模型 -- 关系代数_第28张图片

  • 第一步:对两个表进行广义笛卡尔积;
  • 第二步:从广义笛卡尔积中 选取出符合 (degree >= limited_degree) 条件 的元组;

【四】关系模型 -- 关系代数_第29张图片

  • 第三步:在 (Wname, Type) 上进行投影操作,得到最终的结果。

【四】关系模型 -- 关系代数_第30张图片

θ \theta θ-连接操作的示例三】(续)
关系与自身的 θ \theta θ-连接:查询至少 98030101 号同学和 98040202 号同学学过的所有课程号:

在这里插入图片描述

注:上式 ρ S C 1 ( S C ) \rho_{\mathbf {SC1}} (\mathbf{SC}) ρSC1(SC) 表更名 操作,即将表 S C \mathbf SC SC 更名为 S C 1 \mathbf SC1 SC1当一个表需要和其自身进行连接运算 时,通常要使用更名操作。

【四】关系模型 -- 关系代数_第31张图片

【四】关系模型 -- 关系代数_第32张图片

【特别注意】
虽然在讲解 θ \theta θ-连接操作时,使用笛卡尔积然后再进行选择来得到 θ \theta θ-连接结果,这主要是方便大家理解。但当 引入连接操作后,DBMS 可直接进行连接操作,而不必先形成笛卡尔积

3. 等值连接(Equi-Join)

定义:给定关系 R \mathbf R R 和关系 S \mathbf S S R \mathbf R R S \mathbf S S等值连接 运算结果也是一个关系,记作在这里插入图片描述 ,它 由关系 R \mathbf R R 和关系 S \mathbf S S 的笛卡尔积中选取 R \mathbf R R 中属性 A A A S \mathbf S S 中属性 B B B 上值相等的元组所构成

数学描述:
【四】关系模型 -- 关系代数_第33张图片

  • θ \theta θ-连接中运算符为 “=” 时,就是 等值连接,等值连接是 θ \theta θ-连接的一个特例;
  • 广义积的元组组合并不是都有意义的,另广义积的元组组合数目也非常庞大,因此 采用 θ \theta θ -连接/等值连接运算可大幅度降低中间结果的保存量,提高速度

【等值连接(Equi-Join)操作的示例一】(抽象的)

【四】关系模型 -- 关系代数_第34张图片

【等值连接(Equi-Join)操作的示例二】(语义的)

员工表 Worker(W#, Wname, Wsex, Wage, Honor_type),获奖类别表 Honor(Type, Title),找出所有获奖员工姓名、年龄及其获奖的名称:

在这里插入图片描述

【四】关系模型 -- 关系代数_第35张图片

  • 第一步:对两个表进行广义笛卡尔积;
  • 第二步:从广义笛卡尔积中 选取出符合 (Honor_type=Type) 条件的元组

【四】关系模型 -- 关系代数_第36张图片

  • 第三步:在 (Wname, Wage, Title) 上进行投影运算,得到最终结果。

【四】关系模型 -- 关系代数_第37张图片

4. 自然连接(Natural-Join)

定义:给定关系 R \mathbf R R 和关系 S \mathbf S S R \mathbf R R S \mathbf S S 的自然连接运算结果也是一个关系,记作 R ⋈ S \mathbf R \Join \mathbf S RS,它由关系 R \mathbf R R 和关系 S \mathbf S S 的笛卡尔积中选取相同属性组 B B B 上值相等的元组所构成。

数学描述:
在这里插入图片描述

  • 自然连接是一种特殊的等值连接;
  • 要求关系 R \mathbf R R 和关系 S \mathbf S S 必须有相同的属性组 B B B (如 R \mathbf R R S \mathbf S S 共有一个属性 B 1 B_1 B1,则 B B B B 1 B_1 B1;如 R \mathbf R R S \mathbf S S 共有一组属性 B 1 , B 2 , … , B n B_1, B_2, …, B_n B1,B2,,Bn,则 B B B 是这些共有的所有属性)
  • R \mathbf R R S \mathbf S S 属性相同,值必须相等才能连接,即 R . B 1 = S . B 1   a n d   R . B 2 = S . B 2   …   a n d   R . B n = S . B n \mathbf R.B1 = \mathbf S.B1 \ and \ \mathbf R.B2 = \mathbf S.B2\ … \ and \ \mathbf R.Bn = \mathbf S.Bn R.B1=S.B1 and R.B2=S.B2  and R.Bn=S.Bn 才能连接
  • 要在 结果中去掉重复的属性列(因结果中 R . B i \mathbf R.Bi R.Bi 始终是等于 S . B i \mathbf S.Bi S.Bi 所以可只保留一列即可)

【自然连接(Natural-Join)操作的示例一】(抽象的)

【四】关系模型 -- 关系代数_第38张图片

【自然连接(Natural-Join)操作的示例二】(语义的)

学生选课表 SC(S#, C#, Score) ,课程表 Course (C#, Cname, Chours, Credit, T#)

【四】关系模型 -- 关系代数_第39张图片

查询所有学生选课的成绩(包括学号,课程名称,成绩):

在这里插入图片描述

  • 第一步:对两个表进行广义笛卡尔积;
  • 第二步:从广义笛卡尔积中 选取在相同列 (C#) 上值相同的元组

【四】关系模型 -- 关系代数_第40张图片

  • 第三步:去掉重复的列;

【四】关系模型 -- 关系代数_第41张图片

  • 第四步:在 (S#, Cname, Score) 上进行投影操作,得到最终结果。

【四】关系模型 -- 关系代数_第42张图片

提问:如果查询所有学生选课的成绩 (包括学生姓名,课程名称,成绩)

在这里插入图片描述

【四】关系模型 -- 关系代数_第43张图片

小结 - 关系代数的基本书写思路

【四】关系模型 -- 关系代数_第44张图片
关系代数的基本书写思路

  • 选出将用到的 关系/表(可能不止用到一个表);
  • “积” 运算(可用连接运算替换)(需要联合查询 多个表);
  • 选择 运算 保留所需的行/元组
  • 投影 运算 保留所需的列/属性

关系代数之组合与应用训练

例题

【四】关系模型 -- 关系代数_第45张图片
【四】关系模型 -- 关系代数_第46张图片
【四】关系模型 -- 关系代数_第47张图片

  1. 查询学习 课程号002学生学号成绩

【思路】首先 根据题目属性定位需要查询的表,课程号 C#,学生学号 S#,成绩 Score S C \mathbf {SC} SC 表包含全部属性,故查询 S C \mathbf {SC} SC 表即可。

单表查询,不需要做笛卡尔积或连接运算,直接 选择 + 投影 即可。

在这里插入图片描述

  1. 查询学习 课程号001学生学号姓名

【思路】首先 根据题目属性定位需要查询的表,课程号 C#,学生学号 S#,姓名 Sname S C \mathbf {SC} SC 表包含 S#C# S t u d e n t \mathbf {Student} Student 包含 S#Sname,故查询 S C \mathbf {SC} SC 表和 S t u d e n t \mathbf {Student} Student 表。

双表查询,需要 连接 + 选择 + 投影。这里两个表有共同属性 S#,采用自然连接。

在这里插入图片描述

【注意连接与积的差别】

在这里插入图片描述

【四】关系模型 -- 关系代数_第48张图片

  1. 查询学习 课程名称 为数据结构的 学生学号姓名 和这门课程的 成绩

【思路】首先 根据题目属性定位需要查询的表,课程名称 Cname,学生学号 S#,姓名 Sname,成绩 Score S C \mathbf {SC} SC 表包含 S#C# S t u d e n t \mathbf {Student} Student 包含 S#Sname C o u r s e \mathbf Course Course 表包含 C#Cname,故查询 S C \mathbf {SC} SC 表和 S t u d e n t \mathbf {Student} Student 表 和 C o u r s e \mathbf {Course} Course 表。

三表查询,需要 连接 + 选择 + 投影。这里 S C \mathbf {SC} SC 表和 S t u d e n t \mathbf {Student} Student 表有共同属性 S# S C \mathbf {SC} SC 表和 C o u r s e \mathbf {Course} Course 表有共同属性 C#,采用自然连接。

【四】关系模型 -- 关系代数_第49张图片

  1. 查询学习课程号为 001002 的学生的学号;

在这里插入图片描述

  1. 查询 至少 学习课程号为 001002 的学生的学号;

是否可写成如下形式呢?

在这里插入图片描述

不可以,因为这相当于让一个元组中的 C#001 值,也有 002 值,而一个元组只有一个值,是不对的,所以上述查询结果为空的表。

正确查询语句如下:

在这里插入图片描述

请问:上式使用的是等值连接,换成自然连接,写成如下形式是否正确?

在这里插入图片描述

注意这也是不对的,因为自然连接是共同属性的值对应相等,而这两个表是相同的, S C 1 \mathbf {SC1} SC1 是由 S C \mathbf {SC} SC 表更名之后得到,内容相同,所以自然连接去除同名属性列后还是三个属性,结果依然是空。

我们也可以采用交运算来实现:

在这里插入图片描述

  1. 查询不学习课程号为002的学生姓名和年龄;
  • 这样对不对呢?
    在这里插入图片描述
    不对,因为如果一个学生选了不止 002 号课程还选择了其他的如 003 号课程,那么这条语句不选择 002 号这个元组,但是会选择 003 号这个元组,那么这位同学 还是被筛选了出来,所以这条语句可能会筛选出所有学生,除非有个学生只选了 002 号这一门课程。

  • 那这样对不对呢?
    在这里插入图片描述
    从思路上讲是对的,但是不符合规定,因为差操作需要满足并相容性, S \mathbf S S S C \mathbf {SC} SC 自然连接后得到的属性多于 S \mathbf S S 的属性,这里不满足并相容性。

S \mathbf S S 也进行投影,再对 S \mathbf S S S C \mathbf {SC} SC 自然连接后得到的表进行 选择 + 投影,得到的表满足并相容性后,再做差。

在这里插入图片描述

书写关系代数表达式的基本思路

  1. 检索 是否涉及多个表,如不涉及,则可直接采用 并、差、交、选择与投影,只要注意条件书写正确与否即可;

  2. 涉及多个表,则检查:
    能否使用 自然连接,将多个表连接起来(多数情况是这样的);
    如不能,能否使用 等值或不等值连接( θ \theta θ-连接)
    还不能,则使用 广义笛卡尔积,注意相关条件的书写;

  3. 连接完后,可以继续使用 选择、投影 等运算,即所谓数据库的 “选投联” 操作。

【四】关系模型 -- 关系代数_第50张图片

关系代数之复杂扩展操作(选学)

1. 除(Division)

除法运算 经常用于求解 “查询… 全部的/所有的…” 问题。

前提条件:给定关系 R ( A 1 , A 2 , … , A n ) \mathbf R(A_1 ,A_2 , … ,A_n) R(A1,A2,,An) n n n 度关系,关系 S ( B 1 , B 2 , … , B m ) \mathbf S(B_1 ,B_2 , … ,B_m) S(B1,B2,,Bm) m m m 度关系。如果可以进行关系 R R R 与关系 S S S 的除运算,当且仅当:属性集 { B 1 , B 2 , … , B m } \{ B_1 ,B_2 , … , B_m \} {B1,B2,,Bm} 是属性集 { A 1 , A 2 , … , A n } \{ A_1 ,A_2 , … ,A_n \} {A1,A2,,An} 的真子集,即 m < n m < n m<n

先举个例子帮助理解:

【四】关系模型 -- 关系代数_第51张图片

定义:关系 R \mathbf R R 和关系 S \mathbf S S 的除运算结果也是一个关系,记作 R ÷ S \mathbf R ÷ \mathbf S R÷S,分两部分来定义。

  1. 先定义 R ÷ S \mathbf R ÷ \mathbf S R÷S 结果的属性应有哪些?

设属性集 { C 1 , C 2 , … , C k } = { A 1 , A 2 , … , A n } – { B 1 , B 2 , … , B m } \{C_1,C_2, … ,C_k \} = \{A_1,A_2, … ,A_n \} – \{B_1,B_2, … ,B_m \} {C1,C2,,Ck}={A1,A2,,An}{B1,B2,,Bm},则有 k = n – m k=n–m k=nm,则 R ÷ S R÷S R÷S 结果关系是 k k k 度 ( n − m n-m nm 度)关系,由 { C 1 , C 2 , … , C k } \{C_1,C_2, … ,C_k \} {C1,C2,,Ck} 属性构成。

  1. 再定义 R ÷ S \mathbf R÷ \mathbf S R÷S 的元组怎样形成?

再设关系 R ( < a 1 , … , a n > ) \mathbf R () R(<a1,,an>) 和关系 S ( < b 1 , … , b m > ) \mathbf S () S(<b1,,bm>),那么 R ÷ S \mathbf R÷ \mathbf S R÷S 结果关系为元组 < c 1 , … , c k > <c1,,ck> 的集合,元组 < c 1 , … , c k > <c1,,ck> 满足下述条件:

它与 S \mathbf S S 中每一个元组 < b 1 , … , b m > <b1,,bm> 组合形成的一个新元组都是 R \mathbf R R 中的某一个元组 < a 1 , … , a n > <a1,,an>。(其中, a 1 , … , a n , b 1 , … , b m , c 1 , … , c k a_1, …, a_n ,b_1, …, b_m, c_1, …, c_k a1,,an,b1,,bm,c1,,ck 分别是属性 A 1 , … , A n , B 1 , … , B m , C 1 , … , C k A_1 , … ,A_n,B_1 , … ,B_m,C_1 , … ,C_k A1,,An,B1,,Bm,C1,,Ck 的值)

数学描述:
【四】关系模型 -- 关系代数_第52张图片

【除(Division)操作的示例一】(抽象的)

【四】关系模型 -- 关系代数_第53张图片

【除(Division)操作的示例二】(语义的)

查询选修了全部课程的学生的学号:

在这里插入图片描述

【四】关系模型 -- 关系代数_第54张图片

【除(Division)操作的示例三】(语义的)

查询选修了学号 98030201 学生所学全部课程的同学的姓名(姓名 Sname 在 表 S \mathbf S S 中):

在这里插入图片描述

2. 外连接(Outer-Join)

【外连接问题的提出】(示例)

Teacher(T#, Tname, Salary), Course(C#, Cname), Teach(T#, C#)

请列出 所有老师的有关信息,包括 姓名工资所教课程 等。

在这里插入图片描述

按上式连接的结果,003 号教师的姓名和工资信息丢失了。因为在 T e a c h \mathbf {Teach} Teach 表中没有和 003 号教师相匹配的元组,元组 003 号教师(又称为 失配元组)不能和其他表的元组形成连接元组。

【四】关系模型 -- 关系代数_第55张图片

怎样保证使 003 号教师信息仍旧出现在结果关系中呢?----这就需要外连接。

定义:两个关系 R R R S S S 进行连接时,如果关系 R R R (或 S S S)中的元组在 S S S(或 R R R )中 找不到相匹配的元组,则 为了避免该元组信息丢失,从而将该元组与 S S S(或 R R R)中 假定存在的全为空值的元组形成连接,放置在结果关系中,这种连接称之为 外连接(Outer Join)

【四】关系模型 -- 关系代数_第56张图片

  • 外连接 = 自然连接 (或 θ \theta θ-连接) + 失配的元组(与全空元组形成的连接)

  • 外连接的形式:左外连接、右外连接、全外连接
    左外连接 = 自然连接(或 θ \theta θ-连接) + 左侧表中失配的元组
    右外连接 = 自然连接(或 θ \theta θ-连接) + 右侧表中失配的元组
    全外连接 = 自然连接(或 θ \theta θ-连接) + 两侧表中失配的元组

  • 左外连接(Left Outer Join) 记为:在这里插入图片描述

  • 右外连接(Right Outer Join) 记为:在这里插入图片描述

  • 全外连接(Full Outer Join) 记为:在这里插入图片描述

【外连接操作示例】

【四】关系模型 -- 关系代数_第57张图片

【外连接(Outer-Join)操作的示例】

前面问题例子的解决方案,查询所有老师的信息:

在这里插入图片描述

【四】关系模型 -- 关系代数_第58张图片

查询所有老师和所有课程的信息:

在这里插入图片描述
【四】关系模型 -- 关系代数_第59张图片

内容回顾

【四】关系模型 -- 关系代数_第60张图片

练习

【四】关系模型 -- 关系代数_第61张图片

正确答案:A
【解析】最终结果有五个属性,所以只可能是连接运算,而 R 1 \mathbf R_1 R1 R 2 \mathbf R_2 R2 有公共的属性,所以自然连接即可。

【四】关系模型 -- 关系代数_第62张图片

正确答案:A

【四】关系模型 -- 关系代数_第63张图片

正确答案:A
【解析】自然连接定义:给定关系 R \mathbf R R 和关系 S \mathbf S S R \mathbf R R S \mathbf S S 的自然连接运算结果也是一个关系,它由关系 R \mathbf R R 和关系 S \mathbf S S 的笛卡尔积中选取相同属性组 B B B 上值相等的元组所构成。

【四】关系模型 -- 关系代数_第64张图片

正确答案:A
【解析】关系 R \mathbf R R W \mathbf W W 做自然连接操作,而有两个公共属性时,需保证两个属性的内容都相等才能连接,而不是其中一个。

【四】关系模型 -- 关系代数_第65张图片

正确答案:A

【四】关系模型 -- 关系代数_第66张图片

正确答案:A
【解析】此公式的含义为所有学生的姓名和年龄减去学过 “002” 课程的学生姓名和年龄,因此答案为没有学习过课程号为 002 号课程的学生姓名和年龄。

【四】关系模型 -- 关系代数_第67张图片

正确答案:A
【解析】做 θ θ θ-连接时不需要将公共属性合并,而自然连接时需要,所以 T 1 \mathbf {T1} T1 的属性个数大于 T 2 \mathbf {T2} T2 的属性个数。

【四】关系模型 -- 关系代数_第68张图片

正确答案:A

【四】关系模型 -- 关系代数_第69张图片

正确答案:A

【四】关系模型 -- 关系代数_第70张图片

正确答案:A

【四】关系模型 -- 关系代数_第71张图片

正确答案:A

【四】关系模型 -- 关系代数_第72张图片

正确答案:A
【解析】此公式中 S × S C \mathbf S × \mathbf {SC} S×SC 运算之后,所有人都存在 C#=”002”,所以答案为空。

【四】关系模型 -- 关系代数_第73张图片

正确答案:A

【四】关系模型 -- 关系代数_第74张图片

正确答案:A

【四】关系模型 -- 关系代数_第75张图片

正确答案:A

【四】关系模型 -- 关系代数_第76张图片

正确答案:A

【四】关系模型 -- 关系代数_第77张图片

正确答案:A
【解析】 1)为元组选择,2)投影一个列,3)属于一个关系不属于另一个关系为差,4)原文提到按照某种条件,所以选连接。

【四】关系模型 -- 关系代数_第78张图片

正确答案:A

【四】关系模型 -- 关系代数_第79张图片

正确答案:A
【解析】一组域 D 1 , D 2 , … , D n D_1 , D_2 ,…, D_n D1,D2,,Dn 的笛卡尔积为: D 1 × D 2 × … × D n = ( d 1 , d 2 , … , d n )   ∣   d i ∈ D i , i = 1 , … , n D_1×D_2×…×D_n = { (d_1 , d_2 , … , d_n) \ | \ d_i∈D_i , i = 1,…,n } D1×D2××Dn=(d1,d2,,dn)  diDi,i=1,,n,笛卡尔积的每个元素 ( d 1 , d 2 , … , d n ) (d_1 , d_2 , … , d_n) (d1,d2,,dn) 称作一个 n n n-元组( n − t u p l e n-tuple ntuple),所以 R × S × W = 10 × 10 × 10 = 1000 \mathbf R × \mathbf S × \mathbf W=10×10×10=1000 R×S×W=10×10×10=1000

【四】关系模型 -- 关系代数_第80张图片

正确答案:A
【解析】关系 R \mathbf R R S \mathbf S S 的笛卡尔积由关系 R \mathbf R R 中的元组与关系 S \mathbf S S 的元组进行所有可能的拼接构成,笛卡尔积 T \mathbf T T 的元组个数为 R \mathbf R R 的元组个数与 S \mathbf S S 的元组个数的乘积,即 100 × 300 = 30000 100×300=30000 100×300=30000

【四】关系模型 -- 关系代数_第81张图片

正确答案:A
【解析】为 R \mathbf R R S \mathbf S S 的交,由同时出现在 R \mathbf R R S \mathbf S S 中的元组构成,交运算可以通过差运算来实现: R ∩ S = R − ( R − S ) = S − ( S − R ) \mathbf R ∩ \mathbf S = \mathbf R -( \mathbf R- \mathbf S)= \mathbf S-( \mathbf S- \mathbf R) RS=R(RS)=S(SR)

【四】关系模型 -- 关系代数_第82张图片

正确答案:A
【解析】学生姓名和学生性别用到关系 S \mathbf S S,课程名称用到关系 C \mathbf C C,选课情况用到关系 S C \mathbf {SC} SC,正确的关系代数表达式为: Π S n a m e ( σ C n a m e = ” C O M P U T E R ”  a n d   S s e x = ”女” ( S ⋈ S C ⋈ C ) ) Π_{Sname}(σ_{Cname=”COMPUTER” \ and \ Ssex=”女”} (\mathbf S⋈\mathbf {SC}⋈\mathbf C)) ΠSname(σCname=COMPUTER and Ssex=(SSCC))

【四】关系模型 -- 关系代数_第83张图片

正确答案:A
【解析】多个关系的笛卡尔积的运算结果也是一个关系,其属性个数为所有关
系属性个数的和。

【四】关系模型 -- 关系代数_第84张图片

正确答案:A
【解析】 σ f 2 ( R ) σ_{f2}( \mathbf R) σf2(R) 表示关系 R \mathbf R R 中满足条件 f 1 f1 f1 的元组, σ f 1 ( σ f 2 ( R ) ) σ_{f1}(σ_{f2}(\mathbf R)) σf1(σf2(R)) 表示满足条件 f 1 f1 f1 的元组中,还满足条件 f 2 f2 f2 的元组,与 σ f 1 ∧ f 2 ( R ) σ_{f1∧f2}(\mathbf R) σf1f2(R) 等价。

你可能感兴趣的:(数据库,数据库,关系代数,笛卡尔积,自然连接,选择+投影)