INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN之间有什么区别在MySQL中?


当前回答

SQL JOIN子句用于组合来自两个或多个表的行,基于它们之间的公共场。

SQL中有不同类型的联接:

INNER JOIN:当两个表都匹配时,返回行。

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

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

FULLJOIN:组合左外部连接和右外部连接的结果。

连接的表将包含两个表中的所有记录,并为每一侧缺少的匹配项填写NULL。

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

CARESIAN JOIN:返回两个或多个连接表中记录集的笛卡尔乘积。

我们可以在详细信息中获取前四个连接:

我们有两个值如下的表。

表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

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

内部连接

注:给出了两个表的交集,即表A和表B的共同行。

语法

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

左联接

注意:给出了表A中的所有选定行,以及表B中的所有公共选定行。

语法

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

右连接

注意:给出了表B中的所有选定行,以及表A中的所有公共选定行。

语法

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联接,顺序很重要。

最好去查看此链接,它将为您提供有关加入顺序的有趣细节。

其他回答

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

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

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

FULLJOIN从两个表中获取所有记录,并在相对表中不存在相关记录的列中放入NULL。

阅读这篇关于代码项目的原创文章将对您大有裨益:SQL联接的可视化表示。

还可以查看这篇文章:SQL SERVER–更好的性能–LEFT JOIN or NOT IN?。

在MySQL中的JOIN和OUTER JOIN的区别中找到原始的JOIN。

SQL JOIN子句用于组合来自两个或多个表的行,基于它们之间的公共场。

SQL中有不同类型的联接:

INNER JOIN:当两个表都匹配时,返回行。

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

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

FULLJOIN:组合左外部连接和右外部连接的结果。

连接的表将包含两个表中的所有记录,并为每一侧缺少的匹配项填写NULL。

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

CARESIAN JOIN:返回两个或多个连接表中记录集的笛卡尔乘积。

我们可以在详细信息中获取前四个连接:

我们有两个值如下的表。

表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

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

内部连接

注:给出了两个表的交集,即表A和表B的共同行。

语法

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

左联接

注意:给出了表A中的所有选定行,以及表B中的所有公共选定行。

语法

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

右连接

注意:给出了表B中的所有选定行,以及表A中的所有公共选定行。

语法

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联接,顺序很重要。

最好去查看此链接,它将为您提供有关加入顺序的有趣细节。