Quando usi MySQL, puoi usare AVG()
funzione per calcolare il valore medio da un intervallo di valori.
Ad esempio, puoi utilizzare questa funzione per scoprire qual è la popolazione media della città per un determinato paese o stato. Dato che un paese avrà molte città, ognuna con popolazioni diverse, puoi scoprire qual è la media tra di loro. Una città potrebbe avere una popolazione, diciamo, 50.000 mentre un'altra ha una popolazione di 500.000. Il AVG()
la funzione calcolerà la media per te.
Sintassi
La sintassi di AVG()
va così:
AVG([DISTINCT] expr) [over_clause]
Dove expr
è l'espressione per la quale vuoi la media.
La over_clause
è una clausola facoltativa che funziona con le funzioni della finestra. Il modo in cui funzionano le funzioni della finestra prevede che, per ogni riga di una query, esegua un calcolo utilizzando le righe relative a quella riga. In questo caso, il over_clause
specifica come partizionare le righe di query in gruppi per l'elaborazione mediante la funzione finestra. Nota che la over_clause
può essere utilizzato solo se non utilizzi il DISTINCT
parola chiave.
Dati grezzi
Innanzitutto, ecco i dati grezzi che utilizzeremo per gli esempi in questa pagina:
SELECT Name, District, Population FROM City WHERE CountryCode = 'AUS';
Risultato:
+---------------+-----------------+------------+ | Name | District | Population | +---------------+-----------------+------------+ | Sydney | New South Wales | 3276207 | | Melbourne | Victoria | 2865329 | | Brisbane | Queensland | 1291117 | | Perth | West Australia | 1096829 | | Adelaide | South Australia | 978100 | | Canberra | Capital Region | 322723 | | Gold Coast | Queensland | 311932 | | Newcastle | New South Wales | 270324 | | Central Coast | New South Wales | 227657 | | Wollongong | New South Wales | 219761 | | Hobart | Tasmania | 126118 | | Geelong | Victoria | 125382 | | Townsville | Queensland | 109914 | | Cairns | Queensland | 92273 | +---------------+-----------------+------------+
Esempio di base
Come puoi vedere dai dati grezzi sopra, alcuni "distretti" hanno più di una città e ogni città ha una popolazione diversa. Possiamo usare AVG()
funzione per trovare la popolazione media delle città all'interno di ogni distretto:
SELECT District, AVG(Population) AS 'Average Population' FROM City WHERE CountryCode = 'AUS' AND District = 'New South Wales';
Risultato:
+-----------------+--------------------+ | District | Average Population | +-----------------+--------------------+ | New South Wales | 998487.2500 | +-----------------+--------------------+
Quindi possiamo vedere che il New South Wales ha una popolazione cittadina media di 998487,2500.
Arrotondare la media
Probabilmente hai notato che il risultato dell'esempio precedente era abbastanza preciso:ha restituito un risultato a quattro cifre decimali. Nel nostro caso, questo è probabilmente un po' troppo. Non abbiamo bisogno di un risultato alla quarta cifra decimale. Pertanto, possiamo usare ROUND()
funzione per arrotondarlo al numero intero più vicino (o a un numero specificato di cifre decimali se lo desideriamo).
Ecco un esempio di arrotondamento del risultato al numero intero più vicino:
SELECT District, ROUND(AVG(Population)) AS 'Average Population' FROM City WHERE CountryCode = 'AUS' AND District = 'New South Wales';
Risultato:
+-----------------+--------------------+ | District | Average Population | +-----------------+--------------------+ | New South Wales | 998487 | +-----------------+--------------------+
Per impostazione predefinita, il ROUND()
la funzione arrotonda al numero intero più vicino. In alternativa, avremmo potuto fornire un secondo argomento per specificare un numero di cifre decimali, ma in questo caso non lo vogliamo.
La clausola GROUP BY
Possiamo usare il GROUP BY
clausola per elencare ogni distretto/stato, insieme alla popolazione media delle città:
SELECT District, ROUND(AVG(Population)) AS 'Average Population' FROM City WHERE CountryCode = 'AUS' GROUP BY District;
Risultato:
+-----------------+--------------------+ | District | Average Population | +-----------------+--------------------+ | New South Wales | 998487 | | Victoria | 1495356 | | Queensland | 451309 | | West Australia | 1096829 | | South Australia | 978100 | | Capital Region | 322723 | | Tasmania | 126118 | +-----------------+--------------------+
La clausola ORDER BY
Possiamo anche usare il ORDER BY
clausola per specificare una colonna con cui ordinare per:
SELECT District, ROUND(AVG(Population)) AS 'Average Population' FROM City WHERE CountryCode = 'AUS' GROUP BY District ORDER BY `Average Population`;
Risultato:
+-----------------+--------------------+ | District | Average Population | +-----------------+--------------------+ | Tasmania | 126118 | | Capital Region | 322723 | | Queensland | 451309 | | South Australia | 978100 | | New South Wales | 998487 | | West Australia | 1096829 | | Victoria | 1495356 | +-----------------+--------------------+
Nota che, quando ordini con un alias composto da più parole (come `Average Population`
), devi utilizzare il carattere di apice inverso (`
) invece dell'apostrofo ('
) per racchiudere le due parole.
Trova la lunghezza media dei caratteri
Il AVG()
la funzione non è limitata alle sole colonne con dati numerici. Puoi anche combinare AVG()
con altre funzioni per trovare medie in altre aree.
Ad esempio, utilizzando i nostri dati di esempio, possiamo trovare la lunghezza media dei caratteri di tutti i valori nella City
colonna:
SELECT ROUND(AVG(CHAR_LENGTH(Name))) AS 'Average Character Length' FROM city WHERE CountryCode = 'AUS' AND District = 'New South Wales';
Risultato:
+--------------------------+ | Average Character Length | +--------------------------+ | 10 | +--------------------------+
Utilizzo di una clausola OVER
Come accennato, la sintassi consente un OVER
clausola da includere nelle vostre domande. Questo può diventare leggermente complesso, ma fondamentalmente, il OVER
La clausola consente di specificare come suddividere le righe di query in gruppi per l'elaborazione mediante la funzione finestra.
Ecco un esempio:
SELECT District, Name AS City, Population, ROUND(AVG(Population) OVER(PARTITION BY District)) AS 'District Avg' FROM City WHERE CountryCode = 'AUS' ORDER BY District;
Risultato:
+-----------------+---------------+------------+--------------+ | District | City | Population | District Avg | +-----------------+---------------+------------+--------------+ | Capital Region | Canberra | 322723 | 322723 | | New South Wales | Sydney | 3276207 | 998487 | | New South Wales | Wollongong | 219761 | 998487 | | New South Wales | Newcastle | 270324 | 998487 | | New South Wales | Central Coast | 227657 | 998487 | | Queensland | Townsville | 109914 | 451309 | | Queensland | Brisbane | 1291117 | 451309 | | Queensland | Cairns | 92273 | 451309 | | Queensland | Gold Coast | 311932 | 451309 | | South Australia | Adelaide | 978100 | 978100 | | Tasmania | Hobart | 126118 | 126118 | | Victoria | Melbourne | 2865329 | 1495356 | | Victoria | Geelong | 125382 | 1495356 | | West Australia | Perth | 1096829 | 1096829 | +-----------------+---------------+------------+--------------+
Questo esempio partiziona le righe per District
, fornendo la media per ciascuna partizione (distretto). Ciò ti consente di visualizzare dati più dettagliati, come la popolazione della città, insieme alla popolazione media del distretto a cui appartiene.