Voltar para a lista de artigos Artigos
10 minutos de leitura

Uma Visão Geral das Funções Agregadas em SQL

As funções agregadas são comumente usadas em SQL. Este artigo o guiará através de seu uso e mostrará exemplos de como elas funcionam.

As funções agregadas de SQL são uma ferramenta útil, especialmente para a criação de relatórios. Elas não são difíceis de entender, especialmente se você tem alguma experiência com Excel ou programas similares. Você provavelmente já usou funções agregadas como SUM ou AVERAGE em uma planilha de cálculo. Mesmo que você as utilize apenas ocasionalmente, conhecer funções agregadas pode ajudá-lo a entender melhor seus dados e trabalhar de forma mais eficiente.

Tudo o que vou cobrir neste artigo é explicado com mais detalhes em nosso Como Criar Relatórios Básicos em SQL curso, onde você também pode praticar todas as funções que aprender aqui.

O que são funções agregadas do SQL?

Em SQL, as funções agregadas realizam um cálculo em várias linhas e retornam um valor. Elas são freqüentemente usadas na declaração GROUP BY, mas também podem ser usadas sem ela. Existem cinco funções agregadas em SQL:

  • COUNT()
  • SUM()
  • AVG()
  • MIN()
  • MAX()

Não vou explicar a declaração GROUP BY aqui. Não há necessidade, já que já temos um excelente artigo sobre como GROUP BY funciona. Se você não está familiarizado com GROUP BY, sugiro que leia esse artigo e depois volte aqui.

O que cada função agregada faz?

Os nomes das funções acima são auto-explicativos, pelo menos na minha opinião. Talvez você já tenha descoberto o que elas fazem só de olhar para elas. No entanto, uma breve explicação não lhe fará mal:

FunctionExplanationIgnores NULL values
COUNT()Counts the number of rows in a table
SUM()Calculates the sum of column values
AVG()Calculates the average column value
MIN()Returns the minimum value from a set of values
MAX()Returns the maximum value from a set of values

A Tabela de Vendas

Vou utilizar apenas uma tabela para mostrar como funcionam as funções agregadas. Ela é nomeada sales e consiste nos seguintes atributos:

  • id - A identificação do vendedor.
  • first_name - O primeiro nome do vendedor.
  • last_name - Sobrenome do vendedor.
  • items_sold - O número de itens vendidos.
  • product - O nome do produto vendido.
  • date - A data da venda.

Aqui estão várias filas para mostrar como são os dados:

idfirst_namelast_nameitems_soldproductdate
1FrankCoyle42.00Product 12020-12-01
2FrankCoyle81.00Product 22020-12-01
3FrankCoyle14.00Product 32020-12-01
4NatashaHorvat69.00Product 12020-12-01
5NatashaHorvat44.00Product 22020-12-01

Note que um vendedor pode aparecer em várias filas. O mesmo vale para o produto e a data. Isto significa que um vendedor pode vender vários produtos em várias datas. Significa também que em uma data o mesmo produto pode ser vendido por vários vendedores. Isto é importante lembrar para os exemplos que se seguirão.

Usando COUNT()

Você já aprendeu que esta função é usada para contar as filas em uma tabela. Então, vamos contá-las!

COUNT() Sem GRUPO POR

Primeiro, vamos contar o número de filas no sales mesa. Aqui está o código:

SELECT COUNT (id) AS number_of_columns
FROM sales;

Este código utiliza a função COUNT() para contar o número de linhas na coluna id. Se você contar o número de linhas nesta coluna, é também o número total de linhas na tabela. A execução do código retornará os resultados na coluna number_of_columns. Há 27 linhas:

number_of_columns
27

Esperamos que você não esteja tendo problemas com esta simples declaração do SELECT. Se você estiver, o curso SQL para Iniciantes pode ser benéfico. Ele lhe ensinará os princípios fundamentais de bancos de dados, agregação e consulta em uma ou várias tabelas.

COUNT() com GROUP BY

Sua próxima tarefa é contar o número de diferentes produtos vendidos por cada vendedor. Pense em como os dados são apresentados na tabela sales. Tendo considerado isso, seu código deve ser parecido com este:

SELECT	first_name,
		last_name,
		COUNT (DISTINCT product) AS number_of_products
FROM sales
GROUP BY first_name, last_name;

A consulta primeiro seleciona o primeiro nome e o sobrenome do vendedor. Em seguida, utiliza a função COUNT() para contar o número de produtos, com o resultado mostrado na coluna number_of_products.

