1965. 丢失信息的雇员

167 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情

一、题目

表: 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           |
+-------------+

解释: 雇员1,2,4,5 都工作在这个公司。 1号雇员的姓名丢失了。 2号雇员的薪水信息丢失了。

来源:力扣(LeetCode)

链接:leetcode.cn/problems/em…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、解题思路

创建数据表

根据题意创建员工和薪资数据表,并设置主键和数据类型

CREATE TABLE Employees(
	employee_id INT PRIMARY KEY,
	NAME VARCHAR(20)
);
CREATE TABLE Salaries(
	employee_id INT PRIMARY KEY,
	salary INT
);
INSERT INTO Employees VALUES
(2,"Crew"),
(4,"Haven"),
(5,"Kristian");

INSERT INTO Salaries VALUES
(5,"76071"),
(1,"22517"),
(4,"63539");

根据题意,这里要查询关于雇员的 姓名 丢失了,或者 雇员的 薪水信息 丢失了的信息


SELECT e.employee_id employee_id, e.name, s.`salary` FROM Employees e LEFT JOIN Salaries s ON e.employee_id = s.employee_id

通过LEFT JOIN ON 查到Employees丢失了薪水信息

image.png

SELECT s.employee_id  employee_id, e.name, s.`salary` FROM Employees e RIGHT JOIN Salaries s ON e.employee_id = s.employee_id

RIGHTT JOIN ON 查询到了Salaries的姓名丢失 image.png

两条语句再进行对NULL的判断,得到每个表的丢失信息,然后通过UNION 合并,employee_id从小到大排序 最终得出最后结果

SELECT e.employee_id employee_id FROM Employees e LEFT JOIN Salaries s ON e.employee_id = s.employee_id WHERE s.employee_id IS NULL
UNION
SELECT s.employee_id  employee_id FROM Employees e RIGHT JOIN Salaries s ON e.employee_id = s.employee_id WHERE e.employee_id IS NULL
ORDER BY  employee_id ASC;

image.png

三、执行结果

测试结果

image.png

四、总结

  • UNION:
    • 会自动压缩多个结果集合中的重复结果
    • 会对结果进行并集操作,不包括重复行,同时进行默认规则的排序
  • UNION ALL
    • 会显示所有结果
    • 会对结果进行并集操作,包括重复行,不进行排序