引言
关系数据库不是仅仅用来看的,必须有相应的运算来支撑才能得到我们想要的结果。之前也提到,关系数据库有完整的数学模型来支撑,因此这一节可能就要考一考笔者的数学能力了!(虽然上学期离散考得还行,但数学乃我一生之大敌…)
关系数据库语言
对数据库系统下达指令需要语言。分为三类:
- 关系代数语言
- 关系演算语言
- 具有关系代数和关系演算双重特点的语言
至于这些语言的特点将分别展开说明。
关系代数的运算符
关系代数的运算对象和结果全部为关系(复习:关系是元组的集合)。因此,关系的运算符至少会包含集合的运算符。于是:
- 并(∪)
- 交(∩)
- 差(-)
- 笛卡尔积(×)
运算方法和相应的集合运算保持一致。如果笛卡尔积也在离散数学里学过,这里也不多介绍。
除此之外还引进了专门的关系运算符,选择,连接,投影,除运算。
选择
σF(R)={t|t∈R∧F(t)=‘真’}
简单说明,选择操作从关系R中抽取使逻辑表达式F为真的元组t并将其组成一个新的关系。
这个是做行变换。
投影
πA(R) = { t[A]|t∈ R} ,A是R中的属性列(组)
投影操作将关系R中的A属性列(组)抽取并且组成一个新的关系。
这个是做列变换。
连接
(这都什么奇奇怪怪的符号…)
简单来说就是分成几步:
- 两个关系R,S
- 广义笛卡尔积R×S
- R在属性值A上的值与S在属性B上的值满足比较关系θ的元组组成的关系(注意得到的元组都是R×S的元组)
常用的两类连接:
- 等值连接:θ是等号=。
- 自然连接:两个关系中进行比较的必须是相同的属性组,所以连接的时候要把相同的去掉。舍去的叫做悬浮元组。也就是等值连接把相同的两列中的一列去掉。
如果不去掉悬浮元组而在这些元组的其他列上填空串NULL,就是外连接。显然,外连接就是不管三七二十一两个关系做自然连接然后不舍去任何东西,没有的地方就填空串就完事了。在我看来像是最大程度保留原始数据的一种努力。当然还有左右外接,可以预想是保留左边和右边关系的悬浮元组,这样理论上得到的新关系会比外接要少一点。
同时进行了行列变换。
除运算
- 两个关系R(X,Y),S(Y,Z),其中X、Y、Z为属性组,这两个关系有相同的一部分属性组。
- 得到新的关系P(X),是R中的元组在X属性列上中的投影。
- 投影要满足以下关系:元组在X上分量值x的象集Yx包含S在Y上投影的集合。因此要先求一下S在Y上的投影的集合。
象集是什么?很简单,比如R(X,Y),t[X]=x,象集就是剩下的当t[X]=x的时候属性组Y的取值t[Y]。可以理解为先选择(行变换)再投影(列变换)。
可以看出共有的属性组为B,C。S在B,C上的投影有三个元组,而R在A上的分量a1,a2,a3,a4中只有a1的象集包含了所有三个元组。
同时进行行列变换。
小结
那一夜,人们又感受到了被离散支配的恐惧(雾)。不过在笔者看来,纯数学的东西就是概念的堆砌,只要肯下功夫把一个看似复杂的概念拆成一个一个能够理解的部分,做一个step指导,先做什么后做什么,按部就班,顺着逻辑,总是能够解决的。不过还是很讨厌就是了哈哈哈。