查找所有员工的last_name和first_name以及对应部

2019-02-17  本文已影响0人  兔子是黑老大

tag union 条件

题目

查找所有员工的last_name和first_name以及对应部门编号dept_no,也包括展示没有分配具体部门的员工
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));
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));

输入描述:

输出描述:


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)

当我将两部分拆开来看查询结果的时候出现了一个很让我意外的结果集合,因为这里面竟然有重复的数据

image.png
再次查语法发现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)

结论

  1. union 会剔除重复数据
  2. union all 只是将两次的结果集合合并,并不会出现数据剔除

参考

SQL UNION 子句

上一篇 下一篇

猜你喜欢

热点阅读