MySQL Funkcje agregujące: SUMA, LICZNIK, AVG & MAX

⚡ Inteligentne podsumowanie

Funkcje agregujące w MySQL Wykonuje obliczenia w wielu wierszach jednej kolumny i zwraca jedną sumaryczną wartość. Pięć standardowych funkcji ISO — LICZNIK, SUMA, AVG, MIN i MAX — wspomagają niemal każdy raport generowany przez bazę danych.

  • 🔢 Zachowanie COUNT: Funkcja COUNT(kolumna) ignoruje wartości NULL, natomiast funkcja COUNT(*) zlicza wszystkie wiersze w tabeli, łącznie z duplikatami i wartościami NULL.
  • ???? Słowo kluczowe DISTINCT: DISTINCT usuwa zduplikowane wartości przed wykonaniem obliczeń; ALL jest opcją domyślną i zachowuje je.
  • 📉 MIN i MAX: Funkcja MIN zwraca najmniejszą wartość w kolumnie, a funkcja MAX zwraca największą wartość, niezależnie od typu danych: liczbowego, ciągu znaków i daty.
  • SUMA i AVG: Oba działają tylko na kolumnach numerycznych i oba wykluczają wiersze NULL ze zwracanych wyników.
  • 📊 GRUPUJ WEDŁUG Parowania: Dodanie GROUP BY zamienia pojedynczą wartość podsumowującą na jeden wiersz podsumowujący na grupę.
  • ⚠️ Pułapka NULL: AVG dzieli tylko przez liczbę wierszy różnych od NULL, więc wartości brakujące po cichu podnoszą średnią.

Czym są funkcje agregujące w MySQL?

An funkcja zagregowana Odczytuje wiele wierszy z jednej kolumny i łączy je w jedną wartość. Funkcje agregujące polegają na:

  • Wykonywanie obliczeń na wielu wierszach
  • Pojedynczej kolumny tabeli
  • I zwrócenie pojedynczej wartości.

Norma ISO definiuje pięć (5) funkcji agregacyjnych, a mianowicie:

  1. COUNT
  2. SUMA
  3. AVG
  4. MIN
  5. MAX

Do wszystkich pięciu stosuje się jedną zasadę: funkcje agregujące ignorują wartości NULL. COUNT(*) jest jedynym wyjątkiem, którego przyczyny przedstawiamy poniżej.

Dlaczego warto używać funkcji agregujących

Różne poziomy organizacji mają różne wymagania informacyjne. Menedżerowie najwyższego szczebla zazwyczaj interesują się liczbami całkowitymi, a nie pojedynczymi szczegółami.

Funkcje agregujące pozwalają nam łatwo generować podsumowania danych z naszej bazy danych.

Na przykład z naszej bazy danych myflix kierownictwo może wymagać następujących raportów:

  • Najmniej wypożyczane filmy.
  • Najczęściej wypożyczane filmy.
  • Średnia liczba wypożyczeń każdego filmu w miesiącu.

Wszystkie powyższe raporty pochodzą z funkcji agregujących. Przyjrzyjmy się każdemu z nich szczegółowo.

funkcja LICZENIE

Funkcja COUNT zwraca całkowitą liczbę wartości w określonym polu, zarówno w przypadku danych liczbowych, jak i nieliczbowych. Jak każda funkcja agregująca, COUNT(kolumna) wyklucza wartości NULL.

COUNT(*) to specjalny formularz, który zwraca liczbę wszystkich wierszy w tabeli. Zlicza również NULL i duplikaty, ponieważ zlicza wiersze, a nie wartości.

Tabela movierentals zawiera następujące dane:

numer referencyjny Data dokonania transakcji Data powrotu numer członkostwa identyfikator_filmu film_ powrócił
11 20-06-2012 NULL 1 1 0
12 22-06-2012 25-06-2012 1 2 0
13 22-06-2012 25-06-2012 3 2 0
14 21-06-2012 24-06-2012 2 2 0
15 23-06-2012 NULL 3 3 0

Załóżmy, że chcemy dowiedzieć się, ile razy film o identyfikatorze 2 został wypożyczony.

SELECT COUNT(`movie_id`) FROM `movierentals` WHERE `movie_id` = 2;

