-- 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 INNERJOIN departments d ON e.department_id = d.id;
查询所有员工的部门(左外连接)
你要查询 所有 员工,然后把他部门信息也带上。考虑到这种情况,即需要员工表设为主表,涉及到外连接:
1 2 3
SELECT e.last_name, e.department_id, d.department_name FROM employees e LEFTJOIN 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 LEFTJOIN departments d ON e.department_id = d.department_id WHERE e.department_id ISNOT NULL;
查询所有部门下的员工信息(右外连接)
你要查询 所有 部门,然后把他员工信息列出来,没有员工也得给我列出来:
1 2 3
SELECT e.last_name, e.department_id, d.department_name FROM employees e RIGHTJOIN 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 RIGHTJOIN departments d ON e.department_id = d.department_id WHERE e.department_id ISNOT 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 LEFTJOIN departments d ON e.department_id = d.department_id WHERE e.department_id ISNULL
UNIONALL
-- 查询没有员工的部门 SELECT e.last_name, e.department_id, d.department_name FROM employees e RIGHTJOIN departments d ON e.department_id = d.department_id WHERE e.department_id ISNULL;
查询所有员工,还有所有部门(全外连接)
补充:没有部门的员工,没有员工的部门都要带出来
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 LEFTJOIN departments d ON e.department_id = d.department_id WHERE e.department_id ISNULL
UNIONALL
-- 查询所有部门下的员工信息 SELECT e.last_name, e.department_id, d.department_name FROM employees e RIGHTJOIN departments d ON e.department_id = d.department_id;