趁热打铁, 一波 SQL 继续带走 ~~

虽然是假期, 但我也不想出去逛, 宅着也不想看书和思考人生, 除了做饭, 就更多对着电脑发呆. 时而看了下微信群, 初中小伙伴结合, 祝福寄语 和 随份子 都已安排. 满满地的羡慕哇. 别人的欢愉, 终将还是与我没啥太大关系. 而我在追求啥呢, 现在的我没有社交, 也没有什么朋友, 日常疲与应付工作, 如果谈思考人生的话, 我确实是会在思考人生在世的意义, 我始终觉得人生没有意义, 如果不做点啥, 只是平庸地活着. 而我现在就是, 就是为了活着, 而活着, 也不知道意义在哪. 又回想一个大学老师, 以他的经历告诉我们:

  • 人生的意义, 在于追求
  • 人生的价值, 在于奉献

一开始是觉得, 这个老师价值观挺正, 比思修老师还正, 当然也没几个人将其当做一回事儿. 现当我每天在疲于工作的时候, 突然就会想这个问题, 尤其是在深圳这样的一线城市. 我不禁一次次追问自己, 我追求啥? 我又奉献了啥? 结论是, 现在的我,或许从这个很正的价值观来看, 我是在浪费生命, 和碌碌无为, 既甘于平庸, 有对平庸有偶尔的愤怒.

很多时候都是思而不得, 就假借不断工作来麻痹自己, 当然领导是对我挺满意的, 其实我也不在乎, 只想用工作或者, 写代码还麻痹自己, 这也是写这些, 没啥用的笔记的原因之一.... 似乎有点扯远了, sql 回归主题, 继续刷 sql 呀, 技术就是需要不断学习, 练习 和积淀的过程.

表关系

上篇是整了个, 还是有些稍微复杂的 套娃, 从 a 写到 g 了. 这篇还是来一些稍微简单些的, 练习而已, 不要太当真.

需求 01

查询 每门课程的学生选课人数 (超过 2人 才统计)

要求 输出课程号 和 选修人数, 查询结果 按人数 降序, 如人数相同, 按课程号 升序 排列

分析

从 score 中对 c_id 进行 group by , 然后 再 having 出 count(s_id) > 2 即可

select
c_id,
count(distinct s_id)
from score
group by c_id
having count(distinct s_id) > 2
+------+----------------------+
| c_id | count(distinct s_id) |
+------+----------------------+
| 0002 | 3 |
| 0003 | 3 |
+------+----------------------+
2 rows in set (0.00 sec)

然后再按照 人数降序, 课程号升序, 这不简单得一批.

select
c_id,
count(distinct s_id) as chosed_num from score
group by c_id
having count(distinct s_id) > 2 order by chosed_num desc, c_id asc
+------+------------+
| c_id | chosed_num |
+------+------------+
| 0002 | 3 |
| 0003 | 3 |
+------+------------+
2 rows in set (0.00 sec)

这种 group by + having 的, 非常简单了, 真的理解了 group by 不论是从 sql 的视角, 还是 从 R, 从 Pandas 的视角来看, 一旦真正了解, 数据分析基本掌握了一大半. 仔细一想, 每天做的数据分析处理的工作, 不都是在按不同维度进行 group by 嘛.., 业务就是这样的, 看似复杂, 其实还是围绕 group by 来做维度细分的呀.

需求 02

查询 至少选修两门课的 学生学号, 姓名, 课程名称, 分数

分析

先将选了 2 门课以上的 s_id 找出来, 然后从 score 表, course 表, student 中匹出相应的字段即可

select s_id from score
group by s_id having count(c_id) > 2
+------+
| s_id |
+------+
| 0001 |
| 0003 |
+------+
2 rows in set (0.00 sec)

然后就是把 1, 3 号兄弟, 的姓名, 学号, 课程名称等都 匹上 即可. 之前写类似的我用的 套娃, 现在打算不那样做, 用子查询来弄, 即从 score 中, 筛选出 1, 3 号兄弟的 成绩表, 然后再 inner join 上其他的信息.

