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"
Odpowiedz
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
W przypadku gdy ocenia się na poziomie pojedynczego wiersza, mając na uwadze, że jest używany do grupowania według wyrażeń.
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. "
Dzięki. Ale ja znam różnicę. Dlaczego musisz używać gdzie, kiedy wszystko można osiągnąć za pomocą klauzuli "mieć"? – Sethunath
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". –
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. "* –
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
- 1. gdzie jest plik, gdy użycie getCacheDir
- 2. Jakie jest najlepsze podejście, gdy nie możesz czegoś wymyślić, a nie masz o co pytać?
- 3. gdzie pamięć jest przydzielana, gdy deklarujemy statyczne?
- 4. Szyny, gdzie klauzula, gdy coś jest przechowywane jako tablica
- 5. Dlaczego nie intellisense, gdy instrukcja LINQ nie ma klauzuli gdzie?
- 6. Przeczytaj SharedPreferences, gdy nie masz jeszcze nazwy pliku
- 7. Utwórz mapę, gdy masz wektor kluczy i wartości
- 8. dlaczego tomcat nie wymaga restartu, gdy jsp jest zmieniany
- 9. Dlaczego blok śródliniowy wstawiany jest niżej, gdy zawiera treść?
- 10. Komunikat o błędzie MailApp.sendEmail - "nie masz uprawnień do wywoływania sendEmail"
- 11. gdzie jest wyjście, gdy działa jako proces w tle?
- 12. Gdzie jest ImmutableArray?
- 13. Gdzie jest System.ServiceModel.Web.dll?
- 14. OpenCart: Gdzie jest div dla rozwijanej informacji o nagłówku?
- 15. gdzie jest najlepsze miejsce do rozpoczęcia nauki o servlet/tomcat?
- 16. Czy jest możliwe wykonanie serializacji binarnej .NET, gdy nie masz kodu źródłowego klasy?
- 17. Czy masz rozszerzenia Emacs?
- 18. Gdzie jest dokumentacja sun.misc.Unsafe?
- 19. Dlaczego "sudo" jest powolne, gdy hasło jest niepoprawne?
- 20. Dlaczego powszechną praktyką jest podwojenie pojemności macierzy, gdy jest pełna?
- 21. Gdzie jest Boost.Process?
- 22. Masz wątpliwości dotyczące "respond_to?" Metoda
- 23. Dlaczego ważne jest, aby dowiedzieć się więcej o tablicach, gdy mamy ArrayLists?
- 24. Gdzie jest konflikt?
- 25. Guava: Gdzie jest CharEscaper?
- 26. Gdzie jest VPERMB w AVX2?
- 27. Gdzie jest klasa weblogic.jndi.WLInitialContextFactory?
- 28. Upewnij się, że masz uruchomiony emulator systemu Android lub urządzenie jest podłączone i masz
- 29. Gdzie jest AVLayerVideoGravityResizeAspectFill crop
- 30. gdzie jest gacutil.exe?
zobacz także: [SQL - uwzględniając VS gdzie] (http://stackoverflow.com/questions/9253244); [WHERE vs HAVING] (http://stackoverflow.com/questions/2905292) – mellamokb