MySQL查询之全称量词

MySQL查询之全称量词

现在来假设一个场景,共有三张表。分表如下:
学生表(student)
Alt text
课程表(course)
Alt text

学生_课程对应表(sc)
Alt text

这时候,有一个需求就是查询选修了所有课程的学生的名字。
那么,我们看看都有哪些课程。嗯,数据库、数学、信息系统等等共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
        )
    )

。大功告成
。小作业:
工程一定要用到零件,零件就有编号,那么所有工程都用到的零件号,要怎么表达。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值