sql中and优先级高于or,混合使用时必须加括号明确逻辑分组,否则如a=1 or b=2 and c=3实际解析为a=1 or (b=2 and c=3),易导致漏数据或误过滤。

AND 和 OR 没括号时到底怎么算
SQL 里 AND 优先级高于 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的条件,只要逻辑不是纯线性(比如全是AND),就该加括号 - 数据库不管方言(MySQL/PostgreSQL/SQL Server)都遵守这个优先级,别指望它“智能猜意图”
- 用 EXPLAIN 看执行计划也看不出括号是否合理,得靠人工验证逻辑
用括号把业务逻辑显式分组
括号不是为了“语法正确”,而是让 SQL 和你的需求对齐。比如查“北京的男用户,或者上海的VIP用户”,不能靠空格和换行暗示分组。
WHERE (city = '北京' AND gender = '男') OR (city = '上海' AND is_vip = true)- 如果漏掉外层括号:
WHERE city = '北京' AND gender = '男' OR city = '上海' AND is_vip = true,虽然结果可能碰巧对,但可读性归零,后续加条件极易出错 - 嵌套三层以上时,宁可拆成子查询或 CTE,也别堆括号——人脑不擅长解析
((a AND b) OR (c AND (d OR e)))
NOT 和括号搭配容易翻车
NOT 作用范围常被低估。写 NOT a = 1 OR b = 2,实际是 (NOT a = 1) OR b = 2,几乎肯定不是你想要的。
- 否定复合条件必须包住整个逻辑:用
NOT (a = 1 OR b = 2),而不是NOT a = 1 OR b = 2 -
NOT IN遇到 NULL 会整体返回空结果,这和括号无关,但常和 OR 混用后加剧问题;遇到 NULL 安全需求,优先考虑NOT EXISTS - 某些 ORM 自动生成的 WHERE 子句会悄悄加
NOT,检查生成 SQL 时重点盯括号位置
用格式化工具暴露隐性逻辑风险
靠肉眼对齐缩进没法发现优先级陷阱。真正有用的是把 SQL 喂给格式化器,看它如何自动加括号。
- 用 sqlformat.org 或编辑器插件(如 VS Code 的 SQL Formatter)粘贴语句,观察它是否主动补了你没写的括号
- 如果工具把
A OR B AND C格式化成A OR (B AND C),说明你原本的写法确实存在歧义 - CI 流程里加一步 SQL lint(如
sqlfluff),规则L017就专抓缺少必要括号的AND/OR混用
逻辑重叠本身不可怕,可怕的是你以为加了空格、换了行,SQL 就懂你意思了。括号不是装饰,是契约——写下的每一组括号,都在明确告诉数据库:“这里起,这里止,别自己发挥”。










