如前一節所示,SELECT
命令中的表表達式透過可能組合表、檢視、消除行、分組等來構造一箇中間的虛擬表。這個表最終被傳遞給select list(SELECT 列表)進行處理。SELECT 列表決定了中間表的哪些列實際上被輸出。
最簡單的 SELECT 列表是 *
,它會輸出表表示式生成的所有列。否則,SELECT 列表是一個由值表示式(定義見 第 4.2 節)組成的逗號分隔列表。例如,它可以是一個列名列表
SELECT a, b, c FROM ...
列名 a
、b
和 c
要麼是 FROM
子句中引用的表的列的實際名稱,要麼是如 第 7.2.1.2 節中所解釋的為它們指定的別名。在 SELECT 列表中可用的名稱空間與 WHERE
子句中的相同,除非使用了分組,在這種情況下,它與 HAVING
子句中的相同。
如果多個表具有同名的列,則還必須提供表名,例如:
SELECT tbl1.a, tbl2.a, tbl1.b FROM ...
在處理多個表時,要求獲取特定表的所有列也可能很有用:
SELECT tbl1.*, tbl2.a FROM ...
有關 table_name
.*
表示法的更多資訊,請參閱 第 8.16.5 節。
如果在 SELECT 列表中使用了任意值表示式,它會概念性地向返回的表中新增一個新的虛擬列。該值表示式會為每一結果行求值一次,並將該行的值替換掉任何列引用。但 SELECT 列表中的表示式不必引用 FROM
子句的表表達式中的任何列;它們可以是常量算術表示式,例如。
SELECT 列表中的項可以被分配名稱,以便後續處理,例如在 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 節)。可以對同一列重新命名兩次,但 SELECT 列表中指定的名稱將是傳遞給後續處理的名稱。
DISTINCT
#在 SELECT 列表處理完畢後,結果表可以選擇性地進行重複行消除。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
中的子查詢,可以避免這種構造,但它通常是最方便的替代方案。
如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 來報告文件問題。