CZĘŚĆ 15
SQL: funkcje agregujące, grupowanie i raporty
PPrezentacja dla nauczyciela
Na egzaminie INF.03 niemal w każdym arkuszu trzeba podsumować dane: policzyć liczbę wpisów, sumę kwot, średnią czy znaleźć wartości skrajne. Obliczenia wykonujemy w silniku bazy danych za pomocą funkcji agregujących i klauzuli GROUP BY.
Funkcje agregujące
COUNT() liczy wiersze, SUM() sumuje wartości, AVG() liczy średnią, a MIN() i MAX() pokazują skrajne wartości. Wszystkie zwracają jeden wynik dla całej grupy.
COUNT(*) liczy wszystkie wiersze, a COUNT(kolumna) tylko te, w których kolumna nie jest pusta. To ważna różnica przy danych opcjonalnych.
Funkcje agregujące można łączyć z warunkiem WHERE — wtedy liczą tylko pasujące wiersze. Nie wolno ich używać w WHERE; do filtrowania grup służy HAVING.
SELECT COUNT(*) AS ilu, AVG(punkty) AS srednia
FROM uczniowie
WHERE klasa = '3TI';
SELECT MAX(punkty) AS najlepszy, MIN(punkty) AS najslabszy
FROM uczniowie;
Grupowanie i HAVING
GROUP BY dzieli wynik na grupy według kolumny. Każda grupa daje jeden wiersz wyniku, np. liczbę uczniów w każdej klasie.
W SELECT mogą wystąpić kolumny z GROUP BY oraz funkcje agregujące. Wypisanie innej kolumny bez agregacji jest błędem logicznym.
HAVING filtruje już policzone grupy, np. tylko klasy z więcej niż pięcioma uczniami. WHERE działa wcześniej, na pojedynczych wierszach.
SELECT klasa, COUNT(*) AS ilu, AVG(punkty) AS srednia
FROM uczniowie
GROUP BY klasa
HAVING COUNT(*) > 2
ORDER BY srednia DESC;
Raporty i podzapytania
Podzapytanie to zapytanie w nawiasie wewnątrz innego zapytania. Może zwrócić jedną wartość, np. średnią, i posłużyć do porównania: WHERE punkty > (SELECT AVG(punkty) FROM uczniowie).
Raport zwykle łączy grupowanie, sortowanie i limit. Warto nadawać wynikom aliasy przez AS, bo wtedy nagłówki tabeli są czytelne dla użytkownika.
W większych raportach używamy JOIN razem z agregacją: łączymy tabele i liczymy statystyki dla grup. To najczęstszy wzorzec w zadaniach maturalnych i egzaminacyjnych.
SELECT k.nazwa, COUNT(u.id) AS ilu
FROM klasy k
LEFT JOIN uczniowie u ON u.klasa_id = k.id
GROUP BY k.nazwa
ORDER BY ilu DESC;
SELECT imie FROM uczniowie
WHERE punkty > (SELECT AVG(punkty) FROM uczniowie);
Ćwiczenia
- 1Licznik rekordów COUNTlicznik rekordów COUNTZadanie i podpowiedzi →
- 2Suma wartości SUMsuma wartości SUMZadanie i podpowiedzi →
- 3Wartości skrajne MIN i MAXwartości skrajne MIN i MAXZadanie i podpowiedzi →
- 4Średnia i zaokrąglenie ROUNDśrednia i zaokrąglenie ROUNDZadanie i podpowiedzi →
- 5Agregacja z warunkiem WHEREagregacja z warunkiem WHEREZadanie i podpowiedzi →
- 6Raport zbiorczy wskaźnikówraport zbiorczy wskaźnikówZadanie i podpowiedzi →
- 7Grupowanie GROUP BYgrupowanie GROUP BYZadanie i podpowiedzi →
- 8Suma i średnia na grupęsuma i średnia na grupęZadanie i podpowiedzi →
- 9Sortowanie grup ORDER BYsortowanie grup ORDER BYZadanie i podpowiedzi →
- 10Filtrowanie grup HAVINGfiltrowanie grup HAVINGZadanie i podpowiedzi →
- 11Warunki WHERE oraz HAVINGwarunki WHERE oraz HAVINGZadanie i podpowiedzi →
- 12Unikalne wartości DISTINCTunikalne wartości DISTINCTZadanie i podpowiedzi →
- 13Złączenie JOIN i grupowaniezłączenie JOIN i grupowanieZadanie i podpowiedzi →
- 14Puste grupy LEFT JOIN i COUNTpuste grupy LEFT JOIN i COUNTZadanie i podpowiedzi →
- 15Raport tabelaryczny HTMLraport tabelaryczny HTMLZadanie i podpowiedzi →
- 16Zestawienie analityczne syntezazestawienie analityczne syntezaZadanie i podpowiedzi →