| PostgreSQL 7.4 文檔 | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 7. 查詢 | Fast Forward | Next |
如前面的小節說明的那樣, 在 SELECT 命令裡的表表達式構造了一個中介性的虛擬表, 方法可能有組合表,視圖,刪除行,分組等等。 這個表最後傳遞給選擇列表處理。 選擇列表判斷中間表的那個字段最終實際輸出。
最簡單的選擇列表類型是 *,它發出表表達式生成的所有字段。 否則,一個選擇列表是一個逗號分隔的值表達式的列表, (和在Section 4.2 裡定義的一樣)。 比如,它可能是一個字段名字的列表:
SELECT a, b, c FROM ...
字段名字a,b,和c要麼是在 FROM子句裡引用的表中字段的實際名字, 要麼是象 Section 7.2.1.2 裡解釋的那樣的別名。 在選擇列表裡的名字空間和在 WHERE 子句裡的名字空間是一樣的, 除非你使用了分組,這時候它和HAVING子句一樣。
如果超過一個表有同樣的字段名字,那麼你還必須給出表名字,象
SELECT tbl1.a, tbl2.a, tbl1.b FROM ...
(又見 Section 7.2.2)。
如果將任意值表達式用于選擇列表,那麼它在概念上向返回的表中增加了一個新的虛擬字段。 值表達式為結果的每一行進行一次計算,計算之前用該行的數值代換任何表達式裡引用的字段。 不過選擇列表中的這個表達式並非一定來自FROM子句中表表達式裡面的字段引用, 比如,它也可以是任意常量算術表達式。
選擇列表中的記錄可以賦予名字用于進一步的處理。 這裡的"進一步處理"是一個可選的排序聲明和客戶端應用(比如,用于顯示的字段頭)。比如:
SELECT a AS value, b + c AS sum FROM ...
如果沒有使用AS聲明字段名字,那麼系統賦予一個缺省值。對于簡單的字段引用, 它是該字段的名字。對于函數調用,它是函數的名字。對于復雜表達式,系統會生成一個通用的名字。
注意: 輸出字段的命名和在FROM子句裡的命名是不一樣的 (參閱 Section 7.2.1.2)。 這個管道實際上允許你對同一個列命名兩次,但是在選擇列表中選擇的名字是要傳遞的名字。
在處理完選擇列表之後,生成的表可以刪除重復行。 我們可以直接在 SELECT 後面寫上 DISTINCT 關鍵字來實現這個目的:
SELECT DISTINCT select_list ...
(如果不用 DISTINCT 你可以用 ALL 選擇保留所有行的缺省行為。)
顯然,如果兩行裡至少有一個列有不同的值,那麼我們認為它是獨立的。空值在這種考慮中認為是相同的。
另外,我們還可以用任意表達式來判斷什麼行可以認為是獨立的:
SELECT DISTINCT ON (expression [, expression ...]) select_list ...這裡 expression 是任意值表達式, 它為所有行計算。如果一個行集合裡所有行計算出的該表達式的值是一樣的, 那麼我們認為它們是重復的並且因此只有第一行保留在輸出中。 請注意這裡的一個集合的"第一行"是不可預料的, 除非你在足夠多的字段上對該查詢排了序,保證到達DISTINCT過濾器的行的順序是唯一的。 (DISTINCT ON處理是發生在ORDER BY排序後面的。)
DISTINCT ON子句不是 SQL 標準的一部分, 有時候有人認為它是一個糟糕的風格,因為它的結果是不可判定的。 如果用有選擇的GROUP BY和在FROM中的子查詢,那麼我們可以避免使用這個構造, 但是通常它是更方便的候選方法。