MySQL查询之全称量词
现在来假设一个场景,共有三张表。分表如下:
学生表(student)
课程表(course)
学生_课程对应表(sc)
这时候,有一个需求就是查询选修了所有课程的学生的名字。
那么,我们看看都有哪些课程。嗯,数据库、数学、信息系统等等共7门课程。那么,我们只要在sc表中选出选修了这7门课程的人就好了。
但是怎么写啊。
。
。
。
。
。
。
思考片段
。
。
。
。
。
。
。
我们有的是选择select可是那是选择一个条件的,没办法写成cno等于xx并且cno还等于yy,而且cno还等于zz。可是当然的,突然,我们想到了数据系统课上听到的intersect(交集)。嗯嗯 我们只要选出所有的课程,然后把选数据库的人集合选出来和数学的人集合和其他课程的人集合取交集,不就等于选了所有课程的学生集合。
窃喜。
。
。
。
。
。
可是mysql没有intersect功能。(但是可以用原生的实现)
。
。
。
。
。
怎么办?
。
。
。
。
我们来思考一下选修了全部课程的学生名字。那就是
(∀x)P 的问题,这样的量词可以进行转化
(∀x)P=┐(∃x(┐P))
那么,原问题就变成了
查询这样的一个学生,不存在我们选择一门课程,学生课程对应表不存在他们的对应关系。
因此,MySQL语句为
SELECT sname
FROM student
WHERE NOT EXISTS
(SELECT *
FROM course
WHERE NOT EXISTS
(SELECT * FROM sc
WHERE sno=student.sno
AND cno=course.cno
)
)
。大功告成
。小作业:
工程一定要用到零件,零件就有编号,那么所有工程都用到的零件号,要怎么表达。