2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

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;

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

NULLS FIRSTNULLS 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 可应用于 UNIONINTERSECTEXCEPT 组合的结果,但在这种情况下,只允许按输出列名或编号排序,不允许按表达式排序。



[6] 实际上,PostgreSQL 使用表达式数据类型的 默认 B-tree 操作符类 来确定 ASCDESC 的排序顺序。通常,数据类型将设置成 <> 操作符与此排序顺序相对应,但用户定义数据类型的设计者可以选择做不同的事情。

提交更正

如果您在文档中发现任何不正确、与您的实际使用经验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。