Funkcje agregujące wykonują obliczenia na zbiorze wierszy i zwracają pojedynczą wartość podsumowującą. To podstawa raportów i zestawień statystycznych w SQL.
| Funkcja | Działanie |
|---|---|
| COUNT(*) | Liczba wierszy |
| SUM(kolumna) | Suma wartości w kolumnie |
| AVG(kolumna) | Średnia arytmetyczna |
| MIN(kolumna) / MAX(kolumna) | Wartość minimalna / maksymalna |
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.
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.
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.
| Klauzula | Filtruje | Kiedy działa |
|---|---|---|
| WHERE | Pojedyncze wiersze | Przed agregacją / grupowaniem |
| HAVING | Całe grupy | Po agregacji / grupowaniu |
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.
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).
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?