⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
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 子句包含一组表达式,这些表达式指定了查询的结果。选择列表可以引用 FROM 子句中的任何列,并使用表达式对它们进行组合。由于 SQL 查询的输出是一个表,因此 SELECT 子句中的每个表达式也都必须有一个名称。表达式可以使用 AS 子句显式命名(例如 expr AS name)。如果用户未提供名称,系统会自动为这些表达式命名。

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

星号表达式 (Star Expressions)

从名为 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]);

将结构体 (struct) 展开一层

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

unnest 函数是一个可以与数组列表结构体一起使用的特殊函数。unnest 函数会从类型中剥离一层嵌套。例如,INTEGER[] 会转换为 INTEGERSTRUCT(a INTEGER, b INTEGER) 会转换为 a INTEGER, b INTEGER。unnest 函数可用于将嵌套类型转换为常规标量类型,从而使其更易于操作。

© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南