INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN 之间有什么区别?[复制]

What's the difference between INNER JOIN, LEFT JOIN, RIGHT JOIN and FULL JOIN? [duplicate]

提问人:Lion King 提问时间:4/19/2011 最后编辑:DineshDBLion King 更新时间:8/26/2021 访问量:2140740

问:

MySQL中的、和有什么区别?INNER JOINLEFT JOINRIGHT JOINFULL JOIN

mysql sql 内部连接 outer-join

评论

2赞 Lightness Races in Orbit 7/9/2011
我注意到没有一个答案是特定于MySQL的,MySQL在某些领域确实有自己的语义。我也希望看到一篇像样的文章。

答:

785赞 Brian Leeming 4/19/2011 #1

INNER JOIN 根据提供的 ON 子句获取两个表之间共有的所有记录。

LEFT JOIN 从 LEFT 链接中获取所有记录,并从 RIGHT 表中获取相关记录,但如果从 RIGHT 表中选择了一些列,如果没有相关记录,则这些列将包含 NULL。

RIGHT JOIN 与上述类似,但获取 RIGHT 表中的所有记录。

FULL JOIN 从两个表中获取所有记录,并将 NULL 放在另一个表中不存在相关记录的列中。

1163赞 Arunprasanth K V 2/25/2015 #2

SQL JOIN 子句用于合并两个或多个表中的行, 基于它们之间的公共字段。

SQL 中提供了不同类型的联接:

INNER JOIN:当两个表中都存在匹配项时返回行。

LEFT JOIN:返回左表中的所有行,即使右表中没有匹配项。

RIGHT JOIN:返回右表中的所有行,即使左表中没有匹配项也是如此。

FULL JOIN:合并左外连接和右外连接的结果。

联接表将包含两个表中的所有记录,并为任一端缺少的匹配项填充 NULL。

SELF JOIN:将一个表连接到自身,就好像该表是两个表一样,在 SQL 语句中临时重命名至少一个表。

笛卡尔联接:从两个或多个联接表中返回记录集的笛卡尔积。

我们可以在 Details 中获取每个前四个连接:

我们有两个表,其值如下。

表A

id  firstName                  lastName
.......................................
1   arun                        prasanth                 
2   ann                         antony                   
3   sruthy                      abc                      
6   new                         abc                                           

表B

id2 age Place
................
1   24  kerala
2   24  usa
3   25  ekm
5   24  chennai

....................................................................

内部连接

:给出了两个表的交集,即 TableA 和 TableB 共有的行。

语法

SELECT table1.column1, table2.column2...
  FROM table1
 INNER JOIN table2
    ON table1.common_field = table2.common_field;

在我们的示例表中应用它:

SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place
  FROM TableA
 INNER JOIN TableB
    ON TableA.id = TableB.id2;

结果

firstName       lastName       age  Place
..............................................
arun            prasanth        24  kerala
ann             antony          24  usa
sruthy          abc             25  ekm

左加入

注意:给出 TableA 中的所有选定行,以及 TableB 中任何常见的选定行。

语法

SELECT table1.column1, table2.column2...
  FROM table1
  LEFT JOIN table2
    ON table1.common_field = table2.common_field;

在我们的示例表中应用它:

SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place
  FROM TableA
  LEFT JOIN TableB
    ON TableA.id = TableB.id2;

结果

firstName                   lastName                    age   Place
...............................................................................
arun                        prasanth                    24    kerala
ann                         antony                      24    usa
sruthy                      abc                         25    ekm
new                         abc                         NULL  NULL

右加入

:给出 TableB 中的所有选定行,以及 TableA 中任何常见的选定行。

语法

SELECT table1.column1, table2.column2...
  FROM table1
 RIGHT JOIN table2
    ON table1.common_field = table2.common_field;

在我们的示例表中应用它:

SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place
  FROM TableA
 RIGHT JOIN TableB
    ON TableA.id = TableB.id2;

结果

firstName                   lastName                    age     Place
...............................................................................
arun                        prasanth                    24     kerala
ann                         antony                      24     usa
sruthy                      abc                         25     ekm
NULL                        NULL                        24     chennai

完全加入

注意:返回两个表中所有选定的值。

语法

SELECT table1.column1, table2.column2...
  FROM table1
  FULL JOIN table2
    ON table1.common_field = table2.common_field;

在我们的示例表中应用它:

SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place
  FROM TableA
  FULL JOIN TableB
    ON TableA.id = TableB.id2;

结果

firstName                   lastName                    age    Place
...............................................................................
arun                        prasanth                    24    kerala
ann                         antony                      24    usa
sruthy                      abc                         25    ekm
new                         abc                         NULL  NULL
NULL                        NULL                        24    chennai

有趣的事实

  • 对于 INNER 连接,顺序无关紧要。
  • 对于(LEFT、RIGHT 或 FULL)OUTER 连接,顺序很重要。

最好去检查这个链接,它会给你关于加入顺序的有趣细节。

评论

13赞 John Smith 12/17/2016
full join与.请参阅 stackoverflow.com/questions/905379/... 和 social.msdn.microsoft.com/Forums/sqlserver/en-US/...union