2011-08-22 97 views
1

任何解释下面的疑问:Mysql的优先逻辑

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 

我知道在优先(()有优先权,但为什么我应该添加他们的查询的第一部分?

纠正我,如果我错了

谢谢

回答

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部分。

Operator precedence in MySQL

1

因为不确定性是不希望特质?

此外,优化程序会重新排列您的WHERE条件,如果它认为它会表现更好。因此,根据首先评估的方式/方式,您的含糊不清会导致不同的结果。

始终明确您的意图。

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 

因此很明显,结果可能会大不相同。