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联接,顺序很重要。
最好去查看此链接,它将为您提供有关加入顺序的有趣细节。
推荐文章
- LEFT OUTER JOIN如何返回比左表中存在的记录更多的记录?
- 如何用SQL语句计算百分比
- Postgres唯一约束与索引
- SQL Server动态PIVOT查询?
- MySQL对重复键更新在一个查询中插入多行
- 向现有表添加主键
- mysql_connect():[2002]没有这样的文件或目录(试图通过unix:///tmp/mysql.sock连接)在
- 使用电子邮件地址为主键?
- MySQL:如何复制行,但改变几个字段?
- 不能删除或更新父行:外键约束失败
- MongoDB在v4之前不兼容ACID意味着什么?
- SQL WHERE ID IN (id1, id2,…idn)
- Mysql错误1452:不能添加或更新子行:外键约束失败
- 最常见的SQL反模式是什么?
- 错误:没有唯一的约束匹配给定的键引用表"bar"