SQL ORDER BY语句用于对查询结果集按照指定的字段进行排序,是数据库查询操作中非常基础且常用的功能,能够帮助用户按照特定规则整理返回的数据。
ORDER BY基本语法
ORDER BY语句通常跟在SELECT语句的WHERE条件之后,基本语法格式如下:
-- 基本语法 SELECT 字段1, 字段2, ... FROM 表名 [WHERE 条件] ORDER BY 排序字段 [ASC|DESC];
其中ASC表示升序排序,是默认排序方式,不写时默认按照升序排列;DESC表示降序排序,需要显式指定。
单字段排序
单字段排序是最简单的使用场景,只需要指定一个排序字段即可。假设我们有一张用户表user,结构如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | int | 用户ID |
| username | varchar | 用户名 |
| age | int | 年龄 |
| score | int | 分数 |
如果要按照年龄升序查询所有用户信息,语句如下:
-- 按照年龄升序排序,ASC可省略 SELECT id, username, age, score FROM user ORDER BY age ASC;
如果要按照分数降序查询所有用户信息,语句如下:
-- 按照分数降序排序 SELECT id, username, age, score FROM user ORDER BY score DESC;
多字段排序
当单字段排序后仍有相同值时,可以使用多字段排序,优先按照第一个字段排序,第一个字段值相同时再按照第二个字段排序,以此类推。语法是在ORDER BY后指定多个字段,用逗号分隔。
比如先按照分数降序排序,分数相同的再按照年龄升序排序:
-- 多字段排序,先按分数降序,分数相同按年龄升序 SELECT id, username, age, score FROM user ORDER BY score DESC, age ASC;
结合WHERE条件使用
ORDER BY可以和WHERE条件结合使用,先筛选符合条件的数据,再对筛选后的结果进行排序。
比如查询年龄大于18岁的用户,按照分数降序排列:
-- 结合WHERE条件使用 SELECT id, username, age, score FROM user WHERE age > 18 ORDER BY score DESC;
排序时处理NULL值
如果排序的字段存在NULL值,不同数据库的默认处理方式不同,比如MySQL中NULL值会被视为最小值,升序时排在最前,降序时排在最后。如果需要自定义NULL值的排序位置,可以使用条件判断。
比如将NULL值排在所有非NULL值之后,升序排序:
-- 自定义NULL值排序位置,NULL值排最后 SELECT id, username, age, score FROM user ORDER BY CASE WHEN score IS NULL THEN 1 ELSE 0 END, score ASC;
注意事项
- ORDER BY语句必须放在SELECT语句中所有子句的最后,除了LIMIT等少数子句。
- 排序的字段可以是SELECT中查询的字段,也可以是表中存在但没有查询的字段。
- 对字符串类型字段排序时,会按照字符集的排序规则进行,比如中文通常按照拼音或者笔画排序,取决于数据库的字符集设置。
- 如果查询使用了DISTINCT关键字,ORDER BY的字段必须是SELECT中查询的字段,否则会报错。