Funções básicas de agregação em SQL
Lição 4.1 · Tempo de leitura: ~8 minutos · Tarefas para praticar ↓
As funções de agregação em SQL transformam conjuntos de linhas em métricas de resumo: quantidade, soma, média, mínimo e máximo. Nesta aula, você vai praticar os agregados mais usados com exemplos da base Sakila e aprender a escolher o tipo correto de contagem para cada cenário. Ao final, você conseguirá usar COUNT, SUM, AVG, MIN e MAX com segurança em consultas analíticas.
Nas aulas anteriores, o foco foi selecionar linhas detalhadas. Agora avançamos para um passo essencial: gerar valores de resumo a partir dos dados.
As funções de agregação são fundamentais em relatórios e análise, porque respondem rapidamente perguntas como "quantos?", "qual o total?" e "qual a média?".
Principais funções de agregação
COUNT() - conta linhas
Sintaxe básica:
COUNT(expressao)
Exemplo:
SELECT COUNT(*) AS total_payments
FROM payment;
Resultado: a consulta retorna o total de linhas da tabela payment.
COUNT(column) e COUNT(*)
As duas formas parecem similares, mas funcionam de modo diferente:
COUNT(*)conta todas as linhas do resultado.COUNT(column)conta apenas as linhas em quecolumnnão éNULL.
Se a coluna tiver NULL, COUNT(column) pode ser menor que COUNT(*).
SELECT
COUNT(*) AS total_rentals,
COUNT(return_date) AS returned_rentals
FROM rental;
Explicação: total_rentals conta todos os aluguéis, enquanto returned_rentals conta apenas os que possuem return_date preenchida.
COUNT(DISTINCT ...) - conta valores únicos
Quando você precisa contar valores únicos, e não o total de linhas, use COUNT(DISTINCT column).
SELECT COUNT(DISTINCT customer_id) AS unique_customers
FROM payment;
Resultado: a consulta retorna quantos clientes diferentes realizaram pagamentos, mesmo que um cliente tenha várias linhas em payment.
Na prática, isso é essencial para perguntas como "quantos clientes diferentes compraram", em que COUNT(*) superestima por causa de repetições.
SUM() - calcula a soma
SELECT SUM(amount) AS total_amount
FROM payment;
Resultado: retorna a soma da coluna amount.
SUM(amount) ignora NULL. Se todos os valores forem NULL, o resultado será NULL.
AVG() - calcula a média
SELECT AVG(amount) AS average_amount
FROM payment;
Resultado: retorna a média de amount considerando apenas linhas não-NULL.
Se você precisar que linhas com NULL influenciem o denominador, use uma destas abordagens:
SELECT
AVG(amount) AS avg_ignore_null,
AVG(COALESCE(amount, 0)) AS avg_include_null_as_zero,
SUM(amount) / COUNT(*) AS avg_sum_div_all_rows
FROM payment;
MAX() - encontra o valor máximo
SELECT MAX(amount) AS max_amount
FROM payment;
Resultado: retorna o maior valor em amount.
MIN() - encontra o valor mínimo
SELECT MIN(amount) AS min_amount
FROM payment;
Resultado: retorna o menor valor em amount.
MIN() e MAX() ignoram NULL. Se todos os valores forem NULL, o resultado será NULL.
MIN(column) e ORDER BY ... LIMIT 1
Nem sempre essas abordagens são equivalentes.
SELECT MIN(column_name)
FROM table_name;
SELECT column_name
FROM table_name
ORDER BY column_name
LIMIT 1;
MIN(column_name)busca o menor valor entre os não-NULL.ORDER BY ... LIMIT 1retorna a primeira linha após a ordenação.- Se o SGBD ordenar
NULLprimeiro, a segunda consulta pode retornarNULL, enquantoMIN()retorna o menor valor não-NULL.
Versão confiável equivalente a MIN():
SELECT column_name
FROM table_name
WHERE column_name IS NOT NULL
ORDER BY column_name
LIMIT 1;
Aplicações práticas
Contar clientes
SELECT COUNT(*) AS total_customers
FROM customer;
Soma de vendas por funcionário
SELECT
staff_id,
SUM(amount) AS staff_total
FROM payment
GROUP BY staff_id;
Pagamento médio por cliente
SELECT
customer_id,
AVG(amount) AS avg_payment
FROM payment
GROUP BY customer_id;
Contar clientes pagantes únicos
SELECT COUNT(DISTINCT customer_id) AS paying_customers
FROM payment;
Perguntas frequentes
Qual e a diferença entre COUNT(*) e COUNT(column)?
COUNT(*) conta todas as linhas. COUNT(column) conta apenas as linhas em que a coluna especificada não é NULL.
Quando usar COUNT(DISTINCT ...)?
Quando você precisa do número de valores únicos, por exemplo clientes diferentes, e não do total de linhas.
Por que AVG pode retornar um valor inesperado?
Porque AVG(column) ignora NULL. Se você quiser incluir essas linhas no denominador, use COALESCE ou SUM(column) / COUNT(*).
Perguntas de entrevista
O que são funções de agregação em SQL?
São funções que calculam um resumo sobre várias linhas, como quantidade (COUNT), soma (SUM) e média (AVG). Elas retornam um valor por grupo ou para o conjunto inteiro.
Qual e a diferença entre COUNT(*), COUNT(column) e COUNT(DISTINCT column)?
COUNT(*) conta todas as linhas, COUNT(column) conta valores não-NULL da coluna, e COUNT(DISTINCT column) conta valores únicos não-NULL.
Como MIN e ORDER BY ... LIMIT 1 podem retornar resultados diferentes?
Se a coluna tiver NULL e o SGBD ordenar NULL primeiro, ORDER BY ... LIMIT 1 pode retornar NULL, enquanto MIN() retorna o menor valor não-NULL.
Principais conclusões desta aula:
- Funções de agregação geram métricas de resumo rapidamente.
COUNT(*),COUNT(column)eCOUNT(DISTINCT ...)atendem necessidades de contagem diferentes.SUM,AVG,MINeMAXgeralmente ignoramNULL, o que impacta a análise.COUNT(DISTINCT ...)é essencial para contar entidades únicas, não apenas linhas.- Tratar
NULLcorretamente é decisivo para a confiabilidade dos relatórios.