sql中and优先级高于or,not仅作用于紧邻的单个条件;混用时必须用括号显式分组,否则易导致逻辑错误和数据偏差。

因为不理解运算符优先级,WHERE 条件会按 SQL 的默认顺序求值,而不是你“以为”的顺序——结果可能漏数据、多数据,甚至完全偏离业务逻辑。
AND 和 OR 混用时,默认执行顺序是 AND 先于 OR
这是最常踩坑的点。SQL 不会按从左到右读语句,而是严格按优先级:先算所有 AND,再把结果跟 OR 合并。
- 错误写法:
WHERE status = 'active' OR status = 'pending' AND amount > 1000 - 实际等价于:
WHERE status = 'active' OR (status = 'pending' AND amount > 1000) - 后果:所有
status = 'active'的记录都会被查出来,哪怕amount是 0 或 NULL - 正确做法:用括号显式分组,比如
WHERE (status = 'active' OR status = 'pending') AND amount > 1000
NOT 会作用在紧邻的下一个条件上,不是整段
NOT 优先级高于 AND 和 OR,但它只否定它后面**第一个原子条件**,不会自动包裹整个右侧表达式。
- 危险写法:
WHERE NOT status = 'archived' AND created_at > '2025-01-01' - 它等价于:
WHERE (NOT status = 'archived') AND created_at > '2025-01-01'—— 这没问题 - 但若写成:
WHERE NOT status = 'archived' OR status = 'draft' - 实际是:
WHERE (NOT status = 'archived') OR status = 'draft',不是你想的NOT (status = 'archived' OR status = 'draft') - 一旦逻辑变复杂,必须加括号,否则
NOT的作用域极易误判
嵌套括号比记忆优先级更可靠
人脑记不住所有层级,尤其当条件里混入 BETWEEN、IN、函数调用或子查询时,优先级规则会迅速失效。
-
IN和LIKE与AND/OR同属第 7 级,但它们内部不参与跨操作符比较,容易产生歧义 - 示例:
WHERE name LIKE 'A%' OR name IN ('Bob', 'Charlie') AND age > 30→ 实际是(name LIKE 'A%') OR (name IN (...) AND age > 30) - 只要条件超过两个,就该默认加括号;哪怕只有一处
AND,只要它和OR出现在同一WHERE,就值得加 - 工具不救你:SQL Server、MySQL、PostgreSQL 都遵循相同优先级规则,但报错不会提示“你少写了括号”,只会默默返回错数据
真正难的不是记住 NOT > AND > OR,而是在写完 WHERE 之后,下意识停半秒,问自己:“这个括号,是不是我脑子想的那个意思?”——多数线上 bug,都死在这半秒的省略上。











