MySQL 外连接的几种情况
磊磊

MySQL 外连接的几种情况

image

前提条件

  • 因为有可能有的员工没有部门(他是老总)
  • 有的部门没有员工(部门刚成立的情况)

查询有部门的员工(内连接)

你只要查询有部门的员工,潜意识就是没有部门的不要查,所以就是员工和部门表的交集。

1
2
3
4
5
6
7
8
9
-- where 子句方式
SELECT e.name, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.id;

-- 内连接方式
SELECT e.name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;

查询所有员工的部门(左外连接)

你要查询 所有 员工,然后把他部门信息也带上。考虑到这种情况,即需要员工表设为主表,涉及到外连接:

1
2
3
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;

查询所有员工的部门,只查询有部门的员工(左外连接)

1
2
3
4
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id
WHERE e.department_id IS NOT NULL;

查询所有部门下的员工信息(右外连接)

你要查询 所有 部门,然后把他员工信息列出来,没有员工也得给我列出来:

1
2
3
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.department_id;

查询所有部门下的有部门的员工信息(右外连接)

1
2
3
4
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.department_id
WHERE e.department_id IS NOT NULL;

查询没有员工的部门,还有没有部门的员工(全外连接)

MySQL 不支持全外连接,可以用 UNION ALL 实现

1
2
3
4
5
6
7
8
9
10
11
12
13
-- 查询没有部门的员工
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id
WHERE e.department_id IS NULL

UNION ALL

-- 查询没有员工的部门
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.department_id
WHERE e.department_id IS NULL;

查询所有员工,还有所有部门(全外连接)

补充:没有部门的员工,没有员工的部门都要带出来

MySQL 不支持全外连接,可以用 UNION ALL 实现

1
2
3
4
5
6
7
8
9
10
11
12
-- 部门id为空的那个老总
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id
WHERE e.department_id IS NULL

UNION ALL

-- 查询所有部门下的员工信息
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.department_id;
由 Hexo 驱动 & 主题 Keep
访客数 访问量