
Jeśli kiedykolwiek pracowałeś z SQL, na pewno zetknąłeś się z klauzulą WHERE. Ale co w sytuacji, gdy potrzebujesz filtrować dane po agregacji? Właśnie tutaj z pomocą przychodzi HAVING. W tym artykule wyjaśnię, jak działa HAVING w języku SQL, jakie ma zastosowanie i pokażę konkretne przykłady.
Co to jest klauzula HAVING?
Klauzula HAVING w SQL pozwala filtrować wyniki zwrócone przez grupowanie danych, czyli po zastosowaniu funkcji agregujących (COUNT, SUM, AVG, MAX, MIN itd.). Można ją traktować jako odpowiednik WHERE, tyle że działający na poziomie grup.
Różnica między WHERE a HAVING
Podstawowa różnica między WHERE a HAVING polega na tym, że:
WHEREfiltruje rekordy przedGROUP BY.HAVINGfiltruje grupy rekordów po zastosowaniuGROUP BY.
Spójrzmy na prosty przykład:
SELECT department, COUNT(*) AS employee_count
FROM employees
WHERE salary > 4000
GROUP BY department
HAVING COUNT(*) > 5;
Co się tutaj dzieje?
WHERE salary > 4000najpierw filtruje rekordy – odrzuca te, gdzie pensja jest mniejsza niż 4000.GROUP BY departmentgrupuje pozostałe rekordy według działu.HAVING COUNT(*) > 5odrzuca te grupy, które mają mniej niż 5 pracowników.
Praktyczne przykłady zastosowania HAVING
1. Filtracja na podstawie ilości rekordów
Wyobraź sobie, że masz tabelę sales z zamówieniami i chcesz znaleźć klientów, którzy złożyli więcej niż 10 zamówień.
SELECT customer_id, COUNT(*) AS orders_count
FROM sales
GROUP BY customer_id
HAVING COUNT(*) > 10;
2. Filtracja na podstawie wartości sumarycznej
Chcesz sprawdzić, którzy klienci wydali w sumie więcej niż 5000 zł.
SELECT customer_id, SUM(amount) AS total_spent
FROM sales
GROUP BY customer_id
HAVING SUM(amount) > 5000;
3. Łączenie HAVING z WHERE
Można łączyć WHERE i HAVING w jednym zapytaniu. Załóżmy, że chcesz znaleźć tylko tych klientów, którzy dokonali więcej niż 10 transakcji na kwoty wyższe niż 200.
SELECT customer_id, COUNT(*) AS transactions
FROM sales
WHERE amount > 200
GROUP BY customer_id
HAVING COUNT(*) > 10;
Przykładowa tabela i wynik działania HAVING
Załóżmy, że mamy tabelę orders z następującymi danymi:
| order_id | customer_id | amount |
|---|---|---|
| 1 | A123 | 500 |
| 2 | A123 | 700 |
| 3 | B456 | 1000 |
| 4 | B456 | 1500 |
| 5 | A123 | 900 |
Teraz chcemy znaleźć klientów, których łączna wartość zamówień przekroczyła 2000 zł:
SELECT customer_id, SUM(amount) AS total_spent
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 2000;
Wynik:
| customer_id | total_spent |
|---|---|
| B456 | 2500 |
Jak widać, tylko B456 spełnia warunek.
Podsumowanie
Klauzula HAVING w SQL jest niezwykle przydatna, gdy chcemy filtrować grupy danych po zastosowaniu agregacji. Oto kluczowe informacje, które warto zapamiętać:
HAVINGdziała poGROUP BY, podczas gdyWHEREprzed.- Stosujemy je do filtrowania grup na podstawie funkcji agregujących.
- Można łączyć
WHEREiHAVINGw jednym zapytaniu.
Dzięki znajomości HAVING możesz optymalizować zapytania SQL i lepiej kontrolować zwracane przez nie dane.
Inny ciekawy artykuł:
Jak działa ORDER BY w języku SQL? Przykłady zastosowania
Opanuj SQL z moim kursem!
Poznasz zarówno podstawy, jak i zaawansowane zapytania analityczne (CTE, subqueries, window functions). Nauczysz się pracować na różnych silnikach – na kursie pracujemy zarówno na MySQL, jak i na Postgres. Wszystko zainstalujemy na Twoim komputerze, plus dostaniesz mnóstwo zestawów danych do ćwiczeń.
Zostań analitykiem danych – dołącz do KajoDataSpace!
Najlepsza ścieżka do zawodu analityka danych. Dostęp do pełnych wersji kursów online z Excela, SQLa, PowerBI, Tableau i Pythona z certyfikatami!
🟨 Ekskluzywana ale pomagająca sobie społeczność.
🟩 Ponad 75 godzin materiałów video.
🟨 Spotkania LIVE co miesiąc.
🟩 Mój osobisty mentoring.

