MySQL带有EXISTS的查询

带有ALL或ANY谓词的子查询

ALL:所有值

ANY:某个值

EXISTS代表存在量词,带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真“TRUE”或逻辑假“FALSE”。

例子:查询所有选修了1号课程的学生姓名

SELECT same

FROM student

WHERE EXISTS

(SELECT *

FROM SC

WHERE sno=studet.sno AND cno='1')

若内部查询结果为非空,则返回TRUE,反之返回FALSE

与EXISTS相对应的是NOT EXISTS,若内部查询结果为空,则返回TRUE,反之返回FALSE

例子:查询没有选修课程1的学生姓名

SELECT sname

FROM student

WHERE NOT EXISTS

(SELECT *

FROM SC

WHERE sno=student.sno AND con='1')

进阶版:

        例子1:查询选修了全部课程的学生姓名

MySQL中没有全称量词,转化该例子,查询“没有一门课没选的学生姓名”,该句子中有两个没,因此有两个NOT EXISTS,一个是课,一个是选。先有课才有选,所以第一个NOT EXISTS对应的是课,

SELECT sname

FROM student

WHERE NOT EXISTS

(SELECT *

FROM course

[……])

第二个NOT EXISTS对应的是选,学生选的课

SELECT sname

FROM student

WHERE NOT EXISTS

(SELECT *

FROM course

WHERE NOT EXISTS

(SELECT *

FROM SC

WHERE SC.sno=student.sno AND SC.cno=course.cno));

        例子2:查询至少选修了学生201215122选修的全部课程的学生号码

又是一个全部的问题,同样需要改写,“查询学生201215122选修的课程没有一门没有选修的学生号码”,也是两个没,所以是两个NOT EXISTS。

第一步:搭框架

SELECT sno

FROM student

WHERE 

第二步:课,学生201215122选修的课

SELECT cno

FROM SC

WHERE SC.sno=201215122

加入原框架

SELECT sno

FROM student

WHERE NOT EXISTS

(

SELECT cno

FROM SC

WHERE SC.sno=201215122

)

第三步:选,要输出的学生所选的课,出现第二个NOT EXISTS

SELECT sno

FROM student

WHERE NOT EXISTS

(

SELECT cno

FROM SC a

WHERE a.sno=201215122 AND NOT EXISTS

(SELECT *

FROM SC b

WHERE b.sno=student.sno AND b.con=a.sno)

);

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值