Grupowanie danych: Klauzula HAVING w SQL cz. IV
Klauzula HAVING
w SQL według ogólnego wzoru zapytań SELECT
podanego w artykule „Podstawowa wersja zapytania SELECT w SQL (SELECT … FROM … WHERE …)” wykonywana jest po klauzuli GROUP BY, czyli po pogrupowaniu danych. Działa ona w zasadzie tak samo jak słowo kluczowe WHERE, z takim wyjątkiem, że przy WHERE
nie mogliśmy używać funkcji grupujących, funkcji rankingu oraz operować na pogrupowanych danych. W klauzuli HAVING
jest to wszystko dopuszczalne. W skrócie funkcja ta może zostać wykorzystana na przykład do wyeliminowania grup danych, które nie spełniają podanego po niej warunku logicznego.
Ogólna składnia zapytania SELECT
zawierającego klauzulę HAVING
:
SELECT kolumna1, kolumna2 FROM tabela GROUP BY kolumna3 HAVING kolumna4 > 10; --warunek logiczny
Tabela klienci
na której będziemy uruchamiać przykładowe zapytania:
ID | Imie | Nazwisko | Miasto |
1 | Jan | Kowalski | Warszawa |
2 | Michał | Łagoda | Kraków |
3 | Marcin | Kulczyk | Kraków |
4 | Radosław | Sikorski | Kraków |
5 | Monika | Kopacz | Gdańsk |
6 | Piotr | Grabiec | Toruń |
7 | Ewa | Pogodna | Bydgoszcz |
8 | Sebastian | Szybki | Warszawa |
Pobierzmy z tabeli klienci
miasta z których mamy przynajmniej dwóch klientów:
SELECT Miasto FROM klienci GROUP BY Miasto HAVING COUNT(*) > 1;
Efekt:
Miasto |
Kraków |
Warszawa |
A teraz wykonajmy to samo zapytanie tylko zamiast HAVING
użyjmy WHERE
:
SELECT miasto FROM klienci WHERE COUNT(*) > 1 -- BŁĄD!!! GROUP BY miasto;
Oczywiście otrzymaliśmy błąd, gdyż jak wspomniałem na początku w klauzuli WHERE
nie można używać funkcji grupujących i rankingowych.
Pobierzmy informacje o miastach w których mamy klienta o imieniu „Radosław”:
SELECT imie, nazwisko, miasto FROM klienci GROUP BY miasto HAVING imie = 'Radosław';
Efekt:
Imie | Nazwisko | Miasto |
Radosław | Sikorski | Kraków |
Jak można się zorientować przerabiając powyższe przykłady, dane w naszym zapytaniu są najpierw grupowane, a potem wywoływana jest klauzula HAVING
. Gdybyśmy użyli słowo kluczowe WHERE
, to było by dokładnie na odwrót czyli grupowali byśmy tylko przefiltrowane wyniki co w niektórych przypadkach mogło by nam dać złe dane.
dobry artykuł. Przystępnie opisane