MySQL行列转换,理解 case when then else end as的用法

MySQL数据库是行引擎,一行一行的往下搜索,搜索匹配也是一行一行进行匹配,返回符合的结果。

SELECT student1.number AS '学号'
,student1.`NAME` AS '姓名'
,classes1.`NAME` AS '班级'
,course.`name` AS '课程'
,score.score AS '分数'
FROM score INNER JOIN student1 ON score.student_id=student1.id
INNER JOIN course ON score.course_id=course.id
INNER JOIN classes1 ON classes1.id=student1.classes_id

 返回结果是多行展示:

若我们想以一行展示出某一个同学的全部成绩,如学号为9982的同学,需4行来展示他的全部成绩,我们用 case when then else end as 来以一行展示该同学的全部成绩信息,进行MySQL的行列转换。

一、简单的case用法 

1、一列里面进行一次匹配

准备工作:

SELECT * FROM score

查询course_id=1的student_id和score,并且另命名为Java

SELECT score.student_id 
,CASE course_id WHEN 1 THEN score.score ELSE 0 END AS 'java'
FROM score

执行过程:

1、进行匹配的course_id,匹配第一行,course_id是等于1的,所以返回score也就是71;

2、匹配第二行,course_id等于3,不匹配,所以返回else也就是0;

3、匹配第三行,course_id等于5,不匹配,所以返回else也就是0;

4、匹配第四行,course_id等于6,不匹配,所以返回else也就是0;

5、匹配第五行,course_id等于1,匹配,所以返回core也就是33;

......

所以结果集为:

2、一列里面进行多次匹配

查询course_id从1-6的student_id和score,并且分别另命名为Java、中国传统文化、计算机原理、语文、高阶数学、英文。

SELECT score.student_id 
,CASE course_id WHEN 1 THEN score.score ELSE 0 END AS 'java'
,CASE course_id WHEN 2 THEN score.score ELSE 0 END AS '中国传统文化'
,CASE course_id WHEN 3 THEN score.score ELSE 0 END AS '计算机原理'
,CASE course_id WHEN 4 THEN score.score ELSE 0 END AS '语文'
,CASE course_id WHEN 5 THEN score.score ELSE 0 END AS '高阶数学'
,CASE course_id WHEN 6 THEN score.score ELSE 0 END AS '英文'
FROM score

执行过程:

1、进行匹配的course_id,匹配第一行,course_id是等于1的,执行第一个case语句,所以返回score也就是71;

2、匹配第二行,course_id等于3,执行第三个case 语句,所以返回score也就是99;

3、匹配第三行,course_id等于5,执行第五个case 语句,所以返回score也就是33;

4、匹配第四行,course_id等于6,执行第六个case 语句,所以返回score也就是98;

5、匹配第五行,course_id等于1,执行第一个case 语句,所以返回score也就是33;

......

所以结果集为:

 二、优化

1、多行合并

由上图结果集显示可知,student_id是1的同学共显示了4行,每行只有一个课程有成绩,其他均为0。student_id=1,Java列只有一个成绩71,其他均为0,选择合并多行可以考虑sum()函数,以group by student_id来分组,对student_id=1,Java列相加,可知结果也为71,不影响其结果。

SELECT score.student_id 
,SUM(CASE course_id WHEN 1 THEN score.score ELSE 0 END) AS 'java'
,SUM(CASE course_id WHEN 2 THEN score.score ELSE 0 END) AS '中国传统文化'
,SUM(CASE course_id WHEN 3 THEN score.score ELSE 0 END) AS '计算机原理'
,SUM(CASE course_id WHEN 4 THEN score.score ELSE 0 END) AS '语文'
,SUM(CASE course_id WHEN 5 THEN score.score ELSE 0 END) AS '高阶数学'
,SUM(CASE course_id WHEN 6 THEN score.score ELSE 0 END) AS '英文'
FROM score
GROUP BY student_id;

结果集为:

 2、多表关联

student1(name,number,qq_mail,classes_id)
course(id,name)
score(id,score,student_id,course_id)
classes1(id,name,`desc')

查询学生学号student1.number,姓名student1.name,班级classes1.name,课程course.name,成绩score.score。已student1.name为分组查询条件,student1.number降序排列查询结果。

内连接
语法1:select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件
语法2:select 字段 from 表1,表2 where 连接条件 and 其他条件

联合查询详细语法使用可看上一篇文章MySQL联合查询1

SELECT student1.number AS '学号'
,student1.`NAME` AS '姓名'
,classes1.`NAME` AS '班级',
SUM(CASE course.`name` WHEN '高阶数学' THEN score.score ELSE 0 END) AS '高阶数学',
SUM(CASE course.`name` WHEN '计算机原理' THEN score.score ELSE 0 END) AS '计算机原理',
SUM(CASE course.`name` WHEN 'Java' THEN score.score ELSE 0 END) AS 'Java',
SUM(CASE course.`name` WHEN '英文' THEN score.score ELSE 0 END) AS '英文',
SUM(CASE course.`name` WHEN '语文' THEN score.score ELSE 0 END) AS '语文',
SUM(CASE course.`name` WHEN '中国传统文化' THEN score.score ELSE 0 END) AS '中国传统文化'
,SUM(score.score) AS '总分'
FROM score INNER JOIN student1 ON score.student_id=student1.id
INNER JOIN course ON score.course_id=course.id
INNER JOIN classes1 ON classes1.id=student1.classes_id
GROUP BY student1.`NAME`
ORDER BY student1.number DESC;

结果集为:

猜你喜欢

转载自blog.csdn.net/m0_72084056/article/details/126007613