Note que há uma cláusula DISTINCT. Isto significa que o código contará apenas produtos distintos - ou seja, contará um produto específico apenas na primeira vez em que aparecer para um determinado vendedor. A cláusula DISTINCT é essencial nesta consulta porque o mesmo produto pode aparecer várias vezes em datas diferentes. Caso contrário, a função COUNT() contaria um produto toda vez que ele aparecesse na tabela, o que não é o resultado que você deseja.

Finalmente, a saída do código é agrupada pelas colunas first_name e last_name porque quero ver o resultado para cada vendedor. Aqui está o resultado:

first_namelast_namenumber_of_products
FrankCoyle3
NatashaHorvat3
YolandaMartinez3

Há três vendedores e cada um deles vende três produtos diferentes.

A função COUNT() é interessante, pois ignora os valores NULL. Devido a esta característica, você deve ter cuidado ao decidir o que quer contar e como. Aqui está um artigo que discute as nuances da função COUNT(). Ele pode ajudá-lo com essas decisões.

Se você quiser fortalecer seus conhecimentos sobre a declaração GROUP BY, tente nosso curso Como Criar Relatórios Básicos em SQL como um conjunto de práticas para GROUP BY. Neste curso, GROUP BY é explicado em detalhes, o que pode ser útil.

SUM() Sem GRUPO POR

Depois de contar as linhas, agora é o momento de aprender a somar todos os valores em uma tabela. Desta vez, sua tarefa é obter o número total de itens vendidos. Você tem uma idéia de como fazer isso? Não se apresse; tome seu tempo antes de dar uma olhada na minha solução.

Está bem, confio que você tenha tomado seu tempo; aqui está o código:

SELECT SUM(items_sold) AS total_items_sold
FROM sales;

Esta simples consulta soma a coluna items_sold da tabela sales. O resultado aparecerá na coluna total_items_sold; aqui está ele:

total_items_sold
1275.00

SUM() com GROUP BY

Agora que você está familiarizado com a função SUM(), vamos complicar um pouco as coisas. Que tal você fazer todos felizes e calcular o número de itens vendidos por produto? Aqui está como fazer isso:

SELECT	product,
		SUM(items_sold) AS items_sold_per_product
FROM sales
GROUP BY product;

Este código seleciona o produto da coluna a partir da tabela sales. Em seguida, ele soma o número de itens vendidos e mostra o resultado na coluna items_sold_per_product. Como sua tarefa é mostrar o número de itens por produto, você deve agrupar o resultado por produto. Voilá, o resultado é:

productitems_sold_per_product
Product 1442.00
Product 2639.00
Product 3194.00

Se você estiver interessado em verificar o resultado, acrescente todos os valores acima e você receberá 1.275. Esta soma é precisamente o resultado que você obteve no exemplo anterior.

Deixe-me agora mostrar-lhe o que a função AVG() faz.

AVG() Sem GRUPO POR

Como você já sabe, a função AVG() calcula o valor médio de um conjunto de valores. Para mostrar como funciona, imaginemos que você precisa calcular o número médio de itens vendidos. Aqui está uma consulta que lhe dará o resultado correto:

SELECT AVG(items_sold) AS avg_number_of_items_sold
FROM sales;

Este código é similar ao exemplo da função SUM(). Ele agora usa a função AVG() para calcular os valores médios na coluna items_sold. O resultado do código aparecerá na coluna avg_number_of_items_sold.

O código pequeno retorna uma pequena tabela:

avg_number_of_items_sold
47.222222

Tenha cuidado quando estiver usando AVG() em uma coluna com valores NULL. Esta função não levará em conta as linhas que contêm os valores NULL, portanto o valor médio pode ser diferente do que você espera. Deixe-me mostrar a você o que quero dizer. Eu modifiquei a função sales tabela para mostrar como isto funciona:

idfirst_namelast_nameitems_soldproductdate
1FrankCoyle42Product 12020-12-01
2FrankCoyle81Product 22020-12-01
3FrankCoyle14Product 32020-12-01
4NatashaHorvatNULLProduct 12020-12-01

Qual será o valor médio do items_sold? Seu palpite é que a função AVG() trataria o valor NULL como zero? Algo parecido com isto:

AVG = (42+81+14+0)/4 = 34.25

Não, seu palpite está errado! Ignorar os valores NULL significa que a linha é tratada como se não existisse de todo. Assim:

AVG = (42+81+14)/3 = 45.67

