Mysql AVG() 值 返回NULL而非空结果集
【1】select 查询返回一行NULL
先来模拟复现一下遇到的问题。
(1)源数据表grades,学生成绩表
(2)查询SQL语句
查询‘080601’班的各门课平均成绩
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)实际结果
(4)期望结果
如果没有满足条件的记录,期望返回无结果集,而不是有一行NULL结果集。
【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.
顺序 选择 循环 总结