先给上这张经典的图片,在开发中,不可避免的会涉及到多张表的连查,join更是常常出现在我们的SQL语句中,那么七种Join到底有什么联系和区别呢?
1.建表,数据库就用我最开始测试的test数据库,执行use test切换数据库,然后执行建表语句生成数据库表,
1 | CREATE TABLE `tbl_emp` ( |
2.插入测试数据,并查看表结构及数据是否正确,
1 | INSERT INTO tbl_dept(deptName,locAdd) VALUES('RD',11); |
3.数据造好,然后开始一条条的测试join语句,
内连接 innrt join:
1 | select * from tbl_emp emp inner join tbl_dept dept on emp.deptId = dept.id; |
可以看到只有两者的共有部分;
左连接 left join:
1 | select * from tbl_emp emp left join tbl_dept dept on emp.deptId = dept.id; |
1-7数据没有变化,但是8号数据却是tbl_emp独有的数据,左表查出所有,右边补充,没有的补null;
右连接 right join:
1 | select * from tbl_emp emp right join tbl_dept dept on emp.deptId = dept.id; |
右表查出所有,左表有的就补充,没有的补null;
emp独有(a表独有的数据):
1 | select * from tbl_emp emp left join tbl_dept dept on emp.deptId = dept.id where dept.id is null; |
**dept独有(b表独有的数据)**:
1 | select * from tbl_emp emp right join tbl_dept dept on emp.deptId = dept.id where emp.DeptId is null; |
全有 full join(已经不支持该语法,所以使用union联合来实现查所有的语法):
1 | select * from tbl_emp emp left join tbl_dept dept on emp.deptId = dept.id |
union是自带去重,所以1-7的数据都只有一条,8为emp独有,9为dept独有
**emp和dept各自的独有(a、b表各自独有的数据)**:
1 | select * from tbl_emp emp left join tbl_dept dept on emp.deptId = dept.id where dept.id is null |