文档详情

关系代数表达式总结-数据库.doc

发布:2016-12-31约5.94千字共5页下载文档
文本预览下载声明
关系代数表达式总结 一、并 例1 求选修了课程号为1或2的课程的学生学号。 分析:可以先求出选修了课程号为1的课程的学生学号,再求出选修了课程号为2的课程的学生学号,最后使用并运算的方法求出选修课程号为1或2的课程的学生学号。本例也可以使用或条件来表示。 πSno(σCno=’1’(SC))∪πSno(σCno=’2’(SC)) 或πSno(σCno=’1’∨ Cno=’2’(SC)) 二、交 例2 检索至少选修课程号为2和3的课程的学生学号。 分析: 方法一:只涉及到一个表,但不能直接用∧(为什么?) 特别注意,本例不能写为: πSno(σCno=’2’∧ Cno=’3’(SC)) 因为选择运算为行运算,在同一行中Cno不可能既为2,又为3。 第一步:转换(SC×SC) 笛卡尔积将垂直的条件展开为水平的条件。 SC1 SC2 学号 Sno 课程号 Cno 成绩 Grade 学号 Sno 课程号 Cno 成绩 Grade 95001 1 92 95001 1 92 95001 1 92 95001 2 85 95001 1 92 95001 3 88 95001 1 92 95002 2 90 95001 1 92 95002 3 80 95001 2 85 95001 1 92 95001 2 85 95001 2 85 95001 2 85 95001 3 88 95001 2 85 95002 2 90 95001 2 85 95002 3 80 … … … … … … 选修课程号为2和3的学生: σ1=4∧2=’2’∧ 5=’3’(SC×SC) 最后取出学生的学号: π1(σ1=4∧2=’2’∧ 5=’3’(SC×SC)) 方法二:πSno(σCno=’2’(SC))∩πSno(σCno=’3’(SC)) 三、差 例3 将学生信息(‘95001’,’李勇’,‘男’,20,‘CS’)从Student表删除。 分析:可以将这行数据看成由一个元组构成的表,将Student表与该表进行差运算。 因此,该删除操作可表示为: Student-{‘95001’,’李勇’,‘男’,20,‘CS’} 注意:但是当查询涉及到否定或全部值时,上述形式就不能表达了,就要用到差操作或除操作。 例4 求没有选修课程号为2的课程的学生学号。 分析:可以认为是在全部学号中去掉选修课程号为2的课程的学生学号,就得出没有选修课程号为2的学生学号。由于在并、交、差运算中,参加运算的关系要求是兼容的,故应当先投影,再进行差运算。 πSno(Student)- πSno(σCno=’2’(SC)) 特别注意,本题不能写为:πSno(σCno≠’2’(SC))。因为,选择运算为行运算,并且SC表中包含的只是选修了课程的学生学号,对那些没选任何课程的学生学号,在SC中找不到。根据题意,要查询没有选修课程号为‘2’课程的学生学号,显然包括没选任何课程的学生学号。 当查询涉及到针对“否定”特征含义的查询要求,如“不”、“没有”等字眼,一般要用差运算表示。 四、自然连接 例5 检索不学“2”号课程的学生姓名与年龄。 分析:首先考虑“差”的问题。先求出全体学生的姓名和年龄,再求出学了”2”号课程的学生的姓名和年龄,最后执行两个集合的差操作。 πSname,Sage(Student)- πSname,Sage(σCno=’2’(StudentSC)) 例6 查询至少选修了一门其直接先行课为“5”号课程的学生姓名。 分析:(1)根据题目确定要输出的列为:Sname,都在Student表中; (2)根据题意,先行课程名为“5”,则选择的条件为Cpno=’5’,因为Cpno在Course表中,所以也要用到Course表; (3)根据1,2两步确定用到的表名集为{Student,Course}; (4)因为表名集中两个表,则要用自然连接将它们连接起来,但因为这个两表不存在共同的列,不能进行自然连接。因此要加入中间表,中间表中应含有能与其它两个表进行自然连接的公共列,这个表就是SC。将选择条件Cpno=‘5’作用于自然连接后产生的新表上,并用投影操作选取要输出的Sno,Cno。 综上,该查询的关系代数表达式为: πSname(σCpno=’5’(Course)SCπSno,Sname(Stuent)) 或 πSname(πSno(σCpno=’5’(Course)SC)Stuent)) 五、除 1.除法定义中的含义 分析:(1)前提:两个关系R(X,Y)和S(Y,Z)应该有公共属性列。 (2)运算结果为P(X),元组来自于R关系,只包含X属性列 (3)R关系中的哪些元组呢? 对
显示全部
相似文档