Wykonanie tego w MySQL Workbench w przypadku myflixdb zwracana jest wartość 3, ponieważ trzy wiersze zawierają movie_id o wartości 2.

LICZBA(`id_filmu`)
3

WYRÓŻNIONE słowo kluczowe

COUNT odpowiada „ile”. Następne pytanie zazwyczaj brzmi „ile różne „jedynki”, i do tego właśnie służy DISTINCT.

WYRÓŻNIONE słowo kluczowe

Słowo kluczowe DISTINCT pomija duplikaty w naszych wynikach według grupping identyczne wartości razem, dokładnie tak jak sugeruje powyższa ilustracja.

Najpierw wykonajmy proste zapytanie.

SELECT `movie_id` FROM `movierentals`;
identyfikator_filmu
1
2
2
2
3

Teraz to samo zapytanie ze słowem kluczowym DISTINCT:

SELECT DISTINCT `movie_id` FROM `movierentals`;

DISTINCT pomija duplikaty rekordów:

identyfikator_filmu
1
2
3

COUNT vs COUNT(*) vs COUNT(DISTINCT): Której opcji powinieneś użyć?

Można również umieścić DISTINCT wewnątrz funkcja agregacyjna i to właśnie tutaj większość początkujących przegrywa track wierszy, z których wiersze są faktycznie liczone. Wszystkie cztery poniższe formularze działają na tej samej pięciowierszowej tabeli movierentals, pokazanej wcześniej, ale nie wszystkie zwracają tę samą liczbę. Różnica sprowadza się do dwóch pytań: czy formularz zlicza wiersze, czy wartości, i czy zachowuje duplikaty?

Forma Co się liczy Wynik w wypożyczalniach filmów
LICZYĆ(*) Każdy wiersz, łącznie z duplikatami i wierszami, które są w całości NULL 5
LICZBA(`id_filmu`) Każda wartość inna niż NULL w kolumnie, łącznie z duplikatami 5
LICZBA(`data_zwrotu`) Tylko wartości inne niż NULL — dwie daty zwrotu NULL są pomijane 3
LICZBA(ODMIENNE `id_filmu`) Tylko unikalne wartości inne niż NULL 3
SELECT COUNT(*) AS `all_rows`,
       COUNT(`return_date`) AS `returned_rows`,
       COUNT(DISTINCT `movie_id`) AS `unique_movies`
FROM `movierentals`;

💡 Wskazówka: Użyj COUNT(*) do zliczania wierszy, COUNT(kolumna), gdy NULL oznacza „nie dotyczy”, oraz COUNT(DISTINCT kolumna) dla wartości unikatowych. Przeciwieństwem DISTINCT jest ALL — wartość domyślna, dlatego rzadko zapisywana.

Funkcja MIN

Funkcja MIN zwraca najmniejszą wartość w określonym polu tabeli.

Załóżmy, że chcemy poznać rok premiery najstarszego filmu w naszej bibliotece. MySQLFunkcja MIN daje nam to.

SELECT MIN(`year_released`) FROM `movies`;

Wynik:

MIN(`rok_wydania`)
2005

Funkcja MAX

Jak sama nazwa wskazuje, funkcja MAX jest przeciwieństwem funkcji MIN. To zwraca największą wartość z określonego pola tabeli.

Załóżmy, że chcemy poznać rok premiery najnowszego filmu w naszej bazie danych. Poniższy przykład zwraca ten rok.

SELECT MAX(`year_released`) FROM `movies`;

Wynik:

MAX(`rok_wydania`)
2012

Funkcja SUM

MIN i MAX pobierają istniejącą wartość z kolumny. SUMA i AVG obliczyć nową liczbę z całej kolumny.

Załóżmy, że chcemy poznać całkowitą kwotę dotychczas dokonanych płatności. MySQL SUMA funkcjonować zwraca sumę wszystkich wartości w określonej kolumnie. Funkcja SUM działa tylko na polach numerycznych, Wartości NULL są wykluczane z wyniku.

Poniższa tabela przedstawia dane zawarte w tabeli płatności.

identyfikator płatności numer członkostwa termin płatności opis opłata zapłacona zewnętrzny_numer referencyjny
1 1 23-07-2012 Opłata za wypożyczenie filmu 2500 11
2 1 25-07-2012 Opłata za wypożyczenie filmu 2000 12
3 3 30-07-2012 Opłata za wypożyczenie filmu 6000 NULL

