数据库-关系代数

数据库-关系代数

Lucas Lv4

传统的集合运算

1. 并

RSR \cup S

2. 交

RSR \cap S

3. 差

RSR - S

4. 笛卡尔积

R×SR \times S

4.1 域

域是一组具有相同数据类型的值的集合, 例如: { 李明, 张三 , 王五} , { 男, 女 } , { 计算机 , 旅游管理 }

4.2 笛卡尔积

笛卡尔积是域上的集合运算, 允许某些域上是相同的

按域的顺序, 每个域任取一个值, 列出所有的组合, 就是笛卡尔积

D1×D2×Dn={(d1,d2dn)diDi, i=1,2,  ,n}D_1\times D_2\times \cdot\cdot\cdot D_n=\{(d_1,d_2\cdot \cdot \cdot d_n)|d_i\in D_i,\ i=1,2,\ \cdot\cdot\cdot \ ,n\}

姓名 性别 专业
李明 计算机
李明 旅游管理
李明 计算机
李明 旅游管理
张三 计算机
张三 旅游管理
张三 计算机
张三 旅游管理
王五 计算机
王五 旅游管理
王五 计算机
王五 旅游管理

专门的关系运算符

前置知识

关系模式

表示一张表的首行信息,是一个关系的抽象,例如:关系模式:R(A1,A2,...,An)关系模式:R(A_1, A_2,...,A_n)A1,A2,...,AnA_1, A_2,...,A_n 是属性抽象

比如下图表的第一行:

image-20240708161951746

关系

一张表代表一个关系,n 目,表示 n 列,例如:RnR_n , 上面的图表就是一个 5 目关系

属性

表内的首行的每个元素叫属性,一个属性对应一列,从第二行开始,下面的都是属性的具体数值

例如: 属性集合 A={(Ai1,Ai2,...,Aik)i[1,n]}, i 是行数,k 是列数A=\{(A_{i1}, A_{i2},...,A_{ik}),i\in[1,n]\},\ i\ \text{是行数},k\ \text{是列数},这表示第 ii 行的每列的分量集合,叫做属性组(属性列)。

A\overline{A} 表示取反,也就是除去第 i 行的其他属性组 ( 集合 ) , 其实就是集合取反

元组

表内的一行叫关系的一个元组

例如:tRt\in Rt[Ai]t[A_i] 表示 t 元组中的 AiA_i 分量,也就是属性 AA 的第 ii

Student 表的 元组一共有 4 个 ( 不包含第一行, 也就是不包含关系模式 )

t[Sname2]=刘晨t[Sname_2]=\text{刘晨}

t[A]=(t[Ai1],t[Ai2],...,t[Aik])t[A] = (t[A_{i1}], t[A_{i2}], ..., t[A_{ik}]) 表示元组 tt 在属性列 AA 上各分量的集合

元组连接

{trts trRntsSm}\{\overset{\LARGE{\frown}}{t_rt_s}\,\ t_r\in R_n\, t_s\in S_m\}

成为元组连接,形成一个 n+mn+m 列的元组,前 nn 个分量为 RR 中的一个 nn 元组,也就是 nn 列,前 mm 个分量为 SS 中的一个 mm 元组,也就是 mm 列。

其实就是把两个元组直接拼到一起

例如将李勇和刘晨这两个元组进行连接:

连接

连接还有一些其他的形式: 等值连接, 非等值连接, 自然连接……后面会说到

象集

关系 R(X,Y)R(X, Y) , XXYY 为属性组。当 t[X]=xt[X]=x 时,xxRR 中的象集(images set)为:Yx={ t[Y]  tR ,t[X]=x }Y_x=\{\ t[Y]\ |\ t\in R\ , t[X]=x\ \}

下图是 t[Y]=2t[Y]=2 , yyRR 中的象集:

元组1.png

如果你看了后面的计算,那么象集你可以直接用选择加投影来计算象集,比如图中的就是先选择 Y=2 再做 x 的投影

选择

σF(R)\sigma _F\left(R\right) 表示在 R 中选出符合条件 FF 的元组(也就是行)

σF(R)=tRF(t)=\sigma _F\left(R\right) = t \in R \land F(t)='真'

选择 1.png

查询所在系为 ISIS 的学生,则 σSdept=CS(Student)\sigma _{Sdept=CS} \left(Student\right) 结果如图所示

选择 2.png

查询年龄小于 20 的学生,则 σSage<20(Student)\sigma _{Sage<20} \left(Student\right) 结果如图所示

选择 3.png

投影

ΠA(R)\Pi _A \left(R\right) 表示关系 RRAA 的投影,是 RR 中对应若干属性列组成新的关系 (A 是属性列) , 是只对应属性 A 的集合。

StudentStudent 中查询姓名与所在系的关系,ΠSname,Sdept(Student)\Pi _{Sname,Sdept} \left(Student\right) 结果如图所示

投影 1.png

连接

连接也称 θ\theta 连接. 他是从两个关系的笛卡尔积中选取属性间满足一定条件的元组

