很简单 你的写法第一种 不加max的时候
执行SQL为:SELECT `姓名`, CASE `课程` WHEN '语文' THEN `分数` ELSE 0 END '语文',
CASE `课程` WHEN '数学' THEN `分数` ELSE 0 END '数学',
CASE `课程` WHEN '物理' THEN `分数` ELSE 0 END '物理' FROM TB GROUP BY `姓名`;
那么在不分组之前SQL为:SELECT `姓名`, CASE `课程` WHEN '语文' THEN `分数` ELSE 0 END '语文',
CASE `课程` WHEN '数学' THEN `分数` ELSE 0 END '数学',
CASE `课程` WHEN '物理' THEN `分数` ELSE 0 END '物理' FROM TB;
那么不分组数据为:
然后group by `姓名`;
执行group by `姓名`时因为没有任何聚合函数, 那么会从基表里取group by后字段的第一条数据。即:
也就是你第一条SQL执行的结果:
OK。 我们再来说说第二个SQL。
第二个sql为:SELECT `姓名`, MAX(CASE `课程` WHEN '语文' THEN `分数` ELSE 0 END) '语文',
MAX(CASE `课程` WHEN '数学' THEN `分数` ELSE 0 END) '数学',
MAX(CASE `课程` WHEN '物理' THEN `分数` ELSE 0 END) '物理' FROM TB GROUP BY `姓名`;
先分解下SQL,执行MAX内CASE WHEN 及未GROUP BY `姓名`时SQL:SELECT `姓名`, CASE `课程` WHEN '语文' THEN `分数` ELSE 0 END '语文',
CASE `课程` WHEN '数学' THEN `分数` ELSE 0 END '数学',
CASE `课程` WHEN '物理' THEN `分数` ELSE 0 END '物理' FROM TB;
得到结果为:
这个结果其实和第一个SQL一样。
我们看看第二个SQL:SELECT `姓名`, MAX(CASE `课程` WHEN '语文' THEN `分数` ELSE 0 END) '语文',
MAX(CASE `课程` WHEN '数学' THEN `分数` ELSE 0 END) '数学',
MAX(CASE `课程` WHEN '物理' THEN `分数` ELSE 0 END) '物理' FROM TB GROUP BY `姓名`;
第二个SQL对分数进行了MAX函数操作同时又对`姓名`进行了分组。
那么这个基表max()中因为case when `课程` 取最大分数,再对`姓名`进行分组。
自然是取了每个姓名下每个学科的最高成绩。即: