数据蛙第8期数据分析组团

数分组团学习第二周

2020-09-22  本文已影响0人  Bouwun_Tsui

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

Mysql45

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

sql 各种连接

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

sql-join.png

LEFT JOIN左连接

RIGHT JOIN 右连接

inner join 内连接

full outer join 全外连接

  • 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;

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

上一篇 下一篇

猜你喜欢

热点阅读