本周总结:这周工作上连续加班占用较多时间,学习时间较少,只完成至14题。仔细想想工作上是一部原因,另一部分原因是耐力不足,很多时候加完班回来收拾好后就不想看书,就算看书也是浮于表面,无法沉下来研究。可能是过于焦虑,总是想一口吃成一个胖子,殊不知越是如此,越是无法持久的坚持下去。以后引以为戒。
下周计划:补齐上周的SQL50题练习,基本了解廖雪峰网站上关于python的知识。
接2018-12-28,进度如下;
6.查询学过「张三」老师授课的同学的信息
SELECT student.*
FROM student INNER JOIN score ON student.s_id=score.s_id
INNER JOIN course ON score.c_id=course.c_id
INNER JOIN teacher ON course.t_id=teacher.t_id
WHERE teacher.t_name='张三';
或
SELECT * FROM student
WHERE student.s_id IN( SELECT DISTINCT score.s_id FROM score
WHERE score.c_id =( SELECT course.c_id FROM course
WHERE course.t_id =(SELECT teacher.t_id FROM teacher WHERE teacher.t_name='张三')));
7.查询没有学全所有课程的同学的信息
SELECT student.* FROM student LEFT JOIN score ON student.s_id=score.s_id
GROUP BY score.s_id
HAVING COUNT(score.c_id)<3;
使用左联结可以筛选‘三门考试都没考’的人员信息
或
SELECT * FROM student WHERE student.s_id IN
(SELECT DISTINCT score.s_id FROM score GROUP BY score.s_id
HAVING COUNT(score.c_id)<3);
这里存在一个问题:无法筛选出三门考试均为参加的人员。因为在score表中,没有‘三门考试都没考’的人员王菊的信息。
image.png
image.png
8.查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息
SELECT * FROM student
WHERE s_id IN(SELECT DISTINCT s_id FROM score
WHERE c_id IN(SELECT c_id FROM score WHERE s_id='01')AND s_id!='01');
此处要注意去掉学号为‘01’的同学
9 查询和" 01 "号的同学学习的课程完全相同的其他同学的信息(未解决)
SELECT * FROM student
WHERE s_id = (SELECT DISTINCT s_id FROM score
WHERE c_id = (SELECT c_id FROM score WHERE s_id='01') AND s_id!='01');
10 查询没学过「张三」老师讲授的任一门课程的学生姓名
SELECT student.s_name FROM student
WHERE student.s_id NOT IN
(SELECT student.s_id FROM score WHERE score.c_id IN
(SELECT course.c_id FROM course WHERE course.t_id IN
(SELECT teacher.t_id FROM teacher WHERE teacher.t_name='张三')));
11 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
SELECT student.s_id,student.s_name,AVG(score.s_score) AS '平均成绩' FROM
student RIGHT JOIN score ON
student.s_id=score.s_id WHERE score.s_score<60 GROUP BY
score.s_id HAVING COUNT(score.s_score)>1;
12 检索" 01 "课程分数小于 60 ,按分数降序排列的学生信息
SELECT s_id,s_score FROM
score WHERE score.c_id='01' AND score.s_score<60 ORDER BY score.s_score DESC;
13 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
select s_id, max(case c_id when '01' then s_score else 0 end)'01',
max(case c_id when '02' then s_score else 0 end)'02',
max(case c_id when '03' then s_score else 0 end)'03', avg(s_score) from score
group by s_id order by avg(s_score) desc;
14查询各科成绩最高分、最低分和平均分:
以如下形式显示:课程 ID ,课程 name ,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
--及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
select course.c_id,course.c_name, 最高分,最低分,平均分,及格率,中等率,优良率,优秀率
from course left join (select c_id, max(score.s_score)最高分,min(score.s_score)最低分,cast(avg(score.s_score) as decimal(5,2))平均分 from score group by c_id)B on course.c_id=B.c_id
left join (select c_id,convert(sum(case when s_score>=60 then 1 else 0 end)/count(*),decimal(5,2))及格率 from score group by score.c_id)C on B.c_id=C.c_id
left join (select c_id,convert(sum(case when s_score>=70 and s_score<80 then 1 else 0 end)/count(*),decimal(5,2))中等率 from score group by score.c_id)D on C.c_id=D.c_id
left join (select c_id,convert(sum(case when s_score>=80 and s_score<90 then 1 else 0 end)/count(*),decimal(5,2))优良率 from score group by score.c_id)E on D.c_id=E.c_id
left join (select c_id,convert(sum(case when s_score>=90 then 1 else 0 end)/count(*),decimal(5,2))优秀率 from score group by score.c_id)F on E.c_id=F.c_id;
注意:case when * then * else * end 的用法
cast()和convert()的区别。