特别注意,本题不能写为:π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关系中的哪些元组呢? 对于T[X]的象集包含∏Y(S) 2.除法运算的步骤
(1)将被关系R的属性分成两个部分,即与除关系相同的属性部分Y,和与除关系不同的属性部分X。
(2)在除关系中,求Y的投影,得到目标数据集。 (3)将被除关系进行分组。(分组原则是“值”一样的为一组)
(4)考虑被除关系中已分好的每一元组,如果它的象集包含目标数据集(投影结果),
R S
R÷S A a1

