MySQL中的多表查询
单表查询一般不能满足项目的需求,在真实的开发过程中,有很多需求都是要涉及到多表查询,
在此总结一下MySQL中的多表查询:
一、内连接查询
指所有的查询出的结果都能在连接表中有对应的记录;
以员工表和部门表为例:
element表:
department表:
可以发现在人力资源部没有员工,赵七没有对应的部门,
如果要查询员工姓名和相关部门名称,此时应该使用内连接,关键字(inner join):
在此说一下关联查询sql编写的思路:
- 确定所连接的表
- ——要查询的字段
- ——连接条件和连接方式
select e.empName, d.deptName
from t_employee e
INNER JOIN t_dept d
ON e.dept = d.id;
查询结果:没有赵七
内连接的特点:只查询在连接表中能够有对应的记录(就是在员工表中有外键对应)
二、左外连接查询
指以左边的表中的数据为基准,去匹配右面表中的数据,
如果匹配到就显示出来,如果匹配不到就显示为null;
例如:在上一个例子中,我要显示赵七,怎么办???关键字( left outer join)
SELECT e.empName, d.deptName
from t_employee e
LEFT OUTER JOIN t_dept d
on d.id = e.dept;
查询结果:赵七没有对应部门
三、右外连接
如:查询所有部门的对应员工。。。关键字( right outer join)
SELECT e.empName, d.deptName
from t_employee e
RIGHT OUTER JOIN t_dept d
on d.id = e.dept;
查询结果:人力部门没人:
四、全外连接
将两张表中的所有字段都查出来,没有对应的值就显示null,
如果要达到全外连接的效果,可以使用union关键字连接左外连接和右外连接。关键字( union)
例如:
select e.empName,d.deptName
FROM t_employee e
left JOIN t_dept d
ON e.dept = d.id
UNION
select e.empName,d.deptName
FROM t_employee e
RIGHT JOIN t_dept d
ON e.dept = d.id;
查询结果:
如果在oracle中,直接就使用 full outer join 关键字连接两表就行了;
五、自连接查询
自连接:当前表与自身的连接查询, 关键点:虚拟化一张表给别名
例如:查询员工以及他的上司的名称。。。关键字:left join
由于上司也是员工,所以虚拟化出一张上司表
SELECT e.empName, b.empName
from t_employee e
LEFT JOIN t_employee b
ON e.bossId = b.id;
查询结果: