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 BY
和 HAVING
子句
GROUP BY
子句 指定了在 SELECT
子句中执行任何聚合时应使用的分组列。如果指定了 GROUP BY
子句,即使 SELECT
子句中没有聚合,查询也始终是一个聚合查询。
WINDOW
子句
WINDOW
子句 允许您指定可以在窗口函数中使用的命名窗口。当您有多个窗口函数时,这些非常有用,因为它们允许您避免重复相同的窗口子句。
QUALIFY
子句
QUALIFY
子句 用于过滤 WINDOW
函数 的结果。
ORDER BY
, LIMIT
和 OFFSET
子句
ORDER BY
, LIMIT
和 OFFSET
是输出修饰符。
逻辑上它们在查询的最后应用。
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
语句的完整语法图: