Pular para o conteúdo principal

Como usar GROUP BY e HAVING no SQL

Um guia intuitivo para você descobrir os dois comandos SQL mais populares para agregar linhas do seu conjunto de dados
Actualizado 18 de jul. de 2024  · 6 min de leitura

Agregação é outro nome para resumir seus pontos de dados para obter um único valor. Por exemplo, calcular a média ou o mínimo. Às vezes, a agregação de todos os seus dados resultará em um valor que não é útil.

Por exemplo, se você estiver explorando o comportamento de compra em sua loja e as pessoas que entram nela forem uma mistura de estudantes pobres e profissionais ricos, será mais informativo calcular o gasto médio desses grupos separadamente. Ou seja, você precisa agregar o valor gasto, agrupado por diferentes segmentos de clientes.

Este tutorial aborda a instrução SQL GROUP BY, bem como a instrução HAVING, que ajuda você a controlar quais linhas de dados estão incluídas em cada grupo. 

HAVING está intimamente relacionado à instrução WHERE, e você pode querer ler a Introdução à cláusula Cláusula WHERE em SQL primeiro. Você também deve entender as instruções SELECT e FROM, conforme abordado no Exemplos e tutorial de consulta SQL.

Para executar facilmente todo o código de exemplo deste tutorial, você pode criar uma pasta de trabalho do DataLab gratuitamente com o SQL, o banco de dados e todos os exemplos de código pré-carregados para você.

Vamos começar!

Banco de dados de empresas de unicórnios

Usaremos o Banco de Dados de Empresas Unicórnio, que está disponível no DataLab, o notebook de dados habilitado para IA do DataCamp. Essas empresas são chamadas de "Unicórnio" porque são empresas iniciantes com uma avaliação de mais de um bilhão de dólares. Portanto, esse banco de dados contém os dados dessas Empresas Unicórnio e é composto por sete tabelas. Para simplificar, vamos nos concentrar em três tabelas: companies, sales, e product_emissions.

Usando SQL GROUP BY

GROUP BY é um comando SQL comumente usado para agregar os dados e obter insights a partir deles. Há três fases quando você agrupa dados:

  • Dividir: o conjunto de dados é dividido em partes de linhas com base nos valores das variáveis que escolhemos para a agregação
  • Você pode se candidatar: Calcule uma função agregada, como média, mínimo e máximo, retornando um único valor
  • Combine: Todas essas saídas resultantes são combinadas em uma tabela exclusiva. Dessa forma, teremos um único valor para cada modalidade da variável de interesse.

SQL GROUP BY Exemplo 1

Podemos começar mostrando um exemplo simples de GROUP BY. Suponhamos que você queira encontrar os dez principais países com o maior número de empresas Unicórnio. 

SELECT * 
FROM companies

Captura de tela 2023-02-21 at 19.04.00.png

Também seria bom se você pudesse ordenar os resultados em ordem decrescente com base no número de empresas

SELECT country, COUNT(*) AS n_companies
FROM companies
GROUP BY country
ORDER BY n_companies DESC
LIMIT 10

image4.png

Aqui estão os resultados. Você provavelmente não ficará surpreso ao encontrar os EUA, a China e a Índia na classificação. Vamos explicar a decisão por trás dessa consulta: 

  • Primeiro, observe que usamos o site COUNT(*) para contar as linhas de cada grupo, que corresponde ao país. Além disso, também usamos o alias SQL para renomear a coluna com um nome mais explicável. Você pode fazer isso usando a palavra-chave AS, seguida do novo nome. COUNT é abordado com mais detalhes no tutorial da FUNÇÃO SQL COUNT().
  • Os campos foram selecionados na tabela companies, em que cada linha corresponde a uma empresa Unicorn. 
  • Depois, precisamos especificar o nome da coluna após GROUP BY para agregar os dados com base no país. 
  • ORDER BY é necessário para que você visualize os países na ordem correta, do maior número para o menor número de empresas. 
  • Limitamos os resultados a 10 usando LIMIT, que é seguido pelo número de linhas que você deseja nos resultados.

SQL GROUP BY Exemplo 2 

Agora, analisaremos a tabela com as vendas. Para cada número de pedido, temos o tipo de cliente, a linha de produtos, a quantidade, o preço unitário, o total, etc.

Captura de tela 2023-02-21 at 19.05.13.png

Desta vez, estamos interessados em encontrar o preço médio por unidade, o número total de pedidos e o ganho total para cada linha de produto:

SELECT 
    product_line,
    AVG(unit_price) AS avg_price,
    SUM(quantity) AS tot_pieces,
    SUM(total) AS total_gain
FROM sales
GROUP BY product_line
ORDER BY total_gain DESC

image7.png

  • Em vez de contar o número de linhas, temos a função AVG() para obter o preço médio e a função SUM() para calcular o número total de pedidos e o ganho total para cada linha de produto. 
  • Como antes, especificamos a coluna que inicialmente divide o conjunto de dados em partes. Em seguida, as funções de agregação nos permitirão obter uma linha para cada modalidade da linha de produtos. 
  • Desta vez, ORDER BY é opcional. Ela foi incluída para destacar como os ganhos totais mais altos nem sempre são proporcionais a preços médios ou peças totais mais altos. 

As limitações de WHERE

Vejamos novamente o exemplo anterior. Agora, queremos colocar uma condição na consulta: queremos filtrar apenas o número total de pedidos superiores a 40.000. Vamos tentar a cláusula WHERE:

SELECT 
    product_line,
    AVG(unit_price) AS avg_price,
    SUM(quantity) AS tot_pieces,
    SUM(total) AS total_gain
FROM sales
WHERE SUM(total) > 40000
GROUP BY product_line
ORDER BY total_gain DESC

Essa consulta retornará o seguinte erro:

image1.png

Esse erro não é possível passar funções agregadas na cláusula WHERE. Precisamos de um novo comando para resolver esse problema.

Usando SQL HAVING

Assim como WHERE, a cláusula HAVING filtra as linhas de uma tabela. Enquanto o WHERE tentou filtrar a tabela inteira, o HAVING filtra as linhas em cada um dos grupos definidos por GROUP BY

Exemplo 1 de SQL HAVING

Aqui está o exemplo anterior novamente, substituindo a palavra WHERE por HAVING.

SELECT 
    product_line,
    AVG(unit_price) AS avg_price,
    SUM(quantity) AS tot_pieces,
    SUM(total) AS total_gain
FROM sales
GROUP BY product_line
HAVING SUM(total) > 40000
ORDER BY total_gain DESC

image10.png

Dessa vez, você produzirá três linhas. As outras linhas de produtos não correspondiam ao critério, então passamos de seis resultados para três. 

O que mais você observou na consulta? Não passamos o alias da coluna para HAVING, mas a agregação do campo original. Você está se perguntando por quê? Você desvendará o mistério no próximo exemplo.

Exemplo 2 de SQL HAVING

Como último exemplo, usaremos a tabela chamada product_emissions, que contém a emissão dos produtos fornecidos pelas empresas.

Captura de tela 2023-02-21 at 19.07.31.png

Desta vez, estamos interessados em mostrar a pegada média de carbono do produto (pcf) para cada empresa que pertence ao grupo do setor "Tecnologia de Hardware e Equipamentos". Além disso, seria útil ver o número de produtos de cada empresa para entender se há alguma relação entre o número de produtos e a pegada de carbono. Também usamos novamente o site HAVING para extrair empresas com uma pegada média de carbono superior a 100.

SELECT pe.company, count(product_name) AS n_products, avg(carbon_footprint_pcf) AS avg_carbon_footprint_pcf
FROM product_emissions AS pe
WHERE industry_group = 'Technology Hardware & Equipment'
GROUP BY pe.company, industry_group
having avg_carbon_footprint_pcf>100
ORDER BY n_products

image5.png

Um erro foi exibido após a tentativa de usar o alias. Para a cláusula HAVING, o nome da nova coluna não existe, portanto, você não poderá filtrar a consulta. Vamos corrigir a solicitação:

SELECT pe.company, count(product_name) AS n_products, avg(carbon_footprint_pcf) AS avg_carbon_footprint_pcf
FROM product_emissions AS pe
WHERE industry_group = 'Technology Hardware & Equipment'
GROUP BY pe.company, industry_group
having avg(carbon_footprint_pcf)>100
ORDER BY n_products

image3.png

Dessa vez, a condição funcionou, e podemos visualizar os resultados na tabela. Acabamos de aprender que os aliases de coluna não podem ser usados em HAVING porque essa condição é aplicada antes de SELECT. Por esse motivo, ele não pode reconhecer os campos dos novos nomes.

Ordem de execução do SQL

Essa é a ordem dos comandos ao escrever a consulta:

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

Mas há uma pergunta que você precisa fazer a si mesmo. Em que ordem os comandos SQL são executados? Como seres humanos, muitas vezes consideramos como certo que o computador lê e interpreta o SQL de cima para baixo. Mas a realidade é diferente do que pode parecer. Essa é a ordem correta de execução:

FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
LIMIT

 Portanto, o processador de consultas não começa em SELECT, mas começa selecionando as tabelas a serem incluídas, e SELECT é executado depois de HAVING. Isso explica por que HAVING não permite o uso de ALIAS, enquanto ORDER BY não tem problemas com isso. Além desse aspecto, essa ordem de execução esclarece o motivo pelo qual HAVING é usado junto com GROUP BY para aplicar condições em dados agregados, enquanto WHERE não pode. 

Leve-o para o próximo nível

Depois de ler este tutorial, você deve ter uma ideia clara da diferença entre GROUP BY e HAVING. Você pode praticar no DataLab para dominar esses conceitos.

Se quiser passar para o próximo nível do caminho de aprendizado de SQL, você pode fazer nosso curso SQL Intermediário. Se ainda precisar fortalecer seus fundamentos de SQL, você pode voltar ao curso Introdução ao SQL para aprender sobre os fundamentos da linguagem. 

Temas

Cursos de SQL

curso

Introduction to SQL

2 hr
919.4K
Learn how to create and query relational databases using SQL in just two hours.
Ver DetalhesRight Arrow
Iniciar curso
Ver maisRight Arrow
Relacionado

tutorial

Como usar um alias SQL para simplificar suas consultas

Explore como o uso de um alias SQL simplifica os nomes de colunas e tabelas. Saiba por que usar um alias SQL é fundamental para melhorar a legibilidade e gerenciar uniões complexas.
Allan Ouko's photo

Allan Ouko

9 min

tutorial

FUNÇÃO SQL COUNT()

COUNT() permite que você conte o número de linhas que correspondem a determinadas condições. Saiba como usá-lo neste tutorial.
Travis Tang 's photo

Travis Tang

3 min

tutorial

SELEÇÃO de várias colunas no SQL

Saiba como selecionar facilmente várias colunas de uma tabela de banco de dados em SQL ou selecionar todas as colunas de uma tabela em uma consulta simples.
DataCamp Team's photo

DataCamp Team

3 min

tutorial

Exemplos e tutoriais de consultas SQL

Se você deseja começar a usar o SQL, nós o ajudamos. Neste tutorial de SQL, apresentaremos as consultas SQL, uma ferramenta poderosa que nos permite trabalhar com os dados armazenados em um banco de dados. Você verá como escrever consultas SQL, aprenderá sobre
Sejal Jaiswal's photo

Sejal Jaiswal

21 min

tutorial

Tutorial do MySQL: Um guia abrangente para iniciantes

Descubra o que é o MySQL e como começar a usar um dos sistemas de gerenciamento de banco de dados mais populares.
Javier Canales Luna's photo

Javier Canales Luna

15 min

tutorial

Tutorial de visão geral do banco de dados SQL

Neste tutorial, você aprenderá sobre bancos de dados em SQL.
DataCamp Team's photo

DataCamp Team

3 min

See MoreSee More