Sql 获得平均分数高于某个值的教师所教授的课程
下面是两个表及其关系。教师可以教授一门以上的课程。课程与课程分数之间的关系为1:n。学生的分数存储在课程分数中 课程ID,tid*[1--n]课程ID*,sid*,分数 斜体属性是主键。标有*的属性是外键。比如,sid*是学生ID,tid*是教师ID 如何获得该教师所教课程的平均分数均在80分以上的教师ID 我在下面进行了尝试,但没有成功,因为它返回的数据比应该返回的多 从存在的课程中选择tid 从课程中选择avgscore\U分数自然加入课程 按avgscore>80的cid分组 您正在从课程中选择tid值;当然,您得到的行太多了 相反,请将查询的顶部改为:Sql 获得平均分数高于某个值的教师所教授的课程,sql,relational-database,Sql,Relational Database,下面是两个表及其关系。教师可以教授一门以上的课程。课程与课程分数之间的关系为1:n。学生的分数存储在课程分数中 课程ID,tid*[1--n]课程ID*,sid*,分数 斜体属性是主键。标有*的属性是外键。比如,sid*是学生ID,tid*是教师ID 如何获得该教师所教课程的平均分数均在80分以上的教师ID 我在下面进行了尝试,但没有成功,因为它返回的数据比应该返回的多 从存在的课程中选择tid 从课程中选择avgscore\U分数自然加入课程 按avgscore>80的cid分组 您正在从课程
SELECT tid FROM teacher
更新刚刚在规范中看到了以上所有内容
SELECT teacher.tid
FROM teacher
JOIN (
SELECT tid,cid, avg(score) as avg_score
FROM course_score
JOIN course on course.cid = course_score.cid
GROUP BY tid,cid
)scores
on scores.tid = teacher.tid
GROUP BY teacher.tid
HAVING min(avg_score) > 80
将这个问题重新表述为“告诉我没有平均分数在80分或以下的课程的教师”更容易:
select
tid
from
teacher t
where
not exists (
select
'x'
from
course_score cs
inner join
course c
on cs.cid = c.cid
where
c.tid = t.tid
group by
c.cid
having
avg(score) <= 80
);
对于是否应该包括教授过零课程的教师,可能存在一些争论
需要注意的一点是,计算整型字段的平均值可能很棘手,因为答案可能会四舍五入为整型。将其更改为avgcast score as decimal可解决此问题。什么是不起作用的?这不是一个关系除法,在所有情况下都能给出正确答案吗?“这肯定比纠正OP已经有的东西要复杂得多。”PieterGeerkens即使有了你的修正,OP也会挑选至少教授过一门课程、平均成绩超过80分的老师。这个问题问的是所有课程的平均成绩都超过80分的教师。这将返回零记录。某个地方可能有问题。@canoe发布一些测试数据。您正在使用另一个很酷的解决方案!但子查询选择tid、cid、avgscore作为course_分数中的avg_分数可能不起作用,因为tid不在表course_分数中。