9th Dec 2022 Tempo di lettura: 8 minuti La funzione SQL AVG() spiegata con esempi Himanshu Kathuria sql imparare sql AVG Indice Cosa fa la funzione SQL AVG()? Esempio 1 Esempio 2 AVG() con la clausola DISTINCT Funzioni aggregate La funzione SQL AVG() con la clausola GROUP BY Esempio 3 Esempio 4 La funzione SQL AVG() con un'istruzione CASE Esempio 5 Quando non usare AVG() Siete pronti a usare la funzione SQL AVG() nelle vostre query? 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! Tags: sql imparare sql AVG