内部join和全部join之间的区别

完全连接和内部连接有什么区别?

当我做一个完整的join,我得到832条logging和一个内部联接我得到830条logging。

注意 :所有这些都可以在Wikipedia上find: Join(SQL) 。

有三种types的外部连接:

  • 左外连接
  • 右外部join
  • 全外连接

在所有符合标准的实现中,关键字OUTER是可选的,所以FULL JOIN与FULL OUTER JOIN相同。 ( 在这个答案的其余部分,我已经从SQL中省略了OUTER这个词 。)

让我们来看看每个做什么。

考虑以下两个input数据集:

  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语句,使用LEFTjoin:

 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获得所有行,或者更确切地说,将从join子句的左边部分获取所有行。

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

 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连接:

 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 | ^ | | | +---------------------+ 

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

INNERjoin:

 SELECT * FROM A INNER JOIN B ON AA = BB AA BB -------- -------- Item 3 Item 3 Item 4 Item 4 

有了INNER连接,我们只能得到实际匹配的行,因为连接而没有漏洞。

一个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连接,在这个语法中,我们不指定哪些列匹配,但匹配列名。 在我们devise的例子中,没有列名是相同的,但是让我们来说说这个具体的例子,在两个表中列名是XX,那么我们会得到以下结果:

 SELECT * FROM A NATURAL JOIN B +----------+------- matches on the names, and then the data | | vv XX XX -------- -------- Item 3 Item 3 Item 4 Item 4 

正如你所看到的,你可以像INNER连接一样,但不必input连接子句的匹配部分。

FULL OUTER JOINLEFT OUTER JOINRIGHT OUTER JOIN

(这有道理吗?)

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

参考: codeproject

不同之处在于不匹配行的行为。

例如,如果表A有一行在定义了连接的字段中的表B中没有对应关系,那么内部联接将完全省略该行,而完全联接将包括该行,但是具有NULL表B的字段的值。对于表B的不匹配的行的副本

即使在另一个表中没有匹配的行,完全连接也会从两个表中返回行。 完全连接就像一个正确的连接和一个左连接在同一时间。 内部联接将只返回在另一个表中至less有一个伙伴的行。

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

INNER JOIN – 只返回匹配的行。 因此,不包括不匹配的行。

FULL JOIN – 返回存在于右表中而不存在于左侧的行,加上存在于左表中而不在右侧的行,超出内连接行。

内部连接不会在连接目标字段中带入任何空值。 如果没有匹配的logging,原件将不在表格中。

这意味着你的桌子相当不错。

在这里find的维基页面显示了他们如何工作的一个很好的例子。

考虑表A和表B

表A – (重点,名称)

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

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

1,1,DataA2,2,DataB3,NULL,DataC4,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,DataD
  • 5,Data5,NULL,NULL,NULL