🎯 Faltam poucos dias para este mês Apoie SQLTest.online e ajude-nos a manter a prática de SQL gratuita para todos. Doe hoje →
Código SQL copiado para a área de transferência

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?".

Funções de agregação SQL na tabela payment: COUNT(*) 16049, COUNT(DISTINCT customer_id) 599, SUM, AVG, MIN e MAX de amount, e o que COUNT(*), COUNT(coluna) e COUNT(DISTINCT) contam

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 que column nã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 1 retorna a primeira linha após a ordenação.
  • Se o SGBD ordenar NULL primeiro, a segunda consulta pode retornar NULL, enquanto MIN() 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) e COUNT(DISTINCT ...) atendem necessidades de contagem diferentes.
  • SUM, AVG, MIN e MAX geralmente ignoram NULL, o que impacta a análise.
  • COUNT(DISTINCT ...) é essencial para contar entidades únicas, não apenas linhas.
  • Tratar NULL corretamente é decisivo para a confiabilidade dos relatórios.

Tente resolver as tarefas a seguir para reforcar o que voce aprendeu nesta licao.

  1. Encontre a duração média de um filme
  2. Custo mínimo e máximo de reposição de filmes
  3. O que é "Agregação" em SQL?
  4. Soma de Reservas
  5. Contar filmes de um ator