开启掘金成长之旅!这是我参与「掘金日新计划 · 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条件记录,满足的话就进行删除。