7.5. 对行排序 (ORDER BY
)#
查询生成输出表(处理完选择列表后)后,可以对其进行排序(可选)。如果不选择排序,则将按未指定顺序返回行。在这种情况下,实际顺序将取决于扫描和连接计划类型以及磁盘上的顺序,但不能依赖它。只有在明确选择排序步骤时,才能保证特定的输出顺序。
ORDER BY
子句指定排序顺序
SELECT select_list
FROM table_expression
ORDER BY sort_expression1 [ASC | DESC] [NULLS { FIRST | LAST }]
[, sort_expression2 [ASC | DESC] [NULLS { FIRST | LAST }] ...]
排序表达式可以是查询选择列表中有效的任何表达式。一个示例是
SELECT a, b FROM table1 ORDER BY a + b, c;
当指定多个表达式时,将使用后面的值对根据前面的值相等的行进行排序。每个表达式后面都可以跟一个可选的ASC
或DESC
关键字,以将排序方向设置为升序或降序。ASC
顺序是默认顺序。升序顺序会将较小的值放在前面,其中“较小”是根据<
运算符定义的。同样,降序顺序由>
运算符确定。[6]
可以使用NULLS FIRST
和NULLS LAST
选项来确定在排序顺序中空值出现在非空值之前还是之后。默认情况下,空值排序就像大于任何非空值一样;也就是说,NULLS FIRST
是DESC
顺序的默认值,否则为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
的排序顺序。按照惯例,数据类型将被设置,以便<
和>
运算符对应于此排序顺序,但用户定义的数据类型的设计者可以选择执行不同的操作。