0%

Mysql进阶--七种Join连表查询

Image

先给上这张经典的图片,在开发中,不可避免的会涉及到多张表的连查,join更是常常出现在我们的SQL语句中,那么七种Join到底有什么联系和区别呢?

1.建表,数据库就用我最开始测试的test数据库,执行use test切换数据库,然后执行建表语句生成数据库表,

1
2
3
4
5
6
7
8
9
10
11
12
13
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;

image-20201112114236774

image-20201112114301891

2.插入测试数据,并查看表结构及数据是否正确,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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);

image-20201112114538686

3.数据造好,然后开始一条条的测试join语句,

内连接 innrt join

1
select * from tbl_emp emp inner join tbl_dept dept on emp.deptId = dept.id;

image-20201112132113826

可以看到只有两者的共有部分;

左连接 left join

1
select * from tbl_emp emp left join tbl_dept dept on emp.deptId = dept.id;

image-20201112132515944

1-7数据没有变化,但是8号数据却是tbl_emp独有的数据,左表查出所有,右边补充,没有的补null;

右连接 right join

1
select * from tbl_emp emp right join tbl_dept dept on emp.deptId = dept.id;

image-20201112133006185

右表查出所有,左表有的就补充,没有的补null;

emp独有(a表独有的数据)

1
select * from tbl_emp emp left join tbl_dept dept on emp.deptId = dept.id where dept.id is null;

image-20201112133619801

**dept独有(b表独有的数据)**:

1
select * from tbl_emp emp right join tbl_dept dept on emp.deptId = dept.id where emp.DeptId is null;

image-20201112133719237

全有 full join(已经不支持该语法,所以使用union联合来实现查所有的语法)

1
2
3
select * from tbl_emp emp left join tbl_dept dept on emp.deptId = dept.id
union
select * from tbl_emp emp right join tbl_dept dept on emp.deptId = dept.id;

image-20201112134509325

union是自带去重,所以1-7的数据都只有一条,8为emp独有,9为dept独有

**emp和dept各自的独有(a、b表各自独有的数据)**:

1
2
3
select * from tbl_emp emp left join tbl_dept dept on emp.deptId = dept.id where dept.id is null
union
select * from tbl_emp emp right join tbl_dept dept on emp.deptId = dept.id where emp.DeptId is null;

image-20201112134842519

----------本文结束感谢您的阅读----------