题目描述

给定一个 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

相关知识

  1. UPDATE
    • UPDATE table_name SET field1=newvalue1, field2=newvalue2 WHERE

解题过程

  1. 分析题意

    • 题目中要求只能写一个UPDATE语句,不能写任何SELECT语句,不能有任何中间临时表
    • 连接操作就可以不使用SELECT获取内容
  2. 编写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
    
  3. 提交,运行通过

  4. 但是我的运行效率比较低,查看题解

    UPDATE
    	salary 
    SET 
    	sex=(IF(sex="m", "f", "m"))
    
    • 这里按照语法是SET field=value,所以sex=()这个等于号是赋值,而IF语句中的等于号是将原表的这一行的sex值进行判断
    • 所以不用连接操作,就可以获取到原本的值
    • 所以不用SELECT,也可以获取到原本的值
    • 这里进行二值交换的IF语句也很巧妙,而且比CASE语句效率高

学习总结

  1. 要注意在不同语句中的等号的含义可能不一样,如赋值、比较
  2. 要注意凡是比较的语句,变量都可以不SELECT查询,直接用变量名就可以从表中取到