博客
关于我
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基础——构造方法和特殊成员方法
    查看>>
    Python基础——多线程值从Thread类继承
    查看>>
    Python基础——多线程之信号量
    查看>>
    Python基础——_thread多线程
    查看>>
    Python基础——Thread类与线程对象
    查看>>
    Python基础——Thread创建管理多线程
    查看>>
    Python基础——SQLite数据库基本操作
    查看>>
    Python基础——MySQL数据库基本操作
    查看>>
    Python基础_列表 list
    查看>>
    python系列【仅供参考】:python异步库调用gevent和asyncio对比
    查看>>
    python基础3
    查看>>
    Python基础08 面向对象的基本概念
    查看>>
    python系列【仅供参考】:python二进制转10进制
    查看>>
    Python基础-函数篇
    查看>>
    python基础---->常用模块
    查看>>
    Python基础(2):控制结构
    查看>>
    Python基础 | 关于“循环”那些事
    查看>>
    python系列【仅供参考】:python之subprocess模块rsync拉取文件
    查看>>
    python系列【仅供参考】:python 远程rdp
    查看>>
    python基础
    查看>>