# 7.3.选择列表
如前一节所示,中的表表达式选择
命令可能通过组合表、视图、消除行、分组等来构造一个中间虚拟表。该表最终由选择列表.选择列表决定了柱中间表的所有部分实际上都是输出的。
# 7.3.1.选择列表项
最简单的选择列表是*
它将发出表表达式生成的所有列。否则,选择列表是以逗号分隔的值表达式列表(如中所定义)第4.2节)。例如,它可以是一个列名称列表:
SELECT a, b, c FROM ...
列的名称A.
,b
和c
中引用的表列的实际名称从…起
子句,或中解释的给他们的别名第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标准的一部分,并且由于其结果的潜在不确定性,有时被认为是糟糕的样式。明智地使用分组
和子查询从…起
,这种构造是可以避免的,但它通常是最方便的选择。