最近正准备面试,所以本来不怎么熟悉的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. [爬虫] requests库

    requests库的7个常用方法 requests.request() 构造一个请求,支撑以下各种方法的基础方法 requests.get() 获取HTML网页的主要方法,对应于HTTP的GET re ...

  2. [转帖]docker-compose

    docker-compose https://www.cnblogs.com/embedded-linux/p/10714179.html 需要学习使用一下. 改天自己再改改用过的yaml文件.   ...

  3. [转帖]国产CPU性能最全盘点 宜良性竞争优胜劣汰

    国产CPU性能最全盘点 宜良性竞争优胜劣汰 电子工程专辑的网站内容 其实里面说的不尽全面 比如龙芯和申威就放到一块了 一个是 MIPS 一个是Alpha 明显不一样的东西 x86的应该都不行 而且. ...

  4. 什么是云服务器ECS

    云服务器(Elastic Compute Service,简称ECS)是阿里云提供的性能卓越.稳定可靠.弹性扩展的IaaS(Infrastructure as a Service)级别云计算服务.云服 ...

  5. 设计模式在 Spring 框架中的良好应用

    在开始正文之前,请你先思考几个问题: 你项目中有使用哪些 GOF 设计模式 说一说 GOF 23 种设计模式的设计理念 说说 Spring 框架中如何实现设计模式 假设我是面试官问起了你这些面试题,你 ...

  6. JavaScript处理股票数据

    1, 先使用Ajax发送异步请求到:http://hq.sinajs.cn/list=s_sh000001 2, 然后用[,]切割成数组https://www.w3school.com.cn/js/j ...

  7. Redis学习笔记(一)Windows下redis的安装和启动

    在Windows上安装redis 下载地址:https://github.com/microsoftarchive/redis/releases 选择图中红框标出来的下载,解压到磁盘上,文件夹命名为r ...

  8. java程序中访问https时,报 PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

    在java中使用https访问数据时报异常: Caused by: sun.security.validator.ValidatorException: PKIX path building fail ...

  9. MySQL性能优化(四):SQL优化

    原文:MySQL性能优化(四):SQL优化 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/ ...

  10. sql server lower函数

    lower()函数 --将大写字符数据转换为小写字符数据 语法:lower(character_expression) --character_expression是指定要进行转换的字符串