内部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 JOIN
是LEFT OUTER JOIN
和RIGHT OUTER JOIN
。
(这有道理吗?)
描述连接的好视觉解释(左下angular描述完整的外连接):
参考: 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