Voltar para a lista de artigos Artigos
6 minutos de leitura

Tutorial SQL HAVING

Aprenda como usar a cláusula SQL HAVING para filtrar grupos usando suas próprias condições especificadas.

A cláusula SQL HAVING é muitas vezes um conceito desafiador de se entender, especialmente para iniciantes. Além disso, seus casos de uso específico podem ser difíceis de visualizar sem exemplos específicos baseados em conjuntos de dados do mundo real. Neste tutorial, você aprenderá como aplicar a cláusula SQL HAVING para filtrar grupos de registros com base em condições especificadas. Você verá exemplos onde aplicamos este conceito para resolver problemas comerciais em um conjunto de dados realistas.

A Função da Cláusula SQL HAVING

A cláusula SQL HAVING é normalmente usada com a cláusula GROUP BY para filtrar grupos de filas devolvidas. Somente quando a condição especificada é VERDADEIRA, as linhas são incluídas no grupo.

A cláusula SQL GROUP BY organiza os dados em grupos com base no(s) valor(es) comum(is); é mais freqüentemente usada para obter informações resumidas e computar estatísticas agregadas. Se você estiver procurando uma atualização mais profunda sobre este assunto, veja este artigo sobre SQL GROUP BY.

Pode haver alguma confusão sobre WHERE e HAVING, mas a diferença é facilmente explicada. A cláusula WHERE aplica uma condição em toda a coluna através da filtragem de linhas individuais. Ela não funciona com funções agregadas como SUM() e AVG(). Por outro lado, HAVING coloca condições de filtragem sobre os grupos criados pela cláusula GROUP BY. Ela pode ser usada com funções agregadas.

Por exemplo, vamos considerar a tabela abaixo. Ela mostra uma lista de clientes agrupados por cidades em vários países. Se quiséssemos ver grupos de cidades com 3 ou mais clientes, precisaríamos de uma cláusula HAVING que satisfaça esta condição em cada uma das cidades (ou seja, os grupos).

CustomerIDCityCountry
009BerlinGermany
045BerlinGermany
101BerlinGermany
098BernSwitzerland
003BernSwitzerland
154Buenos AiresArgentina
111Buenos AiresArgentina
039Buenos AiresArgentina
191WallaPoland

Em outras palavras, a cláusula HAVING é essencialmente uma cláusula WHERE que opera em registros devolvidos por GROUP BY. (Também temos uma comparação mais profunda entre HAVING e WHERE se você estiver interessado em ir mais fundo).

Sintaxe do SQL HAVING

HAVING não vai funcionar sem a cláusula GROUP BY. Ela deve seguir a cláusula GROUP BY em uma consulta e deve preceder a cláusula ORDER BY (se você estiver usando uma). Somente os grupos que atenderem aos critérios HAVING serão devolvidos.

Por exemplo, vamos tentar a seguinte consulta sobre o customers mesa:

SELECT COUNT(CustomerID), City, Country
FROM Customers
WHERE Country = 'Brazil'
GROUP BY City, Country
HAVING COUNT(CustomerID) > 1

O que está acontecendo nesta consulta?

  • Primeiramente, a cláusula WHERE filtra as linhas aplicáveis para o País "Brasil".
  • Segundo, a cláusula GROUP BY agrupa as entradas com base nos valores das colunas City e Country.
  • Terceiro, a cláusula HAVING filtra os grupos - neste caso, estamos interessados apenas em cidades brasileiras que tenham mais de 1 cliente.

A LearnSQL.com.br SQL para Iniciantes curso abrange a sintaxe e a aplicação da cláusula HAVING em um ambiente envolvente e interativo. Se você quiser praticar de forma prática, esta é minha recomendação. Mas antes, vejamos mais exemplos do HAVING.

Exemplos de SQL HAVING

Vamos mergulhar em alguns exemplos com diferentes funções agregadas para que possamos entender como a cláusula HAVING realmente funciona. Estaremos utilizando o seguinte cliente OrderDetails mesa. Ela tem um total de 518 linhas de dados de pedidos simples. Isto inclui informações tais como Quantity e ProductID encomendadas juntamente com um OrderID único para cada pedido.

