# LEFT JOIN & RIGHT JOIN 外联查询

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

```sql
# 如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&#x20;

```sql
# 查询每个部门的名称和人数, 有个部门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.

```sql
# 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
); 
```
