表为 S T C SC;经常出现的这几个表 学生 老师 课程 选课关系
按照书上这个语句可以理解为 C表中不存在一门课程该学生没有学select sname 
from s
where not exists          /*C表中不存在一门课程*/
     (select *
      from c
      where not exists   /*该学生没有学*/
           (select *
            from sc
            where sc.s#=s.s# and sc.c#=c.c#));
看不明白 反应不过来  如果单纯一个exists我还能理解 两个就理解不了了
哪位大神能通俗的给小弟我解释一下呢?
谢谢给位了

解决方案 »

  1.   

    双重否定,很常用。反过来理解(从最后面开始):
    选择所有该学生所选课程:select * from sc where sc.s#=s.s# and sc.c#=c.c#
    否定:该学生所选漏的课程:select * from c where not exists ( 上一句 )
    再否定:没有任何选漏课程的:select sname from s where not exists ( 上一句 )
    研究此类问题,可以先简化一步:找出选了所有课程的学号。
    那么问题就只需要集中在: sc 和 c 这两张表就够了。
    c表是所有课程,目标就是在sc中找出学满c的学号记录。
    其实方法也不唯一,比如可以看c表总记录数,那么sc表中记录数跟c表相同的说明也学满了。Select 学号
    From sc
    Group By 学号
    Having Count(课程号) >= (
      Select Count(课程号) From c
    )