问:
这个问题在这里已经有了答案:“INNER JOIN”和“OUTER JOIN”有什么区别? (28 个回答) 7 年前关闭。
MySQL 中的 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN 有什么区别?
huntsbot.com – 高效赚钱,自由工作
答1:
huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。
阅读这篇关于代码项目的原创文章会对您有很大帮助:Visual Representation of SQL Joins。
https://i.stack.imgur.com/VQ5XP.png
另请查看此帖子:SQL SERVER – Better Performance – LEFT JOIN or NOT IN?。
在 Difference between JOIN and OUTER JOIN in MySQL 找到原始文件。
这些照片不适合我。为什么右上角的图片不是简单的SELECT * FROM TableA;?为什么左上图不是简单的SELECT * FROM TableB;?为什么顶部中间的图片不是 SELECT * FROM A INTERSECT SELECT * FROM B ? ETC
我对整个概念有疑问:这些是联合、相交、除外等的视觉表示。它们没有投影的视觉表示,因此不能是连接。我认为当上下文连接时,它会混淆更多的好处。
不得不不同意。我认为这些都是很好的可视化。一目了然,您可以看到使用某个联接时将从两个表中选择什么。 “onedaywhen”评论道“为什么不直接说 select * from table a”.... 好吧,因为它是一个连接,需要两个表,哈哈。
SQL 是一种从左到右阅读的语言——是吗? :)
该图有一个主要问题,就是它完全忽略了半连接和连接之间的区别。即:select a.* from a inner join b on a.id = b.id 与 select a.* from a where id in (select id from b)。这是因为 SQL 连接不是两个集合的交集——连接可以是一->一、一->多或多->多。所以实际上不可能用维恩图来表示:这个图所做的只是告诉你“表的哪一部分将参与连接”。在这种情况下,select a.* from a cross join b 应该与完全外连接具有相同的图表。
答2:
huntsbot.com – 高效赚钱,自由工作
SQL JOIN 子句用于根据它们之间的公共字段组合来自两个或多个表的行。
SQL 中有不同类型的连接可用:
INNER JOIN:当两个表都匹配时返回行。
LEFT JOIN:返回左表中的所有行,即使右表中没有匹配项。
RIGHT JOIN:返回右表中的所有行,即使左表中没有匹配项。
FULL JOIN:结合左右外连接的结果。
连接的表将包含两个表中的所有记录,并为两边缺失的匹配项填写 NULL。
SELF JOIN:将一个表连接到自身,就好像该表是两个表一样,在 SQL 语句中临时重命名至少一个表。
CARTESIAN JOIN:返回两个或多个连接表中记录集的笛卡尔积。
我们可以在 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 连接,顺序很重要。
最好去看看这个Link,它会给你关于加入顺序的有趣细节。
full join 与 union 不同。请参阅 stackoverflow.com/questions/905379/… 和 social.msdn.microsoft.com/Forums/sqlserver/en-US/…
答3:
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
INNER JOIN 根据提供的 ON 子句获取两个表之间共有的所有记录。
LEFT JOIN 从 LEFT 链接中获取所有记录,从右表中获取相关记录,但是如果您从 RIGHT 表中选择了一些列,如果没有相关记录,这些列将包含 NULL。
RIGHT JOIN 与上面类似,但获取 RIGHT 表中的所有记录。
FULL JOIN 从两个表中获取所有记录,并将 NULL 放在对面表中不存在相关记录的列中。
这在技术上是不正确的:“INNER JOIN 从一个表中获取所有记录,这些记录在第二个表中有一些相关条目” - INNER JOIN 不只是从一个表返回记录。
huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!