引入
关系代数中有五种基本的代数运算包括并、差、笛卡尔积、投影和选择。这五种运算比较简单易懂,学习起来很丝滑流畅,但是在看到除运算这段冗长的定义和公式就有些摸不到头脑(⊙_⊙)。
定义:
除运算是同时从关系的水平方向和垂直方向进行运算。给定关系R(X,Y)和S(Y,Z), X、Y、Z为属性组。R÷S应当满足元组在X上的分量值x的象集Yx包含关系S在属性组Y上 投影的集合。
公式:
R
÷
S
=
{
t
n
[
X
]
∣
t
n
∈
R
∧
π
y
(
S
)
⊆
Y
x
}
R \div S= \left\{ t^{n}\left[ X \right] |t^{n}\in R\land\pi _{y}(S)\subseteq Y_{x}\right\}
R÷S={tn[X]∣tn∈R∧πy(S)⊆Yx}
不知道你是不是也会有眼前一黑的感觉,不过也不用着急,根据下面这个例子我们完全可以梳理明白这段定义到底是什么意思,并且以后可以通过定义和公式来正确的进行关系代数除运算。
实例
设有关系R、S如下两表,求R÷S。
R:
A | B | C | D |
---|---|---|---|
a | b | c | d |
a | b | e | f |
a | b | h | k |
b | d | e | f |
b | d | d | l |
c | k | c | d |
c | k | e | f |
S:
C | D |
---|---|
c | d |
e | f |
我们先看定义的这一句话:
给定关系R(X,Y)和S(Y,Z), X、Y、Z为属性组。
这其中的XYZ都是属性组,那么为什么要用R(X,Y)和S(Y,Z)这种形式来表示呢。其实很简单,这么表示是为了说明Y属性组是两个关系共有的属性组(在实例中就是CD属性组),而X属性组就是关系R独有的属性组(在实例中就是AB属性组)。
OK,然后我们来看定义的第二句话:
R÷S应当满足元组在X上的分量值x的象集Yx包含关系S在属性组Y上投影的集合。
对于关系R,其在X(AB)上的分量值包括{(a,b),(b,d),(c,k)}
。分量值x的象集是指什么呢?象集本质上是一次选择运算和投影运算,比如对(a,b)求象集就是在R中选择AB=(a,b)
的行然后选择不是AB的列。
{(a,b),(b,d),(c,k)}
的象集分别是:
分量(a,b)的象集={(c,d),(e,f),(h,k)}
分量(b,d)的象集={(e,f),(d,l)}
分量(c,k)的象集={(c,d),(e,f)}
关系S在属性组Y上的投影是{(c,d),(e,f)}
而分量(a,b)和(c,k)的象集都包含{(c,d),(e,f)}
,所以最后的除运算的结果是分量(a,b)和(c,k)的集合{(a,b),(c,k)}
重新把定义拆解组合一下可以这样写:
除运算最后的结果是关系R在X上的分量值的集合,这个集合要满足分量值的象集Yx包含关系S在属性Y上的投影
除运算步骤总结
- 找出属性组X和属性组Y:
X(AB),Y(CD)
- 找出R在属性组X上的分量值的集合
{(a,b),(b,d),(c,k)}
- 对每个分量值求象集
- 求关系S在Y上的投影
- 若象集包含投影,则把对应象集的分量值加入到最后的结果集合
除运算是用来干啥的?
经过上面的解析,我自己也捋顺了除运算该怎么计算,不过这时候又有了新的疑惑,我学这个除运算到底是用来干啥啊?
对于上边的实例,好像看不出来除运算的真实作用。下面我再给出一个新的实例,应该会更加直观一些。
新的实例
R:
学号 | 姓名 | 授课老师 | 课程 |
---|---|---|---|
001 | 李云 | 刘老师 | 数据结构 |
001 | 李云 | 李老师 | 操作系统 |
001 | 李云 | 林老师 | 计算机组成原理 |
002 | 明治 | 马老师 | 编译原理 |
002 | 明治 | 林老师 | 计算机组成原理 |
003 | 柯里 | 刘老师 | 数据结构 |
003 | 柯里 | 李老师 | 操作系统 |
S:
授课老师 | 课程 |
---|---|
刘老师 | 数据结构 |
李老师 | 操作系统 |
ok我们来做除运算R÷S:
学号 | 姓名 |
---|---|
001 | 李云 |
003 | 柯里 |
可以发现我们从一张大表R经过除运算之后变成一个小表,这个小表是至少上了关系S指定的授课老师和指定课程的同学的集合。由此过程,我们是不是可以把除运算看作一个筛选的过程,关系S和关系R相同的属性组是筛选条件,而R是待筛选的表。
本质:
除运算其实是用来查询本表(R)中那些包含指定属性组记录(S)的记录的。比如上述例子,其实是来查询R表中至少选修了S中指定老师和课程的学生的学号和姓名信息。
常见问题
至少选修了李老师所有课程的学生信息
还是感觉对除运算的作用理解的不够清晰,大家如果有更好的解释希望可以说出来,我再进行修改。