INNER JOIN 和 OUTER JOIN 有什么区别?

Jul*_*ien 35 join

我是 SQL 新手,想知道这两种JOIN类型有什么区别?

SELECT * 
FROM user u
INNER JOIN telephone t ON t.user_id = u.id

SELECT * 
FROM user u
LEFT OUTER JOIN telephone t ON t.user_id = u.id
Run Code Online (Sandbox Code Playgroud)

我什么时候应该使用其中一种?

小智 32

  • 一个内部联接将只选择其中加入了钥匙在记录两个指定的表。
  • 一个左外连接将选择从第一个表中的所有记录,并在第二个表匹配连接键的任何记录。
  • 一个右外连接将选择从第二个表中的所有记录,并在第一台符合加入键的任何记录。

在您的第一个示例中,如果用户至少存在一个电话记录,您将只返回用户和电话号码的列表。

在您的第二个示例中,您将返回所有用户的列表,以及任何可用的电话记录(如果它们不可用,您将获得NULL电话值)。


Spr*_*dzy 13

每次有人问这个问题,都有答案:http : //www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

希望能帮助你理解,

  • 我已经与连接一起工作了 20 年,这些图表对我来说似乎很混乱。 (3认同)
  • 我和@Hogan 在一起——ven 图表不是对此的最佳解释.. 显示将返回哪些组合的网格可能会更好。 (3认同)

Lei*_*fel 8

一个内连接,可以根据连接标准组合返回行。
一个外连接这些回报和所有行...
   ...从第一个表的左连接
   ...从一个第二个表右侧加入
   ...两个表的全加盟

选择何时使用一种或另一种是确定您需要什么数据的问题。对于您的示例,如果您只需要电话中的 user_ids 与 user 中的 id 匹配的记录,则使用内部联接。如果您还想包括来自用户的没有匹配电话条目的行,那么左联接将是合适的。

有关更多信息,请参阅StackOverflow 上的这个问题


Am1*_*3zA 7

如果您有 2 个表,如下所示:

Table1 :   A1    B1          Table2  :    B2     C2 
           -     -                        -      -
           1     2                        1      1
           2     4                        2      4
           3     5                        5      2
Run Code Online (Sandbox Code Playgroud)

如果您使用内部联接,您将获得:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2
Run Code Online (Sandbox Code Playgroud)

如果您使用完全外部联接,您将获得:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2
 2      4    NULL     NULL
NULL   NULL    1       1
Run Code Online (Sandbox Code Playgroud)

如果您使用左外连接,您将获得:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2
 2      4    NULL     NULL
Run Code Online (Sandbox Code Playgroud)


one*_*hen 6

外连接被明确设计为在其结果中产生空值,因此通常应该避免。从关系上讲,这是一种猎枪式联姻:它迫使表成为一种联合——是的,我的意思是联合,而不是加入——即使有问题的表不符合联合的通常要求。实际上,它通过在进行联合之前用空值填充一个或两个表来实现这一点,从而使它们毕竟符合那些通常的要求。但是没有理由不应该使用正确的值而不是空值来完成填充,如下例所示:

SELECT SNO , PNO 
FROM   SP 
UNION  
SELECT SNO , 'nil' AS PNO 
FROM   S 
WHERE  SNO NOT IN ( SELECT SNO FROM SP )
Run Code Online (Sandbox Code Playgroud)

或者,可以通过将 SQL 外连接运算符与 结合使用来获得相同的结果COALESCE,如下所示:

SELECT SNO , COALESCE ( PNO , 'nil' ) AS PNO 
FROM ( S NATURAL LEFT OUTER JOIN SP ) AS TEMP
Run Code Online (Sandbox Code Playgroud)

CJ日期在“SQL与关系理论:如何编写准确的SQL代码”中对外部联接(4.6)的评论


ind*_*1ng 5

内部联接是这样一种联接,其中显示的唯一结果是键在两个表中的结果。外部联接将显示一个表中所有键的结果,第一个表的左联接和第二个表的右联接。例如:

假设 table1 具有以下主键和数据对:(1, a), (2, b), (3, c)

假设 table2 有以下主键和数据对:(1, fun), (3, can), (4,happen)

因此,主键上 table1 到 table2 的内部连接将产生以下结果三元组(首先是公共主键,第二个是第一个表的第二个项目,第二个是第二个表的第二个项目):(1, a, fun), ( 3、c、可以)

主键上 table1 到 table2 的左外连接将产生以下结果三元组(格式与上述相同):(1, a, fun), (2, b, NULL), (3, c, can)

主键上 table1 到 table2 的右外连接将产生以下结果三元组(与上述格式相同):(1, a, fun), (3, c, can), (4, NULL,发生)

我希望这很好地解释了这个概念。