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).
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.
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.
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).
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 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;