今天终于把最后一道普通用户可解的数据库简单题刷了,👉627. 交换工资(评论里说应该叫交换性别??🤣)。

--------------------------------------我是无感情分割线---------------------------------------------
10.24更新
刚刚更新了对解法五的异或运算解析,大家可以看看👉:博客
--------------------------------------我是无感情分割线---------------------------------------------

此题确实简单,不过要注意题目里面有这样一条要求:

黑色加粗字体写明了:只能是单个更新语句且不能用select方法!!!

所以此题其实考察的知识点👉:UPDATE函数以及CASE WHEN函数的用法!

下面来看解题思路

  • 首先看题目要求,是要把sex这一列的f 和m 值进行互换,来达到交换工资的目的;那么就要对数据表进行一个更新,所以第一个要用函数就是UPDATE …SET … 方法
  • 接下来要进行一个判断,当sex=f的时候,就要替换为m;同理m要替换为f。那么可以用IF函数或者CASE WHEN函数来操作。

最后是👇参考的解法
掌柜在自己解完此题后发现题解区太多优秀的大佬了,所以这里把几个很优秀的解法一并提出来,一起学习😁

  • 解法一,就是本题思路提到的UPDATE函数和CASE WHEN函数:
UPDATE salary
SET
    sex = CASE sex
        WHEN 'm' THEN 'f'
        ELSE 'm'
    END;

这是第一种解法,也是官方解法的提交运行结果:

  • 解法二,使用ASCII函数和CHAR函数进行字母互转运算:
UPDATE salary SET sex = CHAR(ASCII("m") + ASCII("f") - ASCII(sex));

解释一下:此法是利用字符串函数ASCII来算字符串f、m的数值总和,然后减去本来显示的sex值,得到的就是另一个性别的数值!!!最后再用CHAR转换数值为字符串!下面是MySQL官网对这两个函数用法的示例,大家可以看看更易理解:

👇是得到的提交运行结果:

可以看到代码执行速度明显提升了。

  • 解法三,使用REPLACE函数
UPDATE salary SET sex = REPLACE("fm", sex, "");

看到有朋友对REPLACE后面存在疑问,这里解释一下:replace的语法本来是

REPLACE(str,from_str,to_str)

可以看官方的示例用法:

所以它的含义就是用 to_str 去替换 str 中的 from_str 部分。

这里答主很巧妙的用 空字符串 去替换 fm 中的 sex 部分;
而空字符串的含义是:删除 from_str部分。

即空字符串就会删掉所有sex对应的字符串,所以最后我们在sex列看到的就是另一个性别。

再看提交运行结果:

跟上一个解法用时接近,不过代码更简洁!

  • 解法四,使用IF函数
UPDATE salary SET sex = IF(sex = "m", "f", "m");

这里就直接利用IF函数来进行条件判断,如果sex=m条件符合,就输出f; 否则,输出m。 不得不说这个解法更易理解且代码也简洁!再看看提交运行结果:

速度上又提升了。

  • 解法五,跟ASCII类同,但是他使用了位运算的异或运算! 牛逼👍!这里先简单提一下此题解法,后面专门开一篇文章进行异或运算的讲解!!!
UPDATE salary SET sex = CHAR(ASCII(sex) ^ ASCII("m") ^ ASCII("f"));

最后提交运行结果:

可以看出来此种方法是目前最快的一种解法(在掌柜这里)。

最后总结一下,交换位置的SQL题其实是在考察你对UPDATE用法和 条件判断函数的熟悉程度。以上五种方法就简洁度来说,推荐解法3和解法4;而要易懂的话可采用解法1和4;论效率(掌柜这里来看),解法5更优。大家选择适合自己的就好😁。

参考资料:
力扣的题解区
MySQL官网
MySQL的字符串函数replace用法