又到了一周的总结,这周过的十分的充实,无论是工作还是学习。工作上加班加成狗,学习上围绕这Mysql45题。
这一次的文章po的不及时,主要是自己的时间安排有问题。临时的加班和参加同学的婚礼导致了。在此诚挚道歉。
Mysql45
在做45题前我还是老老实实的翻了下以前在学校的书,并且回顾了一下知识点(主要是连接)。
sql 各种连接
上图,此图特别鸣谢菜鸟教程独家赞助。

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;
其余的题目下次在做分享。
网友评论