24,SQL训练之,力扣,1378,使用唯一标识码替换员工ID

  • 学习:知识的初次邂逅
  • 复习:知识的温故知新
  • 练习:知识的实践应用

目录

一,原题力扣链接

二,题干

三,建表语句

四,分析

五,SQL解答

解法一,连接查询

解法二,子查询查询

六,验证

七,知识点总结


一,原题力扣链接

. - 力扣(LeetCode)


二,题干

Employees 表:

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| name          | varchar |
+---------------+---------+
在 SQL 中,id 是这张表的主键。
这张表的每一行分别代表了某公司其中一位员工的名字和 ID 。

EmployeeUNI 表:

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| unique_id     | int     |
+---------------+---------+
在 SQL 中,(id, unique_id) 是这张表的主键。
这张表的每一行包含了该公司某位员工的 ID 和他的唯一标识码(unique ID)。

展示每位用户的 唯一标识码(unique ID );如果某位员工没有唯一标识码,使用 null 填充即可。

你可以以 任意 顺序返回结果表。

返回结果的格式如下例所示。

示例 1:

输入:
Employees 表:
+----+----------+
| id | name     |
+----+----------+
| 1  | Alice    |
| 7  | Bob      |
| 11 | Meir     |
| 90 | Winston  |
| 3  | Jonathan |
+----+----------+
EmployeeUNI 表:
+----+-----------+
| id | unique_id |
+----+-----------+
| 3  | 1         |
| 11 | 2         |
| 90 | 3         |
+----+-----------+
输出:
+-----------+----------+
| unique_id | name     |
+-----------+----------+
| null      | Alice    |
| null      | Bob      |
| 2         | Meir     |
| 3         | Winston  |
| 1         | Jonathan |
+-----------+----------+
解释:
Alice and Bob 没有唯一标识码, 因此我们使用 null 替代。
Meir 的唯一标识码是 2 。
Winston 的唯一标识码是 3 。
Jonathan 唯一标识码是 1 。


三,建表语句

Create table If Not Exists Employees (id int, name varchar(20))
Create table If Not Exists EmployeeUNI (id int, unique_id int)
Truncate table Employees
insert into Employees (id, name) values ('1', 'Alice')
insert into Employees (id, name) values ('7', 'Bob')
insert into Employees (id, name) values ('11', 'Meir')
insert into Employees (id, name) values ('90', 'Winston')
insert into Employees (id, name) values ('3', 'Jonathan')
Truncate table EmployeeUNI
insert into EmployeeUNI (id, unique_id) values ('3', '1')
insert into EmployeeUNI (id, unique_id) values ('11', '2')
insert into EmployeeUNI (id, unique_id) values ('90', '3')


四,分析

  1. 需要查询的字段:用户的唯一标识码 id  ;员工的姓名 name
  2. 来源的表:唯一标识码的id 来源 employeeUNI表; 员工的姓名 来源自employees表;
  3. 查询的条件:如果员工没有唯一的标识码,则用null来填充
  4. 思考:

解法一:用左连接的思路 最优解
        要查询的字段来源两张表,所以需要连接查询。
        没有员工的id 用null来填充,那么可以用左连接来查询。 
        左表employees表  连接  右表 employeeNUI  连接条件 两个表的id相同
解法二:用子查询的思路 
        子查询需要放置再查询的字段上,
        子查询的条件是 唯一标识符表的id等于员工表的id
        当条件不满足的时候,而第二列name还有值,所以它也返回null

  • 5,SQL结构:双表查询,左连接


五,SQL解答

解法一,连接查询

select e2.unique_id,e1.name  from
Employees e1
 left join EmployeeUNI e2 
on e2.id =e1.id;

解法二,子查询查询

SELECT  
    (SELECT e2.unique_id FROM EmployeeUNI e2 WHERE e2.id = e1.id) AS unique_id,  
    e1.name  
FROM  
    Employees e1;

 


六,验证

解法一:

解法二:


七,知识点总结

  • 本题最优解法用的是连接查询,左连接。
  • 左连接:查询左表的全部数据,以及左表和右表都包括的数据。当右表不满足的时候以null填充;
  • 解法二:使用的子查询。
  • 子查询的查询性能比连接要欠缺,故优先选择 连接查询;
  • 子查询语句:直接字段开始子查询,然后再用连接

  • 学习:知识的初次邂逅
  • 复习:知识的温故知新
  • 练习:知识的实践应用

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值