左外连接和右外连接

时间:2015-04-14 08:37:45

标签: mysql sql join

请帮我解决这个问题。我有2个表:表A(43行)和表B(925)行。

当我做表A左外连接B时,我应该期望多少行,当我做表A时右外连接表B我应该期望多少行?假设A和B在fid上连接,表b中的所有行都与表A具有匹配的fid。 我很困惑请帮助我理解左右外连接和预期返回的行数。感谢

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

让我们一步一步地看一下,然后从内部联接开始。 TableA有43行,TableB有925行。加入表格后会得到多少行?答:你不能说,因为这取决于你的加入标准。

让我们缩小示例:TableA = 3条记录,TableB = 3条记录。如果您在连接条件上找不到匹配项(例如,您按部门加入,但tableA仅包含部门1和2的记录,而tableB仅包含部门3和4的记录),则结果包含零记录。另一方面,如果所有记录都匹配(例如,您只按部门加入,而且两个表仅包含部门1的记录),那么您将获得所有组合= 3 x 3 = 9条记录。

以下是3 + 3记录的另一个例子:

表A:

joinkey value
1       A1
2       A2
3       A3

tableB的:

joinkey value
1       B11
2       B21
2       B22
select * from tableA inner join tableB on tableA.joinkey = tableB.joinkey;

此查询为您提供3条记录:

joinkey valueA valueB
1       A1     B11
2       A2     B21
2       A2     B22

A1在表B中找到一个匹配,A2找到两个,而A3找不到。

那么外连接的区别是什么?使用外部联接,您将获得内部联接中的所有记录以及外部联接表中没有匹配的所有记录。

select * from tableA left outer join tableB on tableA.joinkey = tableB.joinkey;

select * from tableB right outer join tableA on tableA.joinkey = tableB.joinkey;

这两个查询中的外连接表是tableB。查询是等效的。

结果:

joinkey valueA valueB
1       A1     B11
2       A2     B21
2       A2     B22
3       A3     null

现在你得到的A3记录在外连接表中没有匹配。

现在让我们来看看相反的联接:

select * from tableB left outer join tableA on tableA.joinkey = tableB.joinkey;

select * from tableA right outer join tableB on tableA.joinkey = tableB.joinkey;

这些查询再次相同。外连接表现在是tableA。但是tableB中没有记录在外连接tableA中没有匹配,因此结果与内连接的结果相同:

joinkey valueA valueB
1       A1     B11
2       A2     B21
2       A2     B22

只需注意一句:您可以看到,您可以同时使用左外连接和右外连接,只需交换表。所以为了不混淆,总是使用一个。我建议你远离右外连接并坚持左外连接,这是大多数人习惯的。 (这也意味着你将在互联网上找到更多关于它的例子: - )