为什么这两个陈述有不同的结果?

时间:2009-12-24 08:50:17

标签: mysql

mysql> select a.id,a.parent from qa a left join qa b on a.parent=b.parent where b.id=7;
+----+--------+
| id | parent |
+----+--------+
|  7 |      1 |
|  8 |      1 |
|  9 |      1 |
+----+--------+
3 rows in set (0.00 sec)

mysql> select a.id,a.parent from qa a left join qa b on a.parent=b.parent and b.id=7;
+----+--------+
| id | parent |
+----+--------+
|  1 |   NULL |
|  2 |   NULL |
|  3 |   NULL |
|  4 |   NULL |
|  5 |   NULL |
|  6 |   NULL |
|  7 |      1 |
|  8 |      1 |
|  9 |      1 |
+----+--------+

我读完它们一样!

3 个答案:

答案 0 :(得分:3)

第一个语句将创建连接,然后使用 WHERE b.id = 7 过滤结果。

因此,只有来自 a 的行 a.parent = b.parent 且该加入结果 b.id = 7

第二个语句将使用 b.id = 7 创建左连接,因此包括来自 qa a 的所有行,然后仅包含来自 qa的值b 其中 b.id = 7

所有来自 a 的行,其中 a.parent = b.parent ,但仅显示来自 b 的值 b。 ID = 7

答案 1 :(得分:0)

您首先通过自动消除NULLs可以/将返回的LEFT JOIN来限制结果的右侧。如果您使用INNER JOIN,声明将返回相同的结果。

答案 2 :(得分:0)

首先在select语句中有一个条件(where),第二个在连接上应用b.id条件。

来自文档:

  

如果LEFT JOIN中ON或USING部分的右表没有匹配的行,则右表使用所有列设置为NULL的行。