WHERE 子句允许你过滤 SELECT 的 FROM 子句返回的数据。
如果存在 WHERE 子句,其后必须跟一个 UInt8 类型的表达式。
表达式求值结果为 0 的行会被排除,不再参与后续转换或最终结果。
WHERE 子句后的表达式通常会结合比较运算符和逻辑运算符使用,或者使用众多常规函数中的一种。
如果底层表引擎支持,系统在计算 WHERE 表达式时会利用索引和分区裁剪能力。
PREWHERE还有一种名为
PREWHERE 的过滤优化。
Prewhere 是一种能更高效执行过滤的优化机制。
即使未显式指定 PREWHERE 子句,它默认也是启用的。判断 NULL
NULL,请使用:
否则,包含 NULL 的表达式将永远不会成立。
使用逻辑运算符过滤数据
WHERE 子句配合使用,以组合多个条件:
将 UInt8 列用作条件
UInt8 列可直接用作布尔条件,其中 0 表示 false,任何非零值 (通常为 1) 都表示 true。
相关示例见下文。
使用比较运算符
| 运算符 | 函数 | 描述 | 示例 |
|---|---|---|---|
a = b | equals(a, b) | 等于 | price = 100 |
a == b | equals(a, b) | 等于 (替代语法) | price == 100 |
a != b | notEquals(a, b) | 不等于 | category != 'Electronics' |
a <> b | notEquals(a, b) | 不等于 (替代语法) | category <> 'Electronics' |
a < b | less(a, b) | 小于 | price < 200 |
a <= b | lessOrEquals(a, b) | 小于或等于 | price <= 200 |
a > b | greater(a, b) | 大于 | price > 500 |
a >= b | greaterOrEquals(a, b) | 大于或等于 | price >= 500 |
a LIKE s | like(a, b) | 模式匹配 (区分大小写) | name LIKE '%top%' |
a NOT LIKE s | notLike(a, b) | 模式不匹配 (区分大小写) | name NOT LIKE '%top%' |
a ILIKE s | ilike(a, b) | 模式匹配 (不区分大小写) | name ILIKE '%LAPTOP%' |
a BETWEEN b AND c | a >= b AND a <= c | 范围检查 (包含边界) | price BETWEEN 100 AND 500 |
a NOT BETWEEN b AND c | a < b OR a > c | 范围外检查 | price NOT BETWEEN 100 AND 500 |
模式匹配和条件表达式
WHERE 子句中使用模式匹配和条件表达式。
| Feature | Syntax | Case-Sensitive | Performance | Best For |
|---|---|---|---|---|
LIKE | col LIKE '%pattern%' | Yes | Fast | 区分大小写的精确模式匹配 |
ILIKE | col ILIKE '%pattern%' | No | Slower | 不区分大小写的搜索 |
if() | if(cond, a, b) | N/A | Fast | 简单条件判断 |
multiIf() | multiIf(c1, r1, c2, r2, def) | N/A | Fast | 多条件判断 |
CASE | CASE WHEN ... THEN ... END | N/A | Fast | 符合 SQL 标准的条件逻辑 |
包含字面量、列或子查询的表达式
WHERE 子句后面的表达式也可以包含字面量、列或子查询。子查询是嵌套的 SELECT 语句,会返回在条件中使用的值。
| 类型 | 定义 | 求值时机 | 性能 | 示例 |
|---|---|---|---|---|
| Literal | 固定常量值 | 编写查询时 | 最快 | WHERE price > 100 |
| Column | 表数据引用 | 按行求值 | 快 | WHERE price > cost |
| Subquery | 嵌套的 SELECT | 查询执行时 | 视情况而定 | WHERE id IN (SELECT ...) |
示例
判断 NULL
NULL 值的查询:
使用逻辑运算符过滤数据
AND - 两个条件都必须成立:
OR - 至少有一个条件必须成立:
NOT - 对条件取反:
XOR - 必须恰好只有一个条件为真 (不能同时都为真) :
AND、OR、NOT、XOR) 通常更易于阅读,但在复杂表达式中或构建动态查询时,函数语法也很有用。
将 UInt8 列用作条件
使用比较运算符
= 1 或 = true) :
= 0 或 = false) :
!= 0 或 != false) :
IN 运算符:
在下面的示例中,(1, true) 是一个元组。