FULL JOIN&内部联接

时间:2010-06-11 12:34:14

标签: sql

FULL JOININNER JOIN之间有什么区别?

当我执行FULL JOIN时,我获得了832条记录,并且INNER JOIN,我获得了830条记录。

8 个答案:

答案 0 :(得分:132)

注意:所有这些都可以在维基百科上找到:Join (SQL)

有三种类型的OUTER连接:

  • LEFT OUTER JOIN
  • RIGHT OUTER JOIN
  • FULL OUTER JOIN

关键字OUTER在遵循标准的所有实现中都是可选的,因此FULL JOIN与FULL OUTER JOIN相同。 (我在本答案的其余部分中从SQL中省略了OUTER这个词。)

让我们来看看每个人的作用。

考虑以下两个输入数据集:

 Set "A"    Set "B"

 AA         BB
--------   --------
 Item 1     Item 3
 Item 2     Item 4
 Item 3     Item 5
 Item 4     Item 6

请注意,A中有些项目不在B中,反之亦然。

现在,如果我们编写这样的SQL语句,使用LEFT join:

SELECT * FROM A LEFT JOIN B ON AA = BB

您将获得以下结果(空洞实际上是NULL标记):

 AA         BB
--------   --------
 Item 1
 Item 2
 Item 3     Item 3
 Item 4     Item 4

请注意,您将从AA获取所有行,或者更确切地说,所有来自 left 部分连接子句的行

如果您切换到使用右连接:

SELECT * FROM A RIGHT JOIN B ON AA = BB

 AA         BB
--------   --------
 Item 3     Item 3
 Item 4     Item 4
            Item 5
            Item 6

请注意,您将从join子句的右侧部分获取所有行。

但是,如果你想要两者的所有行,你将使用FULL join:

SELECT * FROM A FULL JOIN B ON AA = BB

 AA         BB
--------   --------
 Item 1            <-----+
 Item 2                  |
 Item 3     Item 3       |
 Item 4     Item 4       |
            Item 5       +--- empty holes are NULL's
            Item 6       |
   ^                     |
   |                     |
   +---------------------+

正如评论中所建议的,让我完成其他不同的加入方式。

使用INNER加入:

SELECT * FROM A INNER JOIN B ON AA = BB

 AA         BB
--------   --------
 Item 3     Item 3
 Item 4     Item 4

使用INNER join我们只获得实际匹配的行,因为加入没有漏洞。

CROSS联接通过将第一组中的每一行与第二组中的每一行匹配来生成笛卡尔积:

SELECT * FROM A CROSS JOIN B

 AA         BB
--------   --------
 Item 1     Item 3      ^
 Item 1     Item 4      +--- first item from A, repeated for all items of B
 Item 1     Item 5      |
 Item 1     Item 6      v
 Item 2     Item 3      ^
 Item 2     Item 4      +--- second item from A, repeated for all items of B
 Item 2     Item 5      |
 Item 2     Item 6      v
 Item 3     Item 3      ... and so on
 Item 3     Item 4
 Item 3     Item 5
 Item 3     Item 6
 Item 4     Item 3
 Item 4     Item 4
 Item 4     Item 5
 Item 4     Item 6

另请注意,我们没有指定匹配的列,因为没有匹配完成。

最后,NATURAL join,在这个语法中,我们没有指定哪些列匹配,但匹配列名。在我们设计的示例中,没有列名相同,但是对于这个特定示例,我们可以说两个表中的列名都是XX,那么我们将得到以下结果:

SELECT * FROM A NATURAL JOIN B

 +----------+------- matches on the names, and then the data
 |          |
 v          v
 XX         XX
--------   --------
 Item 3     Item 3
 Item 4     Item 4

正如您所看到的,您与INNER联接相同,但不必键入join子句的匹配部分。

答案 1 :(得分:73)

FULL OUTER JOINLEFT OUTER JOINRIGHT OUTER JOIN的联合。

(这有道理吗?)

描述连接的很好的视觉解释(左下角描述了完整的外部连接): http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

积分转到C.L.莫法特关于codeproject

的博文

答案 2 :(得分:3)

区别在于不匹配行的行为。

例如,如果表A在定义了连接的字段中的表B中没有对应的行,则内连接将完全省略该行,而完整连接将包括该行,但表B的字段为NULL值。表B的不匹配行的副词。

答案 3 :(得分:3)

以一种非常简单的方式,主要区别是:

INNER JOIN - 仅返回匹配的行。因此,不包括不匹配的行。

FULL JOIN - 返回右表中存在但不在左侧的行,加上左表中存在的行,而不是内部连接行之外的行。 / p>

答案 4 :(得分:2)

完整连接将返回两个表中的行,即使其他表中没有匹配的行也是如此。完全连接类似于右连接和左连接。内连接仅返回在另一个表中至少有一个伙伴的行。

答案 5 :(得分:0)

内部联接不会在联接目标字段中带来任何NULL。如果没有匹配的记录,原件将不在表中。

答案 6 :(得分:0)

这意味着您的表格匹配得很好。

找到的Wiki页面here显示了它们如何工作的一个很好的例子。

答案 7 :(得分:0)

考虑表A和表B

表A - (密钥,名称)

1,Data1 2,Data2 4,Data4 5,Data5

表B - (密钥,FKey,名称)

1,1,DataA 2,2,DataB 3,NULL,DataC 4,4,DataD

内部联接将返回

  • 1,Data1,1,1,DataA
  • 2,Data2,2,2,DataB
  • 4,Data3,4,4,DataD

虽然完整的外部联接将返回

  • 1,Data1,1,1,DataA
  • 2,Data2,2,2,DataB
  • NULL,NULL,3,NULL,DataC
  • 4,Data4,4,4,DataD
  • 5,Data5,NULL,NULL,NULL
相关问题