本文介绍ORDER BY子句以及使用方式。

可选的ORDERBY子句具有以下形式:

ORDER BY expression [ ASC | DESC ] [, ...]

expression 可以是输出列的名称或序号(SELECT 列表项),也可以是由输入列值组成的任意表达式。

ORDER BY 子句使结果行根据指定的表达式进行排序。根据最左边的表达式,如果两行相等,则根据下一个表达式对它们进行比较,以此类推。如果根据所有指定的表达式,它们是相等的,则它们将以依赖于实现的顺序返回。

序号指的是结果列的序号(从左到右)位置。该特性使得能够基于没有唯一名称的列定义排序。这不是必要的,因为始终可以使用 AS 子句向结果列分配名称。

也可以在 ORDERBY 子句中使用任意表达式,包括未出现在 SELECT 结果列表中的列。因此,以下语句是有效的:

SELECT ename FROM emp ORDER BY empno;

此特性的限制是,应用于 UNIONINTERSECTMINUS 子句结果的 ORDER BY 子句只能指定输出列名称或列号,而不能指定表达式。

如果 ORDER BY 表达式是与结果列名称和输入列名称都匹配的简单名称,则 ORDER BY 会将其解释为结果列名称。这与 GROUP BY 在相同情况下的选择相反。这种不一致旨在符合 SQL 标准。

用户可以选择在 ORDER BY 子句中的任何表达式之后添加关键字 ASC(升序)或 DESC(降序)。如果未指定,则默认使用 ASC。

Null 值的排序高于任何其他值。换句话说,对于升序排序顺序,null 值排在末尾,而对于降序排序顺序,null 值排在开头。

字符串数据根据初始化数据库集群时建立的特定于区域设置的排序规则顺序进行排序。

示例

以下两个示例是根据第二列 (dname) 的内容对各个结果进行排序的相同方法:

SELECT * FROM dept ORDER BY dname;

 deptno |   dname    |   loc
--------+------------+----------
     10 | ACCOUNTING | NEW YORK
     40 | OPERATIONS | BOSTON
     20 | RESEARCH   | DALLAS
     30 | SALES      | CHICAGO
(4 rows)

SELECT * FROM dept ORDER BY 2;

 deptno |   dname    |   loc
--------+------------+----------
     10 | ACCOUNTING | NEW YORK
     40 | OPERATIONS | BOSTON
     20 | RESEARCH   | DALLAS
     30 | SALES      | CHICAGO
(4 rows)