最近遇到一个面试题,根据所给出的表信息,列出每位学生的各科成绩,要求输出格式:姓名、语文成绩、数学成绩、英语成绩
下面我们来看一下具体的写法和需要注意的地方:
这是我们需要用到的两个表:(具体内容或者字段信息,可以根据自己的想法去设计)
下面我们对以下几种sql语句的情况进行分析:
结合两张图我们可以很明显的看出结果不同,第一个sql语句中没有加max,而第二个加了max, 很容易看出第一个的结果是不对的
为什么会出现这种情况,我们来具体分析一下:
首先我们根据第一张图中的sql语句分析,我们执行的是分组后的数据,假设我们在不分组的情况下执行,则会出现下面的情况:
在此基础之上,我们再执行 group by 语句,因为没有聚合函数,则它将会取出基表group by后的第一条数据:(使用group by后为什么要用聚合函数我们可以参考这篇博客)
也就会出现我们第一次执行sql的数据结果:
好的,下面我们来看第二个sql语句,假设我们在不分组的情况下执行:
由前面一个的思想我们就很好的理解了为什么会出现这种情况,
如果不分组,则它会按照max聚合函数执行后取出最大的分数然后返回给我们第一行数据。
所以当我们的第二个sql语句对case when "课程 " then s_score分数进行了max()函数取出最大分数,同时又按照了s_name名字分组,自然而然就的得到了我们的正确答案: