2013-02-26 14 views
7

Wiem, że jest to przedmiotem dyskusji, ale żadne z moich badań nie może przekonać mnie różnica między klauzulami "where" i "having" w MySQL. Z tego co rozumiem, możemy osiągnąć wszystko, co można zrobić za pomocą klauzuli "where", używając "having". Na przykład select * from users having username='admin'. Dlaczego więc potrzebujesz klauzuli "where"? Czy używasz miejsca, w którym występują różnice w wydajności?Dlaczego masz "gdzie", gdy jest "o"

+1

zobacz także: [SQL - uwzględniając VS gdzie] (http://stackoverflow.com/questions/9253244); [WHERE vs HAVING] (http://stackoverflow.com/questions/2905292) – mellamokb

Odpowiedz

6

The WHERE filtry klauzula danych ze źródła przed kruszyw, natomiast HAVING Filtry klauzula dane po GROUP BY została zastosowana. Ogólnie oznacza to, że dowolny filtr nieagregatowany może pojawić się w dowolnym miejscu, ale jeśli masz kolumnę, do której nie ma odniesienia w zapytaniu, możesz filtrować ją tylko w klauzuli WHERE.

Na przykład, jeśli masz poniższej tabeli:

| ID | VALUE | 
-------------- 
| 1 | 15 | 
| 2 | 15 | 
| 3 | 20 | 
| 4 | 20 | 
| 5 | 25 | 
| 6 | 30 | 
| 7 | 40 | 

Załóżmy, że chcesz zastosować następujące zapytanie:

select value, count(value) 
from Table1 
group by value 

Ale tylko chciał zawierać wiersze, gdzie ID > 2. Jeśli umieścisz to w klauzuli HAVING, otrzymasz error, ponieważ kolumna ID nie jest dostępna po agregacji, ponieważ nie znajduje się w klauzuli .W takim przypadku można byłoby wymagane do korzystania z klauzuli WHERE Zamiast:

select value, count(value) 
from Table1 
where id > 2 
group by value 

Demo: http://www.sqlfiddle.com/#!2/f6741/16

1

W przypadku gdy ocenia się na poziomie pojedynczego wiersza, mając na uwadze, że jest używany do grupowania według wyrażeń.

3

Różnica między HAVING z WHERE klauzuli jest że HAVING obsługuje zagregowane kolumn podczas WHERE nie dlatego, że ma zastosowanie tylko do poszczególnych wierszy., EG

SELECT ID 
FROM tableName 
GROUP BY ID 
HAVING COUNT(ID) > 1 --- <<== HERE 

Od docs MySQL,

"Możesz użyć Aliasu, jeśli używasz HAVING zamiast WHERE jest to jedna z zdefiniowanych różnic między tymi dwiema klauzulami, mając także wolniej i nie będzie op w określonym czasie, ale jeśli umieścisz taką złożoną funkcję w swoim miejscu, w którym oczywiście nie spodziewasz się dużej prędkości. "

+0

Dzięki. Ale ja znam różnicę. Dlaczego musisz używać gdzie, kiedy wszystko można osiągnąć za pomocą klauzuli "mieć"? – Sethunath

+0

w twoim przykładzie robią to samo, ale jeśli jesteś dobrym programistą sql, powinieneś wiedzieć, gdzie używać obu słów kluczowych. "GDZIE" jest oceniane najpierw przed klauzulą ​​"HAVING". –

+1

Z dokumentacji MySQL, * "Możesz użyć Aliasu, jeśli używasz HAVING zamiast WHERE jest to jedna ze zdefiniowanych różnic między tymi dwiema klauzulami, mając także wolniej i nie zostanie zoptymalizowana, ale jeśli umieszczasz złożoną funkcję jak to w twoim miejscu, gdzie oczywiście nie oczekujesz dużej prędkości. "* –

1

z klauzulą ​​HAVING można określić warunek filtrowania grupy w przeciwieństwie do filtrowania indywidualnych wiersze, co zdarza się w fazie WHERE.

Tylko grupy, dla których wyrażenie logiczne w klauzuli HAVING ma wartość TRUE, są zwracane przez fazę HAVING. Grupy, dla których wyrażenie logiczne ocenia się na FALSE or UNKNOWN, są odfiltrowywane.

Gdy GROUP BY nie jest używany, HAVING zachowuje się jak klauzula WHERE. Jeśli chodzi o porównanie wydajności proszę zobaczyć ten article

Powiązane problemy