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

La funzione SQL AVG() spiegata con esempi

Spieghiamo la funzione SQL AVG() con esempi pratici, spiegando come e dove si può e non si può usare.

La media è probabilmente una delle metriche più utilizzate per descrivere alcune caratteristiche di un gruppo. È così versatile e utile che può descrivere quasi tutto.

Se vi piace lo sport, vedrete cose come la media dei run per partita nel baseball, la media degli assist per partita o per stagione nel basket, e così via. Ogni giorno si sentono affermazioni come "in questa città piove in media 10 giorni al mese" o "la temperatura rimane in media sopra i 70 gradi durante l'estate".

In questo articolo tratterò l'uso della funzione SQL AVG() con alcuni esempi reali per aiutarvi a farne buon uso in situazioni pratiche. Continuate a leggere!

Cosa fa la funzione SQL AVG()?

La funzione SQL AVG() serve a trovare la media dei valori dei record di una tabella.

Per capirlo con un esempio, considerate la seguente tabella che contiene i record dei dipendenti.

employees

employeenumberlastnameskill_levelannual_salarydepartment
1056Patterson1010000Finance
1076Firrelli10NULLMarketing
1088Patterson6012500Finance
1102Bondur2110000Human Resources
1143Bow105000Sales
1165Jennings105000Sales
1166Thompson1010000Marketing

Esempio 1

Supponiamo di voler trovare il livello medio di competenza dei dipendenti. È possibile utilizzare la funzione SQL AVG(). Ecco la query:

SELECT AVG(skill_level)
FROM employees;

Questo è il risultato:

AVG(skill_level)
18.714285714285715

La funzione AVG() prende come argomento il nome di una colonna (detta anche operando) e calcola la media di tutti i valori della colonna. In questo caso, la nostra query restituisce la media di tutti i valori della colonna skill_level.

Si può notare che il risultato viene visualizzato con molti decimali. Poiché raramente si ha bisogno di una tale precisione, si potrebbe arrotondare il numero al numero intero più vicino. È possibile utilizzare AVG() annidato in altre funzioni SQL come ROUND(), in questo modo:

SELECT ROUND(AVG(skill_level))
FROM employees;

Il risultato ora appare come questo:

AVG(skill_level)
19

La funzione all'interno delle parentesi viene valutata per prima. Quindi, la query calcola prima la media e poi arrotonda il risultato per ottenere il valore 19.

Esempio 2

Nell'esempio precedente, abbiamo usato AVG() nella parte SELECT della query. Vediamo altri esempi di SQL AVG().

Supponiamo di voler ottenere un elenco dei dipendenti il cui stipendio è superiore alla media aziendale. Se siete alle prime armi con l'SQL, il primo istinto potrebbe essere quello di scrivere qualcosa di simile:

SELECT lastname
FROM   employees
WHERE  annual_salary > AVG(annual_salary);

Quando la si esegue, il risultato è simile a questo:

ERROR 1111 (HY000): Invalid use of group function

Questa query genera un errore, perché non è possibile utilizzare AVG() in una condizione WHERE. Poiché AVG() è una funzione di gruppo, è possibile utilizzarla solo in un'istruzione SELECT o in una clausola HAVING.

Eseguire invece la seguente query:

SELECT   lastname, annual_salary
FROM     employees
WHERE    annual_salary > (SELECT AVG(annual_salary)
		 		    FROM employees);

Ecco il risultato:

lastnameannual_salary
Patterson10000
Patterson12500
Bondur10000
Thompson10000

La query all'interno di una query principale è chiamata subquery. In questo caso, utilizziamo prima una subquery (evidenziata sotto) per ottenere il valore medio di annual_salary dalla tabella employees dalla tabella. Poi lo confrontiamo con ogni valore della colonna per ottenere il risultato.

SELECT  lastname, annual_salary
FROM    employees
WHERE   annual_salary > (SELECT AVG(annual_salary)
				 FROM employees);

Vedete qualcosa di interessante?

Nella nostra tabella c'è un record con un valore NULL in annual_salary, ma la query non ha dato errore. Questo perché la funzione SQL AVG() ignora NULLs e calcola semplicemente la media degli altri record con valori numerici. In altre parole, ignora il valore della riga mostrata di seguito.

employeenumberlastnameskill_levelannual_salarydepartment
1076Firrelli10NULLMarketing

AVG() con la clausola DISTINCT

Immaginate di avere dei dati duplicati nelle vostre tabelle e di voler ignorare i valori duplicati nel calcolo della media.

Per fare questo in SQL, è necessario utilizzare la clausola DISTINCT. Si può notare che la colonna annual_salary nella nostra tabella employees ha valori che si ripetono, ad esempio 5000 e 10000. Se vogliamo che SQL consideri questi valori una sola volta, usiamo AVG() con una clausola DISTINCT.

Ecco come i risultati differiscono:

QueryResult
SELECT AVG(annual_salary) FROM employees;8750.00
SELECT AVG(DISTINCT annual_salary) FROM employees;9166.667

Nel primo caso, il valore 10.000 è stato incluso tre volte e il valore 5.000 è stato incluso due volte. Nel secondo caso, questi valori sono stati conteggiati solo una volta ciascuno, da cui la differenza nei risultati.

Funzioni aggregate

AVG() appartiene a una classe di funzioni note come funzioni aggregate. Una funzione aggregata restituisce un unico risultato calcolato su più righe.

Queste funzioni sono estremamente importanti per l'analisi. Spesso è impossibile esaminare ogni singolo record per raccogliere informazioni da una tabella che può contenere milioni di righe. Quindi, si aggregano questi milioni di righe in gruppi significativi.

