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子句的筛选。就这样,类似于至少等字样的问题就是这样解开了。
这里是我的个人简单记忆方式,本人小菜,不擅长数据库,有何不足大神们可以直接批评。
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子句的筛选。就这样,类似于至少等字样的问题就是这样解开了。
这里是我的个人简单记忆方式,本人小菜,不擅长数据库,有何不足大神们可以直接批评。