2013-03-14 56 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做的,所以你可能最終在有條款更快,由於服務器發現它更容易只分組一切,然後刪除這個例子,

但是我懷疑,查詢優化器說什麼?