GROUP BY i HAVING to narzędzia służące do grupowania danych i wykonywania obliczeń na całych grupach, a nie na pojedynczych rekordach.
Można je porównać do:
GROUP BY → „Podziel dane na grupy według jakiegoś kryterium”
FUNKCJE AGREGUJĄCE (SUM, AVG, MAX…) → „Wykonaj obliczenia dla każdej grupy”
HAVING → „Od filtruj grupy po wykonaniu obliczeń”
PRZYKŁADOWA BAZA – tabela sprzedaży
Załóżmy, że mamy tabelę:
CREATE TABLE sprzedaż (
id INT,
sprzedawca VARCHAR(20),
produkt VARCHAR(20),
ilosc INT,
cena DECIMAL(10,2)
);
Przykładowe dane:
| id | sprzedawca | produkt | ilosc | cena |
|---|---|---|---|---|
| 1 | Anna | Kwiaty | 5 | 10.00 |
| 2 | Anna | Nawozy | 3 | 25.00 |
| 3 | Jan | Kwiaty | 2 | 10.00 |
| 4 | Jan | Ziemia | 1 | 40.00 |
| 5 | Marek | Kwiaty | 10 | 10.00 |
Co robi GROUP BY?
GROUP BY tworzy grupy rekordów, które mają tę samą wartość w podanej kolumnie.
Np. jeśli zgrupujemy po sprzedawca, baza zrobi takie koszyki:
✔ Grupa 1 – Anna
→ rekordy 1 i 2
✔ Grupa 2 – Jan
→ rekordy 3 i 4
✔ Grupa 3 – Marek
→ rekord 5
Przykład 1: Obliczenie sumy sprzedaży każdego sprzedawcy
SELECT sprzedawca, SUM(ilosc * cena) AS wartosc_sprzedazy
FROM sprzedaż
GROUP BY sprzedawca;
KROK PO KROKU:
1. Powstają 3 grupy:
Anna → rekordy (1,2)
Jan → rekordy (3,4)
Marek → rekord (5)
2. Dla każdej grupy obliczana jest suma:
Anna:
(5 × 10) = 50
(3 × 25) = 75
→ Razem = 125
Jan:
(2 × 10) = 20
(1 × 40) = 40
→ Razem = 60
Marek:
(10 × 10) = 100
→ Razem = 100
Wynik zapytania:
| sprzedawca | wartosc_sprzedazy |
|---|---|
| Anna | 125 |
| Jan | 60 |
| Marek | 100 |
Dlaczego WHERE tu nie działa?
WHERE filtruje pojedyncze rekordy, zanim powstaną grupy.
A my chcemy filtrować całe grupy po obliczeniach.
Do tego służy HAVING.
HAVING to „WHERE dla danych zagregowanych”.
WHERE → filtruje rekordy
HAVING → filtruje grupy
Przykład 2:
Wyświetl tylko tych sprzedawców, którzy sprzedali ponad 100 zł
SELECT sprzedawca, SUM(ilosc * cena) AS wartosc_sprzedazy
FROM sprzedaż
GROUP BY sprzedawca
HAVING SUM(ilosc * cena) > 100;
KROK PO KROKU:
1. Najpierw tworzy grupy (jak wcześniej).
2. Oblicza sumę wartości sprzedaży.
3. Dopiero teraz stosuje filtr HAVING:
Anna → 125 → >100 → ✔ wyświetl
Jan → 60 → ✘ nie wyświetl
Marek → 100 → ✘ (bo nie > 100)
Wynik:
| sprzedawca | wartosc_sprzedazy |
|---|---|
| Anna | 125 |
Przykład 3: Grupowanie po dwóch kolumnach
Pytanie:
„Ile sztuk każdego produktu sprzedał każdy sprzedawca?”
SELECT sprzedawca, produkt, SUM(ilosc) AS ilosc_sztuk
FROM sprzedaż
GROUP BY sprzedawca, produkt;
Tworzą się grupy typu:
Anna – Kwiaty
Anna – Nawozy
Jan – Kwiaty
Jan – Ziemia
Marek – Kwiaty
Kiedy stosujemy GROUP BY i HAVING?
✔ Gdy chcemy policzyć coś dla grup, np.:
sumę sprzedaży
średnią ocen
liczbę uczestników
maksymalną cenę
✔ Gdy chcemy filtrować po wynikach agregacji:
tylko grupy z SUM > X
tylko produkty, które mają MIN < X
tylko klienci kupili ponad 3 razy
❌ Kiedy NIE stosować:
gdy chcemy filtrować pojedyncze rekordy → używamy WHERE
gdy nie korzystamy z agregacji → GROUP BY nie ma sensu