日期:2014-05-20  浏览次数:20789 次

sql 检索学习全部课程的学生姓名
表为 S T C SC;经常出现的这几个表 学生 老师 课程 选课关系
按照书上这个语句可以理解为 C表中不存在一门课程该学生没有学
SQL code

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我还能理解 两个就理解不了了
哪位大神能通俗的给小弟我解释一下呢?
谢谢给位了

------解决方案--------------------
双重否定,很常用。

反过来理解(从最后面开始):
选择所有该学生所选课程: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
)


------解决方案--------------------
楼上正解