下面两个代码执行的顺序有何不同?
第一个:
SELECT cat_id,goods_name,shop_price FROM goods WHERE cat_id = 191 OR cat_id = 123 AND shop_price > 2000;
第二个:
SELECT cat_id,goods_name,shop_price FROM goods WHERE (cat_id = 191 OR cat_id = 123) AND shop_price > 2000;
这两个查询的执行结果可能完全不同,核心原因在于 SQL 运算符的优先级:AND 优先级高于 OR(类似于数学中乘除优先于加减)。
优先级规则
AND优先级 >OR优先级相当于:
AND像乘法(*),OR像加法(+)
第一个查询(无括号)
sql
WHERE cat_id = 191 OR cat_id = 123 AND shop_price > 2000;
由于 AND 优先级更高,等价于:
sql
WHERE cat_id = 191 OR (cat_id = 123 AND shop_price > 2000);
逻辑含义:
满足 条件A:
cat_id = 191(无论价格多少)或者 满足 条件B:
cat_id = 123并且shop_price > 2000
查询结果会包含:
所有
cat_id = 191的商品(不管价格是10元还是10000元)以及
cat_id = 123中价格大于2000元的商品
第二个查询(有括号)
sql
WHERE (cat_id = 191 OR cat_id = 123) AND shop_price > 2000;
括号强制 OR 先执行,等价于:
sql
WHERE (cat_id = 191 OR cat_id = 123) AND shop_price > 2000;
逻辑含义:
先找出
cat_id是 191 或 123 的商品再从中筛选出
shop_price > 2000的商品
查询结果会包含:
只有
cat_id = 191或cat_id = 123并且同时 价格大于2000元的商品
实际对比示例
假设 goods 表有以下数据:
cat_id | goods_name | shop_price |
191 | 便宜商品A | 100 |
191 | 昂贵商品B | 3000 |
123 | 便宜商品C | 100 |
123 | 昂贵商品D | 3000 |
456 | 其他商品E | 3000 |
第一个查询结果(无括号):
便宜商品A(191,100元)✅
昂贵商品B(191,3000元)✅
昂贵商品D(123,3000元)✅
便宜商品C(123,100元)❌(不满足价格>2000)
其他商品E ❌
第二个查询结果(有括号):
昂贵商品B(191,3000元)✅
昂贵商品D(123,3000元)✅
便宜商品A ❌(价格不满足)
便宜商品C ❌(价格不满足)
其他商品E ❌
核心差异总结
查询 | cat_id=191 且价格≤2000 | cat_id=123 且价格≤2000 | cat_id=123 且价格>2000 |
第一个(无括号) | ✅ 返回 | ❌ 不返回 | ✅ 返回 |
第二个(有括号) | ❌ 不返回 | ❌ 不返回 | ✅ 返回 |
简单记忆:
第一个:191 全要,123 只要贵的
第二个:191 和 123 都只要贵的
最佳实践建议
永远使用括号明确逻辑优先级,即使你觉得默认顺序正确
这样能让代码更易读,也避免因优先级理解错误导致的 bug
sql
-- 推荐写法(明确意图)WHERE cat_id = 191 OR (cat_id = 123 AND shop_price > 2000); -- 如果这是你想要的WHERE (cat_id = 191 OR cat_id = 123) AND shop_price > 2000; -- 如果这是你想要的