跳至主要内容

WHERE 子句

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

如果存在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 │
└───┴───┘