联接
七种JOIN介绍
| 图形 | 联接方式 | 说明 | SQL |
|---|---|---|---|
![]() | 内联接 | 共有部分 | SELECT <select_list> FROM TableA A INNER JOIN TableB B ON A.Key = B.Key; |
![]() | 左联接 | A表独有+共有部分 | SELECT <select_list> FROM TableA A LEFT JOIN TableB B ON A.Key = B.Key; |
![]() | 右联接 | B表独有+共有部分 | SELECT <select_list> FROM TableA A RIGHT JOIN TableB B ON A.Key = B.Key; |
![]() | A的独有 | SELECT <select_list> FROM TableA A LEFT JOIN TableB B ON A.Key = B.Key WHERE B.Key IS NULL; | |
![]() | B的独有 | SELECT <select_list> FROM TableA A RIGHT JOIN TableB B ON A.Key = B.Key WHERE A.Key IS NULL; | |
![]() | 全联接 | A的独有+共有部分+B的独有 | SELECT <select_list> FROM TableA A FULL OUTER JOIN TableB B ON A.Key = B.Key; MySQL不支持FULL OUTER JOIN这种语法 |
![]() | A独有+B独有 | SELECT <select_list> FROM TableA A FULL OUTER JOIN TableB B ON A.Key = B.Key WHERE A.Key IS NULL OR B.Key IS NULL; MySQL不支持FULL OUTER JOIN这种语法 |
练习
建表+存储数据
CREATE TABLE `tbl_emp` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`deptId` int(11) DEFAULT NULL,
PRIMARY KEY (`id`) ,
KEY `fk_dept_id`(`deptId`)
)ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8;
CREATE TABLE `tbl_dept` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`deptName` varchar(30) DEFAULT NULL,
`locAdd` varchar(40) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = 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);
insert into tbl_emp(NAME,deptId) values('s9',51);
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qUHuXxvA-1686824977740)(assets/1686824851787-7.png)]](https://file.cfanz.cn/uploads/png/2023/06/16/10/TO4M2T9UDQ.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8stgnQnE-1686824977740)(assets/1686824851788-8.png)]](https://file.cfanz.cn/uploads/png/2023/06/16/10/2RfES5e777.png)
笛卡尔积
select * from tbl_emp,tbl_dept;
5条数据和8条数据两两组合,一共40条,结果如下
"id" "name" "deptId" "id" "deptName" "locAdd"
"1" "z3" "1" "5" "FD" "15"
"1" "z3" "1" "4" "MIS" "14"
"1" "z3" "1" "3" "MK" "13"
"1" "z3" "1" "2" "HR" "12"
"1" "z3" "1" "1" "RD" "11"
"2" "z4" "1" "5" "FD" "15"
"2" "z4" "1" "4" "MIS" "14"
"2" "z4" "1" "3" "MK" "13"
"2" "z4" "1" "2" "HR" "12"
"2" "z4" "1" "1" "RD" "11"
"3" "z5" "1" "5" "FD" "15"
"3" "z5" "1" "4" "MIS" "14"
"3" "z5" "1" "3" "MK" "13"
"3" "z5" "1" "2" "HR" "12"
"3" "z5" "1" "1" "RD" "11"
"4" "w5" "2" "5" "FD" "15"
"4" "w5" "2" "4" "MIS" "14"
"4" "w5" "2" "3" "MK" "13"
"4" "w5" "2" "2" "HR" "12"
"4" "w5" "2" "1" "RD" "11"
"5" "w6" "2" "5" "FD" "15"
"5" "w6" "2" "4" "MIS" "14"
"5" "w6" "2" "3" "MK" "13"
"5" "w6" "2" "2" "HR" "12"
"5" "w6" "2" "1" "RD" "11"
"6" "s7" "3" "5" "FD" "15"
"6" "s7" "3" "4" "MIS" "14"
"6" "s7" "3" "3" "MK" "13"
"6" "s7" "3" "2" "HR" "12"
"6" "s7" "3" "1" "RD" "11"
"7" "s8" "4" "5" "FD" "15"
"7" "s8" "4" "4" "MIS" "14"
"7" "s8" "4" "3" "MK" "13"
"7" "s8" "4" "2" "HR" "12"
"7" "s8" "4" "1" "RD" "11"
"8" "s9" "51" "5" "FD" "15"
"8" "s9" "51" "4" "MIS" "14"
"8" "s9" "51" "3" "MK" "13"
"8" "s9" "51" "2" "HR" "12"
"8" "s9" "51" "1" "RD" "11"
内联接
SELECT * FROM tbl_emp a INNER JOIN tbl_dept b ON a.deptId = b.id;
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aZ35ILZ2-1686824977740)(assets/1686824851788-9.png)]](https://file.cfanz.cn/uploads/png/2023/06/16/10/57cbd7c6ZI.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sNac9oI7-1686824977741)(assets/1686824851788-10.png)]](https://file.cfanz.cn/uploads/png/2023/06/16/10/d41RVG4024.png)
左联接
SELECT * FROM tbl_emp a LEFT JOIN tbl_dept b ON a.deptId = b.id;
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-veaxxZmd-1686824977741)(assets/1686824851788-11.png)]](https://file.cfanz.cn/uploads/png/2023/06/16/10/67Y18L8Lf9.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WbjW4vGV-1686824977741)(assets/1686824851788-12.png)]](https://file.cfanz.cn/uploads/png/2023/06/16/10/Xd2Q3c5fMc.png)
右联接
SELECT * FROM tbl_emp a RIGHT JOIN tbl_dept b ON a.deptId = b.id;
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u96RObbU-1686824977741)(assets/1686824851788-13.png)]](https://file.cfanz.cn/uploads/png/2023/06/16/10/223PaUVI0X.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q9huZfmw-1686824977741)(assets/1686824851788-14.png)]](https://file.cfanz.cn/uploads/png/2023/06/16/10/2XdE5d94eH.png)
A表独有
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hR7svfpX-1686824977742)(assets/1686824851788-15.png)]](https://file.cfanz.cn/uploads/png/2023/06/16/10/072bR827bG.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BrFmCxzC-1686824977742)(assets/1686824851788-16.png)]](https://file.cfanz.cn/uploads/png/2023/06/16/10/254492QSAJ.png)
SELECT * FROM tbl_emp a LEFT JOIN tbl_dept b ON a.deptId = b.id WHERE b.id is null;
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2KKU8i1R-1686824977742)(assets/1686824851789-17.png)]](https://file.cfanz.cn/uploads/png/2023/06/16/10/6Y01H16Y1W.png)
B表独有
SELECT * FROM tbl_emp a RIGHT JOIN tbl_dept b ON a.deptId = b.id WHERE a.deptId is null;
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1FUBJoXE-1686824977742)(assets/1686824851789-18.png)]](https://file.cfanz.cn/uploads/png/2023/06/16/10/2IRHR087a6.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-29w3Q3Vf-1686824977742)(assets/1686824851789-19.png)]](https://file.cfanz.cn/uploads/png/2023/06/16/10/7W6b3Ve6G6.png)
全联接
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UrTh9p5N-1686824977743)(assets/1686824851789-20.png)]](https://file.cfanz.cn/uploads/png/2023/06/16/10/1C8193MA35.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jtIDkl7R-1686824977743)(assets/1686824851789-21.png)]](https://file.cfanz.cn/uploads/png/2023/06/16/10/0CfbHL14TF.png)
尝试换一种方式实现:A的独有+共有+B的独有
实现方式一:左联接+右联接+公共部分去重
SELECT * FROM tbl_emp a LEFT JOIN tbl_dept b ON a.deptId = b.id
UNION
SELECT * FROM tbl_emp a RIGHT JOIN tbl_dept b ON a.deptId = b.id;
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LkhQ6tcO-1686824977743)(assets/1686824851789-22.png)]](https://file.cfanz.cn/uploads/png/2023/06/16/10/Wac5aa8FW8.png)
实现方式二:左联接+B独有
SELECT * FROM tbl_emp a LEFT JOIN tbl_dept b ON a.deptId = b.id
UNION
SELECT * FROM tbl_emp a RIGHT JOIN tbl_dept b ON a.deptId = b.id WHERE a.deptId is null;
A独有+B独有
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KdkdloFq-1686824977744)(assets/1686824851789-23.png)]](https://file.cfanz.cn/uploads/png/2023/06/16/10/232F9GNf92.png)
SELECT * FROM tbl_emp a LEFT JOIN tbl_dept b ON a.deptId = b.id WHERE b.id is null
UNION
SELECT * FROM tbl_emp a RIGHT JOIN tbl_dept b ON a.deptId = b.id WHERE a.deptId is null;
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9dcf7yHP-1686824977744)(assets/1686824851789-24.png)]](https://file.cfanz.cn/uploads/png/2023/06/16/10/N9A9Qc762T.png)



![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hVV4XXtO-1686824977738)(assets/1686824851787-3.png)]](https://file.cfanz.cn/uploads/png/2023/06/16/10/Z6R65A6L88.png)

![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T5XPhb8d-1686824977739)(assets/1686824851787-5.png)]](https://file.cfanz.cn/uploads/png/2023/06/16/10/Z1a6861890.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w50kiG6r-1686824977739)(assets/1686824851787-6.png)]](https://file.cfanz.cn/uploads/png/2023/06/16/10/02783768aA.png)









