0

我们HAVING用于行组和WHERE单个行。
但以下是有效的:

SELECT Salesperson, SUM(TotalSale)  
   FROM SALES  
   GROUP BY Salesperson  
   HAVING Salesperson <> 'Georgio';    

HAVING不使用聚合函数。那么我们不能也使用它WHERE Salesperson <> 'Georgio';吗?

4

4 回答 4

3

最简单的答案是,HAVING同时支持条件(简单条件和聚合条件),而WHERE不能支持聚合条件。

此外,HAVING在对记录进行分组后进行评估。

于 2013-03-14T08:13:38.657 回答
2

是的。不同之处在于,子句在聚合之后HAVING进行评估,而子句在 之前WHERE

这通常会通过使用 来提高性能WHERE,但并非总是 100% 如此。例如,采取以下措施:

create table foo(type int, data int);
create index bar on foo(id);

insert into foo values(1,3);

insert into foo values(2,3);
insert into foo values(2,3);
insert into foo values(2,3);
insert into foo values(2,3);
insert into foo values(2,3);

insert into foo values(3,3);

insert into foo values(5,3);

这个查询更好WHERE

select type, sum(data)
from foo
where type = 5
group by type;
ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA
1 SIMPLE foo ref bar bar 5 const 1 100 使用 where
select type, sum(data)
from foo
group by type
having type = 5;
ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA
1 SIMPLE foo 索引栏 5 8 100

这个查询实际上作为 a 的性能更好HAVING,因为该值type=2的选择性不够:

select type, sum(data)
from foo
where type = 2
group by type;
ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA
1 SIMPLE foo ALL bar 8 62.5 使用 where
select type, sum(data)
from foo
group by type
having type = 2;
ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA
1 SIMPLE foo 索引栏 5 8 100
于 2013-03-14T08:14:24.350 回答
1

对于您的特定查询,答案是肯定的

像这样看,分组/聚合的数据越少,sql server 的负担就越小,所以。"where" 提供更好的性能,因为要做的工作更少,

但是,在您的查询中,您使用 <> / 不等于这是 sql 服务器执行的(硬)过滤器,因此您最终可能会遇到更快的 having 子句,因为服务器发现将所有内容分组更容易然后删除这个例子,

但是我怀疑,查询优化器说什么?

于 2013-03-14T08:24:26.577 回答
0

你可以有,但你会失去对每个销售人员的总销售额求和的能力;)

最好同时使用 WHERE 和 HAVING....

于 2013-03-14T08:13:31.433 回答