ORDER BY
) #在查詢產生輸出資料表之後(在 select list 處理完畢之後),可以選擇性地進行排序。 如果未選擇排序,則資料列將以未指定的順序傳回。 在這種情況下,實際順序將取決於掃描和聯結計劃類型以及磁碟上的順序,但不應依賴它。 只有在明確選擇排序步驟時,才能保證特定的輸出順序。
ORDER BY
子句指定排序順序
SELECTselect_list
FROMtable_expression
ORDER BYsort_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;
指定多個表達式時,後面的值用於對根據前面的值相等的資料列進行排序。 每個表達式後面可以選擇性地跟隨 ASC
或 DESC
關鍵字,以將排序方向設定為遞增或遞減。 ASC
順序是預設值。 遞增順序將較小的值放在前面,其中 「較小」是根據 <
運算符定義的。 同樣,遞減順序由 >
運算符確定。 [6]
NULLS FIRST
和 NULLS LAST
選項可用於確定 null 值在排序順序中是否出現在非 null 值之前或之後。 預設情況下,null 值排序時,就像它們大於任何非 null 值一樣;也就是說,NULLS FIRST
是 DESC
順序的預設值,而 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
可以應用於 UNION
、INTERSECT
或 EXCEPT
組合的結果,但在這種情況下,僅允許按輸出欄位名稱或編號排序,而不是按表達式排序。
[6] 實際上,PostgreSQL 使用表達式資料類型的預設 B 樹運算符類別來確定 ASC
和 DESC
的排序順序。 按照慣例,將設定資料類型,以便 <
和 >
運算符對應於此排序順序,但使用者定義的資料類型設計者可以選擇執行其他操作。
如果您在文件中發現任何不正確、與特定功能不符或需要進一步澄清的地方,請使用此表格回報文件問題。