?
Dieses Dokument verwendet PHP-Handbuch für chinesische Websites Freigeben
在查詢生成輸出表之后,也就是在處理完選擇列表之后,你還可以對輸出表進(jìn)行排序。 如果沒有排序,那么行將以不可預(yù)測的順序返回(實際順序?qū)⑷Q于掃描和連接規(guī)劃類型和在 磁盤上的順序,但是肯定不能依賴這些東西)。 確定的順序只能在明確地使用了排序步驟之后才能保證。
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(s)是任何可用于選擇列表的表達(dá)式,例如:
SELECT a, b FROM table1 ORDER BY a + b, c;
如果指定了多個排序表達(dá)式,那么僅在前面的表達(dá)式排序相等的情況下才使用后面的表 達(dá)式做進(jìn)一步排序。每個表達(dá)式都可以跟一個可選的ASC(升序,默認(rèn))或 DESC(降序) 以設(shè)置排序方向。升序先輸出小的數(shù)值,這里的"小"是以<操作符的角度定義的。 類似的是,降序是以>操作符來判斷的。 [1]
NULLS FIRST和NULLS LAST選項可以決定在排序操作中在non-null值之前還是之后。默認(rèn)情況下,空值大于任何非空值;也就是說,DESC排序 默認(rèn)是NULLS FIRST,否則為NULLS LAST。
注意,排序選項對于每個排序列是相對獨立的。例如ORDER BY x, y DESC意思是說ORDER BY x ASC, y DESC, 不同于ORDER BY x DESC, y DESC.
一個sort_expression也可以是列標(biāo)簽或數(shù) 輸出列,如:
SELECT a + b AS sum, c FROM table1 ORDER BY sum; SELECT a, max(b) FROM table1 GROUP BY a ORDER BY 1;
都按照第一個字段進(jìn)行排序。需要注意的是,輸出字段名必須是獨立的 (不允許作為排序表達(dá)式的一部分)。比如,下面的語句是not正確的。
SELECT a + b AS sum, c FROM table1 ORDER BY sum + c; -- wrong
這樣的限制主要是為了減少歧義。另外,如果某個ORDER BY排序表達(dá)式能夠同時匹配輸 出字段名和表表達(dá)式中的字段名,也會導(dǎo)致歧義(此時使用輸出字段名)。當(dāng) 然,這種情況僅在你使用了AS重命名輸出字段并且恰好與其它 表的字段同名的時候才會發(fā)生。
ORDER BY可以應(yīng)用于UNION, INTERSECT或者EXCEPT的計算結(jié)果,不過在這種情況下,只允許按照字段名或編號進(jìn)行排序,而不允許按照表達(dá)式進(jìn)行排序。
[1] | 事實上,PostgreSQL使用默認(rèn)的B-tree操作符類為表達(dá)式的數(shù)據(jù)類型確定ASC和DESC排序順序。一般來說, 數(shù)據(jù)類型將被轉(zhuǎn)換為適合于<和>操作符進(jìn)行排序。但是對于用戶自定義的數(shù)據(jù)類型可以不必如此。 |