Funkcje agregujące w SQL

Funkcje agregujące SQL

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ń

Zostaw komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Przewijanie do góry