Mysql AVG() 值 返回NULL而非空结果集

【1】select 查询返回一行NULL函数

先来模拟复现一下遇到的问题。spa

(1)源数据表grades,学生成绩表3d

(2)查询SQL语句code

查询‘080601’班的各门课平均成绩blog

SELECT sClass,
COUNT(*) AS total,
AVG(sChina) AS avg_china, 
AVG(sMath) AS avg_math, 
AVG(sEnglish) AS avg_english
FROM grades 
WHERE sClass = '080601';

(3)实际结果class

(4)指望结果bfc

若是没有知足条件的记录,指望返回无结果集,而不是有一行NULL结果集。select

【2】分析缘由循环

第一反应,当条件知足时,会不会有这行NULL呢?方法

请看这个SQL:

SELECT sClass,
COUNT(*) AS total,
AVG(sChina) AS avg_china, 
AVG(sMath) AS avg_math, 
AVG(sEnglish) AS avg_english
FROM grades 
WHERE sClass = '080605';

结果:

很明显,没有那么一行NULL值。

经分析:

若是所查询的表 或 where条件筛选后获得的结果集为空,那么聚合函数sum() 或 avg()的返回值为NULL;count()函数的返回值为0

验证一下,假如咱们不加这个avg函数呢?

请看这个SQL:

SELECT sClass,
COUNT(*) AS total
FROM grades 
WHERE sClass = '080601';

结果:

看来,只要有聚合函数,当where条件结果集为空时,应该都会生成这么一行NULL值记录项。

【3】解决方案

经查询,找到了一种处理方法:在Sql语句的最后加上GROUP BY NULL;

修改如上语句,例如:

SELECT sClass,
COUNT(*) AS total,
AVG(sChina) AS avg_china, 
AVG(sMath) AS avg_math, 
AVG(sEnglish) AS avg_english
FROM grades 
WHERE sClass = '080601'
GROUP BY NULL;

结果:

知足需求。好,很好,这样就会避免一个坑。

没有完,再想一想,假如where条件知足筛选出结果集,那么加GROUP BY NULL会有什么“隐患”吗?

请看验证过程SQL语句:

SELECT sClass,
COUNT(*) AS total,
AVG(sChina) AS avg_china, 
AVG(sMath) AS avg_math, 
AVG(sEnglish) AS avg_english
FROM grades 
WHERE sClass = '080604';
GROUP BY NULL;

实际结果:

看起来,貌似没有其余隐患。

暂且如上。

 

 

Good Good Study, Day Day Up.

顺序  选择  循环 总结

相关文章
相关标签/搜索