sql具有聚合函数的子句

时间:2014-08-25 11:40:55

标签: sql

select regno
from examinee
where score>(select avg(score) from examinee)

如何使用' HAVING'来编写上述查询?条款?

我尝试过编写以下版本,但它不起作用(显示空集)

select regno
from examinee
group by score
having score>avg(score);

我哪里错了?

3 个答案:

答案 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作为相关子句计算)。

在我看来,您的原始查询更清晰。