程序媛

mysql练习答案(前15题)

1、查询“生物”课程比“物理”课程成绩高的所有学生的学号;

select * from( 

(select * from score where course_id in (select cid from course where cname = '生物')) t1  

left join 

(select * from score where course_id in (select cid from course where cname = '物理')) t2  

on  t1.student_id = t2.student_id) 

where t1.num > t2.num;

 

2、查询平均成绩大于60分的同学的学号和平均成绩;

# 先查看每个同学的平均分数

select student_id,avg(num) from score group by student_id;

# 在筛选成绩大于60分的同学的学号和平均成绩;

# select student_id,avg(num) from score group by student_id having avg(num) > 60;

 

3、查询所有同学的学号、姓名、选课数、总成绩;

# 先查看每个同学的总成绩

select student_id,sum(num) from score group by student_id;

# 学生和课程的关系只有成绩表中存在,因此要获取每个学生选择的课程,需要通过score表

select count(sid),student_id from score group by student_id;

# 将上面两步合并

select sum(num),count(sid),student_id from score group by student_id;

# 将学生的信息和成绩选课情况拼在一起

select sid,sname,sum_num ,count_stu 

from student  

left join 

 (select sum(num) sum_num,count(sid) count_stu,student_id from score group by student_id) t2  

on  sid = student_id;

# 还可以更严谨,那些没有选课的同学选课数和总成绩应该是0

select sid,sname,

(

           CASE

           WHEN sum_num is  null THEN 0   

  ELSE sum_num

           END

         ) as sum_num ,

(

           CASE

           WHEN count_stu is  null THEN 0   

  ELSE count_stu

           END

         ) as count_stu 

from student  

left join 

 (select sum(num) sum_num,count(sid) count_stu,student_id from score group by student_id) t2  

on  sid = student_id;

 

4、查询姓“李”的老师的个数;

# 找到所有姓李的

# 方法一

# select * from teacher where tname like '李%';

# 方法二

# select * from teacher where tname regexp '^李';

# 统计个数

select count(tid) from teacher where tname regexp '^李';

或者

select count(id) from teacher where tname like '李%';

 

5、查询没学过“张磊老师”课的同学的学号、姓名;

# 找到张磊老师的id 

select tid from teacher where tname == '张磊老师';

# 找到张磊老师所教课程

select cid from course where teacher_id = (select tid from teacher where tname = '张磊老师');

# 找到所有学习这门课的学生id

select student_id from score where course_id = (select cid from course where teacher_id = (select tid from teacher where tname = '张磊老师'));

# 找到没有学过这门课的学生对应的学生学号、姓名

select sid,sname from student where sid not in 

(select student_id from score where course_id = (select cid from course where teacher_id = (select tid from teacher where tname = '张磊老师'))

);

 

6、查询学过“1”并且也学过编号“2”课程的同学的学号、姓名;

# 先查询学习课程id为1的所有学生

select * from score where course_id = 1;

# 先查询学习课程id为2的所有学生

select * from score where course_id = 2;

# 把这两张表按照学生的id 内连接起来 去掉只学习某一门课程的学生

select t1.student_id from

(select student_id from score where course_id = 1)  t1

inner join

(select student_id from score where course_id = 2) t2

on t1.student_id = t2.student_id

# 根据学号在学生表中找到对应的姓名

select sid,sname from student where sid in (select t1.student_id from (select student_id from score where course_id = 1)  t1 inner join (select student_id from score where course_id = 2) t2 on t1.student_id = t2.student_id);

 

7、查询学过“李平老师”所教的所有课的同学的学号、姓名;

#找到李平老师的tid

select tid from teacher where tname ='李平老师';

# 找到李平老师教的所有课程cid

 select cid from course where teacher_id in (select tid from teacher where tname ='李平老师');

# 找到李平老师教的所有课程数

 select count(cid) from course where teacher_id in (select tid from teacher where tname ='李平老师');

# 找到所有学习李平老师课程的学生

select * from score where course_id in ( select cid from course where teacher_id in (select tid from teacher where tname ='李平老师'));

