HAVING służy do filtrowania wyników po grupowaniu, czyli po zastosowaniu GROUP BY. Jest podobny do WHERE, ale działa na grupach, a nie na pojedynczych wierszach.
Różnica między WHERE a HAVING
WHEREfiltruje wiersze przed grupowaniem.HAVINGfiltruje grupy po wykonaniuGROUP BY.
Składnia
SELECT kolumna, funkcja_agregujaca(kolumna)
FROM tabela
GROUP BY kolumna
HAVING warunek_dla_grupy;
Przykład
Obliczenie średniego zarobku dla każdej płci, ale pokazanie tylko tych grup, w których średni zarobek jest większy niż 5000:
SELECT plec, AVG(zarobek) AS sredni_zarobek
FROM pracownicy
GROUP BY plec
HAVING AVG(zarobek) > 5000;
Kiedy używać HAVING?
HAVING stosuje się, gdy warunek dotyczy wyniku agregacji, np.:
AVG(zarobek) > 5000,COUNT(*) >= 10,SUM(wartosc) < 10000.
Częsty błąd
Zapytanie:
SELECT AVG(zarobek)
FROM pracownicy
GROUP BY plec
HAVING plec = 'k' AND plec = 'm';
nie zwróci poprawnego podziału na kobiety i mężczyzn, bo warunek plec = 'k' AND plec = 'm' jest sprzeczny. Jedna grupa nie może mieć jednocześnie wartości k i m. Do obliczenia średniej osobno dla każdej płci wystarczy:
SELECT AVG(zarobek)
FROM pracownicy
GROUP BY plec;