五一了, 2020过去近乎一半了, 疫情原因, 哪都没去, 其实与其出去玩, 不如呆着学习, 终身学习, 学无止境, 气有浩然, 这是我从上大学开始一直刻在脑海的训诫. 都说今年很艰难, 回头一想, 其实对于我来说, 根本就没啥影响, 我们做 IT 类工作, 只要一台电脑就可以, 而且我一直在工作, 从2月10号就复工, 没有远程, 一直在现场. 尤其是 刚过去的 黑色 4月, 从我的下班打卡时间就知道, 被客户折磨得多惨. 不过也是学习过程, 写了很多的 sql, 以前 用 Python, 就是 万物皆对象, 现在用 sql , 就是万物皆 SQL.

劳动节, 体力就免了, 脑力还是不能停的. 虽然这个五一, 我应该是不找小伙伴了, 但大学舍友结婚和初高中同学也结婚, 这个凑份子还是少不了, 其实更多是羡慕吧. 好想有个对象, 不然也不会每天都看看代码, 写写sql 来麻痹自己..

继续练习吧, 耐心和恒心, 总会获得回报的.

表关系

似乎, 这些练习也快要写完了, 事实证明, 工作中其实用到的也是这些, 字段筛选, 表格连接, 分组聚合, 行列转换等的功能, 写了很多之后, 真的感受到, 万物皆SQL .

需求 01

查询 选修 "仲尼" 老师所教授课程 的学生中 成绩最高的学生姓名, 和成绩

分析

这个例子蛮好, 成功将 4张表都串联到一起了.

先从 teacher 中, 查出 "仲尼" 老师 教师 id; 再 通过 教师 id, 从 course 表中, 查到其教授的课程 (这里是 1:1 的); 再从 score 表中, 查出选该课程的学生 id , 成绩, 同时 inner join 从 student 出姓名..

以前我是不太会, 现在这种sql 就是, 信手拈来呀.

现在整个暴力版的, 就是将涉及的表, 都先给他一顿爆连, 拼张大表, 然后字段要啥取啥.

select
b.*,
c.*,
d.*
from teacher as a
inner join course as b
on a.t_id = b.t_id
inner join score as c
on b.c_id = c.c_id
inner join student as d
on c.s_id = d.s_id

这样先来全部暴力敲一遍

+------+--------+------+--------+------+------+------+-------+------+-----------+------------+--------+
| t_id | t_name | c_id | c_name | t_id | s_id | c_id | score | s_id | s_name | birth_date | gender |
+------+--------+------+--------+------+------+------+-------+------+-----------+------------+--------+
| 0002 | 仲尼 | 0001 | 语文 | 0002 | 0001 | 0001 | 80 | 0001 | 王二 | 1989-01-01 | 男 |
| 0001 | 欧拉 | 0002 | 数学 | 0001 | 0001 | 0002 | 90 | 0001 | 王二 | 1989-01-01 | 男 |
| 0003 | NULL | 0003 | 英语 | 0003 | 0001 | 0003 | 99 | 0001 | 王二 | 1989-01-01 | 男 |
| 0001 | 欧拉 | 0002 | 数学 | 0001 | 0002 | 0002 | 60 | 0002 | 星落 | 1990-12-21 | 女 |
| 0003 | NULL | 0003 | 英语 | 0003 | 0002 | 0003 | 80 | 0002 | 星落 | 1990-12-21 | 女 |
| 0002 | 仲尼 | 0001 | 语文 | 0002 | 0003 | 0001 | 80 | 0003 | 胡小适 | 1991-12-21 | 男 |
| 0001 | 欧拉 | 0002 | 数学 | 0001 | 0003 | 0002 | 80 | 0003 | 胡小适 | 1991-12-21 | 男 |
| 0003 | NULL | 0003 | 英语 | 0003 | 0003 | 0003 | 80 | 0003 | 胡小适 | 1991-12-21 | 男 |
+------+--------+------+--------+------+------+------+-------+------+-----------+------------+--------+
8 rows in set (0.00 sec)

