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 函数是一个特殊函数,可与array、list或struct一起使用。unnest 函数会去掉类型的一层嵌套。例如,INTEGER[] 会转换为 INTEGER。STRUCT(a INTEGER, b INTEGER) 会转换为 a INTEGER, b INTEGER。unnest 函数可将嵌套类型转换为常规标量类型,从而更易于操作。