· MySQL 排序分页与聚合查询

MySQL 排序分页与聚合查询

537 字
3 分钟
MySQL 排序分页与聚合查询
StarryLin/Geek · 摘要

本文讲解MySQL排序、分页、聚合、分组及分组后过滤,说明各子句执行顺序,并辨析WHERE与HAVING、两种COUNT用法的差异。

第6章 排序、分页与聚合查询#

6.1 排序 ORDER BY#

ORDER BY 对查询结果排序,ASC 升序(默认)、DESC 降序:

SELECT * FROM student ORDER BY age DESC;

多字段排序时,先按第一个字段排,相同再按第二个字段排:

SELECT * FROM student ORDER BY class_id ASC, age DESC;

6.2 分页 LIMIT#

LIMIT 限制返回的行数,常配合 OFFSET 实现分页:

SELECT * FROM student LIMIT 5; -- 前 5 行
SELECT * FROM student LIMIT 5 OFFSET 10; -- 跳过 10 行,取 5 行

简写形式 LIMIT 偏移量, 行数:

SELECT * FROM student LIMIT 10, 5; -- 等价于 OFFSET 10 取 5

分页公式:第 n 页(从 1 开始)每页 m 条,则 LIMIT (n-1)*m, m。

6.3 聚合函数#

聚合函数对一组值做统计,常用五个:

SELECT COUNT(*) FROM student; -- 记录总数
SELECT COUNT(email) FROM student; -- email 非空的行数
SELECT SUM(age) FROM student; -- 年龄总和
SELECT AVG(age) FROM student; -- 平均年龄
SELECT MAX(age), MIN(age) FROM student; -- 最大、最小年龄

注意 COUNT(*) 统计所有行,COUNT(字段) 会忽略该字段为 NULL 的行。

6.4 分组 GROUP BY#

GROUP BY 按某字段分组,常与聚合函数搭配,用于”按组统计”:

SELECT class_id, COUNT(*) AS 人数 FROM student GROUP BY class_id;

这条语句按班级分组,统计每个班的人数。分组后,SELECT 里通常只能出现分组字段和聚合函数。

6.5 分组后过滤 HAVING#

WHERE 在分组前过滤行,HAVING 在分组后过滤组:

SELECT class_id, COUNT(*) AS 人数
FROM student
GROUP BY class_id
HAVING COUNT(*) > 3;

它筛选出人数超过 3 的班级。执行顺序可概括为:

flowchart LR A[FROM] --> B[WHERE 过滤行] B --> C[GROUP BY 分组] C --> D[HAVING 过滤组] D --> E[SELECT 投影] E --> F[ORDER BY 排序] F --> G[LIMIT 分页]

6.6 常见问题 Q&A#

Q1:WHERE 和 HAVING 的区别? A:WHERE 在分组前过滤行,HAVING 在分组后过滤组;HAVING 常配合聚合函数,WHERE 不能直接用聚合函数。

Q2:COUNT(*) 和 COUNT(字段) 有何不同? A:COUNT(*) 统计所有行,COUNT(字段) 忽略该字段为 NULL 的行。

Q3:GROUP BY 后 SELECT 能写普通字段吗? A:只能写分组字段和聚合函数,写其他普通字段结果无意义,严格模式下会报错。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

MySQL 排序分页与聚合查询
https://mjzy.tech/posts/mysql/06-排序分页与聚合查询/
作者
JIA
发布于
2026-08-21
许可协议
CC BY-NC-SA 4.0

评论区

正在加载 GitHub 评论…

Tips · 随手记
仅自己可见 · 每篇文章单独保存

文章目录