【MySQL✨】MySQL 入门之旅 · 第八篇:数据排序与分组
本篇文章将带你学习 MySQL 中的 ORDER BY 排序 和 GROUP BY 分组,这两个操作是数据分析中非常常见的场景。
通过排序,你可以按指定的规则查看数据的先后顺序;通过分组,你可以对数据进行分类统计,比如计算每个部门的平均工资、每位客户的订单数等。
目录
- 使用 ORDER BY 排序
- 使用 GROUP BY 分组并统计数据
- 小结
使用 ORDER BY 排序
在 SQL 中,默认返回的数据是无序的。如果我们希望结果集按照某个字段排序,就需要用到 ORDER BY。
基本语法
SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC];
ASC
:升序(从小到大,默认)DESC
:降序(从大到小)
示例
假设有一张 users
表:
id | name | age | score |
---|---|---|---|
1 | Alice | 22 | 85 |
2 | Bob | 25 | 90 |
3 | Carol | 22 | 78 |
4 | David | 23 | 88 |
1. 按年龄升序排序
SELECT * FROM users
ORDER BY age ASC;
结果:
id | name | age | score |
---|---|---|---|
1 | Alice | 22 | 85 |
3 | Carol | 22 | 78 |
4 | David | 23 | 88 |
2 | Bob | 25 | 90 |
2. 按成绩降序排序
SELECT * FROM users
ORDER BY score DESC;
结果:
id | name | age | score |
---|---|---|---|
2 | Bob | 25 | 90 |
4 | David | 23 | 88 |
1 | Alice | 22 | 85 |
3 | Carol | 22 | 78 |
3. 先按年龄升序,再按成绩降序
SELECT * FROM users
ORDER BY age ASC, score DESC;
结果:
id | name | age | score |
---|---|---|---|
1 | Alice | 22 | 85 |
3 | Carol | 22 | 78 |
4 | David | 23 | 88 |
2 | Bob | 25 | 90 |
使用 GROUP BY 分组并统计数据
当我们需要按某个字段进行统计时,就要用到 GROUP BY。
它通常和 聚合函数 一起使用:
COUNT()
:统计数量SUM()
:求和AVG()
:平均值MAX()
:最大值MIN()
:最小值
基本语法
SELECT column, aggregate_function(column2)
FROM table_name
GROUP BY column;
示例
假设有一张 orders
表:
order_id | customer_id | amount |
---|---|---|
1 | 101 | 100 |
2 | 102 | 150 |
3 | 101 | 200 |
4 | 103 | 50 |
5 | 102 | 300 |
1. 统计每个客户的订单数
SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id;
结果:
customer_id | order_count |
---|---|
101 | 2 |
102 | 2 |
103 | 1 |
2. 统计每个客户的总消费金额
SELECT customer_id, SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id;
结果:
customer_id | total_amount |
---|---|
101 | 300 |
102 | 450 |
103 | 50 |
3. 统计每个客户的最高订单金额
SELECT customer_id, MAX(amount) AS max_order
FROM orders
GROUP BY customer_id;
结果:
customer_id | max_order |
---|---|
101 | 200 |
102 | 300 |
103 | 50 |
4. 使用 HAVING 过滤分组结果
HAVING
用于对分组后的结果再做过滤(类似 WHERE
,但针对聚合后的数据)。
SELECT customer_id, SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id
HAVING total_amount > 200;
结果:
customer_id | total_amount |
---|---|
101 | 300 |
102 | 450 |
小结
- ORDER BY 用于对结果排序,可升序
ASC
或降序DESC
; - GROUP BY 用于对数据分组,通常结合聚合函数(COUNT、SUM、AVG、MAX、MIN);
- HAVING 用来过滤分组后的结果,作用类似于
WHERE
。
📘 下一篇,我们将学习 MySQL 聚合函数与分组查询,带你了解如何使用聚合函数对数据进行统计分析。