7.5. 对行进行排序

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

ORDER BY子句指定排序 Sequences:

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关键字,以将排序方向设置为升序或降序。缺省为ASCSequences。升序将较小的值放在首位,其中“较小”是根据<运算符定义的。同样,降序由>运算符确定。 [5]

NULLS FIRSTNULLS LAST选项可用于确定在排序 Sequences 中在非 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组合的结果,但是在这种情况下,仅允许按输出列名或数字而不是表达式进行排序。


[5]实际上,PostgreSQL 使用默认的 B 树操作符类作为表达式的数据类型来确定ASCDESC的排序 Sequences。按照惯例,将设置数据类型,以便<>运算符对应于此排序 Sequences,但是用户定义的数据类型的设计者可以选择执行其他操作。