题目描述

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

查找所有员工的last_name和first_name以及对应部门编号dept_no - 图1

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

查找所有员工的last_name和first_name以及对应部门编号dept_no - 图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以及对应部门编号dept_no - 图3

答案解析

本题同 查找所有已分配部门的员工的last_name和first_name 在思路上实际是一致的,都需要进行外连接查询。可以使用左外连接或右外连接,两者 SQL 语句的差异主要取决于主表的不同。

对各种连接方式不明确的小伙伴,可以看我上一篇题解中的介绍,本题将直接给出 SQL 代码:

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