INNER JOIN,LEFT JOIN,RIGHT JOIN和FULL JOIN之间有什么区别?

Lio*_*ing 1602 mysql sql join inner-join outer-join

什么之间的区别INNER JOIN,LEFT JOIN,RIGHT JOINFULL JOINMySQL的

Pra*_*ana 3133

阅读有关代码项目的原始文章将对您有所帮助:SQL连接的可视化表示.

替代文字

另请查看这篇文章:SQL SERVER - 更好的性能 - LEFT JOIN还是NOT IN?.

找到原始的:MySQL中的JOIN和OUTER JOIN之间的区别.

  • 这些照片不适合我.为什么右上图不是简单的`SELECT*FROM TableA;`?为什么左上图不是简单的`SELECT*FROM TableB;`?为什么顶部中间的图片不是`SELECT*FROM INTERSECT SELECT*FROM B`?等等 (215认同)
  • 不得不反对.我认为这些都是很好的可视化.在使用某个连接时,您可以一目了然地看到从两个表中选择的内容."onedaywhen"评论说"为什么不只是从表格中选择*"......好吧因为它是一个连接,需要两个表lol. (171认同)
  • 我对整个概念有一个问题:那些是联合,交叉,除等等的视觉表示.它们没有投影的直观表示,因此不能连接.我认为当上下文加入时,它会比收益更加困惑. (111认同)
  • 该图有一个主要问题,即它完全忽略了半连接和连接之间的区别.那就是:`从a.id = b.id`中的内部连接b中选择一个.*,然后从一个id in(select id from b)中选择一个.*.这是因为SQL连接不是两个集合的交集 - 连接可以是一个 - >一个,一个 - >多个,或者很多 - >很多.因此用Venn图表示实际上是不可能的:所有这个图表都显示"表格的哪一部分将参与连接".在这种情况下,从交叉连接b中选择a.*应该与完全外连接具有相同的图. (27认同)
  • SQL是一种从左到右读取的语言 - 是吗?:) (26认同)
  • 我不认为这些图解释任何东西,即使是以视觉方式,除非你已经对它试图展示的内容有了深刻而具体的理解.对于第一次尝试学习联接的人,我认为他们根本没有帮助. (11认同)
  • @ubanerjea是正确的:图表无法描述左边连接将引入重复行的方式,因为当B具有多于一个与A.key相关的键时,可能是非预期的一对多行为.我认为Arunprasanth KV的答案更全面. (8认同)
  • @onedaywhen 1)你混合了红色和白色,红色是所选元素.如果`TableB`中没有与`on`子句匹配的元素,则top*left*相当于`select*from TableA`.2)`从TableA a`中选择ax只涉及来自`TableA`的列,而`select ax,来自TableA的bx,a.abs = b.bas`上的左连接TableB b也可以得到来自`TableB`的结果.在`1:n`的情况下,`TableA`的行可以多次显示(来自`TableB`的附加结果),在`n:m`情况下你甚至可以达到'n*m`行,在`n:1`情况下,您可能会看到`TableB`的行数相乘. (4认同)
  • 我不得不同意,连接的命名(左和右)完全是愚蠢的,因为它暗示了特定的方向.FULL JOIN应为UNION JOIN,INNER JOIN应为INTERSECT JOIN,LEFT/RIGHT应为[RELATIVE] COMPLEMENT JOIN,您指定哪个表是补充端.您可以告诉设计师来自一种从左到右阅读的语言. (3认同)
  • @onedaywhen - 你是第一个发现难以理解的人 (2认同)

Bri*_*ing 685

INNER JOIN根据外键获取两个表之间通用的所有记录

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

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

FULL JOIN从两个表中获取所有记录,并将NULL放在相对表中不存在相关记录的列中

  • 这在技术上是不正确的:"INNER JOIN从一个表中获取第二个表中有一些相关条目的所有记录" - INNER JOIN不只是从一个表返回记录. (16认同)
  • @nietaki""INNER JOIN之间的区别是从一个表中获取所有记录,在第二个表中有一些相关的条目""和"INNER JOIN获取两个表之间共同的所有记录"?请注意,他从未说过只返回一个表中的记录. (7认同)
  • 此处未说明的是当您有多个相应记录时会发生什么...该字段中具有相同值的记录..在表A或表B或表A和表B中. (2认同)

Aru*_*K V 656

SQL JOIN子句用于根据它们之间的公共字段组合来自两个或多个表的行.

SQL中有不同类型的连接:

INNER JOIN:当两个表中都匹配时返回行.

LEFT JOIN:返回左表中的所有行,即使右表中没有匹配项也是如此.

RIGHT JOIN:返回右表中的所有行,即使左表中没有匹配项也是如此.

FULL JOIN:它结合了左外连接和右外连接的结果.

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

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

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

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

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

表A

id  firstName                  lastName
.......................................
1   arun                        prasanth                 
2   ann                         antony                   
3   sruthy                      abc                      
6   new                         abc                                           
Run Code Online (Sandbox Code Playgroud)

表B

id2 age Place
................
1   24  kerala
2   24  usa
3   25  ekm
5   24  chennai
Run Code Online (Sandbox Code Playgroud)

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

内部联接

注意:它给出了两个表的交集,即它们在TableA和TableB中共有的行

句法

SELECT table1.column1, table2.column2...
  FROM table1
 INNER JOIN table2
    ON table1.common_field = table2.common_field;
Run Code Online (Sandbox Code Playgroud)

将其应用于我们的样本表中:

SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place
  FROM TableA
 INNER JOIN TableB
    ON TableA.id = TableB.id2;
Run Code Online (Sandbox Code Playgroud)

结果将是

firstName       lastName       age  Place
..............................................
arun            prasanth        24  kerala
ann             antony          24  usa
sruthy          abc             25  ekm
Run Code Online (Sandbox Code Playgroud)

LEFT JOIN

注意:将给出TableA中的所有选定行,以及TableB中任何常见的选定行.

句法

SELECT table1.column1, table2.column2...
  FROM table1
  LEFT JOIN table2
    ON table1.common_field = table2.common_field;
Run Code Online (Sandbox Code Playgroud)

将其应用于我们的样本表中:

SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place
  FROM TableA
  LEFT JOIN TableB
    ON TableA.id = TableB.id2;
Run Code Online (Sandbox Code Playgroud)

结果

firstName                   lastName                    age   Place
...............................................................................
arun                        prasanth                    24    kerala
ann                         antony                      24    usa
sruthy                      abc                         25    ekm
new                         abc                         NULL  NULL
Run Code Online (Sandbox Code Playgroud)

正确的加入

注意:将给出TableB中的所有选定行,以及TableA中任何常见的选定行.

句法

SELECT table1.column1, table2.column2...
  FROM table1
 RIGHT JOIN table2
    ON table1.common_field = table2.common_field;
Run Code Online (Sandbox Code Playgroud)

将其应用于我们的样本表中:

SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place
  FROM TableA
 RIGHT JOIN TableB
    ON TableA.id = TableB.id2;
Run Code Online (Sandbox Code Playgroud)

结果

firstName                   lastName                    age     Place
...............................................................................
arun                        prasanth                    24     kerala
ann                         antony                      24     usa
sruthy                      abc                         25     ekm
NULL                        NULL                        24     chennai
Run Code Online (Sandbox Code Playgroud)

完全加入

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

句法

SELECT table1.column1, table2.column2...
  FROM table1
  FULL JOIN table2
    ON table1.common_field = table2.common_field;
Run Code Online (Sandbox Code Playgroud)

将其应用于我们的样本表中:

SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place
  FROM TableA
  FULL JOIN TableB
    ON TableA.id = TableB.id2;
Run Code Online (Sandbox Code Playgroud)

结果

firstName                   lastName                    age    Place
...............................................................................
arun                        prasanth                    24    kerala
ann                         antony                      24    usa
sruthy                      abc                         25    ekm
new                         abc                         NULL  NULL
NULL                        NULL                        24    chennai
Run Code Online (Sandbox Code Playgroud)

趣味事实

对于INNER加入,订单无关紧要

对于(LEFT,RIGHT或FULL)OUTER连接,顺序很重要

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

  • `full join`与`union`不是一回事.请参阅http://stackoverflow.com/questions/905379/what-is-the-difference-between-join-and-union和https://social.msdn.microsoft.com/Forums/sqlserver/en-US/cb8fed73 -c134-46ef-aff8-7d4ea57a1033 /差之间的工会,全和全外连接?论坛= TRANSACTSQL (8认同)
  • 为什么有左右连接???如果切换表顺序,则以太币可以完成另一个任务。它是多余的,仅希望将任何人弄混为“ LEFT”和“ RIGHT”,这并不能帮助您记住哪个表获得了NULL。 (2认同)
  • 另一个有趣的事实:如果仅使用`JOIN`,则默认值为`INNER JOIN`。 (2认同)