sql >> Base de Datos >  >> RDS >> Mysql

AVG () - Calcule el valor promedio de una columna en MySQL

Al usar MySQL, puede usar el AVG() función para calcular el valor promedio de un rango de valores.

Por ejemplo, puede usar esta función para averiguar cuál es la población promedio de una ciudad para un país o estado determinado. Dado que un país tendrá muchas ciudades, cada una con diferente población, puedes averiguar cuál es el promedio entre ellas. Una ciudad puede tener una población de, digamos, 50.000 mientras que otra tiene una población de 500.000. El AVG() la función calculará el promedio por usted.

Sintaxis

La sintaxis de AVG() va así:

AVG([DISTINCT] expr) [over_clause]

Donde expr es la expresión para la que desea el promedio.

La over_clause es una cláusula opcional que funciona con funciones de ventana. La forma en que funcionan las funciones de ventana es que, para cada fila de una consulta, se realiza un cálculo utilizando filas relacionadas con esa fila. En este caso, la over_clause especifica cómo dividir las filas de consulta en grupos para que la función de ventana las procese. Tenga en cuenta que la over_clause solo se puede usar si no usa el DISTINCT palabra clave.

Datos sin procesar

Primero, aquí están los datos sin procesar que usaremos para los ejemplos en esta página:

SELECT Name, District, Population
FROM City
WHERE CountryCode = 'AUS';

Resultado:

+---------------+-----------------+------------+
| 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 |
+---------------+-----------------+------------+

Ejemplo básico

Como puede ver en los datos sin procesar anteriores, algunos "Distritos" tienen más de una ciudad, y cada ciudad tiene una población diferente. Podemos usar el AVG() función para encontrar la población promedio de las ciudades dentro de cada distrito:

SELECT District, AVG(Population) AS 'Average Population'
FROM City
WHERE CountryCode = 'AUS'
AND District = 'New South Wales';

Resultado:

+-----------------+--------------------+
| District        | Average Population |
+-----------------+--------------------+
| New South Wales |        998487.2500 |
+-----------------+--------------------+

Entonces podemos ver que Nueva Gales del Sur tiene una población urbana promedio de 998487.2500.

Redondeo de la media

Probablemente notó que el resultado del ejemplo anterior fue bastante preciso:arrojó un resultado con cuatro decimales. En nuestro caso, esto es probablemente un poco demasiado. No necesitamos un resultado hasta el cuarto decimal. Por lo tanto, podemos usar ROUND() función para redondearlo al número entero más cercano (o a un número específico de lugares decimales si así lo deseamos).

Aquí hay un ejemplo de cómo redondear el resultado al número entero más cercano:

SELECT District, ROUND(AVG(Population)) AS 'Average Population'
FROM City
WHERE CountryCode = 'AUS'
AND District = 'New South Wales';

Resultado:

+-----------------+--------------------+
| District        | Average Population |
+-----------------+--------------------+
| New South Wales |             998487 |
+-----------------+--------------------+

Por defecto, el ROUND() función redondea al número entero más cercano. Alternativamente, podríamos haber proporcionado un segundo argumento para especificar una cantidad de lugares decimales, pero en este caso, no queremos eso.

La cláusula GROUP BY

Podemos usar el GROUP BY cláusula para enumerar cada distrito/estado, junto con la población promedio de la ciudad:

SELECT District, ROUND(AVG(Population)) AS 'Average Population'
FROM City
WHERE CountryCode = 'AUS'
GROUP BY District;

Resultado:

+-----------------+--------------------+
| District        | Average Population |
+-----------------+--------------------+
| New South Wales |             998487 |
| Victoria        |            1495356 |
| Queensland      |             451309 |
| West Australia  |            1096829 |
| South Australia |             978100 |
| Capital Region  |             322723 |
| Tasmania        |             126118 |
+-----------------+--------------------+

La cláusula ORDEN POR

También podemos usar el ORDER BY cláusula para especificar una columna con la que ordenar por:

SELECT District, ROUND(AVG(Population)) AS 'Average Population'
FROM City
WHERE CountryCode = 'AUS'
GROUP BY District
ORDER BY `Average Population`;

Resultado:

+-----------------+--------------------+
| District        | Average Population |
+-----------------+--------------------+
| Tasmania        |             126118 |
| Capital Region  |             322723 |
| Queensland      |             451309 |
| South Australia |             978100 |
| New South Wales |             998487 |
| West Australia  |            1096829 |
| Victoria        |            1495356 |
+-----------------+--------------------+

Tenga en cuenta que, al ordenar por un alias de varias palabras (como `Average Population` ), debe usar el carácter de acento grave (` ) en lugar del apóstrofe (' ) para rodear las dos palabras.

Encuentre la longitud promedio de caracteres

El AVG() La función no se limita solo a columnas con datos numéricos. También puede combinar AVG() con otras funciones para encontrar promedios en otras áreas.

Por ejemplo, usando nuestros datos de muestra, podemos encontrar la longitud de carácter promedio de todos los valores en la City columna:

SELECT ROUND(AVG(CHAR_LENGTH(Name))) AS 'Average Character Length'
FROM city
WHERE CountryCode = 'AUS'
AND District = 'New South Wales';

Resultado:

+--------------------------+
| Average Character Length |
+--------------------------+
|                       10 |
+--------------------------+

Uso de una cláusula OVER

Como se mencionó, la sintaxis permite un OVER cláusula a incluir en sus consultas. Esto puede volverse un poco complejo, pero básicamente, el OVER La cláusula le permite especificar cómo dividir las filas de consulta en grupos para que la función de ventana las procese.

He aquí un ejemplo:

SELECT 
    District,
    Name AS City,
    Population,
    ROUND(AVG(Population) OVER(PARTITION BY District)) AS 'District Avg'
FROM City
WHERE CountryCode = 'AUS'
ORDER BY District;

Resultado:

+-----------------+---------------+------------+--------------+
| 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 |
+-----------------+---------------+------------+--------------+

Este ejemplo divide las filas por District , proporcionando el promedio para cada partición (distrito). Esto le permite ver datos más granulares, como la población de la ciudad, junto con la población promedio del distrito al que pertenece.