在SQL查询操作中,对查询结果进行排序是高频需求,ORDER BY子句是实现这一功能的标准语法,它可以根据指定的列对查询结果进行升序或者降序排列,让数据呈现更有条理。

ORDER BY基本语法
ORDER BY子句通常放在SELECT语句的末尾,基本语法结构如下:
-- 基础语法 SELECT 列名1, 列名2, ... FROM 表名 ORDER BY 排序列名 [排序方式];
其中排序方式可选,如果不指定默认是升序排列。如果需要指定多个列排序,可以在ORDER BY后面用逗号分隔多个列名和对应的排序方式。
升序排列用法
升序排列是指按照列值从小到大的顺序排列,SQL中使用ASC关键字表示升序,不过因为升序是默认排序方式,所以通常可以省略ASC关键字。
假设我们有一张学生成绩表student_score,表结构如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | int | 学生ID |
| name | varchar | 学生姓名 |
| score | int | 考试成绩 |
如果要按照成绩从低到高查询所有学生信息,升序排列的SQL语句如下:
-- 省略ASC的写法,默认升序 SELECT id, name, score FROM student_score ORDER BY score; -- 显式指定ASC的写法,效果同上 SELECT id, name, score FROM student_score ORDER BY score ASC;
降序排列用法
降序排列是指按照列值从大到小的顺序排列,SQL中使用DESC关键字表示降序,这个关键字不能省略。
还是以上面的学生成绩表为例,如果要按照成绩从高到低查询所有学生信息,降序排列的SQL语句如下:
SELECT id, name, score FROM student_score ORDER BY score DESC;
多列排序场景
实际查询中经常需要按照多个列排序,比如先按照成绩降序排列,成绩相同的再按照学生ID升序排列,此时可以在ORDER BY后面指定多个排序列和对应的排序方式。
-- 先按成绩降序,成绩相同再按ID升序 SELECT id, name, score FROM student_score ORDER BY score DESC, id ASC;
多列排序的执行逻辑是优先按照第一个列排序,第一个列值相同的记录再按照第二个列的规则排序,以此类推。
排序的注意事项
- ORDER BY子句只能对SELECT语句返回的结果进行排序,不能直接对原表数据排序。
- 排序列可以是SELECT中指定的列,也可以是表中存在但没有出现在SELECT列表中的列,不过不同数据库对此有细微差异,建议优先使用SELECT中出现的列。
- 如果排序列包含NULL值,不同数据库对NULL的排序位置不同,大部分数据库默认将NULL放在升序排列的最后,降序排列的最前。
需要注意的是,ORDER BY子句的执行顺序在WHERE、GROUP BY、HAVING等子句之后,所以排序是对过滤、分组后的最终结果进行的。