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
Identyfikator klienta | CustomerName | Miasto | Kraj |
1 | Anja Damian | Berlin | Niemcy |
2) | Denny Cockett | México DF | Meksyk |
3) | Eleanor Calnan | México DF | Meksyk |
4 | Albertha Albury | Londyn | UK |
5 | Latisha Nembhard | Luleå | Szwecja |
6 | Madalene Bing | Mannheim | Niemcy |
7 | Rebecka Beegle | Strasburg | Francja |
8 | Różowa końcówka | Madryt | Hiszpania |
9 | Audie Khan | Marsylia | Francja |
10 | Hildegard Burrowes | Tsawassen | Kanada |
11 | Cordell Dutremble | Londyn | UK |
12 | Nora Reyna | Buenos Aires | Argentyna |
13 | Ursula Laforest | México DF | Meksyk |
14 | Claudie Neel | Berno | Szwajcaria |
15 | Portia Yee | San Paulo | Brazylia |
16 | Angila Segarra | Londyn | UK |
17 | Lise Wexler | Akwizgran | Niemcy |
18 | Ned Mendivil | Nantes | Francja |
19 | Sara Vidaurri | Londyn | UK |
20 | Tayna Navin | Graz | Austria |
21 | Pura Ray | San Paulo | Brazylia |
22 | Erika Byard | Madryt | Hiszpania |
23 | Jimmie Luke | Lille | Francja |
24 | Shayla Byington | Bräcke | Szwecja |
25 | Christiana Boden | München | Niemcy |
26 | Irina Nitta | Nantes | Francja |
27 | Bryanna Alls | Torino | Włochy |
28 | Norah Picken | Lisboa | Portugalia |
29 | Moriah Stwart | Barcelona | Hiszpania |
30 | Idella Harriott | Sewilla | Hiszpania |
OrderID | Identyfikator klienta | Data zamówienia |
10254 | 14 | 11-07-1996 |
10258 | 20 | 17-07-1996 |
10259 | 13 | 18-07-1996 |
10263 | 20 | 23-07-1996 |
10264 | 24 | 24-07-1996 |
10265 | 7 | 25-07-1996 |
10267 | 25 | 29-07-1996 |
10278 | 5 | 12-08-1996 |
10280 | 5 | 14-08-1996 |
10289 | 11 | 26-08-1996 |
10290 | 15 | 27-08-1996 |
10297 | 7 | 04-09-1996 |
10303 | 30 | 11-09-1996 |
10308 | 2) | 18-09-1996 |
10311 | 18 | 20-09-1996 |
10326 | 8 | 10-10-1996 |
10327 | 24 | 11-10-1996 |
10328 | 28 | 14-10-1996 |
10331 | 9 | 16-10-1996 |
10337 | 25 | 24-10-1996 |
10340 | 9 | 29-10-1996 |
10342 | 25 | 30-10-1996 |
10347 | 21 | 06-11-1996 |
10351 | 20 | 11-11-1996 |
10352 | 28 | 12-11-1996 |
10355 | 4 | 15-11-1996 |
10360 | 7 | 22-11-1996 |
10362 | 9 | 25-11-1996 |
10363 | 17 | 26-11-1996 |
10364 | 19 | 26-11-1996 |
10365 | 3) | 27-11-1996 |
10366 | 29 | 28-11-1996 |
10368 | 20 | 29-11-1996 |
10370 | 14 | 03-12-1996 |
10378 | 24 | 10-12-1996 |
10382 | 20 | 13-12-1996 |
10383 | 4 | 16-12-1996 |
10384 | 5 | 16-12-1996 |
10386 | 21 | 18-12-1996 |
10389 | 10 | 20-12-1996 |
10390 | 20 | 23-12-1996 |
10391 | 17 | 23-12-1996 |
10396 | 25 | 27-12-1996 |
10400 | 19 | 01-01-1997 |
10402 | 20 | 02-01-1997 |
10403 | 20 | 03-01-1997 |
10408 | 23 | 08-01-1997 |
10410 | 10 | 10-01-1997 |
10411 | 10 | 10-01-1997 |
10414 | 21 | 14-01-1997 |
10422 | 27 | 22-01-1997 |
10426 | 29 | 27-01-1997 |
10430 | 20 | 30-01-1997 |
10431 | 10 | 30-01-1997 |
10434 | 24 | 03-02-1997 |
10435 | 16 | 04-02-1997 |
10436 | 7 | 05-02-1997 |
10442 | 20 | 11-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:
Kraj | Ilość zamówień |
Austria | 10 |
Francja | 9 |
Szwecja | 7 |
Niemcy | 6 |
UK | 6 |
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 -
- Zapytanie wstawiania SQL
- Klucz obcy w SQL
- Odrębne słowo kluczowe w SQL
- Widoki SQL
- 6 najczęściej zadawanych pytań dotyczących wewnętrznego łączenia w Oracle