在 SQL 条件查询中,AND
的优先级高于 OR
,这是导致逻辑错误的最常见陷阱。以下是详细说明:
⚠️ 优先级规则
-- 默认优先级:AND > OR
WHERE 条件A OR 条件B AND 条件C
-- 实际等价于 →
WHERE 条件A OR (条件B AND 条件C)
🔍 通过示例理解
数据表 employees
id | name | dept | salary | status |
---|---|---|---|---|
1 | 张三 | 研发 | 8000 | active |
2 | 李四 | 市场 | 12000 | active |
3 | 王五 | 研发 | 15000 | inactive |
❌ 错误写法(未用括号)
SELECT * FROM employees
WHERE dept = '研发'
OR dept = '市场'
AND status = 'active';
执行顺序:
返回结果:
id | name | dept | salary | status |
---|---|---|---|---|
1 | 张三 | 研发 | 8000 | active |
2 | 李四 | 市场 | 12000 | active |
王五被过滤:因为不满足 (dept='市场' AND status='active') |
✅ 正确写法(显式加括号)
SELECT * FROM employees
WHERE (dept = '研发' OR dept = '市场') -- 先合并 OR 条件
AND status = 'active'; -- 再执行 AND
返回结果:
id | name | dept | salary | status |
---|---|---|---|---|
1 | 张三 | 研发 | 8000 | active |
2 | 李四 | 市场 | 12000 | active |
王五仍被过滤:因为 status='inactive' |
🛡️ 最佳实践:永远显式使用括号
即使你认为优先级正确,也强制用括号明确分组逻辑:
-- 清晰安全的写法
WHERE (条件A OR 条件B)
AND (条件C OR 条件D)
⚡ 优先级完整规则
- 最高优先级:
()
- 比较运算符:
=
,>
,<
,<>
等 - 逻辑运算符:
NOT
AND
OR
(最低优先级)
💡 复杂条件示例
-- 目标:研发部所有员工 + 市场部的活跃员工
WHERE dept = '研发'
OR (dept = '市场' AND status = 'active')
-- 错误等价写法(因优先级产生的陷阱):
WHERE dept = '研发' OR dept = '市场' AND status = 'active'
-- 实际会漏掉研发部非活跃员工!
📌 核心结论:
只要混用AND
和OR
,必须用( )
明确分组逻辑,避免依赖默认优先级导致业务逻辑错误。