Używamy cookies, żeby zwiększyć Twoje doświadczenia na stronie
CodeWorlds

HAVING - filtrowanie grup

Umiemy już policzyć książki w każdej kategorii. Ale co, jeśli interesują nas tylko popularne kategorie - te z więcej niż trzema książkami? Nie możemy użyć WHERE - poznasz dlaczego za chwilę. Do filtrowania grup służy klauzula HAVING.

Czym jest HAVING?

HAVING filtruje całe grupy na podstawie wyniku funkcji agregującej - już po wykonaniu GROUP BY.

1SELECT kategoria_id, COUNT(*)
2FROM ksiazki
3GROUP BY kategoria_id
4HAVING COUNT(*) > 3;

To znaczy: "Pokaż kategorie, ale tylko te, które mają więcej niż 3 książki". Najpierw MySQL podzielił książki na grupy, policzył każdą, a potem odrzucił grupy, które nie spełniły warunku.

HAVING działa na agregatach

Najważniejsza cecha HAVING: może odwoływać się do funkcji agregujących, których WHERE użyć nie potrafi.

1-- Kategorie, w których średnia cena przekracza 50
2SELECT kategoria_id, AVG(cena)
3FROM ksiazki
4GROUP BY kategoria_id
5HAVING AVG(cena) > 50;
1-- Kraje, z których mamy co najmniej 5 autorów
2SELECT kraj, COUNT(*)
3FROM autorzy
4GROUP BY kraj
5HAVING COUNT(*) >= 5;

Kolejność klauzul

Zapamiętaj porządek: GROUP BY zawsze stoi przed HAVING:

1SELECT kolumna, COUNT(*)
2FROM tabela
3GROUP BY kolumna
4HAVING COUNT(*) > liczba;

HAVING to sito, przez które przesypujemy gotowe grupy - zostają tylko te wystarczająco duże, drogie albo liczne.

Przejdź do CodeWorlds