Voltar para a lista de artigos Artigos
8 minutos de leitura

A função SQL AVG() Explicada com exemplos

Explicamos a função SQL AVG() com exemplos práticos, cobrindo como e onde você pode e não pode usá-la.

A média é provavelmente uma das métricas mais amplamente utilizadas para descrever algumas características de um grupo. Ela é tão versátil e útil que pode descrever algo sobre quase tudo.

Se você gosta de esportes, você vê coisas como média de corridas por jogo no beisebol, média de assistências por jogo ou por temporada no basquete, e assim por diante. Todos os dias, você ouve afirmações como "em média, chove 10 dias por mês nesta cidade" ou "a temperatura permanece acima de 70 graus em média durante o verão".

Neste artigo, vou cobrir o uso da função SQL AVG() com alguns exemplos da vida real para ajudar você a fazer bom uso dela em situações práticas. Leia!

O que a função SQL AVG() faz?

A função SQL AVG() é utilizada para encontrar a média dos valores sobre os registros de uma tabela.

Para entender isto com um exemplo, considere a seguinte tabela que contém registros de funcionários.

employees

employeenumberlastnameskill_levelannual_salarydepartment
1056Patterson1010000Finance
1076Firrelli10NULLMarketing
1088Patterson6012500Finance
1102Bondur2110000Human Resources
1143Bow105000Sales
1165Jennings105000Sales
1166Thompson1010000Marketing

Exemplo 1

Digamos que você queira descobrir o nível médio de habilidade dos funcionários. Você pode usar a função SQL AVG(). Aqui está a consulta:

SELECT AVG(skill_level)
FROM employees;

Este é o resultado:

AVG(skill_level)
18.714285714285715

A função AVG() toma como argumento um nome de coluna (também conhecido como operando) e então calcula a média para todos os valores da coluna. Assim, neste caso, nossa consulta retorna a média de todos os valores da coluna skill_level.

Você pode notar que o resultado é exibido com muitas casas decimais. Como você raramente precisa dele tão preciso, talvez você queira arredondar este número para o inteiro mais próximo. Você pode usar AVG() aninhado em outras funções SQL como ROUND(), como este:

SELECT ROUND(AVG(skill_level))
FROM employees;

O resultado agora se parece com isto:

AVG(skill_level)
19

A função dentro dos parênteses é avaliada primeiro. Assim, a consulta primeiro calcula a média e depois arredonda o resultado para lhe dar o valor 19.

Exemplo 2

No exemplo acima, usamos AVG() na parte SELECT da consulta. Vamos analisar mais alguns exemplos do SQL AVG().

Digamos que você queira obter uma lista dos funcionários cujos salários estão acima da média da empresa. Se você é novo em SQL, seu primeiro instinto pode ser escrever algo como isto:

SELECT lastname
FROM   employees
WHERE  annual_salary > AVG(annual_salary);

Quando você o executa, ele produz algo como isto:

ERROR 1111 (HY000): Invalid use of group function

Esta consulta emite um erro, pois você não pode usar AVG() em uma condição WHERE. Como AVG() é uma função de grupo, você só pode usá-lo em uma declaração SELECT ou em uma cláusula HAVING.

Em vez disso, execute a seguinte consulta:

SELECT   lastname, annual_salary
FROM     employees
WHERE    annual_salary > (SELECT AVG(annual_salary)
		 		    FROM employees);

Aqui está o resultado:

lastnameannual_salary
Patterson10000
Patterson12500
Bondur10000
Thompson10000

A consulta dentro de uma consulta principal é chamada de subconsulta. Aqui, nós usamos primeiro uma subconsulta (destacada abaixo) para obter o valor médio de annual_salary da employees mesa. Comparamos então com cada valor da coluna para obter o resultado.

SELECT  lastname, annual_salary
FROM    employees
WHERE   annual_salary > (SELECT AVG(annual_salary)
				 FROM employees);

Você vê algo interessante?

Há um registro em nossa tabela com um valor NULL em annual_salary, mas nossa consulta não lançou um erro. Isto porque a função SQL AVG() ignora NULLs e simplesmente calcula a média dos outros registros com valores numéricos. Ou seja, ela ignora o valor da linha mostrada abaixo.

employeenumberlastnameskill_levelannual_salarydepartment
1076Firrelli10NULLMarketing

AVG() Com uma Cláusula DISTINCT

Imagine que você tem alguns dados duplicados em suas tabelas e quer ignorar os valores duplicados ao calcular a média.

Para fazer isso em SQL, é necessário usar uma cláusula DISTINCT. Você pode ver a coluna annual_salary em nossa employees A tabela tem valores que repetem, por exemplo, 5000 e 10000. Se quisermos que o SQL considere estes valores apenas uma vez, usamos AVG() com uma cláusula DISTINCT.

É assim que os resultados são diferentes:

QueryResult
SELECT AVG(annual_salary) FROM employees;8750.00
SELECT AVG(DISTINCT annual_salary) FROM employees;9166.667

No primeiro caso, o valor 10.000 foi incluído três vezes, e o valor 5.000 foi incluído duas vezes. No segundo caso, estes valores foram contados apenas uma vez cada um, daí a diferença nos resultados.

Funções agregadas

AVG() pertence a uma classe de funções conhecidas como funções agregadas. Uma função agregada retorna um único resultado computado em várias fileiras.

Estas funções são extremamente importantes para análise. Muitas vezes é impossível passar por cada registro para obter insights a partir de uma tabela que pode conter milhões de linhas. Portanto, você agrega esses milhões de linhas em grupos significativos.

Por exemplo, digamos que você trabalha no Facebook, e você quer descobrir quais grupos etários passam mais tempo em seu aplicativo. Neste caso, você cria grupos/buckets de diferentes faixas etárias e depois descobre o tempo médio gasto para cada balde.

Aqui estão algumas das outras funções agregadas, cada uma com um exemplo de caso de uso:

Aggregate FunctionExample Use Case
SUM()Find the sum of salaries by department.
COUNT()Find the number of employees in each department.
MAX()Find the highest salary paid in each department.
MIN()Find the lowest salary paid in each department.
AVG()Find the average salary for each department.

Se não estiver muito claro para você neste momento, não se preocupe. Tenho a seguir alguns bons exemplos do SQL AVG() .

A função SQL AVG() Com um GRUPO POR Cláusula

Para demonstrar como o AVG() funciona como uma função agregada na prática, deixe-me levá-lo através de como você pode usar o AVG() com uma cláusula GROUP BY.

A cláusula SQL GROUP BY é usada para agrupar as linhas. Na maioria dos casos, uma cláusula GROUP BY tem uma ou mais funções agregadas que calculam uma ou mais métricas para o grupo.

Exemplo 3

Imagine que você trabalha como analista na equipe de remuneração de uma empresa. Você quer saber o salário médio dos funcionários por departamento. Para fazer isso, você pode usar uma cláusula GROUP BY com AVG() como esta:

SELECT     department,
	      AVG(annual_salary)
FROM       employees
GROUP BY   department;

Aqui está o resultado desta consulta:

departmentAVG(annual_salary)
Finance11250.00
Marketing10000.00
Human Resources10000.00
Sales5000.00

Ela agrupa todos os registros por departamento e então calcula a média annual_salary para cada departamento.

Exemplo 4

Se você trabalha em uma grande empresa com muitos departamentos, você pode querer se concentrar nos departamentos cujo salário médio é maior que um valor específico. Para isso, você precisa filtrar alguns grupos a partir do resultado de sua consulta.

Digamos que você queira encontrar os departamentos cujos salários médios excedem 10000. Sua consulta tem este aspecto:

SELECT     department,
	      AVG(annual_salary)
FROM       employees
GROUP BY   department
HAVING     AVG(annual_salary) > 10000;

Aqui está o resultado desta consulta:

departmentAVG(annual_salary)
Finance11250.00

Como somente o departamento financeiro tem o salário médio superior a 10.000, é a única fila devolvida.

Para saber mais sobre como filtrar registros com funções agregadas, leia este artigo.

Você não precisa ter AVG() na declaração SELECT para utilizá-lo em uma cláusula HAVING. Por exemplo, a consulta a seguir lhe dá apenas o nome do departamento no resultado:

SELECT      department
FROM        employees
GROUP BY    department
HAVING      AVG(annual_salary) > 10000;

E o resultado:

department
Finance

A função SQL AVG() Com uma declaração CASE

Você também pode usar AVG() com uma declaração em CASE. Se você não estiver familiarizado com CASE, dê uma olhada neste artigo.

Exemplo 5

Digamos que você queira exibir "Alto" como categoria quando o salário médio for maior que 7.000, e "Baixo" se for igual ou menor. Esta é a aparência da pergunta:

SELECT department,
	   CASE WHEN AVG(annual_salary) > 7000 THEN 'High'
	   ELSE 'Low' END as category
FROM employees
GROUP BY department;

O resultado desta pergunta:

departmentcategory
FinanceHigh
MarketingHigh
Human ResourceHigh
SalesLow

A média é computada para cada departamento, então comparada com 7.000. Se o salário médio de um departamento for maior que 7.000, então 'High' é retornado como seu category.

Quando não usar o AVG()

Embora útil, a média tem limitações como métrica. Isto é especialmente verdadeiro quando os valores em seu conjunto de dados são muito enviesados.

Por exemplo, digamos que você tenha executado um canal do YouTube, e tenha feito o upload de 20 vídeos até o momento. Um vídeo já atingiu um milhão de visualizações, mas o resto ainda não viu nenhuma tração. Embora seja tecnicamente possível calcular a média, na realidade, apenas um vídeo contribui para a média de 200.000.

Quando os valores são muito enviesados, a mediana é muitas vezes uma métrica melhor. A mediana é o valor no percentil 50 de uma série; ou seja, é o ponto em que metade dos valores da série/grupo estão abaixo e metade estão acima.

Pronto para usar a função SQL AVG() em suas consultas?

Até agora, você já deve ter um bom entendimento da função SQL AVG() e das várias maneiras de utilizá-la. Se você está apenas começando e quer uma carreira que lide com dados, SQL é uma ferramenta indispensável para aprender.

Para saber mais sobre funções padrão como AVG(), recomendo este curso por LearnSQL.com.br. O curso é maravilhosamente projetado e reforça o aprendizado durante todo o curso para ajudar você a reter o que aprende. Se você está super entusiasmado para aprender SQL de ponta a ponta, então verifique a faixa SQL de A a Z.

As chaves para se habilitar em SQL estão praticando e sempre se mantendo atualizadas com os desenvolvimentos e as novas características. Portanto, continue lendo artigos de LearnSQL.com.br para mais e o mais recente em SQL.

Feliz aprendizado!