题目描述
给定一个 salary 表,如下所示,有 m = 男性 和 f = 女性 的值。交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。要求只使用一个更新(Update)语句,并且没有中间的临时表。
注意,您必只能写一个 Update 语句,请不要编写任何 Select 语句。
例如:
| id | name | sex | salary | | —- | —- | —- | —— | | 1 | A | m | 2500 | | 2 | B | f | 1500 | | 3 | C | m | 5500 | | 4 | D | f | 500 | 运行你所编写的更新语句之后,将会得到以下表:
id | name | sex | salary |
---|---|---|---|
1 | A | f | 2500 |
2 | B | m | 1500 |
3 | C | f | 5500 |
4 | D | m | 500 |
相关知识
- UPDATE
- UPDATE table_name SET field1=newvalue1, field2=newvalue2 WHERE
解题过程
-
分析题意
- 题目中要求只能写一个UPDATE语句,不能写任何SELECT语句,不能有任何中间临时表
- 连接操作就可以不使用SELECT获取内容
-
编写SQL
UPDATE salary a,salary b SET a.sex=( CASE b.sex WHEN 'm' THEN 'f' WHEN 'f' THEN 'm' END ) WHERE a.id=b.id
-
提交,运行通过
-
但是我的运行效率比较低,查看题解
UPDATE salary SET sex=(IF(sex="m", "f", "m"))
- 这里按照语法是SET field=value,所以sex=()这个等于号是赋值,而IF语句中的等于号是将原表的这一行的sex值进行判断
- 所以不用连接操作,就可以获取到原本的值
- 所以不用SELECT,也可以获取到原本的值
- 这里进行二值交换的IF语句也很巧妙,而且比CASE语句效率高
学习总结
- 要注意在不同语句中的等号的含义可能不一样,如赋值、比较
- 要注意凡是比较的语句,变量都可以不SELECT查询,直接用变量名就可以从表中取到