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

WHERE 子句

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

如果存在 WHERE 子句,它必须包含一个 UInt8 类型的表达式。这个表达式通常使用比较和逻辑运算符。该表达式评估为 0 的行将被排除在进一步的转换或结果之外。

WHERE 表达式的评估依赖于是否能够使用索引和分区裁剪,前提是底层表引擎支持这些功能。

备注

有一个名为 PREWHERE 的过滤优化。

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

示例

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

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 │
└───┴───┘