拼完再按条件过滤出需要的来.

select

  b.c_name,
c.score,
d.s_name from teacher as a
inner join course as b
on a.t_id = b.t_id
inner join score as c
on b.c_id = c.c_id
inner join student as d
on c.s_id = d.s_id -- 过滤条件写在这里
where a.t_name = '仲尼'
order by c.score desc limit 0, 1
+--------+-------+--------+
| c_name | score | s_name |
+--------+-------+--------+
| 语文 | 80 | 王二 |
+--------+-------+--------+
1 row in set (0.00 sec)

果然王二很厉害呀.

不想写子查询了, 这写起来就有些烦, 之前写过一次, 就不想在写了, 工作中如有很长的 sql , 我就会考虑是否要建一个视图 view 来简化 sql 的编写, 毕竟, 真的太长了.

不行, 还是要严格要求自己, 不能总是和自己妥协.

-- 教师id

(
select t_id from teacher where t_name = '仲尼'
)
+------+
| t_id |
+------+
| 0002 |
+------+
1 row in set (0.00 sec)
-- 课程 id
select c_id from course
where t_id =
(select t_id from teacher where t_name = '仲尼')
+------+
| c_id |
+------+
| 0001 |
+------+
1 row in set (0.00 sec)
-- 学生 id 和 课程成绩
select
s_id,
score from score
where c_id = (
select c_id from course
where t_id =
(select t_id from teacher where t_name = '仲尼')
)
+------+-------+
| s_id | score |
+------+-------+
| 0001 | 80 |
| 0003 | 80 |
+------+-------+
2 rows in set (0.00 sec)

最后再根据 s_id 从 student 中给 join 进来, 这一坨查询集作为一个, 套娃表, b表, 与 student 做内连接

select
b.s_id as 学号,
b.s_name as 姓名,
a.score as 成绩 from ( select
s_id,
score from score
where c_id = (
select c_id from course
where t_id =
(select t_id from teacher where t_name = '仲尼')
)
) as a inner join student as b
on a.s_id = b.s_id order by score desc
limit 0, 1 -- 游标0开始, 取1条
+--------+--------+--------+
| 学号 | 姓名 | 成绩 |
+--------+--------+--------+
| 0001 | 王二 | 80 |
+--------+--------+--------+
1 row in set (0.00 sec)

小结

  • 多表查询的, 对于 子查询和 join 需要配合起来用, 尤其是中间逻辑要全部理清楚
  • sql 中间查询集 其实跟用 DataFrame 是一样的, 也是在不断返回自身数据结构的过程
  • sql 练习非常必要, 这绝对是入坑一时爽, 一直蹲坑一直爽, sql 即将成为我第二大武器

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

  1. MS SQL 日常维护管理常用脚本(二)

    监控数据库运行 下面是整理.收集监控数据库运行的一些常用脚本,也是MS SQL 日常维护管理常用脚本(一)的续集,欢迎大家补充.提意见. 查看数据库登录名信息   Code Snippet SELEC ...

  2. 监控数据库运行 - MS SQL 日常维护管理常用脚本(二)

    查看数据库登录名信息 use mastergoSELECT name AS LoginName , dbname AS DefaultDB , createdate AS CreateDate, up ...

  3. sql 日常使用记录

    sql 某个字段在哪些表中存在: select sysobjects.name from syscolumns inner join sysobjects on syscolumns.id = sys ...

  4. mariadb:SQL日常使用总结

    1.关联删除 DELETE T_Base_Resource_Action FROM T_Base_Resource_Action  INNER JOIN T_Base_Resource ON T_Ba ...

  5. MS SQL 日常维护管理常用脚本

    --[查看数据库服务器名称] --默认实例查询 SELECT @@SERVERNAME AS SERVERNAME; SELECT SERVERPROPERTY('servername') AS Se ...

  6. SQL语句(十七)综合练习_分组查询_内嵌查询_视图使用

    Select * from Student Select * From Course Select * from SC --子查询 低于总平均成绩的女同学成绩 Select Grade from St ...

  7. SQL Sever 博客文章目录(2016-07-06更新)

    SQL Server方面的博客文章也陆陆续续的写了不少了,顺便也将这些知识点整理.归纳一下下.方便自己和他人查看. MS SQL 数据类型 三大数据库对比研究系列--数据类型 MS SQL 表和视图 ...

  8. SQL Server 监控统计阻塞脚本信息

        数据库产生阻塞(Blocking)的本质原因 :SQL语句连续持有锁的时间过长 ,数目过多, 粒度过大.阻塞是事务隔离带来的副作用,它是不可避免的,而且是一个数据库系统常见的现象. 但是阻塞的 ...

  9. Mybatis-plus的自定义分页搭配sql Server数据库使用

    原文出处:mybatisplus查询分页并且排序报错解决方法,适用于自定义sql和sqlserver_十七梦的博客-CSDN博客 一开始使用过的是官方文档来写分页,结果出现了如果不在最后添加ORDER ...

  10. 【Spring Boot&&Spring Cloud系列】Spring Boot配置文件

    很多的参数可以配置在application.properties或application.yml文件中 一.BANNER banner.charset=UTF-8 # Banner file enco ...

随机推荐

  1. Python实现URL自动转二维码的高效方法

    Python实现URL自动转二维码的高效方法 安装包依赖 pip install qrcode pip install pillow 程序 import qrcode data = "htt ...

  2. 若依-Vue 单体版本 更换mybatisPlus

    1.单体模块在pom.xml ; 多模块版本在ruoyi-common\pom.xml.模块添加整合依赖 <!-- mybatis-plus 增强CRUD --> <dependen ...

  3. 【vulhub】redis 4-unacc (redis未授权访问)

    渗透环境 攻击机:   IP: 192.168.66.130(Kali) 漏洞收录于:vulhub/redis/4-unacc 涉及知识点:redis未授权访问 影响版本:redis 版本 < ...

  4. 基于正则化的图自编码器在推荐算法中的应用 Application of graph auto-encoders based on regularization in recommendation algorithms

    引言 看过的每一篇文章,都是对自己的提高.不积跬步无以至千里,不积小流无以成江海,积少成多,做更好的自己. 本文基于2023年4月6日发表于SCIPEERJ COMPUTER SCIENCE(PEER ...

  5. 【答题系统可参考】php 禁止api被跨域调用

    在 PHP 中,防止 API 被跨域调用可以通过设置适当的 HTTP 响应头来实现.跨域资源共享(CORS,Cross-Origin Resource Sharing)机制允许或拒绝来自不同源的请求. ...

  6. Mermaid Live Editor 如何调整方向

    在 Mermaid Live Editor 中,默认情况下,流程图和序列图等都是按照从左到右的方向来布局的.但是,如果你想要创建一个从上到下(纵向)布局的图形,你可以使用 TD(Top-Down,即从 ...

  7. QTableView实现在表格内直接对数据库内容进行修改、新增和删除等操作

    文章目录 前言 QSqlTableModel 新增 删除 修改 提交 取消 前言 本文主要利用QSqlTableModel+QTableView来实现直接在QTableView中进行对数据库数据的操作 ...

  8. 本地项目上传到gitee

    前置条件:本地已经装好了GIt和GITEE有远程地址 检查本地装好了GIT:鼠标右键 检查准备好了远程:地址 本地项目拷贝到目录 D:\tmp2024-02-19\code 本地项目所在文件夹打开gi ...

  9. SpringBoot+Thymeleaf渲染下拉框异常解决

    常规方式 <select class="form-control" name="operationType" th:field="${itemT ...

  10. Cursor 老改坏代码?六哥这几招超管用!

    大家好,我是六哥!最近不少小伙伴和我吐槽,在使用Cursor时,AI老是把代码改坏,让人头疼不已.我自己也用了大几十个小时Cursor,今天就来给大家分享一些实用小窍门,教大家如何巧妙规避这类问题. ...