Torna all'elenco degli articoli Articoli
Tempo di lettura: 9 minuti

Le funzioni MIN e MAX di SQL spiegate in 6 esempi

Cosa sono le funzioni SQL MIN() e MAX()? Quando è opportuno utilizzarle come funzioni aggregate e quando è opportuno utilizzarle con le funzioni finestra? Lo spieghiamo con esempi pratici.

È difficile immaginare SQL senza le funzioni aggregate MIN() e MAX(). Sono molto utili per molti professionisti dei dati perché ci permettono di risolvere molti problemi aziendali. In questo articolo vi spiegherò cosa fa ciascuna funzione e vi illustrerò diversi casi d'uso.

Iniziamo.

Cos'è la funzione MIN() in SQL?

Lo standard SQL è supportato dalla maggior parte dei motori di database relazionali e include diverse funzioni aggregate. Queste funzioni aggregate eseguono calcoli su dati numerici. A Beginner's Guide to SQL Aggregate Functions le tratta tutte in dettaglio; questo articolo si concentra solo su due di queste funzioni: MIN() e MAX().

Per prima cosa, parliamo della funzione MIN(). Restituisce il valore più piccolo di un insieme di valori. I valori possono provenire da una colonna numerica o essere il risultato di un'espressione che restituisce un valore numerico. (Nota: la colonna può provenire da una tabella o da una vista). È una funzione scalare che restituisce un valore numerico.

La sintassi della funzione MIN() è presentata di seguito:

MIN(column_or_expression)

Come si vede, questa funzione accetta un solo argomento: una colonna o un'espressione con valori numerici. È importante che i valori siano numerici, perché la funzione trova il valore minimo tra questi. Ad esempio, da questo insieme di valori...

4, 5, 8, 2, 14

... MIN() restituisce 2.

Cos'è la funzione MAX() in SQL?

Come MIN(), MAX() è una funzione aggregata che restituisce un valore numerico da un insieme. La differenza è che restituisce il valore più grande (massimo). I valori possono provenire da una colonna o come risultato di un'espressione che restituisce uno o più valori numerici. È una funzione scalare che restituisce un valore.

Ecco la sintassi della funzione MAX():

MAX(column_or_expression)

Da questo insieme di valori ...

4, 5, 8, 2, 14 

... MAX() restituisce 14.

I dati del campione

Prima di iniziare ad analizzare i casi d'uso di MIN() e MAX(), analizziamo i dati che utilizzeremo nella tabella cosmetics:

idnamecategorydelivered_yearprice
1shampoohair202011
2night creamface202012
3cleanserface20205
4brushhair20203
5mascaraeye20218
6eyebroweye202115
7conditionerhair202121
8sprayhair202113
9eyelinereye202120
10tonicface202021
11face maskface202110
12eye creameye202122
13hair maskhair20203

Questa tabella contiene informazioni sui prodotti cosmetici in tre categorie (colonna category): capelli, viso e occhi. I nomi dei prodotti sono contenuti nella colonna nome. Le ultime due colonne presentano i dati relativi a quando il prodotto è stato consegnato (delivered_year) e il suo price. Ci sono solo due anni (2020 e 2021) nella colonna delivered_year.

Se avete bisogno di aiuto con le istruzioni e le funzioni SQL utilizzate in questo articolo, provate a consultare il Cheat Sheet di SQL Basics.

Esempi di casi d'uso di MIN() e MAX()

1. Utilizzo di MIN() o MAX() come colonna singola

Le funzioni aggregate come MIN() possono essere utilizzate come una singola colonna nella query SELECT. Ad esempio:

SELECT MIN(price) FROM cosmetics;

Ecco il risultato:

min
3

Dopo la parola chiave SELECT, inseriamo MIN() e il nome della colonna (in questo caso, price). Poi c'è la parola chiave FROM e il nome della tabella (cosmetics). Il risultato è il valore più piccolo nella colonna price, che è 3.

È possibile utilizzare MAX() esattamente nello stesso modo per trovare il prezzo più alto del prodotto:

SELECT MAX(price) FROM cosmetics;

Ed ecco il risultato:

max
22

Il prezzo massimo nella tabella cosmetics è 22 (il prezzo della crema per il contorno occhi).

