• 练习26-30:多表关联查询,子查询


    四张表信息

    在这里插入图片描述

    26. 查询平均成绩大于等于85的所有学生的学号,姓名和平均成绩

    第一步:锁定表为学生表和成绩表
    第二步:查出平均成绩大于等于85的学生

     SELECT 
     sid,
     AVG(score) AS avg_score
     FROM sc
     GROUP BY sid
     HAVING avg_score >= 85;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    第三步:关联学生表,获取到学生的学号和姓名,然后从结果中选出想要的字段

     SELECT
     a.sid,b.`Sname`,a.avg_score
     FROM(
     SELECT 
     sid,
     AVG(score) AS avg_score
     FROM sc
     GROUP BY sid
     HAVING avg_score >= 85) a
     LEFT JOIN student b
     ON a.sid = b.sid;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    27. 查询课程名称为【数学】,且分数低于60的学生姓名和分数

    第一步:锁定表,学生表、成绩表、课程表
    第二步:从课程表查出【数学】的课程编号

     SELECT * FROM course WHERE course.`Cname` = '数学';
    
    • 1

    在这里插入图片描述

    第三步:关联成绩表,查询【数学】分数低于60分的学生

    SELECT
     *
     FROM (SELECT * FROM course WHERE course.`Cname` = '数学' ) a
    JOIN sc b ON a.cid = b.cid;
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    第四步:关联学生表,获取学生的姓名,并过滤掉成绩低于60分的

    SELECT
     *
     FROM (SELECT * FROM course WHERE course.`Cname` = '数学' ) a
    JOIN sc b ON a.cid = b.cid
    JOIN student c ON b.sid = c.sid
    WHERE b.`score` < 60;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    第五步:筛选出需要的字段

    SELECT
     c.sid,
     c.sname,
     a.cname,
     b.score
     FROM (SELECT * FROM course WHERE course.`Cname` = '数学' ) a
    JOIN sc b ON a.cid = b.cid
    JOIN student c ON b.sid = c.sid
    WHERE b.`score` < 60;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    28. 查询所有学生的课程及分数情况(存在学生没有成绩,没选课的情况)

    第一步:锁定表,学生表,成绩表
    第二步:学生表左连接成绩表(因为学生表中的所有记录都需要出现在结果中)

     SELECT 
     a.*,
     b.score
     FROM student a
     LEFT JOIN sc b
     ON a.sid = b.sid;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    29. 查询课程成绩在70分以上的姓名、课程名称和分数

    第一步:锁定表,成绩表、学生表、课程表
    第二步:从成绩表筛选出所有成绩大于70的记录

     SELECT * FROM sc WHERE score > 70;
    
    • 1

    在这里插入图片描述

    第三步:关联学生表,获取学生的姓名,关联课程表,获取课程的名称,然后选出想要的字段

     SELECT 
     b.sname,
     c.cname,
     a.score
     FROM (SELECT * FROM sc WHERE score > 70) a
     JOIN student b
     ON a.sid = b.sid
     JOIN course c
     ON a.cid = c.cid;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    30. 查询存在不及格的课程

    第一步:从成绩表中过滤出哪些记录的分数小于60分,然后去重获取到cid

     SELECT 
     DISTINCT cid
     FROM sc
     WHERE score < 60;
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    第二步:从课程表获取课程信息

    SELECT
     * 
     FROM course 
     WHERE cid IN (SELECT DISTINCT cid FROM sc WHERE score < 60);
     
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

  • 相关阅读:
    java电商系统怎么设计秒杀?
    61二次型—— 二次型的规范形
    Vue 之 解决v-html生成的元素不能触发@click等vue事件和CSS样式不生效的方法
    Java_反射(精心打磨详解)
    【C++】设计模式简介
    如何进入TB top排行榜查找热卖款的宝贝呢?
    许可分析 license分析 第十七章
    一份谷歌写给 CTO 们的报告 - DORA 2023 版全面解读
    隐私计算助力数据的安全流通与共享
    最长递增子序列
  • 原文地址:https://blog.csdn.net/YouMing_Li/article/details/126615115