PostgreSQL 行排序

2021-08-26 11:48 更新

在一個查詢生成一個輸出表之后(在處理完選擇列表之后),還可以選擇性地對它進行排序。如果沒有選擇排序,那么行將以未指定的順序返回。 這時候的實際順序?qū)⑷Q于掃描和連接計劃類型以及行在磁盤上的順序,但是肯定不能依賴這些東西。一種特定的順序只能在顯式地選擇了排序步驟之后才能被保證。

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順序是默認值。升序會把較小的值放在前面,而較小則由<操作符定義。相似地,降序則由>操作符定義。 

NULLS FIRSTNULLS LAST選項將可以被用來決定在排序順序中,空值是出現(xiàn)在非空值之前或者出現(xiàn)在非空值之后。默認情況下,排序時空值被認為比任何非空值都要大,即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;

兩者都根據(jù)第一個輸出列排序。注意一個輸出列的名字必須孤立,即它不能被用在一個表達式中 — 例如,這是正確的:

SELECT a + b AS sum, c FROM table1 ORDER BY sum + c;          -- 錯誤

該限制是為了減少混淆。如果一個ORDER BY項是一個單一名字并且匹配一個輸出列名或者一個表表達式的列,仍然會出現(xiàn)混淆。在這種情況中輸出列將被使用。只有在你使用AS來重命名一個輸出列來匹配某些其他表列的名字時,這才會導致混淆。

ORDER BY可以被應用于UNION、INTERSECTEXCEPT組合的結(jié)果,但是在這種情況中它只被允許根據(jù)輸出列名或編號排序,而不能根據(jù)表達式排序。



事實上,PostgreSQL為表達式的數(shù)據(jù)類型使用默認B-tree操作符類來決定ASCDESC的排序順序。照慣例,數(shù)據(jù)類型將被建立,這樣<>操作符負責這個排序順序,但是一個用戶定義的數(shù)據(jù)類型的設計者可以選擇做些不同的設置。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號