支持的版本: 当前 (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 命令中的表表达式通过可能合并表、视图、消除行、分组等操作来构建中间虚拟表。此表最终传递给选择列表进行处理。选择列表确定中间表的哪些实际输出。

7.3.1. 选择列表项 #

最简单的选择列表是 *,它会发出表表达式产生的所有列。否则,选择列表是由逗号分隔的值表达式列表(如第 4.2 节中定义)。例如,它可以是列名列表

SELECT a, b, c FROM ...

列名abc 要么是 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 子句的表表达式中的任何列;例如,它们可以是常量算术表达式。

7.3.2. 列标签 #

选择列表中的条目可以分配名称以供后续处理,例如在 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 节)。可以两次重命名同一列,但选择列表中分配的名称将是传递的名称。

7.3.3. DISTINCT #

处理完选择列表后,可以有选择地对结果表进行重复行消除。DISTINCT 关键字直接写在 SELECT 之后以指定此操作

SELECT DISTINCT select_list ...

(可以使用关键字 ALL 代替 DISTINCT 来指定保留所有行的默认行为。)

显然,如果两行至少在一个列值上不同,则认为它们是不同的。在此比较中,空值被认为是相等的。

或者,可以使用任意表达式来确定哪些行被认为是不同的

SELECT DISTINCT ON (expression [, expression ...]) select_list ...

此处,expression 是一个针对所有行计算的任意值表达式。一组表达式都相等的行被认为是重复的,并且仅将该组的第一行保留在输出中。请注意,除非查询已按照足够的列排序以保证到达 DISTINCT 过滤器的行的唯一排序,否则集合的第一行是不可预测的。(DISTINCT ON 处理发生在 ORDER BY 排序之后。)

DISTINCT ON 子句不是 SQL 标准的一部分,并且由于其结果的潜在不确定性,有时被认为是糟糕的风格。通过在 FROM 中明智地使用 GROUP BY 和子查询,可以避免此构造,但它通常是最方便的替代方法。

提交更正

如果您在文档中看到任何不正确、与特定功能不符或需要进一步澄清的内容,请使用此表单报告文档问题。