MySQL - WHERE子句中的多个等价物

时间:2015-08-18 03:39:04

标签: mysql where equivalence

我想知道MySQL中以下两个WHERE子句之间是否存在差异:

WHERE a.Id = b.Id = c.Id

VS

WHERE a.Id = b.Id and b.Id = c.Id

我在以下SQLFiddle中获得了这两个查询的不同结果:http://sqlfiddle.com/#!2/725396/3

2 个答案:

答案 0 :(得分:4)

根据MySQL doco for an expression,您的表达式a = b = c使用以下boolean_primary形式:

comparison_operator: = | >= | > | <= | < | <> | !=
boolean_primary:
    boolean_primary comparison_operator predicate

因此相当于:

(a = b) = c

这意味着您将从a = b获取真实值,然后将 c进行比较。

在MySQL中,boolean类型为equivalent to tinyint(1),其中0为false,其他任何内容均为true。因此,它只是一个可以与另一个进行比较的整数值。

此外,比较表达式的结果,例如a = b will always return 0表示false,1表示true,如果有任何输入则为NULL是NULL。

因此,对于表达式a = b = c为true,它们都不允许为NULL,并且以下之一必须为true:

  • a等于bc等于1;或
  • a不等于bc等于0

这几乎肯定不是你想要的,正确的形式是第二个。

答案 1 :(得分:0)

我认为不同之处在于,在第一个WHERE中,所有三个id必须相等,而后者a.id应该等于b.id而b.id应该等于c.id但它不是意味着a.id应该等于c.id。