五一了, 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. WPF 调试工具使用

    参考链接: https://supportcenter.devexpress.com/ticket/details/t720001/how-to-use-the-snoop-utility-to-in ...

  2. Deepseek学习随笔(3)--- 高效提问技巧

    明确需求 在与 DeepSeek 互动时,明确需求是获取高质量回复的关键.以下是一些示例: 错误示例:帮我写点东西 这样模糊的指令无法让 DeepSeek 理解你的具体需求,生成的回复可能无法满足你的 ...

  3. git ssh秘钥生成及配置

    ssh-keygen -t rsa -C "email@gmail.com" 回车后提示输入密码, 此处密码可以不填, 直接回车,提示再次输入密码, 直接回车,生成成功 前往 /U ...

  4. Trae AI 工具使用记录--0手写代码创建桌面代办事项软件

    使用的AI工具是最近字节跳动出品的Trae工具. 第一步 下载IDE,Trae(官网链接 https://www.trae.ai) 安装完成后注册.登录,可以直接使用github账号.第一个坑就是目前 ...

  5. 【数学公式】mathtype和word2016集成

    mathtype 安装好了以后,word 没有相应的选项卡怎么办? 问题 解决办法 找到word的启动路径 2. 找到mathtype 安装好后的mathpage文件夹 进入文件夹,找到MathPag ...

  6. 【由技及道】量子跃迁部署术:docker+jenkins+Harbor+SSH的十一维交付矩阵【人工智障AI2077的开发日志011】

    摘要: SSH密钥对构建的十一维安全通道 × Harbor镜像星门 × 错误吞噬者语法糖 = 在CI/CD的量子观测中实现熵减永动机,使容器在部署前保持开发与生产维度的叠加态 量子纠缠现状(技术背景) ...

  7. Thinkphp3.2 PHPMailer 发送邮件

    第一步 :下载附件PHPMailer解压到ThinkPHP\Library\Vendor 第二步:在Common文件夹中的公共函数function.php中写一个发送邮件的函数, 这样可以在项目任意位 ...

  8. 选择排序(简单版)(LOW)

    博客地址:https://www.cnblogs.com/zylyehuo/ # _*_coding:utf-8_*_ def select_sort_simple(li): li_new = [] ...

  9. K8S基本概念和组件

    特点 便携性 无论公有云.私有云.混合云还是多云架构都全面支持 可扩展 模块化.可插拔.可挂载.可组合,支持各种形式的扩展 自修复 自保持应用状态.自重启.自复制.自缩放,声明式语法 组件 etcd ...

  10. 一个属性同时使用Autowired和Resource注解会发生什么?

    首发于公众号:BiggerBoy 右侧图片wx扫码关注有惊喜 欢迎关注,查看更多技术文章 如题,如果在同一个属性上使用@Autowired注解注入bean1,然后使用@Resource注解注入bean ...