SQL中inner join,outer join和cross join的区别

Posted

tags:

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

这三个join均是数据表相互连接用的。

1,inner join

属于内连接,返回两个表中都有记录的结果。

如:

select a.*, b.*
from tablea a inner join tableb b
    on a.id=b.id
/*
 查询结果为a的所有结果和b的所有结果 
行数, id,列1,id, 列2
1     01  Li   01   Lei -- 只有id同时存在于两个表中的记录。
*/

2,outer join

属于外联结,返回主表的所有记录,若从表条件有对应,返回从表记录,若从表条件不对应,返回空。

分为左连接(left outer join),右连接(right outer join)和全连接(full outer join)。其中outer 可以省略。

即,left join , right join 和 full join.

select a.*, b.*
from tablea a left join tableb b
    on a.id=b.id
/*
查询结果为如下: 
行数, id,列1,id, 列2
 1     01  Li   01   Lei  -- 表b中存在id为01的记录
 2     02  Kim  null null -- 表b中不存在id为02的记录,右侧显示为null
*/   

select a.*, b.*
from tablea a left join tableb b
    on a.id=b.id
where b.id is null -- 返回只存在于a中,不存在与b中记录
      b.id is not null --  返回存在于a中且存在于b中的记录。等同于inner join。

以上是左连接,左侧的表是主表,右侧是从表。

若是右连接,右侧是主表,左侧是从表。

tablea a right join tableb b on a.id=b.id

即,全部显示b表的记录,a表中id存在于b表中中,显示a表记录。若a表id不存在b表中,左侧显示null。

 

全连接(full join)是将内连接,左连接和右连接汇总的结果显示出来。

select a.*, b.*
from tablea a full join tableb b on a.id=b.id
/*
行数, id, 列1,id, 列2
 1     01   Li   01   Lei  -- inner join
 2     02   Kim  null null -- left join
 3     null null 03   Mei  -- right join
*/

 

3,cross join

交叉连接,左侧表的每一条记录与右侧表的每一条记录进行join,返回结果为笛卡尔积。 即左侧表5条记录,右侧表4条记录,返回5×4=20条记录。当然也要看具体的条件如何

select a.*, b.*
from tablea a cross join tableb b
where a.col='*' and b.col='#'
/* 
不能用on表示关联
行数, id, 列1,id, 列2
 1     01   *     01   # 
 2     01   *     03   #  
 3     01   *     07   #   
 4     03   *     01   # 
 5     03   *     03   #  
 6     03   *     07   #   
a 中col为*的两条记录,b 中col为#的三条记录,返回6条记录 
*/

参考技术A 共同点:
inner join, outer join, cross join 都是返回符合连接条件和查询条件的数据

不同点:
1. inner join: 内连接.
内连接查询到的结果: 实际上是两个表的交集.

语法: select * from A inner join B on 条件; (inner可以省略)

隐式内连接: select * from A,B where 条件;

显式内连接: select * from A inner join B on 条件;
2. outer join: 外连接

左外连接:

查询的结果: 是左边表的全部以及两个表的交集

语法: select * from A left outer join B on 条件;

右外连接:

查询结果: 是右边表的全部以及两个表的家里
语法: select * from A right outer join B on 条件;

3. cross join

交叉连接查询,也叫做笛卡尔积查询
查询结果: 得到的记录是两个表的笛卡尔积

语法: select * from A,B
参考技术B SQL中inner join、outer join和cross join的区别
http://blog.csdn.net/scythe666/article/details/51881235
上面有完整的图文示例,请参考
参考技术C 这种问题还真忘了,辛苦网上有答案。但是我认为你先理解什么叫笛卡尔积,然后在去理解join,其实理解多表连接 要先理解笛卡尔积才好。我讲的不好,贴上链接吧http://www.phpddt.com/db/inner_join-outer-join.html

SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)

原文链接:http://www.powerxing.com/sql-join/

 

总的来说,四种JOIN的使用/区别可以描述为:

left join 会从左表(shop)那里返回所有的记录,即使在右表(sale_detail)中没有匹配的行。

right outer join 右连接,返回右表中的所有记录,即使在左表中没有记录与它匹配

