sql中left join、right join、inner join有啥区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql中left join、right join、inner join有啥区别相关的知识,希望对你有一定的参考价值。

left\right join是外部连接,inner join是内连接
外部连接有主表与从表,主表在left中是左侧表,right中是右侧表,主表数据会全部显示,从表数据则只显示关联部分匹配的数据,无匹配的数据用null补全
内连接则只显示两表关联条件匹配的数据
注:所谓关联条件即是指on的条件
参考技术A

left\\right join是外部连接,inner join是内连接
外部连接有主表与从表,主表在left中是左侧表,right中是右侧表,主表数据会全部显示,从表数据则只显示关联部分匹配的数据,无匹配的数据用null补全
内连接则只显示两表关联条件匹配的数据

left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID). B表记录不足的地方均为NULL.

参考技术B 二、内连接(INNER JOIN)

内连接(INNER JOIN):有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。

例如:下面的语句3和语句4的结果是相同的。

语句3:隐式的内连接,没有INNER JOIN,形成的中间表为两个表的笛卡尔积(如果没有where条件)。

SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAMEFROM CUSTOMERS C,ORDERS O WHERE C.ID=O.CUSTOMER_ID;

语句4:显示的内连接,一般称为内连接,有INNER JOIN,形成的中间表为两个表经过ON条件过滤后的笛卡尔积。

SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAMEFROM CUSTOMERS C INNER JOIN ORDERS O ON C.ID=O.CUSTOMER_ID;

三、外连接(OUTER JOIN)(必须有ON条件):
外连不但返回符合连接和查询条件的数据行,还返回不符合条件的一些行。
外连接分三类:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。
三者的共同点是都返回符合连接条件和查询条件(即:内连接)的数据行。不同点如下:
左外连接还返回左表中不符合连接条件单符合查询条件的数据行。
右外连接还返回右表中不符合连接条件单符合查询条件的数据行。
全外连接还返回左表中不符合连接条件单符合查询条件的数据行,并且还返回右表中不符合连接条件单符合查询条件的数据行。全外连接实际是上左外连接和右外连接的数学合集(去掉重复),即“全外=左外 UNION 右外”。
说明:左表就是在“(LEFT OUTER JOIN)”关键字左边的表。右表当然就是右边的了。在三种类型的外连接中,OUTER 关键字是可省略的。
下面举例说明:

语句5:左外连接(LEFT OUTER JOIN)
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;

语句6:右外连接(RIGHT OUTER JOIN)
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O RIGHT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;注意:WHERE条件放在ON后面查询的结果是不一样的。例如:

语句7:WHERE条件独立。
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_IDWHERE O.ORDER_NUMBER<>'MIKE_ORDER001';

语句8:将语句7中的WHERE条件放到ON后面。
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID AND O.ORDER_NUMBER<>'MIKE_ORDER001';

从语句7和语句8查询的结果来看,显然是不相同的,语句8显示的结果是难以理解的。因此,推荐在写连接查询的时候,ON后面只跟连接条件,而对中间表限制的条件都写到WHERE子句中。
参考技术C 通俗一点就是:
left以 left join 左侧的表为主表
right 以 right join 右侧表为主表
inner join 查找的数据是左右两张表共有的
参考技术D http://www.cnblogs.com/pcjim/articles/799302.html详细介绍,就不复制了

SQL中RIGHT和LEFT JOIN与RIGHT和LEFT OUTER JOIN之间的区别[重复]

【中文标题】SQL中RIGHT和LEFT JOIN与RIGHT和LEFT OUTER JOIN之间的区别[重复]【英文标题】:Difference between RIGHT & LEFT JOIN vs RIGHT & LEFT OUTER JOIN in SQL [duplicate] 【发布时间】:2011-03-12 03:38:40 【问题描述】:

结果有什么区别:

    右连接和右外连接 左连接和左外连接?

你能通过一些例子解释一下吗?

【问题讨论】:

内连接和外连接(包括在此页面上)再次滥用维恩图,请参阅我对重复问题的评论。 【参考方案1】:

RIGHT JOINRIGHT OUTER JOIN 之间没有区别。两者都是一样的。这意味着LEFT JOINLEFT OUTER JOIN 是相同的。

Visual Representation of SQL Joins

【讨论】:

这是我用于连接的新 goto 图像。 这张图片可能是向某人解释不同类型连接之间差异的最佳/最快方式。很好的发现。 这很有趣。 (n00b 警告)那你为什么需要左右连接呢?为什么不直接在查询中反转主表和连接表的位置并使用一个连接方向? 因为有时您将超过 2 个表连接在一起,这样您就可以更灵活地选择写出查询的方式。 我删除了图片;根据 CodeProject 许可证,The Articles discussing the Work published in any form by the author may not be distributed or republished without the Author's consent. 除非您有作者使用此图片的权限,否则您不能将其添加到您的问题中。【参考方案2】:

SQL Join 很好的解释:

参考:link

【讨论】:

没有名字【参考方案3】:

结果有什么区别:

右连接和右外连接

没有区别。

左连接和左外连接?

没有区别。

简单地说,OUTER 关键字是可选的。您可以在不影响结果集的情况下包含或省略它。

【讨论】:

这是在哪里记录的?【参考方案4】:

这是一个非常好的Visual Explanation 连接,通常由我们自己的 Jeff Atwood 完成。右外连接和右连接一样,左连接和左外连接也一样。

【讨论】:

他在自己的 cmets 中否认了该帖子。请参阅我对维恩图滥用问题(和该帖子)的评论。 我找不到您的评论。我不确定“否认”是我会选择的词。很明显,维恩图式的解释并没有涵盖几个重要的案例。 对不起,我没有看到我预期的 208 条评论。但我期望它说的是我的其他 cmets 所说的,请参阅我对这里问题的评论。 你好像没有注意我的cmets实际上说了什么,就是人们没有注意维恩图帖子实际上说的是什么。例如:圆圈表示 tableA 和 tableB,但在最慈善的解释下,它们包含表 A 左连接表 B 和表 A 右连接表 B 中的行值。 Jeff 的评论(#33)包括“任何导致比你最初开始的行更多的东西都绝对破坏了整个维恩图的概念”——这就是否定。此外,他比他想象的要错,因为当没有更多的行时它们也会崩溃。

以上是关于sql中left join、right join、inner join有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER LEFT JOIN, INNER JOIN, RIGHT JOIN

SQL中left join on 、right join on、inner join on之间的区别

sql JOINs - JOIN,INNER JOIN,LEFT JOIN,RIGHT JOIN,CROSS JOIN

sql语句中 left join,right join,inner join 的区别

SQL 的 left join 和 right join

SQL中Left Join 与Right Join 与 Inner Join 与 Full Join的区别