mysql 分组前加条件语句_MySQL的group by语句、having语句使用实例

一、MySQL的group by语句

1、group by是将具有相同的进行分组,化成一块数据集合,之后配合聚合函数进行数据处理。比如:全校学生成绩表(学号,姓名,班级,成绩….),现在我需要将按照相同的班级进行分类,之后计算出每个班的最高的成绩。

(1)创建好student_score表

mysql 分组前加条件语句_MySQL的group by语句、having语句使用实例_第1张图片

(2)按照班级进行分类:以班级分类为主

按照班级分类:计算出每个班的最高的成绩。

select CLASS, SNAME from student_score group by CLASS, SNAME;

select CLASS, MAX(TOTAL_SCORES) AS TOP from student_score group by CLASS;

(3)结果为

mysql 分组前加条件语句_MySQL的group by语句、having语句使用实例_第2张图片

mysql 分组前加条件语句_MySQL的group by语句、having语句使用实例_第3张图片

2、group by需要注意的几点

group by语句通常配合聚合函数SUM、MAX、MIN等使用处理数据。 group by语句中使用的聚合函数处理数据是group by分组完毕之后聚合函数是对分组数据进行处理的,不是对整个表。比如group by之后一班的成绩有250、251、253、254。聚合函数MAX()是针对一班这四个数据计算的。并不是MAX()整个表。 select后面的查询字段要包含在group by后面的字段中。

mysql 分组前加条件语句_MySQL的group by语句、having语句使用实例_第4张图片

select后面的列要包含在group by后面的列中。

二、MySQL的having语句

1、having与where的区别

(1)where:

是作用在查询结果进行分组之前,过滤掉不符合条件的数据。 where中不能包含聚合函数。(注意是:where后面子句不能有聚合函数,而在含有where中可以使用聚合函数) 作用在group by和having字句前 是作用于对表与视图

(2)having:

是作用在查询结果分组之后,筛选满足条件的组,过滤掉数据。

通常跟聚合函数一起使用。

having子句在聚合后对组记录进行筛选。

是作用于分组

2、使用having例子

(1)计算出每个班级的总成绩

SELECT CLASS,SUM(TOTAL_SCORES) FROM student_score GROUP BY CLASS;

结果:

mysql 分组前加条件语句_MySQL的group by语句、having语句使用实例_第5张图片

(2)筛选出总成绩大于505的班级

ELECT CLASS,SUM(TOTAL_SCORES) FROM student_score GROUP BY CLASS HAVING SUM(TOTAL_SCORES)>505;

mysql 分组前加条件语句_MySQL的group by语句、having语句使用实例_第6张图片

这里用where SUM(TOTAL_SCORES)>505的话,将会出错,因为表中根本没有总成绩分数这项,这是分组之后才有的

3、使用having与where联立的例子

为了更好地理解

(1)更新student_score表,插入新数据

mysql 分组前加条件语句_MySQL的group by语句、having语句使用实例_第7张图片

(2)利用having与where联立查询

实例:查询班级中分数大于250的学生的总成绩大于531的班级有哪几个班。

执行顺序为:

开始 -> where行记录筛选 -> group by分组 -> 聚合函数(sum、max、min)计算 -> having分组筛选->结束

具体的如下:

- where筛选学生成绩大于250的所有学生。

- group by分组班级

- sum计算分组班级中学生的总分数

- having筛选总成绩大于531的班级

具体代码如下:

-- 1.WHERE筛选出分数大于250的学生

SELECT CLASS,SNAME,TOTAL_SCORES FROM student_score WHERE TOTAL_SCORES>250;

where针对的是全表,不是分组,所以CLASS并没有顺序。结果为:

mysql 分组前加条件语句_MySQL的group by语句、having语句使用实例_第8张图片

-- 2.where筛选之后group by分组class与sname

SELECT CLASS,SNAME,TOTAL_SCORES FROM student_score WHERE TOTAL_SCORES>250 GROUP BY CLASS,SNAME;

分组之后class有序“靠拢”,加入sname不让class合并

mysql 分组前加条件语句_MySQL的group by语句、having语句使用实例_第9张图片

-- 3.group by之后SUM计算处理数据

SELECT CLASS,SUM(TOTAL_SCORES) AS SUM_SCORE FROM student_score WHERE TOTAL_SCORES>250 GROUP BY CLASS;

sum计算出group by之后合并的班级每个班级的总分数。

mysql 分组前加条件语句_MySQL的group by语句、having语句使用实例_第10张图片

-- 4.SUM计算之后,having筛选总成绩大于531的分组

SELECT CLASS,SUM(TOTAL_SCORES) AS SUM_SCORE FROM student_score

WHERE TOTAL_SCORES>250

GROUP BY CLASS HAVING SUM(TOTAL_SCORES)>531;

having筛选分组数据:

db8cdfc1e40f08478394e2681b2e6589.png

你可能感兴趣的:(mysql,分组前加条件语句)