前言
这段时间,刷掉了LeetCode的数据库简单题目,挺有感触的。在刷这些题之前,我只写过一般的增删改查,尤其是查询操作,使用的也不是很灵活,只知道最基本的用法。
去刷了题目之后真的学到了很多不论是新的知识点还是一些组合用法,总之对数据库操作尤其是dql的使用更加熟练了。学会这些小操作后,写sql头不疼了,腰不酸了,睡得着了,吃饭也更香了。
根据这54道题,我总结了一些常用的知识点、小技巧以及部分有代表性的题解。
这篇文章就来分享一些小技巧。也许不算技巧,或者只算是知识点的组合
多关键字排序
多关键字排序是很多时候都被要求的操作。在一开始了解到排序语句时就只了解到了通过某个字段排序,是单关键字排序。
面对多关键字排序的需求,一开始确实容易反应不过来,以为是什么新操作。
其实就是老树新花,在原来的排序语句中,使用逗号将多个排序字段隔开即可,每个字段后面还可以跟上各自的顺序。
学生们参加各科测试的次数
题目链接
这道题需要我们每个学生参与每场考试的次数
对于输出结果,有对顺序的需求,需要以学生id为第一关键字,科目名称作为第二关键字,升序排序
由于排序的默认顺序是升序,因此我们在制定指定排序关键字时可以省略排序顺序。
SELECT
s.student_id,
s.student_name,
sb.subject_name,
COUNT(e.student_id) AS attended_exams
FROM
Students s
join Subjects sb
LEFT JOIN Examinations e
on e.subject_name = sb.subject_name and e.student_id = s.student_id
GROUP BY
s.student_id,sb.subject_name
ORDER BY
s.student_id,sb.subject_name;
在group_concat中使用排序
group_concat是分组后常用的一个函数,他能将一个分组内的内容按照一定格式陈列出来。
在陈列内容的时候,往往有排序的需求,像是根据某某字段进行排序等等。
在group_concat中进行排序,只需要直接在所有陈列字段的后面写上排序规则即可,即order by 字段1 (desc),字段2 (desc)...
就像下面这道题:
按日期分组销售产品
题目链接
这个题目要求我们按照销售日期分组,分组后展示所有的销售商品,按照商品名称排序,就正好需要我们根据某个字段进行排序。
select
sell_date,
count(distinct product) as num_sold,
group_concat(distinct product order by product) as products
from
activities
group by
sell_date
;