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
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.
SQL1 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ń.
SQL1 2 3 4SELECT 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.
SQL1 2 3SELECT 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.
SQL1 2 3 4SELECT 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.
SQL1 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.
SQL1 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.
SQL1 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
Kompleksowy kurs SQL dla programistów, analityków i wszystkich, którzy chcą efektywnie pracować z danymi. Od podstaw do zaawansowanych zapytań.



