数分组团学习第二周

作者: Bouwun_Tsui | 来源:发表于2020-09-22 00:08 被阅读0次

        又到了一周的总结,这周过的十分的充实,无论是工作还是学习。工作上加班加成狗,学习上围绕这Mysql45题。
    这一次的文章po的不及时,主要是自己的时间安排有问题。临时的加班和参加同学的婚礼导致了。在此诚挚道歉。

    Mysql45

    在做45题前我还是老老实实的翻了下以前在学校的书,并且回顾了一下知识点(主要是连接)。

    sql 各种连接

    上图,此图特别鸣谢菜鸟教程独家赞助。

    sql-join.png

    LEFT JOIN左连接

    • LEFT JOIN返回A表(左表)的全部行和B表(右表)满足ON条件的行,如果左表的行在右表中没有匹配,那么这一行右表中对应数据用NULL代替。

    RIGHT JOIN 右连接

    • RIGHT JOIN返回B表(右表)的全部行和A表(左表)满足ON条件的行,如果右表的行在左表中没有匹配,那么这一行左表中对应数据用NULL代替。

    inner join 内连接

    • 如果表中有至少一个匹配,则返回行
      INNER JOIN产生的结果集中,是A表和B表的交集。

    full outer join 全外连接

    • FULL JOIN 会从左表 和右表 那里返回所有的行。如果其中一个表的数据行在另一个表中没有匹配的行,那么对面的数据用NULL代替。
    • on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
    • where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left/right join 的含义(必须返回左表/右表的记录)了,条件不为真的就全部过滤掉。

    在做题前要了解一下数据库各个表的关系,最好的办法就是画ER图,这样子可以快速地想到解题思路。
    **********接下来就是做题啦*************
    此处略去一万字............

    这里记录一下第14题,主要是这题太长了,看起来就很吓人
    我也被吓懵了,以下是参考了大石师兄的思路写的。

    题目是查询各科成绩最高分、最低分和平均分: 以如下形式显示:课程 ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90 要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列

    首先是要求不同的成绩分数、同时输出课程号、选修人数,按人数降序、课程号升序排列。
    接着是求各种分数,主要是利用聚合函数或者是case when 处理

    select
    sc.CId,
    max(sc.score)as 最高分,
    min(sc.score)as 最低分,
    AVG(sc.score)as 平均分,
    count(*)as 选修人数,
    sum(case when sc.sorce>=60 then 1 else 0 end)/count(*) as 及格率,
    sum(case when sc.sorce>=70 and sc.sorce<=80 then 1 else 0 end)/count(*) as 中等率,
    sum(case when sc.sorce>=80 and sc.sorce<=90  then 1 else 0 end)/count(*) as 优良率,
    sum(case when sc.sorce >90 then 1 else 0 end)/count(*) as 优秀率
    from sc
    GROUP BY sc.CId;
    

    这里提到了case when,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略
    case when else end 其实翻译起来很简单就是if-else语句

     case                           -------------如果
        when  条件   then xxx        -------------满足条件,则返回值是xxx      
        else    yyy                 -------------其他的返回yyy
        end                      ----------------结束
    

    最后就是对人数降序、课程号升序

    from sc
    GROUP BY sc.CId
    ORDER BY count(*) DESC,sc.CId asc;
    

    其余的题目下次在做分享。

    相关文章

      网友评论

        本文标题:数分组团学习第二周

        本文链接:https://www.haomeiwen.com/subject/pkvvyktx.html