时间:2021-07-01 10:21:17 帮助过:41人阅读
2.查询’生物‘课程比’物理‘课程成绩高的所有学生的学号
思路:
获取所有有生物课程的人(学号,成绩)-临时表
获取所有有物理课程的人(学号,成绩)-临时表
根据【学号】连接两个临时表:
学号 物理成绩 生物成绩
生物---》 SELECT score.sid,score.student_id,course.cname,score.num FROM score
LEFT JOIN course ON score.course_id=course.cid WHERE course.cname=‘生物‘;
select A.student_id from
(select score.sid,score.student_id,course.cname,score.num from score
LEFT JOIN course on score.course_id=course.cid where course.cname="生物") as A
INNER JOIN
(select score.sid,score.student_id,course.cname,score.num from score
LEFT JOIN course on score.course_id=course.cid where course.cname="物理") as B
on A.student_id = B.student_id
where A.num > B.num
3.查询平均成绩大于60分的同学的学号和平均成绩;
思路:
根据学生分组,使用avg获取平均值,通过having对avg进行筛选
select student_id,avg(num) from score group by student_id having avg(num) > 60
进行连表操作:
SELECT B.student_id,student.sname,B.mean FROM
(SELECT student_id,avg(num) as mean FROM score GROUP BY student_id HAVING avg(num) > 60) as B
LEFT JOIN student
ON B.student_id=student.sid
4.查询所有同学的学号,姓名,选课数,总成绩;
SELECT score.student_id,student.sname,count(student_id),sum(num) FROM score
LEFT JOIN student on score.student_id=student.sid
GROUP BY score.student_id
5.查询姓’李‘的老师的个数
SELECT count(1) FROM teacher WHERE tname like ‘李%‘;
6.查询没学过’李平老师‘课的同学的学号,姓名;
思路:
先查到’李平老师‘老师教的所有课的 ID
获取选过课的所有学生ID
学生表中筛选
SELECT student.sid,student.sname FROM student
WHERE sid NOT in
(SELECT student_id FROM score WHERE course_id in
(SELECT course.cid FROM course LEFT JOIN teacher
ON course.teacher_id=teacher.tid
WHERE teacher.tname = ‘李平老师‘)
GROUP BY student_id
)
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.查询学过’李平‘老师课的同学的学号,姓名;
同上,只不过001和002 变成 in
SELECT student.sid,student.sname FROM student
WHERE sid in
(SELECT student_id FROM score WHERE course_id in (SELECT course.cid FROM course
LEFT JOIN teacher ON course.teacher_id=teacher.tid WHERE teacher.tname = ‘李平老师‘)
GROUP BY student_id
)
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 同学 选择的所有课程
获取课程在其中的所有人以及所有课程
根据学生筛选,获取所有学生信息
再与学生表 连接,获取姓名
SELECT student_id,sname,count(course_id)
FROM score LEFT JOIN student on score.student_id=student.sid
WHERE student_id != 1 AND course_id in (SELECT course_id FROM score WHERE student_id=1)
GROUP BY student_id
13.查询至少学过学号为 ’001‘同学所有课的其他同学学号和姓名;
先找到和001的学过所有人
然后个数 = 001所有学科 ==》 其他人可能选择的更多
SELECT student_id,sname,count(course_id) FROM score
LEFT JOIN student on score.student_id=student.sid
WHERE student_id != 1 AND course_id in (SELECT course_id FROM score WHERE student_id = 1)
GROUP BY student_id
HAVING count(course_id) = (SELECT count(course_id) FROM score WHERE student_id=1)
14.查询和’002‘号的同学学习的课程完全相同的其他同学学号和姓名;(!!!)
个数相同
002学过的也学过
select student_id from score where student_id in (
select student_id from score where student_id !=1
GROUP BY student_id HAVING count(1) = (select count(1) from score where student_id = 1)
) and course_id in (select course_id from score where student_id = 1)
GROUP BY student_id HAVING count(1) = (select count(1) from score where student_id = 1)
15.删除
16.向sc表中插入一些记录,这些记录要求符合以下条件:
1.没有上过编号’002‘课程的同学学号
2.插入’002‘号课程的平均成绩
思路;
由于insert支持
insert into tb1(xx,xx) select x1,x2 from tb2;
所有,获取所有没上过002课 的所有人,获取002的平均成绩
17.
18.查询各科成绩最高和最低分:如下形式显示:课程ID,最高分,最低分;
SELECT course_id,max(num) AS max_num,min(num) AS min_num FROM score GROUP BY course_id;
19.按各科平均成绩从低到高和及格率的百分数从高到低顺序;
方法一:
SELECT course_id,avg(num),sum(CASE WHEN num<60 THEN 0 ELSE 1 END),
sum(1),sum(CASE WHEN num<60 THEN 0 ELSE 1 END)/sum(1) *100
AS percent FROM score
GROUP BY course_id
ORDER BY avg(num) ASC,percent desc;
方法二:
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 avg(if(isnull(score.num),0,score.num)),teacher.tname FROM course
LEFT JOIN score ON course.cid=score.course_id
LEFT JOIN teacher ON course.teacher_id=teacher.tid
GROUP BY score.course_id
21.查询各科成绩前三名的记录:(不考虑成绩并列情况)
SELECT score.sid,score.course_id,score.num,T.first_num,T.second_num FROM score
LEFT JOIN (SELECT sid,
(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 3,1) AS second_num
FROM score as s1
) AS T
ON score.sid = T.sid
WHERE score.num <= T.first_num AND score.num >= T.second_num
22.查询每门课程被选修的学生数;
SELECT course_id,count(1) FROM score GROUP BY course_id
23查询出只选修了一门课程的全部学生的学号和姓名;(!!!)
SELECT student.sid,student.sname,count(1) FROM score
LEFT JOIN student ON score.student_id=student.sid
GROUP BY course_id HAVING count(1) = 1
24.查询男生,女生的人数
SELECT * FROM
(SELECT count(1) AS man FROM student WHERE gender=‘男‘) AS A,
(SELECT count(1) AS woman FROM student WHERE gender=‘女‘) AS B;
25.查询姓’张‘的学生名单
SELECT sname FROM student WHERE sname LIKE ‘张%‘
26.查询同名同姓学生名单,并统计同名人数
SELECT sname,count(1) AS count FROM student GROUP BY sname
27.查询每门课的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程降序排列
SELECT course_id,avg(if(isnull(num),0,num)) AS avg FROM score
GROUP BY course_id ORDER BY avg
ASC,course_id desc
28.查询平均成绩大于85的所有学生的学号,姓名和平均成绩(!!!!未取出 >85)
SELECT student_id,sname,avg(if(isnull(num),0,num)) FROM score
LEFT JOIN student on score.student_id=student.sid
GROUP BY student_id
29.查询课程名称为’生物‘,且分数低于60的学生姓名和分数
SELECT student.sname,score.num FROM score
LEFT JOIN course ON score.course_id=course.cid
LEFT JOIN student ON score.student_id=student.sid
WHERE score.num < 60 AND course.cname=‘生物‘
30.查询课程编号为003且课程成绩在80分以上的学生的学号和姓名
SELECT * FROM score WHERE score.student_id = 3 and score.num > 80
31.求选了课程的学生人数
select count(c) from (
select count(student_id) as c from score group by student_id) as A;
32.查询选修’张磊‘老师所授课程的学生中,成绩最高的学生姓名及其成绩
SELECT sname,num FROM score
LEFT JOIN student ON score.student_id=student.sid
WHERE score.course_id in (SELECT course.cid FROM course LEFT JOIN teacher ON
course.teacher_id=teacher.tid WHERE tname=‘张磊老师‘) ORDER BY num DESC LIMIT 1
33.查询各个课程及相应的选修人数;
select course.cname,count(1) from score
left join course on score.course_id = course.cid
group by course_id;
34.查询不同课程但成绩相同的学生的学号,课程号,学生成绩(!!!)
SELECT DISTINCT s1.course_id,s2.course_id,s1.num,s2.num
FROM score AS s1,score AS s2
WHERE s1.num=s2.num AND s1.course_id != s2.course_id
36.检索至少选修两门课程的学生学号
SELECT student_id FROM score
GROUP BY student_id
HAVING count(student_id) > 1;
37.查询全部学生都选修的课程号和课程名(!!!)
SELECT course_id,count(1) FROM score
GROUP BY course_id HAVING count(1) = (SELECT count(1) FROM student);
38.查询没学过‘李平‘老师讲授的任意一门课程的学生姓名
SELECT student_id,student.sname FROM score
LEFT JOIN student on score.student_id=student.sid
WHERE score.course_id NOT in (
SELECT cid FROM course LEFT JOIN teacher ON course.teacher_id=teacher.tid
WHERE tname=‘李平老师‘
)
GROUP BY student_id
加 课程名
SELECT student_id,student.sname,course.cname FROM score
LEFT JOIN student on score.student_id=student.sid
LEFT JOIN course on course_id=course.cid
WHERE score.course_id NOT in (
SELECT cid FROM course LEFT JOIN teacher ON course.teacher_id=teacher.tid
WHERE tname=‘李平老师‘
)
GROUP BY student_id
39.查询两门以上不及格课程的同学的学号及其平均成绩(!!!)
SELECT student_id,count(1) FROM score
WHERE num < 60
GROUP BY student_id HAVING count(1) > 2
40.检索’004‘课程分数小于60,按分数 降序 排列的同学学号
SELECT student_id FROM score
WHERE num<60 and course_id=4
ORDER BY num DESC;
mysql篇---mysql习题
标签:获取 esc 没有 均值 isnull left join python 思路 大于