图解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的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚。
假设我们有两张表。Table A是左边的表,Table B是右边的表。其各有四条记录,其中有两条记录name是相同的,如下所示:
| A表 | |
| id | name |
| 1 | Pirate |
| 2 | Monkey |
| 3 | Ninja |
| 4 | Spaghetti |
| B表 | |
| id | name |
| 1 | Rutabaga |
| 2 | Pirate |
| 3 | Darth Vade |
| 4 | Ninja |
1、INNER JOIN
SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name
| 结果集 | |||
| (TableA.) | (TableB.) | ||
| id | name | id | name |
| 1 | Pirate | 2 | Pirate |
| 3 | Ninja | 4 | Ninja |

Inner join产生的结果集是A和B的交集。
(1) SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name
| 结果集 | |||
| (TableA.) | (TableB.) | ||
| id | name | id | name |
| 1 | Pirate | 2 | Pirate |
| 2 | Monkey | null | null |
| 3 | Ninja | 4 | Ninja |
| 4 | Spaghetti | null | null |
| null | null | 1 | Rutabaga |
| null | null | 3 | Darth Vade |

Full outer join产生A和B的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。可以使用IFNULL判断。
注意:
mysql 不支持全连接full join 的数据库,可以用union 来代替:
select * from hx_user LEFT JOIN hx_admin on hx_user.name = hx_admin.admin_name
UNION
SELECT * from hx_user RIGHT JOIN hx_admin on hx_user.name = hx_admin.admin_name;

(2) SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableA.id IS null OR TableB.id IS null
| 结果集 | |||
| (TableA.) | (TableB.) | ||
| id | name | id | name |
| 2 | Monkey | null | null |
| 4 | Spaghetti | null | null |
| null | null | 1 | Rutabaga |
| null | null | 3 | Darth Vade |

产生A表和B表没有交集的数据集。
select * from hx_user LEFT JOIN hx_admin on hx_user.name = hx_admin.admin_name where hx_user.name is NULL or hx_admin.admin_name is NULL
UNION
SELECT * from hx_user RIGHT JOIN hx_admin on hx_user.name = hx_admin.admin_name where hx_user.name is NULL or hx_admin.admin_name is NULL
3、LEFT [OUTER] JOIN
(1) SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name
| 结果集 | |||
| (TableA.) | (TableB.) | ||
| id | name | id | name |
| 1 | Pirate | 2 | Pirate |
| 2 | Monkey | null | null |
| 3 | Ninja | 4 | Ninja |
| 4 | Spaghetti | null | null |

