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

news2024/11/29 20:31:25

目录

4.1 If函数语法格式

4.2 CASE WHEN 条件表达式格式

4.3 update与 case when

4.4 练习题1

4.5 练习题2

4.6 练习题3-行转列

4.7 牛客练习题

4.8 LeetCode练习题



4.1 If函数语法格式

IF(expr1,expr2,expr3)

解释:

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

常用示例:

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

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

结果:

4.2 CASE WHEN 条件表达式格式

1. 格式1:简单case函数

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

2. 格式2:case搜索函数

CASE WHEN condition THEN result
     [WHEN...THEN...]
ELSE result
END

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

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

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

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

4.3 update与 case when

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

update Table set  field = (case  XX  when  XXXX  then XXX
                                     when  xxxx then xxxxxx
                                     else xxxx  
                           end)

4.4 练习题1

数据库

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代码:

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表示女生。

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

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 语句。

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

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

4.5 练习题2

数据库

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表示热耗

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

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的值…

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

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-行转列

数据库

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', '其他');

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

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

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练习题

  • LeetCode_1873. 计算特殊奖金

  • LeetCode_627. 变更性别

  • LeetCode_608. 树节点

  • LeetCode_1393. 股票的资本损益

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1299849.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java服务调用mysql报错

一、前言 前端服务调用后端服务时出现以下报错&#xff0c;原因是使用mysql5.7版本数据库中存在ONLY_FULL_GROUP_BY这个配置项导致的不兼容 MySQLSyntaxErrorException: Expression #32 of SELECT list is not in GROUP BY clause and contains nonaggregated column demeter…

系列九、SpringBoot + MyBatis + Redis实现分布式缓存

一、缓存介绍 1.1、概述 缓存是计算机内存中的一段数据&#xff08;PS&#xff1a;内存中的数据具有读写快、断电立即消失的特点&#xff09;&#xff0c;合理地使用缓存能够提高网站的吞吐量和运行效率&#xff0c;减轻数据库的访问压力。那么哪些数据适合缓存呢&#xff1f;…

C++笔记之通过静态类成员变量的方式在不同的类之间传递参数

C笔记之通过静态类成员变量的方式在不同的类之间传递参数 code review! 在C中&#xff0c;可以使用静态类成员变量作为一种在不同类之间传递参数的方式。静态类成员变量是类的所有对象之间共享的变量&#xff0c;它们存在于类的内部&#xff0c;但不属于任何特定的类对象。 …

qt:QMessageBox的常见用法

头文件&#xff1a;#include <QMessageBox> Infomation消息对话框 初始化格式&#xff1a; QMessageBox * msgBox new QMessageBox(QMessageBox::Information, "我是标题", "我是提示文字", 按钮); 按钮可以是以下取值&#xff0c;会在按键上显示…

Python开发运维:Python调用K8S API实现资源管理

目录 一、实验 1.Python操作K8S API获取资源 2.Python操作K8S API创建deployment资源 3.Python操作K8S API删除k8s资源 4.Python操作K8S API修改k8s资源 5.Python操作K8S API查看k8s资源 二、问题 1.Windows11安装kubernetes报错 2.Python通过调用哪些方法实现Pod和De…

变容二极管测量

测量变量二极管一般有两种方法&#xff1a;一是搭建偏置电路&#xff0c;用LCR电桥测量电容&#xff1b;二是搭建一个VCO&#xff0c;通过测量频率&#xff0c;简接测量变容二极管的电容值。 正好手里有许老师LCR&#xff0c;搭建一个简单的测试电路即可&#xff0c;电路图如下…

复旦量化多策略公开课总结

《掘金之心公众号&#xff1a;gnu_isnot_unix》前Citadel现自营交易与量化管理&#xff0c;分享热点&#xff0c;主观&#xff0c;量化交易内容。活在当下&#xff0c;终身学习 - 给在职却对未来始终迷茫的人的公众号。借此想告诉不断努力&#xff0c;对生活充满热情的读者们&a…

基于ssm在线云音乐系统的设计与实现论文

摘 要 随着移动互联网时代的发展&#xff0c;网络的使用越来越普及&#xff0c;用户在获取和存储信息方面也会有激动人心的时刻。音乐也将慢慢融入人们的生活中。影响和改变我们的生活。随着当今各种流行音乐的流行&#xff0c;人们在日常生活中经常会用到的就是在线云音乐系统…

洛谷P1450 硬币购物

