MySQL 中 ORDER BY 用于排序,默认升序(ASC),降序用 DESC;须位于 WHERE 后、LIMIT 前;支持多字段、表达式、别名排序;NULL 默认最小;注意索引优化避免 filesort。

MySQL 中用 ORDER BY 子句对查询结果进行排序,是最常用也最基础的排序方式。默认升序(ASC),可显式指定;降序需用 DESC 关键字。
基本语法与方向控制
ORDER BY 必须写在 WHERE(如果有)之后、LIMIT(如果有)之前。支持按一个或多个字段排序,字段间用逗号分隔。
- SELECT name, age FROM users ORDER BY age; —— 按 age 升序(ASC 可省略)
- SELECT name, age FROM users ORDER BY age DESC; —— 按 age 降序
- SELECT name, age, score FROM users ORDER BY age ASC, score DESC; —— 先按 age 升序,age 相同时再按 score 降序
支持表达式和别名排序
ORDER BY 可以引用 SELECT 中的列名、列位置编号(不推荐)、计算表达式,或使用列别名(前提是该别名已在 SELECT 中定义)。
- SELECT name, salary*12 AS annual FROM employees ORDER BY annual;
- SELECT name, salary FROM employees ORDER BY salary * 1.1; —— 按加薪 10% 后的值排序
- SELECT name, LENGTH(name) len FROM users ORDER BY len; —— 按姓名长度排序
NULL 值的排序行为
MySQL 默认把 NULL 视为最小值:升序时排最前,降序时排最后。若需调整,可用 IS NULL 或 COALESCE 控制逻辑。
- SELECT * FROM products ORDER BY price DESC; —— price 为 NULL 的记录排在最后
- SELECT * FROM products ORDER BY price IS NULL, price DESC; —— 把 NULL 排最后(先按是否为 NULL 升序:false=0 在前,true=1 在后)
- SELECT * FROM products ORDER BY COALESCE(price, 0) DESC; —— 把 NULL 当作 0 参与排序
性能注意点
ORDER BY 若无法利用索引,MySQL 会触发 filesort(磁盘 / 内存排序),影响查询效率。常见优化方式:
- 确保 ORDER BY 字段上有合适索引,尤其是组合查询中,索引顺序应匹配 ORDER BY 顺序
- 避免在 ORDER BY 中使用函数或表达式(如 UPPER(name)),否则索引失效
- 尽量减少 SELECT *,只查必要字段,降低排序开销
- 配合 LIMIT 使用时,MySQL 可能提前终止排序,但前提仍是能走索引