# 查看所有学习李平老师课程的学生选课数

select student_id,count(course_id) from score where course_id in ( select cid from course where teacher_id in (select tid from teacher where tname ='李平老师')) group by student_id;

# 找到所有选择了李平老师所有课程的学生id

select  student_id from (

select student_id,count(course_id) course_count from score where course_id in ( select cid from course where teacher_id in (select tid from teacher where tname ='李平老师')) group by student_id) t1

where t1.course_count =

(select count(cid) from course where teacher_id in (select tid from teacher where tname ='李平老师'));

# 找到学生的其他信息

select sid,sname from student where sid in (

select  student_id from (

select student_id,count(course_id) course_count from score where course_id in ( select cid from course where teacher_id in (select tid from teacher where tname ='李平老师')) group by student_id) t1

where t1.course_count =

(select count(cid) from course where teacher_id in (select tid from teacher where tname ='李平老师'))

);

 

8、查询课程编号“2”的成绩比课程编号“1”课程低的所有同学的学号、姓名;

# 先找到每个学生的课程编号“1”的和课程编号“2”的成绩组成一张表

select t1.student_id from (select num num2,student_id from score where course_id = 2) t2 inner join (select student_id,num num1 from score where course_id = 1) t1 on t1.student_id = t2.student_id

# 再找到课程编号“2”的成绩比课程编号“1”课程低的所有学生的学号

select t1.student_id from (select num num2,student_id from score where course_id = 2) t2 inner join (select student_id,num num1 from score where course_id = 1) t1 on t1.student_id = t2.student_id where num2 < num1

# 再找到所有学生的学号、姓名

select sid,sname from student where sid in(select t1.student_id from (select num num2,student_id from score where course_id = 2) t2 inner join (select student_id,num num1 from score where course_id = 1) t1 on t1.student_id = t2.student_id where num2 < num1);

 

9、查询有课程成绩小于60分的同学的学号、姓名;

# 先查询成绩小于60分的同学的学号

select distinct student_id from score where num < 60;

# 再查询有课程成绩小于60分的同学的学号、姓名

select sid,sname from student where sid in (select distinct student_id from score where num < 60);

 

10、查询至少有一门课与学号为1的同学所学课程相同的同学的学号和姓名;

# 先看看学号为1的同学都学了哪些课程

select course_id from score where student_id = 1

# 找到学习 学号为1的同学所学课程 的学号

select distinct student_id from score where course_id in (select course_id from score where student_id = 1);

#  找到学习 学号为1的同学所学课程 的学号\姓名

select sid,sname from student where sid in (select distinct student_id from score where course_id in (select course_id from score where student_id = 1));

 

11、课程平均分从高到低显示

select course_id,avg(num) avg_num from score group by course_id order by avg_num desc;

 

12、查询出只选修了一门课程的全部学生的学号和姓名;

# 查询出只选修了一门课程的全部学生的学号

select student_id,count(student_id) from score group by student_id having count(student_id) =1;

# 查询出只选修了一门课程的全部学生的学号和姓名;

select sid,sname from student where sid in (select student_id from score group by student_id having count(student_id) =1);

 

13、查询男生、女生的人数;

select gender,count(sid) from student group by gender;

 

14、查询姓“张”的学生名单;

select * from student where sname like '张%';

 

15、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;

# 查询成绩的最高分

select course_id c1,max(num) from score group by course_id

# 查询成绩的最低分

select course_id c1,min(num) from score group by course_id

# 查询成绩的最高分和最低分拼接

select * from ( (select course_id c1,max(num) from score group by course_id) t1 inner join (select course_id c2,min(num) from score group by course_id) t2 on t1.c1 = t2.c2 );

# 格式整理

select t1.c1,t1.max_num,t2.min_num from ( (select course_id c1,max(num) max_num from score group by course_id) t1 inner join (select course_id c2,min(num) min_num from score group by course_id) t2 on t1.c1 = t2.c2 );

posted @ 2018-10-09 14:22  Eva_J  阅读(2063)  评论(0编辑  收藏  举报