HAVING w SQL

Słownik kwalifikacji INF.03 - Tworzenie i administrowanie stronami i aplikacjami internetowymi oraz bazami danych

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

  • WHERE filtruje wiersze przed grupowaniem.
  • HAVING filtruje grupy po wykonaniu GROUP 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;