最近的项目都比较忙, 没太有时间来做练习, 不过 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 不断练习才能掌握, 这是一个必须要走过的路程, 在路上, 我开始加速了.