Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

AVG() – Calcula o valor médio de uma coluna no MySQL


Ao usar o MySQL, você pode usar o AVG() função para calcular o valor médio de um intervalo de valores.

Por exemplo, você pode usar esta função para descobrir qual é a população média da cidade para um determinado país ou estado. Dado que um país terá muitas cidades, cada uma com populações diferentes, você pode descobrir qual é a média entre elas. Uma cidade pode ter uma população de, digamos, 50.000, enquanto outra tem uma população de 500.000. O AVG() função irá calcular a média para você.


Sintaxe


A sintaxe de AVG() fica assim:
AVG([DISTINCT] expr) [over_clause]

Onde expr é a expressão para a qual você deseja a média.

over_clause é uma cláusula opcional que funciona com funções de janela. A maneira como as funções de janela funcionam é que, para cada linha de uma consulta, execute um cálculo usando as linhas relacionadas a essa linha. Nesse caso, a over_clause especifica como particionar linhas de consulta em grupos para processamento pela função de janela. Observe que a over_clause só pode ser usado se você não usar o DISTINCT palavra-chave.

Dados brutos


Primeiro, aqui estão os dados brutos que usaremos para os exemplos nesta 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 |
+---------------+-----------------+------------+

Exemplo básico


Como você pode ver nos dados brutos acima, alguns “Distritos” têm mais de uma cidade, e cada cidade tem uma população diferente. Podemos usar o AVG() função para encontrar a população média das cidades 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 |
+-----------------+--------------------+

Assim, podemos ver que Nova Gales do Sul tem uma população média da cidade de 998.487,2500.

Arredondando a média


Você provavelmente notou que o resultado do exemplo anterior foi bastante preciso – ele retornou um resultado com quatro casas decimais. No nosso caso, isso provavelmente é um pouco demais. Não precisamos de um resultado até a quarta casa decimal. Portanto, podemos usar o ROUND() função para arredondar para o número inteiro mais próximo (ou para um número especificado de casas decimais, se assim o desejarmos).

Aqui está um exemplo de arredondamento do resultado para o número inteiro mais próximo:
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 padrão, o ROUND() função arredonda para o número inteiro mais próximo. Alternativamente, poderíamos ter fornecido um segundo argumento para especificar um número de casas decimais, mas neste caso, não queremos isso.

A Cláusula GROUP BY


Podemos usar o GROUP BY cláusula para listar cada distrito/estado, juntamente com suas populações médias da cidade:
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 |
+-----------------+--------------------+

A Cláusula ORDER BY


Também podemos usar o ORDER BY cláusula para especificar uma coluna com a qual 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 |
+-----------------+--------------------+

Observe que, ao ordenar por um alias de várias palavras (como `Average Population` ), você precisa usar o caractere de acento grave (` ) em vez do apóstrofo (' ) para cercar as duas palavras.

Encontre o comprimento médio dos caracteres


O AVG() A função não se limita apenas a colunas com dados numéricos. Você também pode combinar AVG() com outras funções para encontrar médias em outras áreas.

Por exemplo, usando nossos dados de exemplo, podemos encontrar o comprimento médio de caracteres de todos os valores no City coluna:
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 |
+--------------------------+

Usando uma cláusula OVER


Como mencionado, a sintaxe permite um OVER cláusula a ser incluída em suas consultas. Isso pode ficar um pouco complexo, mas basicamente, o OVER A cláusula permite especificar como particionar linhas de consulta em grupos para processamento pela função de janela.

Aqui está um exemplo:
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 exemplo particiona as linhas por District , fornecendo a média para cada partição (distrito). Isso permite que você veja dados mais granulares, como a população da cidade, juntamente com a população média do distrito ao qual pertence.