L'articolo Come trovare i valori minimi nelle colonne fornisce ulteriori esempi su come trovare il valore minimo.

2. Uso di MIN() e MAX() con altre colonne

Un uso più avanzato delle funzioni MIN() e MAX() consiste nell'utilizzarle su gruppi di righe. Ecco un'altra query:

SELECT category,
  MAX(price) AS max_price
FROM cosmetics
GROUP BY category;

Restituisce i dati:

categorymax_price
hair21
face21
eye22

Prima c'è la parola chiave SELECT con il nome della colonna (category), poi la funzione MAX() con la colonna price come argomento. Poi abbiamo max_price, l'alias della nuova colonna creata da MAX().

Segue la parola chiave FROM e il nome della tabella. Infine, abbiamo la clausola GROUP BY con la colonna category. Questo determina i gruppi (cioè i prodotti sono raggruppati per categoria). Per ogni gruppo, otteniamo il suo valore più grande - in questo caso, il prezzo più alto tra i prodotti di quella categoria. Nella categoria "occhi", il prezzo più alto è di 22 dollari; nelle categorie "viso" e "capelli" è di 21 dollari.

L'articolo Come trovare i valori massimi nelle righe fornisce altri esempi di questa funzione.

3. Uso di MIN() e MAX() nella stessa query

È possibile utilizzare entrambe le funzioni MIN e MAX in una SELECT. Se si utilizzano solo queste funzioni senza colonne, non è necessaria la clausola GROUP BY.

Di seguito è riportata una query che implementa entrambe le funzioni:

 SELECT MIN(price) AS min_price,
  MAX(price) AS max_price
FROM cosmetics;

Questa query restituisce i dati:

min_pricemax_price
322

In SELECT, abbiamo la funzione MIN() con l'argomento colonna price seguita da MAX() con lo stesso argomento e i rispettivi alias. Questo restituisce il prezzo minimo (3 dollari) e il prezzo massimo (22 dollari) per tutti i prodotti della tabella.

Naturalmente, si può fare lo stesso calcolando il prezzo minimo e massimo per ogni categoria. Tuttavia, in questo caso è necessario utilizzare la funzione GROUP BY:

SELECT category,
  MIN(price) AS min_price,
  MAX(price) AS max_price
FROM cosmetics
GROUP BY category;

Ecco l'insieme dei risultati:

categorymin_pricemax_price
hair321
face521
eye822

In questo caso, il prezzo minimo nella categoria "capelli" è di 3 dollari e il prezzo massimo di 21 dollari, mentre nella categoria "occhi" il valore minimo è di 8 dollari e il massimo di 22 dollari.

Per ulteriori informazioni sulla ricerca dei valori minimi e massimi, consultare gli articoli Come trovare il valore minimo di una colonna in SQL e Come trovare il valore massimo di una colonna numerica in SQL.

4. Utilizzo di MIN() o MAX() nella clausola HAVING

Un altro modo per utilizzare MIN() o MAX() è quello di filtrare le righe in base al valore restituito da questa funzione, cioè nella clausola HAVING.

La query seguente implementa MIN() in HAVING:

SELECT category,
  MAX(price) AS max_price
FROM cosmetics
GROUP BY category
HAVING MIN(price)>4;

L'insieme dei risultati:

categorymax_price
face21
eye22

In SELECT, abbiamo la colonna category. La prossima è la funzione MAX() con price come argomento. Per ogni categoria, verrà calcolato il prezzo massimo tra i prodotti appartenenti a questa categoria. Dopo FROM cosmetics viene la clausola GROUP BY con la colonna category.

Alla fine della query c'è la clausola HAVING con la funzione MIN(). Questa troverà il prezzo più basso tra i prodotti di ogni categoria; se tale prezzo è inferiore a 4, non verrà incluso nei risultati. Poiché il prezzo minimo della categoria "capelli" è di 3 dollari, non è stato visualizzato nel set di risultati.

Si noti che l'uso di una delle due funzioni in HAVING non richiede l'uso di questa (o di qualsiasi altra funzione aggregata) in SELECT.

5. Uso di MIN() o MAX() in una semplice funzione finestra

