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

1、今天在一个可以练习MySQL的博客上发现一个SQL语句有问题,想优化一下。点击我去原文博客
添加学生表

CREATE TABLE `student`  (`SID` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`Sname` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`Sage` datetime(0) NULL DEFAULT NULL,`Ssex` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('01', '赵雷', '1990-01-01 00:00:00', '男');
INSERT INTO `student` VALUES ('02', '钱电', '1990-12-21 00:00:00', '男');
INSERT INTO `student` VALUES ('03', '孙风', '1990-05-20 00:00:00', '男');
INSERT INTO `student` VALUES ('04', '李云', '1990-08-06 00:00:00', '男');
INSERT INTO `student` VALUES ('05', '周梅', '1991-12-01 00:00:00', '女');
INSERT INTO `student` VALUES ('06', '吴兰', '1992-03-01 00:00:00', '女');
INSERT INTO `student` VALUES ('07', '郑竹', '1989-07-01 00:00:00', '女');
INSERT INTO `student` VALUES ('08', '王菊', '1990-01-20 00:00:00', '女');
INSERT INTO `student` VALUES ('09', '哦嗯', '2019-07-10 09:13:08', '男');
INSERT INTO `student` VALUES ('10', '小明', '2019-09-19 15:18:51', '男');

添加学生成绩表(表中cid代表课程)

CREATE TABLE `sc`  (`SID` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`CID` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`score` decimal(18, 1) NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of sc
-- ----------------------------
INSERT INTO `sc` VALUES ('01', '01', 80.0);
INSERT INTO `sc` VALUES ('01', '02', 90.0);
INSERT INTO `sc` VALUES ('01', '03', 99.0);
INSERT INTO `sc` VALUES ('02', '01', 70.0);
INSERT INTO `sc` VALUES ('02', '02', 50.0);
INSERT INTO `sc` VALUES ('02', '03', 80.0);
INSERT INTO `sc` VALUES ('03', '01', 80.0);
INSERT INTO `sc` VALUES ('03', '02', 80.0);
INSERT INTO `sc` VALUES ('03', '03', 80.0);
INSERT INTO `sc` VALUES ('04', '01', 50.0);
INSERT INTO `sc` VALUES ('04', '02', 30.0);
INSERT INTO `sc` VALUES ('04', '03', 20.0);
INSERT INTO `sc` VALUES ('05', '01', 76.0);
INSERT INTO `sc` VALUES ('05', '02', 87.0);
INSERT INTO `sc` VALUES ('06', '01', 31.0);
INSERT INTO `sc` VALUES ('06', '03', 34.0);
INSERT INTO `sc` VALUES ('07', '02', 89.0);
INSERT INTO `sc` VALUES ('07', '03', 98.0);
INSERT INTO `sc` VALUES ('08', '01', 76.0);
INSERT INTO `sc` VALUES ('08', '02', 87.0);
INSERT INTO `sc` VALUES ('10', '01', 85.0);

在原文的第十三个问题是查出来“查询和"01"号的同学学习的课程完全相同的其他同学的信息”,原文的SQL语句如下:

select Student.* from Student where SID in (select distinct SC.SID from SC where SID <> '01' and SC.CID in (select distinct CID from SC where SID = '01')
group by SC.SID having count(1) = (select count(1) from SC where SID='01'))

当时想着他是否适合其他情况呢,比如用来“查询和"05"号的同学学习的课程完全相同的其他同学的信息”,经过测试是不行的。测试结果如下:
第一到四条都不是我们想要的数据。
下面给出我的解决步骤;
1、查出05同学的课程号

select cid from sc where sid = '05'

2、找出跟05同学所学课程不一样的同学学号(逆向思维 not in )

select a.sid from sc a where a.cid not in (select cid from sc where sid = '05')

3、在成绩表中找到跟05同学学习一样课程的同学的学号

select b.sid from sc b where b.sid not in (select a.sid from sc a where a.cid
not in (select cid from sc where sid = '05')) and b.sid <> '05' group by b.sid
having count(1)  = (select count(1) from sc where sid = '05')

ps: (1) count(1) 会统计表中的所有的记录数,包含字段为null 的记录。
(2) count(字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。即不统计字段为null 的记录。
本次题目中二者都可以的。
4、查出符合条件的学生的信息

select * from student where sid in (select b.sid from sc b where b.sid not in
(select a.sid from sc a where a.cid not in (select cid from sc where sid = '05'))
and b.sid <> '05' group by b.sid
having count(1)  = (select count(1) from sc where sid = '05'))

此时的查询结果如下图:

将最终的查询语句换成“查询和"01"号的同学学习的课程完全相同的其他同学的信息”也是可以的,查询结果如下:

select * from student where sid in (select b.sid from sc b where b.sid
not in (select a.sid from sc a where a.cid not in
(select cid from sc where sid = '01')) and b.sid <> '01' group by b.sid
having count(1)  = (select count(1) from sc where sid = '01'))


如有不足之处,请多多指教。

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

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

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

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

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

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

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

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

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

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

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

  6. SQL查询——查询和和xxx同学所选课程完全一样的同学

    前言 今天碰到一个sql问题,想了半天才想出来,为了记录,所以写了这篇博客. 题目和环境是这样的 有四张表:学生表.教师表.课程表.成绩表 学生表(student):编号(sno).姓名(sname) ...

  7. JavaScript基础学习 模拟京东查询快递单号

    JavaScript基础学习 模拟京东查询快递单号 <!DOCTYPE html> <html lang="en"><head><meta ...

  8. 深度学习的几何观点:1流形分布定律、2学习能力的上限。附顾险峰教授简历(长文慎入,公号回复“深度学习流形分布”可下载PDF资料)

    深度学习的几何观点:1流形分布定律.2学习能力的上限.附顾险峰教授简历(长文慎入,公号回复"深度学习流形分布"可下载PDF资料) 原创: 顾险峰 数据简化DataSimp 今天 数 ...

  9. 01.神经网络和深度学习 W4.深层神经网络(作业:建立你的深度神经网络+图片猫预测)

    文章目录 作业1. 建立你的深度神经网络 1. 导入包 2. 算法主要流程 3. 初始化 3.1 两层神经网络 3.2 多层神经网络 4. 前向传播 4.1 线性模块 4.2 线性激活模块 4.3 多 ...

  10. 01.神经网络和深度学习 W3.浅层神经网络

    文章目录 1. 神经网络概览 2. 神经网络的表示 3. 神经网络的输出 4. 多样本向量化 5. 激活函数 6. 为什么需要 非线性激活函数 7. 激活函数的导数 8. 随机初始化 作业 参考: 吴 ...

最新文章

  1. OpenShift 4 - 应急响应Demo应用(AMQ+Knative+Quay+BPM+BDM+SSO)
  2. Element-UI-简单组合效果---Element-UI工作笔记002
  3. C#编程总结(四)多线程应用
  4. mysql sql语法区别_sql和mysql语法有什么不同
  5. android 屏幕分辨率 更改
  6. 计算机应用基础教程清华大学,清华大学出版社-图书详情-《大学计算机应用基础教程(第3版)》...
  7. AVC1与AVC与H264
  8. 浪曦struts2学习笔记1
  9. 程序员未来前景怎么样
  10. 微信商户平台(商户号)申请流程(仅供参考)
  11. 风行天下!翔升N61S智能主板低价上市
  12. iTool拷贝app到电脑上
  13. file-saver实现文件流下载
  14. HDMI 之 HPD
  15. [高通SDM450][Android9.0]CTA认证--去掉GPS功能
  16. arm嵌入式web服务器 性能,arm嵌入式web服务器
  17. android手机软件安装位置,改变Android手机软件安装位置方法
  18. 微信如何关闭城市服务定位服务器,位置定位微信(怎么悄悄的查对方位置)
  19. 2021最新 阿里云ECS搭建我的世界服务器
  20. 面向对象三大特性-多态

热门文章

  1. 人人商城php环境,关于微擎人人商城互动直播通信服务安装和启动教程记录
  2. mysql dp.cal 显示汉子_JS日历插件 - My97 DatePicker
  3. indesign选中不了图片删除_文件夹删除不了怎么办?文件夹删除不了的解决方法...
  4. Linux登录mysql密码正确被拒绝访问
  5. 超维空间鸿蒙大宇,高维空间的存在不仅能够统一基本力,还为时空穿越提供了可能!...
  6. pythonIED -pycharm基础知识
  7. java jks 转pfx_JKS、BKS、PFX证书格式之间转换
  8. Bmob后端云的使用
  9. HDU - 6638
  10. 双活数据中心建设概览