FULL JOIN和INNER JOIN之间的区别

Twi*_*kle 58 sql

a FULL JOIN和an有INNER JOIN什么区别?

当我这样做时FULL JOIN,我得到了832条记录,并且有了一条INNER JOIN,我获得了830条记录.

ang*_*son 135

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

OUTER连接有三种类型:

  • LEFT OUTER JOIN
  • 正确加入
  • 完全外部加入

关键字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 JOINLEFT OUTER JOIN和的结合RIGHT OUTER JOIN.

(那有意义吗?)

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

积分转到CL Moffatt关于codeproject的博文

  • 引用你的来源?看起来像http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins (7认同)

Ale*_* N. 5

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

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

FULL JOIN - 返回那些存在于右表中但不在左表中的行,以及存在于左表中但不在右表中的行,超出内部联接行。


Pav*_*sky 0

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