day37 mysql练习题自己的答案

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/gaosong0623/article/details/102729833
3.查询平均成绩大于60分的同学的学号和平均成绩;姓名
SELECT student.s_id,a,student.s_name FROM
(select s_id,avg(s_score)as a from score GROUP BY s_id having avg(s_score)>60) as y
LEFT JOIN student on y.s_id=student.s_id

5.查询姓“李”的老师的个数;
SELECT * FROM  teacher WHERE t_name LIKE '李%'

7.查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
SELECT b.s_id,s_name FROM (SELECT a.s_id FROM 
(SELECT s_id,c_id FROM score WHERE c_id=01 or c_id=02) as a
GROUP BY a.s_id
HAVING count(a.s_id)>1) as b
left outer join student on student.s_id=b.s_id

8.查询学过“叶平”老师所教的所有课的同学的学号、姓名;
SELECT a.s_id,s_name FROM 
(SELECT s_id from score WHERE c_id in
(SELECT c_id FROM course LEFT JOIN teacher on teacher.t_id=course.t_id WHERE t_name="李四"))as a 
left outer join student on a.s_id=student.s_id


10.查询有课程成绩小于60分的同学的学号、姓名;
select a.s_id,s_name from (select s_id FROM score WHERE s_score<60 GROUP BY s_id) as a 
left outer join student on student.s_id=a.s_id


11.查询没有学全所有课的同学的学号、姓名;
SELECT a.s_id,s_name FROM 
(select  s_id FROM  score GROUP BY s_id HAVING count(c_id)<(select count(c_id) FROM course)) as a
left outer join student 
on student.s_id = a.s_id

12.查询至少有一门课与学号为“001”的同学所学相同的同学的学号和姓名;
SELECT a.s_id,s_name FROM(select s_id FROM score WHERE s_id !=1 and c_id in (SELECT c_id FROM score WHERE s_id=01 ) GROUP BY s_id) as a 
left outer join student on a.s_id=student.s_id

13、查询至少学过学号为“001”同学所选课程中任意一门课的其他同学学号和姓名;
这题目不是跟上面的一模一样吗???
SELECT a.s_id,s_name FROM(select s_id FROM score WHERE s_id !=1 and c_id in (SELECT c_id FROM score WHERE s_id=01 ) GROUP BY s_id) as a 
left outer join student on a.s_id=student.s_id

14.查询和“002”号的同学学习的课程完全相同的其他同学学号和姓名;(跳过)
select score.s_id,s_name from score 
left join student on score.s_id = student.s_id 
where s_id in 
(select s_id from score  where s_id != 02 
group by s_id 
HAVING count(c_id) = (select count(1) from score where s_id = 02)) 
and 
c_id in (select c_id from score where s_id = 1) 
group by s_id 
HAVING count(c_id) = (select count(c_id) from score where s_id = 02) #跟02一样课程选择数的学号



15、删除学习“李四”老师课的score表记录;
DELETE from score WHERE c_id= (select c_id from course WHERE t_id=(SELECT t_id FROM teacher where t_name LIKE("李四")))

16.向SC表中插入一些记录,这些记录要求符合以下条件:需要注意:从另一张表导入的学号
①没有上过编号“002”课程的同学学号;②插入“002”号课程的平均成绩;
insert into score(s_id,c_id,s_score)
select 
s_id,2,(SELECT avg(s_score) from score WHERE c_id=02)
FROM 
student WHERE s_id NOT in (SELECT s_id from score WHERE c_id=02 GROUP BY s_id)

17、按平均成绩从低到高显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分;
SELECT 
s_id as'学生ID',
(SELECT s_score FROM score as a where c_id=01 and a.s_id=score.s_id LIMIT 0,1) as '语文',
(SELECT s_score FROM score as a where c_id=02 and a.s_id=score.s_id LIMIT 0,1) as '数学',
(SELECT s_score FROM score as a where c_id=03 and a.s_id=score.s_id LIMIT 0,1) as '英语',
count(c_id) as '有效课程数',
avg(s_score) as '平均分'  
FROM score
GROUP BY s_id
ORDER BY '平均分' asc

18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
select c_id,max(s_score),min(s_score) from score
GROUP BY c_id

19、按各科平均成绩从低到高和及格率的百分数从高到低顺序;(排序不管用)试了+0 *1 CAST CONVERT 都不管用
select 
c_id as '课程ID',
AVG(s_score)as '平均分',
(sum(case when score.s_score>60 then 1 else 0 end)/count(1)*100)+0 as '及格率(%)' 
from score
GROUP BY c_id 
 order by '及格率(%)'


20、课程平均分从高到低显示(显示任课老师);
SELECT t_name,b from 
(select c_id,AVG(s_score) as b from score GROUP BY c_id )as a
LEFT JOIN course on a.c_id=course.c_id
LEFT JOIN teacher on course.t_id=teacher.t_id
ORDER BY b desc




21.查询各科成绩前三名的记录:(不考虑成绩并列情况)
SELECT * FROM
(select * from score where c_id=01 order by s_score desc limit 0,3)as a,
(select * from score where c_id=02 order by s_score desc limit 0,3)as b,
(select * from score where c_id=03 order by s_score desc limit 0,3)as c,
(select * from score where c_id=04 order by s_score desc limit 0,3)as d,
(select * from score where c_id=05 order by s_score desc limit 0,3)as e,
(select * from score where c_id=06 order by s_score desc limit 0,3)as f,
(select * from score where c_id=07 order by s_score desc limit 0,3)as g
where a.s_id=b.s_id=c.s_id=d.s_id=e.s_id=f.s_id=g.s_id 





22.查询每门课程被选修的学生数;
select c_id,count(s_id) from score  GROUP BY c_id

23.查询出只选修了一门课程的全部学生的学号和姓名;
select s_id from score 
GROUP BY s_id 
HAVING COUNT(c_id)=1
 
24、查询男生、女生的人数;
select *,(SELECT count(s_id) from student where s_sex ='女')as '女人数' from (SELECT count(s_id)as '男人数' from student where s_sex ='男')as a

猜你喜欢

转载自blog.csdn.net/gaosong0623/article/details/102729833