对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章(实在不清楚为什么Coding Horror也被墙)通过 文氏图 Venn diagrams解释了SQL的Join。
贴个广告
楼主的博客已全部搬迁至自己的博客,感兴趣的小伙伴请移步haifeiWu与他朋友们的博客专栏
建表
在这里呢我们先来建立两张有外键关联的张表。
CREATE DATABASE db0206;
USE db0206;
CREATE TABLE `db0206`.`tbl_dept`(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`deptName` VARCHAR(30),
`locAdd` VARCHAR(40),
PRIMARY KEY (`id`)
) ENGINE=INNODB CHARSET=utf8;
CREATE TABLE `db0206`.`tbl_emp`(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20),
`deptId` INT(11),
PRIMARY KEY (`id`),
FOREIGN KEY (`deptId`) REFERENCES `db0206`.`tb_dept`(`id`)
) ENGINE=INNODB CHARSET=utf8;
INSERT INTO tbl_dept(deptName,locAdd) VALUES('RD',11);
INSERT INTO tbl_dept(deptName,locAdd) VALUES('HR',12);
INSERT INTO tbl_dept(deptName,locAdd) VALUES('MK',13);
INSERT INTO tbl_dept(deptName,locAdd) VALUES('MIS',14);
INSERT INTO tbl_dept(deptName,locAdd) VALUES('FD',15);
INSERT INTO tbl_emp(NAME,deptId) VALUES('z3',1);
INSERT INTO tbl_emp(NAME,deptId) VALUES('z4',1);
INSERT INTO tbl_emp(NAME,deptId) VALUES('z5',1);
INSERT INTO tbl_emp(NAME,deptId) VALUES('w5',2);
INSERT INTO tbl_emp(NAME,deptId) VALUES('w6',2);
INSERT INTO tbl_emp(NAME,deptId) VALUES('s7',3);
INSERT INTO tbl_emp(NAME,deptId) VALUES('s8',4);
文氏图与SQL语句的编写以及查询结果
内连接
内连接文氏图
![表的内连接](http://of9xsczb1.bkt.clouddn.com/%E4%BA%A4%E9%9B%86.png)
执行的sql语句以及执行的查询结果
select * from tbl_dept a inner join tbl_emp b on a.id=b.deptId;
- 查询结果
![这里写图片描述](http://of9xsczb1.bkt.clouddn.com/%E5%86%85%E8%BF%9E%E6%8E%A5.png)
左外连接
左外连接文氏图
![左连接](http://of9xsczb1.bkt.clouddn.com/%E5%85%A8A.png)
执行的sql语句以及执行的查询结果
select * from tbl_dept a left join tbl_emp b on a.id=b.deptId;
- 查询结果
![左外连接](http://of9xsczb1.bkt.clouddn.com/%E5%B7%A6%E8%BF%9E%E6%8E%A5.png)
右外连接
右外连接文氏图
![这里写图片描述](http://of9xsczb1.bkt.clouddn.com/%E5%85%A8B.jpg)
执行的sql语句以及执行的查询结果
select * from tbl_dept a right join tbl_emp b on a.id=b.deptId;
- 查询结果
![这里写图片描述](http://of9xsczb1.bkt.clouddn.com/%E5%8F%B3%E5%A4%96%E9%93%BE%E6%8E%A5.png)
左连接
左连接文氏图
![这里写图片描述](http://of9xsczb1.bkt.clouddn.com/%E7%8B%AC%E6%9C%89A.png)
执行的sql语句以及执行的查询结果
elect * from tbl_dept a left join tbl_emp b on a.id=b.deptId where b.deptId is null;
![这里写图片描述](http://of9xsczb1.bkt.clouddn.com/%E5%B7%A6%E5%A4%96%E8%BF%9E%E6%8E%A5.png)
右连接
右连接文氏图
![右连接](http://of9xsczb1.bkt.clouddn.com/%E7%8B%AC%E6%9C%89B.jpg)
执行的sql语句以及执行的查询结果
select * from tbl_dept a right join tbl_emp b on a.id=b.deptId where a.id is null;
![右连接](http://of9xsczb1.bkt.clouddn.com/%E5%8F%B3%E8%BF%9E%E6%8E%A5.png)
全连接
全连接文氏图
![这里写图片描述](http://of9xsczb1.bkt.clouddn.com/%E5%85%A8%E9%9B%86.png)
执行的sql语句以及执行的查询结果
select * from tbl_dept a right join tbl_emp b on a.id=b.deptId
union
select * from tbl_dept a left join tbl_emp b on a.id=b.deptId;
- 查询结果
![全连接](http://of9xsczb1.bkt.clouddn.com/%E5%85%A8%E8%BF%9E%E6%8E%A5.png)
两张表中都没有出现的数据集
文氏图
![](http://of9xsczb1.bkt.clouddn.com/%E7%8B%ACA%E7%8B%ACB%E5%B9%B6%E9%9B%86.png)
执行的sql语句以及执行的查询结果
select * from tbl_dept a right join tbl_emp b on a.id=b.deptId where a.id is null union select * from tbl_dept a left join tbl_emp b on a.id=b.deptId where b.deptId is null;
![这里写图片描述](https://img-blog.csdn.net/20170207121944814?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ2l0aHViXzM2Mzc5OTM0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)