数据库每日一题---第17天:丢失信息的雇员

114 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情

一、问题描述

: Employees

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| employee_id | int     |
| name        | varchar |
+-------------+---------+
employee_id 是这个表的主键。
每一行表示雇员的id 和他的姓名。

: Salaries

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| employee_id | int     |
| salary      | int     |
+-------------+---------+
employee_id is 这个表的主键。
每一行表示雇员的id 和他的薪水。

写出一个查询语句,找到所有 丢失信息 的雇员id。当满足下面一个条件时,就被认为是雇员的信息丢失:

  • 雇员的 姓名 丢失了,或者

  • 雇员的 薪水信息 丢失了 返回这些雇员的id  employee_id, 从小到大排序 。

查询结果格式如下面的例子所示。

题目链接丢失信息的雇员

二、题目要求

样例

输入:
Employees table:
+-------------+----------+
| employee_id | name     |
+-------------+----------+
| 2           | Crew     |
| 4           | Haven    |
| 5           | Kristian |
+-------------+----------+
Salaries table:
+-------------+--------+
| employee_id | salary |
+-------------+--------+
| 5           | 76071  |
| 1           | 22517  |
| 4           | 63539  |
+-------------+--------+
输出:
+-------------+
| employee_id |
+-------------+
| 1           |
| 2           |
+-------------+
解释:
雇员1245 都工作在这个公司。
1号雇员的姓名丢失了。
2号雇员的薪水信息丢失了。

考察

1.union连接、子查询
2.建议用时10~25min

三、问题分析

这一题主要考察数据的筛选问题,题目要求我们求出没有姓名或者没有工资的员工编号,最后对结果按照编号升序排列。

可以拆分成两部分:

  • 员工表中,筛选出没有工资的编号,遍历每一名员工的编号,判断是否在工资表中出现就行,未出现就是我们要查询的结果
  • 工资表中,筛选出没有姓名的编号,遍历每一名员工的编号,判断是否在员工表出现就行,未出现就是我们要查询的结果

最后将两个表的结果组合起来,利用order by排序输出。

四、编码实现

select employee_id
from Employees
where employee_id not in(select employee_id from Salaries )
union
select employee_id 
from Salaries 
where employee_id not in(select employee_id from Employees )
order by  employee_id

五、测试结果

1.png

2.png

19.png