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

    你可能感兴趣的文章
    OpenCV与AI深度学习 | 使用YOLO11实现区域内目标跟踪
    查看>>
    OpenCV与AI深度学习 | 使用YOLOv8做目标检测、实例分割和图像分类(包含实例操作代码)
    查看>>
    OpenCV与AI深度学习 | 使用单相机对已知物体进行3D位置估计
    查看>>
    OpenCV与AI深度学习 | 初学者指南 -- 什么是迁移学习?
    查看>>
    OpenCV与AI深度学习 | 十分钟掌握Pytorch搭建神经网络的流程
    查看>>
    OpenCV与AI深度学习 | 基于GAN的零缺陷样本产品表面缺陷检测
    查看>>
    OpenCV与AI深度学习 | 基于OpenCV和深度学习预测年龄和性别
    查看>>
    OpenCV与AI深度学习 | 基于OpenCV实现模糊检测 / 自动对焦
    查看>>
    OpenCV与AI深度学习 | 基于Python和OpenCV将图像转为ASCII艺术效果
    查看>>
    OpenCV与AI深度学习 | 基于PyTorch实现Faster RCNN目标检测
    查看>>
    OpenCV与AI深度学习 | 基于PyTorch语义分割实现洪水识别(数据集 + 源码)
    查看>>
    OpenCV与AI深度学习 | 基于YOLO11的车体部件检测与分割
    查看>>
    OpenCV与AI深度学习 | 基于YoloV11自定义数据集实现车辆事故检测(有源码,建议收藏!)
    查看>>
    OpenCV与AI深度学习 | 基于YOLOv8 + BotSORT实现球员和足球检测与跟踪 (步骤 + 源码)
    查看>>
    OpenCV与AI深度学习 | 基于YOLOv8实现高级目标检测和区域计数
    查看>>
    VS2003 Front Page Server Extension
    查看>>
    OpenCV与AI深度学习 | 基于YOLOv8的停车对齐检测
    查看>>
    OpenCV与AI深度学习 | 基于YoloV8的药丸/片剂类型识别
    查看>>
    OpenCV与AI深度学习 | 基于YOLO和EasyOCR从视频中识别车牌
    查看>>
    OpenCV与AI深度学习 | 基于图像处理的火焰检测算法(颜色+边缘)
    查看>>