阅读之前,请牛刀小试:https://leetcode-cn.com/problems/swap-salary/

本系列教程,基于19个案例来探索SQL编程的艺术。 SQL 是一门结构化查询语言,更是一门面向集合的语言。


一 、题目:交换工资

给定一个 salary 表,如下所示,有 m=男性 和 f=女性 的值 。交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。要求使用一个更新(Update)语句,并且没有中间临时表。

请注意,你必须编写一个 Update 语句,不要编写任何 Select 语句。

例如:

idnamesexsalary
1Am2500
2Bf1500
3Cm5500
4Df500

运行你所编写的更新语句之后,将会得到以下表:

idnamesexsalary
1Af2500
2Bm1500
3Cf5500
4Dm500

应用场景

修改一个表中某个字段的属性值,应用场景还是有的。


二、准备:创建表插入数据

-- 字段名不推荐和表相同,修改为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 关键字。 除此以外,可以在嵌套一层来解决报错问题。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