注:课程是学堂在线上的哈工大的数据库课程
关系代数运算的特点
1.以一个或多个关系为输入,其结果是一个新的关系
(就好像C里边的表达式一样,以一个或多个值为输入,其结果是一个值。
就算没有显性的输出,表达式本身也是一个值,就想判断条件、函数调用一样)
2.有6个基本操作,并、差、积(广义笛卡尔积)、选择、投影、更名。
有3个拓展操作,交、连接、除。
拓展操作可以用几个基本操作来实现。
3.需要满足并相容性才能进行操作。
并相容性,是指属性的数目一样,属性的域的类型一样。
比如, STUDENT(SID char(10), Sname char(8), Age char(3))
PROFESSOR(PID char(10), Pname char(8), Age char(3))
是满足并相容性的。
并操作
合并两个关系并去掉重复元组
差操作
在R中去掉被减一方所包含的元组
广义笛卡尔积
生成所有可能的元组
选择操作
选择满足条件的元组
投影操作
在一个表中,投影出你想要得那几列
如果有重复元组,应该去掉
交操作
筛选同时出行的元组
θ-连接
同时对多个表进行访问时,通常要用连接操作。
θ-连接是在R与S做笛卡尔积后,筛选出R中的属性A与S中的属性B同时满足某条件的元组。
θ是指比较运算符,是指大于、小于、等于、不等于。
比如,
关系与自身做θ-连接
例如,查询至少98030101号同学和98040202号同学学过的所有课程号
上面的ρ为更名操作,即将表SC更名为SC1,当一个表需要和其自身进行连接运算时,通常要使用更名操作
等值连接
当条件θ为等于号,称该θ-连接为等值连接
连接操作的意义在于,由于笛卡尔积的结果常常数目庞大,且很多元组无意义,
连接操作能大幅减少中间结果,同时顺带加上自己的筛选条件
自然连接
自然连接是一种特殊的等值连接,同时也是用的最多的连接。
当R和S必须有相同的属性,才能进行自然连接。
自然连接相当于,在笛卡尔积中,选择公共属性里边值一样的元组。
从结果来看,自然连接就像是,连接两个表有意义的元组,形成一个大表。
因为,对于同一个元组的同一属性,若两个表中的值不一样,那么这条属性就无意义。
几个经典错误
比如,查询至少学习课程号为001和002的学生的学号
对于
错误:
这个操作的结果是空集,因为任何课程名不可能同时等于001和002
错误:
对于自然连接来说,连接一个一模一样的表没有意义。
因为自然连接会去掉重复的元组,所以得到的表还是原表。
正确:
例子2:查询不学习课程号为002的学生姓名和年龄
错误:
比如张三选了001,002,003,他也会被我们选中,这显然不符合要求。
只有张三只选了一门课,这个课是002,他才不会被选中。
这是因为,自然连接对于张三来说,由于他在选课表中有3个元组,所以会连接成3个元组。而这个操作仅仅只会剔除002那个元组。
错误:
思路是对的,即先选出所有选了002课程的人,再用差操作。
但S与选择操作得到的集合,属性数目不一样,不满足并相容性。
正确:
书写代数表达式的基本思路
1.看是否涉及多个表,非多个表时,用并、差、选择、投影等就可以搞定
2.涉及多个表,一般考虑自然连接。
若不行,再考虑θ-连接
再不行,就用笛卡尔积+选择
除操作
先看例子
若R除S=A,则A的属性,由R的属性减掉S的属性构成。
A的元组+S的元组,一定是R中的某个元组。(用于验证)
除法的基本操作表达很复杂,但可以简单的理解成,先做纵向切分,选择属性,
再做横向切分,在R中选择满足S的元组。
除法在某些场景下会很好用,比如
查询选修了全部课程的学生的学号
外连接
在连接过程中,若一个表中的元组,在另一个表中没有对应的元组,称为失配元组。
外连接,就是在自然连接的基础上,为失配连接补上全空元组。
左外连接,自然连接+左表中的失配元组
右外连接和全外连接也是同样的定义。
外连接的意义在于,保证了失配元组的信息不丢失。
想要哪个表中的信息不丢失,就相应的用左外/右外/全外连接。