Mysql里面1 = 0混乱

时间:2011-05-26 22:20:09

标签: mysql select

在简单的sql书中,如果我使用where 1 = 0,有一部分代码提及,我可以安全地添加OR条件,如:

WHERE
   1=0
   OR name LIKE '%Toledo%'
   OR billaddr LIKE '%Toledo%'
   OR shipaddr LIKE '%Toledo%'

我没有理解为什么当我使用where 1 = 0时我可以安全地添加一个OR语句

我可以使用下面的内容吗?

WHERE
   1=1
   OR name LIKE '%Toledo%'
   OR billaddr LIKE '%Toledo%'
   OR shipaddr LIKE '%Toledo%'

我理解where 1=1是添加And语句的快捷方式 我理解,因为where 1 =1将返回true。我也可以将它用于Or语句吗? Istill没有得到where 1 = 0的部分 任何解释都会很棒。

3 个答案:

答案 0 :(得分:5)

这取决于您正在处理的布尔操作的类型。如果要添加可变数量的AND语句,则使用总是求值为true的语句,例如1 = 1。另一方面,如果要对OR语句执行相同操作,则应使用计算结果为false的语句,例如1 = 0

假设你有一个带有不确定真值的布尔变量x(它可能是真的,或者它可能是假的。你不知道。)现在,如果你找到{{1的值无论x AND false的值是多少,你得到false

另一方面,如果你看x,你会得到x OR true。同样,这与true的真值无关。

在您的语句中,您希望硬编码值对查询的逻辑没有影响。由于x在逻辑上等同于false OR a OR b OR c,因此硬编码语句无效。在另一种情况下,a OR b OR c相当于true AND a AND b AND c

答案 1 :(得分:1)

MySQL使用short-circuit boolean evaluation.

一旦结果解析为TRUE或FALSE,MySQL就会停止评估其余的行。

TRUE OR ? OR ?将始终为TRUE,因此MySQL只会查看第一个项目,而不会测试其他任何内容。
FALSE AND ? AND ?将始终为FALSE,因此MySQL将不再查看其他测试。

这有(非预期的)副作用,MySQL永远不会用LIKE查看你的表,而是返回以下查询中的所有行:

SELECT * FROM atable
WHERE
   1=1                         /* <--- this makes the whole OR set always true*/
   OR name LIKE '%Toledo%'     /* therefore the like tests are never done     */
   OR billaddr LIKE '%Toledo%' /*and all rows are returned */
   OR shipaddr LIKE '%Toledo%'

在此查询中:

SELECT * FROM atable
WHERE
   1=0                          /* false OR ? has an unknown outcome so */
   OR name LIKE '%Toledo%'      /* MySQL has to evaluate the LIKE tests */
   OR billaddr LIKE '%Toledo%'  /*only some rows will be returned*/
   OR shipaddr LIKE '%Toledo%'

这与AND

完全相反

答案 2 :(得分:0)

  

我可以使用下面的内容吗?

WHERE
   1=1
   OR name LIKE '%Toledo%'
   OR billaddr LIKE '%Toledo%'
   OR shipaddr LIKE '%Toledo%'

将返回每一行(因为它始终为真),所以没有......