这是两张桌子及其关系。教师可以教授不止一门课程。 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);
答案 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))
以解决此问题。