Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

7.5. 对行进行排序 (ORDER BY) #

在查询生成一张输出表(处理 select 列表之后)后,可以选择对其进行排序。如果未选择排序,则行将以未指定顺序返回。在这种情况下,实际顺序将取决于扫描和联接计划类型以及磁盘上顺序,但不能依赖它。只有在明确选择排序步时,才能保证特定输出顺序。

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;

当指定多个表达式时,将使用后面的值对根据前面的值相等的列进行排序。每个表达式后面都可以跟可选的 ASCDESC 关键字,以将排序方向设置为升序或降序。ASC 顺序是默认设置。升序将较小的值排在前面,其中 较小 是用 < 运算符定义的。类似地,降序由 > 运算符确定。 [6]

NULLS FIRSTNULLS LAST 选项可以用于确定 null 值在排序顺序中是出现在非 null 值之前还是之后。默认情况下,null 值的排序方式就像大于任何非 null 值一样;也就是说,NULLS FIRSTDESC 顺序的默认设置,否则为 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 可以应用于 UNIONINTERSECTEXCEPT 组合的结果,但在这种情况下仅允许按输出列名称或编号进行排序,不允许按表达式进行排序。



[6] 实际上,PostgreSQL 使用表达式的 默认 B-tree 运算符类 来确定 ASCDESC 的排序顺序。惯例是,数据类型将被设置,以便 <> 运算符对应于此排序顺序,但用户定义的数据类型的设计者可以选择采取其他操作。