关于MySQL:内部连接、左连接、右连接和完全连接有什么区别?

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

本问题已经有最佳答案,请猛点这里访问。

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


阅读这篇关于代码项目的原始文章将有很大帮助:SQL连接的可视化表示。

alt text

还要查看以下文章:SQL Server—更好的性能—左加入还是不加入?.

在mysql中的join和outer join的区别处找到原始的join。


内部联接基于外键获取两个表之间的所有公共记录。

左联接从左链接表中获取所有记录,但如果从右表中选择了一些列,则如果没有相关记录,则这些列将包含空值。

右联接与上面的类似,但在右表中获取所有记录。

完全联接从两个表中获取所有记录,并将空值放在相关记录不在另一个表中的列中。


An SQL JOIN clause is used to combine rows from two or more tables,
based on a common field between them.

SQL中有不同类型的联接可用:

内部联接:当两个表都匹配时返回行。

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

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

完全联接:它结合了左外部联接和右外部联接的结果。

联接的表将包含来自两个表的所有记录,并为每侧缺少的匹配项填充空值。

self join:用于将一个表与自身联接,就像表是两个表一样,临时重命名SQL语句中的至少一个表。

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

我们可以详细了解前四个连接:

我们有两个具有以下值的表。

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

塔布莱

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

…………………………………………………………

内连接

注:它给出了两个表的交集,即表A和表B中常见的行。

句法

1
2
3
4
SELECT table1.column1, table2.column2...
  FROM table1
 INNER JOIN table2
    ON table1.common_field = table2.common_field;

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

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

结果将是

1
2
3
4
5
firstName       lastName       age  Place
..............................................
arun            prasanth        24  kerala
ann             antony          24  usa
sruthy          abc             25  ekm

左连接

注意:将给出表A中的所有选定行,以及表B中的所有常见选定行。

句法

1
2
3
4
SELECT table1.column1, table2.column2...
  FROM table1
  LEFT JOIN table2
    ON table1.common_field = table2.common_field;

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

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

结果

1
2
3
4
5
6
firstName                   lastName                    age   Place
...............................................................................
arun                        prasanth                    24    kerala
ann                         antony                      24    usa
sruthy                      abc                         25    ekm
new                         abc                         NULL  NULL

右连接

注意:将给出表B中的所有选定行,以及表A中的所有常见选定行。

句法

1
2
3
4
SELECT table1.column1, table2.column2...
  FROM table1
 RIGHT JOIN table2
    ON table1.common_field = table2.common_field;

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

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

结果

1
2
3
4
5
6
firstName                   lastName                    age     Place
...............................................................................
arun                        prasanth                    24     kerala
ann                         antony                      24     usa
sruthy                      abc                         25     ekm
NULL                        NULL                        24     chennai

完全连接

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

句法

1
2
3
4
SELECT table1.column1, table2.column2...
  FROM table1
  FULL JOIN table2
    ON table1.common_field = table2.common_field;

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

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

结果

1
2
3
4
5
6
7
firstName                   lastName                    age    Place
...............................................................................
arun                        prasanth                    24    kerala
ann                         antony                      24    usa
sruthy                      abc                         25    ekm
new                         abc                         NULL  NULL
NULL                        NULL                        24    chennai

有趣的事实

对于内部连接,顺序无关紧要

对于(左、右或全)外部联接,顺序很重要。

最好去看看这个链接,它会给你关于加入订单的有趣细节。