You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何未加括号与带括号的两个SQL查询输出结果一致?

为什么两个SQL查询结果一致?

先看你给出的两个查询:

第一个查询:

SELECT *
FROM [dbo].[Orders]
where 1=1
AND year(OrderDate) = 1998 
AND MONTH(OrderDate) = 5
OR year(OrderDate) = 1997
AND MONTH(OrderDate) = 4 

第二个查询:

SELECT *
FROM [dbo].[Orders]
where 1=1
AND (year(OrderDate) = 1998 AND MONTH(OrderDate) = 5)
OR (year(OrderDate) = 1997 AND MONTH(OrderDate) = 4)

核心原因在于SQL运算符的优先级和AND的结合律:

  1. AND优先级高于OR:SQL会优先处理所有AND连接的条件,再处理OR。所以第一个查询的WHERE子句会被自动分组为:

    (1=1 AND year(OrderDate)=1998 AND MONTH(OrderDate)=5) OR (year(OrderDate)=1997 AND MONTH(OrderDate)=4)
    
  2. AND满足结合律:多个用AND连接的条件,无论怎么添加括号分组,逻辑结果都完全一致。比如1=1 AND (A AND B)和(1=1 AND A) AND B是等价的,最终都是要求三个条件同时成立。

这就导致两个查询的筛选逻辑完全相同:要么是1998年5月的订单(同时满足1=1这个恒真条件),要么是1997年4月的订单,所以查询结果自然一致。

不过要注意:虽然这次结果一致,但仅靠运算符优先级写复杂条件很容易出错,一旦条件逻辑变复杂(比如OR两边的条件混合更多AND/OR),很容易写出和预期不符的语句。建议始终用括号明确分组逻辑,既提高可读性,也能避免逻辑错误。

内容的提问来源于stack exchange,提问作者doron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:40:35