ORDER BY 是 MySQL 中用于结果集排序的核心子句,位于 SELECT 末尾(WHERE、GROUP BY、HAVING 之后,LIMIT 之前),支持单/多字段、ASC/DESC 方向、表达式及别名排序,并依赖索引优化性能。

在 MySQL 中,ORDER BY 是实现结果集排序的核心子句,它必须出现在 SELECT 语句的末尾(在 WHERE、GROUP BY、HAVING 之后,LIMIT 之前),用于按一个或多个字段对查询结果进行升序或降序排列。
基本语法与默认排序方向
ORDER BY 后跟字段名,默认按升序(ASC)排列;显式写 ASC 或 DESC 可控制方向:
-
SELECT * FROM users ORDER BY age;→ 按 age 升序(等价于ORDER BY age ASC) -
SELECT * FROM users ORDER BY age DESC;→ 按 age 降序 - NULL 值在升序中排最前,降序中排最后(MySQL 默认行为,可被
ORDER BY ... IS NULL调整)
多字段排序:优先级从左到右
当指定多个排序字段时,MySQL 先按第一个字段排序;第一个字段值相同时,再按第二个字段排序,依此类推:
-
SELECT * FROM orders ORDER BY status ASC, created_at DESC;→ 先按状态升序(如 pending、shipped、done),同状态内按创建时间降序(最新在前) - 字段类型需支持比较操作;对字符串排序区分大小写与否,取决于字段的校对规则(collation)
按表达式或别名排序
ORDER BY 支持使用计算字段、函数或 SELECT 中定义的列别名(注意:不能使用列位置编号如 ORDER BY 2,除非 SQL_MODE 包含 ONLY_FULL_GROUP_BY 关闭时才允许,但不推荐):
-
SELECT name, salary/12 AS monthly FROM employees ORDER BY monthly DESC;→ 按月均工资降序 SELECT CONCAT(last_name, ', ', first_name) AS full_name FROM staff ORDER BY full_name;- 避免在 ORDER BY 中重复复杂表达式,建议用别名提升可读性与执行效率
性能提示:排序与索引的关系
ORDER BY 能否走索引直接影响查询速度。当排序字段有合适索引时,MySQL 可能避免额外的文件排序(Using filesort):
- 单字段排序:为
ORDER BY col建立INDEX(col) - 多字段排序:索引顺序需匹配 ORDER BY 字段顺序和方向(如
ORDER BY a ASC, b DESC,MySQL 8.0+ 支持混合方向索引;旧版本建议统一方向) - WHERE + ORDER BY 组合常见,联合索引设计应兼顾过滤条件和排序需求(例如
WHERE dept = ? ORDER BY hire_date→ 建议索引(dept, hire_date))










