⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
SELECT 语句

SELECT 语句用于从数据库中检索行。

示例

从表 tbl 中选择所有列

SELECT * FROM tbl;

tbl 中选择行

SELECT j FROM tbl WHERE i = 3;

执行按列 i 分组的聚合操作

SELECT i, sum(j) FROM tbl GROUP BY i;

仅从 tbl 中选择前 3 行

SELECT * FROM tbl ORDER BY i DESC LIMIT 3;

使用 USING 子句将两个表连接起来

SELECT * FROM t1 JOIN t2 USING (a, b);

使用列索引从表 tbl 中选择第一列和第三列

SELECT #1, #3 FROM tbl;

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

SELECT DISTINCT city FROM addresses;

通过使用行变量返回一个 STRUCT

SELECT d
FROM (SELECT 1 AS a, 2 AS b) d;

语法

SELECT 语句用于从数据库中检索行。SELECT 语句的规范顺序如下所示,较少使用的子句已缩进:

SELECT select_list
FROM tables
    USING SAMPLE sample_expression
WHERE condition
GROUP BY groups
HAVING group_filter
    WINDOW window_expression
    QUALIFY qualify_filter
ORDER BY order_expression
LIMIT n;

可选地,SELECT 语句可以以 WITH 子句作为前缀。

由于 SELECT 语句非常复杂,我们将语法图拆分成了几个部分。完整的语法图可以在页面底部找到。

SELECT 子句

SELECT 子句指定查询将返回的列列表。虽然它在子句中首先出现,但在逻辑上,此处的表达式仅在最后执行。SELECT 子句可以包含转换输出的任意表达式,以及聚合函数和窗口函数。DISTINCT 关键字确保仅返回唯一的元组。

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

FROM 子句

FROM 子句指定了查询其余部分所操作的数据。从逻辑上讲,查询从 FROM 子句开始执行。FROM 子句可以包含单个表、通过连接组合的多个表,或子查询节点中的另一个 SELECT 查询。

SAMPLE 子句

SAMPLE 子句允许您对基表中的样本运行查询。这可以显著加快查询处理速度,但会牺牲结果的准确性。在探索数据集时,样本也可用于快速查看数据的快照。SAMPLE 子句紧接在 FROM 子句中的任何内容之后应用(即在任何连接之后,但在 where 子句或任何聚合之前)。有关更多信息,请参阅样本 (Samples) 页面。

WHERE 子句

WHERE 子句指定要应用于数据的任何过滤器。这允许您仅选择您感兴趣的数据子集。在逻辑上,WHERE 子句在 FROM 子句之后立即应用。

GROUP BYHAVING 子句

GROUP BY 子句指定应使用哪些分组列来执行 SELECT 子句中的任何聚合。如果指定了 GROUP BY 子句,则查询始终为聚合查询,即使 SELECT 子句中不存在聚合。

WINDOW 子句

WINDOW 子句允许您指定可在窗口函数中使用的命名窗口。当您有多个窗口函数时,它们非常有用,因为它们允许您避免重复相同的窗口子句。

QUALIFY 子句

QUALIFY 子句用于过滤 WINDOW 函数的结果。

ORDER BYLIMITOFFSET 子句

ORDER BYLIMITOFFSET 是输出修饰符。在逻辑上,它们在查询的最后应用。ORDER BY 子句根据排序条件按升序或降序对行进行排序。LIMIT 子句限制获取的行数,而 OFFSET 子句指示从哪个位置开始读取值。

VALUES 列表

VALUES 列表是一组替代 SELECT 语句提供的值。

行 ID (Row IDs)

对于每个表,rowid 伪列都会根据物理存储返回行标识符。

CREATE TABLE t (id INTEGER, content VARCHAR);
INSERT INTO t VALUES (42, 'hello'), (43, 'world');
SELECT rowid, id, content FROM t;
rowid id content
0 42 hello
1 43 world

在当前存储中,如果未删除任何行,这些标识符是连续的无符号整数(0, 1, …)。删除操作会在 rowid 中引入空隙,这些空隙以后可能会被回收。

CREATE OR REPLACE TABLE t AS (FROM range(10) r(i));
DELETE FROM t WHERE i % 2 = 0;
SELECT rowid FROM t;
rowid
1
3
5
7
9

rowid 值在事务内是稳定的。

最佳实践:强烈建议避免使用 rowid 作为标识符。

如果存在名为 rowid 的用户定义列,它将遮蔽 rowid 伪列。

公用表表达式 (Common Table Expressions)

完整语法图

以下是 SELECT 语句的完整语法图

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