mysql练习题 泽桐

表结构和数据:http://www.cnblogs.com/wupeiqi/articles/5748496.html

题目:
2、查询“生物”课程比“物理”课程成绩高的所有学生的学号;
1)
select A.student_id,生物分数,物理分数 from
(select student_id,num as 生物分数
from score
where course_id=(select cid from course where cname='生物')) as A
left join
(select student_id,num as 物理分数
from score
where course_id=(select cid from course where cname='物理')) as B
on A.student_id = B.student_id where 生物分数 > if(isnull(物理分数),0,物理分数);
2)
select A.student_id,生物分数,物理分数 from
(select student_id,num as 生物分数 from score left join course on score.course_id = course.cid where course.cname = '生物') as A
left join
(select student_id,num as 物理分数 from score left join course on score.course_id = course.cid where course.cname = '物理') as B
on A.student_id = B.student_id where 生物分数 > if(isnull(物理分数),0,物理分数);


3、查询平均成绩大于60分的同学的学号和平均成绩;
select student_id,avg(num) as 平均成绩 from score group by student_id having 平均成绩 > 60;


4、查询所有同学的学号、姓名、选课数、总成绩;
select student.sid,sname,count(student_id),sum(num)
from score right join student
on student.sid=student_id
group by student_id;


5、查询姓“李”的老师的个数;
select count(*) from teacher where tname like '李%';



6、查询没学过“李平老师”老师课的同学的学号、姓名;
select distinct student.sid,sname from student where sid not in (
select distinct student_id
from score
where course_id in(
select cid
from course left join teacher
on course.teacher_id=teacher.tid
where tname = '李平老师')
);

7、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
1)
select A.sid,A.sname from
(select student.sid,sname from score right join student
on student.sid=student_id
where course_id='001') as A
inner join
(select student.sid,sname from score right join student
on student.sid=student_id
where course_id='002') as B
on A.sid=B.sid
2)
select student_id,sname from
(select student_id,course_id from score where course_id = 1 or course_id = 2) as B
left join student on B.student_id = student.sid group by student_id HAVING count(student_id) > 1


8、查询学过“叶平”老师所教的所有课的同学的学号、姓名;
select student.sid,sname from score right join student
on student.sid=student_id
where course_id in(
select cid from course left join teacher
on course.teacher_id=teacher.tid
where tname='李平老师'
) group by student.sid HAVING count(student.sid) = (
select count(cid) from course left join teacher
on course.teacher_id=teacher.tid
where tname='李平老师'
);

9、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;
select sname,sid from student inner join (
select A.student_id from
(select student_id,num as s1 from score left join course on score.course_id = course.cid where course.cid = '001') as A
left join
(select student_id,num as s2 from score left join course on score.course_id = course.cid where course.cid = '002') as B
on A.student_id = B.student_id where s1 > if(isnull(s2),0,s2)
) as C
on C.student_id=student.sid;

10、查询有课程成绩小于60分的同学的学号、姓名;
select distinct student.sid,sname from student left join score
on student.sid=score.student_id
where num<60;

11、查询没有学全所有课的同学的学号、姓名;
select student.sid,sname from score right join student
on student.sid=score.student_id
group by student_id
having count(student_id) != (
select count(*) from course
);

12、查询至少有一门课与学号为“001”的同学所学相同的同学的学号和姓名;
select student.sid,sname,count(sname) from score right join student
on student.sid=student_id
where student_id !='001' and course_id in (
select course_id from score where student_id='001'
) group by student_id;

13、查询至少学过学号为“001”同学所有课的其他同学学号和姓名;
select student.sid,sname from score right join student
on student.sid=student_id
where student_id !='001' and course_id in (
select course_id from score where student_id='001'
) group by student_id
having count(sname) >= (
select count(*) from score
where student_id='001');

14、查询和“002”号的同学学习的课程完全相同的其他同学学号和姓名;

select student.sid,sname from score right join student
on student.sid=student_id where student_id in(
select student_id from score where student_id != 2 group by student_id HAVING count(course_id) = (select count(course_id) from score where student_id = 2))
and course_id in (
select course_id from score where student_id='002'
) group by student_id
having count(course_id) = (
select count(course_id) from score
where student_id='002');

15、删除学习“叶平”老师课的score表记录;
delete from score where course_id in (
select cid from course left join teacher on course.teacher_id=tid where tname='李平老师'
)

16、向SC表中插入一些记录,这些记录要求符合以下条件:①没有上过编号“002”课程的同学学号;②插入“002”号课程的平均成绩;
insert into score(student_id, course_id, num) select sid,2,(select avg(num) from score where course_id = 2)
from student where sid not in (
select student_id from score where course_id = 2
)

17、按平均成绩从低到高 显示所有学生的“生物”、“物理”、“体育”、“美术”4门的课程成绩,按如下形式显示:学生ID,生物,物理,体育,美术,有效课程数,有效平均分;(不会这种查询语法)
select student_id,
(select num from score s left join course c on s.course_id=c.cid where cname='生物' and sc.student_id=s.student_id) as 生物分数,
(select num from score s left join course c on s.course_id=c.cid where cname='物理' and sc.student_id=s.student_id) as 物理分数,
(select num from score s left join course c on s.course_id=c.cid where cname='体育' and sc.student_id=s.student_id) as 体育分数,
(select num from score s left join course c on s.course_id=c.cid where cname='美术' and sc.student_id=s.student_id)as 美术分数,
count(course_id),avg(num)
from score sc
group by student_id
order by avg(num);


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

