当前位置:   article > 正文

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

mysql if函数的使用

目录

13.4 流程函数 -(If)

4.1 If函数语法格式

4.2 IFNULL(表达式,用什么值代替)

4.3 NULLIF() 函数的使用

4.4 ISNULL()函数的使用

4.5 leetcode练习题

13.5 流程函数 -(CASE WHEN)

13.5.1 CASE WHEN 条件表达式格式

15.5.2 update与 case when

15.5.3 练习题1

15.5.4 练习题2

15.5.5 练习题3-行转列

15.5.6 牛客练习题

15.5.7 LeetCode练习题


13.4 流程函数 -(If)

4.1 If函数语法格式

IF(expr1,expr2,expr3)

解释:

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

常用示例:

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

select if(1,'正确','错误');

结果:

4.2 IFNULL(表达式,用什么值代替)

IFNULL(expr1,expr2),如果expr1的值为null,则返回expr2的值,如果expr1的值不为null,则返回expr1的值。

  1. SELECT IFNULL(NULL,'B'); -- 输出结果:B
  2. SELECT IFNULL('HELLO','B'); -- 输出结果:HELLO

4.3 NULLIF() 函数的使用

NULLIF(expr1,expr2),如果expr1=expr2成立,那么返回值为null,否则返回值为expr1的值。

  1. SELECT NULLIF('A','A'); -- 输出结果:null
  2. SELECT NULLIF('A','B'); -- 输出结果:A

4.4 ISNULL()函数的使用

ISNULL(expr),如果expr的值为null,则返回1,如果expr1的值不为null,则返回0。

4.5 leetcode练习题

SQL176 第二高的薪水

13.5 流程函数 -(CASE WHEN)

13.5.1 CASE WHEN 条件表达式格式

1. 格式1:简单case函数

  1. **简单CASE函数**
  2. CASE 条件参数名称
  3. WHEN 参数值1 THEN '显示值1'
  4. WHEN 参数值2 THEN '显示值2'
  5. ...
  6. ELSE '显示其他值' END

2. 格式2:case搜索函数

  1. CASE WHEN condition THEN result
  2. [WHEN...THEN...]
  3. ELSE result
  4. END

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

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

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

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

15.5.2 update与 case when

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

  1. update Table set field = (case XX when XXXX then XXX
  2. when xxxx then xxxxxx
  3. else xxxx
  4. end)

15.5.3 练习题1

数据库

  1. drop table if exists `students`;
  2. create table students
  3. (
  4. stu_code varchar(10) null,
  5. stu_name varchar(10) null,
  6. stu_sex int null,
  7. stu_score int null
  8. );
  9. # 其中stu_sex字段,0表示男生,1表示女生。
  10. INSERT INTO students (stu_code, stu_name, stu_sex, stu_score) VALUES ('xm', '小明', 0, 88);
  11. INSERT INTO students (stu_code, stu_name, stu_sex, stu_score) VALUES ('xl', '夏磊', 0, 55);
  12. INSERT INTO students (stu_code, stu_name, stu_sex, stu_score) VALUES ('xf', '晓峰', 0, 45);
  13. INSERT INTO students (stu_code, stu_name, stu_sex, stu_score) VALUES ('xh', '小红', 1, 89);
  14. INSERT INTO students (stu_code, stu_name, stu_sex, stu_score) VALUES ('xn', '小妮', 1, 77);
  15. INSERT INTO students (stu_code, stu_name, stu_sex, stu_score) VALUES ('xy', '小一', 1, 99);
  16. 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代码:

  1. select stu_score,
  2. case when stu_score<60 then '不及格'
  3. when stu_score>=60 and stu_score<80 then '及格'
  4. when stu_score>=80 then '优秀'
  5. end as 'score_cut'
  6. from students;

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

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

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

  1. select case when stu_sex=0 then '男'
  2. when stu_sex=1 then '女'
  3. end 'gender',
  4. count(*) as 'count_stu',
  5. sum(if(stu_score>=60,1,0)) as 'pass'
  6. from students
  7. group by gender;

