在mysql的查询操作中,对结果集进行排序是非常常见的需求,order by子句就是用来完成这个功能的,它可以按照一个或多个字段对查询结果进行升序或者降序排列,满足不同的业务展示要求。

order by基本语法
order by的基本使用格式如下,通常跟在select语句的where条件之后:
-- 基本语法结构 SELECT 字段列表 FROM 表名 [WHERE 条件] ORDER BY 排序字段 [排序规则];
其中排序规则如果不写的话,默认是升序排列,也可以显式指定排序规则。
升序与降序的实现
mysql中通过两个关键字来控制排序方向,分别是ASC和DESC:
- ASC:表示升序排列,从小到大排序,是默认规则,可以不写
- DESC:表示降序排列,从大到小排序,需要显式指定
单字段升序示例
假设我们有一张用户表user,里面有id、name、age三个字段,现在需要按照年龄从小到大展示所有用户信息:
-- 按照age升序排列,ASC可以省略 SELECT id, name, age FROM user ORDER BY age ASC; -- 等价于下面的语句 SELECT id, name, age FROM user ORDER BY age;
单字段降序示例
如果需要按照年龄从大到小展示用户信息,只需要把排序规则改成DESC即可:
-- 按照age降序排列 SELECT id, name, age FROM user ORDER BY age DESC;
多字段排序规则
当需要根据多个字段进行排序时,只需要在order by后面依次列出字段和对应的排序规则,用逗号分隔即可。排序的优先级是按照字段的先后顺序来的,先按照第一个字段排序,第一个字段值相同的时候再按照第二个字段排序,以此类推。
比如我们需要先按照年龄降序排列,年龄相同的用户再按照id升序排列:
-- 多字段排序,先按age降序,再按id升序 SELECT id, name, age FROM user ORDER BY age DESC, id ASC;
排序的注意事项
- order by子句通常放在where条件之后,limit分页之前,如果语句中有group by,order by要放在group by之后
- 排序的字段可以是表中的实际字段,也可以是查询中计算得到的表达式或者别名,比如按照年龄加10之后的结果排序:
SELECT id, name, age, age+10 AS new_age FROM user ORDER BY new_age DESC;
- 如果排序的字段存在NULL值,mysql中NULL会被当作最小值处理,升序的时候NULL会排在最前面,降序的时候NULL会排在最后面
- 对大结果集进行排序的时候,如果排序字段没有索引,可能会导致查询性能下降,建议对经常用于排序的字段建立合适的索引
常见使用场景
order by的使用场景非常广泛,比如电商系统中按照商品价格从低到高展示商品,按照销量从高到低排序商品;博客系统中按照发布时间倒序展示文章;学生管理系统中按照考试成绩从高到低排名等,只要需要对查询结果做顺序调整的需求,都可以用order by来实现。
需要注意的是,如果查询语句中没有order by子句,mysql返回的结果顺序是不确定的,不要依赖默认的返回顺序,需要固定顺序的时候一定要显式加上order by。