Ad esempio, se lavorate in Facebook e volete scoprire quali gruppi di età trascorrono più tempo sulla vostra applicazione. In questo caso, si creano gruppi/bucket di diverse fasce d'età e si trova il tempo medio trascorso per ogni bucket.

Ecco alcune delle altre funzioni aggregate, ciascuna con un caso d'uso esemplificativo:

Aggregate FunctionExample Use Case
SUM()Find the sum of salaries by department.
COUNT()Find the number of employees in each department.
MAX()Find the highest salary paid in each department.
MIN()Find the lowest salary paid in each department.
AVG()Find the average salary for each department.

Se non vi è molto chiaro in questo momento, non preoccupatevi. A seguire troverete alcuni esempi di SQL AVG() .

La funzione SQL AVG() con la clausola GROUP BY

Per dimostrare il funzionamento pratico di AVG() come funzione aggregata, vi illustrerò come utilizzare AVG() con una clausola GROUP BY.

La clausola GROUP BY di SQL serve a raggruppare le righe. Nella maggior parte dei casi, una clausola GROUP BY contiene una o più funzioni aggregate che calcolano una o più metriche per il gruppo.

Esempio 3

Immaginate di lavorare come analista nel team delle retribuzioni di un'azienda. Si vuole conoscere la retribuzione media dei dipendenti per reparto. Per farlo, si può utilizzare una clausola GROUP BY con AVG() come questa:

SELECT     department,
	      AVG(annual_salary)
FROM       employees
GROUP BY   department;

Ecco il risultato di questa query:

departmentAVG(annual_salary)
Finance11250.00
Marketing10000.00
Human Resources10000.00
Sales5000.00

Raggruppa tutti i record per reparto e calcola la media annual_salary per ogni reparto.

Esempio 4

Se lavorate in una grande azienda con molti reparti, potreste voler concentrarvi sui reparti il cui stipendio medio è superiore a un valore specifico. A tal fine, è necessario filtrare alcuni gruppi dai risultati della query.

Supponiamo di voler trovare i reparti il cui stipendio medio supera i 10000. La query si presenta in questo modo:

SELECT     department,
	      AVG(annual_salary)
FROM       employees
GROUP BY   department
HAVING     AVG(annual_salary) > 10000;

Ecco il risultato della query:

departmentAVG(annual_salary)
Finance11250.00

Poiché solo il reparto Finanza ha uno stipendio medio superiore a 10000, è l'unica riga restituita.

Per ulteriori informazioni su come filtrare i record con le funzioni aggregate, leggere questo articolo.

Non è necessario che AVG() sia presente nell'istruzione SELECT per utilizzarlo in una clausola HAVING. Ad esempio, la seguente query fornisce solo il nome del reparto nel risultato:

SELECT      department
FROM        employees
GROUP BY    department
HAVING      AVG(annual_salary) > 10000;

E il risultato:

department
Finance

La funzione SQL AVG() con un'istruzione CASE

È possibile utilizzare la funzione AVG() anche con un'istruzione CASE. Se non avete familiarità con CASE, date un'occhiata a questo articolo.

Esempio 5

Supponiamo di voler visualizzare "Alto" come categoria quando il salario medio è superiore a 7.000 e "Basso" se è uguale o inferiore. Ecco come si presenta la query:

SELECT department,
	   CASE WHEN AVG(annual_salary) > 7000 THEN 'High'
	   ELSE 'Low' END as category
FROM employees
GROUP BY department;

Il risultato della query:

departmentcategory
FinanceHigh
MarketingHigh
Human ResourceHigh
SalesLow

La media viene calcolata per ogni reparto e poi confrontata con 7.000. Se la retribuzione media di un reparto è superiore a 7.000, viene restituito 'High' come category.

Quando non usare AVG()

Sebbene sia utile, la media ha dei limiti come metrica. Ciò è particolarmente vero quando i valori dell'insieme di dati sono molto distorti.

Ad esempio, si supponga di gestire un canale YouTube e di aver caricato finora 20 video. Un video ha raggiunto un milione di visualizzazioni, ma gli altri non hanno ancora avuto alcun riscontro. Sebbene sia tecnicamente possibile calcolare la media, in realtà solo un video contribuisce alla media di 200.000 visualizzazioni.

Quando i valori sono molto distorti, la mediana è spesso una metrica migliore. La mediana è il valore al 50° percentile di una serie, cioè il punto in cui metà dei valori della serie/gruppo sono inferiori e metà superiori.

Siete pronti a usare la funzione SQL AVG() nelle vostre query?

A questo punto dovreste avere una buona conoscenza della funzione SQL AVG() e dei vari modi per utilizzarla. Se siete alle prime armi e volete intraprendere una carriera che abbia a che fare con i dati, SQL è uno strumento da imparare assolutamente.

Per saperne di più sulle funzioni standard come AVG(), vi consiglio questo corso di LearnSQL.it. Il corso è progettato in modo eccellente e rafforza l'apprendimento durante tutto il corso per aiutarvi a conservare ciò che imparate. Se siete molto entusiasti di imparare SQL da cima a fondo, date un'occhiata al corso SQL dalla A alla Z.

La chiave per diventare abili in SQL è la pratica e il costante aggiornamento sugli sviluppi e le nuove funzionalità. Continuate a leggere gli articoli di LearnSQL.it per saperne di più e per conoscere le ultime novità su SQL.

Buon apprendimento!