乐趣区

关于mysql:day5-性别变更

本题应用的是 MySQL8.0,没有在 MySQL5.6 版本中测验过,不保障正确。

题目

题目起源:性别变更

将所有数据 sexfm 对换,仅应用单个 update 语句,且不产生两头长期表

create table salary (
    id int primary key,
    name varchar(255),
    sex varchar(255),
    salary int
)

insert into salary values
(1, 'A', 'm', 2500),
(2, 'B', 'f', 1500),
(3, 'C', 'm', 5500),
(4, 'D', 'f', 500);

SQL:办法一

update salary set sex = case sex when 'm' then 'f' else 'm' end;

解析

如果 sex = 'm',那么就设置为 f,否则设置为 m

应用 case sex when 'm' then 'f' else 'm' end 就能够实现

SQL:办法二

update salary set sex = if(sex = 'm', 'f', 'm');

解析

思路和办法一一样

这是应用 if(sex = 'm', 'f', 'm')

SQL:办法三

update salary set sex = char(ascii(sex) ^ ascii('m') ^ ascii('f'));

解析

每一个字母都对应一个 ascii,应用 ascii() 就能够把字母转换成 ascii

在利用异或,雷同的数为 00 和任何数进行异或都是那个数。

再利用 charascii 码转换成字母

具体的步骤:

  • ascii('m')109ascii('f')102
  • ascii('m') ^ ascii('m') ^ ascii('f'),所以转化成 109 ^ 109 ^ 102109109 异或为 00102 异或为 102,在用 char(102) 得出后果为 m
  • ascii('f') ^ ascii('m') ^ ascii('f'),所以转化成 102 ^ 109 ^ 102,能够替换下 109102 的地位,所以 102102 异或为 00109 异或为 109,在用 char(109) 得出后果为 f

更多解题参考:https://github.com/astak16/bl…

退出移动版