Pessoal, trazendo mais um questionamento dos nossos alunos, vamos falar da cláusula HAVING. Essa é uma dúvida muito boa, pois muito dos alunos não tem prática na linguagem SQL e tem dificuldade de entender qual a diferença desse comando e a cláusula WHERE, para isso vou recomendar utilizar o site da w3school para rodar alguns comandos SQL e entender melhor como isso funciona.
A cláusula HAVING foi adicionada ao SQL porque a palavra-chave WHERE não pode ser usada com funções agregadas. Na verdade, a cláusula WHERE vai servir para selecionar os valores que serão agrupados e o HAVING faz um filtro dentro dessa seleção. É complicado? Não!!! é bem simples, mas é necessário exercitar um pouco.
Vamos utilizar mais uma vez o w3school no link abaixo.
https://www.w3schools.com/sql/sql_having.asp
No exemplo a instrução SQL lista o número de clientes em cada país, ou seja será listado apenas países com mais de 5 clientes:
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) > 5;
O Resultado será:
COUNT(CustomerID) | Country |
9 | Brazil |
11 | France |
11 | Germany |
7 | UK |
13 | USA |
Então, como demostrado temos a quantidade de Customer(Clientes) por País apenas dos Países que tem mais de 5 Clientes.
Então veja, a cláusula HAVING serve de critério para apresentação dos resultados do GROUP BY. Vamos fazer o mesmo comando sem o HAVING, para vermos o resultado, logo abaixo:
COUNT(CustomerID) | Country |
3 | Argentina |
2 | Austria |
2 | Belgium |
9 | Brazil |
3 | Canada |
2 | Denmark |
2 | Finland |
11 | France |
11 | Germany |
1 | Ireland |
3 | Italy |
5 | Mexico |
1 | Norway |
1 | Poland |
2 | Portugal |
5 | Spain |
2 | Sweden |
2 | Switzerland |
7 | UK |
13 | USA |
4 | Venezuela |
O que temos de resultado? A lista da quantidade de Customers(Clientes) por país, veja agora aparecem os registros como da Venezuela (4 clientes), Portugal (2 clientes), entre outros. Então, em resumo o HAVING faz um filtro nos valores após o GROUP BY. E qual seria então a diferença do WHERE ? Primeira coisa, como já explicado, o WHERE não pode ser utilizado com o GROUP BY, ou seja, APÓS o GROUP BY, pois não existe essa sintaxe no padrão SQL, logo se você fizer isso dará um erro de execução(você pode tentar isso no link do início do artigo para ver o erro).
Seguindo na explicação, antes de fazer o GROUP BY você pode querer selecionar apenas alguns registros do conjunto, então vamos a mais um exemplo:
SELECT COUNT(CustomerID), Country
FROM Customers
WHERE Country LIKE ‘a%’
GROUP BY Country;
O que vai acontecer agora?
Teremos na lista a quantidade de clientes por país, apenas os países que começam com a letra a, então o resultado será:
COUNT(CustomerID) | Country |
3 | Argentina |
2 | Austria |
E dentro desse conjunto, eu posso ainda adicionar a cláusula HAVING, então vamos agora selecionar os países que tem mais de 2 clientes.
SELECT COUNT(CustomerID), Country
FROM Customers
WHERE Country LIKE ‘a%’
GROUP BY Country
HAVING COUNT(CustomerID) > 2;
O resultado então será:
COUNT(CustomerID) | Country |
3 | Argentina |
Então, pessoal, conseguiram entender?
Veja, não é simples para quem nunca viu o assunto, é necessária uma curva de aprendizado. Mas com esse exemplo vai dar para entender onde utilizar o HAVING e a diferença da cláusula WHERE.
Dessa forma encerro esse artigo e desejo bons estudos !!!
Até mais!
Palavras-Chave: SQL, HAVING, BANCO DE DADOS, SGBD.
Professor Washington Almeida
Mestre em Engenharia de Software pelo Centro de Estudos e Sistemas Avançados do Recife – C.E.S.A.R. Atualmente é Analista Judiciário na Justiça Federal (TRF1), Professor no Gran Cursos Online e na Cesar School no curso Métricas Ágeis.. Certificado ISF ISO/IEC 27002. Ocupou a Função de Diretor do Núcleo de Operação de Centros de Dados na Justiça Federal- TRF1. Exerceu o cargo de Coordenador-Geral de Sistemas (DAS 101.4) no Ministério do Planejamento, Orçamento e Gestão – MPOG, servidor público ocupando o cargo de Analista em Tecnologia da Informação – ATI.
Participe da conversa