a FULL JOIN和an有INNER JOIN什么区别?
当我这样做时FULL JOIN,我得到了832条记录,并且有了一条INNER JOIN,我获得了830条记录.
ang*_*son 135
注意:所有这些都可以在维基百科上找到:加入(SQL).
OUTER连接有三种类型:
关键字OUTER在遵循标准的所有实现中都是可选的,因此FULL JOIN与FULL OUTER JOIN相同.(我在OUTER本答案的其余部分中省略了SQL中的单词.)
让我们看看每个人做了什么.
考虑以下两个输入数据集:
Set "A" Set "B"
AA BB
-------- --------
Item 1 Item 3
Item 2 Item 4
Item 3 Item 5
Item 4 Item 6
Run Code Online (Sandbox Code Playgroud)
请注意,A中有一些项目不在B中,反之亦然.
现在,如果我们编写这样的SQL语句,使用LEFT join:
SELECT * FROM A LEFT JOIN B ON AA = BB
Run Code Online (Sandbox Code Playgroud)
您将得到以下结果(空洞实际上是NULL标记):
AA BB
-------- --------
Item 1
Item 2
Item 3 Item 3
Item 4 Item 4
Run Code Online (Sandbox Code Playgroud)
请注意,您会得到所有从AA行,或者说,所有从该行左联接子句的一部分.
如果您切换到使用右连接:
SELECT * FROM A RIGHT JOIN B ON AA = BB
AA BB
-------- --------
Item 3 Item 3
Item 4 Item 4
Item 5
Item 6
Run Code Online (Sandbox Code Playgroud)
请注意,您从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 |
^ |
| |
+---------------------+
Run Code Online (Sandbox Code Playgroud)
正如评论中所建议的,让我完成其他不同的加入方式.
使用INNER加入:
SELECT * FROM A INNER JOIN B ON AA = BB
AA BB
-------- --------
Item 3 Item 3
Item 4 Item 4
Run Code Online (Sandbox Code Playgroud)
使用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
Run Code Online (Sandbox Code Playgroud)
另请注意,我们没有指定匹配的列,因为没有匹配完成.
最后,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
Run Code Online (Sandbox Code Playgroud)
如您所见,您获得的内容与INNER连接相同,但不必键入join子句的匹配部分.
Ral*_*ine 77
A FULL OUTER JOIN是LEFT OUTER JOIN和的结合RIGHT OUTER JOIN.
(那有意义吗?)
很好的描述连接的视觉解释(左下角描述了完整的外连接):

积分转到CL Moffatt关于codeproject的博文
以一种非常简单的方式,主要区别在于:
INNER JOIN - 只返回匹配的行。因此,不包括不匹配的行。
FULL JOIN - 返回那些存在于右表中但不在左表中的行,以及存在于左表中但不在右表中的行,超出内部联接行。
| 归档时间: |
|
| 查看次数: |
79799 次 |
| 最近记录: |