What's the difference between INNER JOIN, LEFT JOIN, RIGHT JOIN and FULL JOIN?
INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN有什么区别?在MySQL中?
- mysqltutorial tizag.com / / / / mysqlleftjoin.php mysqljoins.php tizag.com mysqltutorial
- 阿特伍德的维恩图的解释由杰夫可能要你做。a视觉解释SQL连接
- 全外连接不存在在MySQL
- 我没有注意,答案是具体到MySQL,这是在一些地区有自己的语义。所以我会非常喜欢写湖上。
阅读这篇关于代码项目的原始文章将有很大帮助:SQL连接的可视化表示。
还要查看以下文章:SQL Server—更好的性能—左加入还是不加入?.
在mysql中的join和outer join的区别处找到原始的join。
- 这些照片不适合我。为什么右上角的图片不只是SELECT * FROM TableA;?为什么左上角的图片不是简单的SELECT * FROM TableB;?为什么上面的中间图片不是SELECT * FROM A INTERSECT SELECT * FROM B?等
- 我对整个概念有一个问题:它们是联合、相交等的视觉表示,它们没有投影的视觉表示,因此不能连接。我认为当上下文连接时,它将混淆的不仅仅是好处。
- @有一天,当你是第一个人,所以谁觉得很难低估
- 必须不同意。我认为这些是很好的视觉效果。乍一看,当使用某个联接时,您可以看到将从两个表中选择什么。"一天,当"评论"时,为什么不直接说"从表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应该与完整的外部联接具有相同的图。
- @ubanerjea是正确的:该图未能描述左联接将以何种方式拉入重复行,因为当b有多个与a.key相关的键时(可能是无意的)一对多的行为。我认为阿伦帕桑特千伏的答案更全面。
- "自然结合"怎么样?.有人能在这张图片上加上它的表现吗?
- 我不认为这些图表能解释任何东西,即使是以视觉的方式,除非你已经对它试图显示的内容有了深刻而具体的理解。对于一个第一次尝试学习加入的人来说,我认为他们一点都没有帮助。
- 这类图片和其他喜欢它的人可以在这里看到我的各种评论。@在这个问题上,我无意中实际上引用了你关于这种图表的话!
- @有一天,当1)将红色和白色混合时,红色是选定的元素。左上角相当于select * from TableA,如果TableB中没有与on子句匹配的元素。2)select a.x from TableA a只涉及TableA中的列,而select a.x, b.x from TableA a left join TableB b on a.abs=b.bas中也可以有TableB的结果。在1:n的情况下,TableA的行可以出现多次(有TableB的附加结果),在n:m的情况下,您甚至可以得到n*m行,在n:1的情况下,您可能会看到TableB的行乘以。
- @蒂诺1)是的,是的!很遗憾我不能改正我的意见。2)虽然我不反对你所说的,但我不认为左上角的图表传达了这一点。
- @蒂诺:在我看来,外部连接的最佳描述是:"一种猎枪式的婚姻:它迫使桌子形成一种结合。是的,我的意思是结合,即使有问题的桌子不符合通常的结合要求,也不加入。实际上,它是这样做的,在进行联合之前,用空值填充一个或两个表,从而使它们最终符合那些通常的要求。
- @有一天,当OMG,这只是有点不准确。因为union是一个SQL术语,所以这个词会严重混淆我们亲爱的初学者!另外,右下角的图像更像是一个"真实"的结合,因为只有不相交的部分——对我来说,这更像一个典型的猎枪婚姻;)
- @pranay rana我觉得我们可能需要"外部不包括联接"的最后一个数字的WHERE子句中的"和"条件,这样我们就可以得到一个联合B减去一个交互B的所需结果。我觉得需要更新查询以从表_a中选择一个完整的外部联接表_b on a.key=b.key,其中a.key为空,b.key为空,如果我们使用或,那么我们将gET联合B的所有结果
- 如果您认为所有的"左"和"右"联接都缺少"outer"关键字,那么这个图将更有用,并且与当前的SQL语法相匹配。请记住,此图在2008年版权所有。
- 这种可视化实际上是错误的。联接不能显示为维恩图。本文描述的问题是:blog.jooq.org/2016/07/05/…
- @一天当左上角连接时,左连接选择表A中的所有元素加上B中的匹配元素。
- @iheanyi:从B中选择的唯一"元素"与A中的元素相同。所以图片可以简化为一个红色圆圈,里面有一个A。原图并不表示当一个"元素"在A中,而不是在B中,它会被填充为空;这需要更详细的图片。我的观点是:图片适合集合,但不适合关系(特殊集合)。
- @有一天,那是完全错误的。联接将从A和B中选择列。如果所选全部是A中的行,则无法从B中获取列。
- @伊汉伊:错了,像中一样,图片显示空值吗?在哪里??我看不到任何空的图片。
- @有一天,图片不能显示空值。它使用了非常简单的集合图形表示,以大致了解SQL连接的工作方式。似乎您不了解SQL联接的工作方式或可视化表示的局限性。我强烈建议阅读答案中的相关文章。
- @有一天,一幅更复杂的图片会变得难以理解,更不用说在网上随机生成或查找了。你应该知道,如果你像你声称的那样有知识。此外,这些知识将使您能够阅读这里的问题、链接的文章和注释,并看到已经清楚地讨论了集合图的局限性。所以假装你仍然不能理解连接是如何工作的是相当不真诚的-除非我最初的印象是正确的,否则你不太明白这里发生了什么。
- @我明白了:我完全理解SQL连接。我知道对于SQL连接来说,文氏图不是一个合适的类比,因为它们太简单,太容易与其他SQL运算符(INTERSECT、EXCEPT、UNION混淆,而且正如您指出的,不显示对理解外部连接至关重要的空值。我在这里尝试了一种可视化的表示方法:stackoverflow.com/questions/38549/…。
- 这也许是关于SQL中不同类型联接的最好和最简单的解释。
- 请注意,左联接与交换表的右联接相同。
- @Abrar那些不了解Join的人,他们实际上并没有阅读那些经常转发的混乱的图表,他们经常认为它是有用的——但事实并非如此。看我之前的评论。你认为A圈能容纳A表的行吗?不重要。您认为在其他地方出现的情况和条件是否重要?没有。如果有重复的行,你认为这样行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行行但是,正确标记的维恩图版本确实说明了4/7连接之间的某些差异。
- 我对大多数可视图表的问题是,它们不显示表是如何连接在一起的。他们是一对一的吗?我可以一边连接多个,另一边连接一个吗?等。
- LEFT引用FROM子句中的表,RIGHT引用JOIN子句中添加的表。这最终向我解释了这个概念。我错了这么久,当我认为在ON子句中表是从两边引用的时候…因为我在中间有一个=标志,所以我左右都有。在我的例子中,FROM总是在JOIN之上——既不是左的也不是右的……
- @维恩图解是垃圾。请看我对重复问题的评论。此外,联接与键无关,任何两个表都可以在任何条件下进行有意义的联接。表之间的fk确实意味着输出以某种方式受到约束。
内部联接基于外键获取两个表之间的所有公共记录。
左联接从左链接表中获取所有记录,但如果从右表中选择了一些列,则如果没有相关记录,则这些列将包含空值。
右联接与上面的类似,但在右表中获取所有记录。
完全联接从两个表中获取所有记录,并将空值放在相关记录不在另一个表中的列中。
- 这在技术上是不正确的:"内部联接从第二个表中具有相关条目的一个表中获取所有记录"-内部联接不只是从一个表返回记录。
- @Nietaki"内部联接从第二个表中具有相关条目的一个表中获取所有记录"和"内部联接获取两个表之间的所有公共记录"之间的区别是什么?注意,他从未说过它只是从一个表中返回记录。
- @Barlop好吧,我看到评论Nietaki认为在第一个声明中,声明只是从一个表返回记录。不过,后一种说法更为含糊不清,无法解释内部联接的作用。所以这也是错误的。
- 当您说"内部联接获取两个表之间的所有公共记录"时,它建议进行一些测试,以查看两个记录是否相同。实际上,这只是一个条件,例如/几乎总是,测试一个领域的平等性。记录的其余部分不需要是相同的,通常也不会是相同的,因为如果它们是相同的,那么首先加入它们是没有好处的。它加入相应的记录。
- 这里还没有说明的是当您有多个对应的记录时会发生什么。在该字段中具有相同值的记录。在表A或表B或表A和B中。
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 |
有趣的事实
对于内部连接,顺序无关紧要
对于(左、右或全)外部联接,顺序很重要。
最好去看看这个链接,它会给你关于加入订单的有趣细节。
- full join与UNION不同。请参阅stackoverflow.com/questions/905379/…和social.msdn.microsoft.com/forums/sqlserver/en-us/…
- 为什么订单对外部连接很重要?您的意思是查询优化器的性能吗?结果集相同。
- @andriirubtsov内容相同,但对于外部联接,结果集中的集合顺序不同。
- 为什么会有左右连接????如果您切换工作台顺序,乙醚可以完成另一台的工作。它是多余的,并且只希望混淆任何人,因为"左"和"右"不能帮助您记住哪个表得到空值。
- @如您所知,使用表重新排序时左联接和右联接之间没有区别,反之亦然。但是,如果数据库连接代码中已经有了左连接,那么对右连接进行克拉通的工作就相对简单了,而且一些程序员喜欢使用左连接和右连接,而不是重新排序,这就是为什么他们两者都能想到的原因。
- @Arunprasanthkv我的观点是:(a)有不止一种方法来写同样的东西是没有帮助的,也就是说,如果你有两种方法来写所有的东西,那么写5行代码的方法的数量是5^2=25,这使得理解困难(b)左和右在语言上不是很有用(注意,大多数人忘记了哪一个是R并且在SQL中的意义与上下前后一样。没有什么能帮助你记住它背后的语义。
- @cpill可能是,但它取决于个人,从我的角度来看,我总是使用左联接和右联接。我从不更改表的顺序。我想仍有许多开发人员使用这种联接。在编程领域,有很多选择可以做一些并不意味着我们需要做所有的事情,我们可以根据我们的情况和兴趣来选择其中的任何一个。
- 我更喜欢甲骨文把(+)放在可选的一边。它是一个连接,条件真正描述了什么是标准。