AVG() com GROUP BY

Desta vez, você precisa de um relatório que mostre a média de itens vendidos por data. Como você faria isso usando a função AVG() com GROUP BY? Você provavelmente já descobriu isso sozinho. Caso não o tenha feito, aqui está a solução:

SELECT	date,
		AVG(items_sold) AS avg_items_per_date
FROM sales
GROUP BY date;

Esta consulta seleciona a data da coluna a partir da tabela sales. Novamente, a média dos itens vendidos é calculada e o resultado é mostrado na coluna avg_items_per_date. Você deseja que o resultado seja exibido por data, portanto, é necessário agrupar o resultado na coluna date.

dateavg_items_per_date
2020-12-0147
2020-12-0259
2020-12-0335.666666

Três funções agregadas para baixo, duas para ir. Vamos agora ter uma chance nas funções MIN() e MAX(). Você quase pode pensar nelas como uma função.

MIN() e MAX() Sem GRUPO POR

As funções MIN() e MAX() podem ser vistas como os pólos opostos de uma função. Elas funcionam da mesma maneira, apenas uma função retorna o valor mínimo e a outra o valor máximo em um conjunto de valores.

Para mostrar como funcionam essas duas funções, vamos mostrar o número mínimo e máximo de itens vendidos em um dia. Como você faria isso? Uma vez que os dados na tabela sales está em um nível de data, é simples:

SELECT	MIN(items_sold) AS min_daily_sale,
		MAX(items_sold) AS max_daily_sale
FROM sales;

O código primeiro usa a função MIN() na coluna items_sold para encontrar o menor valor. O resultado aparecerá na coluna min_daily_sale. A função MAX() encontra o maior valor, com o resultado sendo mostrado na coluna max_daily_sale. Execute o código e este é o resultado que você obterá:

min_daily_salemax_daily_sale
7.00122.00

MIN() e MAX() com GROUP BY

No exemplo anterior, não recebemos nada além dos menores e maiores valores de venda diária. Não sabemos nada além disso. Para apimentar este relatório, vamos mostrar o mínimo e o máximo dos itens vendidos por vendedor e por produto. Pronto para ver a solução? Aqui está ela:

SELECT	first_name,
		last_name,
		product,
		MIN(items_sold) AS min_sold_per_product,
		MAX(items_sold) AS max_sold_per_product
FROM sales
GROUP BY first_name, last_name, product;

Sua última pergunta para hoje merece ser a mais longa. Não deixe que isso o assuste; não há nada que você já não saiba. A consulta seleciona as colunas first_name, last_name, e o produto da tabela de vendas. Depois vem a função MIN(); ela é usada para calcular a menor quantidade de itens vendidos por produto; o resultado é mostrado na coluna min_sold_per_product. Em seguida, há o maior número de itens vendidos por produto na coluna max_sold_per_product. Finalmente, o resultado precisa ser agrupado pelos primeiro e último nomes dos vendedores e o nome do produto. Aqui está o relatório:

first_namelast_nameproductmin_sold_per_productmax_sold_per_product
FrankCoyleProduct 121.0066.00
FrankCoyleProduct 267.0099.00
FrankCoyleProduct 314.0025.00
NatashaHorvatProduct 112.0069.00
NatashaHorvatProduct 244.00122.00
NatashaHorvatProduct 324.0031.00
YolandaMartinezProduct 128.00112.00
YolandaMartinezProduct 230.0067.00
YolandaMartinezProduct 37.0033.00

Como eu prometi, esta é sua última tarefa! Agora a melhor coisa que você pode fazer é praticar as funções agregadas do SQL por conta própria. Talvez tente nossas Curso de Práticas em SQLque tem uma bela seção em GROUP BY. Ou simplesmente dê uma olhada em outro artigo, que dá cinco exemplos de GROUP BY; talvez seja exatamente o que você precisa.

Você acha úteis as funções agregadas de SQL?

Ler este artigo não é tudo o que você precisa para ser proficiente em funções agregadas. Entretanto, eu tentei lhe dar uma visão geral prática das funções agregadas do SQL - o que elas fazem e como o fazem. Também lhe mostrei como usar as funções agregadas com e sem GROUP BY. Agora talvez seja um bom momento para aprofundar no GROUP BY, considerando a utilidade que o GROUP BY e suas extensões podem ter no mundo do trabalho.

Sinta-se à vontade para compartilhar sua experiência com as funções agregadas do SQL na seção de comentários.