CodeGym /Cursos /SQL SELF /Médias com AVG() — calculando médias em col...

Médias com AVG() — calculando médias em colunas

SQL SELF
Nível 7 , Lição 3
Disponível

Se você já tentou calcular a média das notas de uma prova ou, por exemplo, o salário médio de um setor, já tá ligado no conceito de média aritmética. Aliás, isso aí a gente aprende na escola mesmo. No SQL, qualquer tarefa de calcular média em um conjunto de dados é resolvida com a função AVG().

A função AVG() é uma função agregadora que calcula a média aritmética de uma coluna numérica. Ela soma todos os valores da coluna indicada e divide o resultado pela quantidade desses valores. Ela ignora o NULL (e esse ignore aí, por incrível que pareça, facilita a vida, mas já já falo disso).

Sintaxe do AVG()

Bora começar com a sintaxe básica:

SELECT AVG(coluna)
FROM tabela;

Repara: aqui coluna é a coluna que tem os valores numéricos pra você calcular a média.

Exemplo 1: Salário médio dos funcionários

Imagina que a gente tem uma tabela employees com os dados dos funcionários e seus salários:

id name salary
1 Otto 50000
2 Maria 60000
3 Alex 55000
4 Anna NULL
5 Dan 52000

Consulta simples pra calcular o salário médio:

SELECT AVG(salary) AS average_salary
FROM employees;

Resultado:

average_salary
54250

Como isso funciona?

  • AVG() soma todos os salários: 50000 + 60000 + 55000 + 52000 = 217000.
  • Divide a soma pelo número de valores não nulos: 217000 / 4 = 54250.

Como o AVG() lida com NULL

Você deve ter reparado que pra calcular o salário médio, o valor NULL na coluna salary foi ignorado. Essa é a parada chave do AVG(). Ele só considera valores que não são NULL.

Bora ver um exemplo:

SELECT AVG(NULL) AS result;

Resultado:

result
NULL

Isso só confirma que o AVG() ignora NULL. Mas se o conjunto inteiro for só NULL, aí o resultado vai ser NULL mesmo.

Agora, se na tabela tiver 0 em vez de NULL, esse valor não vai ser ignorado.

Tabela employees

id salary
1 1000
2 0
3 NULL
4 2000

Consulta SQL:

SELECT AVG(salary) AS avg_salary
FROM employees;

Resultado:

avg_salary
1000

Por que isso?

Porque o AVG() vai calcular:

[(1000 + 0 + 2000) / 3 = 1000]

A linha com NULL é ignorada na média.

Exemplo: Calculando a média de idade dos estudantes

Agora vamos pra tabela students:

id name age
1 Anna 20
2 Max 22
3 Maria NULL
4 Otto 21

Consulta:

SELECT AVG(age) AS average_age
FROM students;

Resultado:

average_age
21
  • AVG() ignora a estudante Maria, porque a idade dela tá como NULL.
  • A média é: (20 + 22 + 21) / 3 = 21.

Arredondando o resultado

Às vezes o AVG() retorna um número quebrado com vários dígitos depois da vírgula.

Se quiser arredondar, usa a função ROUND().

Tabela employees

id salary
1 50000
2 60000
3 47000
4 NULL

Consulta SQL

SELECT ROUND(AVG(salary), 2) AS rounded_average_salary
FROM employees;

Resultado

rounded_average_salary
52333.33

A linha com NULL é ignorada, então a média é calculada só com três valores.

Filtrando dados antes de calcular o AVG()

Se quiser calcular a média só pra valores que batem com alguma condição, usa o WHERE.

Tabela employees

id salary
1 50000
2 60000
3 47000
4 60000
5 NULL

Exemplo: Vamos achar o salário médio dos funcionários com id > 2.

SELECT AVG(salary) AS average_salary
FROM employees
WHERE id > 2;

Resultado

average_salary
53500

Na conta entram só os salários com id = 3 e id = 4. Linha com NULL é ignorada.

Exemplo: Consultas mais avançadas com AVG()

Dá pra combinar o AVG() com outras funções agregadoras e operadores.

Imagina que a gente tem uma tabela de vendas sales:

sale_id product quantity price
1 Telefone 2 500
2 Notebook 1 1500
3 Tablet 3 300

Consulta pra calcular a média do total das vendas:

SELECT AVG(quantity * price) AS average_total_sale
FROM sales;

Resultado:

averagetotalsale
950

Dicas de vida e erros comuns

Trabalhar com AVG() tem que ser com atenção pra não cair em erro bobo:

Valores NULL: às vezes surpreende quando o resultado é menor do que você esperava. Lembra que o AVG() pula as linhas com NULL.

Mistura de tipos de dados: se na coluna tiver número misturado com texto (o que já é má prática), o AVG() vai dar erro.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION