本题使用的是 MySQL8.0,没有在 MySQL5.6 版本中测验过,不保证正确。
题目
题目来源:性别变更
将所有数据 sex
的 f
和 m
对换,仅使用单个 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
。在利用异或,相同的数为
0
, 0
和任何数进行异或都是那个数。再利用
char
将 ascii
码转换成字母具体的步骤:
ascii('m')
为109
,ascii('f')
为102
ascii('m') ^ ascii('m') ^ ascii('f')
,所以转化成109 ^ 109 ^ 102
,109
和109
异或为0
,0
和102
异或为102
,在用char(102)
得出结果为m
。ascii('f') ^ ascii('m') ^ ascii('f')
,所以转化成102 ^ 109 ^ 102
,可以交换下109
和102
的位置,所以102
和102
异或为0
,0
和109
异或为109
,在用char(109)
得出结果为f
。
推荐阅读
- mysql8数据迁移至mysql5.7
- day2 超过经理收入的员工
- Mysql|MySQL数据库触发器讲解与案例
- mysql my.cnf配置模板参考
- mysql-group by 分页
- Mysql8版本遇到MySQL 服务无法启动的解决方法
- 「MySQL」数据库备份和还原
- 字符串可以这样加索引,你知吗(《死磕MySQL系列 七》)
- 什么(还在用delete删除数据《死磕MySQL系列 九》)