mysql练习(待补充)

2、查询‘生物’课程比‘物理’课程成绩高的所有学生的学号

思路:

获取所有生物课程的人(学号,成绩)-临时表

获取所有物理课程的人(学号,成绩)-临时表

根据学号连接两个临时表:

学号 生物成绩 物理成绩

SELECT A.student_id,sw,wl from
(SELECT student_id,num as sw from score LEFT JOIN course on score.course_id=course.cid where course.cname='生物')as A
LEFT JOIN
(SELECT student_id,num as wl from score LEFT JOIN course on score.course_id=course.cid where course.cname='物理')as B
on A.student_id =B.student_id where sw > if (ISNULL(wl),0,wl);

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

思路:

根据学生分组,使用avg获取平均值,通过having对avg进行筛选

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

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

select score.student_id,student.sname,count(score.student_id),sum(score.num)
from
score left join student on score.student_id
=student.sid group by score.student_id

5、查询姓‘李’的老师的个数

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

6、查询没学过‘叶平’老师课的同学的学号、姓名

思路:

先查询‘李平老师’老师教的所有课的ID

然后获取选了李平老师课的学生ID

最后从学生表中筛选

select sid,sname from student where sid not in (
         select DISTINCT student_id from score where score.course_id in (
            select cid from course left join teacher on course.teacher_id = teacher.tid where tname = '李平老师'
        )
     )

7、查询学过‘001’并且也学过编号‘002’课程的同学的学号、姓名

思路:

先查到既选择001又选择002课程的所有同学

根据学生进行分组,如果学生数量等于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 sid,sname from student where sid in (
         select DISTINCT student_id from score where score.course_id in (
            select cid from course left join teacher on course.teacher_id = teacher.tid where tname = '李平老师'
        )
     )

9、查询课程编号‘002’的成绩比课程编号‘001’课程低的所有同学的学号、姓名

同第一题,把大于号改成小于号

SELECT A.student_id,sw,wl from
(SELECT student_id,num as sw from score LEFT JOIN course on score.course_id=course.cid where course.cname='生物')as A
LEFT JOIN
(SELECT student_id,num as wl from score LEFT JOIN course on score.course_id=course.cid where course.cname='物理')as B
on A.student_id =B.student_id where sw < if (ISNULL(wl),0,wl)

我写了个更简单的

SELECT A.student_id,one,two from 
(SELECT student_id,num as one FROM score where course_id=1)as A
LEFT JOIN
(SELECT student_id,num as two FROM score where course_id=2)as B
on A.student_id =B.student_id where one < if (ISNULL(two),0,two);

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

SELECT sid,sname from student where sid in (SELECT DISTINCT student_id from score where num < 60 )

11、查询没学全所有课的同学的学号、姓名

思路:

在分数表中根据学生进行分组,获取每一个学生选课数量

如果数量==总课程数量,表示已经选择了所有课程

select student_id,sname from score left join student on score.student_id =student.sid group by student_id having count(course_id) =(select count(1) from course)

12、查询至少有一门课与学号为‘001’的同学所学相同的同学的学号和姓名

思路:

获取001同学选择的所有课程

获取课程在其中的所有人以及所有课程

根据学生筛选,获取所有学生信息

再与学生表连接,获取姓名

猜你喜欢

转载自www.cnblogs.com/z-x-y/p/9774264.html