博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
inner join, left join, right join, full outer join的区别
阅读量:4979 次
发布时间:2019-06-12

本文共 1945 字,大约阅读时间需要 6 分钟。

 

总的来说,四种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.  
  3. AA BB
  4. -------- --------
  5. Item 1 Item 3
  6. Item 2 Item 4
  7. Item 3 Item 5
  8. 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.  
  3. AA BB
  4. -------- --------
  5. Item 3 Item 3
  6. Item 4 Item 4
  7. Item 5
  8. Item 6

FULL OUTER JOIN

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

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

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

INNER JOIN

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

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

CROSS JOIN

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

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

转载于:https://www.cnblogs.com/halberd-lee/p/10979883.html

你可能感兴趣的文章
【Linux 运维】 安装PHP工具Composer
查看>>
深度学习笔记之目标检测算法系列(包括RCNN、Fast RCNN、Faster RCNN和SSD)
查看>>
机器学习概念之特征转换(Feature conversion)
查看>>
全网最详细的一个超级好用的命令行工具【Cmder】的优点有哪些?
查看>>
Elasticsearch的前后台运行与停止(rpm包方式)
查看>>
再谈spark部署搭建和企业级项目接轨的入门经验(博主推荐)
查看>>
Spark Tachyon的命令行使用
查看>>
weekend110(Hadoop)的 第五天笔记
查看>>
系统网络概述
查看>>
css定位relative,absolute
查看>>
字符串操作
查看>>
ios 利用Reveal来调试界面2--真机调试(步骤详解)
查看>>
python中getpass模块
查看>>
Seaborn 的示例数据集(load_dataset)
查看>>
PHP 正则表达式
查看>>
Linux之磁盘挂载
查看>>
docker swarm集群
查看>>
数值转换convert还是...
查看>>
WdatePicker日历控件使用方法
查看>>
ActionProvider使用示例
查看>>