MySQL的7中JOIN用法详解

七种JOIN都是什么?

向数据中插入测试数据 t_emp和t_dept

CREATE TABLE `t_dept` (
 `id` INT(11) NOT NULL AUTO_INCREMENT,
 `deptName` VARCHAR(30) DEFAULT NULL,
 `address` VARCHAR(40) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
 
CREATE TABLE `t_emp` (
 `id` INT(11) NOT NULL AUTO_INCREMENT,
 `name` VARCHAR(20) DEFAULT NULL,
  `age` INT(3) DEFAULT NULL,
 `deptId` INT(11) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `fk_dept_id` (`deptId`)
 #CONSTRAINT `fk_dept_id` FOREIGN KEY (`deptId`) REFERENCES `t_dept` (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
 
 
 
INSERT INTO t_dept(deptName,address) VALUES('华山','华山');
INSERT INTO t_dept(deptName,address) VALUES('丐帮','洛阳');
INSERT INTO t_dept(deptName,address) VALUES('峨眉','峨眉山');
INSERT INTO t_dept(deptName,address) VALUES('武当','武当山');
INSERT INTO t_dept(deptName,address) VALUES('明教','光明顶');
 INSERT INTO t_dept(deptName,address) VALUES('少林','少林寺');
 
INSERT INTO t_emp(NAME,age,deptId) VALUES('风清扬',90,1);
INSERT INTO t_emp(NAME,age,deptId) VALUES('岳不群',50,1);
INSERT INTO t_emp(NAME,age,deptId) VALUES('令狐冲',24,1);
 
 INSERT INTO t_emp(NAME,age,deptId) VALUES('洪七公',70,2);
INSERT INTO t_emp(NAME,age,deptId) VALUES('乔峰',35,2);
 
INSERT INTO t_emp(NAME,age,deptId) VALUES('灭绝师太',70,3);
INSERT INTO t_emp(NAME,age,deptId) VALUES('周芷若',20,3);
 
 
 
INSERT INTO t_emp(NAME,age,deptId) VALUES('张三丰',100,4);
 
INSERT INTO t_emp(NAME,age,deptId) VALUES('张无忌',25,5);
 
INSERT INTO t_emp(NAME,age,deptId) VALUES('韦小宝',18,null);
 


第一种 A、B两表共有 inner join

 select * from t_emp a inner join t_dept b on a.deptId = b.id;

在这里插入图片描述
也就是笛卡尔积能完全根据条件完全匹配两张表的数据,不包括A中为null或B中为null的,以建表语句的SQL来说就是不包括没有部门的员工和没有员工的部门。
在这里插入图片描述
第二种 A、B两表共有+A的独有 left join

select * from t_emp a left join t_dept b on a.deptId = b.id;

在这里插入图片描述
左连接可以查询A、B两表共有且A表独有,也就是在inner join的基础上把没有部门的员工也查出来。(韦小宝这条数据就是A表独有的)
在这里插入图片描述
第三种 3 A、B两表共有+B的独有 right join

 select * from t_emp a right join t_dept b on a.deptId = b.id;

在这里插入图片描述
右连接可以查询A、B两表共有且B表独有,也就是在inner join的基础上把没有员工的部门也查出来。(少林寺这条数据就是B表独有的)
在这里插入图片描述
第四种 A的独有
这是什么意思?用大白话来讲就是查询没有部门的员工有哪些。如图所示:该集合是不包括inner join部分的,那这个要怎么来做?我们不妨查看刚才left join左连接查询的结果,左连接的结果是A、B共有加A的独有,也就是韦小宝那条数据,注意看这条数据的特点就是B的字段为null,因为韦小宝这个员工是没有部门的,所以我们可以根据B表的某个字段为null来判断A表独有的数据,一般来说这个字段就是B表的id字段

select * from t_emp a left join t_dept b on a.deptId = b.id where b.id is null; 

在这里插入图片描述

结果:
在这里插入图片描述
第五种 B的独有
会了A的独有以后,这个自然也就很好理解了,如图所示:该集合是不包括inner join部分的,那这个要怎么来做?我们不妨查看刚才right join左连接查询的结果,右连接的结果是A、B共有加B的独有,也就是少林寺那条数据,注意看这条数据的特点就是A的字段为null,因为少林寺这个部门是没有员工的,所以我们可以根据A表的某个字段为null来判断B表独有的数据,一般来说这个字段就A表的id字段。

 select * from t_emp a right join t_dept b on a.deptId = b.id where a.deptId is null;  

在这里插入图片描述
结果:
在这里插入图片描述
第六种 A的独有+B的独有
这又是什么意思?如下图所示:刚才我们说了,A的独有就是“没有部门的员工”,B的独有就是“没有员工的部门”,那结合图一起来分析的话 A的独有+B的独有 的结果就是查询没有部门的员工和没有员工的部门,这里涉及到了另一个关键字union,将两条sql的结果集合并。

select * FROM t_emp A LEFT JOIN t_dept B ON A.deptId = B.id WHERE B.`id` IS NULL UNION
SELECT * FROM t_emp A RIGHT JOIN t_dept B ON A.deptId = B.id WHERE A.`deptId` IS NULL;

在这里插入图片描述
结果:
在这里插入图片描述
第七种 全链接
这又是什么意思?还是结合图来看:全连接的意思就是A的独有+B的独有+AB的共有,也就是在inner join的基础上再把没有员工的部门和没有部门员工查询出来。

SELECT a.*,b.* FROM t_emp a FULL OUTER JOIN t_dept b on a.deptId = b.id

在这里插入图片描述
结果:
在这里插入图片描述
发现报错了,原因是mysql不支持full outer join全连接,但是我们还是可以用union来做到,用union来做的思路就是查出left join的结果union上right join的结果,因为union自带去重功能,所以剩下的结果就是我们想要的。
union的sql写法:

SELECT * FROM t_emp A LEFT JOIN t_dept B ON A.deptId = B.id UNION 
SELECT * FROM t_emp A RIGHT JOIN t_dept B ON A.deptId = B.id

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43750656/article/details/106770806