有成绩表如下,表名称是sc,字段s_id是学生编号,c_id是课程编号,score是课程成绩:
image.png
问题:求每位同学的平均成绩
首先理解题意,分以下几步:
根据题意,可以想一下预期的结果是怎样的,应该有几个字段,有几条记录。本题应该有2个字段:学生编号、平均成绩,有7条记录(截图中s_id有七个非重复值);
预期的结果有7条记录,而源数据有18条记录,由多条变一条的过程是聚合,需要写聚合函数,而由多条变成比较少记录的过程是分组聚合,需要使用group by语句;
需要分组,那group by后面应该跟哪个字段,可以看下预期结果的字段里面,哪个是主键(非空不重复的字段),哪个就是分组字段。学生编号、平均成绩两个字段中,学生编号是主键,所以学生编号就是分组字段;
输出的字段写在select语句,from后面跟上表的名称,where后面跟筛选条件(没有可不写),group by 后面跟分组字段,所以这道题的写法如下:
select s_id,avg(score) as 平均成绩 from sc group by s_id;
分组聚合的过程是怎样的?
1.首先是分组,分组字段是s_id,把s_id一样的数据分到一个组,根据s_id把sc表分成七份,效果如下:
image.png
2.其次是聚合,聚合是由多变一的过程,就是每一个组变成一条记录,有聚合的取聚合的结果,没有聚合的取每个组的第一条记录,avg(score) 取每个组的成绩的平均成绩(avg是平均函数,属于聚合函数),s_id没有聚合,就取每个组的第一条记录,又因为每个组的s_id都一样,所以取一个是合理的。过程如下:
image.png