总的来说,四种join的区别可以描述为:

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

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

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

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

Join

一共有三种OUTER JOIN:

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

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

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

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

LEFT OUTER JOIN

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

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

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

  1. AA BB
  2. -------- --------
  3. Item 1
  4. Item 2
  5. Item 3 Item 3
  6. Item 4 Item 4

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

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

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

RIGHT OUTER JOIN

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

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

FULL OUTER JOIN

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

  1. SELECT * FROM A FULL JOIN B ON AA = BB
  2. AA BB
  3. -------- --------
  4. Item 1 <-----+
  5. Item 2 |
  6. Item 3 Item 3 |
  7. Item 4 Item 4 |
  8. Item 5 +--- empty holes are NULL's
  9. Item 6 |
  10. ^ |
  11. | |
  12. +---------------------+

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

INNER JOIN

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

  1. SELECT * FROM A INNER JOIN B ON AA = BB
  2. AA BB
  3. -------- --------
  4. Item 3 Item 3
  5. Item 4 Item 4

CROSS JOIN

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

  1. SELECT * FROM A CROSS JOIN B
  2. AA BB
  3. -------- --------
  4. Item 1 Item 3 ^
  5. Item 1 Item 4 +--- A中第一个元素, 匹配B中所有元素
  6. Item 1 Item 5 |
  7. Item 1 Item 6 v
  8. Item 2 Item 3 ^
  9. Item 2 Item 4 +--- A中第二个元素, 匹配B中所有元素
  10. Item 2 Item 5 |
  11. Item 2 Item 6 v
  12. Item 3 Item 3 ... and so on
  13. Item 3 Item 4
  14. Item 3 Item 5
  15. Item 3 Item 6
  16. Item 4 Item 3
  17. Item 4 Item 4
  18. Item 4 Item 5
  19. Item 4 Item 6

inner join, left join, right join, full outer join的区别的更多相关文章

  1. EntityFramework 使用Linq处理内连接(inner join)、外链接(left/right outer join)、多表查询

    场景:在实际的项目中使用EntityFramework都会遇到使用Ef处理连接查询的问题,这里做一些小例子如何通过Linq语法处理内连接(inner join).外连接(left/right oute ...

  2. oracle 内连接(inner join)、外连接(outer join)、全连接(full join)

    转自:https://premier9527.iteye.com/blog/1659689 建表语句: create table EMPLOYEE(EID NUMBER,DEPTID NUMBER,E ...

  3. 图解SQL的inner join、left join、right join、full outer join、union、union all的区别

    转自:http://blog.csdn.net/jz20110918/article/details/41806611 假设我们有两张表.Table A 是左边的表.Table B 是右边的表.其各有 ...

  4. 图解SQL的inner join、left join、right join、full outer join、union、union all的区别

    SQL的Join语法有很多,inner join(等值连接) 只返回两个表中联结字段相等的行,left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录,right join(右 ...

  5. 图解SQL的inner join(join)、left join、right join、full outer join、union、union all的区别

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...

  6. 图解SQL的inner join、left join、right join、full outer join、union、union all的区别【转载】

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...

  7. SQL OUTER JOIN

    When we want to select out all the record from two table, no matter it's present at second table or ...

  8. 图解SQL inner join、left join、right join、full outer join、union、union all的区别

    转于:http://justcoding.iteye.com/blog/2006487 这是一篇来自Coding Horror的文章. SQL的Join语法有很多:有inner的,有outer的,有l ...

  9. SQL夯实基础(一):inner join、outer join和cross join的区别

    一.数据构建 先建表,再说话 create database Test use Test create table A ( AID ,) primary key, name ), age int ) ...

  10. left outer join preserving unmatched rows from the first table

    https://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqlj18922.html INNER JOIN operation Specifies a join ...

随机推荐

  1. Apache(web服务器)与Tomcat(应用服务器)搭建集群

    web服务器:Apache.Nginx.IIS等 应用服务器:Tomcat.JBoss.Weblogic等 现在web服务器和应用服务器其实界限已经不是太清晰了,大部分的应用服务器也包含一些web服务 ...

  2. flume--为搬砖而生,日志传输的一把好手

    (一)flume的产生 为什么会有flume 随着互联网的发展,人们对网络日志产生的信息也越来越重视.不仅如此,我们的服务器,比如Nginx,每天都会产生大量的日志.我们要将这些日志收集到指定的地方, ...

  3. Ubuntu Linux 查看、编辑、比较二进制文件

    查看二进制有以下几种方法: 方法一:hexdump apt-get install libdata-hexdumper-perl 安装好之后就可以直接hexdump your_binary_file ...

  4. 个人小应用服务器安装搭建,HP 360p Gen9 使用winpe安装centos[一]

    以前用aws的时候使用的ec2, 里面可选的windows server搭配umbraco的cms做了自己的个人网站,主要是当年项目需要,使用aws,我也办了国际币种卡,在组里各种联系亚马逊开服务,后 ...

  5. ubuntu版本查看命令

    简单的 在命令终端输入 1.cat /etc/issue (简单) 2.cat /etc/lsb-release(具体) 3.uname -a(内核) 具体的 有时候我们安装软件或者搭建服务的时候,需 ...

  6. TP5 中的redis 队列

    首先我们看一下自己的TP5的框架中的  TP5\vendor\topthink ,这个文件中有没有think-queue这个文件夹,如果没有请安装, 安装这个是要用到Composer的如果没有安装co ...

  7. Ubuntu下查看so文件的函数列表

    Ubuntu下查看so文件的函数列表   可使用如下命令: 1.nm -D XXX.so 2.objdump -tT  XXX.so   nm libcyusb.so | grep "usb ...

  8. 高性能mysql 第7章 mysql高级特性之分区表

    分区表: 分区表是一个独立的逻辑表,底层通过多个物理表实现. mysql实现分区表的方式是对底层表的封装.这意味着没有全局索引,索引是建立在底层的每个表上的(跟ORACLE不一样). 用到分区表的几种 ...

  9. python之路-笔录2[CSS&JS]

    *** 目录 *** 1. 块级标签与行内标签 2. css常用清除样式 3. 两种清除浮动的方式 4. CSS学习 5. JS 学习 *** END *** 1. 块级标签与行内标签 常见的块级元素 ...

  10. Java8 新特性----函数式接口,以及和Lambda表达式的关系

    这里来讲解一下Java8 新特性中的函数式接口, 以及和Lambda 表达式的关系.看到过很多不少介绍Java8特性的文章,都会介绍到函数式接口和lambda表达式,但是都是分别介绍,没有将两者的关系 ...