# SELECT

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

语法

SELECT [DISTINCT [ON (column1, column2, ...)]] expr_list
[FROM [db.]table | (subquery) | table_function] [FINAL]
[SAMPLE sample_coeff]
[ARRAY JOIN ...]
[GLOBAL] [ANY|ALL|ASOF] [INNER|LEFT|RIGHT|FULL|CROSS] [OUTER|SEMI|ANTI] JOIN (subquery)|table (ON <expr_list>)|(USING <column_list>)
[PREWHERE expr]
[WHERE expr]
[GROUP BY expr_list] [WITH ROLLUP|WITH CUBE] [WITH TOTALS]
[HAVING expr]
[ORDER BY expr_list] [WITH FILL] [FROM expr] [TO expr] [STEP expr] [INTERPOLATE [(expr_list)]]
[LIMIT [offset_value, ]n BY columns]
[LIMIT [n, ]m] [WITH TIES]
[SETTINGS ...]
[UNION  ...]
[INTO OUTFILE filename [COMPRESSION type [LEVEL level]] ]
[FORMAT format]

# SELECT 查询

在上述描述的各个子句中完成所有操作后,SELECT 子句中指定的表达式将被计算。这些表达式的工作方式就好像它们应用于结果中的单独行一样。如果 SELECT 子句中的表达式包含聚合函数,则 Myscal 在 GROUP BY 聚合期间处理聚合函数和用作参数的表达式。

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

SELECT * FROM insert_table
SELECT *
FROM insert_table
Query id: 16064ddb-762f-4faf-9932-7f026ebbd6a6
┌─a─┬─b─┬─c─┐
│ 1 │ a │ 1 │
│ 1 │ a │ 2 │
│ 1 │ a │ 3 │
│ 2 │ a │ 3 │
│ 3 │ b │ 1 │
└───┴───┴───┘
5 rows in set. Elapsed: 0.002 sec.

# ORDER BY 子句

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

GROUP BY、ORDER BY 和 LIMIT BY 子句可以支持位置参数。例如,ORDER BY 1,2 将按照表中的第一列和第二列对行进行排序。以上面的 insert_table 表为例。

SELECT *
FROM insert_table
ORDER BY c ASC
Query id: 5976cd93-1714-466f-8acc-0a5b35efd22f
┌─a─┬─b─┬─c─┐
│ 1 │ a │ 1 │
│ 3 │ b │ 1 │
│ 1 │ a │ 2 │
│ 1 │ a │ 3 │
│ 2 │ a │ 3 │
└───┴───┴───┘
5 rows in set. Elapsed: 0.002 sec.

# WHERE 子句

您可以使用 WHERE 子句来过滤一些值,例如:

SELECT *
FROM insert_table
WHERE a = '1'
Query id: 273ac209-c4ca-4459-8314-3542913882ea
┌─a─┬─b─┬─c─┐
│ 1 │ a │ 1 │
│ 1 │ a │ 2 │
│ 1 │ a │ 3 │
└───┴───┴───┘
3 rows in set. Elapsed: 0.003 sec. 

# PREWHERE 子句

Prewhere 是一种优化方法,可以更高效地应用过滤。即使没有显式指定 PREWHERE 子句,它也会默认启用。它通过自动将 WHERE 条件的一部分移动到 prewhere 阶段来工作。PREWHERE 子句的作用仅在于控制此优化,如果您认为自己知道如何比默认情况下更好地执行此操作。

通过 prewhere 优化,首先只读取执行 prewhere 表达式所需的列。然后读取其他列,这些列仅在 prewhere 表达式至少对某些行为真时才需要运行查询的其余部分。如果有很多块中 prewhere 表达式对所有行都为假,并且 prewhere 需要的列少于查询的其他部分,这通常可以减少从磁盘读取的数据量,以执行查询。

# 手动控制 Prewhere

该子句与 WHERE 子句的含义相同。区别在于从表中读取的数据。当手动控制 PREWHERE 用于查询中少数列使用的过滤条件,但提供了强大的数据过滤时。这减少了要读取的数据量。

查询可以同时指定 PREWHERE 和 WHERE。在这种情况下,PREWHERE 在 WHERE 之前执行。

如果将 optimize_move_to_prewhere 设置为 0,则禁用自动将表达式的部分从 WHERE 移动到 PREWHERE 的启发式方法。

如果查询具有 FINAL 修饰符,则 PREWHERE 优化并不总是正确的。只有在同时打开 optimize_move_to_prewhere 和 optimize_move_to_prewhere_if_final 两个设置时才启用它。

# 其他

有关与向量相关的 select 语句,请参阅:基本向量搜索

Last Updated: Fri Nov 01 2024 09:02:06 GMT+0000