下面是高级程序员中的sql语句.大家帮忙理解以下!

ruanruan 2004-03-24 12:08:15
现有表:学生表:s(s#,sname)
课程表:c(c#,cname)
选课表:sc(s#,c#)
现要检索学习全部课程的学生名:
语句是:
select sname from s where not exists
(select * from c where not exists
(select * from sc where sc.s#=s.s# and sc.C#=c.c#))
为什么上面的语句可以实现上面的要求?理解万岁!
...全文
44 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
visualnc 2004-03-25
  • 打赏
  • 举报
回复
请楼主注明出处?????
1:select sname
2: from s
3: where not exists
4: (select *
5: from c
6: where not exists
7: (select *
8: from sc where sc.s#=s.s# and sc.C#=c.c#
9: )
10: )
我觉得有问题:
第二个子查询中:
7: (select *
8: from sc
where sc.s#=s.s# and sc.C#=c.c#
9: )
FROM句中只有SC,而在WHERE句中却用到了SC和S,难道它不知道SQL是先做子查询后做父查询的吗?????
jackyjian 2004-03-25
  • 打赏
  • 举报
回复
这样理解,找没有一门课程是不学的学生。否定之否定表示肯定。ok?
klbt 2004-03-24
  • 打赏
  • 举报
回复
就是子查询而已
nobush 2004-03-24
  • 打赏
  • 举报
回复
select * 表示所有
exists 的原理是逐条比较 ok?!
nobush 2004-03-24
  • 打赏
  • 举报
回复
嗯!
1:select sname
2: from s
3: where not exists
4: (select *
5: from c
6: where not exists
7: (select *
8: from sc where sc.s#=s.s# and sc.C#=c.c#
9: )
10: )
这样看:
7: 选出学习课程的所有SC.s#\SC.C#
6: 包含未修课程的SC.s#\SC.C#
3:除开已选出的其它项目

总体思路是先找在所有课程中有“缺课”的记录,排除后就是学习全部课程的
ruanruan 2004-03-24
  • 打赏
  • 举报
回复
黄乐,能说得清晰一点吗?
dreamle 2004-03-24
  • 打赏
  • 举报
回复
只可意会,不可言传:)

2,948

社区成员

发帖
与我相关
我的任务
社区描述
就计算机等级考试、软件初、中、高级不同级别资格考试相关话题交流经验,共享资源。
c1认证c4javac4前端 技术论坛(原bbs)
社区管理员
  • 软件水平考试社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