数据库 EXISTS与NOT EXISTS

EXISTS与NOT EXISTS

  • EXISTS:表示存在xxx。在查询的外层添加一个EXISTS,当内层查询有结果,则该EXISTS返回true,反之返回false
  • NOT EXISTS:表示不存在xxx。在查询的外层添加一个NOT EXISTS,当内层查询有结果,则该NOT EXISTS返回false,反之返回true

表生成的过程

SELECT Sname
FROM Student
WHERE NOT EXISTS(1)
(SELECT *
FROM Course
WHERE NOT EXISTS(2)
(SELECT *
  FROM SC
  WHERE Sno= Student.Sno
          AND Cno= Course.Cno));

学生表

1017814-20170422154233899-361931250.png

课程表

1017814-20170422154308962-74150998.png

学生选课表

1017814-20170422154327915-791639455.png

以上面的为例:首先改例子中有两个EXISTS,我们先从最里面的内容开始,当一个元组和课程表中的第一个元组在最里层循环中与SC.sno和SC.cno进行匹配的时候。
(情况1)若配上最内层的WHERE将该数据插入到临时表中,第一个NOT EXISTS(指内层的NOT EXISTS,代码中的(2))判断该临时表不为空则返回false。
(情况2)若没有匹配上最内层的WHERE返回false,则不将数据插入到临时的表中,第一个NOT EXISTS(是内层的NOT EXISTS,代码中的(2))判断结果表为空返回true


当Course循环结束之后
第二个NOT EXISTS(最外层的NOT EXISTS,代码上的(1))判断该内层返回集是否为空。
(1)若为内层的NOT EXISTS返回true,WHERE接收到true之后将数据插入临时的结果集中,第二个NOT EXISTS判断临时表不为空,则返回false,不将内容添加到最终的结果集中。
(2)若为内层的NOT EXISTS返回false,WHERE接收到false之后不将数据插入到临时的结果集中,第二个NOT EXISTS判断临时表为空,则返回true,将内容添加到最终的结果集中。


本人的语言表达能力不足,要是上面的内容没有看明白的话,一下是我总结的方法:


WHERE语句是当判断的结果为true的时候,将内容添加到结果集中,若为false的话,则不讲内容添加到结果集中。


EXISTS是当查询的表为非空的时候则返回true,当查询的表为空的时候返回false。
NOT EXISTS则是当查询的表为空的时候返回true,当查询的表为非空的时候返回false。


    //查询选择了全部课程的学生的查询语句
    SELECT Sno
    FROM Student s
    WHERE NOT EXIXTS(
        SELECT *
        FROM Course c
        WHERE NOT EXISTS(
            SELECT *
            FROM SC sc
            WHERE sc.sno = s.sno
            AND sc.cno = c.cno
        )
    );
    个人的理解:其中外层的Student与次外层的Course的组合分别与SC中的内容进程比较,将符合要求的内容进行保留

若没有听明白的话可以通过上面的方法进行推到来得出自己的观点

转载于:https://www.cnblogs.com/gxcstyle/p/6747863.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值