题目描述

有一个员工表, employees 简况如下:

查找所有已分配部门的员工的last_name和first_name - 图1

有一个部门表,dept_emp 简况如下:

查找所有已分配部门的员工的last_name和first_name - 图2

建表语句如下:

  1. -- employees
  2. CREATE TABLE `employees` (
  3. `emp_no` int(11) NOT NULL,
  4. `birth_date` date NOT NULL,
  5. `first_name` varchar(14) NOT NULL,
  6. `last_name` varchar(16) NOT NULL,
  7. `gender` char(1) NOT NULL,
  8. `hire_date` date NOT NULL,
  9. PRIMARY KEY (`emp_no`));
  10. -- dept_emp
  11. CREATE TABLE `dept_emp` (
  12. `emp_no` int(11) NOT NULL,
  13. `dept_no` char(4) NOT NULL,
  14. `from_date` date NOT NULL,
  15. `to_date` date NOT NULL,
  16. PRIMARY KEY (`emp_no`,`dept_no`));

请你查找所有已经分配部门的员工的 last_name first_name 以及 dept_no,未分配的部门的员工不显示,上述示例的查询结果为:

查找所有已分配部门的员工的last_name和first_name - 图3

答案解析

本题需要使用外连接的方式进行联表查询。

SQL 连接可以分为四种:内连接,左外连接,右外连接,全连接。

下面几张图,说明了这几种不同连接方式的区别:

  • inner join

满足条件的记录才会出现在结果集中
查找所有已分配部门的员工的last_name和first_name - 图4

  • left outer join

左表全部出现在结果集中,若右表无对应记录,则相应字段为 NULL
查找所有已分配部门的员工的last_name和first_name - 图5

  • right outer join

右表全部出现在结果集中,若左表无对应记录,则相应字段为 NULL
查找所有已分配部门的员工的last_name和first_name - 图6

  • full outer join

全连接 = 左外连接 + 右外连接
查找所有已分配部门的员工的last_name和first_name - 图7

本题可以将 employees 表作为主表,让 dept_emp 表右外连接到主表进行查询;也可以将 dept_emp 表作为主表,让 employees 表左外连接到主表进行查询。SQL 如下:

  1. SELECT e.last_name,e.first_name,d.dept_no
  2. FROM employees AS e RIGHT JOIN dept_emp AS d
  3. ON e.emp_no = d.emp_no;
  4. -- or
  5. SELECT e.last_name,e.first_name,d.dept_no
  6. FROM dept_emp AS d left JOIN employees AS e
  7. ON e.emp_no = d.emp_no;

_