Poniższe zapytanie pobiera wszystkie dokonane płatności i sumuje je w pojedynczy wynik: 2500 + 2000 + 6000 = 10500.

SELECT SUM(`amount_paid`) FROM `payments`;

Wynik:

SUMA(`kwota_zapłacona`)
10500

AVG funkcjonować

MySQL AVG funkcjonować zwraca średnią wartości w określonej kolumnie. Podobnie jak funkcja SUMA działa tylko na numerycznych typach danych.

Załóżmy, że chcemy znaleźć średnią kwotę płatności. Możemy użyć następującego zapytania, które dzieli sumę 10500 przez trzy wiersze płatności różne od NULL.

SELECT AVG(`amount_paid`) FROM `payments`;

Wynik:

AVG(`kwota_zapłacona`)
3500

⚠️ Ostrzeżenie: AVG Dzieli przez liczbę wierszy innych niż NULL, a nie przez liczbę wierszy w tabeli. Wartość NULL jest pomijana, a nie liczona jako zero, co dyskretnie podnosi średnią. Użyj AVG(IFNULL(`amount_paid`, 0)), gdy brakująca wartość oznacza zero.

Przykład praktyczny: łączenie funkcji agregujących z GROUP BY

Każda z powyższych funkcji zwróciła jedną wartość dla całej tabeli. Dodanie GRUPUJ WEDŁUG klauzula zwraca jedną liczbę na grupę zamiast tego — i tak właśnie powstają prawdziwe raporty.

Poniższy przykład grupuje członków według nazwy, a następnie zlicza łączną liczbę płatności, średnią kwotę płatności i całkowitą sumę kwot płatności dla każdego członka.

SELECT m.`full_names`,
       COUNT(p.`payment_id`) AS `paymentscount`,
       AVG(p.`amount_paid`) AS `averagepaymentamount`,
       SUM(p.`amount_paid`) AS `totalpayments`
FROM members m, payments p
WHERE m.`membership_number` = p.`membership_number`
GROUP BY m.`full_names`;

Wykonanie powyższego przykładu w MySQL Workbench daje nam następujące wyniki.

AVG funkcja używana z GROUP BY

Zapytanie łączy dwie tabele w klauzuli WHERE — w starszym stylu łączenia przecinkami. Współczesny kod zapisuje tę samą logikę, co jawny kod. WEWNĘTRZNE POŁĄCZENIE … WŁĄCZONE. Należy również pamiętać, że każda niezagregowana kolumna na liście SELECT musi znajdować się w GROUP BY lub MySQL Wersje 5.7 i nowsze odrzucają zapytanie w ramach ONLY_FULL_GROUP_BY. Zobacz urzędnik MySQL odwołanie do funkcji agregującej.

FAQ

klauzula GDZIE Filtruje pojedyncze wiersze przed obliczeniem agregatu. HAVING filtruje zgrupowane wyniki później, więc tylko HAVING może odwoływać się do agregatu, takiego jak COUNT(*) lub SUM(kwota_zapłacona).

Tak. Bez GROUP BY agregat traktuje cały zestaw wyników jako jedną grupę i zwraca dokładnie jeden wiersz. Dodanie GROUP BY dzieli ten wynik na jeden wiersz dla każdej odrębnej wartości grupy.

Tak. W przeciwieństwie do SUMY i AVGFunkcje MIN i MAX działają na dowolnym porównywalnym typie. W kolumnie tekstowej zwracają alfabetycznie pierwszą i ostatnią wartość, a w kolumnie dat – najwcześniejszą i najpóźniejszą datę.

Tak. Asystenci tekstowi SQL tłumaczą pytania takie jak „średnia płatność na członka” na zapytanie GROUP BY. Uruchom wygenerowany kod SQL w MySQL Workbench i sprawdź liczbę wierszy zanim zawierzysz liczbom.

Najczęstszą przyczyną jest obsługa wartości NULL i zduplikowane wiersze łączenia. Model AI może wybrać COUNT(*) tam, gdzie potrzebna jest COUNT(kolumna), lub połączyć tabelę dwukrotnie, co powoduje wzrost wartości każdej sumy. Zawsze weryfikuj wynik względem znanej wartości.

Podsumuj ten post następująco: