Funkcje agregujące w SQL — COUNT, SUM, AVG, MIN, MAX
Funkcje agregujące to jedno z najważniejszych narzędzi w SQL. Pozwalają obliczać wartości zbiorcze dla wielu wierszy naraz — policzyć rekordy, zsumować sprzedaż, znaleźć średnią cenę czy wskazać wartość najwyższą i najniższą. W tym wpisie poznasz pięć podstawowych funkcji agregujących, nauczysz się grupować dane za pomocą GROUP BY i filtrować grupy przez HAVING. Wszystkie przykłady oparliśmy na popularnej bazie demonstracyjnej Northwind.
Czym jest funkcja agregująca?
Zwykłe zapytanie SELECT zwraca dane wiersz po wierszu. Funkcja agregująca działa inaczej — bierze zbiór wierszy i zwraca z niego jedną wartość. Na przykład zamiast wyświetlić listę wszystkich zamówień, możemy policzyć, ile ich jest, albo zsumować ich wartość.
Pięć podstawowych funkcji agregujących w SQL to:
- COUNT – liczy wiersze,
- SUM – sumuje wartości,
- AVG – oblicza średnią,
- MIN – zwraca wartość najmniejszą,
- MAX – zwraca wartość największą.
COUNT — liczenie wierszy
Najprostsza funkcja. Policzmy, ilu mamy klientów w tabeli Customers:
SELECT COUNT(*) AS liczba_klientow
FROM Customers;
COUNT(*) liczy wszystkie wiersze. Możemy też policzyć wiersze, w których dana kolumna nie jest pusta — np. ilu klientów ma podany numer faksu:
SELECT COUNT(Fax) AS klienci_z_faksem
FROM Customers;
To ważna różnica: COUNT(*) liczy wszystkie wiersze, a COUNT(Fax) pomija te, w których kolumna Fax ma wartość NULL. To pierwsza z pułapek związanych z NULL, do której jeszcze wrócimy.
SUM — sumowanie wartości
Policzmy łączną liczbę wszystkich sztuk produktów w magazynie (kolumna UnitsInStock w tabeli Products):
SELECT SUM(UnitsInStock) AS suma_w_magazynie
FROM Products;
SUM działa wyłącznie na kolumnach liczbowych. Zsumowanie kolumny tekstowej zwróci błąd.
AVG — wartość średnia
Sprawdźmy średnią cenę produktu (kolumna UnitPrice):
SELECT AVG(UnitPrice) AS srednia_cena
FROM Products;
Uwaga: AVG również pomija wartości NULL. Jeśli część produktów nie ma ceny (NULL), nie zostaną one wliczone do średniej — co może zmienić wynik.
MIN i MAX — wartość najmniejsza i największa
Znajdźmy najtańszy i najdroższy produkt w jednym zapytaniu:
SELECT
MIN(UnitPrice) AS najtanszy,
MAX(UnitPrice) AS najdrozszy
FROM Products;
MIN i MAX działają nie tylko na liczbach — potrafią też zwrócić np. najwcześniejszą i najpóźniejszą datę zamówienia.
GROUP BY — agregacja w grupach
Do tej pory liczyliśmy wartości dla całej tabeli. Prawdziwa siła funkcji agregujących ujawnia się w połączeniu z GROUP BY, który dzieli dane na grupy i oblicza wartość dla każdej z osobna.
Policzmy, ile produktów należy do każdej kategorii:
SELECT CategoryID, COUNT(*) AS liczba_produktow
FROM Products
GROUP BY CategoryID;
Zapytanie grupuje produkty według kategorii i dla każdej podaje liczbę produktów. Zasada jest prosta: każda kolumna w SELECT, która nie jest funkcją agregującą, musi znaleźć się w GROUP BY.
Możemy też łączyć kilka funkcji naraz — sprawdźmy dla każdej kategorii liczbę produktów oraz średnią cenę:
SELECT
CategoryID,
COUNT(*) AS liczba_produktow,
AVG(UnitPrice) AS srednia_cena
FROM Products
GROUP BY CategoryID;
HAVING — filtrowanie grup
Częsty błąd początkujących to próba filtrowania wyników agregacji za pomocą WHERE. Nie zadziała — WHERE filtruje pojedyncze wiersze, zanim nastąpi grupowanie. Do filtrowania samych grup służy HAVING.
Wyświetlmy tylko te kategorie, które mają więcej niż 10 produktów:
SELECT CategoryID, COUNT(*) AS liczba_produktow
FROM Products
GROUP BY CategoryID
HAVING COUNT(*) > 10;
Różnica jest kluczowa: WHERE filtruje wiersze przed grupowaniem, HAVING filtruje grupy po grupowaniu. Można ich używać razem — WHERE zawęża dane wejściowe, a HAVING wynikowe grupy.
Uwaga na wartości NULL
Wróćmy do zapowiedzianej pułapki. Wszystkie funkcje agregujące (poza COUNT(*)) pomijają wartości NULL. To zachowanie bywa mylące:
COUNT(*)policzy wszystkie wiersze, w tym te z NULL,COUNT(kolumna)policzy tylko wiersze, w których kolumna nie jest NULL,AVG(kolumna)obliczy średnią tylko z wartości niepustych — co może zawyżyć wynik, jeśli część rekordów jest pusta.
Dlatego przy pracy z danymi, które mogą zawierać NULL, warto świadomie decydować, czy chcemy je uwzględnić, czy pominąć.
Podsumowanie
Funkcje agregujące COUNT, SUM, AVG, MIN i MAX to fundament analizy danych w SQL. W połączeniu z GROUP BY pozwalają obliczać wartości zbiorcze dla dowolnych grup, a HAVING umożliwia filtrowanie tych grup. Pamiętaj o dwóch zasadach: każda niezagregowana kolumna w SELECT musi być w GROUP BY, a wartości NULL są pomijane przez wszystkie funkcje agregujące poza COUNT(*).
Chcesz opanować SQL w praktyce — od podstawowych zapytań po zaawansowaną analizę danych? Sprawdź nasze szkolenia z baz danych i SQL, w tym SQL dla początkujących.
Chcesz poćwiczyć inne zadania z SQL ? sprawdź w darmowym zbiorze zdań



