我們對行組使用HAVING
,對單個行使用WHERE
。
但以下是有效的:擁有和在哪裏
SELECT Salesperson, SUM(TotalSale)
FROM SALES
GROUP BY Salesperson
HAVING Salesperson <> 'Georgio';
即使用HAVING
而不具有聚合功能。所以我們不能用WHERE Salesperson <> 'Georgio';
代替嗎?
我們對行組使用HAVING
,對單個行使用WHERE
。
但以下是有效的:擁有和在哪裏
SELECT Salesperson, SUM(TotalSale)
FROM SALES
GROUP BY Salesperson
HAVING Salesperson <> 'Georgio';
即使用HAVING
而不具有聚合功能。所以我們不能用WHERE Salesperson <> 'Georgio';
代替嗎?
你可以有,但你會失去銷售總額爲每個銷售人員的能力;)
最好能同時使用WHERE和HAVING ....
的simpliest的答案是,HAVING
支持兩種情況(簡單和彙總條件),而WHERE
不能支持聚合條件。
另外,HAVING
在記錄分組後進行評估。
我會補充說他**應**已經使用'WHERE',因爲它會表現更好。 – cypher 2013-03-14 08:19:23
是的。所不同的是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
我明白了。但這意味着我們事先知道'5'對於'type'字段比'2'更具有選擇性。但是當我們編寫查詢時,我們通常不知道這樣的統計信息,對嗎? – Jim 2013-03-14 08:45:32
@Jim不,我們沒有。但是我們可能統計知道,通過查看大量用戶提出的常規查詢的EXPLAIN結果,「HAVING」可能是更好的選擇。但實際上,1)大多數情況下'WHERE'更好,以及2)這種優化最好只作爲已經很差的查詢的最後手段,而不是預先或主動地進行。我只是指出了一個有趣的例子,說WHERE不總比HAVING更好。 – 2013-03-14 08:54:30
答案是肯定的對您的具體問題 哪裏是(對於大多數部分)更好地使用,性能明智
看到它是這樣的,更少的數據進行分組/聚合的負擔更少的SQL服務器, 等等。 「其中」提供更好的性能的原因有更少的工作要做,
但是在您的查詢您使用<> /不等於 這是一個(硬)過濾器爲SQL Server做的,所以你可能最終在有條款更快,由於服務器發現它更容易只分組一切,然後刪除這個例子,
但是我懷疑,查詢優化器說什麼?
你可以在這裏得到一些很好的見解:http://www.codeproject.com/Articles/25258/Where-Vs-Having-Difference-between-having-and-Wher – 2013-03-14 08:15:10