在查詢生成輸出表之后,也就是在處理完選擇列表之后,你還可以對輸出表進行排序。
如果沒有排序,那么行將以不可預測的順序返回(實際順序將取決於掃描和連接規划類型和在磁盤上的順序,
但是肯定不能依賴這些東西)。確定的順序只能在明確地使用了排序步驟之后才能保證。
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
排序順序。
一般來說,數據類型將被轉換為適合於 <
和 >
操作符進行排序。但是對於用戶自定義的數據類型可以不必如此。