7.5. 行排序

在一个查询生成一个输出表之后(在处理完选择列表之后), 你还可以对它进行排序。如果没有选择排序,那么行将以未声明的顺序返回。 这时候的实际顺序将取决于扫描和连接规划类型和在磁盘上的顺序,但是肯定不能依赖这些东西。 一定的顺序只能在明确地使用了排序步骤之后才能保证。

ORDER BY子句声明了排序顺序

SELECT select_list
	FROM table_expression
	ORDER BY column1 [ASC | DESC] [, column2 [ASC | DESC] ...]

column1,等指向选择列表: 它可以是一个列的名字(可以是明确的列标签也可以是缺省名字,象 Section 7.3.2 里解释的那样) 或者是一个列的编号。一些例子:

SELECT a, b FROM table1 ORDER BY a;
SELECT a + b AS sum, c FROM table1 ORDER BY sum;
SELECT a, sum(b) FROM table1 GROUP BY a ORDER BY 1;

作为对标准 SQL 的扩展,PostgreSQL 还允许对任意表达式进行排序:

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

还允许引用 FROM 子句中的字段名,但是没有出现在选择列表中的字段名字:

SELECT a FROM table1 ORDER BY b;

但是这个特性在涉及UNIONINTERSECT,或 EXCEPT的查询中是不能用的,而且也不可移植到其它 DBMS

声明的每个字段都可以跟着一个可选的ASCDESC 以设置排序方向。 缺省是ASC。升序先输出小的数值,这里的"小"是以 < 操作符的角度定义的。类似的是, 降序是以 > 操作符来判断的。

如果声明了多于一个排序列,那么在前面的排序字段排序相等的情况下使用后面的排序项做进一步排序。