首先创建一个学生表student,表结构如下:
CREATE TABLE student (
id int NOT NULL,
name varchar(50) NULL DEFAULT NULL COMMENT '姓名',
subject varchar(50) NULL COMMENT '学科',
score int NULL DEFAULT 0 COMMENT '成绩',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB
插入测试数据:

测试数据
如果现在想得到这样的查询结果:
name 语文 数学 英语
张三 70 91 82
李四 89 86 53
王五 77 65 62
陈六 68 92 70
首先我们想到用case when then这种方式,很容易写出这样的结果:
SELECT name,
CASE subject WHEN '语文' THEN score ELSE 0 END AS '语文',
CASE subject WHEN '数学' THEN score ELSE 0 END AS '数学',
CASE subject WHEN '英语' THEN score ELSE 0 END AS '英语'
FROM student;
看看这样会有什么样的执行效果:

查询结果
接下来可以根据name进行分组再进行sum求和:
SELECT name,
sum(CASE subject WHEN '语文' THEN score ELSE 0 END) AS '语文',
sum(CASE subject WHEN '数学' THEN score ELSE 0 END) AS '数学',
sum(CASE subject WHEN '英语' THEN score ELSE 0 END) AS '英语'
FROM student GROUP BY name;
测试结果如下:

最终测试结果
也可以再加上总分:
SELECT name,
sum(CASE subject WHEN '语文' THEN score ELSE 0 END) AS '语文',
sum(CASE subject WHEN '数学' THEN score ELSE 0 END) AS '数学',
sum(CASE subject WHEN '英语' THEN score ELSE 0 END) AS '英语',
sum(score) as 总分
FROM student GROUP BY name ORDER BY '总分' DESC;
测试结果却并不如我们预料是排好序的:

总分
把总分写成英文后排序又正常,日常f**k,改成英文后是正常的。

英文降序排序
后面又重复试了自己坑自己,'总分'是用单引号的,应该把引号去掉或者用 `总分`就可以了。

最终测试结果