最近正准备面试,所以本来不怎么熟悉的SQL语句迫切需要练习,学习一下

在此感谢 笨鸟先飞-天道酬勤 大佬的博客:https://blog.csdn.net/dehu_zhou/article/details/52881587

在题17:按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

SELECT a.*
,SUM(CASE WHEN b.Cid='01' THEN b.score ELSE 0 END) AS s01
,SUM(CASE WHEN b.Cid='02' THEN b.score ELSE 0 END) AS s02
,SUM(CASE WHEN b.Cid='03' THEN b.score ELSE 0 END) AS s03
,AVG(ifnull(b.score,0)) as avs
FROM Student a
LEFT JOIN SC b
ON a.Sid=b.Sid
GROUP BY 1,2,3,4
ORDER BY avs DESC ;

最终的结果如下:

在这里感觉到了疑惑,为啥07的平均成绩没有计算s01这个值呢,导致最终结果与我想的不符(按3取平均值)

百思不得其解

后来感谢群内大佬的解答

原因在于:

  AVG()函数统计的是表中的数据,对于SC表而言,需要计算的score值只有2个,所以即便在后续的join语句中,产生了null值,并置为0.在这里也是按SC表中的2个数值计算,而非3个数值;

解决办法:

  方法1:再套一层查询,将结果作为临时表,对临时表字段进行统计

select t.*, round((s01+s02+s03)/3,2) as avs from (
SELECT a.*
,SUM(CASE WHEN b.Cid='01' THEN b.score ELSE 0 END) AS s01
,SUM(CASE WHEN b.Cid='02' THEN b.score ELSE 0 END) AS s02
,SUM(CASE WHEN b.Cid='03' THEN b.score ELSE 0 END) AS s03
FROM Student a
LEFT JOIN SC b
ON a.Sid=b.Sid
GROUP BY 1,2,3,4
) t ORDER BY avs desc;

  返回结果:

  方法2:根据课程表,补全课程信息

select * from Student t
LEFT JOIN (
select a.Sid
,max(case when a.Cid='01' THEN a.score ELSE 0 END) as s01
,max(case when a.Cid='02' THEN a.score ELSE 0 END) as s02
,max(case when a.Cid='03' THEN a.score ELSE 0 END) as s03
,round(avg(case when a.score is null then 0 else a.score end),2) as avs
from SC a group BY a.Sid ) t1
on t.Sid = t1.Sid
;

  返回结果:

MySQL--关于MySQL练习过程中遇到的AVG()函数处理空值的问题的更多相关文章

  1. MySQL 5.7 安装过程中遇到的坑

    在安装的过程中遇到了几个坑,特地记录下来.启动的时候会有有个错误: 大意为mysql退出且更新不了pid文件. 查看error.log,如图: 大意为ibdtata1文件不够,初始化的时候页数太大.初 ...

  2. MySQL安装与使用过程中的相关问题

    数据库远程连接拒绝访问解决办法: 1. 改表法.可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql&q ...

  3. mysql 5.7安装过程中,初始化的问题

    初始化不指定参数文件,如使用以下命令初始化: ./mysqld --initialize --user=mysql --basedir=/data/mysql/barry_mysql --datadi ...

  4. 阿里云RDS for MySQL备份文件+binlog恢复过程中碰到的一些问题

    1.一开始通过官方下载有的压缩包安装,碰到各种依赖问题,最后采用YUM安装 1.通过yum安装percona-Xtrabackup 1.1 先安装依赖: yum install perl-DBI yu ...

  5. Mysql: Connect/C++ 使用过程中发现返回 std::string 造成的内存泄露

    在使用 Connect/C++ ,测试时发现在调用 getString 出现了内存增长的情况. ConstructOutput(); //打印出当前内存 ;i<;++i) { prepareSt ...

  6. lua解析脚本过程中的关键数据结构介绍

    在这一篇文章中我先来介绍一下lua解析一个脚本文件时要用到的一些关键的数据结构,为将来的一系列代码分析打下一个良好的基础.在整个过程中,比较重要的几个源码文件分别是:llex.h,lparse.h.l ...

  7. DFU工作过程中USB机制

    在一级bootloader执行进入USB启动方式之后,设备进行枚举.枚举过程中会通过PC端发送命令对连接的USB设备进行枚举.当枚举成功之后,在PC端可以看到设备的盘符. 当设备能够被PC正确识别之后 ...

  8. react使用过程中常见问题

    目录 一.减小输入字符数 二.用props.children来引用位于前置标签和后置标签之间的内容 三.创建组件两条主要的途径 四.JSX属性采用驼峰式的大小写规则(即‘onClick’而非‘oncl ...

  9. <转>lua解析脚本过程中的关键数据结构介绍

    在这一篇文章中我先来介绍一下lua解析一个脚本文件时要用到的一些关键的数据结构,为将来的一系列代码分析打下一个良好的基础.在整个过程中,比较重要的几个源码文件分别是:llex.h,lparse.h.l ...

随机推荐

  1. python3.6调用c语言动态编译文件 c语言编译可执行文件和动态编译等

    1.c的代码 dfunc.c #include<stdio.h> int dgfunc(int n) { ){ ; }else{ )+dgfunc(n-); } } 2.动态编译 cmd ...

  2. 【CUDA开发】Thrust库

    Thrust库从C++的STL中得到灵感,将最简单的类似于STL的结构放在Thrust库中,比如STL中的vector.此外,Thrust库还包含STL中的算法和迭代器.        Thrust函 ...

  3. java 给不同成绩分等级

    题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. 程序分析:(a>b)?a:b这是条件运算符的基本例子. pack ...

  4. [转帖]rpm包和deb分别是什么?

    https://www.cnblogs.com/hanfanfan/p/9133789.html 需要不停的学习才可以. 一.RMP 是 LINUX 下的一种软件的可执行程序,你只要安装它就可以了.这 ...

  5. MySql在win10上的安装(压缩版)

    一.下载: 二.下载zip版,免安装版的. 三.解压缩后,注意:文件夹名称不能包含[空格] C:\MySQL 四.增加环境变量 五.手动在安装目录  C:\MySQL 下新建一个my.ini写入以下内 ...

  6. Maven设置阿里仓库镜像增加访问速度

    修改maven的setting.xml 在mirrors节点下面添加子节点 <mirror> <id>nexus-aliyun</id> <mirrorOf& ...

  7. Select2的远程数据操作

    一.概述 如果下拉列表框中的内容太多,最好是使用Select2的远程数据进行筛选. 二.参考文献 https://select2.github.io/examples.html#data-ajax h ...

  8. 关于Android studio调用高德地图的简单流程和要点

    一,账号与Key的申请 注册成为高德开发者需要分三步: 第一步,注册高德开发者:第二步,去控制台创建应用:第三步,获取Key. 前2步都比较简单,这里说下第三步. 获取Key 1.进入控制台,创建一个 ...

  9. 导出excel模版

    方法一: public void ToExcel(){ //第一步:获取模版物理路径 string file_1 = Server.MapPath("/Content/Excel/downE ...

  10. linux查看端口被占用情况

    Linux 查看端口占用情况可以使用 lsof 和 netstat 命令. 如果linux中没有这两个命令,则yum安装一下 yum install -y lsof yum install -y ne ...