⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
SELECT 子句

SELECT 子句指定了查询将返回的列列表。尽管它在子句中首先出现,但从逻辑上讲,这里的表达式仅在最后执行。SELECT 子句可以包含任意转换输出的表达式,以及聚合函数和窗口函数。

示例

从名为 table_name 的表中选择所有列

SELECT * FROM table_name;

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

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

使用前缀别名

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

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 子句包含一个表达式列表,用于指定查询的结果。选择列表可以引用 FROM 子句中的任何列,并使用表达式对其进行组合。由于 SQL 查询的输出是一个表,SELECT 子句中的每个表达式也都有一个名称。表达式可以使用 AS 子句(例如,expr AS name)显式命名。如果用户未提供名称,则系统会自动命名这些表达式。

列名不区分大小写。有关更多详细信息,请参阅大小写敏感规则

星号表达式

从名为 table_name 的表中选择所有列

SELECT *
FROM table_name;

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

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 函数是一个特殊函数,可与数组列表结构体一起使用。unnest 函数会从类型中剥离一层嵌套。例如,INTEGER[] 转换为 INTEGERSTRUCT(a INTEGER, b INTEGER) 转换为 a INTEGER, b INTEGERunnest 函数可用于将嵌套类型转换为常规标量类型,从而使它们更易于操作。