对左连接感到困惑(简单场景)
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 = 1
从 tbl2
中删除第一行并使用 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
【讨论】:
感谢您抽出宝贵的时间回复,这解决了我的困惑。以上是关于对左连接感到困惑(简单场景)的主要内容,如果未能解决你的问题,请参考以下文章