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
【day5 性别变更】更多解题参考:https://github.com/astak16/bl...

    推荐阅读