BLOK 19 · 2 godz. SQL Agregacja GROUP BY

SQL: funkcje agregujące, GROUP BY, HAVING

Informatyka Rozszerzona · Klasa 4 · Semestr II · Blok 19/30

1. Funkcje agregujące

Funkcje agregujące wykonują obliczenia na zbiorze wierszy i zwracają pojedynczą wartość podsumowującą. To podstawa raportów i zestawień statystycznych w SQL.

FunkcjaDziałanie
COUNT(*)Liczba wierszy
SUM(kolumna)Suma wartości w kolumnie
AVG(kolumna)Średnia arytmetyczna
MIN(kolumna) / MAX(kolumna)Wartość minimalna / maksymalna
SELECT COUNT(*) AS liczba_uczniow, AVG(ocena) AS srednia_klasy FROM Oceny WHERE id_klasy = 10;

2. GROUP BY — grupowanie wierszy

GROUP BY dzieli wiersze na grupy według wartości wskazanej kolumny, a funkcja agregująca liczona jest osobno dla każdej grupy, a nie dla całej tabeli naraz.

SELECT id_klasy, AVG(ocena) AS srednia FROM Oceny GROUP BY id_klasy; -- wynik: jedna średnia dla KAŻDEJ klasy osobno, nie jedna globalna średnia -- id_klasy | srednia -- 10 | 4.2 -- 20 | 3.8

Częsty błąd

W klauzuli SELECT przy użyciu GROUP BY można umieścić tylko kolumny, po których grupujemy, oraz funkcje agregujące. Dodanie kolumny "surowej" (np. imie) bez ujęcia jej w GROUP BY spowoduje błąd lub niezdefiniowane zachowanie w wielu silnikach baz danych.

3. HAVING — filtrowanie grup

Klauzula WHERE filtruje pojedyncze wiersze przed grupowaniem. Klauzula HAVING filtruje całe grupy po agregacji — bo nie można napisać WHERE AVG(ocena) > 4, gdyż w momencie sprawdzania WHERE agregacja jeszcze nie istnieje.

SELECT id_klasy, AVG(ocena) AS srednia FROM Oceny GROUP BY id_klasy HAVING AVG(ocena) > 4.0; -- pokazuje tylko te klasy, których ŚREDNIA przekracza 4.0
KlauzulaFiltrujeKiedy działa
WHEREPojedyncze wierszePrzed agregacją / grupowaniem
HAVINGCałe grupyPo agregacji / grupowaniu

4. Łączenie WHERE, GROUP BY i HAVING

SELECT id_klasy, COUNT(*) AS liczba_ocen, AVG(ocena) AS srednia FROM Oceny WHERE rok_szkolny = 2026 -- filtr wierszy PRZED grupowaniem GROUP BY id_klasy -- grupowanie HAVING COUNT(*) >= 10 -- filtr grup PO agregacji ORDER BY srednia DESC; -- sortowanie wyniku

5. Ćwiczenia praktyczne

Ćwiczenie 1 — ranking klas

Napisz zapytanie zwracające nazwę klasy i jej średnią ocen, posortowane malejąco według średniej, ale tylko dla klas, w których jest co najmniej 15 uczniów.

SELECT Klasy.nazwa, AVG(Oceny.ocena) AS srednia FROM Oceny JOIN Klasy ON Oceny.id_klasy = Klasy.id_klasy GROUP BY Klasy.nazwa HAVING COUNT(DISTINCT Oceny.id_ucznia) >= 15 ORDER BY srednia DESC;

Ćwiczenie 2 — najaktywniejszy przedmiot

Mając tabelę Oceny z kolumną id_przedmiotu, napisz zapytanie znajdujące przedmiot, z którego wystawiono najwięcej ocen (użyj COUNT, GROUP BY i ORDER BY z LIMIT 1).

Sprawdź wiedzę

1. Jaka jest różnica między WHERE a HAVING?

2. Co robi GROUP BY?

3. Które kolumny (poza funkcjami agregującymi) można bezpiecznie umieścić w SELECT przy użyciu GROUP BY?

Podsumowanie bloku