相关文章推荐
帅呆的篮球  ·  子查詢 (SQL Server) - ...·  2 月前    · 
豪爽的热水瓶  ·  How to export a Hive ...·  1 月前    · 
大气的扁豆  ·  PyQt5 ...·  3 月前    · 
激动的书包  ·  Now, Today, IsToday, ...·  2 年前    · 
博学的警车  ·  c++ - Opening fstream ...·  2 年前    · 
开朗的山楂  ·  pandas添加标题行-掘金·  2 年前    · 
跳到主要内容

SELECT 查询

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 ...

    动态列选择

    动态列选择(也称为 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 中的表达式替代。

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

    修饰符组合

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

    多次使用相同的修饰符。

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