不对, 直接先来连接上, 最后再整体过滤吧. 先不过滤, 不考虑性能, 这样先我感觉语句会更顺一点.

select
a.s_id,
c.s_name,
b.c_name,
a.score
from score as a inner join course as b
on a.c_id = b.c_id inner join student as c
on a.s_id = c.s_id -- 最后再来进行过滤
where a.s_id in ( select s_id from score
group by s_id having count(c_id) > 2 )

当然也可以先来 where 的, 就是先套娃嘛, 跟之前的一样的. 但我感觉, 不太好读, 说实话, 对于套娃.

select
b.s_id,
d.s_name,
c.c_name,
b.score from (
select
a.s_id,
a.c_id,
a.score from score as a
where a.s_id in (
select s_id from score
group by s_id having count(c_id) > 2
)
) as b inner join course as c
on b.c_id = c.c_id inner join student as d
on b.s_id = d.s_id
+------+-----------+--------+-------+
| s_id | s_name | c_name | score |
+------+-----------+--------+-------+
| 0001 | 王二 | 语文 | 80 |
| 0001 | 王二 | 数学 | 90 |
| 0001 | 王二 | 英语 | 99 |
| 0003 | 胡小适 | 语文 | 80 |
| 0003 | 胡小适 | 数学 | 80 |
| 0003 | 胡小适 | 英语 | 80 |
+------+-----------+--------+-------+
6 rows in set (0.00 sec)

虽然二者的结果是一样的, 但我感觉, 我还是更加喜欢前面的吧, 虽然我平时在工作中用的更多是 后面的套娃, 其实写得贼难受了, 套娃, 一层层的, 别说别人看不懂 , 过一段时间, 我自己都看不懂是咋嵌套的了.

小结

  • group by + having 过滤, 这个技能是必须要熟练运用的呀, 而且应用场景还特别多
  • join 和 where, 条件放哪的问题, 我觉得都没关系, 看是写套娃还是最后来过滤, 代码可读上, 我选择先 join 最后再来对整体进行 where , 而, 从功能实现上, 我更多的还是套娃, 一个个算出来, 套上, 然后在进行 join
  • 思考, sql 的的执行顺序很关键, 这也是我现在写SQL的风格, 解释器怎么读,我就怎么写, 在顺序上

SQL 日常练习 (十九)的更多相关文章

  1. SQL语句(十九)——存储过程(练习)

    select * From Student select * From Course select * from SC --INSERT INTO SC (Sno, Cno, Grade) --VAL ...

  2. SQL注入之Sqli-labs系列第四十七关,第四十八关,第四十九关(ORDER BY注入)

    0x1 源码区别点 将id变为字符型:$sql = "SELECT * FROM users ORDER BY '$id'"; 0x2实例测试 (1)and rand相结合的方式 ...

  3. SQL注入之Sqli-labs系列第三十八关、第三十九关,第四十关(堆叠注入)

    0x1 堆叠注入讲解 (1)前言 国内有的称为堆查询注入,也有称之为堆叠注入.个人认为称之为堆叠注入更为准确.堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新 的查询或者终止查询,可以达到修改数据 ...

  4. MyBatis基础入门《十九》动态SQL(set,trim)

    MyBatis基础入门<十九>动态SQL(set,trim) 描述: 1. 问题 : 更新用户表数据时,若某个参数为null时,会导致更新错误 2. 分析: 正确结果: 若某个参数为nul ...

  5. SQL注入之Sqli-labs系列第二十九关(基于WAF防护的单引号报错注入)

    开始挑战第二十九关(Protection with WAF) 0x1查看源码 (1)login.php页面存在防护,只要检测到存在问题就跳转到hacked.php页面(其他信息看备注) 0x2 for ...

  6. spring boot / cloud (十九) 并发消费消息,如何保证入库的数据是最新的?

    spring boot / cloud (十九) 并发消费消息,如何保证入库的数据是最新的? 消息中间件在解决异步处理,模块间解耦和,和高流量场景的削峰,等情况下有着很广泛的应用 . 本文将跟大家一起 ...

  7. mysql进阶(二十九)常用函数

    mysql进阶(二十九)常用函数 一.数学函数 ABS(x) 返回x的绝对值 BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制) CEILING(x) 返回大于x的最小整数值 EXP ...

  8. spring Boot(十九):使用Spring Boot Actuator监控应用

    spring Boot(十九):使用Spring Boot Actuator监控应用 微服务的特点决定了功能模块的部署是分布式的,大部分功能模块都是运行在不同的机器上,彼此通过服务调用进行交互,前后台 ...

  9. centos MySQL主从配置 ntsysv chkconfig setup命令 配置MySQL 主从 子shell MySQL备份 kill命令 pid文件 discuz!论坛数据库读写分离 双主搭建 mysql.history 第二十九节课

    centos  MySQL主从配置 ntsysv   chkconfig  setup命令  配置MySQL 主从 子shell  MySQL备份  kill命令  pid文件  discuz!论坛数 ...

  10. centos LAMP第一部分-环境搭建 Linux软件删除方式,mysql安装,apache,PHP,apache和php结合,phpinfo页面,ldd命令 第十九节课

    centos LAMP第一部分-环境搭建  Linux软件删除方式,mysql安装,apache,PHP,apache和php结合,phpinfo页面,ldd命令 第十九节课 打命令之后可以输入: e ...

