--最难受的就是分析语法,我只告诉你如何去分析,你根据这个自己分析一下吧--以这句为例
select sname from s 
where not exists(
select cno from c 
where cno not in(
select cno from sc where s.sno=sc.sno and c.cno=sc.cno
)
)
--执行过程大致是这样的.逐条记录读取 s 表中的记录
读取第一条时,此时 s 表中各字段的值已经固定了,就是第一条 开始执行后面的条件语句
select cno from c 
where cno not in(
select cno from sc where s.sno=sc.sno and c.cno=sc.cno
)
此时又是一个子查询
那么同样的,逐条读取 c 表中的记录
读取第一条时,此时 s,c 表中各字段的值都已经固定了 再判断后面的条件:
select cno from sc where s.sno=sc.sno and c.cno=sc.cno

因为s,sno,c.cno都有确定的值,所以就可以得到结果集:
从 sc 中取得的满足条件的记录 这时最后一个条件执行完成,开始逐级返回
首先返回条件处:
where cno not in( con的结果集) 此时就可以判断出这个条件是否成立
如果不成立,则读取 c 表中的下一条记录,重复进行判断,直到完成 如果成立,因为此层 exists(),只要有成立条件的记录即刻返回
所以返回第一层