↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 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
历史版本。 PostgreSQL 8.2 已结束支持。 请参阅 当前版本手册.

7.5. 行排序 #

当一个查询生成输出表之后(也就是处理完选择列表之后),还可以选择对其排序。如果没有选择排序,行将按未指定的顺序返回。这时的实际顺序取决于扫描和连接计划类型以及磁盘上的物理顺序,但绝不能依赖这些因素。只有显式选择排序步骤,才能保证特定的输出顺序。

ORDER BY子句指定了排序顺序:

SELECT select_list
    FROM table_expression
    ORDER BY sort_expression1 [ASC | DESC] [, sort_expression2 [ASC | DESC] ...]

排序表达式可以是任何在查询选择列表中合法的表达式。例如:

SELECT a, b FROM table1 ORDER BY a + b, c;

当指定了多个表达式时,后面的值将用于对那些在前面值上相等的行继续排序。每个表达式后面都可以选择性地写上ASC或DESC关键字,以指定升序或降序排序方向。ASC是默认值。升序会把较小的值排在前面,而“较小”是由<操作符定义的。类似地,降序则由>操作符定义。 [4]

一个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组合的结果,但是在这种情况中它只被允许根据输出列名或编号排序,而不能根据表达式排序。



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

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.