WHERE 子句
WHERE
子句允许过滤来自SELECT
语句的 FROM 子句的数据。
如果存在WHERE
子句,则它必须包含一个类型为UInt8
的表达式。这通常是一个包含比较和逻辑运算符的表达式。此表达式计算结果为0
的行将从后续转换或结果中排除。
WHERE
表达式会在能够使用索引和分区剪枝的情况下进行评估,前提是底层表引擎支持这些功能。
注意
有一种称为 PREWHERE 的过滤优化。
如果您需要测试某个值的 NULL 值,请使用 IS NULL 和 IS NOT NULL 运算符,或 isNull 和 isNotNull 函数。否则,包含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 │
└───┴───┘