查询和01号同学学习的课程完全相同的其他同学的信息

查询所用到的各表表结构见此博客:https://blog.csdn.net/qq_41080850/article/details/84593860

查询和01号同学学习的课程完全相同的其他同学的信息:

代码:

select * from student where sid in 
(select sid from grade where sid not in
(select sid from grade where cid not in (select cid from grade where sid='01')) 
group by sid 
having count(*)=(select count(*) from grade where sid='01')) 
and sid != '01';

看到题目后想了很久,最初的想法是直接找出和" 01 "号的同学学习的课程完全相同的其他同学的编号,但没写出来能实现这种效果的SQL语句。最后在网上找到了一篇博客,前面代码的基本逻辑即来源于此:https://www.cnblogs.com/fengyunlishi/archive/2012/10/18/2730051.html

下面是我从代码中总结出的思路:

01号之外的其他学生可以分成两个大类,一类是选修了01号学生没有选修的课程的学生,剩下的学生是另一类,而剩下的学生又可以分成两个小类,一类学生是没有选修课程的,另一类学生选修的课程是01号学生选修的课程的子集。采用逆向思维,可以先找出选修了01号学生没选课程的学生编号,然后以01号学生选修的课程数量为筛选条件,从剩下的没有选修课程和选修的课程是01号学生选修的课程的子集这两类学生中筛选出与01号学生所选课程完全相同的学生编号,此编号包含了01。再以剔除了01之后的编号为筛选条件,从student表中选出和01 号同学学习的课程完全相同的其他同学的信息。

猜你喜欢

转载自blog.csdn.net/qq_41080850/article/details/84648897
今日推荐