PostgreSQL 行排序詳解
在查詢生成輸出表之後,也就是在處理完選擇列表之後,你還可以對輸出表進行排序。
如果沒有排序,那麼行將以不可預測的順序返回(實際順序將取決於掃描和連線規劃型別和在磁碟上的順序,
但是肯定不能依賴這些東西)。確定的順序只能在明確地使用了排序步驟之後才能保證。
ORDER BY
子句用於宣告排序順序:
SELECT _select_list_
FROM _table_expression_
ORDER BY _sort_expression1_ [ASC | DESC] [NULLS { FIRST | LAST }]
[, `_sort_expression2_` [ASC | DESC] [NULLS { FIRST | LAST }] ...]
sort_expression 是任何可用於選擇列表的表示式,可以將不同列相加減乘除後排序,例如:
SELECT a, b FROM table1 ORDER BY a + b, c;
如果指定了多個排序表示式,那麼僅在前面的表示式排序相等的情況下才使用後面的表示式做進一步排序。
每個表示式都可以跟一個可選的ASC
(升序,預設) 或DESC
(降序)以設定排序方向。 升序先輸出小的數值,這裡的"小"是以<
操作符的角度定義的。
類似的是,降序是以>
NULLS FIRST
和NULLS LAST
選項可以決定在排序操作中在 non-null 值之前還是之後。
預設情況下,空值大於任何非空值;也就是說,DESC
排序預設是NULLS FIRST
,否則為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; -- 錯誤的
這樣的限制主要是為了避免歧義。另外,如果某個排序表示式能夠同時匹配輸出欄位名和表表達式中的欄位名, 也會導致歧義(此時使用輸出欄位名)。
當然,這種情況僅在你使用了AS
重新命名輸出欄位並且恰好與其它表的欄位同名的時候才會發生。
ORDER BY
可以應用於UNION
, INTERSECT
,EXCEPT
組合的計算結果,
不過在這種情況下,只允許按照欄位的名字或編號進行排序,而不允許按照表達式進行排序。
Notes
[1] 事實上,PostgreSQL使用預設的B-tree操作符類 為表示式的資料型別確定ASC
和DESC
排序順序。
一般來說,資料型別將被轉換為適合於 <
和 >
操作符進行排序。但是對於使用者自定義的資料型別可以不必如此。