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