LEFT JOIN & RIGHT JOIN 外联查询

当JOIN的条件不匹配时,如果我们需要保留JOIN左边表格的信息时,使用LEFT JOIN;若我们需要保留JOIN右边表格信息时,使用RIGHT JOIN

考虑这样一个场景: 查询所有员工和其对应的部门名称。emp表中张三是一个零时工, deptno为NULL, 我们希望保留NULL ,将张三也查询出来。

# 如emp表中张三是一个零时工, deptno为NULL, 我们希望保留NULL
# 查询所有员工和其对应的部门名称
SELECT
e.ename, d.dname
FROM t_emp e LEFT JOIN t_dept d ON e.deptno=d.deptno; 

# 也可以交换JOIN表格的顺序,换成 右外连接 效果相同
SELECT
e.ename, d.dname
FROM t_dept d  RIGHT JOIN t_emp e ON e.deptno=d.deptno; 

另外一个场景: 查询所有部门名称和其人数。t_dept中有个OPERATIONS部门,没有人,我们希望统计人数为0

# 查询每个部门的名称和人数, 有个部门OPERATIONS,编号40, 没有人,我们也希望显示
SELECT
d.dname , COUNT(e.deptno)
FROM t_emp e RIGHT JOIN t_dept d
ON e.deptno=d.deptno 
GROUP BY d.deptno;

UNION 关键字

查询结果1 UNION 查询结果2, 将查询结果1和查询结果2进行取并集 操作

比如: 我们要查询每个部门的人数。t_emp中有个临时工张三, 部门编号为NULL。t_dept中有个OPERATIONS部门,没有人。我们希望显示部门为NULL的人数, OPERATIONS部门为0.

# UNION
# 查询每个部门的名称和部门的人数
# 如果没有部门的员工,部门名称用NULL代替(t_emp LEFT JOIN t_dept)
# 如果部门没有人也希望显示出来,人数为0(t_emp RIGHT JOIN t_dept)
(SELECT
d.dname , COUNT(*)
FROM t_emp e LEFT JOIN t_dept d
ON e.deptno=d.deptno 
GROUP BY d.deptno)
UNION
(
SELECT
d.dname , COUNT(*)
FROM t_emp e RIGHT JOIN t_dept d
ON e.deptno=d.deptno 
GROUP BY d.deptno
); 

Last updated