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

Lion King 1602 mysql sql join inner-join outer-join

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

Pranay Rana.. 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认同)

Brian Leemin.. 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认同)

Arunprasanth.. 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                                           

表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

LEFT JOIN

注意:将给出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连接,顺序很重要

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

  • `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认同)

归档时间:

查看次数:

1361670 次

最近记录:

1 年,11 月 前