Funkcje agregujące w SQL

Kacper Sieradziński
Kacper Sieradziński
23 sierpnia 2025SQL3 min czytania

SELECT bez agregacji to jak Excel bez formuł — niby działa, ale nic nie podsumowuje. Funkcje agregujące to właśnie te „formuły SQL-a”: pozwalają liczyć, sumować, uśredniać i analizować dane bez wychodzenia poza bazę.

Obraz główny Funkcje agregujące w SQL

Zapisz się na nasz newsletter

Otrzymuj regularne aktualizacje, specjalne oferty i porady od ekspertów, które pomogą Ci osiągnąć więcej w krótszym czasie.

Dzięki nim możesz w jednym zapytaniu policzyć sprzedaż per region, średni koszyk klienta, liczbę aktywnych użytkowników czy minimalną i maksymalną wartość zamówienia. To fundament raportowania i analityki w SQL.

W tym artykule zobaczysz, jak działają funkcje COUNT, SUM, AVG, MIN i MAX, jak łączyć je z GROUP BY i HAVING oraz jak uniknąć typowych pułapek wydajnościowych przy dużych tabelach.

Czym są funkcje agregujące

Funkcje agregujące w SQL przetwarzają wiele wierszy i zwracają jedną wartość na cały zbiór lub na każdą grupę. Typowe przykłady to COUNT, SUM, AVG, MIN i MAX. Agregacja danych w SQL ignoruje najczęściej wartości NULL (np. SUM, AVG), wyjątkiem jest COUNT(*) liczące wszystkie wiersze.

Agregacja danych w SQL jest kluczowa w raportowaniu, KPI i podsumowaniach transakcji. Najczęściej łączymy ją z klauzulą GROUP BY, aby policzyć metryki per klient, region lub okres. Jeśli potrzebujesz przypomnienia składni SELECT/WHERE/JOIN/GRUPPOWANIA, zajrzyj do: Podstawy SQL: SELECT, WHERE, JOIN, GROUP BY.

MySQL — Jak zacząć? Darmowy e-book

MySQL — Jak zacząć? Darmowy e-book

Praktyczny przewodnik po świecie SQL. Poznaj typy danych, zapytania SELECT, JOIN, funkcje agregujące i nie tylko.

Najczęściej używane funkcje agregujące

Najczęściej spotykany zestaw to COUNT, SUM, AVG, MIN, MAX (w skrócie: count sum avg min max). Dają szybki obraz wolumenu, wartości, średnich oraz zakresów w danych. Poniżej praktyczne różnice i pułapki.

COUNT()

COUNT liczy rekordy lub niepuste wartości kolumny. Różnica count() vs count(kolumna) jest istotna: COUNT() liczy wszystkie wiersze, a COUNT(kolumna) pomija NULL-e. COUNT(DISTINCT kolumna) liczy unikalne, niepuste wartości.

SQL
1 2 3 4 5 6 -- Porównanie z NULL-ami SELECT COUNT(*) AS wierszy_w_sumie, COUNT(customer_id) AS niepuste_customer_id, COUNT(DISTINCT country) AS unikalne_kraje FROM orders;

SUM()

SUM sumuje wartości liczbowe, ignorując NULL-e. Aby wykonać sum z warunkiem SQL, używaj CASE wewnątrz agregacji. To elastyczny sposób na liczenie metryk wg statusów bez dodatkowych zapytań.

SQL
1 2 3 4 SELECT SUM(amount) AS suma_wszystkich, SUM(CASE WHEN status = 'paid' THEN amount ELSE 0 END) AS suma_oplaconych FROM payments;

AVG()

AVG zwraca średnią arytmetyczną. Jeśli kolumna jest całkowita, w zależności od silnika warto jawnie rzutować na typ dziesiętny. Do prezentacji użyj zaokrąglania: avg zaokrąglanie SQL z ROUND.

SQL
1 2 3 SELECT ROUND(AVG(CAST(amount AS DECIMAL(12,2))), 2) AS srednia_kwota_2_miejsca FROM payments;

MIN() i MAX()

MIN i MAX zwracają odpowiednio najmniejszą i największą wartość. W raportach (min i max w raportach) często służą do ustalenia zakresów dat, cen czy ostatniej aktywności użytkownika.

SQL
1 2 3 4 SELECT MIN(order_date) AS pierwsze_zamowienie, MAX(order_date) AS ostatnie_zamowienie FROM orders;

Funkcje agregujące z GROUP BY

GROUP BY dzieli dane na grupy według jednej lub wielu kolumn (group by kilka kolumn), a następnie stosuje funkcje agregujące w każdej grupie. To standard do budowy przekrojów typu sprzedaż per region, kategoria czy miesiąc.

SQL
1 2 3 4 5 6 7 8 9 10 11 -- Sprzedaż według regionów SELECT region, COUNT(*) AS liczba_zamowien, SUM(total_amount) AS suma_sprzedazy, ROUND(AVG(total_amount), 2) AS sr_zamowienia, MIN(total_amount) AS min_zamowienie, MAX(total_amount) AS max_zamowienie FROM sales GROUP BY region ORDER BY suma_sprzedazy DESC;

Jeśli potrzebujesz metryk „per wiersz” bez redukcji liczby rekordów, rozważ alternatywę: Funkcje okienkowe w SQL.

Łączenie z HAVING

HAVING filtruje wyniki po agregacji, czyli działa na poziomie grup. To naturalny duet: group by i having. Dzięki temu wybierzesz tylko te grupy, które spełniają warunki na SUM/COUNT/AVG.

SQL
1 2 3 4 5 6 7 8 9 -- Tylko regiony z SUM > 1000 i przynajmniej 10 zamówieniami SELECT region, SUM(total_amount) AS suma_sprzedazy, COUNT(*) AS liczba_zamowien FROM sales GROUP BY region HAVING SUM(total_amount) > 1000 AND COUNT(*) >= 10;

Wydajność funkcji agregujących

Wydajność agregacji SQL zależy głównie od selektywności filtrów i możliwości użycia indeksów a agregacja. Indeksy na kolumnach filtrujących i grupujących zmniejszają zakres skanowania i koszt sortowania/hashowania. MIN/MAX potrafią w niektórych silnikach użyć skanu indeksowego od końca, a COUNT(*) bywa specjalnie optymalizowany.

Dobry punkt startowy to indeks na kolumnie grupującej i filtrach. Przy ciężkich raportach rozważ preagregację lub materializowany widok sql odświeżany w harmonogramie.

SQL
1 2 -- Indeks wspiera WHERE i GROUP BY po regionie CREATE INDEX idx_sales_region ON sales(region);

Więcej o doborze indeksów: Indeksy w SQL: teoria i praktyka.

Podsumowanie

Funkcje agregujące w SQL to podstawowe narzędzie analizy: COUNT, SUM, AVG, MIN, MAX w połączeniu z GROUP BY i HAVING dają większość przekrojów raportowych. Łączenie funkcji agregujących w jednym zapytaniu pozwala efektywnie policzyć wiele metryk naraz.

Dla dużych zbiorów zwracaj uwagę na wydajność agregacji SQL, indeksy i ewentualną preagregację. Jeśli zapytania są wolne, sprawdź plany wykonania i optymalizacje: Optymalizacja zapytań SQL i plany wykonania.

Kurs SkumajBazy — Czas w końcu nauczyć się SQLa

Kurs SkumajBazy — Czas w końcu nauczyć się SQLa

Kompleksowy kurs SQL dla programistów, analityków i wszystkich, którzy chcą efektywnie pracować z danymi. Od podstaw do zaawansowanych zapytań.