Group BY 子句
GROUP BY子句指示MySQL分组数据,然后对每个组而不是整个结果集进行聚集。
需求:有成绩表如下,表名称是sc,字段s_id是学生编号,c_id是课程编号,score是课程成绩 ;求每位同学的平均成绩
语句:SELECT s_id,avg(score) FROM sc GROUP BY s_id ;
由多条变一条的过程是聚合,需要写聚合函数,而由多条变成比较少记录的过程是分组聚合,需要使用group by语句;
说明 : GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。
having 语句-过滤分组
having语句是分组后过滤的条件,在group by之后使用,也就是如果要用having语句,必须要先有group by语句。
group by的功能是分组聚合,将多条记录变成比较少的记录,而having的功能是由多变少之后,再变少的过程。另外having后面可以跟多种运算形式,但是运算的结果只能是一个逻辑值(0或者非0的数值)。
需求求平均成绩>=60分的学生编号及平均成绩
分析:
整体思路如下:
1.看是否有条件,如果条件是从数据库获取数据时的筛选条件,应该用where语句;如果是分组聚合之后的条件,应该用having语句。本题的条件是平均成绩>=60,平均成绩是聚合的结果,应属于聚合后的条件,应该使用having语句;
2.先不考虑having语句,将分组聚合语句写出:select s_id,avg(score) 平均成绩 from sc group by s_id;
3.将过滤条件加在group by后面,完整语句:select s_id,avg(score) 平均成绩 from sc group by s_id having avg(score)>=60;
数据运算的过程如下:
1.根据s_id,把数据分成7各组,2.根据having后面的条件,判断每个组是否满足,3.满足的组输出指定字段,不满足的组不输出。
SELECT子句顺序
声明:参考以下博文
https://zhuanlan.zhihu.com/p/106767752
https://zhuanlan.zhihu.com/p/107495600
如有侵权,请联系我删除