力扣:计算特殊奖金&交换性别

101 阅读3分钟

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

描述

Salary 表:

+-------------+----------+
| Column Name | Type     |
+-------------+----------+
| id          | int      |
| name        | varchar  |
| sex         | ENUM     |
| salary      | int      |
+-------------+----------+
id 是这个表的主键。
sex 这一列的值是 ENUM 类型,只能从 ('m', 'f') 中取。
本表包含公司雇员的信息。
​

请你编写一个 SQL 查询来交换所有的 'f' 和 'm' (即,将所有 'f' 变为 'm' ,反之亦然),仅使用 单个 update 语句 ,且不产生中间临时表。

注意,你必须仅使用一条 update 语句,且 不能 使用 select 语句。

查询结果如下例所示。

示例1:

输入:
Salary 表:
+----+------+-----+--------+
| id | name | sex | salary |
+----+------+-----+--------+
| 1  | A    | m   | 2500   |
| 2  | B    | f   | 1500   |
| 3  | C    | m   | 5500   |
| 4  | D    | f   | 500    |
+----+------+-----+--------+
输出:
+----+------+-----+--------+
| id | name | sex | salary |
+----+------+-----+--------+
| 1  | A    | f   | 2500   |
| 2  | B    | m   | 1500   |
| 3  | C    | f   | 5500   |
| 4  | D    | m   | 500    |
+----+------+-----+--------+
解释:
(1, A) 和 (3, C) 从 'm' 变为 'f' 。
(2, B) 和 (4, D) 从 'f' 变为 'm'

解析

本题涉及的知识点和上一篇是一致的,使用流程控制语句case .. when ..then 的语法,一条语句update语句更新,解法如下

UPDATE Salary SET sex = 
    CASE sex 
        WHEN 'm' THEN 'f'
        ELSE 'm'
    END;

运行结果:

执行结果:通过

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

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

题目二:196. 删除重复的电子邮箱

表: Person

+-------------+----------+
| Column Name | Type     |
+-------------+----------+
| id          | int      |
| name        | varchar  |
| sex         | ENUM     |
| salary      | int      |
+-------------+----------+
id 是这个表的主键。
sex 这一列的值是 ENUM 类型,只能从 ('m', 'f') 中取。
本表包含公司雇员的信息。
​

编写一个 SQL 删除语句来 删除 所有重复的电子邮件,只保留一个id最小的唯一电子邮件。

以 任意顺序 返回结果表。 (注意: 仅需要写删除语句,将自动对剩余结果进行查询)

查询结果格式如下所示。

示例1:

输入: 
Person 表:
+----+------------------+
| id | email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
| 3  | john@example.com |
+----+------------------+
输出: 
+----+------------------+
| id | email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
+----+------------------+
解释: john@example.com重复两次。我们保留最小的Id = 1

解析

这里分享一个官方的解法,本题中只有一个表,如果想取到相同电子邮件中id较小的记录,需要先进行自连接,然后将关联结果进行比较,获取id较小的记录,最后使用delete语句进行删除,具体步骤如下:

-- 第一步 进行自身表关联,以p1表记录为基础,与p2表进行比较,查询满足条件的记录
SELECT p1.* FROM Person p1, Person p2 WHERE p1.Email = p2.Email
​
-- 第二步 查找相同电子邮件地址的更大的id。
SELECT p1.* FROM Person p1, Person p2 WHERE p1.Email = p2.Email AND p1.Id > p2.Id 
​
-- 进行完整的删除操作
DELETE p1 FROM Person p1,
    Person p2
WHERE
    p1.Email = p2.Email AND p1.Id > p2.Id

说明:

DELETE p1这种删除语句其实还是很少遇到的,这种删除方式是表示要删除t1的中的部分记录,删除的记录是满足where条件记录,满足的话就进行删除。