4.5. 行排序

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

ORDER BY子句声明了排序顺序

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

column1,等指向选择列表: 它可以是一个列的名字(可以是明确的列标签也可以是缺省名字, 象 Section 4.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 AS b FROM table1 ORDER BY a;

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

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

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