Funkcje agregujące

Funkcje agregujące

Funkcje agregujące działają na zestawie wierszy i zwracają jedną wartość:

COUNT(*) – liczy wszystkie wiersze

COUNT(kolumna) – liczy wiersze, gdzie kolumna nie jest NULL

SUM(kolumna) – suma wartości liczbowych

AVG(kolumna) – średnia

MIN(kolumna) – najmniejsza wartość

MAX(kolumna) – największa wartość

AS – stosuje się w celu użycia innej nazwy kolumny niż wynika to z wyrażenia ją generującego. W efekcie powstają aliasy. Klauzuli tej używa się zwykle przy funkcjach agregacji , gdy powstaje obiekt o powtarzającej się nazwie.

COALESCE w MySQL to funkcja, która zwraca pierwszy nie-NULL-owy argument z podanej listy. Jest bardzo przydatna w sytuacjach, gdy chcemy obsłużyć wartości NULL w danych.

👉 Zwykle łączy się je z GROUP BY.

Ogólna uwaga o NULL
Wszystkie agregaty z wyjątkiem COUNT(*) ignorują wartości NULL. Jeśli chcesz traktować NULL jako 0 (dla SUM/AVG), użyj COALESCE(kolumna, 0).

COUNT

Co robi: liczy wiersze. Różnice:
COUNT(*) — liczy wszystkie wiersze wyniku (bez względu na NULL).
COUNT(kolumna) — liczy tylko wiersze, gdzie kolumna nie jest NULL.
COUNT(DISTINCT kolumna) — liczy różne (unikatowe) wartości.

Przykłady:

— ile produktów w tabeli
SELECT COUNT(*) AS LiczbaProduktow
FROM Products;

— ile produktów ma ustawioną cenę (nie NULL)
SELECT COUNT(UnitPrice) AS LiczbaProduktowZCena, COUNT(*) AS WszystkieProdukty
FROM Products;

— ile różnych krajów jest wśród klientów
SELECT COUNT(DISTINCT Country) AS LiczbaRoznychKrajow
FROM Customers;

— ile zamówień złożył każdy klient (GROUP BY)
SELECT CustomerID, COUNT(*) AS LiczbaZamowien
FROM Orders
GROUP BY CustomerID
ORDER BY LiczbaZamowien DESC
LIMIT 10;

Wskazówka: COUNT(1) działa tak samo jak COUNT(*) w praktyce.

SUM

Co robi: sumuje wartości numeryczne. Pomija NULL.

Uwaga: sumowanie wyrażeń (np. UnitPrice * UnitsInStock) z NULL w którymkolwiek elemencie da NULL dla tego wiersza — agregat wtedy po prostu pominie ten wiersz. Można użyć COALESCE, żeby zamienić NULL na 0.

Przykłady:

— łączna „wartość magazynu” (przybliżenie): suma UnitPrice * UnitsInStock
SELECT SUM(UnitPrice * UnitsInStock) AS WartoscMagazynu
FROM Products;

— to samo, ale bez ryzyka NULL (zamieniamy NULL na 0)
SELECT SUM(COALESCE(UnitPrice,0) * COALESCE(UnitsInStock,0)) AS WartoscMagazynuBezNULL
FROM Products;

— suma ilości dla każdego zamówienia (OrderDetails)
SELECT OrderID, SUM(Quantity) AS SumaIlosci
FROM OrderDetails
GROUP BY OrderID
ORDER BY SumaIlosci DESC
LIMIT 10;

Wskazówka: SUM jest powszechnie używane do obliczania wartości zamówień, stanu magazynu itp.

AVG

Co robi: oblicza średnią arytmetyczną. Pomija NULL.

W MySQL: średnia z integerów może zwracać typ liczbowy z miejscami po przecinku (float/decimal) — możesz formatować przez ROUND(). – zaokrąglenie do ilości miejsc po przecinku np Round(2) =  21,37 zł

Przykłady:

— średnia cena produktu
SELECT AVG(UnitPrice) AS SredniaCena
FROM Products;

— średnia cena z formatowaniem do 2 miejsc po przecinku
SELECT ROUND(AVG(UnitPrice), 2) AS SredniaCenaZaokraglona
FROM Products;

— średnia ilość pozycji w zamówieniu (dla każdego OrderID)
SELECT OrderID, AVG(Quantity) AS SredniaIloscNaPozycje
FROM OrderDetails
GROUP BY OrderID
ORDER BY SredniaIloscNaPozycje DESC
LIMIT 10;

Wskazówka: AVG(col) = SUM(col) / COUNT(col) (przy tym samym zachowaniu NULL).

MIN / MAX

Co robią: zwracają najmniejszą (MIN) lub największą (MAX) wartość w grupie/kolumnie.

Działają na liczbach, datach i tekstach (dla tekstów porządek alfabetyczny).

Pomijają NULL.

Przykłady:

— najtańszy i najdroższy produkt
SELECT MIN(UnitPrice) AS NajtanszyCena, MAX(UnitPrice) AS NajdrozszyCena
FROM Products;

— najwcześniejsza i najpóźniejsza data zatrudnienia
SELECT MIN(HireDate) AS NajwczesniejszaDataZatrudnienia, MAX(HireDate) AS NajpozniejszaDataZatrudnienia
FROM Employees;

— alfabetycznie pierwsza i ostatnia firma (stringi)
SELECT MIN(CompanyName) AS PierwszaFirmaAlfabetycznie, MAX(CompanyName) AS OstatniaFirmaAlfabetycznie
FROM Customers;

— przykład użycia z GROUP BY: najstarsza data zatrudnienia w grupie (np. per kraj, gdyby było sensowne)
SELECT Country, MIN(HireDate) AS NajwczesniejszeZatrudnienie
FROM Employees
GROUP BY Country;

Uwaga praktyczna: Aby otrzymać pełen wiersz odpowiadający minimalnej wartości (np. pracownika z najwcześniejszą datą) zwykle używa się ORDER BY … LIMIT 1 lub podzapytania — MIN() tylko zwróci wartość, nie cały wiersz.

HAVING — filtrowanie po grupach

HAVING działa podobnie do WHERE, ale odnosi się do wyników już pogrupowanych (można w nim użyć funkcji agregujących).

Przykłady:

— tylko klienci, którzy złożyli więcej niż 5 zamówień
SELECT CustomerID, COUNT(*) AS LiczbaZamowien
FROM Orders
GROUP BY CustomerID
HAVING COUNT(*) > 5
ORDER BY LiczbaZamowien DESC;

— kategorie, których łączna wartość magazynu > 10000
SELECT CategoryID, SUM(COALESCE(UnitPrice,0) * COALESCE(UnitsInStock,0)) AS WartoscCategory
FROM Products
GROUP BY CategoryID
HAVING SUM(COALESCE(UnitPrice,0) * COALESCE(UnitsInStock,0)) > 10000;

Kontakt: mgzsp22@gmail.com

© 2025. Wszystkie prawa zastrzeżone.

error: Content is protected !!