2019-01-06

本周总结:这周工作上连续加班占用较多时间,学习时间较少,只完成至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()的区别。

你可能感兴趣的:(2019-01-06)