首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

sql 检索学习所有课程的学生姓名

2012-10-20 
sql 检索学习全部课程的学生姓名表为 S T C SC经常出现的这几个表 学生 老师 课程 选课关系按照书上这个

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

SQL code
select sname from swhere 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
)


[解决办法]
楼上正解

热点排行