SQL关于not exists的理解

ywj19860324 2009-04-14 12:46:51
学生(学号,姓名,系别,年龄)
课程(课程号,课程名,学时)
选读(学号,课程号,成绩)
问题:检索选读全部课程的学生姓名
select 学生.姓名
from 学生
where not exists( select *
from 课程
where not exists( select *
from 选读
where 学号=学生.学号 and 课程号=课程.课程号));
这个怎么理解,怎么单独运行 select *
from 选读
where 学号=学生.学号 and 课程号=课程.课程号
得不出什么结果?



...全文
898 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
南哥V 2012-02-21
  • 打赏
  • 举报
回复
学生姓名忘记取出来了。

select c.姓名 from 学生 c inner join
(
SELECT a.学号, count(a.课程号)
FROM AS 选读 a
GROUP BY a.学号
HAVING count(a.课程号) = (select count(*) from 课程 b)
) new on c.学号 = new.学号
南哥V 2012-02-21
  • 打赏
  • 举报
回复
不经意间翻到这个帖子,贴一下我的答案,请指教。
SELECT a.学号, count(a.课程号)
FROM AS 选读 a
GROUP BY a.学号
HAVING count(a.课程号) = (select count(*) from 课程 b) and
exists (select * from 学生 c where a.学号 = c.学号);
jinjazz 2009-04-14
  • 打赏
  • 举报
回复
select *
from 选读
where 学号=学生.学号 and 课程号=课程.课程号
不认识学生和课程两个表的
零壹世界 2009-04-14
  • 打赏
  • 举报
回复
对exists 跟not exists 的理解不够啊。
select 学生.姓名
from 学生
where not exists( select *
from 课程
where not exists( select *
from 选读
where 学号=学生.学号 and 课程号=课程.课程号));
这是一整条的查询语句,不能把里面的拆出来用的。
拆出来的话,学生表、课程表,对于选课表来说就是不可见的了。

如果不是很清楚,可以查下SQL的帮助文档里面关于EXISTS与NOT EXISTS的用法。
使用 EXISTS 和 NOT EXISTS 引入的子查询可用于两种集合原理的操作:交集与差集。两个集合的交集包含同时属于两个原集合的所有元素。差集包含只属于两个集合中的第一个集合的元素。
  • 打赏
  • 举报
回复
select *
from 选读 ,课程,学生
where 选读.学号=学生.学号 and 学生.课程号=课程.课程号
wulijuan008 2009-04-14
  • 打赏
  • 举报
回复
帮顶
幸运的意外 2009-04-14
  • 打赏
  • 举报
回复
语句的意思是把学生表和课程表,通过选课表联系起来。
dsp_zerg 2009-04-14
  • 打赏
  • 举报
回复
这个怎么理解,怎么单独运行 select *
from 选读
where 学号=学生.学号 and 课程号=课程.课程号
得不出什么结果?
改为:
select *
from 选读 ,学生,课程
where 学号=学生.学号 and 课程号=课程.课程号
应该就有结果了
qizhengsheng 2009-04-14
  • 打赏
  • 举报
回复
得了解下sql是怎么运行计算的

22,182

社区成员

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

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