数据库系统概论之关系代数中的除法
一、除法概述:设关系R除以S的结果为关系T,则T包含所有在R但不在S中的属性及值,且T的元组与S的元组的所有组合都在R中。
二、关于除法的两类题型的解题方法:
注:先说明下文讲到的除数和被除数分别代表什么:R÷S中,R为被除数,S为除数
(1)给出了关系表和除法表达式,求运算结果:
解决方法:利用除法表达式的象集定义。(这类题目比较简单,不细讲,不会的可以留言或者私信,我可以给你讲明白)
就拿上面概述的例子来看:题目给了两张关系表R和S,要求R÷S的结果。首先分析R和S共有的属性,为B,C。R(被除数)中特有的是A,所以结果为A属性的某个或某些属性值。根据除法的象集定义,求出A中各个属性值的象集,发现:a1{(b1,c2),(b2,c3),(b2,c1)} , a2{(b3,c7),(b2,c3) }, a3{(b4,c6)} , a4{(b6,c6)} 。只有a1 的象集包含了S在(B,C)属性组上的投影,故结果{a1}。(注意:关系代数运算的结果是一个集合)
(2)题目叙述了一个查询语句,要我们写出关系代数表达式,构造除法(这里又要分为两类,主要就是要构造出除数和被除数):
i:除数(属性列)的值包含了某个关系表中的该属性的全部值,那么直接把该表中的该属性列当做除数,被除数的属性在除数的基础上加上所求属性。
ii:除数(属性列)的值没有包含某个关系表中的该属性的全部值,那么可以自己构造一个关系,该关系只有该属性和其值组成。或者采用自身笛卡尔积加选择投影的方法。
示例1:
分析:首先教大家怎么由题目叙述得到除数和被除数的属性组成。很显然,题目中要我们求学号,这就是所求属性。然后剩下的属性就只有课程号,所以除数的属性列只有课程号。被除数的属性由除数的属性列和所求属性组成。所以这里我们就用选修表sc投影得到被除数,即把sno,cno这两个属性投影出来得到的新关系当做被除数。当然也可以直接得出被除数,很明显由题目就可以看出被除数是选修表。由于课程号的属性值有1,2,3等等,而题目中给出的属性值只有1,3,不包含全部的属性值,属于第二类。题目中的解法是构造了一个关系,接下来我再讲一种自身笛卡尔积加选择投影的方法。
先将sc表本身做自然连接,得到关系的属性组成:
sno cno grade sno cno grade
1 2 3 4 5 6
注:下面的数字是属性在表中的下标索引,JDBC中也经常用下标来取得属性列的值。
接下来开始选择投影:
图片中的选择部分的解释:1=4,即两个sno相等,表明这是同一个学生,2=’1’,5=’3’则表示该同学既选修了1号课程有选修了3号课程,符合题意。最后把学号投影出来即可。这也很好理解,以后这类题都是这种解法,套公式用就行了。
下面在举一个第一类的例子:
分析:在上面例子的基础上,我这里就快速分析出除数和被除数的属性组成。
除数:课程号cno
所求属性:学号sno和姓名sname
被除数:按理来说是有cno sno sname这3个属性,但是学生选课数据库中没有这样的表,如果自己构造一张这样的表那很麻烦,所以做除法时,我们先把sno求出来,到时候在与学生表student连接投影一下就可以得到结果。所以被除数的属性由sno cno组成。
全部课程说明除法中的cno属性包含了该cno属性的所有属性值,为第一类题型。那么直接将该表作为除数。即从课程表course中把cno属性投影出来得到一张表,把该表作为除数。被除数依然是从sc选修表中投影出来的sno和cno属性。再解释一下后面的连接:关系代数中,有除法就先算除法,再算其他的。当然这里在除法前面加上括号就更清晰了,前面的除法得到了学号,再与学生表做自然连接即可得到结果。
三、总结:
讲到这里,关系代数中比较难理解的除法的题型也就讲完了。下面再总结一下和做些说明:
1、 可能会有人把除法和选择混淆,拿到题目的时候不知道该用除法还是选择。大家记住这一点就行了:除法是一个属性可以有多个属性值,选择是一个属性只能有一个属性值。
怎么理解这句话呢:通过上面的例子都可以看出,至少选修了1号和3号课程的学生学号,选修了全部课程的学生学号和姓名中课程号的属性值的个数都是一个以上,即一个学生选修了多门课。上面讲解的自身笛卡尔积加选择投影的方法虽然没有明显用到÷号,但他的本质还是除法,希望大家不要混淆。
2、 讲解过程中用到的例子是数据库系统概论第五版 王珊 书上的例子。刚开始学数据库的时候我也很难理解,做题很艰难。我就去网上找资料,找题目练,做多了就会做了。这些方法和题型分类也是我在做题过程中总结出来的。当时做的笔记:
3、 我为什么要写这篇博客呢:当时学习的过程中确实遇到了很多困难,在网上找资料时也没有找到自己心仪的。感觉讲的不是很清楚,我相信有很多同学也有很多这样的困惑,所以我就写了这篇博客。这也是我第一次写博客,经验不足,可能排版方面不是很美观,但都是干货。写这篇博客的目的是帮助在学习到这里遇到困惑的同学,大神就不用看了。如果大家有好的解决这类问题的解决方法欢迎大家留言讨论。
4、 下次说说sql语句中exists的问题,这也是比较难理解的东西,个人也做了很好的总结,用来做题分析是很好理解的。上面图片中也可以看到我做了部分归纳。对于以上解题方法还没有理解的可以下方留言评论或者私信我,我看到了就会解答。
最后:原创码字不易,第一次写博客写的很认真。请大家多多点赞,多多分享,新人求一波关注。有帮助到大家,请点赞不要白嫖哦。转载时请注明出处。