Funkcje COUNT, SUM, AVG, MIN i MAX liczące jedną wartość z wielu wierszy oraz różnica między COUNT(*) a COUNT(kolumna).
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.
COUNT(*)
COUNT(kolumna)
SUM(kolumna)
AVG(kolumna)
MIN(kolumna)
MAX(kolumna)
-- Jedna funkcja, jeden wiersz wyniku - niezależnie od rozmiaru tabeli SELECT COUNT(*) AS ilu, AVG(srednia) AS srednia_szkoly FROM uczniowie
| ilu | srednia_szkoly |
|---|---|
| 5 | 4.21 |
-- Pełne zestawienie statystyk jednym zapytaniem SELECT MIN(srednia) AS najnizsza, MAX(srednia) AS najwyzsza, SUM(srednia) AS suma FROM uczniowie
| najnizsza | najwyzsza | suma |
|---|---|---|
| 3.20 | 5.10 | 21.05 |
-- Agregacja po odfiltrowaniu wierszy: WHERE działa przed funkcją SELECT COUNT(*) AS ilu FROM uczniowie WHERE srednia >= 4.00
| ilu |
|---|
| 3 |
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ą.
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.
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.
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.
Zagadnienia z tego samego obszaru matury – warto je powtórzyć razem: