跳到主要内容

SELECT 子句

SELECT 子句指定查询将返回的列列表。虽然它在子句中最先出现,但在逻辑上,这里的表达式会在最后阶段才执行。SELECT 子句可包含用于转换输出的任意表达式,也可包含聚合函数和窗口函数。

示例

选择名为 tbl 的表中的所有列:

SELECT * FROM tbl;

对表中的列执行算术运算,并提供别名:

SELECT col1 + col2 AS res, sqrt(col1) AS root FROM tbl;

使用前缀别名:

SELECT
res: col1 + col2,
root: sqrt(col1)
FROM tbl;

addresses 表中选择所有唯一城市:

SELECT DISTINCT city FROM addresses;

返回 addresses 表中的总行数:

SELECT count(*) FROM addresses;

addresses 表中选择除 city 列以外的所有列:

SELECT * EXCLUDE (city) FROM addresses;

addresses 表中选择所有列,但将 city 替换为 lower(city)

SELECT * REPLACE (lower(city) AS city) FROM addresses;

从表中选择与给定正则表达式匹配的所有列:

SELECT COLUMNS('number\d+') FROM addresses;

对表中给定的所有列计算函数:

SELECT min(COLUMNS(*)) FROM addresses;

要选择包含空格或特殊字符的列,请使用双引号("):

SELECT "Some Column Name" FROM tbl;

语法

SELECT 列表

SELECT 子句包含一个表达式列表,用于指定查询结果。SELECT 列表可以引用 FROM 子句中的任意列,并通过表达式将其组合。由于 SQL 查询的输出是一个表,因此 SELECT 子句中的每个表达式也都有名称。表达式可通过 AS 子句显式命名(例如 expr AS name)。如果用户未提供名称,系统会自动为表达式命名。

列名不区分大小写。更多细节请参阅大小写敏感规则

星号表达式

选择名为 tbl 的表中的所有列:

SELECT *
FROM tbl;

从表中选择与给定正则表达式匹配的所有列:

SELECT COLUMNS('number\d+')
FROM addresses;

星号表达式是一种特殊表达式,它会根据 FROM 子句的内容扩展为多个表达式。在最简单的情况下,* 会扩展为 FROM 子句中的全部表达式。也可以使用正则表达式或 lambda 函数来选择列。更多细节请参见星号表达式页面

DISTINCT 子句

从 addresses 表中选择所有唯一城市:

SELECT DISTINCT city
FROM addresses;

DISTINCT 子句可用于仅返回结果中唯一的行,从而过滤掉重复行。

SELECT DISTINCT 开头的查询会执行去重,这是一项开销较大的操作。因此,仅在必要时使用 DISTINCT

DISTINCT ON 子句

仅选择每个国家人口最多的城市:

SELECT DISTINCT ON(country) city, population
FROM cities
ORDER BY population DESC;

DISTINCT ON 子句会针对 ON 子句定义的表达式集合中每个唯一值仅返回一行。如果存在 ORDER BY 子句,则返回满足 ORDER BY 排序条件时遇到的第一行。如果不存在 ORDER BY 子句,则“第一行”没有明确顺序,可能是表中的任意一行。

在查询大型数据集时,对所有列使用 DISTINCT 可能代价较高。因此,可考虑在某一列(或一组列)上使用 DISTINCT ON,以保证结果具备足够的唯一性。例如,在表的键列上使用 DISTINCT ON 可保证完全唯一。

聚合

返回 addresses 表中的总行数:

SELECT count(*)
FROM addresses;

按城市分组返回 addresses 表中的总行数:

SELECT city, count(*)
FROM addresses
GROUP BY city;

聚合函数是将多行组合为单个值的特殊函数。当 SELECT 子句中存在聚合函数时,查询会变为聚合查询。在聚合查询中,所有表达式都必须是聚合函数的一部分,或属于某个分组(由 GROUP BY 子句指定)。

窗口函数

生成一个 row_number 列,为每行包含递增标识符:

SELECT row_number() OVER ()
FROM sales;

按时间顺序计算当前金额与前一金额之间的差值:

SELECT amount - lag(amount) OVER (ORDER BY time)
FROM sales;

窗口函数是允许相对于结果中其他行计算值的特殊函数。窗口函数由 OVER 子句标识,其中包含窗口规范。窗口规范定义了计算窗口函数时所使用的框架或上下文。更多信息请参见窗口函数页面

unnest 函数

将数组展开一层:

SELECT unnest([1, 2, 3]);

将结构体展开一层:

SELECT unnest({'a': 42, 'b': 84});

unnest 函数是一个特殊函数,可与arrayliststruct一起使用。unnest 函数会去掉类型的一层嵌套。例如,INTEGER[] 会转换为 INTEGERSTRUCT(a INTEGER, b INTEGER) 会转换为 a INTEGER, b INTEGERunnest 函数可将嵌套类型转换为常规标量类型,从而更易于操作。