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;
结果集为: