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. A
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.