关系代数运算

281 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情

广义笛卡儿积

关系R(n列,k1元组)和关系S(m列,k2元组)的广义笛卡儿积是一个(m+n)列的,k1*k2元组的集合

例如: Student表(5列3行)

image.png

sc表(3列两行)

image.png

那么这两个表的广义蒂卡尔卡为3*2行,5+3列,结果如下

image.png

广义笛卡尔的查询表达式:select student.,sc. from student,sc;

广义笛卡儿积结果没有意义,要让他有意义,需要加上连接条件。

连接

条件连接

在两个关系student,sc的广义笛卡儿积里面,选择满足一定条件的元组。

比如条件为:student.sno<sc.sno(6个结果里面,有一个满足)

image.png

如果条件为student.sno=sc.sno(6个满足两个)

image.png

对应的sql表示为:select student.,sc. from student,sc where student.sno<sc.sno; select student.,sc. from student,sc where student.sno=sc.sno;

等值和自然

等值连接的特殊的条件连接(运算表达式A∞B里面,∞为等于的连接运算)

等值连接会出现列重复问题,但是自然连接属于特殊等值连接,他会去掉重复列

关系代数表示为 S∞SC

sql表示为:select student.*,sc.cno,sc.grade from student,sc where student.sno=sc.sno;

正常等值连接结果

image.png

自然连接结果

image.png

自身连接,左外右外连接

自连接查询每门课的间接先修课,需要使用course表。

image.png

select first.cno,second.cpno from course first,course second where first.cno=second.cno;

查询结果先连接后投影

image.png

image.png

左外连接:列出左边关系所有元组,如果右边关系没有对应内容,则右边关系变成null。

比如学生表和sc表连接

image.png image.png

select student.sno,sname,ssex,sage,sdept,cno,grade from student left outer join sc on student.sno=sc.sno;

image.png 结果是: image.png

右外和左一样的,就是左边元组改成右,left改成right

除法

除运算是同事从水平方向垂直方向进行运算,给的关系R(X,Y)和S(Y,Z),xyz为属性组。R÷S一个满足元组X上分量值x的象集Yx 包含关系s在属性组Y上投影。

是不是看上去很迷惑?那么我们看看他的形式定义:

image.png

接下来俺们用一个实例来说明除运算的求解过程。

image.png

求解步骤:

第一步:找出关系R和S里面相同属性,这里的Y属性,在关系S中对Y做投影,结果如下:

image.png

第二步:被除关系R里面和S不同的列是X,关系R在属性X上投影,去掉重复值后得投影{X1,X2}
第三步:求关系R里面对应X属性的像集Y

image.png

第四步:判断包含关系

R÷S其实就是判断关系R中X各个值的像集Y是否包含关系S中属性Y的所有值。对比即可发现:
X1的像集只有Y1,不能包含关系S中属性Y的所有值,所以排除掉X1;
而X2的像集包含了关系S中属性Y的所有值,所以R÷S的最终结果就是X2 ,

image.png