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 JOIN和FULL 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 JOIN跟JOIN是一样的,一般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的JOIN语法解析(inner join, left join, right join, full outer join的区别)的更多相关文章
- Mysql Join语法解析与性能分析详解
一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona table1 ...
- (转)MySQL join语法解析与性能分析
文章转载的:http://www.cnblogs.com/BeginMan/p/3754322.html 一.join语法概述 join用于多表中字段之间的联系,语法如下: ... FROM tabl ...
- [转]Mysql Join语法解析与性能分析
转自:http://www.cnblogs.com/BeginMan/p/3754322.html 一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 ...
- 对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章,通过文氏图 Venn diagrams 解释了SQL的Join。我觉得清楚易懂,转过来。
对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codi ...
- SQL Fundamentals || 多表查询(内连接,外连接(LEFT|RIGHT|FULL OUTER JOIN),自身关联,ON,USING,集合运算UNION)
SQL Fundamentals || Oracle SQL语言 一.多表查询基本语法 在进行多表连接查询的时候,由于数据库内部的处理机制,会产生一些“无用”的数据,而这些数据就称为笛卡尔积. 多表查 ...
- 图解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 ...
- SQL inner join, join, left join, right join, full outer join
基本信息 创建两个表a1, a2. 两个表的重要差别是:a1 中有5,'wu',a2中没有. a2中有 4,'li',而a1中没有. 创建表和插入数据的代码如下: -- 创建a1表 create ta ...
- MySQL- -Join语法解析与性能分析
Mysql Join语法解析与性能分析 一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ...
- SQL SERVER常用语法汇总
阅读目录 一.SQL分类 二.基础语句 三.sql技巧 四.(MS SQL Server)SQL语句导入导出大全 回到目录 一.SQL分类 DDL—数据定义语言(CREATE,ALTER,DROP,D ...
随机推荐
- (转载)在spring的bean中注入内部类
原文链接:http://outofmemory.cn/java/spring/spring-DI-inner-class 在spring中注入内部类,有可能会遇到如下异常信息: 2014-5-14 2 ...
- mysql基础之yum安装mysql5.7.18
2017-04-19 一.实验环境 centos7_x64 由于centos7的yum源里默认使用了mariadb替代了mysql,所有我们还得先配置一下yum源.当然mariadb和mysql是兼容 ...
- 参数错误。 (异常来自 HRESULT:0x80070057 (E_INVALIDARG))
异常来自 HRESULT:0x80070057 (E_INVALIDARG)未能加载程序集.......几次删除引用然后重新引用程序集还是报错 奔溃中....网上搜索还真有解决办法:解决方法 是 删除 ...
- Sass学习笔记(补充)
阅读目录 1. Sass和SCSS的区别 2. @while循环 3. @at-root 4. @content 5. 凸显注释 6. CSS输出样式 7. 重置浏览器样式 8. Sass调试和@de ...
- python基础(7):元祖类型(赋值补充)
前面学了列表和字典,今天我们看一个和列表相似的类型元祖. 预习: 简单购物车 实现打印商品详细信息,用户输入商品名和购买个数,则将商品名,价格,购买个数加入购物列表,如果输入为空或其他非法输入则要求用 ...
- 制作Docker镜像
编写DockerFile 这个DockerFile是一个制作镜像的配方,用于描述这些文件,环境,和命令.在Linux.macOS的窗口终端中,或者windows的命令提示符下,执行下面的步骤,切记如果 ...
- hdu_5964:平行四边形
打重现赛时,一点思路也没有,然后又看到这题AC数那么少,就直接放弃了.今天重新看了看,借鉴了下别人的,发现此题应该算是一道可解题. 看上去,这题的ans是同时有两个点作为自变量的函数(然而n^2复杂度 ...
- rsync技术报告(翻译)
本篇为rsync官方推荐技术报告rsync technical report的翻译,主要内容是Rsync的算法原理以及rsync实现这些原理的方法.翻译过程中,在某些不易理解的地方加上了译者本人的注释 ...
- Jenkins2 实现持续交付初次演练(MultiJob,Pipeline,Blue Ocean)
背景 项目需要用到自动部署,但可获取外网的节点机器只有一台,那只能同过主节点机器进行构建完成然后分发至对应服务器进行启动更新. 目前已尝试过三种方式: 1.Pipeline-Trigger param ...
- jenkins+ANT+jmeter 接口测试环境搭建
目的 jmeter很早就接触了,最近又在接触项目的时候整了一下.写这篇博客主要有两个目的 1,为了给自己搭建jmeter做一个总结. 2,在部署过程中遇到过一些坑,在这分享出来,也希望能给需要的人一个 ...