场景3- update与case when相结合

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

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

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

  1. update students set stu_sex=(case stu_sex when 0 then 1
  2. when 1 then 0
  3. end);

15.5.4 练习题2

数据库

  1. drop table if exists `energy_test`;
  2. drop table if exists `p_price`;
  3. -- auto-generated definition
  4. create table energy_test
  5. (
  6. e_code varchar(2) null,
  7. e_value decimal(5, 2) null,
  8. e_type int null
  9. );
  10. # 其中,E_TYPE表示能耗类型,0表示水耗,1表示电耗,2表示热耗
  11. INSERT INTO energy_test (e_code, e_value, e_type) VALUES ('北京', 28.50, 0);
  12. INSERT INTO energy_test (e_code, e_value, e_type) VALUES ('北京', 23.50, 1);
  13. INSERT INTO energy_test (e_code, e_value, e_type) VALUES ('北京', 28.12, 2);
  14. INSERT INTO energy_test (e_code, e_value, e_type) VALUES ('北京', 12.30, 0);
  15. INSERT INTO energy_test (e_code, e_value, e_type) VALUES ('北京', 15.46, 1);
  16. INSERT INTO energy_test (e_code, e_value, e_type) VALUES ('上海', 18.88, 0);
  17. INSERT INTO energy_test (e_code, e_value, e_type) VALUES ('上海', 16.66, 1);
  18. INSERT INTO energy_test (e_code, e_value, e_type) VALUES ('上海', 19.99, 0);
  19. INSERT INTO energy_test (e_code, e_value, e_type) VALUES ('上海', 10.05, 0);
  20. -- auto-generated definition
  21. create table p_price
  22. (
  23. p_price decimal(5, 2) null comment '价格',
  24. p_level int null comment '等级',
  25. p_limit int null comment '阈值'
  26. )
  27. comment '电能耗单价表';
  28. INSERT INTO p_price (p_price, p_level, p_limit) VALUES (1.20, 0, 10);
  29. INSERT INTO p_price (p_price, p_level, p_limit) VALUES (1.70, 1, 30);
  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表示热耗

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

  1. select e_code,
  2. sum(if(e_type=0,e_value,0)) as '水耗',
  3. sum(if(e_type=1,e_value,0)) as '电耗',
  4. sum(if(e_type=2,e_value,0)) as '热耗'
  5. from energy_test
  6. group by e_code;

场景2-使用子查询

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

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

  1. select e_code,
  2. e_value,
  3. 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)
  4. 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)
  5. when e_value>=(select p_limit from p_price where p_level=1) then (select p_price from p_price where p_level=2)
  6. end as 'price'
  7. from energy_test
  8. where e_type=1;

15.5.5 练习题3-行转列

数据库

  1. drop table if exists `user_col_comments`;
  2. -- auto-generated definition
  3. create table user_col_comments
  4. (
  5. column_name varchar(50) null comment '列名',
  6. comment varchar(100) null comment '列的备注'
  7. );
  8. INSERT INTO user_col_comments (column_name, comment) VALUES ('SHI_SHI_CODE', '设施编号');
  9. INSERT INTO user_col_comments (column_name, comment) VALUES ('SHUI_HAO', '水耗');
  10. INSERT INTO user_col_comments (column_name, comment) VALUES ('RE_HAO', '热耗');
  11. INSERT INTO user_col_comments (column_name, comment) VALUES ('YAN_HAO', '盐耗');
  12. INSERT INTO user_col_comments (column_name, comment) VALUES ('OTHER', '其他');

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

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

  1. select max(if(column_name='SHI_SHI_CODE',comment,'')) as 'SHI_SHI_CODE',
  2. max(if(column_name='YAN_HAO',comment,'')) as 'YAN_HAO',
  3. max(if(column_name='RE_HAO',comment,'')) as 'RE_HAO',
  4. max(if(column_name='SHUI_HAO',comment,'')) as 'SHUI_HAO',
  5. max(if(column_name='OTHER',comment,'')) as 'OTHER'
  6. from user_col_comments;

15.5.6 牛客练习题

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

15.5.7 LeetCode练习题

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/873518
推荐阅读
相关标签
  

闽ICP备14008679号