Jak działa HAVING w języku SQL? Przykłady zastosowania

Jak działa HAVING w języku SQL? Przykłady zastosowania

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 przed GROUP BY.
  • HAVING filtruje grupy rekordów po zastosowaniu GROUP 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?

  1. WHERE salary > 4000 najpierw filtruje rekordy – odrzuca te, gdzie pensja jest mniejsza niż 4000.
  2. GROUP BY department grupuje pozostałe rekordy według działu.
  3. 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 po GROUP BY, podczas gdy WHERE przed.
  • Stosujemy je do filtrowania grup na podstawie funkcji agregujących.
  • Można łączyć WHERE i HAVING 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

KajoDataSpace