MySQL的,其中1 = 0的混乱

在简单的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是一个快捷方式添加和声明。
据我所知,因为where 1 =1返回true.Can我用它Or声明呢?
Istill没得到部分where 1 = 0
任何的解释将是巨大的。

--------------解决方案-------------

这取决于你的工作布尔运算的类型。 如果你想添加可变数量的AND语句,则您使用不约而同地计算结果为真实的陈述,如1 = 1 。在另一方面,如果你想要做同样的OR语句,那么你应该使用语句计算结果为false,如1 = 0

比方说,你有一个布尔变量x有一个不确定的真值(这可能是真的,也可能是假的。你不知道。)现在,如果你发现的价值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等于a AND b AND c

MySQL使用短路布尔评估。

只要结果解析为明确TRUE或FALSE的MySQL停止评估的行的其余部分。

TRUE OR ? OR ? TRUE OR ? OR ?总是为真,那么MySQL将只能看第一项,不考别的。
FALSE AND ? AND ? FALSE AND ? AND ?永远是假的,如此反复MySQL不会看其他的测试。

这有(意外)副作用,即MySQL会从来不看的像你的桌子,而是在下面的查询返回的所有行:

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

我可以只使用类似下面?

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

将返回每一行(因为它总是如此),所以没有...

分类:MySQL的 时间:2015-03-15 人气:0
本文关键词: MySQL的选择
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.538 (s). 10 q(s)