对以下查询的任何解释:
Select x FROM y WHERE a = 1 OR a = 2 AND (b = 1 OR b = 2)
为什么在返回正确的信息时它不会返回正确的信息:
Select x FROM y WHERE (a = 1 OR a = 2) AND (b = 1 OR b = 2)
我在这里遗漏了什么吗?
X Y (X OR Y) X OR Y
1 0 1 1
0 1 1 1
1 1 1 1
0 0 0 0
我知道在优先级方面()具有优先级,但为什么我要将它们添加到查询的第一部分?
如果我错了,请纠正我
谢谢
答案 0 :(得分:3)
AND
的优先级高于OR
,因此您的第一个查询等效于此:
Select x FROM y WHERE a = 1 OR a = 3 OR (a = 2 AND (b = 1 OR b = 2))
这不等于
Select x FROM y WHERE (a = 1 OR a = 2 OR a = 3) AND (b = 1 OR b = 2)
我猜您在第一次查询中忘记了a = 3
部分。
答案 1 :(得分:1)
因为歧义是一种不受欢迎的特质?
此外,如果优化程序认为它会表现更好,它将重新排序您的WHERE条件。因此,您的歧义将导致不同的结果,具体取决于它首先评估的方式/内容。
始终明确表达你的意图。
答案 2 :(得分:1)
在WHERE子句中使用括号不仅会影响优先级,还会将谓词组合在一起。在您的示例中,结果的差异更多的是分组而不是优先级。
您可以想到:(pN =谓词表达式)
WHERE a = 1 OR a = 2 AND (b = 1 OR b = 2)
为:
WHERE p1 OR p2 AND p3
而且:
WHERE (a = 1 OR a = 2 OR a = 3) AND (b = 1 OR b = 2)
为:
WHERE p1 AND p2
因此很明显,结果可能会大不相同。