OrderDetailIDOrderIDProductIDQuantity
1102481112
2102484210
310248725
410249149
510249142
6102495140
518104432812

Como analista de dados, uma de suas principais tarefas seria obter insights sobre os dados de vendas. Vamos explorar três problemas simples com o objetivo de encontrar algumas dessas percepções.

Exemplo 1: TENDO COM COUNT()

PROBLEMA: Liste todos os produtos com mais de 12 pedidos individuais feitos.

PERGUNTA:

SELECT COUNT(ProductID), ProductID
FROM OrderDetails
GROUP BY ProductID
HAVING COUNT(ProductID) > 12

RESULTADO:

Number of Records: 5
COUNT(ProductID)ProductID
1431
1459
1362
1371
1472

Se não tivéssemos incluído a cláusula HAVING, esta consulta essencialmente retornaria o número de registros igual ao número único de ProductIDs. Aqui, GROUP BY coloca os pedidos com o mesmo ProductID em grupos. Em seguida, a cláusula HAVING coloca a condição de filtragem em cada um desses grupos e retorna os que têm uma contagem maior que 12.

Exemplo 2: TANDO com SUM()

PROBLEMA: Liste todos os produtos que tiveram mais de 350 quantidades totais encomendadas.

PERGUNTA:

SELECT SUM(Quantity), ProductID
FROM OrderDetails
GROUP BY ProductID
HAVING SUM(Quantity) > 350
ORDER BY SUM(Quantity) DESC

RESULTADO:

Number of Records: 3
COUNT(ProductID)ProductID
45831
43060
36935

No exemplo acima, GROUP BY agrupa de forma semelhante os pedidos por ProductID. Em seguida, a cláusula HAVING coloca a condição de filtragem (a soma da coluna Quantity deve ser superior a 350) em cada um desses grupos. Finalmente, ORDER BY retorna os resultados em ordem decrescente.

Exemplo 3: TENDO com AVG()

PROBLEMA: Liste todos os produtos que tiveram mais de 35 quantidades encomendadas em média e pelo menos 4 pedidos feitos.

PERGUNTA:

SELECT AVG(Quantity), COUNT(ProductID), ProductID
FROM OrderDetails
GROUP BY ProductID
HAVING AVG(Quantity) > 35 AND COUNT(ProductID) > 3
ORDER BY AVG(Quantity) DESC

RESULTADO:

Number of Records: 6
AVG(Quantity)ProductIDCOUNT(ProductID)
41.25234
41359
38.75584
35.836012
35.6445
35.11339

No Exemplo 3, após agruparmos os pedidos por ProductID, a cláusula HAVING coloca duas condições de filtragem nos grupos: uma quantidade média de pedidos acima de 35 e um número de pedidos individuais maior que 3.

Com base nos três exemplos acima, soubemos que ProductID 31, por exemplo, foi incluído no maior número de pedidos individuais (14) e também teve o maior número de quantidades pedidas em todos os pedidos feitos (458). Este é definitivamente um dos produtos mais populares na loja!

Além disso, ProductIDs 23, 35, e 58 tinham as quantidades médias mais altas por pedido. As principais percepções como estas são valiosas, permitindo que as empresas saibam em quais produtos se concentrar e como comercializá-los.

Dominando a Cláusula SQL HAVING

Como acabamos de ver, a cláusula HAVING é indispensável para calcular valores agregados em grupos de dados. Assim, ela é sempre usada em combinação com uma cláusula GROUP BY e restringe os dados sobre os registros agrupados e não sobre os registros individuais.

Se você quiser saber mais sobre o uso da cláusula SQL HAVING, experimente nosso curso SQL para Iniciantes . Ele cobre a cláusula HAVING em detalhes e explica mais sobre agrupamento, filtragem e ordenação de dados. Há também muitos problemas práticos e quizzes para que você possa ficar realmente confortável usando o SQL básico.