外观
关联查询
查询部门和部门对应的员工信息:
mysql
select *
from dept, emp
where dept.deptno = emp.deptno;1
2
3
2
3
查询所有部门和部门下的员工,如果部门下没有员工,则员工显示为null(一定要列出所有部门):
mysql
select *
from dept
left join emp on dept.deptno = emp.deptno;1
2
3
2
3
上面这个 SQL 查询语句使用了 left join 关键字来连接 dept 和 emp 表,并以 deptno 字段为连接条件,查询并返回两张表中相关记录的字段值。具体地说,该查询会遍历 dept 表中的每一行记录,然后查找与之对应的 emp 表中的记录,如果两者中存在符合连接关系的记录,则会将它们的字段值合并为一条查询结果,并以列的形式呈现在最终的查询结果中。如果某个部门在 emp 表中没有关联记录,则该部门在查询结果中也会被保留,但其关联字段值会被填充为 null。
查询每个部门的员工的数量:
mysql
select dept.deptno, count(emp.deptno)
from dept
left join emp on dept.deptno = emp.deptno
group by dept.deptno;1
2
3
4
2
3
4
说明
count(emp.deptno)统计在职员工数;- 如果写成
count(*),没有员工的部门也会统计出 1(左连接产生一条 null 数据) - 左连接特性:所有部门一定会出现在结果中,哪怕该部门没有任何员工;
- 只统计有员工的部门不能用
left join,需要换成inner join。
INNER JOIN 内连接
只返回两张表都能匹配上的数据,两边无匹配的数据全部丢弃。
LEFT JOIN 左连接
以左表全部数据为基准,左表所有记录保留;右表匹配不到的行,右表字段填充 NULL。
RIGHT JOIN 右连接
以右表全部数据为基准,右表所有记录保留;左表匹配不到的行,左表字段填充 NULL。
RIGHT JOIN 完全可以换成 LEFT JOIN,只需要交换两张表位置:
sql
-- 下面两条SQL执行效果完全一样
SELECT * FROM dept RIGHT JOIN emp ON dept.deptno = emp.deptno;
SELECT * FROM emp LEFT JOIN dept ON dept.deptno = emp.deptno;1
2
3
2
3
开发中 LEFT JOIN 使用更多,RIGHT JOIN 很少用。