⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 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;

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

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 子句或任何聚合之前)。有关更多信息,请参阅样本页面。

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

对于每个表,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 伪列。

公用表表达式

完整语法图

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