select regno
from examinee
where score>(select avg(score) from examinee)
如何使用' HAVING'来编写上述查询?条款?
我尝试过编写以下版本,但它不起作用(显示空集)
select regno
from examinee
group by score
having score>avg(score);
我哪里错了?
答案 0 :(得分:1)
对于您的查询,最好的方法似乎是声明一个存储平均分数的变量,然后在WHERE子句中使用此变量。
DECLARE @avgScore INT -- or decimal variable if needed
SET @avgScore = (SELECT AVG(Score) FROM examinee)
SELECT regno
FROM examinee
WHERE score > @avgScore
通过这样做,你只需要查询一次数据库的平均分数,而不是查询表[受检者]的每一行。
答案 1 :(得分:0)
Decrlare @avg Int (255)
Set @avg = (select avg(score)
from examinee
group by regno);
select avg(score), regno
from examinee
group by regno
having avg(score)>@avg;
我不知道您是使用T-SQL还是MySQL,但上述查询接近您想要的。它应该让你走正确的道路。我的语法可能是歪斜的,因为我已经习惯了T-SQL,看起来你可能正在使用MySQL。但是这里:
对于初学者,您需要在select语句中放置avg(score)。您在Where子句中不需要得分> avg(得分),您可以将该条件放在您的Having子句中。在这种情况下,你根本不需要Where子句。
请参阅此页面,深入了解MySQL分组语句:Here
或T-SQL Group by语句的此页面:Here
答案 2 :(得分:0)
我能想到的唯一明智的方法是使用having
子句进行此查询exists
:
select e.regno
from examinee e
where exists (select 1
from examinee e2
having avg(e2.score) < e.score
);
但是,在这样的子查询中有一个having
子句看起来很奇怪。外部查询没有group by
且没有相关子句(我不将having
作为相关子句计算)。
在我看来,您的原始查询更清晰。