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.