MySQL Funzioni aggregate: SOMMA, CONTA, AVG & MAX

⚡ Riepilogo intelligente

Funzioni aggregate in MySQL eseguire un calcolo su più righe di una singola colonna e restituire un valore riepilogativo. Le cinque funzioni standard ISO — CONTA.NUMERI, SOMMA, AVG, MIN e MAX: questi sono i parametri che alimentano quasi tutti i report prodotti da un database.

  • 🔢 COUNT Comportamento: COUNT(colonna) ignora i valori NULL, mentre COUNT(*) conta ogni riga della tabella, inclusi i duplicati e i valori NULL.
  • 🚫 Parola chiave DISTINCT: DISTINCT rimuove i valori duplicati prima dell'esecuzione del calcolo; ALL è l'impostazione predefinita e li mantiene.
  • 📉 MIN e MAX: La funzione MIN restituisce il valore più piccolo in una colonna e MAX restituisce il valore più grande, indipendentemente dal tipo di dato: numerico, stringa o data.
  • SOMMA e AVG: Entrambi i metodi operano solo su colonne numeriche ed entrambi escludono le righe con valori NULL dal risultato restituito.
  • 📊 RAGGRUPPAMENTO PER ABBINAMENTO: L'aggiunta di GROUP BY trasforma un singolo dato riassuntivo in una riga riassuntiva per ciascun gruppo.
  • ⚠️ Trappola NULL: AVG divide solo per il numero di righe non NULL, quindi i valori mancanti aumentano silenziosamente la media.

Che cosa sono le funzioni aggregate in MySQL?

An funzione di aggregazione Legge molte righe di una singola colonna e le aggrega in un unico valore. Le funzioni di aggregazione riguardano principalmente:

  • Esecuzione di calcoli su più righe
  • Di una singola colonna di una tabella
  • E restituendo un singolo valore.

Lo standard ISO definisce cinque (5) funzioni aggregate, vale a dire:

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

Una sola regola vale per tutte e cinque: Le funzioni aggregate ignorano i valori NULL. COUNT(*) è l'unica eccezione, e di seguito ne analizzeremo il motivo.

Perché utilizzare le funzioni aggregate

I diversi livelli organizzativi hanno esigenze informative differenti. I dirigenti di livello superiore sono generalmente interessati ai dati complessivi, non ai singoli dettagli.

Le funzioni aggregate ci consentono di produrre facilmente dati riepilogati dal nostro database.

Ad esempio, dal nostro database MyFlix, la direzione potrebbe richiedere i seguenti report:

  • Film meno noleggiati.
  • Film più noleggiati.
  • Numero medio di volte in cui ciascun film viene noleggiato in un mese.

Tutti i report sopra riportati derivano da funzioni aggregate. Analizziamoli uno per uno nel dettaglio.

CONTEGGIO

La funzione CONTA.VALORI restituisce il numero totale di valori nel campo specificato, sia per i tipi di dati numerici che non numerici. Come ogni funzione di aggregazione, COUNT(colonna) esclude i valori NULL.

COUNT(*) è una forma speciale che restituisce il conteggio di tutte le righe in una tabella. Conta anche NULL e i duplicati, perché conta le righe anziché i valori.

La tabella movierentals contiene i seguenti dati:

numero di riferimento data_transazione data di ritorno numero_iscrizione id_film film_ restituito
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

Supponiamo di voler ottenere il numero di volte in cui il film con ID 2 è stato noleggiato.

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

Eseguendo questo in MySQL banco di lavoro Il test con myflixdb restituisce 3, perché tre righe contengono movie_id 2.

COUNT(`movie_id`)
3

Parola chiave DISTINTA

COUNT risponde a “quanti”. La domanda successiva è solitamente “quanti diverso "uno", ed è a questo che serve DISTINCT.

Parola chiave DISTINTA

La parola chiave DISTINCT omette i duplicati dai nostri risultati per gruppoping valori identici insieme, esattamente come suggerisce l'illustrazione sopra.

Innanzitutto, eseguiamo una semplice query.

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

Ora la stessa query con la parola chiave DISTINCT:

SELECT DISTINCT `movie_id` FROM `movierentals`;

DISTINCT omette i record duplicati:

id_film
1
2
3

COUNT vs COUNT(*) vs COUNT(DISTINCT): Quale dovresti usare?

DISTINCT può anche essere posizionato interno una funzione aggregata, ed è qui che la maggior parte dei principianti si perde track delle quali vengono effettivamente contate. I quattro moduli seguenti vengono tutti eseguiti sulla stessa tabella di cinque righe "noleggi film" mostrata in precedenza, eppure non restituiscono tutti lo stesso numero. La differenza si riduce a due domande: il modulo conta le righe o i valori e mantiene i duplicati?

Modulo Ciò che conta Risultati su noleggio film
CONTARE(*) Ogni riga, comprese le righe duplicate e quelle interamente NULL 5
COUNT(`movie_id`) Ogni valore non NULL nella colonna, duplicati inclusi 5
COUNT(`return_date`) Solo valori non NULL: le due date di ritorno NULL vengono ignorate. 3
COUNT(DISTINCT `movie_id`) Solo valori univoci non NULL 3
SELECT COUNT(*) AS `all_rows`,
       COUNT(`return_date`) AS `returned_rows`,
       COUNT(DISTINCT `movie_id`) AS `unique_movies`
