# 7.3.选择列表

7.3.1. 选择列表项

7.3.2. 列标签

7.3.3.不同的

如前一节所示,中的表表达式选择命令可能通过组合表、视图、消除行、分组等来构造一个中间虚拟表。该表最终由选择列表.选择列表决定了中间表的所有部分实际上都是输出的。

# 7.3.1.选择列表项

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

SELECT a, b, c FROM ...

列的名称A.,bc中引用的表列的实际名称从…起子句,或中解释的给他们的别名第7.2.1.2节。选择列表中可用的名称空间与哪里子句,除非使用分组,在这种情况下,它与条款

如果多个表具有相同名称的列,则还必须给出表名,如中所示:

SELECT tbl1.a, tbl2.a, tbl1.b FROM ...

在处理多个表时,询问特定表的所有列也很有用:

SELECT tbl1.*, tbl2.a FROM ...

看见第8.16.5节更多关于*表2\u名称*.*符号

如果在选择列表中使用了任意值表达式,则从概念上讲,它会向返回的表中添加一个新的虚拟列。对每个结果行计算一次值表达式,用行的值替换任何列引用。但是选择列表中的表达式不必引用从…起条款例如,它们可以是常量算术表达式。

# 7.3.2.列标签

可以为“选择”列表中的条目指定名称,以供后续处理,例如在应用程序中使用订购人子句,以供客户端应用程序显示。例如:

SELECT a AS value, b + c AS sum FROM ...

如果没有使用指定输出列名,系统将指定默认列名。对于简单列引用,这是被引用列的名称。对于函数调用,这是函数的名称。对于复杂表达式,系统将生成通用名称。

这个关键字通常是可选的,但在某些情况下,如果所需的列名与PostgreSQL关键字匹配,则必须编写或双引号列名称,以避免歧义。(附录C显示需要哪些关键词用作列标签。)例如从…起是这样一个关键词,所以这不起作用:

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 ...

为了最大限度地防止将来可能添加的关键字,建议您始终或者将输出列名双引号引起来。

# 笔记

此处输出列的命名与从…起第条(见第7.2.1.2节)。可以对同一列重命名两次,但选择列表中指定的名称将被传递。

# 7.3.3. 不同的

处理完选择列表后,结果表可以选择性地删除重复行。这个不同的关键词直接写在后面选择要具体说明这一点:

SELECT DISTINCT select_list ...

(而不是不同的关键词全部的可用于指定保留所有行的默认行为。)

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

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

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

在这里*表示*是为所有行计算的任意值表达式。所有表达式相等的一组行被认为是重复的,并且只有该组的第一行保留在输出中。请注意,集合的“第一行”是不可预测的,除非查询按足够的列排序,以保证到达集合的行的唯一顺序不同的滤器(独特的处理发生在订购人排序。)

这个独特的子句不是SQL标准的一部分,并且由于其结果的潜在不确定性,有时被认为是糟糕的样式。明智地使用分组和子查询从…起,这种构造是可以避免的,但它通常是最方便的选择。