总的来说,四种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. UltraEdit中的特殊字符

    以下特殊字符,可以在替换中用到, ^n--换行 ^t--Tab

  2. 第十篇.2、python并发编程之多进程

    一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.P ...

  3. Chrome安装Axure插件axure-chrome-extension

    用Chrome打开Axure发布的原型图打不开,提示需要安装axure-chrome-extension插件,如下图提示 下面记录一下安装过程,其实很简单,插件没必要从网上到处找,在你发布的路径下就有 ...

  4. win redis安装

    一.下载windows版本的Redis 去官网找了很久,发现原来在官网上可以下载的windows版本的,现在官网以及没有下载地址,只能在github上下载,官网只提供linux版本的下载 官网下载地址 ...

  5. nmap脚本(nse)使用总结

    nmap脚本主要分为以下几类,在扫描时可根据需要设置--script=类别这种方式进行比较笼统的扫描: auth: 负责处理鉴权证书(绕开鉴权)的脚本   broadcast: 在局域网内探查更多服务 ...

  6. Test测试方法

    Junit 注解 解释 @Before 在每个测试方法运行前执行的方法 @After 在每个测试方法运行后执行的方法 @BeforeClass 在类中所有测试运行之前运行的方法 @AfterClass ...

  7. k8s管理pod资源对象(上)

    一.容器于pod资源对象 现代的容器技术被设计用来运行单个进程时,该进程在容器中pid名称空间中的进程号为1,可直接接收并处理信号,于是,在此进程终止时,容器即终止退出.若要在一个容器中运行多个进程, ...

  8. 使用IDEA搭建一个Spring + AOP (权限管理 ) + Spring MVC + Mybatis的Web项目 (零配置文件)

    前言: 除了mybatis 不是零配置,有些还是有xml的配置文件在里面的. 注解是Spring的一个构建的一个重要手段,减少写配置文件,下面解释一下一些要用到的注解: @Configuration  ...

  9. 图片url 设置大小

    假设有一个图片url为:http://localhost/PictureUrl/ImgURL.aspx?PicUrl=.//testImg\test.jpg (文件夹testImg下有个文件test. ...

  10. 21. ClustrixDB 识别平台限制

    本节描述集群性能上潜在的限制平台因素,如何度量集群是否接近或超过这些限制,以及纠正这些条件的可用选项.“平台因素”指的是硬件资源,如CPU.内存.磁盘和网络I/O子系统.有关潜在的软件相关因素,请参见 ...