Case具有两种格式。简单Case函数和Case搜索函数。

–简单Case函数
CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END
eg:
CASE sex WHEN ‘1’ THEN ‘男’ WHEN ‘2’ THEN ‘女’ ELSE ‘其他’ END
搜索Case函数
CASE WHEN [expr] THEN [result1]…ELSE [default] END
eg:
CASE WHEN sex = ‘1’ THEN ‘男’ WHEN sex = ‘2’ THEN ‘女’ ELSE ‘其他’ END

这两种语法有什么区别呢?

简单函数

搜索函数
CASE WHEN [expr] THEN [result1]…ELSE [default] END:搜索函数可以写判断,并且搜索函数只会返回第一个符合条件的值,其他case被忽略

when 表达式中可以使用 and 连接条件

聚合函数 sum 配合 case when 的简单函数实现多表 left join 的行转列
注:曾经有个爱学习的路人问我,“那个sum()只是为了好看一点吗?”,left join会以左表为主,连接右表时,得到所有匹配的数据,再group by时只会保留一行数据,因此case when时要借助sum函数,保留其他列的和。如果你还是不明白的话,那就亲手实践一下,只保留left join看一下结果,再group by,看一下结果。例如下面的案例:学生表/课程表/成绩表 ,三个表left join查询每个学生所有科目的成绩,使每个学生及其各科成绩一行展示。
SELECT
st.stu_id ‘学号’,
st.stu_name ‘姓名’,
sum(
CASE co.course_name
WHEN ‘大学语文’ THEN
sc.scores
ELSE
0
END
) ‘大学语文’,
sum(
CASE co.course_name
WHEN ‘新视野英语’ THEN
sc.scores
ELSE
0
END
) ‘新视野英语’,
sum(
CASE co.course_name
WHEN ‘离散数学’ THEN
sc.scores
ELSE
0
END
) ‘离散数学’,
sum(
CASE co.course_name
WHEN ‘概率论与数理统计’ THEN
sc.scores
ELSE
0
END
) ‘概率论与数理统计’,
sum(
CASE co.course_name
WHEN ‘线性代数’ THEN
sc.scores
ELSE
0
END
) ‘线性代数’,
sum(
CASE co.course_name
WHEN ‘高等数学’ THEN
sc.scores
ELSE
0
END
) ‘高等数学’
FROM
edu_student st
LEFT JOIN edu_score sc ON st.stu_id = sc.stu_id
LEFT JOIN edu_courses co ON co.course_no = sc.course_no
GROUP BY
st.stu_id
ORDER BY
NULL;
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859

行转列测试数据
– 创建表 学生表
CREATE TABLE edu_student (
stu_id VARCHAR (16) NOT NULL COMMENT ‘学号’,
stu_name VARCHAR (20) NOT NULL COMMENT ‘学生姓名’,
PRIMARY KEY (stu_id)
) COMMENT = ‘学生表’ ENGINE = INNODB;

– 课程表
CREATE TABLE edu_courses (
course_no VARCHAR (20) NOT NULL COMMENT ‘课程编号’,
course_name VARCHAR (100) NOT NULL COMMENT ‘课程名称’,
PRIMARY KEY (course_no)
) COMMENT = ‘课程表’ ENGINE = INNODB;

– 成绩表
CREATE TABLE edu_score (
stu_id VARCHAR (16) NOT NULL COMMENT ‘学号’,
course_no VARCHAR (20) NOT NULL COMMENT ‘课程编号’,
scores FLOAT NULL DEFAULT NULL COMMENT ‘得分’,
PRIMARY KEY (stu_id, course_no)
) COMMENT = ‘成绩表’ ENGINE = INNODB;

– 插入数据

– 学生表数据

INSERT INTO edu_student (stu_id, stu_name)
VALUES
(‘1001’, ‘盲僧’),
(‘1002’, ‘赵信’),
(‘1003’, ‘皇子’),
(‘1004’, ‘寒冰’),
(‘1005’, ‘蛮王’),
(‘1006’, ‘狐狸’);

– 课程表数据
INSERT INTO edu_courses (course_no, course_name)
VALUES
(‘C001’, ‘大学语文’),
(‘C002’, ‘新视野英语’),
(‘C003’, ‘离散数学’),
(
‘C004’,
‘概率论与数理统计’
),
(‘C005’, ‘线性代数’),
(‘C006’, ‘高等数学’);

