多个WHERE条件必须用AND/OR显式连接,不可省略;AND表示全满足,OR表示任一满足;混合使用需加括号明确优先级;IN支持单字段或多字段元组匹配;LIKE和函数条件易致索引失效,应避免对字段计算。

多个 WHERE 条件必须用 AND 或 OR 显式连接,不能靠空格或换行隐式组合 —— 否则会报语法错误或返回意外结果。
WHERE 后多个条件必须用 AND/OR 连接
SQL 不支持把多个条件并列写在 WHERE 后面却不加逻辑运算符。比如 WHERE a = 1 b > 2 是非法的,数据库会直接报错 syntax error near 'b' 或类似提示。
-
AND表示“全部满足”,常用于权限校验、状态+用户双重过滤(如status = 'EXPIRED' AND user.username = 'alice') -
OR表示“满足任一”,适合多选一场景(如type IN ('book', 'magazine') OR category = 'new') - 混合使用时务必加括号明确优先级:不写括号时
AND优先级高于OR,容易漏掉预期行
IN 和 (col1, col2) IN 适用于离散值组合匹配
当需要匹配“字段 A 是 X 且字段 B 是 Y”这种成对条件时,IN 配合元组写法比堆砌 OR 更清晰安全。
- 单字段多值:用
WHERE status IN ('EXPIRED', 'OVERDUE') - 多字段组合:用
WHERE (a, b) IN ((1, 'x'), (2, 'y')),PostgreSQL 和 MySQL 8.0+ 支持,但 SQLite 不支持该语法 - 别写成
WHERE a = 1 AND b = 'x' OR a = 2 AND b = 'y'—— 没括号极易因优先级出错
LIKE 和函数条件容易拖慢查询,要提前评估索引有效性
带 LIKE 或函数的条件(如 TRIM(name) = 'Alice')很可能让索引失效,尤其在大数据量表中。
-
LIKE 'prefix%'可走索引;LIKE '%suffix'或LIKE '%middle%'基本触发全表扫描 - 避免在 WHERE 中对字段做计算:
YEAR(created_at) = 2025→ 改用created_at >= '2025-01-01' AND created_at - 如果必须模糊查中间段,考虑全文索引或应用层分词,而不是硬扛
LIKE '%...%'
NULL 判断不能用 =,必须用 IS NULL 或 IS NOT NULL
WHERE column = NULL 永远不成立 —— 因为 NULL 与任何值(包括自身)比较都返回 UNKNOWN,被 WHERE 当作假值过滤掉。
- 正确写法是
WHERE column IS NULL或WHERE column IS NOT NULL - 若需同时处理
NULL和具体值,可用COALESCE(column, 'default') = 'target',但注意这也会使索引失效 - 联合条件里混入
IS NULL时,检查执行计划,确认是否仍能利用索引(例如status = 'active' AND deleted_at IS NULL通常可走复合索引)
真正麻烦的不是写多个条件,而是每个条件背后的隐式类型转换、NULL 处理和索引覆盖情况 —— 这些不看执行计划(EXPLAIN)根本没法验证。

















