ORDER BY
) #在查询生成输出表(在处理 select 列表后)之后,可以选择对其进行排序。如果未选择排序,则行将以未指定的顺序返回。在这种情况下,实际顺序将取决于扫描和连接计划类型以及磁盘上的顺序,但不能依赖它。只有在显式选择排序步骤时才能保证特定的输出排序。
ORDER BY
子句指定排序顺序
SELECTselect_list
FROMtable_expression
ORDER BYsort_expression1
[ASC | DESC] [NULLS { FIRST | LAST }] [,sort_expression2
[ASC | DESC] [NULLS { FIRST | LAST }] ...]
排序表达式可以是查询 select 列表中任何有效的表达式。例如:
SELECT a, b FROM table1 ORDER BY a + b, c;
当指定多个表达式时,后面的值用于对根据前面值相等的行进行排序。每个表达式后面可以跟一个可选的 ASC
或 DESC
关键字,以将排序方向设置为升序或降序。 ASC
顺序是默认顺序。升序将较小的值放在前面,其中“较小”根据 <
运算符定义。类似地,降序由 >
运算符确定。[6]
NULLS FIRST
和 NULLS LAST
选项可用于确定空值在排序顺序中是出现在非空值之前还是之后。默认情况下,空值排序方式如同大于任何非空值;也就是说,对于 DESC
顺序,NULLS FIRST
是默认值,否则为 NULLS LAST
。
请注意,排序选项对于每个排序列都是独立考虑的。例如 ORDER BY x, y DESC
表示 ORDER BY x ASC, y DESC
,这与 ORDER BY x DESC, y DESC
不同。
一个 sort_expression
也可以是输出列的列标签或编号,例如:
SELECT a + b AS sum, c FROM table1 ORDER BY sum; SELECT a, max(b) FROM table1 GROUP BY a ORDER BY 1;
这两者都按第一个输出列排序。请注意,输出列名称必须独立存在,即不能在表达式中使用——例如,以下是不正确的
SELECT a + b AS sum, c FROM table1 ORDER BY sum + c; -- wrong
此限制是为了减少歧义。如果 ORDER BY
项是一个简单的名称,可以匹配输出列名称或表表达式中的列,则仍然存在歧义。在这种情况下,使用输出列。只有在使用 AS
将输出列重命名为与其他表列的名称匹配时,才会导致混淆。
ORDER BY
可以应用于 UNION
、INTERSECT
或 EXCEPT
组合的结果,但在这种情况下,仅允许按输出列名称或编号排序,而不允许按表达式排序。
[6] 实际上,PostgreSQL 使用表达式的 数据类型的 默认 B 树操作符类 来确定 ASC
和 DESC
的排序顺序。按照惯例,数据类型将被设置为使 <
和 >
运算符对应于此排序顺序,但用户定义的数据类型的设计者可以选择执行其他操作。
如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符,或者需要进一步澄清,请使用此表单 报告文档问题。