关系代数
上一篇博客已经讲了基本关系代数运算的内容,今天来讲附加关系代数运算。
附加关系代数运算
交运算∩
查询计算机系年龄大于等于18的学生的信息
跟并集∪一样都是需要先进行选择运算然后再进行二元的交集运算。
其实交运算也可以用差运算来表示:
R ∩ S = R - (R -S)
如下图,先算括号会得到蓝色的部分,然后再用整个R减去蓝色部分就是黑色的部分
连接运算⨝
在进行连接运算之前要先明确连接条件是什么。
比如:对学生表和学生成绩表进行连接运算,指定的连接条件是学生表中的Sno列和学生成绩表中的Sno列的值相同,即筛选出学号相同的所在的元组。
运算:
结果:
左边是Student表,右边是Course表,会发现都有Sno列,且不会去除重复的部分。
实际上连接运算可以用笛卡尔积和选择运算来表示。
假设原来的学生表有5个元组5个属性列,成绩表有6个元组(因为学号为2021310723的学生有两个课程的成绩),3个属性列。那么进行笛卡尔积之后结果会是5×6=30个元组,5+3=8个属性列。即学生表中的每一个元组都会配对一个成绩表的所有元组,所以会出现重复的情况。举个简单的例子,假设现在学生表只有2个元组,2个属性列,成绩表只有3个元组,3个属性列,那么笛卡尔积最后的结果会是6个元组,6个属性列
学生表:
Student.Sno | Student.name |
101 | 小红 |
102 | 小明 |
成绩表:
SC.Sno | SC.Cno | SC.Grade |
101 | 3 | 88 |
102 | 1 | 98 |
102 | 2 | 100 |
Student×SC:
Student.Sno | Student.name | SC.Sno | SC.Cno | SC.Grade |
101 | 小红 | 101 | 3 | 88 |
101 | 小红 | 102 | 1 | 98 |
101 | 小红 | 102 | 2 | 100 |
102 | 小明 | 101 | 3 | 88 |
102 | 小明 | 102 | 1 | 98 |
102 | 小明 | 102 | 2 | 100 |
会发现结果中有许多重复且无意义的元组。所以此时我们可以进行选择运算,将Sno列相同的元组选择出来
σ Student.Sno=SC.Sno。所以结合上面的笛卡尔积就是:
最终结果:
Student.Sno | Student.name | SC.Sno | SC.Cno | SC.Grade |
101 | 小红 | 101 | 3 | 88 |
102 | 小明 | 102 | 1 | 98 |
102 | 小明 | 102 | 2 | 100 |
也就是连接运算,也叫等值连接,因为除了相等(=)还可以是>、<、≤、≥等。我们上面举的例子都是等值连接,它也是自然连接,自然连接是自动会将连接条件指定为属性名相同的的列做等值连接,可以写成:
结果为:
这一次会发现没有重复的Sno了。自然连接是一种特殊的等值连接,它需要两个关系中必须有相同的属性列且和属性列下的值必须相等才能做连接,而等值连接是更为通用的一种连接方式,虽然需要指定连接条件,但是给出条件可以带来表达式的可读性和明确性。
除了上面提到的连接运算,还有一种可以处理缺失值的运算——外连接。比如左外连接⟕:
指保留左边的所有元组,如果右边关系中存在与左边关系有同名的属性但是却没有取值,比如上面R和S相同的属性是B,但是R有B属性列下等于3的值,此时S却没有相对应的值,所以这时候就会自动填充对应B=3时S的C属性的值为NULL.
还有右外连接⟖,同理:这时保留的是右边,而左边自动填充NULL。
而全外连接⟗就是左外连接和右外连接查询结果的并集。
赋值运算←
上面的连接运算是一长串的表达式,为了让表达式变得更清晰易懂,让查询变得更加简单,就会用到赋值运算符。
指将箭头右边的结果赋给左边的临时关系变量。
除运算÷
假设有两个关系R和S,如果要进行除运算,S中不能有R没有的属性列,这意味着S所有的属性列集合是R所有属性列集合的子集。如下图,除运算的结果会返回R的A属性列中是同时满足B=1,2,3的,若有则返回该属性值。例如SC ÷ Course,则是表示找到选择所有课程的同学。