随机推荐

  1. 『Python底层原理』--CPython的变量实现机制

    在Python中,变量的使用看起来非常简单,例如 a = 10,s = "hello"等等. 然而,这种简单的赋值操作背后,CPython其实做了很多复杂的工作. 本文将通过一些简 ...

  2. sprintf用法详解

    sprintf 将字串格式化. 在头文件 #include< stdio.h >中 语法: int sprintf(string format, mixed [args]...); 返回值 ...

  3. vscode开发小程序2

    开发tab: 1.下载阿里图标到新建文件夹icons里面 2.在app.json里面的"windows"同层下设置tab: 默认样式的设置:小程序中不识别通配符*! 1. 2.查看 ...

  4. Minecraft server.properties 参数含义 1.18.1,Java版

    服务器搭建 参照: https://www.spigotmc.org/wiki/buildtools/#latest 参数含义 #Fri Feb 11 15:20:40 CST 2022 # 启用jm ...

  5. Vulnhub-FristiLeaks_1.3

    一.靶机搭建 选择扫描虚拟机 选择路径即可 二.信息收集 靶机信息 产品名称:Fristileaks 1.3 作者:Ar0xA 发布日期: 2015 年 12 月 14 日 目标:获取root(uid ...

  6. Manus爆火,是硬核还是营销?

    相信这两天小伙伴们应该被Manus刷屏了,铺天盖地的体验解读文章接踵而来,比如「数字生命卡兹克」凌晨爆肝的热文:「一手体验首款通用Agent产品Manus」.从公众号.朋友圈.抖音.央媒,都能看到Ma ...

  7. 【文献阅读】 PVDF &阻尼&有限元建模

    1. 压电Damper原理 Piezoelectric Composite Materials - ScienceDirect 当振动传递到压电材料时,振动能量通过压电效应转化为电能,产生交流电压.所 ...

  8. 【Python】批量提取Fibersim xml文件中的节点网格数据

    程序功能: 输入需求: fibersim导出的ply 的xml文件,可以很多个也没问题.但名字要有规律,不然没法循环读写.比如我自己用的就是x1.xml.x2.xml.Y1.xml......的文件名 ...

  9. Manjora配置记录

    22/9/12 目前的启动项有3:Windows Boot Manager.Manjaro.UEFI OS.其中UEFI OS 和 Manjaro 进入后内容相同:Windows下检测不到Manjar ...

  10. JMeter 线程重复读取在跑数据的解决方法

    场景: 需要模拟 100 个账号,100个并发,循环登录登出系统:由此引起了一个问题,如果线程10比线程1提前结束,那么线程10会按 cvs 顺序读取,就有可以读取到目前还在其他线程里面的一个账号: ...