返回介绍

I. 教程

II. SQL 语言

III. 服务器管理

IV. 客户端接口

V. 服务器端编程

VI. 参考手册

VII. 内部

VIII. 附录

7.3. 选择列表

发布于 2019-09-30 03:06:04 字数 2155 浏览 963 评论 0 收藏 0

如前面的小节说明的那样,在 SELECT 命令中的表表达式通过组合表、视图、删除行、分组等构造了一个中介性的虚拟表。这个表最后传递给选择列表处理。选择列表判断最终实际输出虚拟表的哪些字段

7.3.1. 选择列表项

最简单的选择列表是 * ,它输出表表达式生成的所有字段。否则,一个选择列表是一个逗号分隔的值表达式的列表(和在节4.2里定义的一样)。比如,它可能是一个字段名列表:

SELECT a, b, c FROM ...

字段名 a, b, c 要么是在 FROM 子句里引用的表中字段的实际名字,要么是节7.2.1.2里解释的别名。选择列表中的名字空间和 WHERE 子句中的名字空间是一样的,除非你使用了分组,否则它和 HAVING 子句中的名字空间也一样。

如果多个表有重复的字段名,那么你还必须给出表名字,例如:

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

当使用多个表时,给出表名还有助于引用该表的所有字段:

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

又见节7.2.2。

如果将值表达式用于选择列表,那么它在概念上向返回的表中增加了一个新的虚拟字段。值表达式为结果中的每一行进行一次计算,计算之前用该行的数值替换任何表达式里引用的字段。不过选择列表中的这个表达式并非一定要引用来自 FROM 子句中表表达式里面的字段,比如,它也可以是任意常量算术表达式。

7.3.2. 字段标签

选择列表中的列表项可以赋予名字,以便于进一步的处理。这里"进一步处理"是指一个可选的排序声明和客户端应用(比如,用于显示的字段头)。比如:

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

如果没有使用 AS 声明字段名字,那么系统将赋予一个缺省值。对于简单的字段引用,它是该字段的名字。对于函数调用,它是该函数的名字。对于复杂表达式,系统会生成一个通用的名字。

【注意】输出字段的命名和在 FROM 子句里的命名是不一样的(参阅节7.2.1.2)。这样就允许你对同一个字段命名两次,FROM 子句里的名字将被选择列表使用,而选择列表中新取的名字将被最终输出。

7.3.3. DISTINCT

在处理完选择列表之后,生成的表可以删除重复行。直接在 SELECT 后面写上 DISTINCT 关键字即可:

SELECT DISTINCT select_list ...

如果不用 DISTINCT 你可以用 ALL 声明保留所有行的缺省行为。

显然,如果两行里至少有一个字段值不同,那么我们认为这两行是独立的。NULL 在这里被认为是相同的。

另外,我们还可以用表达式来判断什么样的行可以认为是独立的:

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

这里的 expression 是一个值表达式,它为每一行计算。如果一组行计算出的该表达式的值都相同,那么就认为这些行是重复的,并只输出第一行。请注意这里的"第一行"是不可预料的,除非你在足够多的字段上对该查询进行了排序,保证到达 DISTINCT 过滤器时行的顺序是唯一的(DISTINCT ON 将在 ORDER BY 排序之后处理)。

DISTINCT ON 子句不是 SQL 标准的一部分,有时候被是一个糟糕的风格,因为它的结果是不可判定的。如果用有可选的 GROUP BY 和在 FROM 中的子查询可以达到目的,那么我们可以避免使用这个构造,但是通常它是更方便的方法。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文