SELECT 查询
SELECT
查询执行数据检索。默认情况下,请求的数据返回给客户端,而在与
INSERT INTO
结合使用时,它可以转发到不同的表。
除了在
SELECT
后面紧接着的所需表达式列表是必需的外,所有子句都是可选的,这部分将在
下文
中详细介绍。
每个可选子句的具体内容在单独的小节中阐述,这些小节按执行顺序列出:
SELECT 子句
在
SELECT
子句中指定的
表达式
在上述子句中所有操作完成后计算。这些表达式的工作方式就像它们适用于结果中的独立行。如果
SELECT
子句中的表达式包含聚合函数,则 ClickHouse 在
GROUP BY
聚合期间处理这些聚合函数及其参数。
如果您想在结果中包含所有列,请使用星号(
*
)符号。例如,
SELECT * FROM ...
。
动态列选择
动态列选择(也称为 COLUMNS 表达式)允许您用正则表达式匹配结果中的某些列,具体是 re2 正则表达式。
例如,考虑下面的表:
以下查询选择所有列名中包含
a
符号的数据。
所选列的返回顺序不是按字母顺序排列。
您可以在查询中使用多个
COLUMNS
表达式并对它们应用函数。
每个通过
COLUMNS
表达式返回的列作为单独的参数传递给函数。如果该函数支持其他参数,您也可以将其他参数传递给它。使用函数时,请小心。如果一个函数不支持您传递的参数数量,ClickHouse 将抛出异常。
在这个例子中,
COLUMNS('a')
返回两个列:
aa
和
ab
。
COLUMNS('c')
返回
bc
列。
+
运算符无法应用于 3 个参数,因此 ClickHouse 抛出了一个相关的异常信息。
匹配
COLUMNS
表达式的列可以具有不同的数据类型。如果
COLUMNS
没有匹配任何列,并且是
SELECT
中唯一的表达式,ClickHouse 会抛出异常。
您可以在查询中的任何位置放置一个星号来代替一个表达式。当查询被分析时,星号会扩展为所有表列的列表(不包括
MATERIALIZED
和
ALIAS
列)。在以下少数情况下使用星号是合理的:
LIMIT 1
。但最好使用
DESC TABLE
查询。
PREWHERE
对少数列进行强过滤时。
在所有其他情况下,我们不建议使用星号,因为它只会让您获得列式 DBMS 的缺点,而不是优点。换句话说,不推荐使用星号。
除了结果外,您还可以获取结果列的最小和最大值。为此,将 extremes 设置为 1。最小值和最大值是为数值类型、日期和时间戳计算的。对于其他列,输出默认值。
额外的两行被计算出来——分别是最小值和最大值。这两行在
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
将按照第一列和第二列对表中的行进行排序。
实现细节
如果查询省略了
DISTINCT
、
GROUP BY
和
ORDER BY
子句以及
IN
和
JOIN
子查询,则查询将完全以流方式处理,使用 O(1) 的内存量。否则,如果未指定适当的限制,查询可能会消耗大量内存:
max_memory_usage
max_rows_to_group_by
max_rows_to_sort
max_rows_in_distinct
max_bytes_in_distinct
max_rows_in_set
max_bytes_in_set
max_rows_in_join
max_bytes_in_join
max_bytes_before_external_sort
max_bytes_ratio_before_external_sort
max_bytes_before_external_group_by
max_bytes_ratio_before_external_group_by
有关更多信息,请参见“设置”部分。可以使用外部排序(将临时表保存到磁盘)和外部聚合。
SELECT 修饰符
您可以在
SELECT
查询中使用以下修饰符。
APPLY
允许您对查询外部表表达式返回的每一行调用某个函数。
EXCEPT
指定要从结果中排除的一个或多个列的名称。所有匹配的列名将从输出中省略。
REPLACE
指定一个或多个
表达式别名
。每个别名必须匹配
SELECT *
语句中的列名。在输出的列列表中,匹配别名的列被该
REPLACE
中的表达式替代。
此修饰符不会更改列的名称或顺序。然而,它可以改变值和值类型。
修饰符组合
您可以单独使用每个修饰符或将它们组合在一起。
多次使用相同的修饰符。
在单个查询中使用多个修饰符。