MYSQL常见面试题之——CASE专题知识总结

阅读之前看这里👉:博主是正在学习数据分析的一员,博客记录的是在学习过程中一些总结,也希望和大家一起进步,在记录之时,未免存在很多疏漏和不全,如有问题,还请私聊博主指正。
博客地址:天阑之蓝的博客,学习过程中不免有困难和迷茫,希望大家都能在这学习的过程中肯定自己,超越自己,最终创造自己。

复习知识点:

CASE表达式:

-- 简单CASE 表达式
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
-- 搜索CASE 表达式
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END

用一条SQL语句进行不同条件的统计(分组汇总求和问题)

进行不同条件的统计是CASE 表达式的著名用法之一。例如,我们需要往存储各县人口数量的表PopTbl 里添加上“性别”列,然后求按性别、县名汇总的人数。具体来说,就是统计表PopTbl2 中的数据,然后求出如表“统计结果”所示的结果。
在这里插入图片描述

通常的做法是像下面这样,通过在WHERE 子句里分别写上不同的条件,
然后执行两条SQL 语句来查询。

-- 男性人口
SELECT pref_name,
SUM(population)
FROM PopTbl2
WHERE sex = '1'
GROUP BY pref_name;
-- 女性人口
SELECT pref_name,
SUM(population)
FROM PopTbl2
WHERE sex = '2'
GROUP BY pref_name;

最后需要通过宿主语言或者应用程序将查询结果按列展开。如果使用UNION,只用一条SQL 语句就可以实现,但使用这种做法时,工作量并没有减少,SQL 语句也会变得很长。而如果使用CASE 表达式,下面这一条简单的SQL 语句就可以搞定。

SELECT  pref_name AS 县名,
	    SUM(CASE sex WHEN 1 THEN population ELSE 0 END)  AS,
		SUM(CASE sex WHEN 2 THEN population ELSE 0 END)  ASFROM  poptbl2 
GROUP BY 县名

结果如下:
在这里插入图片描述

用CASE调换列表中的值

下面思考一下这样一种需求:以某数值型的列的当前值为判断对象,将其更新成别的值。这里的问题是,此时UPDATE 操作的条件会有多个分支。例如,我们通过下面这样一张公司人事部的员工工资信息表Salaries 来看一下这种情况。
在这里插入图片描述
假设现在需要根据以下条件对该表的数据进行更新。

  1. 对当前工资为30 万日元以上的员工,降薪10%。
  2. 对当前工资为25 万日元以上且不满28 万日元的员工,加薪20%。

按照这些要求更新完的数据应该如下表所示。
在这里插入图片描述
乍一看,分别执行下面两个UPDATE 操作好像就可以做到,但这样的结果却是不正确的。

-- 条件1
UPDATE Salaries
SET salary = salary * 0.9
WHERE salary >= 300000;
-- 条件2
UPDATE Salaries
SET salary = salary * 1.2
WHERE salary >= 250000 AND salary < 280000;

我们来分析一下不正确的原因。例如这里有一个员工,当前工资是30 万日元,按“条件1”执行UPDATE 操作后,工资会被更新为27 万日元,但继续按“条件2”执行UPDATE 操作后,工资又会被更新为32.4 万日元。这样,本来应该被降薪的员工却被加薪了2.4 万日元。
在这里插入图片描述
CASE表达式的方法:

UPDATE salaries
SET salary = CASE WHEN salary >= 300000
THEN salary * 0.9
WHEN salary >= 250000 AND salary < 280000
THEN salary * 1.2
ELSE salary END;

这个技巧的应用范围很广。例如,可以用它简单地完成主键值调换这种繁重的工作。通常,当我们想调换主键值a 和b 时,需要将主键值临时转换成某个中间值。使用这种方法时需要执行3 次UPDATE 操作,但是如果使用CASE 表达式,1 次就可以做到。

如果在调换上表的主键值a 和b 时不用CASE 表达式,则需要像下面这样写3 条SQL 语句。

--1. 将a 转换为中间值d
UPDATE SomeTable
SET p_key = 'd'
WHERE p_key = 'a'
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些 MySQL 见面试题: 1. 什么是 MySQLMySQL 是一种开源的关系型数据库管理系统(RDBMS),用于存储、管理和检索数据。它是一种客户端/服务器模型数据库,可以同时支持多个连接。 2. MySQL 的优点是什么? MySQL 的优点包括: - 开源:MySQL 是免费和开源的,可以用于商业和非商业用途。 - 可扩展性:MySQL 可以处理大量数据和高并发请求。 - 跨平台:MySQL 可以在多个操作系统上运行,如 Windows、Linux、Mac 等。 - 安全性:MySQL 提供了许多安全功能,如 SSL 加密、访问控制和数据加密。 3. MySQL 中的主键和唯一键有什么区别? 主键是一列或一组列,用于唯一标识表中的每一行数据。主键必须是唯一的,且不能为 NULL。 唯一键是一列或一组列,用于确保表中的数据唯一。唯一键可以包含 NULL 值,但每个值只能出现一次。 4. 如何在 MySQL 中创建一个新表? 可以使用以下命令在 MySQL 中创建一个新表: ``` CREATE TABLE table_name ( column1 datatype, column2 datatype, column3 datatype, ... ); ``` 其中,`table_name` 是要创建的表的名称,`column1`、`column2`、`column3` 等是表中的列名,`datatype` 是每列的数据类型。 5. 如何在 MySQL 中插入新数据? 可以使用以下命令在 MySQL 中插入新数据: ``` INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...); ``` 其中,`table_name` 是要插入数据的表的名称,`column1`、`column2`、`column3` 等是表中的列名,`value1`、`value2`、`value3` 等是要插入的值。 6. 如何在 MySQL 中更新数据? 可以使用以下命令在 MySQL 中更新数据: ``` UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition; ``` 其中,`table_name` 是要更新数据的表的名称,`column1`、`column2` 等是要更新的列名,`value1`、`value2` 等是要更新的值,`condition` 是更新数据的条件。 7. 如何在 MySQL 中删除数据? 可以使用以下命令在 MySQL 中删除数据: ``` DELETE FROM table_name WHERE condition; ``` 其中,`table_name` 是要删除数据的表的名称,`condition` 是删除数据的条件。 8. 如何在 MySQL 中查询数据? 可以使用以下命令在 MySQL 中查询数据: ``` SELECT column1, column2, ... FROM table_name WHERE condition; ``` 其中,`column1`、`column2` 等是要查询的列名,`table_name` 是要查询的表的名称,`condition` 是查询数据的条件。 9. 如何在 MySQL 中创建索引? 可以使用以下命令在 MySQL 中创建索引: ``` CREATE INDEX index_name ON table_name (column1, column2, ...); ``` 其中,`index_name` 是要创建的索引的名称,`table_name` 是要创建索引的表的名称,`column1`、`column2` 等是要创建索引的列名。 10. 如何在 MySQL 中优化查询? 可以使用以下方法优化 MySQL 查询: - 创建索引:可以提高查询速度。 - 避免使用 SELECT *:只查询需要的列,可以减少查询时间。 - 避免在 WHERE 子句中使用函数:可以减少查询时间。 - 避免使用子查询:可以减少查询时间。 - 分页查询时使用 LIMIT:可以减少查询时间和减轻服务器负担。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值