RAθBS={trts  trRtsStr[A]θts[B]}R \substack{\Join \\ A\theta B} S=\{\overset{\LARGE{\frown}}{t_rt_s}\ |\ t_r\in R \land t_s\in S\land t_r[A]\theta t_s[B]\}

AθBA\theta B 是条件, AABB 分别为 RRSS 上列数相等且可比的属性组, θ\theta 是比较运算符.

连接运算从 RRSS 的笛卡尔积 R×SR\times S 中 , 选取 RR 关系在 AA 属性组上的值 与 SS 关系在 BB 属性组上的值 满足比较关系 θ\theta 的元组

等值连接

θ\theta== 的连接运算称为等值连接

非等值连接、等值连接、自然连接

自然连接是一种特殊的等值连接。它要求两个关系中进行比较的分量必须是同名的属性组,并且在结果中把重复的属性列去掉。

如图就是非等值连接,等值连接,自然连接的对比

可以看到,

  • 非等值连接是符合 C<EC<E 的笛卡尔积元组,

  • RR.B=S.BSR\substack{\Join \\ R.B=S.B}S 是符合 R.B=S.BR.B=S.B 的等值连接,

  • 自然连接要求进行比较的属性 ( 分量 ) 必须是同名的属性组, 并且在结果中把重复的属性组列去掉

    也就是将同属性的两列合并成一列

连接1.png 连接2.png

举一个 非等值连接 的计算过程 , 如图是笛卡尔积 , 黄色的是满足 C<EC<E

image-20240708182306952

外连接

做自然连接的时候,会有一些不满足条件的元组被舍弃,叫 悬浮元组。

  • RSR \mathrel{\mathrlap{\ltimes}\rtimes} S,外连接是保留(不舍弃)悬浮元组的连接
  • RSR \ltimes S,左外连接是保留左边关系的悬浮元组的连接
  • RSR \rtimes S,右外连接是保留右边关系的悬浮元组的连接

在下图可以看到,

RRa2a_2 b4b_4 1212 没有对应的 EE 值,所以填 NULLNULL

同样,SSb5b_5 也没有对应的 AAEE 值,也填 NULLNULL

外连接1.png

除运算

T=R÷ST=R\div S 表示 关系 TT 是 关系 RR 除以 关系 SS 的结果(商)

TT 包含所有在 RR 但不在 SS 中的属性及其值, 且 TT 的元组与 SS 的元组的所有都在 RR 中, 也就是 SSTT 的组合都是 RR 的子集。(所以这个有排除的意思, 更像减法)

给定关系 R(X,Y)R(X,Y)S(Y,Z)S(Y,Z) , 其中 X,Y,ZX,Y,Z 为属性组, R 中的 Y 和 S 中的 Y 可以有不同的属性名, 但必须出自相同的域集 ( 也就是有相同的类型 )

除2.png

我们看这个式子,给定关系 R(X,Y)R(X, Y)S(Y,Z)S(Y, Z)

  • R÷SR\div S 的结果是一个集合, 集合里的元素是 tr[X]t_r[X] 也就是 属性 XX 的一个分量

  • trRt_r\in R 表示元组属于关系 RR , 表示 新关系 TTRR 的子集 ( 集合里的元素是元组 )

  • ΠY(S)Yx\Pi _Y(S) \subseteq Y_x 表示 关系 SS 中的 YY 属性, 应该在 xxRR 中的象集里

    象集 YxY_x 是为了逐一比较, 不同 xx 下的 YY 是否包含 SSYY 的投影

举例: 下图可以看到,只有 RR 中的 a1a_1 b1b_1 c2c_2a1a_1 b2b_2 c3c_3a1a_1 b2b_2 c1c_1

  • 首先看,包含在 RR 但是不包含在 SS 的属性显然是属性 AA,所以我们求解的答案肯定是一个 AA 分量 的列

  • 其次,求出 AA 的所有值对应的象集,也就是 a1,a2,a3,a4a_1, a_2,a_3,a_4 的象集

    各象集

    BCa1={(b1,c1),(b3,c7),(b2,c1)}BC_{a_1}=\{(b_1,c_1),(b_3,c_7),(b_2,c_1)\}

    BCa2={(b3,c7),(b2,c3)}BC_{a_2}=\{(b_3,c_7),(b_2,c_3)\}

    BCa3={(b4,c6)}BC_{a_3}=\{(b_4,c_6)\}

    BCa4={(b6,c6)}BC_{a_4}=\{(b_6,c_6)\}

  • 求出 SSBCBC 的投影

    ΠBC(S)={(b1,c2),(b2,c1),(b2,c3)}\Pi_{BC}(S)=\{(b_1,c_2),(b_2,c_1),(b_2,c_3)\}

  • 然后确定包含关系,发现只有 a1a_1 包含 SS 中的 BCBC 所有组合

  • 答案就是 a1a_1

    image-20240708193141493
  • 标题: 数据库-关系代数
  • 作者: Lucas
  • 创建于 : 2024-04-22 17:02:37
  • 更新于 : 2025-11-20 23:40:22
  • 链接: https://darkflamemasterdev.github.io/2024/04/22/数据库-关系代数/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论