题目描述
有一个员工表, 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,未分配的部门的员工不显示,上述示例的查询结果为:
答案解析
本题需要使用外连接的方式进行联表查询。
SQL 连接可以分为四种:内连接,左外连接,右外连接,全连接。
下面几张图,说明了这几种不同连接方式的区别:
- inner join
满足条件的记录才会出现在结果集中
- left outer join
左表全部出现在结果集中,若右表无对应记录,则相应字段为 NULL
- right outer join
右表全部出现在结果集中,若左表无对应记录,则相应字段为 NULL
- full outer join
全连接 = 左外连接 + 右外连接
本题可以将 employees 表作为主表,让 dept_emp 表右外连接到主表进行查询;也可以将 dept_emp 表作为主表,让 employees 表左外连接到主表进行查询。SQL 如下:
SELECT e.last_name,e.first_name,d.dept_no
FROM employees AS e RIGHT JOIN dept_emp AS d
ON e.emp_no = d.emp_no;
-- or
SELECT e.last_name,e.first_name,d.dept_no
FROM dept_emp AS d left JOIN employees AS e
ON e.emp_no = d.emp_no;
_