łatwySQLSQL

SQL Funkcje Agregujące (COUNT, SUM, AVG, MIN, MAX)

15 min czytania
SQL
Zaktualizowano: 4.11.2025

Funkcje agregujące to potężne narzędzia w SQL, które pozwalają 'zwinąć' całą kolumnę (lub grupę wierszy) do jednej wartości. Zamiast pobierać tysiące pojedynczych wierszy, możesz natychmiast odpowiedzieć na pytania: 'Ile jest wszystkich produktów?' (COUNT), 'Jaka jest łączna wartość magazynu?' (SUM), 'Jaka jest średnia cena?' (AVG), 'Jaki jest najtańszy produkt?' (MIN) lub 'Jaki jest najdroższy produkt?' (MAX). Są to fundamentalne operacje, które pozwalają na analizę i tworzenie podsumowań danych. Na maturze są one absolutnie kluczowe do odpowiadania na pytania statystyczne.

Dlaczego to ważne? Na maturze bardzo rzadko jesteś proszony o wypisanie wszystkich danych. Zazwyczaj zadanie brzmi: 'Podaj liczbę...', 'Oblicz sumę...', 'Znajdź największą...'. Wszystkie te polecenia wprost sugerują użycie funkcji agregujących. Użyjesz ich w prawie każdym zadaniu SQL, najczęściej w połączeniu z WHERE (do filtrowania) lub GROUP BY (do tworzenia podsumowań dla grup).

Teoria

Funkcja agregująca wykonuje obliczenie na zestawie wierszy i zwraca pojedynczą wartość. Jest ona stosowana w klauzuli SELECT (aby wyświetlić wynik) lub HAVING (aby filtrować grupy na podstawie wyniku agregacji).

Jak to działa?

  1. COUNT(*): Zlicza całkowitą liczbę wierszy w tabeli lub grupie.
  2. COUNT(kolumna): Zlicza liczbę wierszy, w których kolumna ma wartość inną niż NULL.
  3. SUM(kolumna): Sumuje wszystkie wartości w kolumna. Działa tylko dla typów numerycznych.
  4. AVG(kolumna): Oblicza średnią arytmetyczną wartości w kolumna. Działa tylko dla typów numerycznych.
  5. MIN(kolumna): Znajduje najmniejszą wartość w kolumna (działa na liczbach, tekstach i datach).
  6. MAX(kolumna): Znajduje największą wartość w kolumna (działa na liczbach, tekstach i datach).
  7. Jeśli są użyte bez GROUP BY, działają na całej tabeli (po filtracji WHERE).
  8. Jeśli są użyte z GROUP BY, działają oddzielnie dla każdej utworzonej grupy.

Złożoność: Nie dotyczy w tradycyjnym sensie O(n). Wydajność zależy od konieczności przeskanowania całej tabeli lub grupy, ale na maturze są to zawsze operacje uważane za szybkie.

Implementacja

COUNT - Zliczanie wierszy

SQL
-- Ilu jest wszystkich uczniów?
SELECT COUNT(*) AS LiczbaWszystkichUczniow
FROM Uczniowie;

-- Ilu uczniów jest w klasie '1A'?
SELECT COUNT(*)
FROM Uczniowie
WHERE klasa = '1A';

-- Ilu uczniów ma wpisany numer telefonu (pomija NULLe)?
SELECT COUNT(telefon)
FROM Uczniowie;

`COUNT(*)` to najczęstszy sposób na policzenie 'ile czegoś jest'. `AS` służy do nadania przyjaznej nazwy kolumnie wynikowej. Zwróć uwagę na różnicę między `COUNT(*)` (liczy wiersze) a `COUNT(kolumna)` (liczy wartości nie-NULL).

SUM i AVG - Sumowanie i uśrednianie

SQL
-- Jaka jest łączna cena wszystkich produktów?
SELECT SUM(cena) AS LacznaWartosc
FROM Produkty;

-- Jaka jest średnia cena produktów z kategorii 'Nabiał'?
SELECT AVG(cena) AS SredniaCenaNabialu
FROM Produkty
WHERE kategoria = 'Nabiał';

`SUM` i `AVG` działają tylko na kolumnach numerycznych. Można je (i należy) łączyć z `WHERE`, aby obliczać statystyki tylko dla interesującego nas podzbioru danych.

MIN i MAX - Wartości skrajne

SQL
-- Jaka jest cena najtańszego i najdroższego produktu?
SELECT MIN(cena) AS CenaMin, MAX(cena) AS CenaMax
FROM Produkty;

-- Kto jest pierwszy alfabetycznie na liście uczniów?
SELECT MIN(nazwisko) AS PierwszeNazwisko
FROM Uczniowie;

`MIN` i `MAX` działają również na tekstach, sortując je alfabetycznie. `MIN(nazwisko)` da nazwisko najbliższe literze 'A', a `MAX(nazwisko)` - najbliższe 'Z'.

Przykładowe Zadania Maturalne

Matura 2026Zadanie Zadanie Typu Maturalnego 1

Masz tabelę 'Samochody' (rejestracja, marka, rok_produkcji, pojemnosc). Napisz zapytanie SQL, które obliczy i poda średnią pojemność (pojemnosc) wszystkich samochodów marki 'Ford'.

Wskazówka: Potrzebujesz funkcji agregującej AVG() zastosowanej do kolumny pojemnosc. Musisz też przefiltrować dane za pomocą WHERE, aby liczyć średnią tylko dla wierszy, gdzie marka to 'Ford'.

Pokaż szkic rozwiązania
1. Wybierz funkcję agregującą: `SELECT AVG(pojemnosc)`
2. Wskaż tabelę: `FROM Samochody`
3. Dodaj filtr: `WHERE marka = 'Ford';`
4. Pełne zapytanie: `SELECT AVG(pojemnosc) FROM Samochody WHERE marka = 'Ford';`
Matura 2025Zadanie 7.1 (Matura Czerwiec 2025)

W bazie danych są tabele: 'Klienci' (id_klienta, imie, nazwisko), 'Wizyty' (id_wizyty, id_klienta, id_uslugi) oraz 'Uslugi' (id_uslugi, nazwa, cena). Podaj imię i nazwisko osoby, która wydała najwięcej na usługi fryzjerskie. Podaj również sumę jej wydatków.

Wskazówka: To złożone zadanie. Musisz: 1) Połączyć (JOIN) wszystkie 3 tabele. 2) Pogrupować (GROUP BY) wyniki po id_klienta (lub imieniu i nazwisku). 3) Obliczyć SUM(Uslugi.cena) dla każdej grupy. 4) Posortować (ORDER BY) wyniki malejąco (DESC) wg tej sumy. 5) Wybrać tylko pierwszy wiersz (LIMIT 1).

Pokaż szkic rozwiązania
1. Wybierz dane: `SELECT K.imie, K.nazwisko, SUM(U.cena) AS SumaWydatkow`
2. Wskaż tabele i połącz je: `FROM Klienci AS K JOIN Wizyty AS W ON K.id_klienta = W.id_klienta JOIN Uslugi AS U ON W.id_uslugi = U.id_uslugi`
3. Zgrupuj: `GROUP BY K.id_klienta, K.imie, K.nazwisko`
4. Posortuj malejąco: `ORDER BY SumaWydatkow DESC`
5. Wybierz tylko górny wiersz: `LIMIT 1;`

Częste Błędy

Używanie WHERE zamiast HAVING

Chcesz znaleźć klasy z ponad 30 uczniami i piszesz: ... WHERE COUNT() > 30. To błąd. WHERE filtruje przed* agregacją. COUNT nie jest jeszcze znany.

Poprawka: Do filtrowania na wynikach funkcji agregujących (np. COUNT, SUM) służy klauzula HAVING. Poprawnie: ... GROUP BY klasa HAVING COUNT(*) > 30.

Mieszanie kolumn z agregatami (bez GROUP BY)

Piszesz: SELECT klasa, COUNT() FROM Uczniowie;. To błąd. Baza nie wie, którą 'klasę' ma wyświetlić obok ogólnej liczby wszystkich* uczniów.

Poprawka: Jeśli w SELECT jest funkcja agregująca i zwykła kolumna, musisz dodać GROUP BY dla tej zwykłej kolumny: SELECT klasa, COUNT(*) FROM Uczniowie GROUP BY klasa;.

Różnica między COUNT(*) a COUNT(kolumna)

Masz 100 uczniów, ale 10 nie ma wpisanego maila. COUNT(*) da 100. COUNT(email) da 90, ponieważ COUNT(kolumna) ignoruje wartości NULL.

Poprawka: Do liczenia wierszy zawsze używaj COUNT(). COUNT(kolumna) używaj tylko, gdy chcesz policzyć, ile jest wypełnionych* (niepustych) pól w tej kolumnie.

AVG na liczbach całkowitych (INT)

W niektórych systemach SQL, jeśli kolumna cena jest typu INT, AVG(cena) może zwrócić INT (np. 3 zamiast 3.5). To obcina wynik.

Poprawka: Na maturze zazwyczaj pracujesz na MySQL, który zwykle zwraca float. Aby być bezpiecznym, można rzutować: AVG(CAST(cena AS DECIMAL(10,2))) lub AVG(cena * 1.0).

Kluczowe Wnioski

  • Funkcje agregujące 'zwijają' wiele wierszy do jednej wartości.
  • COUNT(*) - liczy wiersze.
  • SUM(kolumna) - sumuje wartości w kolumnie.
  • AVG(kolumna) - liczy średnią wartość w kolumnie.
  • MIN(kolumna) / MAX(kolumna) - znajdują najmniejszą / największą wartość.
  • Mogą być używane na całej tabeli (z WHERE) lub na grupach (z GROUP BY).
  • HAVING to WHERE dla wyników funkcji agregujących (np. HAVING SUM(cena) > 1000).

Najczęściej Zadawane Pytania

Jaka jest różnica między `COUNT(*)` a `COUNT(1)`?

W praktyce - żadna. Oba zliczają wszystkie wiersze w grupie. `COUNT(*)` jest bardziej standardowe i czytelne, ale oba działają tak samo szybko.

Czy mogę użyć `AVG(SUM(cena))`?

Nie, nie można zagnieżdżać funkcji agregujących (np. 'średnia z sumy'). Takie operacje wykonuje się za pomocą zapytań zagnieżdżonych (podzapytań).

Jak policzyć *unikalne* wartości w kolumnie?

Użyj słowa kluczowego `DISTINCT`. Na przykład: `SELECT COUNT(DISTINCT klasa) FROM Uczniowie;` policzy, ile jest różnych klas (np. '1A', '1B', '2A' -> 3).

Co się stanie, jeśli użyję `SUM` na kolumnie tekstowej?

W większości systemów (jak MySQL) dostaniesz wynik 0 lub ostrzeżenie. Te funkcje działają tylko na danych numerycznych. Wyjątkiem są `MIN` i `MAX`, które działają na tekście (alfabetycznie).

Chcesz opanować wszystkie tematy maturalne?

Dołącz do kursu i zyskaj dostęp do interaktywnych lekcji, edytora kodu i setek zadań.

Powiązane Tematy