博客
关于我
MySQL数据库入门(十)多表复杂查询练习及讲解-下
阅读量:724 次
发布时间:2019-03-16

本文共 1793 字,大约阅读时间需要 5 分钟。

第十五题要求我们按所有课程的平均成绩由高到低排列,输出学号、姓名、课程数、平均分以及各科成绩。以下是优化后的解决方案,考虑了代码的简化和性能优化。

方案步骤如下:

步骤一:计算每个学生的总成绩和课程数

首先,我们需要准备基础数据:每个学生的总成绩和课程数。总成绩可以通过对score表中num字段求和得到,课程数则从course表中统计。

# 步骤一:计算每个学生的总成绩和课程数with base_data as (    select         student_id 学号,        sum(num) 总成绩,        count(*) 课程数    from score    group by student_id)

步骤二:计算平均分

然后,对每个学生的总成绩除以课程数得到平均分。

# 步骤二:计算平均分with avg_data as (    select         bd.*,        avg(总成绩 / 课程数) 平均分    from base_data bd    group by student_id)

步骤三:按平均分排序

接下来,我们按平均分降序排列学生数据。

# 步骤三:按平均分排序select     student_id 学号,    sname 姓名,    课程数,    平均分,    round(平均分,1) 平均分保留一位小数from avg_dataorder by 平均分 desc;

步骤四:获取各科成绩

为了得到每个学生的各科成绩,可以使用JOIN操作,连接score和course表:

# 步骤四:获取各科成绩select     s student_id,    group_concat(cs.cname,':',s.num order by cs.course_id) 各科成绩from score sjoin course cs on s.course_id = cs.course_idgroup by s.student_id;

整合解决方案

将以上各步骤整合为一个完整的查询:

with base_data as (    select         student_id 学号,        sum(num) 总成绩,        count(*) 课程数    from score    group by student_id),avg_data as (    select         bd.*,        avg(总成绩 / 课程数) 平均分    from base_data bd    group by student_id)select     a.学生_id 学号,    a.姓名,    课程数,    avg_data.平均分 平均分,    round(avg_data.平均分,1) 平均分保留一位小数,    group_concat(cname,':',num order by course_id) 各科成绩from avg_data aleft join (    select         student_id 学号,        group_concat(cname,':',num order by course_id) 各科成绩    from score s    join course cs on s.course_id = cs.course_id    group by student_id) bon a.学生_id = b.学生_idorder by 平均分 desc;

优化说明:

  • 合并步骤:将原来的多个步骤合并为一个查询,减少了数据库执行的次数。
  • 使用CTE:通过CTE(共同表表达式)分别处理基础数据和平均分计算,提高了查询的可读性。
  • 切分处理:将各科成绩处理放在一个独立的子查询中,避免了对主查询的笠重化,提升了性能。
  • 优化排序:在group_concat中增加了order by course_id,确保了各科成绩的展示顺序一致。
  • 分钟优化:使用round函数保留一位小数,避免不必要的精度问题。
  • 这种优化后的解决方案不仅简化了复杂查询的步骤,同时提升了执行效率,适合处理大量数据的场景。

    转载地址:http://ztrqz.baihongyu.com/

    你可能感兴趣的文章
    python在使用HTMLTestRunner时,报告为空,错误提示<_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf_8'>...
    查看>>
    python在gpu上运行_【python】python开启GPU加速
    查看>>
    Python在def函数中使用for循环
    查看>>
    Python在def函数中使用for循环
    查看>>
    Python在Conda环境中,但在Windows虚拟环境中没有激活
    查看>>
    python系列【仅供参考】:python pip 错误 ModuleNotFoundError: No module named pip._internal 解决办法
    查看>>
    python图像条状状噪声,使用PYTHON PIL从验证码图像中删除背景嘈杂的线条
    查看>>
    Python图像处理:从内存加载jpeg
    查看>>
    python固定后缀(名物化词汇)词频统计:抽取+统计+可视化
    查看>>
    python商品评论数据采集与分析可视化系统 Flask框架 requests爬虫 NLP情感分析 毕业设计 源码
    查看>>
    python商品数据分析可视化系统(带爬虫)京东销售数据分析 计算机毕业设计 源码下载
    查看>>
    python商品库存管理系统 django框架 商品网站 MySQL数据库 源码下载 计算机毕业设计
    查看>>
    Python哪个版本最稳定好用2023.10.19
    查看>>
    Python和黑客技术的渊源
    查看>>
    Python和RF编写接口自动化
    查看>>
    python和js哪个难_【Python】记一次学习,Python 与 js 在实现闭包时的差异
    查看>>
    python和java哪个更值得学——来自知乎高赞回答
    查看>>
    python命名空间更改_Python模块xml.etree.ElementTree自动修改xml命名空间键
    查看>>
    Python命名中尾随下划线有什么好处?
    查看>>
    Python启动脚本
    查看>>