首先,感谢您提出这个有趣的问题.我喜欢玩这个.让我们开始回答:
了解其工作原理的先决条件
了解SELECT-WHERE查询
这很明显,但我正在为每个程序员做出这个答案,即使你真的不知道SQL是如何工作的. SELECT-WHERE查询,基本上:
>循环受查询影响的每一行
>使用该特定行的值评估where_condition.
>如果where_condition结果为TRUE,则会列出.
伪代码可以是:
for every row:
current values = row values # for example: username = 'anonymous'
if (where_condition = TRUE)
selected_rows.append(this row)
几乎每个字符串都等于0(或FALSE)
除非字符串是数字(‘1′,’423′,’ – 42′)或字符串以数字开头,否则每隔一个字符串等于0(或FALSE). “数字字符串”等于其等效数字,“起始数字字符串”等于其初始数字.提供一些例子:
MySQL的> SELECT’a’= 0;
+---------+
| 'a' = 0 |
+---------+
| 1 |
+---------+
1 row in set, 1 warning (0.00 sec)
.
mysql> SELECT 'john' = 0;
+------------+
| 'john' = 0 |
+------------+
| 1 |
+------------+
1 row in set, 1 warning (0.00 sec)
.
mysql> SELECT '123' = 123;
+-------------+
| '123' = 123 |
+-------------+
| 1 |
+-------------+
1 row in set (0.00 sec)
.
mysql> SELECT '12a5' = 12;
+-------------+
| '12a5' = 12 |
+-------------+
| 1 |
+-------------+
1 row in set, 1 warning (0.00 sec)
WHERE_condition像数学运算一样被解决
链式比较逐一解决,首先是括号的唯一优先选择,从左边开始直到TRUE或FALSE为剩余.
因此,例如1 = 1 = 0 = 0将被跟踪如下:
1 = 1 = 0 = 0
[1] = 0 = 0
[0] = 0
[1]
Final result: 1 -> TRUE
这个怎么运作
我将追踪最后一个查询,我认为这是最复杂但最美丽的解释:
SELECT * FROM users WHERE id = id = id = username = username = id = username = 1;
首先,我将使用每个行变量显示每个where_condition:
id = id = id = username = username = id = username = 1
0 = 0 = 0 = 'anonymous' = 'anonymous' = 0 = 'anonymous' = 1
1 = 1 = 1 = 'root' = 'root' = 1 = 'root' = 1
2 = 2 = 3 = 'john' = 'john' = 2 = 'john' = 1
3 = 3 = 3 = 'doe' = 'doe' = 3 = 'doe' = 1
现在我将追踪每一行:
0 = 0 = 0 = 'anonymous' = 'anonymous' = 0 = 'anonymous' = 1
[1] = 0 = 'anonymous' = 'anonymous' = 0 = 'anonymous' = 1
[0] = 'anonymous' = 'anonymous' = 0 = 'anonymous' = 1
[1] = 'anonymous' = 0 = 'anonymous' = 1
[0] = 0 = 'anonymous' = 1
[1] = 'anonymous' = 1
[0] = 1
[0] -> no match
1 = 1 = 1 = 'root' = 'root' = 1 = 'root' = 1
[1] = 1 = 'root' = 'root' = 1 = 'root' = 1
[1] = 'root' = 'root' = 1 = 'root' = 1
[0] = 'root' = 1 = 'root' = 1
[1] = 1 = 'root' = 1
[1] = 'root' = 1
[0] = 1
[0] -> no match
2 = 2 = 3 = 'john' = 'john' = 2 = 'john' = 1
[1] = 3 = 'john' = 'john' = 2 = 'john' = 1
[0] = 'john' = 'john' = 2 = 'john' = 1
[1] = 'john' = 2 = 'john' = 1
[0] = 2 = 'john' = 1
[0] = 'john' = 1
[1] = 1
[1] -> match
3 = 3 = 3 = 'doe' = 'doe' = 3 = 'doe' = 1
[1] = 3 = 'doe' = 'doe' = 3 = 'doe' = 1
[0] = 'doe' = 'doe' = 3 = 'doe' = 1
[1] = 'doe' = 3 = 'doe' = 1
[0] = 3 = 'doe' = 1
[0] = 'doe' = 1
[1] = 1
[1] -> match
因此,id为2和3的行与where_condition匹配,这就是查询显示的行.