L'uso più avanzato di MIN() o MAX() è in una funzione finestra. Se non avete familiarità con le funzioni finestra, leggete l'articolo SQL Window Function Examples with Explanations.

Ecco una semplice funzione finestra che utilizza la funzione MIN():

SELECT name, price, category, delivered_year,
  MIN(price) OVER (ORDER BY category DESC) AS min_price
FROM cosmetics;

La prima cosa che si nota è l'elenco delle colonne SELECT: name, price, category, delivered_year. Segue la funzione aggregata MIN(price), che trova il valore più basso nella colonna price. OVER è ciò che rende questa funzione una finestra; definisce la finestra, ovvero l'insieme di righe all'interno del set di risultati della query. Ciò consente di calcolare un valore aggregato per ogni riga della finestra. In questo caso, OVER è abbinato alla categoria ORDER BY DESC (cioè in ordine decrescente); quindi, il prezzo minimo è sempre di 3 dollari, perché il prezzo più basso nella categoria "capelli" è di 3 dollari, che è inferiore al minimo della categoria successiva, pari a 5 dollari.

Ecco il risultato:

namepricecategorydelivered_yearmin_price
hair mask3hair20203
brush3hair20203
conditioner21hair20213
spray13hair20213
shampoo11hair20203
night cream12face20203
cleanser5face20203
tonic21face20203
face mask10face20213
mascara8eye20213
eye cream22eye20213
eyeliner20eye20213
eyebrow15eye20213

6. Uso di MIN/MAX in una funzione finestra partizionata

Utilizziamo poi MIN() o MAX() in una funzione finestra con la clausola PARTITION BY. (Se avete bisogno di un ripasso su PARTITION BY, date un'occhiata al foglio informativo SQL Window Functions ). Questa è la query:

SELECT name, price, category, delivered_year,
  MIN(price) OVER (PARTITION BY delivered_year
           	ORDER BY category DESC)
  AS min_price
FROM cosmetics;

Questa query calcola il prezzo minimo per ogni partizione in base alla colonna delivered_year e ordina le righe in base alla categoria.

Restituisce il seguente set di risultati:

namepricecategorydelivered_yearmin_price
shampoo11hair20203
brush3hair20203
hair mask3hair20203
tonic21face20203
night cream12face20203
cleanser5face20203
spray13hair202113
conditioner21hair202113
face mask10face202110
eyeliner20eye20218
mascara8eye20218
eyebrow15eye20218
eye cream22eye20218

Questi risultati contengono l'elenco dei cosmetici, con il nome, il prezzo, la categoria e l'anno di consegna. Ogni riga contiene anche il prezzo minimo per quell'anno di consegna (che è la partizione). In ogni partizione, le righe sono ordinate in ordine decrescente per categoria.

In questo caso, la clausola OVER contiene le clausole ORDER BY e PARTITION BY. PARTITION BY delivered_year indica che il prezzo minimo è calcolato separatamente per ogni anno. I record di ogni partizione (l'anno in cui i prodotti sono stati consegnati) sono ordinati in base alla categoria in ordine decrescente (ORDER BY categoria DESC).

Cosa abbiamo imparato sulle funzioni MIN() e MAX() di SQL

Le funzioni aggregate di SQL MIN() e MAX() sono molto diffuse. In questo articolo ho spiegato come utilizzarle in vari casi. La differenza principale è che MIN() trova il valore minimo in un insieme di valori, mentre MAX() restituisce il valore massimo.

Ora che sapete come utilizzare MIN() e MAX(), siete pronti per:

  • Trovare i valori più grandi e più piccoli tra tutte le righe date o tra gruppi di righe date.
  • Confrontare i valori minimi e massimi con altre righe.
  • Utilizzare queste funzioni su partizioni e su semplici funzioni finestra.

Per ulteriori informazioni sulle differenze tra valori aggregati e funzioni finestra, leggete il nostro articolo SQL Window Functions vs. SQL Aggregate Functions: Somiglianze e differenze.

Se siete principianti e volete ampliare le vostre conoscenze di SQL, vi consiglio il corso di LearnSQL.it SQL Basics . Se invece avete già familiarità con l'SQL di base, potreste seguire il nostro corso di Window Functions per migliorare le vostre competenze.