PostgreSQL 10.1 手册_部分 II. SQL 语言_第 7 章 查询_7.3. 选择列表

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: 7.3. 选择列表 7.3.1. 选择列表项 7.3.2. 列标签 7.3.3. DISTINCT 如前面的小节说明的那样, 在SELECT命令里的表表达式构造了一个中间的虚拟表, 方法可能有组合表、视图、消除行、分组等等。

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

参阅第 8.16.5 节获取更多有关 table_name.*符号的信息。

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

7.3.2. 列标签

选择列表中的项可以被赋予名字,用于进一步的处理。 例如为了在一个ORDER BY子句中使用或者为了客户端应用显示。例如:

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

如果没有使用AS指定输出列名,那么系统会分配一个缺省的列名。对于简单的列引用, 它是被引用列的名字。对于函数调用,它是函数的名字。对于复杂表达式,系统会生成一个通用的名字。

只有在新列无法匹配任何PostgreSQL关键词(见附录 C)时,AS关键词是可选的。为了避免一个关键字的意外匹配,你可以使用双引号来修饰列名。例如,VALUE是一个关键字,所以下面的语句不会工作:

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

但是这个可以:

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

为了防止未来可能的关键词增加,我们推荐总是写AS或者用双引号修饰输出列名。

注意

输出列的命名和在FROM子句里的命名是不一样的 (参阅第 7.2.1.2 节)。 它实际上允许你对同一个列命名两次,但是在选择列表中分配的名字是要传递下去的名字。

7.3.3. DISTINCT

在处理完选择列表之后,结果表可以可选的删除重复行。我们可以直接在SELECT后面写上DISTINCT关键字来指定:

SELECT DISTINCT select_list ...

(如果不用DISTINCT你可以用ALL关键词来指定获得的所有行的缺省行为)。

显然,如果两行里至少有一个列有不同的值,那么我们认为它是可区分的。空值在这种比较中被认为是相同的。

另外,我们还可以用任意表达式来判断什么行可以被认为是可区分的:

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

这里expression是任意值表达式,它为所有行计算。如果一个行集合里所有表达式的值是一样的, 那么我们认为它们是重复的并且因此只有第一行保留在输出中。请注意这里的一个集合的第一行是不可预料的, 除非你在足够多的列上对该查询排了序,保证到达DISTINCT过滤器的行的顺序是唯一的(DISTINCT ON处理是发生在ORDER BY排序后面的)。

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

本文转自PostgreSQL中文社区,原文链接:7.3. 选择列表

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
4天前
|
SQL 关系型数据库 数据库
SQL 42501: Postgresql查询中的权限不足错误
SQL 42501: Postgresql查询中的权限不足错误
|
5天前
|
SQL 关系型数据库 MySQL
【MySQL】:探秘主流关系型数据库管理系统及SQL语言
【MySQL】:探秘主流关系型数据库管理系统及SQL语言
11 0
|
5天前
|
SQL 分布式计算 大数据
MaxCompute操作报错合集之在sql 里嵌套查询时,查询条件带有instr时报错,如何解决
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
10天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
|
17天前
|
关系型数据库 分布式数据库 数据库
PolarDB闪电助攻,《香肠派对》百亿好友关系实现毫秒级查询
PolarDB分布式版助力《香肠派对》实现百亿好友关系20万QPS的毫秒级查询。
PolarDB闪电助攻,《香肠派对》百亿好友关系实现毫秒级查询
|
17天前
|
SQL 存储 Oracle
关系型数据库查询数据的语句
本文介绍了关系型数据库中的基本SQL查询语句,包括选择所有或特定列、带条件查询、排序、分组、过滤分组、表连接、限制记录数及子查询。SQL还支持窗口函数、存储过程等高级功能,是高效管理数据库的关键。建议深入学习SQL及相应数据库系统文档。
10 2
|
18天前
|
SQL 安全 关系型数据库
关系型数据库控制语言(DCL)
DCL是SQL的一部分,用于控制数据库安全和访问权限。主要包括GRANT(授权)、REVOKE(撤销)和角色管理。GRANT用于给予用户访问数据库对象的权限,REVOKE用于撤销权限。角色管理则允许批量授予一组权限。DCL帮助管理员精细控制数据访问,确保安全性和完整性。不同RDBMS对DCL的实现可能略有差异,使用时需参考相应文档。
15 6
|
21天前
|
SQL 运维 监控
面经:Presto/Trino高性能SQL查询引擎解析
【4月更文挑战第10天】本文深入探讨了大数据查询引擎Trino(现称Trino)的核心特性与应用场景,适合面试准备。重点包括:Trino的分布式架构(Coordinator与Worker节点)、连接器与数据源交互、查询优化(CBO、动态过滤)及性能调优、容错与运维实践。通过实例代码展示如何解释查询计划、创建自定义连接器以及查看查询的I/O预期。理解这些知识点将有助于在面试中脱颖而出,并在实际工作中高效处理数据分析任务。
50 12
|
10月前
|
SQL Cloud Native 关系型数据库
ADBPG(AnalyticDB for PostgreSQL)是阿里云提供的一种云原生的大数据分析型数据库
ADBPG(AnalyticDB for PostgreSQL)是阿里云提供的一种云原生的大数据分析型数据库
759 1
|
10月前
|
数据可视化 关系型数据库 MySQL
将 PostgreSQL 迁移到 MySQL 数据库
将 PostgreSQL 迁移到 MySQL 数据库
1084 2