力扣:丢失信息的雇员

68 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情

题目一

表: 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 , 从小到大排序 。

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

示例1:

输入:
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号雇员的薪水信息丢失了。

解析

本题的解题思路有很多种方式,这里分享一种思路:

  • 可以先考虑合并两个表中的数据
  • 然后按照employee_id进行分组
  • 使用Having进行统计,当count(*)等于1的时候也就是满足条件。
  • 需要说明的是,这种解法适合指定的条件,比如本题中相同employee_id的记录会不会在同一张表中出现多次
SELECT employee_id FROM
(
    SELECT employee_id FROM Employees 
    UNION ALL 
    SELECT employee_id FROM Salaries
) AS t
GROUP BY employee_id
HAVING COUNT(*) = 1
ORDER BY employee_id ASC;

union相关说明:

union 和 union all取并集 union 会自动去除关联的两个结果集中的重复数据 union all 不会主动去除两个结果集中的重复数据,会展示所有的数据

Having用法说明:

当我们在MySQL用到聚合函数,如sum,count,又需要筛选条件时,就可以使用having,因为WHERE是在聚合前筛选记录的,having和group by是组合着用的

运行结果:

执行结果:通过

执行用时:231ms, 在所有 MySQL 提交中击败了66.99%的用户

内存消耗:0 B, 在所有 MySQL 提交中击败了100.00%的用户