INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN有什么区别?

2165

MySQL中,INNER JOINLEFT JOINRIGHT JOINFULL JOIN有什么区别?


2
我注意到没有一个答案是针对MySQL的,它在某些领域确实有自己的语义。我也想看到一个体面的写作。 - Lightness Races in Orbit
2个回答

1160

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

在SQL中有不同类型的联接:

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

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

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

FULL JOIN: 结合了左外部联接和右外部联接的结果。

联接后的表将包含两个表中的所有记录,并为任何一侧的缺少匹配的位置填充NULL。

SELF JOIN: 将一个表作为两个表进行联接,就好像在SQL语句中暂时重命名至少一个表。

CARTESIAN JOIN: 返回来自两个或多个联接表的记录集的笛卡尔积。

以下是前四个联接的详细信息:

我们有以下值的两个表:

TableA

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

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

内连接(INNER JOIN)

注:返回两个表中共同存在的行。

语法

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

左连接(LEFT JOIN)

注意: 返回 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

右连接(RIGHT JOIN)

注意:返回 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

FULL JOIN

Note:返回两个表格中所有选择的值。

Syntax(语法)

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 JOIN,顺序无关紧要。
  • 对于 (LEFT、RIGHT 或 FULL) OUTER JOIN,顺序很重要。

最好去查看这个链接,它会为您提供有关连接顺序的有趣细节。


13
full join 不等同于 union。请参考以下链接:https://dev59.com/yHNA5IYBdhLWcg3wk-6A 和 https://social.msdn.microsoft.com/Forums/sqlserver/en-US/cb8fed73-c134-46ef-aff8-7d4ea57a1033/difference-between-union-all-and-full-outer-join?forum=transactsql。 - John Smith

784

内连接(INNER JOIN)基于提供的ON子句获取两个表之间的共同记录。

左连接(LEFT JOIN)获取左侧表中的所有记录以及来自右侧表的相关记录,但是如果你选择了右侧表中的某些列,如果没有相关记录,则这些列将包含NULL。

右连接(RIGHT JOIN)与上述类似,但获取右侧表中的所有记录。

全连接(FULL JOIN)获取两个表中的所有记录,并在不存在相对应的记录时将在列中放置NULL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接