full outer join 全连接,返回左右表中的所有记录

在表中存在至少一个匹配时,inner join 返回行。 关键字inner可省略。

具体可以看stackoverflow上,Difference between Inner Join & Full join这个问题,说得蛮清楚的,我就搬运一下这个问题的答案好了。

Join

一共有三种OUTER JOIN:

  • LEFT OUTER JOIN
  • RIGHT OUTER JOIN
  • FULL OUTER JOIN

关键字OUTER是可选择的,取决于具体语言,在实现上它们都是遵循标准的,因此FULL JOINFULL OUTER JOIN是一样的。

接着将以简化的数据集来说明这些JOIN语句。考虑有如下两个数据集,注意到有些元素在A中有,在B中没有,反过来也是。

Set "A" Set "B"
 
AA BB
-------- --------
Item 1 Item 3
Item 2 Item 4
Item 3 Item 5
Item 4 Item 6

LEFT OUTER JOIN

现在执行如下SQL语句(左连接,LEFT OUTER JOIN):

SELECT * FROM A LEFT OUTER JOIN B ON AA = BB

将会得到如下的结果(空白的元素表示NULL):

AA BB
-------- --------
Item 1
Item 2
Item 3 Item 3
Item 4 Item 4

左连接(LEFT OUTER JOIN)会输出左边的表中的所有结果,如果右边的表中有相应项,则会输出,否则为NULL

因此,如果要找出在AA(左边的表)中有,而在BB(右边的表)中没有的数据项,可以使用如下的SQL语句:

SELECT * FROM A LEFT OUTER JOIN B ON AA = BB
WHERE BB is NULL
 

RIGHT OUTER JOIN

如果使用右连接,结果将会输出BB中所有的数据项和AA中相应的匹配项(注意你现在是获取了右边的表中的所有数据项):

SELECT * FROM A RIGHT OUTER JOIN B ON AA = BB
 
AA BB
-------- --------
Item 3 Item 3
Item 4 Item 4
Item 5
Item 6
 

FULL OUTER JOIN

如果想要取得所有的元素项,则可以使用FULL JOIN:

SELECT * FROM A FULL JOIN B ON AA = BB
 
AA BB
-------- --------
Item 1 <-----+
Item 2 |
Item 3 Item 3 |
Item 4 Item 4 |
Item 5 +--- empty holes are NULL‘s
Item 6 |
^ |
| |
+---------------------+

 

再次注意,缺失的数据项的值是NULL

INNER JOIN

INNER JOINJOIN是一样的,一般INNER关键字可以省略。INNER JOIN将只会返回相匹配的元素项,即不会返回结果为NULL的数据项。

SELECT * FROM A INNER JOIN B ON AA = BB
 
AA BB
-------- --------
Item 3 Item 3
Item 4 Item 4
 

CROSS JOIN

最后还有一个CROSS JOIN,笛卡儿积,将会返回A中每个元素分别匹配B中所有元素的结果,即N*M组合。

SELECT * FROM A CROSS JOIN B
 
AA BB
-------- --------
Item 1 Item 3 ^
Item 1 Item 4 +--- A中第一个元素, 匹配B中所有元素
Item 1 Item 5 |
Item 1 Item 6 v
Item 2 Item 3 ^
Item 2 Item 4 +--- A中第二个元素, 匹配B中所有元素
Item 2 Item 5 |
Item 2 Item 6 v
Item 3 Item 3 ... and so on
Item 3 Item 4
Item 3 Item 5
Item 3 Item 6
Item 4 Item 3
Item 4 Item 4
Item 4 Item 5
Item 4 Item 6

 

图解SQL的JOIN操作

这边也有一张图清楚的说明了每个JOIN操作。建议把上面的内容浏览一边后,再好好看下这张图片,相信对JOIN的操作应该就完全明白了。

技术分享

图解SQL的JOIN操作

以上是关于SQL中inner join,outer join和cross join的区别的主要内容,如果未能解决你的问题,请参考以下文章

SQL中inner join,outer join和cross join的区别

SQL中inner join,outer join和cross join的区别

SQL中的left outer join,inner join,right outer join用法详解

SQL中inner join,outer join和cross join的区别

SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)

SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)