cid | caption |
---|---|
1 | 三年二班 |
2 | 一年三班 |
3 | 三年一班 |
sid | sname | gender | class_id |
---|---|---|---|
1 | zyx | 女 | 1 |
2 | zx | 男 | 1 |
3 | top | 男 | 2 |
tid | tname |
---|---|
1 | bobo |
2 | haha |
3 | zhilong |
cid | cname | teacher_id |
---|---|---|
1 | 生物 | 1 |
2 | 体育 | 3 |
3 | 物理 | 2 |
cid | student_id | course_id | number |
---|---|---|---|
1 | 1 | 1 | 60 |
2 | 1 | 2 | 59 |
3 | 2 | 2 | 100 |
4 | 3 | 1 | 89 |
1.查询平均成绩大于60分的同学的学号和平均成绩;
select student_id,avg(number) from score group by student_id having avg(number)>60
select * from (select student_id,avg(number) from score group by student_id having avg(number)>60) as B left join student on B.student_id=student.sid;
2.查询所有同学的学号、姓名、选课数、总成绩
SELECT student.sid, student.sname, count( course_id ) AS '选课数', SUM( number ) FROM score LEFT JOIN student ON student.sid = score.student_id GROUP BY score.student_id;
3.查询名称前缀为“b”的老师的个数
select * from teacher where tname like "b%"
4.查询没学过“bobo”老师课的同学的学号、姓名;
select
sid,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 teacher.tid = course.teacher_id
where tname = "bobo" )
group by
5.查询“生物”课程比“物理”课程成绩高的所有学生的学号;
select
A.student_id
from(
select sid, student_id, cname, number from score
LEFT JOIN course
on score.course_id = course.cid
where cname = "生物"
) as A
inner JOIN (
SELECT sid, student_id, cname, number from score
LEFT JOIN course
on score.course_id = course.cid
where cname = "物理"
) as B
on A.student_id = B.student_id
6.查询学过“001”并且也学过编号“002”课程的同学的学号、姓名
select
student.sid,
student.sname
from
student
inner join (
select student_id
from score
where ( course_id = 2 OR course_id = 1 )
group by student_id
having count( course_id )= 2
) as B
on student.sid = B.student_id
7.查询学过“bobo”老师所教的所有课的同学的学号、姓名
select
score.student_id,
student.sname
from
score
LEFT JOIN student on score.student_id = student.sid
where
score.course_id in (
select
cid
from
course
LEFT JOIN teacher on course.teacher_id = teacher.tid
where
teacher.tname = "bobo")
8.查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名
SELECT
sid,
sname
from
student
inner JOIN (
select
A.student_id,
A.`002成绩`,
B.`001成绩`
from
(select student_id, number as "002成绩" from score where course_id = 2 ) as A
inner JOIN
(select student_id, number as "001成绩" from score where course_id = 1 ) as B
on A.student_id = B.student_id
having A.`002成绩` < B.`001成绩`
)
as C on student.sid = C.student_id
9.查询有课程成绩小于60分的同学的学号、姓名
SELECT
sid,
sname
from
student
INNER JOIN (
select student_id, number
from score
where number < 60
) as A
on student.sid = A.student_id
10.查询没有学全所有课的同学的学号、姓名
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
)
11.查询至少有一门课与学号为“001”的同学所学相同的同学的学号和姓名
-- select course_id from score where student_id=1 查找学号为1 的学生所学的课程
select
sid,
sname
from
student
INNER JOIN (
select
student_id
from
score
where
student_id !=1 and course_id in ( select course_id from score where student_id = 1 )) as A on student.sid = A.student_id
GROUP BY
sid
12.删除学习“叶平”老师课的SC表记录;
select sc.student_id,
(select number from score left join course on score.course_id = course.cid where course.cname = "生物" and score.student_id=sc.student_id) as sy,
(select number from score left join course on score.course_id = course.cid where course.cname = "物理" and score.student_id=sc.student_id) as wl,
(select number from score left join course on score.course_id = course.cid where course.cname = "体育" and score.student_id=sc.student_id) as ty,
count(sc.course_id),
avg(sc.number)as avg
from score as sc
group by student_id
order by avg desc
13.查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
SELECT course_id,max(number)as "最高分",min(number)as "最低分" from score GROUP BY course_id
14.按各科及格率的百分数从高到低顺序;
SELECT course_id,sum(case when number>=60 then 1 else 0 end )/COUNT(number)*100 as percent from score GROUP BY course_id
15.课程平均分从高到低显示(显示任课老师)
SELECT
course_id,
AVG( number ) as "平均值",
teacher.tname
from
score
LEFT JOIN course on score.course_id = course.cid
LEFT JOIN teacher on course.teacher_id = teacher.tid
GROUP BY
course_id
16.查询各科成绩前三名的记录:(不考虑成绩并列情况)
SELECT T.course_id,T.first,T.second,T.third from
(SELECT
sc.sid,
sc.course_id,
sc.number,
(SELECT number from score as s1 where s1.course_id=sc.course_id GROUP BY number ORDER BY number desc limit 0,1)as first,
(SELECT number from score as s1 where s1.course_id=sc.course_id GROUP BY number ORDER BY number desc limit 1,1)as second,
(SELECT number from score as s1 where s1.course_id=sc.course_id GROUP BY number ORDER BY number desc limit 2,1)as third
from score as sc)as T
where T.number>=T.third
ORDER BY T.course_id asc
17.查询每门课程被选修的学生数
SELECT course.cid,A.`选课人数`,course.cname
from
(select course_id,count(student_id)as "选课人数"
from score
GROUP BY course_id)as A
LEFT JOIN course
on A.course_id=course.cid
18.查询出只选修了一门课程的全部学生的学号和姓名
SELECT
student.sid,
student.sname
from
( SELECT student_id, count( course_id ) as "选课数" from score GROUP BY student_id ) as A
LEFT JOIN student on student.sid = A.student_id
where
A.`选课数` =1
19.查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列
SELECT course.cname,A.avg
from
(SELECT course_id,AVG(number) as avg from score GROUP BY course_id)as A
LEFT JOIN course
on course.cid=A.course_id
ORDER BY
avg asc,course_id desc
20.查询平均成绩大于85的所有学生的学号、姓名和平均成绩
SELECT A.student_id,student.sname,A.avg
from
(SELECT student_id,avg(number)as avg from score GROUP BY student_id)as A
LEFT JOIN student
on student.sid=A.student_id
21.查询课程名称为“物理”,且分数低于60的学生姓名和分数
SELECT
student.sname,
score.number
from
score
LEFT JOIN course ON score.course_id = course.cid
LEFT JOIN student on score.student_id = student.sid
where
score.number < 60
and course.cname = "物理"
22.查询课程编号为003且课程成绩在80分以上的学生的学号和姓名
select
student_id,
student.sname
from
score
LEFT JOIN student on student.sid = score.student_id
where
course_id = 3
and score.number > 80
23.查询选修“bobo”老师所授课程的学生中,成绩最高的学生姓名及其成绩
SELECT
B.course_id,
max( number )
from
(
SELECT
*
from
score
LEFT JOIN course on course.cid = score.course_id
LEFT JOIN teacher on teacher.tid = course.teacher_id
where
teacher.tname = "bobo"
) as B
GROUP BY
B.course_id
24.查询不同课程但成绩相同的学生的学号、课程号、学生成绩
DISTINCT
去重
select DISTINCT
s1.course_id,
s2.course_id,
s1.number,
s2.number
from score as s1, score as s2
where
s1.number = s2.number
and s1.course_id != s2.course_id;
25.检索至少选修两门课程的学生学号
SELECT
*
from
( SELECT student_id, count( course_id ) as "选课数" from score GROUP BY student_id ) as A
where
A.`选课数` >=2
26.查询两门以上不及格课程的同学的学号及其平均成绩
SELECT
B.student_id,
avg( score.number )
from
(
SELECT
student_id,
count( course_id ) as shu
from
( SELECT student_id, course_id, number from score where number < 60 ) as A
GROUP BY
student_id
) as B
LEFT JOIN score on score.student_id = B.student_id
where
B.shu > 1
GROUP BY
B.student_id
27.删除“002”同学的“001”课程的成绩
DELETE from score where student_id=2 and course_id=1