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

    你可能感兴趣的文章
    oracle partition by list,深入解析partition-list 分区
    查看>>
    Oracle PL/SQL Dev工具(破解版)被植入勒索病毒的安全预警及自查通告
    查看>>
    oracle pl/sql 导出用户表结构
    查看>>
    Oracle PLSQL Demo - 17.游标查询个别字段(非整表)
    查看>>
    【C/C++学院】(6)构造函数/析构函数/拷贝构造函数/深copy浅copy
    查看>>
    oracle rac 安装 PRVG-13606 ntp 同步报错解决过程
    查看>>
    Oracle RAC性能调整的方案
    查看>>
    oracle rac集群的东西之QQ聊天
    查看>>
    UML— 用例图
    查看>>
    Oracle Schema Objects——Tables——Table Compression
    查看>>
    oracle scott趣事
    查看>>
    oracle script
    查看>>
    Oracle select表要带双引号的原因
    查看>>
    Oracle SOA Suit Adapter
    查看>>
    Oracle Spatial GeoRaster 金字塔栅格存储
    查看>>
    Oracle spatial 周边查询SQL
    查看>>
    Oracle Spatial空间数据库建立
    查看>>
    UML— 活动图
    查看>>
    oracle sqlplus已停止工作,安装完成客户端后sqlplus报“段错误”
    查看>>
    oracle SQLserver 函数
    查看>>