一个sql语句使用两个not exists的道理

JS 2011-04-09 10:17:28
学生表(学号,名字)student(sno,sname)
选课表(学号,课程号)sc(sno,cno)
课程表(课程号,课程名)course(cno,cname)
注:不是每个学生都会选课

查询选修了全部课程的学生姓名
select sname
from student
where not exists
(select *
from course
where not exists
(select *
from sc
where sno=student.sno
and cno=course.cno))
我知道这句是把题目改写成“不存在一门课程这个学生没有选修”,但是它的原理我不是很清楚,查了很久,还是没有找到满意的答案,所以来这里请高人帮忙!

请您解释一下它的执行过程和使用逻辑以及它的效率

小弟在线等高人帮忙解答!万分感谢!高分献上好心人!
...全文
1336 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
carychuang 2011-04-11
  • 打赏
  • 举报
回复
select sname
from student
where not exists
(select *
from course
where not exists
(select *
from sc
where sno=student.sno
and cno=course.cno))
先從最后一層分析起,select *
from course
where not exists
(select *
from sc
where sno=student.sno
and cno=course.cno)找出沒有學生選中的課程
dawugui 2011-04-10
  • 打赏
  • 举报
回复
标题:一个项目涉及到的50个Sql语句(整理版)

http://topic.csdn.net/u/20100517/17/b2ab9d5e-73a2-4f54-a7ec-40a5eabd8621.html

--45、查询选修了全部课程的学生信息
--小F-- 2011-04-09
  • 打赏
  • 举报
回复
你可以看成程序中的双重否定
-晴天 2011-04-09
  • 打赏
  • 举报
回复 1
看这个子句:
(select *
from course
where not exists
(select *
from sc
where sno=student.sno
and cno=course.cno))
查找任一课程,该课程未被主查询中的学生编号选上.
如果只要有一个课程被检索到,那就存在了结果,主查询中的 not exists 就不满足条件,因此,此学生编号所对应的姓名不被查出.
反之,只有当没有一个课程不被该学号学生选中时,not exists 就满足条件了,所以被主查询查出.

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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