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

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

代码:

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

代码解析:

首先重新创建一个成绩表garde2用于测试上述代码,grade2表和student表的表结构均保持不变。

# 创建成绩表grade2:
create table grade2(
sid varchar(10),
cid varchar(10),
score decimal(4,1)
)engine myisam charset utf8;# 向成绩表grade2中插入数据:
insert into grade2 values
('01','01',80),
('01','02',90),
('02','01',70),
('02','02',60),
('02','03',80),
('02','04',85),
('03','01',80),
('03','02',80),
('03','03',80),
('03','04',61),
('04','01',75),
('04','02',30),
('05','01',76),
('05','02',87),
('05','03',99),
('05','04',75),
('06','01',31),
('06','02',65),
('06','03',34),
('07','02',89),
('07','03',98),
('09','02',82),
('10','01',88),
('10','02',90),
('13','01',59),
('13','02',79),
('13','04',81);

查看grade2表的详细信息:

select * from grade2;

由上图可知,和01号学生学习的课程完全相同的其他学生的学生编号sid包括04和10;

下面从最内层开始逐步解析前文的查询代码:

查询出01号学生选修的所有课程的编号:

select cid from grade2 where sid='01';

查询出选修了01号学生没有选修课程的学生编号:

select sid from grade2 where cid not in (select cid from grade2 where sid='01');

上述查询结果中有重复的sid,这是因为有的学生选修的01号学生没选修课程不只一门。可以使用distinct关键字对sid进行去重处理。

查询选修的课程是01号学生选修课程的子集的学生编号:

select sid from grade2 where sid not in
(select sid from grade2 where cid not in (select cid from grade2 where sid='01'));

从上述查询结果中,筛选出选修的课程数量与01号学生选修的课程数量相等的其他学生的编号:

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

以上述查询结果为筛选条件,从student表中查询出与01号学生学习的课程完全相同的其他学生的信息:

select * from student where sid in
(select sid from grade2 where sid not in
(select sid from grade2 where cid not in (select cid from grade2 where sid='01'))
group by sid
having count(*)=(select count(*) from grade2 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号同学学习的课程完全相同的其他同学的信息。

另:下面评论中的朕水朋友提供了另一种很巧妙的查询思想:这是一种正向查询的思想,先筛选出其他学生中选修的课程数量和01号学生选修的课程数量相同的学生的学生编号和所修课程编号,然后将筛选结果与01号学生选修的课程编号进行内连接,然后再根据01号学生选修课程的数量做最后的筛选。

查询代码:

select * from student where sid in
(select sid from
(select sid,cid from grade2 where sid in
(select sid from grade2 where sid !='01' group by sid
having count(*)=(select count(*) from grade2 where sid='01' group by sid))) as t1
inner join (select cid from grade2 where sid='01') as t2
on t1.cid = t2.cid
group by t1.sid
having count(*)=(select count(*) from grade2 where sid='01')
)

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

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

    今天再练习Mysql练习题的时候遇到了 "查询和01号的同学学习的课程完全相同的其他同学的信息" 的问题,开始一脸懵逼,那个带题目的大佬的答案貌似有点问题,所以网上看了一些大佬的代 ...

  2. sql 练习查询和“01“号的同学学习的课程完全相同的其他同学的信息

    sql练习题 练习查询和"01"号的同学学习的课程完全相同的其他同学的信息 SELECT s_id,s_name,s_birth,s_sex FROM student WHERE ...

  3. 【SQL经典50题】9.查询和“ 01 “号的同学学习的课程完全相同的其他同学的信息【正解】

    查询所用的表结构见https://blog.csdn.net/zjhbeautiful/article/details/108065336 SQL经典50题第9题正解 题目:查询和" 01 ...

  4. 关于查询和1号的同学学习的课程完全相同的其他同学的信息详细

    以下是建表语句: create table bdqn_student( sno number(2), sname varchar2(20) not null, sbirthdate date, sge ...

  5. 查询没有选修java的学生_查询没有考试的学生学号和课程号

    [其它]编写触发器,在SC表中,不能将不及格的考试成绩改为及格 SC( Sno,Cno ,grade) [单选题]下列程序段执行后 s 值为 : inti=1, s=0; while(i++) if ...

  6. 查询分数最高的学生姓名和课程名

    查询分数最高的学生姓名和课程名 SQL语句: select student_name name,course_name course from student,course,score where s ...

  7. 查询和“s001”号的同学学习的课程完全相同的其他同学学号和姓名

    逻辑: 如果一个人所选课程有s001选择的课程, 且没有选择与s001不同的课程, 且和s001选择的课程数量相同, 这个人还不是s001,那这个人选择的课程和s001一样. 表sc(sno 学号,c ...

  8. 学习微信公众号开发(学习LaoBi课程记录)

    1. 微信公众号分为编辑模式和开发模式应用 编辑模式: 登录微信公众号后台(web),根据自己的需求设置.不需要写代码. 开发模式:         [1]开发环境准备  1.一个微信公众号.     ...

  9. oracle中exists和not exists用法(包含经典例题:查看学了所有课程的同学的信息的通俗易懂解释)

    1.基本概念: select * from A where not exists(select * from B where A.id = B.id); select * from A where e ...

  10. 计算机经典书籍电子书合集(适合计算机学生学习以及程序员笔试、面试)

    2楼JAVA篇 此篇收录:.<Java 2核心技术>.2.<Java编程语言>.3.<Effective Java>.4.<Java解惑>.5.< ...

最新文章

  1. Java项目:旅游网站管理系统设计和实现(java+springboot+jsp+mysql+spring)
  2. 使用 Chrome 开发者工具进行 JavaScript 问题定位与调试
  3. jsp页面,在浏览器端显示时会出现乱码解决方法
  4. 智能家居市场需求矛盾深层原因分析
  5. linux卸载已安装的java_Linux 中如何卸载已安装的软件(转载)
  6. myeclipse连接mysql怎么调用_myeclipse连接mysql数据库详细步骤
  7. Linux awk命令使用方法
  8. Git远端库(GitHub)及Git流
  9. mysql image类型_MyCat教程【mysql主从复制实现】
  10. 【azkaban】学习azkaban的笔记以及心得
  11. 苹果怒封Google、FB:私下购买用户隐私被制裁,数万员工受牵连
  12. 第十课:栈的表示与实现
  13. 活动子项父项的复杂CSS选择器[重复]
  14. Mac字体安装的方法?Mac怎么安装新字体?Mac字体安装教程
  15. 虚拟路由器的到来是否敲响了传统路由器的丧钟
  16. 国密 GmSSL 版本及安装
  17. 双闭环调速 matlab,双闭环直流调速系统仿真(Matlab).ppt
  18. 静态链表 ( 数据结构 )
  19. Cardinality Estimation
  20. Win软件 - 教你正确使用 Win10 专业版系统自带远程桌面(免费内网穿透)

热门文章

  1. CSS入门4 文本样式
  2. SuperMap 查询
  3. FPGA接口实现----增量式编码器
  4. Javascript中的shift() 、unshift() 和 pop()、push()区别
  5. LTE 核心 MME SGW PGW作用:
  6. 实现开通个人支付宝与微信扫码支付
  7. 苹果7支持快充吗_苹果支持20W快充了,什么20W还叫快充,国内都到120W了
  8. [Python嗯~机器学习]---用python3来分析和预测加州房价
  9. Emitter使用方法
  10. xamp环境搭建Pikachu实验环境搭建