Wprowadzenie do klauzuli SQL HAVING

Bardzo podstawowym pytaniem, jakie przychodzi na myśl, jest to, co ma ta klauzula MAJĄCA? Cóż, klauzula HAVING służy do filtrowania wyników zapytania SQL za pomocą funkcji agregujących. Aby zrozumieć to w prostym języku angielskim, jest to polecenie analizatora składni SQL „Hej, SQL, z naszej tabeli danych klienta, pobierz mi nazwy krajów, które mają ponad 1 milion klientów”.

Zaraz, tak właśnie działa klauzula WHERE, prawda? Tak, jest to bardzo podobne do sposobu działania klauzuli WHERE, ale z niewielką różnicą. Klauzula WHERE nie działa z funkcjami agregującymi.

Teraz, aby podsumować nieco funkcje agregujące, są to funkcje, które przyjmują wiele wierszy jako dane wejściowe i dają znacznie bardziej przetworzone dane wyjściowe. Kilka przykładów to Count (), Sum (), Min (), Max (), Avg () itp.

Dlaczego MASZ, a nie GDZIE?

Widzimy, że klauzule HAVING i WHERE wykonują bardzo podobne zadanie, aby odfiltrować wyniki. Więc jaka była potrzeba klauzuli HAVING? Dlaczego klauzula WHERE nie może być używana z funkcjami agregującymi?

Aby odpowiedzieć na to pytanie, musielibyśmy zrozumieć, w jaki sposób silnik SQL traktuje dwie klauzule. Klauzula FROM w każdym poleceniu SQL informuje silnik, z którego miejsca należy odczytać wiersze. Dane są przechowywane na dysku i są pobierane do pamięci w celu przetworzenia. Ponieważ wiersze są odczytywane jeden po drugim z dysku do pamięci, są sprawdzane pod kątem klauzuli WHERE. Wiersze, które nie spełniają klauzuli WHERE, nie są ładowane do pamięci. Zatem klauzula WHERE jest oceniana dla każdego wiersza, gdy są one przetwarzane przez silnik SQL.

Przeciwnie, klauzula HAVING pojawia się dopiero po załadowaniu wierszy do pamięci. Po załadowaniu do pamięci, funkcje agregujące wykonują swoje zadanie w wierszach PO żądanym stanie.

Teraz, gdybyśmy umieścili klauzulę WHERE z funkcją agregującą, taką jak avg (), wprowadziłoby to w błąd silnik SQL, czy należy uwzględnić wiersz do obliczania średniej, czy nie. Zasadniczo polecilibyśmy silnikowi, aby nie czytał wiersza, ponieważ nie spełniał on kryteriów avg () w klauzuli WHERE. Ale hej, aby ustalić, czy spełniało lub nie spełniało kryteriów obliczeniowych avg (), wiersz należy wczytać do pamięci. Stan impasu.

Składnia

SELECT
FROM


GDZIE - opcjonalnie
GROUP BY - grupuje wiersze, aby zastosować funkcję agregującą
POSIADANIE - funkcja agregująca w stanie
ZAMÓW PRZEZ ; - zdefiniuj kolejność sortowania, opcjonalnie

Uwaga - klauzula GROUP BY jest wymagana z klauzulą ​​HAVING. Wynika to z faktu, że klauzula Posiadanie wymaga grupy danych do zastosowania funkcji agregującej i odfiltrowania wyników.

Jak działa klauzula HAVING?

Pozwól nam zrozumieć działanie klauzuli HAVING w SQL.

Klauzuli HAVING zawsze towarzyszy klauzula GROUP BY. Klauzula GROUP BY grupuje dane, które spełniają określone kryterium. Ma trzy fazy - podziel, zastosuj i połącz. Faza podziału dzieli rzędy na grupy. Faza zastosowania stosuje pewne funkcje agregujące w grupach danych. Połączona faza daje jeden wynik, łącząc grupy z wynikiem funkcji agregującej.

Po utworzeniu grup pojawia się klauzula HAVING. Klauzula HAVING odfiltrowuje grupy, które nie spełniają danego warunku.

SELECT Col_A, avg(Col_B) as Col_B
FROM MyTable
GROUP BY Col_A
HAVING avg(Col_B)>30

Tak więc w powyższym przykładzie widzimy, że tabela najpierw dzieli się na trzy grupy na podstawie kolumny Col_A. Następnie do grup stosuje się funkcję agregującą do obliczenia średniej wartości Col_B. Daje to jeden wiersz dla każdej grupy. Wiersze są następnie łączone i filtrowane na podstawie warunku w klauzuli HAVING.

Przykład

Spójrzmy teraz na przykład z prawdziwego świata. Rozważ, że mamy poniższą tabelę klientów i zamówienia, które u nas złożyli.

