关于SQL-case when最全面的学习笔记

news/发布时间2024/8/25 18:05:55
原文zhuanlan.zhihu.com/p/110198759?from_voters_page=truecase when
推荐学习书籍:
1、SQL基础教程 6-3
2、SQL进阶教程 1-1case when 是SQL语法中提供的标准的条件分支。
条件分支在MYSQL中即为IF函数,不同的数据库都会提供自己的一些函数,但是CASE WHEN 更加通用。CASE语句的两种写法1、搜索CASE表达式
(只会这一种方式即可)CASE 
WHEN <求值表达式> THEN <表达式1>
WHEN <求值表达式> THEN <表达式2>
ELSE <表达式>
END
<求值表达式> :一般为字段 【=、>、<、in、等】如 字段 = "1"
<表达式1> : 一般为字段或者字符串或者数值等。2、简单CASE表达式
CASE <表达式>
WHEN <表达式> THEN <表达式>
WHEN <表达式> THEN <表达式>
ELSE <表达式>
END
注:ELSE 可以不写,默认返回null
end 不可以忘记
当一个case子句中有多个判断逻辑时、字段类型需要一致
当一个case子句中有多个判断逻辑时、第一个为真的结果会被输出
每一个case子句只输出一个结果
case 执行逻辑case 应用1、添加列
现有学生表一张先在需要根据生日列 **生成新的一列 **:显示90后,00后,10后代码:SELECT 
s_name
,s_birthday 
,CASE WHEN YEAR(s_birthday)>=1990 and YEAR(s_birthday)<2000 THEN "90后"WHEN YEAR(s_birthday)>=2000 and YEAR(s_birthday)<2010 THEN "00后"WHEN YEAR(s_birthday)>=2010 and YEAR(s_birthday)<2020 THEN "10后"ELSE "未知"END AS "阶段"
from student ;
显示结果:2、行转为列
现统计了学生的总成绩。
先在想将赵雷和李云的总成绩展示成:可以输入以下代码:SELECT SUM(CASE WHEN s_name = "李云" THEN score ELSE 0 END) as "李云"
,SUM(CASE   WHEN s_name = "赵雷" THEN score ELSE 0 END) as "赵雷"
FROMscore a INNER JOIN student b   on a.s_id=b.s_id;3、实现分组统计
一般我们都使用group by来实现分组统计,但是有的时候需要对字段先分组再统计。比如我们想知道成绩表现为不及格、良、优秀的课程数分别是多少3.1 实现人次的分组统计
SELECT 
CASE WHEN score<60 THEN "不及格"WHEN score>=60 and score<85 THEN "良"WHEN score>=85 THEN "优秀"ELSE "未知"   END     AS "阶段",count(*) as "人次"
from  score a INNER JOIN student b  on a.s_id=b.s_id
GROUP BY CASE WHEN score<60 THEN "不及格"WHEN score>=60 and score<85 THEN "良"WHEN score>=85 THEN "优秀"ELSE "未知"END ;因为每个人会参加多门课程,所以当使用count(*)的时候,就是对于人次计算的,学生是没有去重的。3.2 实现人数的分组统计
SELECT 
CASE WHEN score<60 THEN "不及格"WHEN score>=60 and score<85 THEN "良"WHEN score>=85 THEN "优秀"ELSE "未知"END AS "阶段"
,count(DISTINCT a.s_id) as "包含人数"from  score a INNER JOIN student b  on a.s_id=b.s_id
GROUP BY CASE WHEN score<60 THEN "不及格"WHEN score>=60 and score<85 THEN "良"WHEN score>=85 THEN "优秀"ELSE "未知"END ;这里使用里count(DISTINCT a.s_id) 对学生进行了去重。3.3 group by分组中使用别名
SELECT 
CASE WHEN score<60 THEN "不及格"WHEN score>=60 and score<85 THEN "良"WHEN score>=85 THEN "优秀"ELSE "未知"END AS type
,count(*)
from  score a INNER JOIN student b  on a.s_id=b.s_id
GROUP BY type;
更加SQL执行顺序,是不应该使用别名的,但是在某些,比如MYSQL中执行时会先扫描select后的字段,所以实际执行是可以实现的。4、透视表方式展示
case 表达式可以实现sql像excel透视表类似的功能。比如我想知道每门课程,学生成绩的分别情况可以使用下方代码进行完成SELECT 
c_id,
sum(CASE WHEN score<60 THEN 1   ELSE 0  END )   AS "不及格"
,sum(CASE WHEN score>=60 and score<85 THEN 1    ELSE 0 END) as "良"
,sum(CASE WHEN score>=85 THEN 1 ELSE 0 END) as "优秀"
from  score a LEFT JOIN student b   on a.s_id=b.s_id
where c_id is not null
GROUP BY a.c_id;case 执行逻辑1、没有group by 的聚合
上面知识点 行转为列。
代码如下:SELECT SUM(CASE WHEN s_name = "李云" THEN score ELSE 0 END) as "李云"
,SUM(CASE   WHEN s_name = "赵雷" THEN score ELSE 0 END) as "赵雷"
FROMscore a INNER JOIN student b   on a.s_id=b.s_id;
结果为我们在语句中使用了聚合函数,这个聚合函数使得数据展示为一行。如果不使用会如何?数据会以每一行的形式展示。
因为SQL在执行完语句后会逐行对数据进行计算。2、有group by 的汇总数据
接着上面来讲。
这里有个问题,既然用group by了,为何还要使用SUM.。(这里主要是在mysql5.7以下会遇到这样的问题)
我就在实际的统计中,遇到了这样的问题。
因为自己的库装的是mysql,5.8 所以这样不符合规范的代码是运行不了的,因为要修改配置比较麻烦,我这里就手动写出他的| c_id | 不及格 | 良 | 优秀 | | --- | --- | --- | --- | | 01 | 1 | 0 | 0 | | 02 | 0 | 1 | 0 | | 03 | 1 | 0 | 0 |这里就会出现每行只有一个结果。SELECT 
c_id,
CASE WHEN score<60 THEN 1   ELSE 0  END     AS "不及格"
,CASE WHEN score>=60 and score<85 THEN 1    ELSE 0 END as "良"
,CASE WHEN score>=85 THEN 1 ELSE 0 END as "优秀"
from  score a LEFT JOIN student b   on a.s_id=b.s_id
where c_id is not null
GROUP BY a.c_id;
因为有groupby的存在,很容易导致计算错误还,看不错来,这为一个小坑。这里关于SQL的执行顺序还需要单独再进行一章。

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

