SELECT 查询用于检索数据。默认情况下,查询请求的数据会返回给客户端;而与 INSERT INTO 结合使用时,也可以将其发送到另一张表。
语法
SELECT 后面的必需表达式列表外,所有子句都是可选的;关于这部分的更详细说明,请参见下文。
各可选子句的具体说明分别见单独章节,下面按其执行顺序列出:
- WITH 子句
- SELECT 子句
- DISTINCT 子句
- FROM 子句
- SAMPLE 子句
- JOIN 子句
- PREWHERE 子句
- WHERE 子句
- WINDOW 子句
- GROUP BY 子句
- LIMIT BY 子句
- HAVING 子句
- QUALIFY 子句
- LIMIT 子句
- OFFSET 子句
- UNION 子句
- INTERSECT 子句
- EXCEPT 子句
- INTO OUTFILE 子句
- FORMAT 子句
SELECT 子句
SELECT 子句中指定的表达式会在上文所述各子句中的所有操作完成后再进行计算。这些表达式会被视为分别作用于结果中的各行。如果 SELECT 子句中的表达式包含聚合函数,那么 ClickHouse 会在 GROUP BY 聚合期间处理这些聚合函数以及作为其参数使用的表达式。
如果你希望结果中包含所有列,请使用星号 (*) 。例如,SELECT * FROM ...。
Dynamic 列选择
a 符号的所有列中选取数据。
COLUMNS 表达式,并对其应用函数。
例如:
COLUMNS 表达式返回的每一列都会作为单独的参数传递给函数。此外,如果函数支持,也可以向其传递其他参数。使用函数时请务必小心。如果某个函数不支持你传入的参数个数,ClickHouse 会抛出异常。
例如:
COLUMNS('a') 返回两列:aa 和 ab。COLUMNS('c') 返回 bc 列。+ 运算符不能用于 3 个参数,因此 ClickHouse 会抛出带有相应消息的异常。
与 COLUMNS 表达式匹配的列可以具有不同的数据类型。如果 COLUMNS 没有匹配到任何列,且它是 SELECT 中唯一的表达式,则 ClickHouse 会抛出异常。
星号
MATERIALIZED 和 ALIAS 列) 。只有以下几种情况适合使用星号:
- 创建表转储时。
- 对于仅包含少量列的表,例如系统表。
- 用于查看表中有哪些列。在这种情况下,可设置
LIMIT 1。不过,更好的方式是使用DESC TABLE查询。 - 使用
PREWHERE对少量列进行强过滤时。 - 在子查询中 (因为外部查询不需要的列会从子查询中排除) 。
极值
XML、JSON*、TabSeparated*、CSV*、Vertical、Template 和 Pretty* 格式中与其他行分开输出。其他格式则不会输出。
在 JSON* 和 XML 格式中,极值会输出在单独的 extremes 字段中。在 TabSeparated*、CSV* 和 Vertical 格式中,这两行会出现在主结果之后;如果存在 totals,则也会位于其后。它们前面会有一个空行 (即在其他数据之后) 。在 Pretty* 格式中,这两行会作为单独的表输出在主结果之后;如果存在 totals,则也会位于其后。在 Template 格式中,极值会按照指定模板输出。
极值是在 LIMIT 之前、但在 LIMIT BY 之后的行上计算的。不过,在使用 LIMIT offset, size 时,offset 之前的行也会计入 extremes。在流式请求中,结果还可能包含少量已通过 LIMIT 的行。
说明
AS 别名) 。
GROUP BY、ORDER BY 和 LIMIT BY 子句支持位置参数。要启用此功能,请打开 enable_positional_arguments 设置。例如,ORDER BY 1,2 会先按表中的第 1 列、再按第 2 列对行进行排序。
实现细节
DISTINCT、GROUP BY 和 ORDER BY 子句,以及 IN 和 JOIN 子查询,则整个查询都将以流式方式处理,只需使用 O(1) 量级的 RAM。否则,如果没有设置适当的限制,查询可能会消耗大量 RAM:
max_memory_usagemax_rows_to_group_bymax_rows_to_sortmax_rows_in_distinctmax_bytes_in_distinctmax_rows_in_setmax_bytes_in_setmax_rows_in_joinmax_bytes_in_joinmax_bytes_before_external_sortmax_bytes_ratio_before_external_sortmax_bytes_before_external_group_bymax_bytes_ratio_before_external_group_by
SELECT 修饰符
SELECT 查询中使用以下修饰符。
修饰符组合
SELECT 查询中的 SETTINGS
SELECT 查询中指定所需设置。该设置值仅对此查询生效,并会在查询执行后恢复为默认值或之前的值。
有关设置的其他指定方式,请参见这里。
对于值为 true 的布尔设置,你可以省略赋值,使用简写语法。仅指定设置名称时,它会自动设为 1 (true) 。
示例