FROM `movierentals`;

Suggerimento: Utilizzare COUNT(*) per contare le righe, COUNT(colonna) quando un valore NULL deve significare "non applicabile" e COUNT(DISTINCT colonna) per i valori univoci. L'opposto di DISTINCT è ALL, che è l'impostazione predefinita e quindi raramente viene utilizzata.

Funzione MIN

La funzione MINIMO restituisce il valore più piccolo nel campo della tabella specificata.

Supponiamo di voler conoscere l'anno di uscita del film più vecchio presente nella nostra collezione. MySQLLa funzione MIN ci fornisce questo.

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

Risultato:

MIN(`year_released`)
2005

Funzione MAX

Proprio come suggerisce il nome, la funzione MAX è l'opposto della funzione MIN. Esso restituisce il valore più grande dal campo della tabella specificata.

Supponiamo di voler conoscere l'anno di uscita dell'ultimo film presente nel nostro database. L'esempio seguente lo restituisce.

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

Risultato:

MAX(`year_released`)
2012

Funzione SUM

MIN e MAX selezionano un valore esistente da una colonna. SUM e AVG Calcola un nuovo numero utilizzando l'intera colonna.

Supponiamo di voler conoscere l'importo totale dei pagamenti effettuati finora. MySQL SUM funzione restituisce la somma di tutti i valori nella colonna specificata. SOMMA funziona solo su campi numericie I valori NULL vengono esclusi dal risultato.

La tabella seguente mostra i dati contenuti nella tabella dei pagamenti.

pagamento_id numero_iscrizione data di pagamento descrizione importo pagato numero_di_riferimento_esterno
1 1 23-07-2012 Pagamento del noleggio del film 2500 11
2 1 25-07-2012 Pagamento del noleggio del film 2000 12
3 3 30-07-2012 Pagamento del noleggio del film 6000 NULL

La query mostrata di seguito recupera tutti i pagamenti effettuati e li somma in un unico risultato: 2500 + 2000 + 6000 = 10500.

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

Risultato:

SOMMA(`importo_pagato`)
10500

AVG funzione

Migliori MySQL AVG funzione restituisce la media dei valori in una colonna specificata. Proprio come la funzione SOMMA, it funziona solo su tipi di dati numerici.

Supponiamo di voler trovare l'importo medio pagato. Possiamo utilizzare la seguente query, che divide il totale di 10500 per le tre righe di pagamento non NULL.

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

Risultato:

AVG(importo pagato)
3500

⚠️ Attenzione: AVG divide per il numero di righe non NULL, non per il conteggio delle righe della tabella. Un valore NULL viene saltato anziché contato come zero, il che fa aumentare silenziosamente la media. Utilizzare AVG(SE NULL(`importo_pagato`, 0)) quando un valore mancante significa zero.

Esempio pratico: combinazione di funzioni di aggregazione con GROUP BY

Ciascuna funzione sopra ha restituito una cifra per l'intera tabella. Aggiungendo un RAGGRUPPA PER la clausola restituisce una cifra per gruppo invece — ed è così che si costruiscono i report reali.

L'esempio seguente raggruppa i membri per nome, quindi conta il numero totale di pagamenti, l'importo medio del pagamento e il totale complessivo degli importi dei pagamenti per ciascun membro.

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`;

Eseguendo l'esempio precedente in MySQL Workbench ci fornisce i seguenti risultati.

AVG funzione utilizzata con GROUP BY

La query unisce le due tabelle nella clausola WHERE, secondo il vecchio stile di join con virgola. Il codice moderno scrive la stessa logica come un esplicito GIUNZIONE INTERNA … SU. Nota inoltre che ogni colonna non aggregata nell'elenco SELECT deve apparire in GROUP BY, oppure MySQL 5.7 e versioni successive rifiutano la query sotto ONLY_FULL_GROUP_BY. Vedi il ufficiale MySQL riferimento alla funzione aggregata.

DOMANDE FREQUENTI

Migliori Dove la clausola filtra le singole righe prima che venga calcolato l'aggregato. HAVING filtra i risultati raggruppati successivamente, quindi solo HAVING può fare riferimento a un aggregato come COUNT(*) o SUM(amount_paid).

Sì. Senza GROUP BY, l'aggregazione considera l'intero set di risultati come un unico gruppo e restituisce esattamente una riga. Aggiungendo GROUP BY, il risultato viene suddiviso in una riga per ogni valore di gruppo distinto.

Sì. A differenza di SOMMA e AVGLe funzioni MIN e MAX funzionano su qualsiasi tipo di dato comparabile. Su una colonna di testo restituiscono il primo e l'ultimo valore in ordine alfabetico, mentre su una colonna di date restituiscono la data più vecchia e quella più recente.

Sì. Gli assistenti Text-to-SQL traducono domande come "pagamento medio per membro" in una query GROUP BY. Esegui l'SQL generato in MySQL banco di lavoro e verifica il numero di righe prima di fidarti dei numeri.

La causa più comune è la gestione dei valori NULL e la duplicazione delle righe di join. Un modello di intelligenza artificiale potrebbe utilizzare COUNT(*) al posto di COUNT(colonna) o unire una tabella due volte, il che gonfia ogni SUM. Verificare sempre il risultato con un valore noto.

Riassumi questo post con: