为何未加括号与带括号的两个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的结合律:
AND优先级高于OR:SQL会优先处理所有AND连接的条件,再处理OR。所以第一个查询的WHERE子句会被自动分组为:
(1=1 AND year(OrderDate)=1998 AND MONTH(OrderDate)=5) OR (year(OrderDate)=1997 AND MONTH(OrderDate)=4)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
相关产品推荐
相关产品推荐

