MySQL: Uma explicação detalhada das funções agregadas do…
Última atualização: 2026-08-26
As funções de agregação são fundamentais para a análise de dados — a estatística, o agrupamento e a síntese dependem delas.
Esta aula oferece uma explicação detalhada sobre funções de agregação e consultas agrupadas.
graph TB
A[Aggregate Query Process] --> B[FROM Data Sources]
B --> C[WHERE Filter Rows]
C --> D[GROUP BY Grouping]
D --> E[Aggregate Functions<br/>COUNT/SUM/AVG/MAX/MIN]
E --> F[HAVING Filter Group]
F --> G[SELECT Output]
G --> H[ORDER BY Sort]
H --> I[WITH ROLLUP Summary]
1. O que você vai aprender
- Uso das funções COUNT/SUM/AVG/MAX/MIN
- GROUP BY: Estatísticas agrupadas
- Grupos de filtros HAVING
- COM linhas de resumo ROLLUP
- A relação entre funções agregadas e NULL
2. Histórias reais por trás das estatísticas do relatório
(1) Problema: o Excel é muito lento para a análise de dados
Um gerente de operações precisa compilar estatísticas sobre o número de funcionários em cada departamento, o salário médio e o salário mais alto.
O uso do Excel exige a criação de várias fórmulas, e os cálculos precisam ser refeitos sempre que os dados são atualizados.
(2) Resolução de funções agregadas
SELECT
department,
COUNT(*) AS emp_count,
AVG(salary) AS avg_salary,
MAX(salary) AS max_salary
FROM employees
GROUP BY department;
3. Funções de agregação
(1) CONTAR
-- Count the total number of lines
SELECT COUNT(*) FROM employees;
-- Count non-NULL rows
SELECT COUNT(email) FROM employees;
-- Count the number of unique entries
SELECT COUNT(DISTINCT department) FROM employees;
COUNT(*) conta todas as linhas, enquanto COUNT(col) conta as linhas em que col não é NULL.
(2) SUM/AVG: Soma/Média
-- Total Wages
SELECT SUM(salary) FROM employees;
-- Average Wage
SELECT AVG(salary) FROM employees;
-- Conditional Summation
SELECT SUM(amount) FROM orders WHERE status = 'paid';
(3) MAX/MIN Máximo/Mínimo
-- Highest Salary
SELECT MAX(salary) FROM employees;
-- Minimum Wage
SELECT MIN(salary) FROM employees;
-- Earliest/Latest Date
SELECT MIN(hire_date) AS earliest, MAX(hire_date) AS latest FROM employees;
4. GROUP BY
▶ Exemplo: Agrupamento por um único campo
-- By Department
SELECT
department,
COUNT(*) AS emp_count,
AVG(salary) AS avg_salary
FROM employees
GROUP BY department;
Saída:
+-------------+-----------+-----------+
| department | emp_count | avg_salary|
+-------------+-----------+-----------+
| Engineering | 15 | 8500.00 |
| Sales | 10 | 6000.00 |
| Marketing | 8 | 5500.00 |
| HR | 5 | 5000.00 |
+-------------+-----------+-----------+
▶ Exemplo: Agrupamento por vários campos
-- By department and job title
SELECT
department,
job_title,
COUNT(*) AS count,
AVG(salary) AS avg_salary
FROM employees
GROUP BY department, job_title
ORDER BY department, avg_salary DESC;
▶ Exemplo: Agrupamento por expressão
-- Orders by Year
SELECT
YEAR(order_date) AS year,
COUNT(*) AS order_count,
SUM(amount) AS total_amount
FROM orders
GROUP BY YEAR(order_date);
-- Statistics by Age Group
SELECT
CASE
WHEN age < 18 THEN 'Under 18'
WHEN age BETWEEN 18 AND 30 THEN '18-30'
WHEN age BETWEEN 31 AND 50 THEN '31-50'
ELSE 'Over 50'
END AS age_group,
COUNT(*) AS count
FROM users
GROUP BY age_group;
5. Filtragem e agrupamento no HAVING
O WHERE filtra linhas; o HAVING filtra grupos.
▶ Exemplo: Como usar HAVING
-- Find the average wage > 6000 the department
SELECT
department,
AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING avg_salary > 6000;
-- Find the number of orders > 10 's customers
SELECT
customer_id,
COUNT(*) AS order_count,
SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id
HAVING order_count > 10;
-- WHERE + GROUP BY + HAVING Combination
SELECT
department,
AVG(salary) AS avg_salary
FROM employees
WHERE hire_date >= '2024-01-01' -- Filter the rows first
GROUP BY department -- Regroup
HAVING avg_salary > 6000; -- Final Filter Group
6. Resumo com ROLLUP
▶ Exemplo: Linhas de resumo ROLLUP
-- Automatically generate total rows
SELECT
department,
COUNT(*) AS emp_count,
SUM(salary) AS total_salary
FROM employees
GROUP BY department WITH ROLLUP;
Saída:
+-------------+-----------+--------------+
| department | emp_count | total_salary |
+-------------+-----------+--------------+
| Engineering | 15 | 127500.00 |
| Sales | 10 | 60000.00 |
| Marketing | 8 | 44000.00 |
| HR | 5 | 25000.00 |
| NULL | 38 | 256500.00 | -- Total
+-------------+-----------+--------------+
7. Funções agregadas e NULL
| Função | Tratamento de NULL |
|---|---|
COUNT(*) |
Contém linhas com valores NULL |
COUNT(col) Excluir valores NULL |
|
SUM(col) ignorar NULL |
|
AVG(col) |
Ignorar NULL (o denominador não contém NULL) |
MAX(col) ignorar NULL |
|
MIN(col) ignorar NULL |
▶ Exemplo: Tratamento de valores NULL
-- COUNT(*) vs COUNT(email)
SELECT
COUNT(*) AS total_rows,
COUNT(email) AS has_email,
COUNT(*) - COUNT(email) AS no_email
FROM users;
-- AVG Ignore NULL
SELECT AVG(salary) FROM employees; -- NULL Not included in the calculation
❓ Perguntas Frequentes
P: É possível usar WHERE e HAVING juntos? R: Sim. Ordem de execução: WHERE (filtrar linhas) → GROUP BY (agrupar) → HAVING (filtrar grupos) → SELECT → ORDER BY.
P: Os campos da cláusula GROUP BY precisam ser incluídos na cláusula SELECT? R: No Modo Estrito do MySQL, os campos não agregados da cláusula SELECT devem ser incluídos na cláusula GROUP BY.
P: O que é mais rápido, COUNT(*) ou COUNT(1)? R: Ambos são igualmente rápidos. O otimizador do MySQL seleciona automaticamente a melhor abordagem.
P: As funções agregadas podem ser aninhadas? R: Elas não podem ser aninhadas diretamente
AVG(SUM(...)). Use subconsultas:SELECT AVG(total) FROM (SELECT SUM(amount) AS total FROM orders GROUP BY customer_id) t.
📖 Resumo
- COUNT/SUM/AVG/MAX/MIN são as cinco principais funções de agregação
- GROUP BY Agrupa por campo; é possível combinar vários campos
- HAVING filtra por grupo (é possível usar funções de agregação), WHERE filtra por linha (não é possível usar funções de agregação)
- COM AGREGADO Gera automaticamente linhas de resumo
- NULL é ignorado nas funções de agregação (exceto na função COUNT(*))
📝 Exercícios
-
Problema básico (Dificuldade: ⭐): Calcule o número de funcionários e o salário médio de cada departamento.
-
Problema avançado (Dificuldade ⭐⭐): Encontre os clientes cujo valor total do pedido seja superior a 10.000 e classifique-os em ordem decrescente por valor total.
-
Desafio (Dificuldade: ⭐⭐⭐): Calcule o número de pedidos, o valor total e o valor médio para cada mês e use
WITH ROLLUPpara adicionar linhas de resumo anual.