如若内容造成侵权/违法违规/事实不符,请联系连锁易网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

视频直播app源码,利用缓存实现连续登录失败后的时间等待

实现步骤:1、用户在视频直播app源码中发起登录请求2、后台验证是否失败次数过多,账户没有锁定的话就进入下面的步骤;否则直接返回3、验证用户的账号 + 密码3.1 验证成功:删除缓存3.2 验证失败:统计最近10分钟时间窗口内的失败次数,如果达到5次则设置锁定缓存,返回图解实…

项目需求调研计划

在项目的规划阶段,项目经理会进行项目需求的详细调研,来确定项目实施的目标。其目的是为了论证项目需求可行性,澄清系统的所有业务细节,并进行业务规则与系统的匹配。

MySQL 视图

视图(View)是一种虚拟存在的表,视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。 通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。…

简单课程安排问题

问题描述:假定某大学有门课程需要使用同一个教室来上课。显然,我们不能在一个教室同时上两门或多门课程。因此,每门课使用教室的方式是独享的。假定这n门课程的集合为C={c1,c2,...,cn}。每门课使用教室的时间为{si,fi},i=1,2,...,n。这里si=开始时间,fi=结束时间。假设我们…

RabbitMQ安装-Windows

Windows 安装 RabbitMQ配置:  Eralng:opt-20.2RabbitMQ-server-3.7.4  (习惯安装到无中文且无空格目录下)1. 安装erlang并配置环境变量  安装:otp_win64_20.2.exe  otp_win64_20.2.exe  配置环境变量  变量名:ERLANG_HOME  变量值:(安装目录)    双击系…

dhcp服务的配置

1、dhcp基础知识参考https://blog.csdn.net/ruocheng6/article/details/122363267 2、dhcp服务是C/S模式,/etc/dhcp/dhcpd.conf是服务端配置文件,/etc/dhcp/dhclient.conf是客户端配置文件 3、关于服务的一些配置命令: systemctl start isc-dhcp-server.service    //开…

Python手相识别教程10命运线

10 命运线 土星线是手相中信息量最大的线条之一。它记录了工作和生活方式的重大变化,描述了我们在人生不同阶段的安全感。这条线有很多名字:命运线、命运线,以及最贴切的安全线。命运线反映了货币安全,但这并不是土星线上显示的唯一一种安全。这条线的标记和特征可能是客观…

