【Introdução às Funções SQL】Domine a Agregação de Dados com SUM, AVG, MAX e MIN!
Ao criar relatórios de vendas para um site, informações como "Quais são as vendas totais deste mês?", "Qual é o preço médio dos nossos produtos?" e "Qual foi o item mais caro vendido?" são essenciais. Quando você quer pegar dados individuais armazenados em um banco de dados e agregá-los em um único número significativo, as funções de agregação do SQL liberam seu imenso poder.
Uma função de agregação é uma função que recebe dados de várias linhas como entrada e retorna um único valor como resultado. Você pode pensar nisso como alimentar uma pilha de papéis com números em uma calculadora para obter uma única resposta, como um "total" ou uma "média".
Este artigo explicará detalhadamente como usar os "quatro grandes" das funções de agregação, que estão entre as mais frequentemente usadas e são fundamentais para a análise de dados: SUM(), AVG(), MAX(), e MIN(), completo com código que você pode copiar e colar. Ao dominar estas funções e combiná-las com GROUP BY, suas capacidades de análise de dados melhorarão drasticamente!
Preparação: Vamos Preparar Nossos Dados de Vendas para Agregação
Para experimentar as funções de agregação, primeiro precisamos de alguns dados numéricos para trabalhar. Desta vez, vamos criar uma tabela sales que imita o histórico de vendas de um site de e-commerce. Ao incluir dados de várias categorias e com diferentes preços e quantidades, a função de cada função de agregação se tornará mais clara.
-- Se a tabela sales existir, exclua-a (para testes repetíveis)
DROP TABLE IF EXISTS sales;
-- Crie uma nova tabela sales
CREATE TABLE sales (
id INTEGER PRIMARY KEY,
product_name TEXT NOT NULL,
category TEXT NOT NULL,
price INTEGER NOT NULL,
quantity INTEGER NOT NULL,
sale_date DATE NOT NULL
);
-- Insira dados iniciais
INSERT INTO sales (id, product_name, category, price, quantity, sale_date) VALUES
(1, 'Caneta Esferográfica Incrível', 'Papelaria', 150, 10, '2025-07-01'),
(2, 'Caderno Mágico', 'Papelaria', 300, 5, '2025-07-01'),
(3, 'Panela de Arroz Definitiva', 'Eletrodomésticos', 25000, 2, '2025-07-02'),
(4, 'Maçã Milagrosa', 'Alimentos', 500, 20, '2025-07-03'),
(5, 'Hub USB-C', 'Periféricos de PC', 4000, 3, '2025-07-03'),
(6, 'Pincel Tradicional', 'Papelaria', 1200, 8, '2025-07-04'),
(7, 'Chocolate Premium', 'Alimentos', 3500, 5, '2025-07-05'),
(8, 'Caneta Esferográfica Incrível', 'Papelaria', 150, 15, '2025-07-05');
Agora estamos prontos para agregar dados de vários ângulos.
【Soma】Encontrando o Total com a Função `SUM()`
A função SUM() calcula o valor total de uma coluna numérica especificada. É uma das funções de agregação mais básicas, usada em inúmeros cenários de negócios onde você precisa saber um "total", como "vendas totais", "estoque total" ou "pontos totais".
Você especifica a coluna que quer somar dentro dos parênteses de SUM(). Também é possível somar o resultado de um cálculo entre colunas.
Cenário: "Qual é o valor total de todas as vendas (receita total)?"
Neste caso, calculamos "preço (price) * quantidade (quantity)" para cada registro e depois somamos todos esses resultados.
SELECT SUM(price * quantity) AS receita_total FROM sales;
Resultado:
receita_total
-------------
102850
Usar AS receita_total para dar à coluna de resultados um nome claro e significativo também é um ponto chave.
【Média】Encontrando o Valor Médio com a Função `AVG()`
A função AVG() (abreviação de Average) calcula o valor médio de uma coluna numérica especificada. É útil para entender as tendências gerais em seus dados, como "idade média", "pontuação média" ou "preço unitário médio".
Cenário: "Qual é o preço unitário médio dos produtos vendidos?"
SELECT AVG(price) AS preco_medio FROM sales;
Resultado:
preco_medio
-----------
5562.5
Como um ponto de atenção, lembre-se que se a coluna sendo calculada contiver valores `NULL`, SUM() e AVG() ignorarão essas linhas em sua agregação. Isso pode, às vezes, levar a resultados inesperados.
【Máximo e Mínimo】Encontrando os Valores Máximo e Mínimo com `MAX()` e `MIN()`
MAX() (Maximum) e MIN() (Minimum) são, como seus nomes sugerem, funções para obter os valores máximo e mínimo em uma coluna. É eficiente aprender estas duas como um par.
A Função `MAX()`: Encontrando o Maior Valor
Cenário: "Qual foi a venda de maior valor em uma única transação?"
SELECT MAX(price * quantity) AS venda_mais_alta FROM sales;
Resultado:
venda_mais_alta
---------------
50000
Essa é a venda da 'Panela de Arroz Definitiva' com ID 3 (25.000 * 2).
A Função `MIN()`: Encontrando o Menor Valor
Cenário: "Entre os produtos vendidos, qual é o preço unitário mais barato?"
SELECT MIN(price) AS preco_mais_baixo FROM sales;
Resultado:
preco_mais_baixo
----------------
150
MAX() e MIN() não são apenas para números; eles também podem ser usados em datas (para encontrar a data mais recente/antiga) e strings (para encontrar a última/primeira em ordem alfabética), tornando-as funções muito versáteis.
【A Combinação Suprema】A Cláusula `GROUP BY` e as Funções de Agregação
O verdadeiro poder destas quatro funções de agregação é mais evidente quando são combinadas com a cláusula GROUP BY. Usando GROUP BY, você pode agrupar dados pelos valores em uma coluna específica e depois aplicar funções de agregação a **cada um** desses grupos.
Isso permite uma análise mais prática e detalhada, como "vendas totais por categoria" ou "número médio de unidades vendidas por produto".
Cenário: "Para cada categoria de produto, quero agregar a receita total, o preço unitário médio e a quantidade total vendida."
SELECT
category,
SUM(price * quantity) AS receita_total,
AVG(price) AS preco_medio,
SUM(quantity) AS quantidade_total_vendida
FROM
sales
GROUP BY
category;
Resultado:
category | receita_total | preco_medio | quantidade_total_vendida
-------------------|---------------|-------------|--------------------------
Periféricos de PC | 12000 | 4000 | 3
Eletrodomésticos | 50000 | 25000 | 2
Papelaria | 13350 | 550 | 33
Alimentos | 27500 | 2000 | 25
Com esta única consulta, o desempenho detalhado de vendas para cada categoria agora está claro de relance. Ao combinar funções de agregação com GROUP BY desta forma, você pode extrair "insights" críticos para os negócios a partir de dados brutos que antes eram apenas uma lista de números.
【Playground Interativo】Experimente a Agregação de Dados Executando SQL no seu Navegador!
Agora é hora de transformar conhecimento em habilidade! Copie todo o código HTML abaixo, salve-o como um arquivo tipo sql_aggregate_test.html, e abra-o no seu navegador. Seu próprio ambiente SQL pessoal será iniciado, pré-carregado com a tabela sales que usamos neste artigo.
Tente trocar `SUM` por `AVG`, ou adicionar colunas diferentes à cláusula `GROUP BY`. Experimente livremente e veja por si mesmo como os dados são agregados e transformados em informações significativas!
<!DOCTYPE html>
<html lang="pt">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Playground Online de Funções de Agregação do SQL</title>
<style>
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; line-height: 1.7; color: #333; max-width: 800px; margin: 2rem auto; padding: 0 1rem; }
h1 { color: #2980b9; }
textarea { width: 100%; height: 220px; font-family: "SF Mono", "Consolas", monospace; font-size: 16px; padding: 12px; border: 1px solid #ccc; border-radius: 6px; box-sizing: border-box; margin-bottom: 1rem; }
button { background-color: #3498db; color: white; border: none; padding: 12px 22px; font-size: 16px; border-radius: 6px; cursor: pointer; transition: background-color 0.2s; }
button:hover { background-color: #2980b9; }
button:disabled { background-color: #bdc3c7; cursor: not-allowed; }
#result-container { margin-top: 2rem; border: 1px solid #ddd; padding: 1rem; border-radius: 6px; background: #fdfdfd; min-height: 50px; }
#error-message { color: #e74c3c; font-weight: bold; }
table { border-collapse: collapse; width: 100%; margin-top: 1rem; }
th, td { border: 1px solid #ddd; padding: 10px; text-align: left; }
th { background-color: #f2f2f2; }
tr:nth-child(even) { background-color: #f9f9f9; }
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.10.3/sql-wasm.js"></script>
</head>
<body>
<h1>Vamos Experimentar o SQL!</h1>
<p>Digite uma instrução SQL na área de texto abaixo e clique no botão "Executar". Vamos tentar várias agregações!</p>
<textarea id="sql-input">-- Vamos agrupar por nome de produto e calcular a receita total e a quantidade total para cada produto
SELECT
product_name,
SUM(price * quantity) AS receita_total,
SUM(quantity) AS quantidade_total
FROM
sales
GROUP BY
product_name
ORDER BY
receita_total DESC;
</textarea>
<button id="execute-btn">Executar</button>
<div id="result-container">
<p id="error-message"></p>
<div id="result-output"></div>
</div>
<script>
const sqlInput = document.getElementById('sql-input');
const executeBtn = document.getElementById('execute-btn');
const errorMsg = document.getElementById('error-message');
const resultOutput = document.getElementById('result-output');
let db;
async function initDb() {
executeBtn.disabled = true;
executeBtn.textContent = 'Inicializando BD...';
try {
const SQL = await initSqlJs({
locateFile: file => `https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.10.3/${file}`
});
db = new SQL.Database();
const setupSql = `
DROP TABLE IF EXISTS sales;
CREATE TABLE sales (id INTEGER PRIMARY KEY, product_name TEXT NOT NULL, category TEXT NOT NULL, price INTEGER NOT NULL, quantity INTEGER NOT NULL, sale_date DATE NOT NULL);
INSERT INTO sales (id, product_name, category, price, quantity, sale_date) VALUES
(1, 'Caneta Esferográfica Incrível', 'Papelaria', 150, 10, '2025-07-01'),
(2, 'Caderno Mágico', 'Papelaria', 300, 5, '2025-07-01'),
(3, 'Panela de Arroz Definitiva', 'Eletrodomésticos', 25000, 2, '2025-07-02'),
(4, 'Maçã Milagrosa', 'Alimentos', 500, 20, '2025-07-03'),
(5, 'Hub USB-C', 'Periféricos de PC', 4000, 3, '2025-07-03'),
(6, 'Pincel Tradicional', 'Papelaria', 1200, 8, '2025-07-04'),
(7, 'Chocolate Premium', 'Alimentos', 3500, 5, '2025-07-05'),
(8, 'Caneta Esferográfica Incrível', 'Papelaria', 150, 15, '2025-07-05');
`;
db.run(setupSql);
executeBtn.disabled = false;
executeBtn.textContent = 'Executar';
resultOutput.innerHTML = '<p>Pronto! Sinta-se à vontade para experimentar suas próprias consultas SQL.</p>';
} catch (err) {
errorMsg.textContent = 'Falha ao inicializar o banco de dados: ' + err.message;
console.error(err);
}
}
function executeSql() {
if (!db) return;
const sql = sqlInput.value;
errorMsg.textContent = '';
resultOutput.innerHTML = '';
try {
const results = db.exec(sql);
if (results.length === 0) {
resultOutput.innerHTML = '<p>Consulta executada com sucesso, mas nenhum conjunto de resultados foi retornado.</p>';
return;
}
results.forEach(result => {
const table = document.createElement('table');
const thead = document.createElement('thead');
const tbody = document.createElement('tbody');
const headerRow = document.createElement('tr');
result.columns.forEach(colName => {
const th = document.createElement('th');
th.textContent = colName;
headerRow.appendChild(th);
});
thead.appendChild(headerRow);
result.values.forEach(row => {
const bodyRow = document.createElement('tr');
row.forEach(cellValue => {
const td = document.createElement('td');
td.textContent = cellValue === null ? 'NULL' : (typeof cellValue === 'number' ? cellValue.toLocaleString('pt-BR') : cellValue);
bodyRow.appendChild(td);
});
tbody.appendChild(bodyRow);
});
table.appendChild(thead);
table.appendChild(tbody);
resultOutput.appendChild(table);
});
} catch (err) {
errorMsg.textContent = 'Erro de SQL: ' + err.message;
console.error(err);
}
}
executeBtn.addEventListener('click', executeSql);
initDb();
</script>
</body>
</html>
Conclusão
Neste artigo, aprendemos sobre as quatro funções de agregação fundamentais para análise de dados: `SUM()`, `AVG()`, `MAX()`, e `MIN()`.
- `SUM()`: Calcula o total de valores numéricos. Usado para "vendas totais", "quantidade total", etc.
- `AVG()`: Calcula a média de valores numéricos. Usado para "preço médio", "pontuação média", etc.
- `MAX()`: Encontra o valor máximo entre números, datas, etc. Usado para "preço mais alto", "data mais recente", etc.
- `MIN()`: Encontra o valor mínimo entre números, datas, etc. Usado para "preço mais baixo", "data mais antiga", etc.
- A Arma Suprema, `GROUP BY`: Estas funções de agregação mostram seu verdadeiro poder quando combinadas com a cláusula
GROUP BY, permitindo a agregação para cada grupo. - Uma Nota de Cautela: Estas funções de agregação não incluem valores `NULL` em seus cálculos.
Estas funções de agregação são o primeiro passo não apenas para recuperar dados, mas para obter insights significativos deles. São ferramentas incrivelmente poderosas para um criador web, úteis para tudo, desde a tomada de decisões de negócios até a identificação de áreas para melhoria do site. Encorajamos você a dominar estas funções e a experimentar a alegria de conversar com seus dados!