传送门&#xff1a; P1450 [HAOI2008] 硬币购物 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P1450 题干&#xff1a; 题目描述 共有 4 种硬币。面值分别为 c1​,c2​,c3​,c4​。 某人去商店买东西&#xff0c;去了 n 次&#xff0c;对于…

【Angular开发】Angular在2023年之前不是很好

做一个简单介绍&#xff0c;年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【架构师酒馆】…

eclipse中maven的配置

Maven下载地址&#xff1a;https://maven.apache.org/download.cgi 下载完成以后解压到非中文目录&#xff0c;建议放一个比较大的盘符下&#xff0c;因为Maven会一直从网上更新各种库存放在这个目录下&#xff0c;慢慢的会变得很大。 Maven环境变量配置 创建环境变量 在桌…

Diary22-全网最全的CSS3.0讲解

CSS学习 1.认识CSS 1.1什么是CSS CSS&#xff1a;Cascading Style Sheet——层叠级联样式表 CSS&#xff1a;表现&#xff08;美化网页&#xff09; 字体&#xff1b;颜色&#xff1b;边距&#xff1b;高度&#xff1b;宽度&#xff1b;背景图片&#xff1b;网页定位&…

再见了Future,图解JDK21虚拟线程的结构化并发

Java为我们提供了许多启动线程和管理线程的方法。在本文中&#xff0c;我们将介绍一些在Java中进行并发编程的选项。我们将介绍结构化并发的概念&#xff0c;然后讨论Java 21中一组预览类——它使将任务拆分为子任务、收集结果并对其进行操作变得非常容易&#xff0c;而且不会不…

【图片版】计算机组成原理考前复习题【第2章 运算方法和运算器-1】

目录 前言 考前复习题&#xff08;必记&#xff09; 结尾 前言 在计算机组成原理的学习过程中&#xff0c;我们深入探索了计算机系统概述这一重要领域。计算机系统作为现代科技的核心&#xff0c;是整个计算机科学的基石。我们将学到的知识与理论转化为了能够解决现实问题的…

3DMAX关于显示驱动问题的解决方法大全

3DMAX与显卡驱动有关的问题主要有以下几种情况&#xff1a; 1.3DMAX启动弹出这样的界面&#xff1a; 2.主工具栏按钮不显示&#xff0c;或者鼠标移上去才显示&#xff08;刷新问题&#xff09;。 3&#xff0e;视口菜单不显示或显示不全。 问题分析&#xff1a; 首先&#x…

AspNetCore 中使用 Knife4jUI 更加友好的Swagger界面

&#x1f680;介绍 aspnetcore.knife4j是一个基于.NET Core平台的Swagger UI库&#xff0c;它提供了API文档的生成和管理功能。这个库的前身是swagger-bootstrap-ui&#xff0c;在Java项目中广泛使用&#xff0c;由于其优秀的界面和易用性被许多开发者所推崇。现在&#xff0c…

一文学会使用 PyInstaller 将 Python 脚本打包为 .exe 可执行文件

文章目录 前言PyInstaller特点跨平台支持自动依赖项处理单文件发布支持图形用户界面&#xff08;GUI&#xff09;和命令行界面&#xff08;CLI&#xff09;应用支持多种打包选项 基本用法常用参数其它参数 版本 & 环境实现步骤安装 PyInstaller创建 Python 脚本使用 PyInst…

C++学习笔记之五(String类)

C 前言getlinelength, sizec_strappend, inserterasefindsubstrisspace, isdigit 前言 C是兼容C语言的&#xff0c;所以C的字符串自然继承C语言的一切字符串&#xff0c;但它也衍生出属于自己的字符串类&#xff0c;即String类。String更像是一个容器&#xff0c;但它与容器还…

HJ103 Redraiment的走法

题目&#xff1a; HJ103 Redraiment的走法 题解&#xff1a; dfs 暴力搜索 枚举数组元素&#xff0c;作为起点如果后续节点大于当前节点&#xff0c;继续向后搜索记录每个起点的结果&#xff0c;求出最大值 public int getLongestSub(int[] arr) {int max 0;for (int i 0…

MySQL - 表达式With as 语句的使用及练习

目录 8.1 WITH AS 的含义 8.2 WITH AS语法的基本结构如下&#xff1a; 8.3 练习题1 8.4 牛客练习题 8.1 WITH AS 的含义 WITH AS 语法是MySQL中的一种临时结果集&#xff0c;它可以在SELECT、INSERT、UPDATE或DELETE语句中使用。通过使用WITH AS语句&#xff0c;可以将一个查…