二叉树 - 实现二叉树基本操作

二叉树基本操作 1. 获取二叉树中节点个数 计数器思路:public int nodeNum;public void size1(TreeNode root) {if (root == null) {return;}this.nodeNum++;size1(root.left);size1(root.right);} 子问题思路: 每颗树节点个数 = 左子树节点个数 + 右子树节点个数 + 1(根)public…

UEC JUSST Program 申请经过

在大三之前,我从来没有考虑过出国,因为即使20w的花费,也是负担不起的,我不想给家里造成任何麻烦。 另外,我倾向的路线是ACM+非AI方向的技术,最好专硕或者直接就业。 所以也不考虑phd。自从大一裸考过六级之后就没怎么学过英语。 不过有一位家人一直在鼓励或者怂恿我申全奖…

1789. Primary Department for Each Employee

这道题复杂的地方在于只有一个部门的人对应的flag也是N,因此在筛选的时候比较困难。 这里就要使用UNION,很多时候我都想不到这个,以后遇到这种不好使用CASE区分的情况,就可以考虑使用UNION,它会自动去除重复的行。select employee_id, department_id fromEmployee group …

saltstack实践案例

环境配置 查看默认配置 file的[root@mcw01 ~]# vim /etc/salt/master ##### File Server settings ##### ########################################## # Salt runs a lightweight file server written in zeromq to deliver files to # minions. This file server i…

Git必知必会基础(11):撤销操作

本系列汇总,请查看这里:https://www.cnblogs.com/uncleyong/p/10854115.html 数据准备 说明: 下面对file的操作,都可以用通配符 git add <file>... 比如:git add *.txtgit restore <file>... 比如:git restore --staged *.txt修改文件(已提交过,文件已在本…

linux 虚拟机, ubuntu , 代理 , 上网。

问题: PC可以 使用代理上网,但是 虚拟机 还不能访问,github ,但是可以使用百度。设置方式。 首先有一点,要保证 PC 机可以使用 代理访问 github进入虚拟机 ubuntu 做如下设置。 这样就配置好了。

iMessage群发,iMessage群发软件(流程梳理篇)

在数字时代,信息传递的速度与准确性显得尤为重要,iMessage作为Apple设备间的通讯工具,具有无可比拟的优势。 对于企业或个人而言,开发一款iMessage群发软件具有巨大的商业价值,本文将详细梳理iMessage群发软件的开发流程,并分享一些相关的源代码片段。 一、需求分析 在开…

JAVA实现RSA加密、解密、加签、验签

1、工具类RSAUtils.javaimport java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.io.ByteArrayOutputStream; import javax.crypto.Cipher; import java.security.*; import java.util.*;public class RSAUtils {/*** 加密…

Git Rebase和Merge-cnblog

Git Rebase和Merge Rebase 首先,先看一下git rebase的操作图: 在B点创建出来一个新的分支feature,进行了两个commit C和D,master分支则进行了一次提交M, 然后在feature分支上执行然后执行git rebase master这样对变基(rebase)既可清楚理解。 git rebase简单来说就是将C和…

Sql Server 创建用户并限制权限

创建登录名使用sa或者Windows身份验证登录,【安全性】-【登录名】,右键【新建登录名】设置登录名属性设置数据库权限db owner --拥有数据库全部权限,包括删除数据库权限 db accessadmin --只给数据库用户创建其他数据库用户的权限,而没有创建登录用户的权限 db securityadm…

excel宏-表格通过图片的网络路径下载展示图片

1、原理 通过图片的网络路径,将图片下载到本地,excel读取本地路径,显示图片。 注意:下载的图片路径改变将无法展示 2、准备 2.1、excel版本 MS_Office_2016 2.2、excel开启宏 选项 -》信任中心 -》 信任中心设置 -》 宏设置 -》启用所有宏2.3、另存为宏文件 表格数据另存为…

水肥一体化无线芯片解决方案-ASR6601

水肥一体化自动控制系统可以帮助生产者很方便的实现自动的水肥一体化管理。系统由云平台、智能网关、墒情数据采集终端、视频监控、施肥机、过滤系统、阀门控制器、电磁阀、田间管路等组成。整个系统可根据监测的土壤水分、作物种类的需肥规律,设置周期性水肥计划实施轮灌。施…
推荐文章