关系代数查询疑问:t5逻辑解析及使用¬的替代实现方法咨询
理解关系代数中求未选修Databases课程学生的逻辑及替代实现方式
先解释t5的作用
原来的关系代数思路是**「排除法」**:先找到所有选修了Databases的学生,再从全体学生里去掉这部分,剩下的就是你要的未选修学生。
t5的逻辑很简单:它是把Student表中所有学生的id和name投影出来,得到全体学生的基础列表。没有这个全体列表,你就没法做差集操作——毕竟差集是「从A里去掉属于B的元素」,t5就是这里的A,t4是「选了Databases的学生列表」(也就是B),t5 \ t4自然就得到了「没选这门课的学生」。
拆解原关系代数的完整流程
为了更清楚,我们把每一步的作用再梳理一遍:
t1 ← σ courseName=Databases (Course):从课程表中筛选出名为Databases的课程记录t2 ← t1 ⋈ Takes:把筛选出的Databases课程和选课表连接,得到所有选修了这门课的学生idt3 ← t2 ⋈ Student:再和学生表连接,得到这些选课学生的id和namet4 ← π id, name (t3):投影出这些学生的id和name,得到「选了Databases的学生名单」t5 ← π id, name (Student):投影出全体学生的id和name,得到「所有学生名单」R ← t5 \ t4:用全体学生减去选课学生,最终得到未选修Databases的学生id和name
用¬(否定)的替代实现方式
如果想用否定逻辑来实现,核心思路变成直接筛选「没有选修Databases课程的学生」,而不是先找选课的再做差集。这里有两种写法:
写法一:直接嵌套否定条件
R ← π id, name (σ ¬(id ∈ (π id (Takes ⋈ σ courseName=Databases (Course)))) (Student))
写法二:分步拆解(更易读)
t1 ← σ courseName=Databases (Course) t2 ← Takes ⋈ t1 t3 ← π id (t2) -- 得到所有选修了Databases的学生id R ← π id, name (σ id ∉ t3 (Student)) -- 筛选出不在t3里的学生,也就是未选修的
这里的¬(id ∈ t3)或者id ∉ t3就是用否定操作直接判断:学生的id不在「选修Databases的id列表」里,符合条件的就是我们要的结果。
内容的提问来源于stack exchange,提问作者Erik Hansson
相关产品推荐
相关产品推荐

