博客
关于我
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/

    你可能感兴趣的文章
    Python3 - 在字符串格式化程序参数中使用变量
    查看>>
    Python3 A*寻路算法实现
    查看>>
    python3 grpc安装
    查看>>
    python3 mysql 封装多表_python3 mysql-多表查询
    查看>>
    python3 mysql8_Python MySQL8.0 错误:authentication plugin 'calling_sha2_password' is not supported....
    查看>>
    Python关键代码总览!从Zero到Hero必看的考点
    查看>>
    python3 robotframework+pycharm框架搭建
    查看>>
    Python3 shutil模块
    查看>>
    Python关于strftime函数详细解析 附实战代码
    查看>>
    Python3 tutorial day3
    查看>>
    python3 week4
    查看>>
    Python3 创建数组
    查看>>
    python3 套接字异常(a byte-like object is required not str)
    查看>>
    python3 实现用户三次输入错误记录黑名单并对该用户登录锁定-day1
    查看>>
    python3 文本变图片
    查看>>
    Python3 查看 com 组件的属性
    查看>>
    python3 案例分享--发邮件
    查看>>
    python3 模板库_Python3 标准库概览_Python教程_我爱模板网 - 提供下载各种免费建站资源,免费网站模板,免费网页特效,让你爱上建站!...
    查看>>
    Python3 求最大/小值及索引值 Numpy
    查看>>
    python3+django使用celery执行某些任务失败的解决方案
    查看>>