MySQL查询之蕴涵
现在来假设一个场景,共有三张表。分表如下:
学生表(student)
课程表(course)
学生_课程对应表(sc)
(题型内容来自王珊教授的《数据库系统概论》)
这时候,有一个需求就是
查询至少选修了学生311选修的全部课程的学生号码
本查询如果用逻辑蕴涵来表达,那就是
学生311选修了课程y 可推出学生x也选修了课程y。
那就是
(∀y)p→q
那么根据离散数学学到的,可以推导出
(∀y)p→q≡┐(∃y(p∧┐q)
意思就是
不存在这样的课程,学生311选修了,学生x却没有选修。
SELECT DISTINCT sno
FROM sc scx
WHERE NOT EXISTS
(SELECT *
FROM sc scy
WHERE scy.sno =311 AND
NOT EXISTS
(SELECT *
FROM sc scz
WHERE scz.sno=scx.sno AND
scz.cno=scy.cno
)
)