Wróć do: Bazy danych
średni SQLCOUNTAVGmatura rozszerzona z informatyki

Funkcje agregujące

Funkcje COUNT, SUM, AVG, MIN i MAX liczące jedną wartość z wielu wierszy oraz różnica między COUNT(*) a COUNT(kolumna).

01

Opis

Zwykłe zapytanie zwraca tyle wierszy, ile ich znalazło. Funkcja agregująca działa odwrotnie: bierze wiele wierszy i zwraca z nich jedną wartość. Zapytanie o średnią ocen całej klasy zwróci jedną liczbę, niezależnie od tego, czy klasa liczy pięciu uczniów, czy trzydziestu.

Pięć funkcji wystarcza do niemal wszystkich zadań maturalnych – ich zestawienie znajdziesz w sekcji „Funkcje" niżej.

Agregacja bez GROUP BY liczy z całej tabeli. Zapytanie SELECT AVG(srednia) FROM uczniowie traktuje wszystkie wiersze jako jedną wielką grupę i zwraca dokładnie jeden wiersz. Dopiero dodanie klauzuli GROUP BY dzieli tabelę na grupy i liczy wartość osobno dla każdej z nich.

Nie da się mieszać agregacji z pojedynczą kolumną. Zapytanie o nazwisko obok MAX(srednia) nie zadziała – bo maksimum jest jedno, a nazwisk jest pięć i baza nie wie, które pokazać. To pytanie o „kto ma najwyższą średnią" rozwiązuje się inaczej: przez sortowanie z ograniczeniem liczby wierszy albo przez podzapytanie.

Różnica COUNT(*) kontra COUNT(kolumna) wraca na maturze regularnie. COUNT(*) zlicza wiersze – każdy, niezależnie od zawartości. COUNT(kolumna) zlicza niepuste wartości w tej kolumnie, pomijając wiersze, w których jest ona pusta. Na kompletnych danych obie dają ten sam wynik i różnicy nie widać – aż do zadania, w którego danych celowo są luki.

Puste wartości są pomijane także przez pozostałe funkcje. AVG liczy średnią tylko z wierszy, które mają wartość – nie traktuje pustego pola jak zera. To ważne, bo średnia z trzech ocen i dwóch pustych pól to średnia z trzech liczb, a nie z pięciu.

Wynikowej kolumnie warto nadać czytelną nazwę etykietą AS – bez niej nagłówek wygląda jak Expr1000 albo powtórzenie wzoru.

02

Funkcje

COUNT(*)
zlicza wierszeLiczy wszystkie wiersze w grupie, także te z pustymi polami.
COUNT(kolumna)
zlicza niepuste wartościPomija wiersze, w których wskazana kolumna jest pusta.
SUM(kolumna)
sumujeDodaje wartości liczbowe. Na tekście nie zadziała.
AVG(kolumna)
średnia arytmetycznaSuma podzielona przez liczbę niepustych wartości.
MIN(kolumna)
wartość najmniejszaDziała też na tekście (pierwszy alfabetycznie) i na datach (najwcześniejsza).
MAX(kolumna)
wartość największaOdpowiednik MIN dla drugiego końca zakresu.
03

Zapytanie

-- Jedna funkcja, jeden wiersz wyniku - niezależnie od rozmiaru tabeli
SELECT COUNT(*) AS ilu, AVG(srednia) AS srednia_szkoly
FROM uczniowie
Wynik zapytania
ilusrednia_szkoly
54.21
-- Pełne zestawienie statystyk jednym zapytaniem
SELECT MIN(srednia) AS najnizsza, MAX(srednia) AS najwyzsza, SUM(srednia) AS suma
FROM uczniowie
Wynik zapytania
najnizszanajwyzszasuma
3.205.1021.05
-- Agregacja po odfiltrowaniu wierszy: WHERE działa przed funkcją
SELECT COUNT(*) AS ilu
FROM uczniowie
WHERE srednia >= 4.00
Wynik zapytania
ilu
3

Na maturze

Zdecyduj, czy liczysz z całości, czy z grup. Polecenie „ilu jest uczniów" to agregacja bez GROUP BY – jeden wiersz wyniku. „Ilu uczniów w każdej klasie" to już agregacja z GROUP BY – tyle wierszy, ile klas. Zła odpowiedź na to pytanie to najczęstszy błąd w zadaniach z funkcjami.

Zawsze nadawaj etykietę. Kolumna podpisana AVG(srednia) bywa akceptowana, ale AS srednia czyta się lepiej i pokazuje sprawdzającemu, co policzyłeś. W części poleceń nazwa kolumny wyniku jest wprost wskazana w treści zadania – wtedy jest obowiązkowa.

Uważaj na zaokrąglenia. Średnia rzadko wychodzi okrągła i sposób jej wyświetlenia zależy od narzędzia. Jeśli zadanie wymaga konkretnej liczby miejsc po przecinku, trzeba to jawnie ustawić – i pamiętać, że część funkcji zmienia tylko sposób wyświetlenia, a do dalszych obliczeń baza i tak bierze wartość pełną.

05

Najczęściej zadawane pytania

Czy można policzyć liczbę różnych wartości?

Tak – w większości baz zapisem COUNT(DISTINCT kolumna), który zlicza unikalne wartości zamiast wszystkich. Access tego zapisu nie obsługuje i trzeba go obejść podzapytaniem albo grupowaniem.

Co zwróci AVG dla pustej tabeli?

Wartość pustą (NULL), a nie zero – bo średniej z braku danych nie da się policzyć. COUNT(*) w tej samej sytuacji zwróci uczciwe zero, bo liczbę wierszy da się policzyć zawsze.

Czy MIN i MAX działają na tekstach?

Tak. MIN zwróci wartość pierwszą alfabetycznie, MAX – ostatnią. Na datach działa to równie dobrze: MIN to data najwcześniejsza, MAX – najpóźniejsza.

Powiązane zagadnienia