查询选修全部课程的学生姓名

CSHelloWorldDN 2019-06-17 03:54:30
自己做到这个部分一直迷惑,网上有很多种解答,我也突然有了思考,暂且记下。 标准答案是图片这样 我们可能最内层它的意义就是某人所选修的全部课程 倒数第二层就是从课程表中选择最里层中(某人选修的所有课程中)所缺失的,如果这个人把所有的课选完了,那么这一层查找为空,反之只要没选完,这一层就会输出没有被这个人选择的课程。 然后看最外层,not exists就是说不存在才输出元祖。不存在什么?不存在上一层中某人没有选的课,也就是某人把课选完了。这才输出这个人的学号。 如果这个人有课没有选,在中间那一层中就会有没有被选的课的信息,那么最外层的not检测到有值,就不输出当前所监测的元组(某个人)的信息。 这是一次简单的理解,可能与拿着元组去检测的说法有所不同,但是意义一样。 仅留作自用,如有赐教感谢评论。
...全文
704 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
VB业余爱好者 2019-06-24
  • 打赏
  • 举报
回复
找个SQL能正常运行?

第4行是个条件,From 后面可以不跟表或者结果集合,而跟个条件吗?
VB业余爱好者 2019-06-24
  • 打赏
  • 举报
回复
select s.sname from student s where s.sno not in (
select s1.sno from student s1 cross join course c1
where s1.sno+c1.cno not in
(select sc.sno+sc.cno from sc))

select sname from student where student.sno not in
(select distinct sc1.sno from
(select * from student s1 cross join course c1) sc1
left outer join sc on sc1.sno = sc.sno and sc1.cno = sc.cno
where sc.sno is null)


如果不考虑效率的话,上面两种方法应该能够满足你的要求。
都是先找出没有选修全部课程的学生的sno,然后用not in排除掉,得到选修所有课程的学生

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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