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.
GO TO FULL VERSION