受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

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;          -- 错误

该限制是为了减少混淆。如果一个ORDER BY项是一个单一名字并且匹配一个输出列名或者一个表表达式的列,仍然会出现混淆。在这种情况中输出列将被使用。只有在你使用AS来重命名一个输出列来匹配某些其他表列的名字时,这才会导致混淆。

ORDER BY可以被应用于UNIONINTERSECTEXCEPT组合的结果,但是在这种情况中它只被允许根据输出列名或编号排序,而不能根据表达式排序。



[6] 事实上,PostgreSQL会使用该表达式数据类型的默认 B-树操作符类来决定ASCDESC的排序顺序。按惯例,数据类型会被设置成由<>操作符来对应这种排序顺序,不过用户定义数据类型的设计者也可以选择不同的做法。

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。