查找所有员工的last_name和first_name以及对应部
2019-02-17 本文已影响0人
兔子是黑老大
tag union
条件
题目
查找所有员工的last_name和first_name以及对应部门编号dept_no,也包括展示没有分配具体部门的员工
CREATE TABLEdept_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
));
CREATE TABLEemployees
(
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
));
输入描述:
无
输出描述:
image.png
思路
这道题是对只查询已经分配部门员工的拓展,又加入了另外一个还没有分配员工的展示,那这样就很容易想起来,我能不能将另外的数据和以前已经查出来的数据合并起来作为新的数据集合呢?这样就想起来了关键字union
使用这个关键字你会发现是错的
select last_name,first_name,dept_no
from employees,dept_emp
where employees.emp_no = dept_emp.emp_no
union
select last_name,first_name,'None'
from employees
where employees.emp_no not in (select emp_no from dept_emp)
当我将两部分拆开来看查询结果的时候出现了一个很让我意外的结果集合,因为这里面竟然有重复的数据
再次查语法发现
union
会剔除结果集中重复的数据,但是还有一个关键字可以解决这个问题就是union all
这样就得到了最终的结果集合
答案为
select last_name,first_name,dept_no
from employees,dept_emp
where employees.emp_no = dept_emp.emp_no
union all
select last_name,first_name,'None'
from employees
where employees.emp_no not in (select emp_no from dept_emp)
结论
-
union
会剔除重复数据 -
union all
只是将两次的结果集合合并,并不会出现数据剔除