⌘+k ctrl+k
1.1.3 (stable)
Search Shortcut cmd + k | ctrl + k
SELECT Statement

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

Examples

从表 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;

从地址表中选择所有唯一的城市:

SELECT DISTINCT city FROM addresses;

使用行变量返回一个STRUCT

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

Syntax

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 expr AS alias table-name . * COLUMNS *COLUMNS ( table-name . * regex c -> lambda-filter ) ,

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

Note

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

FROM 子句

FROM ( ) AS join-alias ,

FROM 子句 指定了查询其余部分应操作的数据的来源。从逻辑上讲,FROM 子句是查询开始执行的地方。FROM 子句可以包含单个表、多个表的组合(这些表通过连接结合在一起),或者子查询节点中的另一个SELECT 查询。

SAMPLE 子句

USING SAMPLE sample-size % PERCENT ROWS ( sampling-method , seed ) sampling-method ( sample-size % PERCENT ROWS ) REPEATABLE ( seed )

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

WHERE 子句

WHERE expr

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

GROUP BYHAVING 子句

GROUP BY expr GROUPING SETS ( ( expr , ) , ) CUBE ROLLUP ( expr , ) , ALL HAVING expr

GROUP BY 子句 指定了在 SELECT 子句中执行任何聚合时应使用的分组列。如果指定了 GROUP BY 子句,即使 SELECT 子句中没有聚合,查询也始终是一个聚合查询。

WINDOW 子句

WINDOW window-name AS ,

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

QUALIFY 子句

QUALIFY window_function_expr

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

ORDER BY, LIMITOFFSET 子句

ORDER BY expr ASC DESC NULLS FIRST LAST , ALL ASC DESC NULLS FIRST LAST LIMIT expr OFFSET expr

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

VALUES 列表

VALUES ( expr , ) ,

一个 VALUES 列表 是一组值,用于替代 SELECT 语句。

行ID

对于每个表,rowid 伪列返回基于物理存储的行标识符。

CREATE TABLE t (id INTEGER, content VARCHAR);
INSERT INTO t VALUES (42, 'hello'), (43, 'world');
SELECT rowid, id, content FROM t;
行ID ID 内容
0 42 你好
1 43 世界

在当前存储中,如果没有删除行,这些标识符是连续的无符号整数(0, 1, …)。删除操作会在rowids中引入间隙,这些间隙可能会在以后被回收。因此,强烈建议不要使用rowids作为标识符

Note

提示 在事务中,rowid 的值是稳定的。

Note

如果有一个用户定义的列名为rowid,它会遮蔽rowid伪列。

通用表表达式

WITH RECURSIVE table-name ( column-name , ) AS NOT MATERIALIZED select-node ( select-node ) ,

完整语法图

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