leetcode数据库算法题系列十九 :627. 交换工资(MySQL版)
阅读之前,请牛刀小试:https://leetcode-cn.com/problems/swap-salary/
本系列教程,基于19个案例来探索SQL编程的艺术。 SQL 是一门结构化查询语言,更是一门面向集合的语言。
一 、题目:交换工资
给定一个 salary 表,如下所示,有 m=男性 和 f=女性 的值 。交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。要求使用一个更新(Update)语句,并且没有中间临时表。
请注意,你必须编写一个 Update 语句,不要编写任何 Select 语句。
例如:
| 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 |
应用场景
修改一个表中某个字段的属性值,应用场景还是有的。
二、准备:创建表插入数据
-- 字段名不推荐和表相同,修改为sal
DROP TABLE IF EXISTS salary;
CREATE TABLE salary (
id INT PRIMARY KEY,
name VARCHAR(200),
sex VARCHAR(20),
sal DECIMAL(10,2)
) ;
INSERT INTO salary (id,name,sex,sal) VALUES
(1,'A','m',2500),
(2,'B','f',1500),
(3,'C','m',5500),
(4,'D','f',500);
三、解法:条条大路
3.1 解法一 : case when
关注case when 的使用,使用它能够过进行行列转换、已有数据重分组(分类)、与约束的结合使用、针对聚合结果的条件分支等; 能在诸多场景中发挥了神奇的作用。
下面这种写法通用性很好,在其他数据库中也能执行。也是值得推荐
UPDATE salary SET sex = CASE WHEN sex = 'm' THEN 'f' ELSE 'm' END;
等价写法
UPDATE salary
SET
sex = CASE sex
WHEN "m" THEN "f"
ELSE "m"
END;
更多关于case when的知识,就不重复造轮子了,可以看这篇文章:https://blog.csdn.net/qq_31156277/article/details/84258867
case when 请你一定要懂它
3.2 解法二: IF 表达式
IF 表达式 IF( expr1 , expr2 , expr3 ) expr1 的值为 TRUE,则返回值为 expr2 expr1 的值为FALSE,则返回值为 expr3
update salary set sex = if(sex = 'm','f','m')
这个是MySQL中支持的IF 表达式,十分简洁, 但是其他数据库并不一定支持
3.3 其他补充
这道题与换座位十分相似,只是一个是更新语句,一个是查询语句。 理论在查询语句的基础上是可以获取更新语句的,需要再嵌套一层。
这类题属于批量更新/删除, 但是在MySQL中一定要注意 SELECT 出来的字段进行更新、删除会报错,针对这类问题,常常需要根据具体情况,灵活使用 join 关键字。 除此以外,可以在嵌套一层来解决报错问题。
更多推荐
所有评论(0)