SQL 日常练习 (十四)

最近的项目都比较忙, 没太有时间来做练习, 不过 sql 这块, 还是始终要保持良好的手感, 我已经渐渐感觉到, 随着写得越来越多, 当然不只是在这里, 更多是在工作中, 不过涉及信息安全不能共享. 结论是, sql 写好了, 能够解决一大堆的问题哦. 今天被客户恶心到了, 要给台账建一个表, 做一个填报 ... 100来个字段, 尤其是在给表字段取名的时候, 我感觉, 我的英文词汇量,配不上辣么多的字段....纯手打的方式, 我也渐渐喜欢了, 比起智能提示, 不如记事本来直接写 sql 得了. 加完班, 基础的 sql 还是继续练起来呀, 继续网上搬搬砖, 写几句.

表关系

!

需求 01

查询平均成绩大于等于 85 的 所有学生的学号, 姓名, 平均成绩

分析

这就跟直接的那个用 max(case when ..) 列字段 横向展开是一样的呀, 平均成绩.. 聚合, 必然要做 group by

直接来看看, 平均分 >= 85 是哪些人.

select 
  s_id,
  avg(score) as avg_score
from score
group by s_id
having avg_score >= 85

+------+-----------+
| s_id | avg_score |
+------+-----------+
| 0001 |   89.6667 |
+------+-----------+
1 row in set (0.01 sec)

有了 s_id, 匹上姓名即可呀. inner join 即可

select 
  a.s_id,
  b.s_name,
  avg(a.score) as avg_score
from score as a

-- 根据 s_id 匹配上 s_name
inner join student as b 
  on a.s_id = b.s_id

group by a.s_id, b.s_name
  having avg_score >= 85
+------+--------+-----------+
| s_id | s_name | avg_score |
+------+--------+-----------+
| 0001 | 王二   |   89.6667 |
+------+--------+-----------+
1 row in set (0.00 sec)

是蛮简单的. 当然也可能是我最近业务熟悉比较多一点, 因此写起来 sql 也就更顺畅一些了呀.

需求 02

查询 每门课程的平均成绩, 按平均成绩 升序排列, 平均成绩相同, 按课程号 降序排列

分析

核心点是 group by 和 order by . 其实也是非常简单的一个练手.

select

  a.c_id,
  b.c_name,
  avg(a.score) as avg_score

from score as a

-- 匹配上课程名称
inner join course as b
  on a.c_id = b.c_id 

group by a.c_id, b.c_name

order by avg_score asc, a.c_id desc

| c_id | c_name | avg_score |
+------+--------+-----------+
| 0002 | 数学   |   76.6667 |
| 0001 | 语文   |   80.0000 |
| 0003 | 英语   |   86.3333 |
+------+--------+-----------+
3 rows in set (0.00 sec)

需求 03

查询课程名称为 "数学", 且分数低于 90 分的学生姓名, 分数

分析

这种毫无难度的, 直接秒杀它. 哦, 也不能说毫无难度, 起码它是要涉及 score, course, student 三张表的哦

select
  c.s_id,
  c.s_name,
  a.score as 数学成绩
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.score < 90) and (b.c_name = '数学')
+------+-----------+--------------+
| s_id | s_name    | 数学成绩     |
+------+-----------+--------------+
| 0002 | 星落      |           60 |
| 0003 | 胡小适    |           80 |
+------+-----------+--------------+
2 rows in set (0.00 sec)

小结

  • 日常联系 group by 和 order by 这些常用的 (只要涉及聚合, 必然 group by )
  • Join 即表之间的关联上, 或者说拼接上, 脑海有画面, 基本就成功了, Join 真的太强大
  • sql 不断练习才能掌握, 这是一个必须要走过的路程, 在路上, 我开始加速了.
原文地址:https://www.cnblogs.com/chenjieyouge/p/12741312.html