支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本: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

7.5. 排序資料列 (ORDER BY) #

在查詢產生輸出資料表之後(在 select list 處理完畢之後),可以選擇性地進行排序。 如果未選擇排序,則資料列將以未指定的順序傳回。 在這種情況下,實際順序將取決於掃描和聯結計劃類型以及磁碟上的順序,但不應依賴它。 只有在明確選擇排序步驟時,才能保證特定的輸出順序。

ORDER BY 子句指定排序順序

SELECT select_list
    FROM table_expression
    ORDER BY sort_expression1 [ASC | DESC] [NULLS { FIRST | LAST }]
             [, sort_expression2 [ASC | DESC] [NULLS { FIRST | LAST }] ...]

排序表達式可以是查詢的 select list 中有效的任何表達式。 一個例子是

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

指定多個表達式時,後面的值用於對根據前面的值相等的資料列進行排序。 每個表達式後面可以選擇性地跟隨 ASCDESC 關鍵字,以將排序方向設定為遞增或遞減。 ASC 順序是預設值。 遞增順序將較小的值放在前面,其中 較小是根據 < 運算符定義的。 同樣,遞減順序由 > 運算符確定。 [6]

NULLS FIRSTNULLS LAST 選項可用於確定 null 值在排序順序中是否出現在非 null 值之前或之後。 預設情況下,null 值排序時,就像它們大於任何非 null 值一樣;也就是說,NULLS FIRSTDESC 順序的預設值,而 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;          -- wrong

進行此限制是為了減少歧義。 如果 ORDER BY 項目是一個簡單的名稱,可以同時匹配輸出欄位名稱或來自資料表表達式的欄位,則仍然存在歧義。 在這種情況下,使用輸出欄位。 僅當您使用 AS 重新命名輸出欄位以匹配其他資料表欄位的名稱時,這才會造成混淆。

ORDER BY 可以應用於 UNIONINTERSECTEXCEPT 組合的結果,但在這種情況下,僅允許按輸出欄位名稱或編號排序,而不是按表達式排序。



[6] 實際上,PostgreSQL 使用表達式資料類型的預設 B 樹運算符類別來確定 ASCDESC 的排序順序。 按照慣例,將設定資料類型,以便 <> 運算符對應於此排序順序,但使用者定義的資料類型設計者可以選擇執行其他操作。

提交更正

如果您在文件中發現任何不正確、與特定功能不符或需要進一步澄清的地方,請使用此表格回報文件問題。