跳到主要内容
跳到主要内容

SELECT 查询

SELECT 查询执行数据检索。默认情况下,请求的数据返回给客户端,而在与 INSERT INTO 结合使用时,它可以转发到不同的表。

语法

除了在 SELECT 后面紧接着的所需表达式列表是必需的外,所有子句都是可选的,这部分将在 下文 中详细介绍。

每个可选子句的具体内容在单独的小节中阐述,这些小节按执行顺序列出:

SELECT 子句

SELECT 子句中指定的 表达式 在上述子句中所有操作完成后计算。这些表达式的工作方式就像它们适用于结果中的独立行。如果 SELECT 子句中的表达式包含聚合函数,则 ClickHouse 在 GROUP BY 聚合期间处理这些聚合函数及其参数。

如果您想在结果中包含所有列,请使用星号(*)符号。例如,SELECT * FROM ...

动态列选择

动态列选择(也称为 COLUMNS 表达式)允许您用正则表达式匹配结果中的某些列,具体是 re2 正则表达式。

例如,考虑下面的表:

以下查询选择所有列名中包含 a 符号的数据。

所选列的返回顺序不是按字母顺序排列。

您可以在查询中使用多个 COLUMNS 表达式并对它们应用函数。

例如:

每个通过 COLUMNS 表达式返回的列作为单独的参数传递给函数。如果该函数支持其他参数,您也可以将其他参数传递给它。使用函数时,请小心。如果一个函数不支持您传递的参数数量,ClickHouse 将抛出异常。

例如:

在这个例子中,COLUMNS('a') 返回两个列:aaabCOLUMNS('c') 返回 bc 列。+ 运算符无法应用于 3 个参数,因此 ClickHouse 抛出了一个相关的异常信息。

匹配 COLUMNS 表达式的列可以具有不同的数据类型。如果 COLUMNS 没有匹配任何列,并且是 SELECT 中唯一的表达式,ClickHouse 会抛出异常。

星号

您可以在查询中的任何位置放置一个星号来代替一个表达式。当查询被分析时,星号会扩展为所有表列的列表(不包括 MATERIALIZEDALIAS 列)。在以下少数情况下使用星号是合理的:

  • 创建表的转储。
  • 对于仅包含少数列的表,例如系统表。
  • 获取有关表中有哪些列的信息。在这种情况下,设置 LIMIT 1。但最好使用 DESC TABLE 查询。
  • 当使用 PREWHERE 对少数列进行强过滤时。
  • 在子查询中(因为不需要用于外部查询的列会从子查询中排除)。

在所有其他情况下,我们不建议使用星号,因为它只会让您获得列式 DBMS 的缺点,而不是优点。换句话说,不推荐使用星号。

极值

除了结果外,您还可以获取结果列的最小和最大值。为此,将 extremes 设置为 1。最小值和最大值是为数值类型、日期和时间戳计算的。对于其他列,输出默认值。

额外的两行被计算出来——分别是最小值和最大值。这两行在 XMLJSON*TabSeparated*CSV*VerticalTemplatePretty* 格式 中输出,与其他行分开输出。它们不会在其他格式中输出。

JSON*XML 格式中,极值输出在一个单独的 "extremes" 字段中。在 TabSeparated*CSV*Vertical 格式中,该行位于主结果之后,并在存在时位于 'totals' 之后。它前面有一行空行(在其他数据之后)。在 Pretty* 格式中,该行作为一个单独的表在主结果之后输出,并在存在时位于 totals 之后。在 Template 格式中,极值依据指定模板输出。

极值是在 LIMIT 之前计算的,但在 LIMIT BY 之后计算。然而,使用 LIMIT offset, size 时,offset 之前的行也包含在 extremes 中。在流请求中,结果可能还包括通过 LIMIT 的少量行。

说明

您可以在查询的任何部分使用同义词(AS 别名)。

GROUP BYORDER BYLIMIT BY 子句可以支持位置参数。要启用此功能,请打开 enable_positional_arguments 设置。然后,例如,ORDER BY 1,2 将按照第一列和第二列对表中的行进行排序。

实现细节

如果查询省略了 DISTINCTGROUP BYORDER BY 子句以及 INJOIN 子查询,则查询将完全以流方式处理,使用 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 中的表达式替代。

此修饰符不会更改列的名称或顺序。然而,它可以改变值和值类型。

语法:

示例:

修饰符组合

您可以单独使用每个修饰符或将它们组合在一起。

示例:

多次使用相同的修饰符。

在单个查询中使用多个修饰符。

SELECT 查询中的 SETTINGS

您可以直接在 SELECT 查询中指定必要的设置。设置值仅适用于该查询,并在查询执行后重置为默认值或先前值。

有关其他设置方式,请参见 这里

示例