您好!欢迎访问家园网-www.jy.wang!

家园网

SQL 运算符的优先级:AND 优先级高于 OR

网络 作者:本站 点击:

下面两个代码执行的顺序有何不同?


第一个:


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);

逻辑含义:

  • 满足 条件Acat_id = 191(无论价格多少)

  • 或者 满足 条件Bcat_id = 123 并且 shop_price > 2000

查询结果会包含:

  1. 所有 cat_id = 191 的商品(不管价格是10元还是10000元)

  2. 以及 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;  -- 如果这是你想要的


标签: