Mysql Precedence Logic

时间:2011-08-22 18:43:56

标签: mysql operators logic

对以下查询的任何解释:

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 个答案:

答案 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 :(得分: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

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