如上一節所示,SELECT
命令中的表述式通過組合表、檢視、排除列、分組等方式來構建一個中間虛擬表。這個表最終會傳遞給選擇列表進行處理。選擇列表決定了中間表中的哪些欄位實際輸出。
最簡單的選擇列表類型是 *
,它會發出表述式產生的所有欄位。否則,選擇列表是一個以逗號分隔的值表達式列表(如第 4.2 節中所定義)。例如,它可以是欄位名稱的列表
SELECT a, b, c FROM ...
欄位名稱 a
、b
和 c
要麽是 FROM
子句中引用的表欄位的實際名稱,要麽是賦予它們的別名,如第 7.2.1.2 節中所述。選擇列表中可用的名稱空間與 WHERE
子句中的相同,除非使用分組,在這種情況下,它與 HAVING
子句中的相同。
如果多個表具有相同名稱的欄位,則還必須給出表名稱,如
SELECT tbl1.a, tbl2.a, tbl1.b FROM ...
使用多個表時,請求特定表的所有欄位也可能很有用
SELECT tbl1.*, tbl2.a FROM ...
有關 table_name
.*
標記法的更多資訊,請參閱第 8.16.5 節。
如果在選擇列表中使用了任意值表達式,則概念上會向傳回的表中新增一個新的虛擬欄位。對於每個結果列,都會對該值表達式求值一次,並將該列的值替換為任何欄位參考。但是,選擇列表中的表達式不必參考 FROM
子句的表述式中的任何欄位;例如,它們可以是常量算術表達式。
可以為選擇列表中的條目分配名稱,以供後續處理使用,例如在 ORDER BY
子句中使用或由客戶端應用程式顯示。例如
SELECT a AS value, b + c AS sum FROM ...
如果未使用 AS
指定輸出欄位名稱,則系統會分配預設欄位名稱。對於簡單的欄位參考,這是被參考欄位的名稱。對於函數呼叫,這是函數的名稱。對於複雜的表達式,系統將產生通用名稱。
AS
關鍵字通常是可選的,但在某些情況下,當所需的欄位名稱與 PostgreSQL 關鍵字匹配時,您必須編寫 AS
或使用雙引號引住欄位名稱,以避免歧義。(附錄 C 顯示了哪些關鍵字需要使用 AS
作為欄位標籤。)例如,FROM
就是這樣的一個關鍵字,所以這不起作用
SELECT a from, b + c AS sum FROM ...
但是以下兩種方法都可以
SELECT a AS from, b + c AS sum FROM ... SELECT a "from", b + c AS sum FROM ...
為了最大程度地防止將來新增關鍵字的可能性,建議您始終編寫 AS
或使用雙引號引住輸出欄位名稱。
此處輸出欄位的命名與在 FROM
子句中完成的命名不同(請參閱第 7.2.1.2 節)。可以多次重新命名同一個欄位,但是選擇列表中指定的名稱將會被傳遞下去。
DISTINCT
#在選取清單處理完畢後,您可以選擇性地對結果表進行重複列的消除。DISTINCT
關鍵字直接寫在 SELECT
之後,用於指定此行為。
SELECT DISTINCT select_list
...
(您可以使用 ALL
關鍵字來代替 DISTINCT
,以指定保留所有列的預設行為。)
顯然地,如果兩列在至少一個欄位值上有所不同,則它們被認為是不同的。 在此比較中,Null 值被視為相等。
或者,可以使用任意表達式來決定哪些列應被視為不同。
SELECT DISTINCT ON (expression
[,expression
...])select_list
...
這裡,expression
是一個任意值表達式,會針對所有列進行評估。 所有表達式都相等的列的集合被認為是重複的,並且僅保留集合中的第一列在輸出中。 請注意,除非查詢已按足夠的欄位排序以保證到達 DISTINCT
過濾器的列的唯一順序,否則集合的「第一列」是無法預測的。(DISTINCT ON
處理發生在 ORDER BY
排序之後。)
DISTINCT ON
子句不是 SQL 標準的一部分,有時被認為是不好的風格,因為它的結果可能具有不確定的性質。 通過明智地使用 GROUP BY
和 FROM
中的子查詢,可以避免這種結構,但它通常是最方便的替代方案。
如果您在文件中看到任何不正確、與您使用特定功能的經驗不符或需要進一步說明的地方,請使用此表單回報文件問題。