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 AS b FROM table1 ORDER BY a;

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

聲明的每個字段都可以跟著一個可選的ASCDESC 以設置排序方向。 缺省是ASC。升序先輸出小的數值,這裡的"小"是以 < 操作符的角度定義的。類似的是, 降序是以 > 操作符來判斷的。

如果聲明了多于一個排序列,那麼在前面的排序字段排序相等的情況下使用後面的記錄的進一步排序。