由EXISTS引出的子查询是相关子查询,即子查询的查询条件依赖于外层父查询的某个属性值。它不能像嵌套查询那样,一次将子查询求解出来,然后求解父查询。也就是说,它不是从内向外求解的,而是正好相反。
具体来说是这样的:首先取外层查询中表S的第一个记录,进入第一层子查询,再取其表C的第一条记录,进入第二层子查询,根据前两个得到属性值处理第二层子查询,返回子查询的WHERE子句的值,再取第一层子查寻中表C的第二条记录,重复着一过程,直到表C遍历一次,根据查询结果返回第一层子查询的WHERE子句真值,若为真,取S中的该记录放入结果表,然后再取表的下一记录,重复这一过程。
也就是说需要将表S遍历一遍,而表C遍历n×m遍,n、m为表S、C中的记录数。
再说一点,这个查询的思路是:查询这样的学生,没有一门课程是他不选的。

解决方案 »

  1.   

    namowen的解释不错,你可以这样来理解,对于s表中的一条记录,查找c表,对于c
    中的一条记录,查找sc表,如果sc表中有符合s#=s.s# and c#=c.c#的记录,则返回值为假(第二层嵌套),继续从c表中的下一条记录开始查找sc表,如果查完c表后,仍没有这样的记录,则返回第一层值为真,于是记下这条记录,也就是所选的这个学号,没有一门课他没有选。不知这样写你可理解否?
    好好想一下就明白了!:)