and要求所有条件同时成立,or满足任一即可;混合使用必须加括号明确逻辑优先级,避免因默认and>or导致结果错误。

AND 和 OR 不是“选一个用”,而是按业务逻辑决定组合方式;写错优先级或漏括号,查出来的数据可能完全不对,而且你还不一定能立刻发现。
AND 要求所有条件同时成立
适合“必须同时满足多个约束”的场景,比如查“华东区、2023年、金额超5000”的订单。
-
WHERE region = '华东' AND YEAR(order_date) = 2023 AND amount > 5000—— 三者缺一不可 - 如果误写成
WHERE region = '华东' OR YEAR(order_date) = 2023 AND amount > 5000,实际等价于region = '华东' OR (YEAR(order_date) = 2023 AND amount > 5000),结果会多出大量非华东但满足后两个条件的记录 - 字段值不能自相矛盾:比如
WHERE status = '已发货' AND status = '已签收'永远返回空,因为单行 status 不可能同时是两个值
OR 用于“满足任一即可”的宽松筛选
常用于枚举类字段的多选,比如状态、类型、区域等。
-
WHERE status = '已发货' OR status = '已签收'是合法且常见的写法 - 但同一字段多个
OR等值判断,应优先改用IN:把上面改成status IN ('已发货', '已签收')更简洁、可读性高、多数引擎优化更好 - 注意
OR本身不带隐式分组:WHERE a = 1 OR b = 2 AND c = 3实际执行顺序是a = 1 OR (b = 2 AND c = 3),不是你想的(a = 1 OR b = 2) AND c = 3
混合使用 AND 和 OR 必须加括号
这是最容易出错的地方——不加括号时,SQL 按固定优先级(AND > OR)解析,而不是按你读句子的直觉。
- 错误写法:
WHERE status = '已发货' OR status = '已签收' AND region = '华东'→ 返回“所有已发货订单” + “华东区已签收订单”,不是“华东区的所有已发货或已签收订单” - 正确写法:
WHERE (status = '已发货' OR status = '已签收') AND region = '华东' - 更复杂逻辑也一样:比如“(A且B)或(C且D)”,必须写成
(A AND B) OR (C AND D),括号不能省
动态查询中容易忽略的字段重复问题
从 Web 表单接收多选参数(如 category 多选)时,直接拼 AND category = 'A' AND category = 'B' 是典型错误。
- 这种写法永远查不到数据,因为单行
category只能存一个值 - 正确做法是收集所有选中的值,生成
category IN ('A', 'B')或(category = 'A' OR category = 'B') - 如果混用不同字段的多选(比如 category 和 type),每个字段的多选条件各自用括号包住:
AND (category IN (...)) AND (type IN (...))
真正麻烦的不是语法记不住,而是查出来数据“看起来差不多”,但漏了关键行或混入了不该有的行——尤其在报表或导出场景下,这种错误可能拖到下游才发现。