– 成绩表数据
INSERT INTO edu_score (stu_id, course_no, scores)
VALUES
(‘1001’, ‘C001’, 67), (‘1002’, ‘C001’, 68), (‘1003’, ‘C001’, 69), (‘1004’, ‘C001’, 70), (‘1005’, ‘C001’, 71),
(‘1006’, ‘C001’, 72), (‘1001’, ‘C002’, 87), (‘1002’, ‘C002’, 88), (‘1003’, ‘C002’, 89), (‘1004’, ‘C002’, 90),
(‘1005’, ‘C002’, 91), (‘1006’, ‘C002’, 92), (‘1001’, ‘C003’, 83), (‘1002’, ‘C003’, 84), (‘1003’, ‘C003’, 85),
(‘1004’, ‘C003’, 86), (‘1005’, ‘C003’, 87), (‘1006’, ‘C003’, 88), (‘1001’, ‘C004’, 88), (‘1002’, ‘C004’, 89),
(‘1003’, ‘C004’, 90), (‘1004’, ‘C004’, 91), (‘1005’, ‘C004’, 92), (‘1006’, ‘C004’, 93), (‘1001’, ‘C005’, 77),
(‘1002’, ‘C005’, 78), (‘1003’, ‘C005’, 79);

MySQL case when then 用法相关推荐

  1. mysql case when then用法

    case when then 的基本用法 SELECTCASE WHEN b.is_leave = 0 THEN'在职' WHEN b.is_leave = 1 THEN'离职' ELSE '状态为空 ...

  2. mysql case 连接_mysql case when的用法是什么

    mysql case when的用法是:1.用作简单搜索,语法为[CASE [col_name] WHEN [value1]]:2.用作搜索函数,语法为[CASE WHEN [expr] THEN [ ...

  3. mysql case when 去重_【Mysql】 case ... when ... 用法

    mysql case when用法 SELECT CASE WHEN `categoryid` =1THEN '参赛队员'ELSE '指导老师'END FROM `blog_article` WHER ...

  4. mysql数据库中case when 的用法

    场景1:比如说我们在数据库存了性别的字段,一般都是存0 和 1 代表男和女   然后我们会得到0和1之后在java中判断 ,很麻烦有么有?其实我们完全可以在sql中判断好之后拿来现成的.就是在sql中 ...

  5. mysql CASE WHEN的基础和多种用法

    CASE 计算条件列表并返回多个可能结果表达式之一. CASE 具有两种格式: 简单 CASE 函数将某个表达式与一组简单表达式进行比较以确定结果. CASE 搜索函数计算一组布尔表达式以确定结果.  ...

  6. mysql case快捷方法_MySQL case when使用方法实例解析

    首先我们创建数据库表: CREATE TABLE `t_demo` ( `id` int(32) NOT NULL, `name` varchar(255) DEFAULT NULL, `age` i ...

  7. MySQL中Left Join用法

    MySQL中Left Join用法  例子:  user表:  id name  ---------  1 libk  2 zyfon  3 daodao  user_action表:  user_i ...

  8. mysql sql decode函数用法_Sql decode sign when length concat 用法详述

    案例1:查询表A数据,如果某个列(PARAM_VALUE)值太长,前台不好显示,就只取前20个字符:鼠标悬浮时再用层显示全部值: sql写法: select m.PARAM_VALUE as PARA ...

  9. mysql中change用法,mysql 中alter的用法以及一些步骤

    mysql 中alter的用法以及一些方法 在用到alter的时间,查到了这个文章,就copy下来了,详细进入下面链接: MySQL之alter语句用法总结 1:删除列 ALTER TABLE [表名 ...

最新文章

  1. Linux内核移植之三:内核配置选项
  2. cpu spectre 幽灵 漏洞 突破内存独立性限制 简介
  3. 中文字符串提交乱码的解决方法
  4. 每天最少编码1000行
  5. 2022-01-06
  6. Spring EL运算符实例
  7. python如何为饼图添加标题_python – Matplotlib子图标题,图标题格式
  8. java sleep和wait区别
  9. Win32API不规则窗口制作
  10. Mysql CMAKE编译参数详解
  11. 数据平面可编程与SDN关系理解,以及数据平面可编程的理解
  12. c语言取反运算详细步骤,C语言取反运算~
  13. python 正则表达式语法大全_Python正则表达式知识汇总
  14. C++ primer 5th 习题之10.13
  15. 神通数据库导出sql脚本
  16. 游戏制作之路(48)地形纹理工具
  17. 选手投票html,选手投票网页制作
  18. invalid combination of type specifiers 解决方法
  19. 文王八卦圖와 易經組織
  20. 21张手机壁纸,送给我爱的你们~

热门文章

  1. 第四章--背景图像效果
  2. 我离职后面试收割小米等大厂offer,成功定级腾讯T3-2
  3. 直角坐标积分化为极坐标积分_直角坐标下的二重积分如何转化为极坐标下的二重积分...
  4. 测试开发成长学习路线
  5. CyberVein恭祝大家新年快乐,牛年大吉!
  6. nexus离线私服maven-metadata.xml缺失导致jar包拉取失败
  7. 从网页小白走向网页设计师的经历
  8. 前端请求后台网址,状态码401 Unauthorized 返回的code500 不知道怎么解决了 救救
  9. python网站设计开题报告_网页设计开题报告范文
  10. php网站开发开题报告,基于PHP的网上租车租赁网站设计与实现开题报告