19、按各科平均成绩从低到高和及格率的百分数从高到低顺序;
1)
select avg(num),score.course_id,课程人数,课程及格人数,(课程及格人数/课程人数*100) as 及格率 from score left join
(select course_id,count(student_id) as 课程人数 from score group by course_id order by course_id) as A
on score.course_id=A.course_id
left join
(select course_id,count(student_id) as 课程及格人数 from score where num >=60 group by course_id order by course_id) as B
on A.course_id=B.course_id
group by score.course_id
having
order by avg(num),及格率 desc;
2)
select course_id, avg(num) as avgnum,sum(case when score.num > 60 then 1 else 0 END)/count(1)*100 as percent from score group by course_id order by avgnum asc,percent desc;

20、课程平均分从高到低显示(现实任课老师);
select tname,avg(课程平均分) from
(select tname,c.cid from teacher t right join course c on t.tid=c.teacher_id) as A
left join
(select avg(num) as 课程平均分,course_id from score group by course_id order by avg(num) desc) as B
on A.cid=B.course_id
group by tname
order by avg(课程平均分) desc;

21、查询各科成绩前5名的记录:(不考虑成绩并列情况);
select distinct cname,course_id,
(select num from score as s2 where s2.course_id = s1.course_id order by num desc limit 0,1) as first_num,
(select num from score as s2 where s2.course_id = s1.course_id order by num desc limit 1,1) as second_num,
(select num from score as s2 where s2.course_id = s1.course_id order by num desc limit 2,1) as third_num,
(select num from score as s2 where s2.course_id = s1.course_id order by num desc limit 3,1) as fourth_num,
(select num from score as s2 where s2.course_id = s1.course_id order by num desc limit 4,1) as fifth_num
from score s1 left join course c on c.cid=s1.course_id;

22、查询每门课程被选修的学生数;
select course_id,count(student_id) from score group by course_id;

23、查询出只选修了一门课程的全部学生的学号和姓名;
select student_id,sname from student st left join score sc on st.sid=sc.student_id
group by student_id
having count(course_id)=1;

27、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列;
select course_id,avg(if(isnull(num),0,num)) from score group by course_id order by avg(num),course_id desc;

28、查询平均成绩大于85的所有学生的学号、姓名和平均成绩;
select student_id,sname,avg(num) from score sc left join student st on sc.student_id=st.sid group by student_id;

29、查询课程名称为“生物”,且分数低于60的学生姓名和分数;
select sname,num from score sc left join student st on sc.student_id=st.sid
left join course c on c.cid=sc.course_id
where c.cname='生物' and num<60;

31、求选了课程的学生人数
select count(distinct student_id) from score


32、查询选修“张磊老师”老师所授课程的学生中,成绩最高的学生姓名及其成绩;
select sname,max(num) from score sc
left join student st on sc.student_id=st.sid
where course_id in (
select cid from course c
left join teacher t on c.teacher_id=t.tid
where tname='张磊老师'
);

33、查询各个课程及相应的选修人数;
select cname,count(student_id) from score sc
left join course c on c.cid=sc.course_id
group by course_id;

34、查询不同课程但成绩相同的学生的学号、课程号、学生成绩;
select student_id,course_id,num from score where sid in (
select s1.sid from score s1
inner join score s2 on s1.num=s2.num and s1.course_id != s2.course_id)

35、查询每门课程成绩最好的前两名;
select distinct cname,course_id,
(select num from score as s2 where s2.course_id = s1.course_id order by num desc limit 0,1) as first_num,
(select num from score as s2 where s2.course_id = s1.course_id order by num desc limit 1,1) as second_num
from score s1 left join course c on c.cid=s1.course_id;

36、检索至少选修两门课程的学生学号;
select student_id from score sc group by student_id having count(course_id)>1;

37、查询全部学生都选修的课程的课程号和课程名;
select course_id,cname from score sc
right join course c on c.cid=sc.course_id
group by course_id
having count(student_id)=(
select count(distinct sid) from student
);

38、查询没学过“叶平”老师讲授的任一门课程的学生姓名;
select dictinct sname from score sc
left join student st on sc.student_id=st.sid
where student_id not in (
select student_id from score where course_id in (
select cid from course c left join teacher t on c.teacher_id=t.tid where tname='张磊老师'
)
);

39、查询两门以上不及格课程的同学的学号及其平均成绩;
select student_id,avg(num) from score where student_id in (
select student_id from score where num<60 group by student_id having count(course_id)>1
) group by student_id;

40、检索“004”课程分数小于60,按分数降序排列的同学学号;
select student_id from score where course_id=4 and num<60 order by num desc;

原文地址:https://www.cnblogs.com/linzetong/p/8324807.html