携手创作,共同成长!这是我参与「掘金日新计划 · 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)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路
创建数据表
根据题意创建员工和薪资数据表,并设置主键和数据类型
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丢失了薪水信息
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的姓名丢失
两条语句再进行对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;
三、执行结果
测试结果
四、总结
- UNION:
- 会自动压缩多个结果集合中的重复结果
- 会对结果进行并集操作,不包括重复行,同时进行默认规则的排序
- UNION ALL
- 会显示所有结果
- 会对结果进行并集操作,包括重复行,不进行排序