2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不再支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

7.3. SELECT 列表 #

如前一節所示,SELECT 命令中的表表達式透過可能組合表、檢視、消除行、分組等來構造一箇中間的虛擬表。這個表最終被傳遞給select list(SELECT 列表)進行處理。SELECT 列表決定了中間表的哪些實際上被輸出。

7.3.1. SELECT 列表項 #

最簡單的 SELECT 列表是 *,它會輸出表表示式生成的所有列。否則,SELECT 列表是一個由值表示式(定義見 第 4.2 節)組成的逗號分隔列表。例如,它可以是一個列名列表

SELECT a, b, c FROM ...

列名 abc 要麼是 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 子句的表表達式中的任何列;它們可以是常量算術表示式,例如。

7.3.2. 列標籤 #

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 列表中指定的名稱將是傳遞給後續處理的名稱。

7.3.3. 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 BYFROM 中的子查詢,可以避免這種構造,但它通常是最方便的替代方案。

提交更正

如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 來報告文件問題。