在MySQL中,ORDER BY是用来对SELECT查询返回的行进行排序的子句。它可以按照一个或多个列进行排序,并且允许指定升序(ASC)或降序(DESC)。掌握它的用法,是写准确定制化数据列表的基础。

一、ORDER BY基本语法
最简单的排序写法是在查询语句末尾加上ORDER BY和列名:
-- 按年龄升序排列用户 SELECT id, name, age FROM user ORDER BY age;
上面语句中省略了排序方向,MySQL默认使用ASC,也就是从小到大。如果要明确地降序排列,需要写上DESC:
-- 按年龄从大到小排列 SELECT id, name, age FROM user ORDER BY age DESC;
二、多字段排序
当第一列有相同值时,可以用多个字段来确定先后顺序。字段之间用逗号隔开,每个字段都能单独指定方向:
-- 先按部门升序,再按工资降序 SELECT dept, name, salary FROM employee ORDER BY dept ASC, salary DESC;
三、按表达式或函数结果排序
ORDER BY后面不一定是原表字段,也可以是计算表达式或者使用函数后的结果。比如按名字长度排序:
-- 按姓名字符长度从短到长 SELECT name FROM user ORDER BY CHAR_LENGTH(name);
四、和WHERE、LIMIT配合使用
ORDER BY通常放在WHERE条件之后,如果还需要取前几条,再写LIMIT:
-- 找出工资最高的前5名员工 SELECT name, salary FROM employee WHERE status = 1 ORDER BY salary DESC LIMIT 5;
五、中文排序与字符集
中文排序依赖于列的字符集和排序规则。如果使用utf8mb4_general_ci,中文通常按编码排,不够符合拼音习惯。可改用utf8mb4_unicode_ci,或在查询时指定:
-- 按拼音排序中文姓名 SELECT name FROM user ORDER BY CONVERT(name USING gbk);
六、性能与使用注意点
下面列出写ORDER BY时常见的几个注意点:
- 排序字段有索引时,MySQL可能避免额外排序操作。
- SELECT后面只查需要的列,减少临时表体积。
- 排序加LIMIT能显著降低排序成本。
- 对NULL值的处理:ASC时NULL排在最前,DESC时NULL排在最后。
| 写法 | 含义 |
|---|---|
| ORDER BY col | 按col升序,NULL在最前 |
| ORDER BY col DESC | 按col降序,NULL在最后 |
| ORDER BY col1, col2 DESC | col1升序,col1相同时col2降序 |
小结
ORDER BY是MySQL里控制结果顺序最直接的方式。理清字段方向、多列顺序和索引情况,就能写出既正确又高效的查询语句。