PostgreSQL WHERE 条件过滤教程
WHERE 子句在读取数据 后、分组前对行进行过滤,是使用频率最高的 SQL 组件。本篇系统梳理条件表达式的写法与常见陷阱。
本篇内容
- 比较运算符与逻辑组合(AND / OR / NOT)
- IN、BETWEEN、LIKE / ILIKE、IS NULL
- 运算符优先级与括号
- NULL 参与比较的特殊性
比较与逻辑组合
SELECT id, name, age, status FROM users
WHERE age >= 18 AND status = 1;
-- 括号改变优先级:(a OR b) AND c
SELECT id, name FROM users
WHERE (status = 1 OR status = 2) AND age < 30;
常用条件运算符
-- IN:多值匹配(等价于 OR 的集合形式)
SELECT id, name FROM users WHERE status IN (1, 2, 3);
-- BETWEEN:闭区间,包含两端
SELECT id, amount FROM orders WHERE amount BETWEEN 100 AND 1000;
-- LIKE:% 匹配任意长度,_ 匹配单个字符
SELECT id, name FROM users WHERE name LIKE '张%';
-- ILIKE:忽略大小写
SELECT id, name FROM users WHERE email ILIKE '%@example.com';
NULL 判断
-- NULL 只能用 IS NULL / IS NOT NULL 判断
SELECT id, name FROM users WHERE deleted_at IS NULL;
-- ❌ = NULL 永远不成立,不会匹配任何行
待补充(TODO)
- 补充:LIKE 模式中的特殊字符转义(% 和 _ 作为字面量)
- 补充:三值逻辑表(TRUE / FALSE / NULL 组合的结果)与 NOT IN 遇 NULL 的陷阱
- 补充:正则匹配(~ / ~* / SIMILAR TO)与全文检索的边界
- 补充:条件列的选择性与索引使用的关系(哪些 WHERE 能走索引)