⌘+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 子句 指定了查询将返回的列列表。虽然它在子句中首先出现,逻辑上这里的表达式只在最后执行。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 BY, LIMITOFFSET 子句

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

VALUES 列表

一个 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作为标识符

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

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

通用表表达式

完整语法图

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