题目描述
有一个员工表,employees 简况如下:
有一个部门表,dept_emp 简况如下:
建表语句如下:
-- employees 表
CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));
-- dept_emp 表
CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
请你查找所有已经分配部门的员工的 last_name 和 first_name 以及 dept_no,也包括暂时没有分配具体部门的员工,上述示例的查询结果如下:
答案解析
本题同 查找所有已分配部门的员工的last_name和first_name 在思路上实际是一致的,都需要进行外连接查询。可以使用左外连接或右外连接,两者 SQL 语句的差异主要取决于主表的不同。
对各种连接方式不明确的小伙伴,可以看我上一篇题解中的介绍,本题将直接给出 SQL 代码:
-- LEFT OUTER JOIN
SELECT e.last_name,e.first_name,d.dept_no
FROM employees AS e LEFT JOIN dept_emp AS d
ON e.emp_no = d.emp_no;
-- RIGHT OUTER JOIN
SELECT e.last_name,e.first_name,d.dept_no
FROM dept_emp AS d RIGHT JOIN employees AS e
ON e.emp_no = d.emp_no;