7.5. 排序行
查询生成输出表后(处理选择列表后),可以选择对其进行排序。如果未选择排序,则行将以未指定的顺序返回。在这种情况下,实际顺序将取决于扫描和加入计划类型以及磁盘上的顺序,但不得依赖它。仅当显式选择了排序步骤时,才能保证特定的输出顺序。
该子句指定排序顺序: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;
如果指定了多个表达式,则后面的值用于根据前面的值对相等的行进行排序。每个表达式后跟一个可选 or 关键字,以将排序方向设置为升序或降序。 顺序是默认值。升序将较小的值放在第一位,其中“较小”是根据运算符定义的。同样,降序由运算符确定。ASC``DESC``ASC``<``>[5]
和 选项可用于确定在排序顺序中,空值是出现在非空值之前还是之后。默认情况下,空值的排序好像大于任何非空值;也就是说,是订单的默认值,否则。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
[5]实际上,PostgreSQL 使用表达式数据类型的默认 B 树运算符类来确定 和 的排序顺序。传统上,将设置数据类型,以便 and 运算符对应于此排序顺序,但用户定义数据类型的设计者可以选择执行不同的操作。ASC``DESC``<``>