有以下三个关系:
学生(学号,姓名,性别,年龄,所在系)
课程(课程号,课程名,先行课)
选课(学号,课程号,成绩)
请使用关系代数表示以下查询要求:
1、求选修了课程号为【C2】课程的学生的学号。
π学号(σ课程号='C2'(选课))
当一个查询同时涉及到选择和投影操作,应先选择后投影。
2、求选修了课程号为【C2】课程的学生的学号和姓名。
或:
第一种方式先对学生表和选课进行连接运算,得出 C2 课程对应的姓名和其他学生信息。第二种方式先选择后连接,效率更高。
3、求没有选修课程号为【C2】课程的学生学号。
π学号(学生)- π学号(σ课程号='C2'(选课))
先通过投影得到全部学生的学号,然后去掉选修【C2】课程的学生的学号,就得到了没有选修课程号【C2】课程的学生学号。
本题不能写作:
π学号(σ课程号 ≠'C2'(选课))
原因:如果一个学生选修了多门课程,则学号会多次出现,如果选修了 C1 和 C2,则会出现在查询结果中。
如果有下面的学生表:
学号 | 姓名 | 性别 | 年龄 | 班级 |
---|---|---|---|---|
S0001 | 张三 | 男 | 20 | 物流201 |
S0002 | 李四 | 男 | 21 | 物流201 |
S0003 | 王五 | 女 | 20 | 物流201 |
S0004 | 赵六 | 男 | 18 | 物流202 |
S0005 | 刘七 | 男 | 19 | 物流202 |
查询年龄不是 20 的学生的学号和姓名,则如下的两种方法都可以使用:
π学号,姓名(学生)- π学号,姓名(σ年龄 = 20(学生))
或:
π学号,姓名(σ年龄 ≠ 20(学生))
4、求既选修了 C2 课程,又选修了 C3 课程的学生的学号。
π学号(σ课程号='C2'(选课))∩ π学号(σ课程号='C3'(选课))
先求出所有选修 C2 课程的学生的学号,再求出所有选修 C3 课程的学生的学号,最后使用交运算得到既选修了 C2 课程,又选修了 C3 课程的学生的学号。
本题不能写作:
π学号(σ课程号='C2'∧ 课程号='C3'(选课))
原因是:同一个属性不可能有两个值。任何一个课程号不可能既是 C2,又是 C3。
如果有下面的学生表:
学号 | 姓名 | 性别 | 年龄 | 班级 |
---|---|---|---|---|
S0001 | 张三 | 男 | 20 | 物流201 |
S0002 | 李四 | 男 | 21 | 物流201 |
S0003 | 王五 | 女 | 20 | 物流201 |
S0004 | 赵六 | 男 | 18 | 物流202 |
S0005 | 刘七 | 男 | 19 | 物流202 |
查询年龄是 20 岁的男生的学号和姓名,则如下的两种方法都可以使用:
π学号,姓名(σ性别='男'(学生))∩ π学号,姓名(σ年龄 = 20(学生))
或:
π学号,姓名(σ性别='男'∧ 年龄 = 20(学生))
可以这样理解:逻辑运算与(∧ )两边的条件表达式不能是同一个属性。
5、求选修了课程号为 C2 或 C3 的学生的学号。
π学号(σ课程号='C2'(选课))∪ π学号(σ课程号='C3'(选课))
也可以写作:
π学号(σ课程号='C2'∨ 课程号='C3'(选课))
6、求选修了全部课程的学生的学号。
π学号,课程号(选课)÷ 课程
除运算为包含运算,该题的含义是求某个学生所对应的课程号包含全部课程的课程号。
7、求至少选修了学号为【98002】的学生所学过的所有课程的学生的学号。
π学号,课程号(选课)÷ π课程号(σ学号='98002'(选课))
先对选课表执行选择运算,查询出学号为【98002】的学生所选修的课程,再通过投影运算,得到【98002】学生选修的课程的课程号。最后执行除运算,得到最终的结果。