Left outer join产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。
(2) SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS null
| 结果集 | |||
| (TableA.) | (TableB.) | ||
| id | name | id | name |
| 2 | Monkey | null | null |
| 4 | Spaghetti | null | null |
。
4、RIGHT [OUTER] JOIN
RIGHT OUTERJOIN是后面的表为基础,与LEFT OUTER JOIN用法类似。这里不介绍了。
5、UNION 与 UNION ALL
UNION操作符用于合并两个或多个SELECT语句的结果集。 请注意,UNION内部的SELECT语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条SELECT语句中的列的顺序必须相同。 UNION只选取记录,而UNION ALL会列出所有记录。
(1) SELECT name FROM TableA UNION SELECT name FROM TableB
| 新结果集 |
| name |
| Pirate |
| Monkey |
| Ninja |
| Spaghetti |
| Rutabaga |
| Darth Vade |
选取不同值
(2) SELECT name FROM TableA UNION ALL SELECT name FROM TableB
| 新结果集 |
| name |
| Pirate |
| Monkey |
| Ninja |
| Spaghetti |
| Rutabaga |
| Pirate |
| Darth Vade |
| Ninja |
全部列出来
(3) 注意:SELECT * FROM TableA UNION SELECT * FROM TableB
| 新结果集 | |
| id | name |
| 1 | Pirate |
| 2 | Monkey |
| 3 | Ninja |
| 4 | Spaghetti |
| 1 | Rutabaga |
| 2 | Pirate |
| 3 | Darth Vade |
| 4 | Ninja |
由于id 1 Pirate与id 2 Pirate并不相同,不合并。
还需要注册的是我们还有一个是“交差集”cross join,这种join没有办法用文式图表示,因为其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积。表达式如下:SELECT * FROM TableA CROSS JOIN TableB,这个笛卡尔乘积会产生4 x 4 = 16条记录,一般来说,我们很少用到这个语法。但是我们得小心,如果不是使用嵌套的select语句,一般系统都会产生笛卡尔乘积然再做过滤。这是对于性 能来说是非常危险的,尤其是表很大的时候。
图解SQL inner join、left join、right join、full outer join、union、union all的区别的更多相关文章
- EntityFramework 使用Linq处理内连接(inner join)、外链接(left/right outer join)、多表查询
场景:在实际的项目中使用EntityFramework都会遇到使用Ef处理连接查询的问题,这里做一些小例子如何通过Linq语法处理内连接(inner join).外连接(left/right oute ...
- oracle 内连接(inner join)、外连接(outer join)、全连接(full join)
转自:https://premier9527.iteye.com/blog/1659689 建表语句: create table EMPLOYEE(EID NUMBER,DEPTID NUMBER,E ...
- 图解SQL的inner join、left join、right join、full outer join、union、union all的区别
SQL的Join语法有很多,inner join(等值连接) 只返回两个表中联结字段相等的行,left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录,right join(右 ...
- 图解SQL的inner join(join)、left join、right join、full outer join、union、union all的区别
对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...
- 图解SQL的inner join、left join、right join、full outer join、union、union all的区别【转载】
对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...
- 图解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 是右边的表.其各有 ...
- SQL OUTER JOIN
When we want to select out all the record from two table, no matter it's present at second table or ...
- SQL夯实基础(一):inner join、outer join和cross join的区别
一.数据构建 先建表,再说话 create database Test use Test create table A ( AID ,) primary key, name ), age int ) ...
- Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别
转载来源 对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚. ...
随机推荐
- 为Go语言GC正名-20秒到100微妙的演变史
http://blog.csdn.net/erlib/article/details/51850912 https://blog.twitch.tv/gos-march-to-low-latency- ...
- Inno Setup入门(二十五)——Inno Setup类参考(11)
http://379910987.blog.163.com/blog/static/3352379720126693742406/ 今天说说TNewCheckListBox类.该类和ListBox差不 ...
- location和history
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- DELPHI开发LINUX桌面程序
DELPHI开发LINUX桌面程序 DELPHI官方目前为止尚不能开发LINUX桌面程序. 但三方控件FmxLinux(商业控件)是可以的.网上有破解版本.
- Netty游戏服务器之三搭建Unity客户端
既然已经写完了相关的服务器处理类,那么我们就来搭建客户端测试一下. 打开我们的unity3d,然后新建一个c#脚本,取名为MainClient. public class MainClient : M ...
- es6,async简单总结
1.简单来讲就是把函数变为异步操作的 async function demo() { let result = Math.random(); console.log(result); } 2.asyn ...
- unity 显示mipmaplevel
https://docs.unity3d.com/ScriptReference/Texture2D.SetPixels.html 显示mipmaplevel 需要贴图可读写不压缩 using Uni ...
- g++动态库静态库混合链接
今天编译一个程序时报错: g++ -static -o echo.fcgi echo_adaptor.o echo.o -L/usr/local/lib/ -lfastcgipp -L/usr/lib ...
- 浏览器兼容性问题解决方案之CSS,已在IE、FF、Chrome测试
当前主浏览器的核心是什么? 1) Trident:IE浏览器使用的内核,该内核程序在1997年的IE4中首次被采用,是微软在Mosaic代码的基础之上修改而来的,并沿用到目前的 IE7.Trident ...
- SOA服务总线设计
背景 基于总线的设计,借鉴了计算机内部硬件组成的设计思想(通过总线传输数据).在分布式系统中,不同子系统之间需要实现相互通信和远程调用,比较直接的方式就是“点对点”的通信方式,但是这样会暴露出一些很明 ...