20th Jul 2022 Tempo di lettura: 9 minuti Le funzioni MIN e MAX di SQL spiegate in 6 esempi Dorota Wdzięczna sql imparare sql min max Indice Cos'è la funzione MIN() in SQL? Cos'è la funzione MAX() in SQL? I dati del campione Esempi di casi d'uso di MIN() e MAX() 1. Utilizzo di MIN() o MAX() come colonna singola 2. Uso di MIN() e MAX() con altre colonne 3. Uso di MIN() e MAX() nella stessa query 4. Utilizzo di MIN() o MAX() nella clausola HAVING 5. Uso di MIN() o MAX() in una semplice funzione finestra 6. Uso di MIN/MAX in una funzione finestra partizionata Cosa abbiamo imparato sulle funzioni MIN() e MAX() di SQL 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. Tags: sql imparare sql min max