在SQL查询语句中,当同时出现OR和AND运算符时,很多开发者会遇到查询结果和预期不符的情况,这本质上是没有正确处理运算符的优先级导致的。SQL中AND的运算优先级高于OR,混合使用时如果不通过括号明确优先级,数据库会先执行所有AND连接的条件,再执行OR连接的条件,很容易出现逻辑偏差。

OR和AND的默认优先级规则
SQL的运算符优先级有明确的规范,逻辑运算符中,NOT的优先级最高,其次是AND,最后是OR。也就是说,当一条查询语句中同时存在OR和AND时,数据库会优先计算所有AND连接的条件组合,再将得到的结果和OR连接的其他条件进行组合判断。
比如下面这个简单的条件组合:
WHERE 条件A OR 条件B AND 条件C
按照默认优先级,数据库实际执行的逻辑是:
WHERE 条件A OR (条件B AND 条件C)
而不是很多人直觉认为的(条件A OR 条件B) AND 条件C,这就是混合使用出错的核心原因。
常见错误场景示例
假设我们有一张用户表user_info,表结构如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | int | 用户ID |
| age | int | 用户年龄 |
| city | varchar | 用户所在城市 |
| vip_level | int | 用户会员等级,0表示非会员 |
现在需求是查询:年龄大于18岁,并且是北京的用户,或者是上海的高级会员(vip_level大于2)。如果直接按照直觉写查询语句:
SELECT * FROM user_info WHERE age > 18 OR city = '北京' AND vip_level > 2;
按照默认优先级,这条语句的实际逻辑是:查询年龄大于18岁的用户,或者所在城市是北京且会员等级大于2的用户。这和需求完全不符,需求要求的是(年龄大于18岁且是北京用户)或者(上海的高级会员),错误的语句会把所有年龄大于18岁的用户都查出来,不管城市和会员等级,显然不符合预期。
通过括号明确优先级的正确方法
要避免这类错误,只需要用括号把需要优先计算的条件组合括起来,强制改变运算优先级即可。针对上面的需求,正确的查询语句应该是:
SELECT * FROM user_info WHERE (age > 18 AND city = '北京') OR (city = '上海' AND vip_level > 2);
这里的括号明确指定了先分别计算两个AND组合的条件,再对两个结果做OR运算,完全符合需求逻辑。
更多示例说明
示例1:查询非会员的北京用户,或者所有上海用户
错误写法:
SELECT * FROM user_info WHERE vip_level = 0 OR city = '北京' AND city = '上海';
正确写法:
SELECT * FROM user_info WHERE (vip_level = 0 AND city = '北京') OR city = '上海';
示例2:查询年龄小于20岁,或者年龄大于40岁且是会员的用户
错误写法:
SELECT * FROM user_info WHERE age < 20 OR age > 40 AND vip_level > 0;
虽然这里默认优先级的结果和预期一致,但为了可读性,还是建议加上括号:
SELECT * FROM user_info WHERE age < 20 OR (age > 40 AND vip_level > 0);
总结建议
在SQL中混合使用OR和AND时,不管默认优先级是否符合预期,都建议主动加上括号明确条件组合的逻辑,这样既能避免优先级导致的错误,也能让其他开发者更容易理解查询逻辑。编写复杂查询时,可以先把逻辑拆分成小的条件组合,再用括号拼接,能有效减少出错概率。
SQLOR_AND混合使用括号优先级SQL逻辑错误查询条件修改时间:2026-06-16 13:42:35