总的来说,四种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. linux shell 数组的使用

    引言 在Linux平台上工作,我们经常需要使用shell来编写一些有用.有意义的脚本程序.有时,会经常使用shell数组.那么,shell中的数组是怎么表现的呢,又是怎么定义的呢?接下来逐一的进行讲解 ...

  2. windows2012下一端口多网站 Apache配置

    援引自https://www.cnblogs.com/huangtailang/p/6026828.html 1.在httpd.conf文件里启用虚拟主机功能,即去掉下面配置项前面的# #LoadMo ...

  3. 前端js之BOM和DOM操作

    目录 引入 BOM操作 window对象 history对象 location对象(重点) 弹出框 定时器 计时器相关 DOM 查找标签 直接查找 间接查找 节点操作 创建节点及添加节点 删除节点 替 ...

  4. 【leetcode】1233. Remove Sub-Folders from the Filesystem

    题目如下: Given a list of folders, remove all sub-folders in those folders and return in any order the f ...

  5. Python 异常处理Ⅱ

    异常处理 捕捉异常可以使用try/except语句. try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理. 如果你不想在异常发生时结束你的程序,只需在try ...

  6. win10 1903 更改文字大小

    标题栏 - 菜单 - 消息框 - 调色板标题11- 图标 - 工具提示 - Caption 标题 的 宽/高 - ; 14的宽高 - 菜单 的 宽/高 - ; 的宽高 -; 设置 注册表 HKEY_C ...

  7. python 正则表达式实例

    字符匹配 实例 描述 python 匹配 "python". 字符类 实例 描述 [Pp]ython 匹配 "Python" 或 "python&qu ...

  8. k8s删除节点后再重新添加进去(踩坑)

    开启本地集群,发现一台节点出问题了,想删除再换一台节点,结果就踩坑了,还好本地有好几套环境. 再master节点执行以下命令 [root@k8s-master ~]# kubectl drain k8 ...

  9. make文件基础用法

    参照:https://www.jianshu.com/p/0b2a7cb9a469 创建工作目录,包含一下文件 main.c person.c b.h c.h /*** c.h ***/ //this ...

  10. BZOJ 2669 Luogu P3160 [CQOI2012]局部极小值 (容斥原理、DP)

    题目链接 (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=2669 (luogu) https://www.luogu.org/prob ...