
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:
WHERE
filtruje rekordy przedGROUP BY
.HAVING
filtruje 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 > 4000
najpierw filtruje rekordy – odrzuca te, gdzie pensja jest mniejsza niż 4000.GROUP BY department
grupuje pozostałe rekordy według działu.HAVING COUNT(*) > 5
odrzuca 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ć:
HAVING
działa poGROUP BY
, podczas gdyWHERE
przed.- Stosujemy je do filtrowania grup na podstawie funkcji agregujących.
- Można łączyć
WHERE
iHAVING
w 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, Tableau i Pythona z certyfikatami + specjalistycznych webinarów z PowerBI.
Ekskluzywana ale pomagająca sobie społeczność.
Ponad 61 godzin materiałów video.
Spotkania LIVE co miesiąc.
Mój osobisty mentoring.