sql not exists 解决关系代数除法语句执行分析

SELECT sno FROM student AS s1 NOT EXISTS(
 SELECT * FROM stuent AS s2  
    WHERE sno = 2012040101  
    AND NOT EXISTS (  
        SELECT 1 FROM student AS s3  
        WHERE s3.sno = s2.sno
         AND s3.sno = s1.sno     
 ));
很多情况下需要用到上述这种三层嵌套,not exists嵌套是为了解决关系代数中的除法,是一种十分经典的模式。
我比较菜,始终不知道它是如何执行。今天算是明白了一些,在这里做一点笔记。


首先是s1,因为没有多余条件,于是拿出一个元组进入第一层嵌套,这里也没有与s1产生关联,并且还是一层嵌套,于是取出s2一个元组,看到exists前有一个条件,先执行此条件,将s2元组进行删选,如果元组通过条件就进入嵌套,没通过就取出s2下一条元组,这时s1进行等待,这就好比是s1的元组是for循环中外面的一层,s2是中间的,s3是最里面的。带着s1的元组,s2的元组到了第二层嵌套中,取出s3一条元组,然后进行where子句的筛选。就这样,类似于至少等字样的问题就是这样解开了。




这里是我的个人简单记忆方式,本人小菜,不擅长数据库,有何不足大神们可以直接批评。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值