对左连接感到困惑(简单场景)

Posted

技术标签:

【中文标题】对左连接感到困惑(简单场景)【英文标题】:Confused on left joins (simple scenario) 【发布时间】:2014-11-08 15:32:28 【问题描述】:

我了解内部联接,但在涉及外部联接时我感到困惑。 表1有两行如下所示:

tbl1:
1
1

表2有如下两行:

tbl2:
1
2

内连接:2 行(我理解,tbl1 中的 2 行与 tbl2 中的值匹配) 左外连接:会是 3 行吗(都在tbl1 上,两个表通用)

【问题讨论】:

请更好地解释你的例子。使用列名和值,以便其他有相同疑问的用户能够理解您的问题。为了让您得到正确的答案,您需要提出正确的问题。 您应该改进和澄清您的示例,但看起来在您的示例中您会得到与内部连接相同的结果。 这是我面试问题的一部分,上面给了我两张表,并被要求解释我将获得的行数作为所有类型的连接的输出。 【参考方案1】:

这是一个使用 SQLite 的示例:

sqlite> create table tbl1(value int);
sqlite> insert into tbl1 values(1);
sqlite> insert into tbl1 values(1);
sqlite> create table tbl2(value int);
sqlite> insert into tbl2 values(1);
sqlite> insert into tbl2 values(2);

如果tbl2 左连接到tbl1,你会得到两个结果:

sqlite> SELECT * FROM tbl1 LEFT JOIN tbl2 ON tbl1.value = tbl2.value;
1|1
1|1

这是因为tbl1 是“左”表,所以tbl1 中的每一行都将被包括在内,无论它是否在tbl2 中匹配。

如果tbl1 左连接到tbl2,你会得到三个结果:

sqlite> SELECT * FROM tbl2 LEFT JOIN tbl1 ON tbl1.value = tbl2.value;
1|1
1|1
2|

这是因为:

tbl2 中的每一行都将被包括在内,无论 tbl1 中是否存在匹配项 tbl2 中的行可能与tbl1 中的多行匹配。

在这种情况下,tbl2 有两行与 tbl1 匹配,再加上一行不匹配,总共三行。

【讨论】:

感谢您抽出宝贵时间回复,这有助于理解这个概念。【参考方案2】:

当 LEFT OUTER JOIN 右侧的表或结果集具有匹配值时,OUTER 和 INNER JOIN 之间没有区别。这是您示例中的情况-您得到两行 对于SELECT * FROM tbl1 LEFT JOIN tbl2 ON tbl1.number=tbl2.number

tbl1.number  tbl2.number
1            1
1            1

但是使用SELECT * FROM tbl1 INNER JOIN tbl2 ON tbl1.number=tbl2.number 会得到相同的结果。

区别在于 LEFT OUTER JOIN 的左侧 - 你说我想要来自 tbl1 的所有行,无论 tbl2 中是否有匹配的行。

因此,如果您使用 DELETE FROM tbl2 WHERE number = 1tbl2 中删除第一行并使用 INNER JOIN SELECT * FROM tbl1 INNER JOIN tbl2 ON tbl1.number=tbl2.number 运行命令 - 您将获得 0 条记录,因为在 tbl2 中没有匹配的记录。

如果你然后运行SELECT * FROM tbl1 LEFT JOIN tbl2 ON tbl1.number=tbl2.number,你会得到:

tbl1.number  tbl2.number
1            NULL
1            NULL

【讨论】:

感谢您抽出宝贵的时间回复,这解决了我的困惑。

以上是关于对左连接感到困惑(简单场景)的主要内容,如果未能解决你的问题,请参考以下文章

左外连接和左连接一样吗? [复制]

iTunes 连接:对 Bundle ID 感到困惑

使用左连接的查询返回的行数较少

PHP在添加和连接时感到困惑

对服务器发送的事件感到困惑

对 Yesod 中的 selectOneMany 感到困惑