W budowie
Materiał edukacyjny · Informatyka COUNT, SUM, AVG, MIN, MAX, grupowanie GROUP BY i raporty HTML

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;
1. Co liczy COUNT(*)?
2. Co zwraca AVG()?
3. Czym filtrujemy grupy?

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;
4. Co robi GROUP BY?
5. Czym różni się HAVING od WHERE?
6. Co można wypisać w SELECT?

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);
7. Czym jest podzapytanie?
8. Do czego służy AS?
9. Co daje LEFT JOIN w raporcie?

Ćwiczenia