MySQL的多表查询学习笔记
一、案例准备
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
create table dept( id int primary key auto_increment, name varchar(20) );
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
insert into dept values(null, '财务部'); insert into dept values(null, '人事部'); insert into dept values(null, '科技部'); insert into dept values(null, '销售部');
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
create table emp( id int primary key auto_increment, name varchar(20), dept_id int );
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
insert into emp values(null, '张三', 1); insert into emp values(null, '李四', 2); insert into emp values(null, '老王', 3); insert into emp values(null, '刘能', 5);
需求:查询出部门信息和部门所对应的员工信息
二、笛卡尔积查询、内连接查询、左右外连接查询及全外连接查询
①笛卡尔积查询
两张表相乘得出来的结果:select * from dept, emp;
如果左边表有m条记录,右边有n条记录,则查询出来的结果就是m*n条。这些查询结果中包含大量错误的结果,通常不会使用这种查询。
②内连接查询
左边表有且右边表也有的记录
SQL:select * from dept d inner join emp e on e.dept_id=d.id;
③左外连接查询:在内连接查询的基础上,加上左边表有而右边表没有的记录
查询出部门所对应的员工信息, 同时列出那些没有员工的部门
SQL:select * from dept d left join emp e on e.dept_id=d.id;
④右外连接查询:在内连接查询的基础上,加上右边表有而左边表没有的记录
查询出部门所对应的员工信息, 同时列出那些没有部门的员工
SQL:select * from dept d right join emp e on e.dept_id=d.id;
⑤全外连接查询:在内连接查询的基础上,加上左边表有而右边表没有的记录 和 右边表有而左边表没有的记录。
查询出部门所对应的员工信息,同时列出那些没有员工的部门及些没有部门的员工
SQL:select * from dept d full join emp e on e.dept_id=d.id;(错误:mysql不支持全外连接查询)
通过union关键字来模拟全外连接查询
SQL:
select * from dept left join emp on emp.dept_id = dept.id
union
select * from dept right join emp on emp.dept_id = dept.id;