SQL 强化练习 (七)
继续 sql 练习, 不能停下来的哦, 通过这一系列的搬砖操作, 相信在日常业务的sql 应该是能达到相对清楚地写出来的, 尤其是我做数据分析这块, 感觉真的每天都要写才行, 之前都是用 Python 来轻松搞定, 但仔细一想, sql 才是最通用的哦, sql 熟练了, 我感觉, 数据分析的基础工作就已经完成一半了, 剩下的指标计算, 这些不就是简单的 加减乘除而已, 分分钟脚本批量处理它.
表关系
需求
查询 和 0001 号同学, 所学课程 完全相同的 其他同学的学号.
分析
先查出 0001 这个兄弟, 的所有课程 id;
然后查出 not in 这些 课程 id 的这些 学号;
还要完全相同, 则, group by s_id 后, 选课的数量还必须一致哦.
从 3 中 排除掉 2 中的 id 剩下的就是满足条件的啦
-- 1. 先看看 0001 这个兄弟选了哪些课程
select c_id from score where s_id = '0001';
+------+
| c_id |
+------+
| 0001 |
| 0002 |
| 0003 |
+------+
3 rows in set (0.01 sec)
都给选上了. 即下一步, 要找的学生, 必须都同时选了 1,2,3号课程, 注意不能多哦 , 要完全相同.
-- 2. 反向来看, 没有跟 0001 兄弟选课一样的那些人是谁
select s_id
from score
where c_id not in (
select c_id from score where s_id = '0001'
);
Empty set (0.00 sec)
空的哦, 还行的.
-- 4. 把那些选课数量 跟 0001 相同的 兄弟给找出来.
select
s_id
from score
where s_id != "0001"
group by s_id having
-- 数量一致的兄弟
count(distinct c_id) = (select count(distinct c_id) from score
where s_id = "0001")
+------+
| s_id |
+------+
| 0003 |
+------+
1 row in set (0.00 sec)
最后是,从选课数量相同的那些学号中, 过滤掉, 没有选课一样的 那些 id , 剩下的就是呀.
select
s_id as "学号",
s_name as "姓名"
from student where s_id in (
select
s_id
from score
where s_id != "0001"
group by s_id having
count(distinct c_id) = (select count(distinct c_id) from score
where s_id = "0001")
)
and s_id not in (
select s_id
from score
where c_id not in (
select c_id from score where s_id = '0001'
)
);
+--------+-----------+
| 学号 | 姓名 |
+--------+-----------+
| 0003 | 胡小适 |
+--------+-----------+
1 row in set (0.01 sec)
感觉写起来有点绕, 不过逻辑还是蛮清楚的哦. 感觉还是要重新来复盘一波的.
首先呢, step 1 可以轻易查到, 0001 这个兄弟 选了 1,2,3 门课程.
于是 step2 先选出, 所学课 不在 (not in) (1,2,3) 的同学的学号, 这些事必须要排除的哦.
在来 step3 基于 step2 所剩下的同学, 必然是选了 1, 2,3 中的 某几门 课程, 究竟选了几门, 则判断其课程总数 跟 001 这个兄弟的课程数是相等的 学号即可.
关键就是这个 in 和 not in 的用法, 这个题的逻辑还是, 有点东西的我感觉.
小结
- 总体问题进行拆解, 分块查询出结果, 跟咱写代码框架是一样的哦.
- 应用反向思维, in 和 not in 的配合使用
- 子查询, 查询集的逻辑理清楚, 小 tips 就是 取别名和加括号来区分, 同时注意排版哦.
SQL 强化练习 (七)的更多相关文章
- SQL总结(七)查询实战
SQL总结(七)查询实战 一.场景 给定一个场景,学生选课系统为例,大家很熟悉. 主要关系: 学生(学号.姓名.年龄.性别) 教师(教师ID,教师姓名) 课程(课程ID,课程名称,任教教师ID) 成绩 ...
- 漏洞重温之sql注入(七)
漏洞重温之sql注入(七) sqli-labs通关之旅 Less-31 首先,进入31关,我们先添加上id参数. 然后,我们查看源码. 我们门可以看到,index页面源码其实很简单,网页也没有对我们的 ...
- SQL优化的七个方面
SQL优化的七个方面 1. 创建索引 禁止给表中每一列都建立单独索引 每个Innodb表都必须有一个主键 要注意组合索引的字段顺序 优先考虑覆盖索引 避免使用外键约束 2. 避免索引失效 失效场景: ...
- 只显示前几条数据的sql语句写法 七种数据库中Select Top的使用方法
七种数据库中Select Top的使用方法 1. Oracle数据库 SELECT * FROM TABLENAME WHERE ROWNUM <= N 2. Infomix数据库 SELECT ...
- SQL入门经典(七) 之脚本和批处理
什么是脚本.我们前面学的CREATE TABLE <table name> ,USE <database name>这些都是脚本,为什么用脚本.脚本存储到文件中并且可以重复利用 ...
- SQL笔记-第七章,表连接
SQL中使用JOIN 关键字来使用表连接.表连接有多种不同的类型,被主流数据库系统支持的有交叉连接(CROSS JOIN).内连接(INNER JOIN).外连接(OUTTER JOIN),另外在有的 ...
- IBatis.net 输出SQL语句(七)
一.IBatis.net输出SQL语句到控制台 输出IBatis.net生成的SQL语句到控制台,能够方便调试. 如果要想输出IBatis.net的SQL语句到控制台,那么只需要做如下配置即可: &l ...
- 抓取锁的sql语句-第七次修改
最近闲来没事,把之前写的那个抓取锁的存储过程重新修改.优化了一下,呵呵 create or replace procedure solve_lock_061203_wanjie(v_msg out v ...
- PL/SQL 游标 (实验七)
PL/SQL 游标 emp.dept 目标表结构及数据 要求 基于部门表建立游标dept_cursor1,使用记录变量接收游标数据,输出部门表信息: 显示格式: 部 门 号: XXX 部门名称: XX ...
- SQL强化(一)保险业务
保险业务 : 表结构 : sql语句 : /*1. 根据投保人电话查询出投保人 姓名 身份证号 所有保单 编号 险种 缴费类型*/SELECTt2.cust_name,t2.idcard,t4.pro ...
随机推荐
- 牛客题解 | 单组_spj判断YES与NO
题目 题目链接 解题思路 后台有spj代码,能对同学们的输出数据进行校验,符合条件即可通过. 附赠 spj 代码 #include <iostream> #include <fstr ...
- MySQL - [11] InnoDB存储引擎
Page 页.是真正理解InnoDB存储引擎的入口. 一.Page -- 页 1.1.InnoDB 数据页及其结构 为了避免一条一条读取磁盘数据,InnoDB采取页的方式,作为磁盘和内存之间交互的基本 ...
- js回忆录(3) -- 循环语句,前后缀运算符
计算机对于大批量数据的处理速度比起人类不知道快了多少,因此对于重复的操作,使用循环语句处理是很方便的,对于我们前端来说,给同一标签的元素绑定事件啦,tab切换啦,左右联动效果啦,等等都可以使用循环语句 ...
- docker报错 ERROR: Service 'workspace' failed to build: ERROR: Service 'php-fpm' failed to build:
在 Windows 系统中使用 Laradock 搭建基于 Docker 的 PHP 开发环境 执行命令 docker-compose up nginx mysql redis 执行过程中出现错误 报 ...
- 学习 Docker 如何查看镜像信息?
学习 Docker 如何查看镜像信息? 一.images 命令列出镜像 通过使用如下两个命令,列出本机已有的镜像: docker images 或: docker image ls 如下图所示: 对上 ...
- MySQL-脏页的刷新机制
MySQL内存结构-缓冲区 MySQL的缓冲区中有数据页,索引页,插入缓冲等等,这个角度是从页的功能来分类的.本小节从另一个视角关注这些页,如果从 是否被修改过(和磁盘不一致) 这个角度来区分这些页, ...
- Linux脚本-自动ping网址列表
背景 公司某一项业务需要管理多种类硬件,有一些硬件的管理功能没有实现前台展示,检测和硬件之间的网络连接状况需要通过ping每个ip地址来单独实现.在需要大规模调试网络的时候,每个硬件单独ping就显得 ...
- 设置git忽略文件
要设置Git忽略文件,你可以使用一个名为.gitignore的特殊文件.在这个文件中,你可以列出需要Git忽略的文件.文件夹.或者匹配模式.当Git执行操作时,它会自动忽略这些被列出的文件. 1. 在 ...
- 【MathJax】语法总结
基础语法 1.显示公式 在行中显示的 (inline mode),就用 $...$ 单独一行显示 (display mode),则用 $$...$$ 2.希腊字母 要显示希腊字母,可以用 \alpha ...
- 【Java】基本语法
一.语言概述 整体语言概述 (一)Java语言概述 1.基础常识 软件:即一系列按照特定顺序组织的计算机数据和指令的集合.分为:系统软件 和 应用软件 系统软件:windows , mac os , ...