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.

100%
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


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

SQL
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

SQL
-- 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;
⚠️ Observação: COUNT(*) conta todas as linhas, enquanto COUNT(col) conta as linhas em que col não é NULL.

(2) SUM/AVG: Soma/Média

SQL
-- 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

SQL
-- 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

SQL
-- By Department
SELECT 
    department,
    COUNT(*) AS emp_count,
    AVG(salary) AS avg_salary
FROM employees
GROUP BY department;
▶ Experimente

Saída:

TEXT 📖 Somente leitura
+-------------+-----------+-----------+
| 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

SQL
-- 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;
▶ Experimente

▶ Exemplo: Agrupamento por expressão

SQL
-- 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;
▶ Experimente

5. Filtragem e agrupamento no HAVING

O WHERE filtra linhas; o HAVING filtra grupos.

▶ Exemplo: Como usar HAVING

SQL
-- 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
▶ Experimente

6. Resumo com ROLLUP

▶ Exemplo: Linhas de resumo ROLLUP

SQL
-- Automatically generate total rows
SELECT 
    department,
    COUNT(*) AS emp_count,
    SUM(salary) AS total_salary
FROM employees
GROUP BY department WITH ROLLUP;
▶ Experimente

Saída:

TEXT 📖 Somente leitura
+-------------+-----------+--------------+
| 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

SQL
-- 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
▶ Experimente

❓ 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


📝 Exercícios

  1. Problema básico (Dificuldade: ⭐): Calcule o número de funcionários e o salário médio de cada departamento.

  2. 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.

  3. Desafio (Dificuldade: ⭐⭐⭐): Calcule o número de pedidos, o valor total e o valor médio para cada mês e use WITH ROLLUP para adicionar linhas de resumo anual.

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%