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

WHERE 子句

WHERE 子句允许过滤来自 FROM 子句的 SELECT 数据。

如果存在 WHERE 子句,它必须包含一个表达式,其类型为 UInt8。这通常是包含比较和逻辑运算符的表达式。此表达式求值为 0 的行将从后续转换或结果中排除。

WHERE 表达式的评估取决于是否可以使用索引和分区裁剪,如果底层表引擎支持这些功能。

注意

存在一种称为 PREWHERE 的过滤优化。

如果您需要测试一个值是否为 NULL,请使用 IS NULLIS NOT NULL 运算符或 isNullisNotNull 函数。否则,包含 NULL 的表达式永远不会通过。

示例

要在 numbers 表上查找 3 的倍数且大于 10 的数字,请执行以下查询

SELECT number FROM numbers(20) WHERE (number > 10) AND (number % 3 == 0);

结果

┌─number─┐
│ 12 │
│ 15 │
│ 18 │
└────────┘

包含 NULL 值的查询

CREATE TABLE t_null(x Int8, y Nullable(Int8)) ENGINE=MergeTree() ORDER BY x;
INSERT INTO t_null VALUES (1, NULL), (2, 3);

SELECT * FROM t_null WHERE y IS NULL;
SELECT * FROM t_null WHERE y != 0;

结果

┌─x─┬────y─┐
│ 1 │ ᴺᵁᴸᴸ │
└───┴──────┘
┌─x─┬─y─┐
│ 2 │ 3 │
└───┴───┘