Mysql- 流程函数-(If, CASE WHEN)的使用及练习

目录

[4.1 If函数语法格式](#4.1 If函数语法格式)

[4.2 CASE WHEN 条件表达式格式](#4.2 CASE WHEN 条件表达式格式)

[4.3 update与 case when](#4.3 update与 case when)

[4.4 练习题1](#4.4 练习题1)

[4.5 练习题2](#4.5 练习题2)

[4.6 练习题3-行转列](#4.6 练习题3-行转列)

[4.7 牛客练习题](#4.7 牛客练习题)

[4.8 LeetCode练习题](#4.8 LeetCode练习题)



4.1 If函数语法格式

sql 复制代码
IF(expr1,expr2,expr3)

解释:

如果表达式expr1=true(expr1 <> 0 and expr1 <> NULL),返回expr2,否则返回expr3,IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。

常用示例:

expr1参数为1,结果为真,返回正确

sql 复制代码
select if(1,'正确','错误');

结果:

4.2 CASE WHEN 条件表达式格式

1. 格式1:简单case函数

sql 复制代码
**简单CASE函数**
CASE 条件参数名称
    WHEN 参数值1 THEN '显示值1'
    WHEN 参数值2 THEN '显示值2'
    ...
ELSE '显示其他值' END

2. 格式2:case搜索函数

sql 复制代码
CASE WHEN condition THEN result
     [WHEN...THEN...]
ELSE result
END

condition是一个返回布尔类型的表达式,

如果表达式返回true,则整个函数返回相应result的值,

如果表达式皆为false,则返回ElSE后result的值,

如果省略了ELSE子句,则返回NULL。

4.3 update与 case when

当我们有时候要更新 数据库中 同一个字段 根据不同情况更新不同的值,可以用

sql 复制代码
update Table set  field = (case  XX  when  XXXX  then XXX
                                     when  xxxx then xxxxxx
                                     else xxxx  
                           end)

4.4 练习题1

数据库

sql 复制代码
drop table if exists `students`;
create table students
(
    stu_code  varchar(10) null,
    stu_name  varchar(10) null,
    stu_sex   int         null,
    stu_score int         null
);
# 其中stu_sex字段,0表示男生,1表示女生。
INSERT INTO students (stu_code, stu_name, stu_sex, stu_score) VALUES ('xm', '小明', 0, 88);
INSERT INTO students (stu_code, stu_name, stu_sex, stu_score) VALUES ('xl', '夏磊', 0, 55);
INSERT INTO students (stu_code, stu_name, stu_sex, stu_score) VALUES ('xf', '晓峰', 0, 45);
INSERT INTO students (stu_code, stu_name, stu_sex, stu_score) VALUES ('xh', '小红', 1, 89);
INSERT INTO students (stu_code, stu_name, stu_sex, stu_score) VALUES ('xn', '小妮', 1, 77);
INSERT INTO students (stu_code, stu_name, stu_sex, stu_score) VALUES ('xy', '小一', 1, 99);
INSERT INTO students (stu_code, stu_name, stu_sex, stu_score) VALUES ('xs', '小时', 1, 45);

场景1-不同状态下展示为不同的值

题目:

现在学校想要根据学生分数(stu_score)划分等级,score<60返回不及格,score>=60返回及格,score>=80返回优秀。请返回学生的分数(stu_score)和等级(score_cut)

根据示例,你的查询应返回以下结果:

SQL代码:

sql 复制代码
select stu_score,
       case when stu_score<60 then '不及格'
            when stu_score>=60 and stu_score<80 then '及格'
            when stu_score>=80 then '优秀'
       end as 'score_cut'
from students;

场景2- 统计不同状态下的值

现老师要统计班中,有多少男同学,多少女同学,并统计男同学中有几人及格,女同学中有几人及格,要求用一个SQL输出结果。其中stu_sex字段,0表示男生,1表示女生。

根据示例,你的查询应返回以下结果:

sql 复制代码
select case when stu_sex=0 then '男'
            when stu_sex=1 then '女'
       end 'gender',
       count(*) as 'count_stu',
       sum(if(stu_score>=60,1,0)) as 'pass'
from students
group by gender;

场景3- update与case when相结合

请你编写一个解决方案来交换所有的 '男''女' (即,将所有 '女' 变为 '男' ,反之亦然),仅使用 单个 update 语句 ,且不产生中间临时表。其中stu_sex字段,0表示男生,1表示女生。

注意,你必须仅使用一条 update 语句,且 不能 使用 select 语句。

根据示例,你的查询应返回以下结果:

sql 复制代码
update students set stu_sex=(case stu_sex when 0 then 1
                                          when 1 then 0
                             end);

4.5 练习题2

数据库

sql 复制代码
drop table if exists `energy_test`;
drop table if exists `p_price`;

-- auto-generated definition
create table energy_test
(
    e_code  varchar(2)    null,
    e_value decimal(5, 2) null,
    e_type  int           null
);

# 其中,E_TYPE表示能耗类型,0表示水耗,1表示电耗,2表示热耗
INSERT INTO energy_test (e_code, e_value, e_type) VALUES ('北京', 28.50, 0);
INSERT INTO energy_test (e_code, e_value, e_type) VALUES ('北京', 23.50, 1);
INSERT INTO energy_test (e_code, e_value, e_type) VALUES ('北京', 28.12, 2);
INSERT INTO energy_test (e_code, e_value, e_type) VALUES ('北京', 12.30, 0);
INSERT INTO energy_test (e_code, e_value, e_type) VALUES ('北京', 15.46, 1);
INSERT INTO energy_test (e_code, e_value, e_type) VALUES ('上海', 18.88, 0);
INSERT INTO energy_test (e_code, e_value, e_type) VALUES ('上海', 16.66, 1);
INSERT INTO energy_test (e_code, e_value, e_type) VALUES ('上海', 19.99, 0);
INSERT INTO energy_test (e_code, e_value, e_type) VALUES ('上海', 10.05, 0);

-- auto-generated definition
create table p_price
(
    p_price decimal(5, 2) null comment '价格',
    p_level int           null comment '等级',
    p_limit int           null comment '阈值'
)
    comment '电能耗单价表';

INSERT INTO p_price (p_price, p_level, p_limit) VALUES (1.20, 0, 10);
INSERT INTO p_price (p_price, p_level, p_limit) VALUES (1.70, 1, 30);
INSERT INTO p_price (p_price, p_level, p_limit) VALUES (2.50, 2, 50);

energy_test

p_price

场景1 - 配合 聚合函数 做统计

现要求统计各个城市,总共使用了多少水耗、电耗、热耗,使用一条SQL语句输出结果 有能耗表如下:其中,E_TYPE表示能耗类型,0表示水耗,1表示电耗,2表示热耗

根据示例,你的查询应返回以下结果:

sql 复制代码
select e_code,
    sum(if(e_type=0,e_value,0)) as '水耗',
    sum(if(e_type=1,e_value,0)) as '电耗',
    sum(if(e_type=2,e_value,0)) as '热耗'
from energy_test
group by e_code;

场景2-使用 子查询

根据城市用电量多少,计算用电成本。假设电能耗单价分为三档,根据不同的能耗值,使用相应价格计算成本。 P_limit为每个档次的上限。当能耗值(e_value)小于10时,使用P_LEVEL=0时的P_PRICE的值,能耗值大于10小于30使用P_LEVEL=1时的P_PRICE的值...

根据示例,你的查询应返回以下结果:

sql 复制代码
select e_code,
       e_value,
       case when e_value<(select p_limit from p_price where p_level=0) then (select p_price from p_price where p_level=0)
            when e_value>=(select p_limit from p_price where p_level=0) and e_value<(select p_limit from p_price where p_level=1) then (select p_price from p_price where p_level=1)
            when e_value>=(select p_limit from p_price where p_level=1) then (select p_price from p_price where p_level=2)
           end as 'price'
from energy_test
where e_type=1;

4.6 练习题3-行转列

数据库

sql 复制代码
drop table if exists `user_col_comments`;

-- auto-generated definition
create table user_col_comments
(
    column_name varchar(50)  null comment '列名',
    comment     varchar(100) null comment '列的备注'
);

INSERT INTO user_col_comments (column_name, comment) VALUES ('SHI_SHI_CODE', '设施编号');
INSERT INTO user_col_comments (column_name, comment) VALUES ('SHUI_HAO', '水耗');
INSERT INTO user_col_comments (column_name, comment) VALUES ('RE_HAO', '热耗');
INSERT INTO user_col_comments (column_name, comment) VALUES ('YAN_HAO', '盐耗');
INSERT INTO user_col_comments (column_name, comment) VALUES ('OTHER', '其他');

问题:将上表的行列进行转换显示

根据示例,你的查询应返回以下结果:

sql 复制代码
select max(if(column_name='SHI_SHI_CODE',comment,'')) as 'SHI_SHI_CODE',
       max(if(column_name='YAN_HAO',comment,'')) as 'YAN_HAO',
       max(if(column_name='RE_HAO',comment,'')) as 'RE_HAO',
       max(if(column_name='SHUI_HAO',comment,'')) as 'SHUI_HAO',
       max(if(column_name='OTHER',comment,'')) as 'OTHER'
from user_col_comments;

4.7 牛客练习题

SQL26 - 计算25岁以上和以下的用户数量

4.8 LeetCode练习题

相关推荐
tatasix1 分钟前
MySQL UPDATE语句执行链路解析
数据库·mysql
南城花随雪。14 分钟前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了15 分钟前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度17 分钟前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮19 分钟前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9991 小时前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️1 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
Yz98762 小时前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发
武子康2 小时前
大数据-230 离线数仓 - ODS层的构建 Hive处理 UDF 与 SerDe 处理 与 当前总结
java·大数据·数据仓库·hive·hadoop·sql·hdfs
武子康2 小时前
大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本
java·大数据·数据仓库·hive·hadoop·mysql