获得由教师讲授的课程,其平均分数高于一个值

时间:2014-09-14 13:28:01

标签: sql relational-database

这是两张桌子及其关系。教师可以教授不止一门课程。 Course和Course_Score之间的关系是1:n。学生的分数存储在course_score中。

课程( cid ,tid *)[1 ------ n] Course_Score( cid * sid * ,得分)

斜体属性是主键。标有*的属性是外键。比如, sid * 是学生证。 tid * 是教师ID。

如何获得该老师所教课程的教师身份证的平均分数均高于80?

我在下面尝试过,但它没有用,因为它返回的数据多于应该返回的数据。

  

SELECT tid FROM course WHERE EXISTS
   (选择平均(分数)FROM course_score NATURAL JOIN course
   GROUP BY cid HAVING avg(得分)> 80);

2 个答案:

答案 0 :(得分:1)

您正在从课程中选择 tid 值;当然你的行数太多了。

而是将查询的顶部更改为:

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

答案 1 :(得分:1)

更容易重新表述这个问题,因为"告诉我老师没有平均成绩为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
    );

关于是否应该包括教授零课程的教师,可能会有一些争论。

Here's an example to show it works

需要注意的一点是,计算int字段的平均值可能很棘手,因为答案可能会四舍五入为int。将其更改为avg(cast (score as decimal))以解决此问题。