查询和01号的同学学习的课程完全相同的其他同学的信息的优化
查询和"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号的同学学习的课程完全相同的其他同学的信息的优化相关推荐
- sql 练习查询和“01“号的同学学习的课程完全相同的其他同学的信息
sql练习题 练习查询和"01"号的同学学习的课程完全相同的其他同学的信息 SELECT s_id,s_name,s_birth,s_sex FROM student WHERE ...
- 【SQL经典50题】9.查询和“ 01 “号的同学学习的课程完全相同的其他同学的信息【正解】
查询所用的表结构见https://blog.csdn.net/zjhbeautiful/article/details/108065336 SQL经典50题第9题正解 题目:查询和" 01 ...
- 查询和 01 号的同学学习的课程完全相同的其他同学的信息
今天再练习Mysql练习题的时候遇到了 "查询和01号的同学学习的课程完全相同的其他同学的信息" 的问题,开始一脸懵逼,那个带题目的大佬的答案貌似有点问题,所以网上看了一些大佬的代 ...
- 关于查询和1号的同学学习的课程完全相同的其他同学的信息详细
以下是建表语句: create table bdqn_student( sno number(2), sname varchar2(20) not null, sbirthdate date, sge ...
- 查询和“s001”号的同学学习的课程完全相同的其他同学学号和姓名
逻辑: 如果一个人所选课程有s001选择的课程, 且没有选择与s001不同的课程, 且和s001选择的课程数量相同, 这个人还不是s001,那这个人选择的课程和s001一样. 表sc(sno 学号,c ...
- SQL查询——查询和和xxx同学所选课程完全一样的同学
前言 今天碰到一个sql问题,想了半天才想出来,为了记录,所以写了这篇博客. 题目和环境是这样的 有四张表:学生表.教师表.课程表.成绩表 学生表(student):编号(sno).姓名(sname) ...
- JavaScript基础学习 模拟京东查询快递单号
JavaScript基础学习 模拟京东查询快递单号 <!DOCTYPE html> <html lang="en"><head><meta ...
- 深度学习的几何观点:1流形分布定律、2学习能力的上限。附顾险峰教授简历(长文慎入,公号回复“深度学习流形分布”可下载PDF资料)
深度学习的几何观点:1流形分布定律.2学习能力的上限.附顾险峰教授简历(长文慎入,公号回复"深度学习流形分布"可下载PDF资料) 原创: 顾险峰 数据简化DataSimp 今天 数 ...
- 01.神经网络和深度学习 W4.深层神经网络(作业:建立你的深度神经网络+图片猫预测)
文章目录 作业1. 建立你的深度神经网络 1. 导入包 2. 算法主要流程 3. 初始化 3.1 两层神经网络 3.2 多层神经网络 4. 前向传播 4.1 线性模块 4.2 线性激活模块 4.3 多 ...
- 01.神经网络和深度学习 W3.浅层神经网络
文章目录 1. 神经网络概览 2. 神经网络的表示 3. 神经网络的输出 4. 多样本向量化 5. 激活函数 6. 为什么需要 非线性激活函数 7. 激活函数的导数 8. 随机初始化 作业 参考: 吴 ...
最新文章
- OpenShift 4 - 应急响应Demo应用(AMQ+Knative+Quay+BPM+BDM+SSO)
- Element-UI-简单组合效果---Element-UI工作笔记002
- C#编程总结(四)多线程应用
- mysql sql语法区别_sql和mysql语法有什么不同
- android 屏幕分辨率 更改
- 计算机应用基础教程清华大学,清华大学出版社-图书详情-《大学计算机应用基础教程(第3版)》...
- AVC1与AVC与H264
- 浪曦struts2学习笔记1
- 程序员未来前景怎么样
- 微信商户平台(商户号)申请流程(仅供参考)
- 风行天下!翔升N61S智能主板低价上市
- iTool拷贝app到电脑上
- file-saver实现文件流下载
- HDMI 之 HPD
- [高通SDM450][Android9.0]CTA认证--去掉GPS功能
- arm嵌入式web服务器 性能,arm嵌入式web服务器
- android手机软件安装位置,改变Android手机软件安装位置方法
- 微信如何关闭城市服务定位服务器,位置定位微信(怎么悄悄的查对方位置)
- 2021最新 阿里云ECS搭建我的世界服务器
- 面向对象三大特性-多态
热门文章
- 人人商城php环境,关于微擎人人商城互动直播通信服务安装和启动教程记录
- mysql dp.cal 显示汉子_JS日历插件 - My97 DatePicker
- indesign选中不了图片删除_文件夹删除不了怎么办?文件夹删除不了的解决方法...
- Linux登录mysql密码正确被拒绝访问
- 超维空间鸿蒙大宇,高维空间的存在不仅能够统一基本力,还为时空穿越提供了可能!...
- pythonIED -pycharm基础知识
- java jks 转pfx_JKS、BKS、PFX证书格式之间转换
- Bmob后端云的使用
- HDU - 6638
- 双活数据中心建设概览