2013-03-14 54 views
0

我们对行组使用HAVING,对单个行使用WHERE
但以下是有效的:拥有和在哪里

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

即使用HAVING而不具有聚合功能。所以我们不能用WHERE Salesperson <> 'Georgio';代替吗?

+0

你可以在这里得到一些很好的见解:http://www.codeproject.com/Articles/25258/Where-Vs-Having-Difference-between-having-and-Wher – 2013-03-14 08:15:10

回答

0

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

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

3

的simpliest的答案是,HAVING支持两种情况(简单和汇总条件),而WHERE不能支持聚合条件。

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

+0

我会补充说他**应**已经使用'WHERE',因为它会表现更好。 – cypher 2013-03-14 08:19:23

2

是的。所不同的是HAVING子句在之后被评估为聚合,而WHERE子句之前

这通常会导致使用WHERE的性能提高,但这并非总是如此。例如,采取the following

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); 

This query是作为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   Using 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  index     bar  5     8  100 

但是this query实际上是更好performaning为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  Using 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  index     bar  5     8  100 
+0

我明白了。但这意味着我们事先知道'5'对于'type'字段比'2'更具有选择性。但是当我们编写查询时,我们通常不知道这样的统计信息,对吗? – Jim 2013-03-14 08:45:32

+0

@Jim不,我们没有。但是我们可能统计知道,通过查看大量用户提出的常规查询的EXPLAIN结果,“HAVING”可能是更好的选择。但实际上,1)大多数情况下'WHERE'更好,以及2)这种优化最好只作为已经很差的查询的最后手段,而不是预先或主动地进行。我只是指出了一个有趣的例子,说WHERE不总比HAVING更好。 – 2013-03-14 08:54:30

1

答案是肯定的对您的具体问题 哪里是(对于大多数部分)更好地使用,性能明智

看到它是这样的,更少的数据进行分组/聚合的负担更少的SQL服务器, 等等。 “其中”提供更好的性能的原因有更少的工作要做,

但是在您的查询您使用<> /不等于 这是一个(硬)过滤器为SQL Server做的,所以你可能最终在有条款更快,由于服务器发现它更容易只分组一切,然后删除这个例子,

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