Identyfikator klientaCustomerNameMiastoKraj
1Anja DamianBerlinNiemcy
2)Denny CockettMéxico DFMeksyk
3)Eleanor CalnanMéxico DFMeksyk
4Albertha AlburyLondynUK
5Latisha NembhardLuleåSzwecja
6Madalene BingMannheimNiemcy
7Rebecka BeegleStrasburgFrancja
8Różowa końcówkaMadrytHiszpania
9Audie KhanMarsyliaFrancja
10Hildegard BurrowesTsawassenKanada
11Cordell DutrembleLondynUK
12Nora ReynaBuenos AiresArgentyna
13Ursula LaforestMéxico DFMeksyk
14Claudie NeelBernoSzwajcaria
15Portia YeeSan PauloBrazylia
16Angila SegarraLondynUK
17Lise WexlerAkwizgranNiemcy
18Ned MendivilNantesFrancja
19Sara VidaurriLondynUK
20Tayna NavinGrazAustria
21Pura RaySan PauloBrazylia
22Erika ByardMadrytHiszpania
23Jimmie LukeLilleFrancja
24Shayla ByingtonBräckeSzwecja
25Christiana BodenMünchenNiemcy
26Irina NittaNantesFrancja
27Bryanna AllsTorinoWłochy
28Norah PickenLisboaPortugalia
29Moriah StwartBarcelonaHiszpania
30Idella HarriottSewillaHiszpania
OrderIDIdentyfikator klientaData zamówienia
102541411-07-1996
102582017-07-1996
102591318-07-1996
102632023-07-1996
102642424-07-1996
10265725-07-1996
102672529-07-1996
10278512-08-1996
10280514-08-1996
102891126-08-1996
102901527-08-1996
10297704-09-1996
103033011-09-1996
103082)18-09-1996
103111820-09-1996
10326810-10-1996
103272411-10-1996
103282814-10-1996
10331916-10-1996
103372524-10-1996
10340929-10-1996
103422530-10-1996
103472106-11-1996
103512011-11-1996
103522812-11-1996
10355415-11-1996
10360722-11-1996
10362925-11-1996
103631726-11-1996
103641926-11-1996
103653)27-11-1996
103662928-11-1996
103682029-11-1996
103701403-12-1996
103782410-12-1996
103822013-12-1996
10383416-12-1996
10384516-12-1996
103862118-12-1996
103891020-12-1996
103902023-12-1996
103911723-12-1996
103962527-12-1996
104001901-01-1997
104022002-01-1997
104032003-01-1997
104082308-01-1997
104101010-01-1997
104111010-01-1997
104142114-01-1997
104222722-01-1997
104262927-01-1997
104302030-01-1997
104311030-01-1997
104342403-02-1997
104351604-02-1997
10436705-02-1997
104422011-02-1997

Teraz chcemy wiedzieć, klienci z których krajów złożyli u nas łącznie 5 lub więcej zamówień. Może to być pojedynczy klient składający więcej niż 5 zamówień lub 5 klientów składających 1 zamówienie.

Aby to osiągnąć, musielibyśmy

Krok 1 : Połącz dwa tabele

Krok 2: Grupuj klientów według ich krajów

Krok 3: Policz liczbę zamówień dla każdej grupy

Krok 4: Filtruj wyniki dla 5 lub więcej zamówień

Sformułujmy polecenie:

SELECT C.Country, COUNT(O.OrderId) as NumberOfOrders -- Step 1, 3
FROM Customers C -- Step 1
INNER JOIN Orders O on C.CustomerID = O.CustomerID -- Step 1
GROUP BY C.Country -- Step 2
HAVING COUNT(O.OrderId) >= 5 -- Step 4
ORDER BY COUNT(O.OrderId) DESC

Oto wyniki:

KrajIlość zamówień
Austria10
Francja9
Szwecja7
Niemcy6
UK6

Wniosek - klauzula SQL HAVING

Tak więc widzieliśmy, jaki jest cel klauzuli HAVING i jak ona działa. Ważne jest, aby zrozumieć podstawową pracę, w przeciwnym razie możesz się zdezorientować, dlaczego klauzula HAVING nie przynosi pożądanych rezultatów. Graj dalej przy różnych stołach, połączeniach i kombinacjach wraz z klauzulą ​​HAVING.

Polecane artykuły

Jest to przewodnik po klauzuli SQL HAVING. Tutaj omawiamy działanie klauzuli HAVING w SQL i przykład z poniższą tabelą klientów. Możesz także przejrzeć nasze inne sugerowane artykuły -

  1. Zapytanie wstawiania SQL
  2. Klucz obcy w SQL
  3. Odrębne słowo kluczowe w SQL
  4. Widoki SQL
  5. 6 najczęściej zadawanych pytań dotyczących wewnętrznego łączenia w Oracle