图解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出来的结果集是什么样子有点不是很清楚. ...
随机推荐
- #iOS问题记录# UIWebView滑动到底部
最近看Tmall的iOS APP,在Tmall的商品简介页面,当拖动到最底部时,会提示继续向上拖动,“查看图文详情”: 觉得这个设计挺好的.闲来无事,自己UIWebView模仿一下,问题是检查UIWe ...
- Eclipse运行Maven的SpringMVC项目Run on Server时出现错误:Error configuring application listener of class org.springframework.web.context.ContextLoaderListener的问题解决
错误: 严重: Error configuring application listener of class org.springframework.web.context.ContextLoade ...
- Android Activtity Security(转)
Android四大组件之一--Activity安全详解. 原帖地址:http://drops.wooyun.org/tips/3936 0x00 科普 Android每一个Application都是由 ...
- HDU 1507 Uncle Tom's Inherited Land*(二分匹配,输出任意一组解)
Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- node.js 中createConnection参数说明
host:主机地址 (默认:localhost) user:用户名 password:密码 port:端口号 (默认:3306) database:数据库名 charset:连接字符集(默认:'UTF ...
- Openshift部署Zookeeper和Kafka
部署Zookeeper github网址 https://github.com/ericnie2015/zookeeper-k8s-openshift 1.在openshift目录中,首先构建imag ...
- select标签中的选项分组
select标签中的选项分组 <select name="showtimes"> <optgroup label="下午一点"> < ...
- gdc skin
https://www.gdcvault.com/play/1024410/Achieving-High-Quality-Low-Cost 这篇是教美术怎么用做地形那种方法 复用贴图 做skin的 做 ...
- 把自动机用作 Key-Value 存储
以前只有代码,最近简单写了一点文档: google code 上的链接(总是最新) 自动机是什么 DFA 的最小化 将 DFA 用做字典 无环DFA (ADFA, Acyclic DFA) 编译 内存 ...
- 【笔记】js 关于定时器的理解
总所周知 js 里面的 setTimeout() 方法是用来设定某些功能在某段时间间隔之后执行的.但是今天看了高程对定时器的描述发现并不是这样. setTimeout(function(){ //.c ...