2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 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) #

在查詢生成輸出表之後(在選擇列表處理完畢之後),可以選擇對其進行排序。如果不選擇排序,行將以未指定順序返回。在這種情況下,實際順序將取決於掃描和連線計劃的型別以及磁碟上的順序,但不得依賴。只有顯式選擇排序步驟才能保證特定的輸出順序。

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 a, b FROM table1 ORDER BY a + b, c;

當指定多個表示式時,對於根據早期值相等的行,將使用後續值進行排序。每個表示式後面都可以跟一個可選的 ASCDESC 關鍵字,以設定升序或降序排序。 ASC 順序是預設值。升序將較小值放在前面,其中“較小”由 < 運算子定義。類似地,降序由 > 運算子確定。[6]

NULLS FIRSTNULLS LAST 選項可用於確定空值在排序順序中出現在非空值之前還是之後。預設情況下,空值排序為大於任何非空值;即,對於 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;          -- wrong

此限制是為了減少歧義。如果 ORDER BY 項是一個簡單的名稱,該名稱可能與輸出列名或表表達式的列匹配,則仍然存在歧義。在這種情況下,將使用輸出列。只有當您使用 AS 將輸出列重新命名為匹配某個其他表列的名稱時,這才會引起混淆。

ORDER BY 可應用於 UNIONINTERSECTEXCEPT 組合的結果,但在這種情況下,只允許按輸出列名或編號排序,不允許按表示式排序。



[6] 實際上,PostgreSQL 使用表示式資料型別的 預設 B-tree 運算子類 來確定 ASCDESC 的排序順序。通常,資料型別將設定成 <> 運算子與此排序順序相對應,但使用者定義資料型別的設計者可以選擇做不同的事情。

提交更正

如果您在文件中發現任何不正確、與您的實際使用經驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。