zoukankan      html  css  js  c++  java
  • 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.

    顺序  选择  循环 总结

  • 相关阅读:
    unity中制作模拟第一人称视角下的指南针
    unity3D 中的C#脚本一个类调用另一类中简单方法
    unity中UI的屏幕自适应代码
    unity中导入插件时报错处理办法
    Unity3D在C#编程中的一些命名空间的引用及说明
    Unity中物体碰撞后去掉相互之间的反弹力
    unity3D打包发布Apk详细步骤
    unity3D开发的程序发布到Android平台上进行运行测试的详细步骤
    JAVA的环境变量配置(方式二)
    Java中的 JDK下载和环境配置(方式一)
  • 原文地址:https://www.cnblogs.com/Braveliu/p/10771358.html
Copyright © 2011-2022 走看看