AND用于所有条件必须同时成立,OR用于满足任一条件即可;混合使用时AND优先级高于OR,需加括号明确逻辑;IN仅适用于单字段多值匹配,多字段约束必须用AND;NULL参与比较结果为UNKNOWN,会被WHERE过滤,NOT IN遇NULL则恒为UNKNOWN导致空结果。

WHERE里多个条件该用AND还是OR
用AND还是OR取决于你要表达的逻辑关系:所有条件都必须成立,选AND;只要满足其中任一条件,选OR。写反了结果会完全错,而且往往查不出数据或查出一堆无关行。
-
AND是“交集”:比如WHERE status = 'active' AND created_at >= '2026-01-01',只返回既活跃、又在今年创建的记录 -
OR是“并集”:比如WHERE country = 'CN' OR country = 'US',返回所有中美国籍用户 - 混合使用时,
AND优先级高于OR,不加括号容易出错。例如WHERE a = 1 OR b = 2 AND c = 3等价于WHERE a = 1 OR (b = 2 AND c = 3),不是你想的(a = 1 OR b = 2) AND c = 3
IN和多个等值条件怎么选
IN本质是多个=用OR连接的简写,但它只适合单字段匹配多个离散值;想对同一行多个字段同时约束,必须用AND,不能硬套IN。
- ✅ 正确:查国家代码为
'CN'、'US'、'JP'的网站——WHERE country IN ('CN', 'US', 'JP') - ❌ 错误:想查
alexa在1–10之间且country = 'CN',却写成WHERE alexa IN (1,2,3,4,5,6,7,8,9,10) AND country IN ('CN')——语法没错,但可读性差、维护难,应直接用BETWEEN和= - ⚠️ 特别注意:
IN遇到NULL会整体失效。如果右边列表含NULL(如IN (1, 2, NULL)),整个条件变UNKNOWN,该行被过滤掉。线上常见坑是子查询没加IS NOT NULL校验
多条件组合时NULL值怎么处理
SQL用三值逻辑(TRUE/FALSE/UNKNOWN),任何与NULL的比较(=、!=、>等)都返回UNKNOWN,而WHERE只保留TRUE行,UNKNOWN等同于FALSE被丢弃。
- 查非空邮箱用户,不能写
WHERE email != '',因为email IS NULL的行也会被漏掉;得写WHERE email IS NOT NULL AND email != '' - 想把
NULL和空字符串都排除,用WHERE COALESCE(email, '') != ''更简洁(COALESCE返回第一个非NULL值) - 用
NOT IN时风险更高:只要子查询结果里有一个NULL,整条NOT IN判断就恒为UNKNOWN,结果集为空——这种bug很难复现,建议改用NOT EXISTS
子查询做多条件过滤时最容易踩的坑
很多人以为WHERE col IN (子查询)能实现“多条件”,其实子查询本身才是承载复合逻辑的地方;外层IN只是做最后的单列匹配。
- 子查询必须只返回一列,否则报错
subquery returns more than one column。哪怕你加了LIMIT 1,只要SELECT写了两列,照样失败 - 子查询结果为空,外层查询返回空集——这是标准行为,不是bug,但常被误认为SQL写错了
- 要实现“一个用户同时满足多个标签”,比如“既是VIP又最近登录过”,不能写两个
IN,而要在子查询里JOIN用户表和日志表,用WHERE u.is_vip = 1 AND l.action = 'login'压进同一层 - 涉及多对多关系(如食谱含多种食材),“必须同时包含全部指定项”不能靠
IN,得用GROUP BY + HAVING COUNT(DISTINCT ...)或嵌套EXISTS
AND或IN;一旦出现结果不符预期,优先检查子查询是否真返回了你想象中的那列值,以及有没有隐式NULL干扰逻辑。

















