SQL HAVING é uma condição que pode ser aplicada a entradas já agrupadas. Ela funciona com funções agregadas e é utilizada para res­trin­gir o conjunto de re­sul­ta­dos.

O que é SQL HAVING?

Além da conhecida cláusula WHERE, existe em SQL (Struc­tu­red Query Language) outra condição am­pla­mente utilizada: SQL HAVING. Esta cláusula foi in­tro­du­zida para filtrar dados com base em critérios es­pe­cí­fi­cos. Ela é usada com o comando SQL SELECT e a instrução SQL GROUP BY. Enquanto o GROUP BY agrupa os re­sul­ta­dos, a cláusula SQL HAVING restringe esse conjunto de re­sul­ta­dos com a ajuda de di­fe­ren­tes funções agregadas. A cláusula HAVING foi criada porque WHERE não interage com funções agregadas como SQL AVG(), SQL COUNT(), MAX(), MIN() e SUM(). SQL HAVING é usada após ins­tru­ções WHERE (se existirem) e GROUP BY, mas antes de ORDER BY.

VPS Hosting (Virtual Private Servers)
World-class VPS at America’s lowest price

Hos­pe­da­gem VPS poderosa e de baixo custo para rodar suas apli­ca­ções sob medida, com as­sis­tente pessoal e suporte 24 horas.

  • Save 50% or more vs leading hosts
  • Unlimited traffic & no setup fees 
  • 99.99% uptime gua­ran­teed
  • Free 24/7 premium support 

Sintaxe e fun­ci­o­na­mento de SQL HAVING

Para entender o fun­ci­o­na­mento e a utilidade do SQL HAVING, vale a pena observar a sintaxe da cláusula. Ela é a seguinte:

SELECT nome_da_coluna(s)
FROM nome_da_tabela
WHERE condição
GROUP BY nome_da_coluna(s)
HAVING condição
ORDER BY nome_da_coluna(s);
sql

Nor­mal­mente, uma função agregada é aplicada a uma ou mais colunas. Em seguida, o nome da tabela é es­pe­ci­fi­cado. A condição WHERE é opcional. GROUP BY agrupa valores idênticos em grupos, que são então filtrados de forma mais precisa com HAVING e ordenados com ORDER BY.

Exemplo de aplicação de SQL HAVING

A maneira mais simples de ilustrar a cláusula SQL HAVING é com um exemplo prático. Vamos criar uma pequena tabela chamada “Lista de Clientes”. Ela contém as colunas “Número do Cliente”, “Nome”, “Lo­ca­li­za­ção” e “Itens”.

Número do Cliente Nome Lo­ca­li­za­Ã§Ã£o Itens
1427 Schmidt Goiânia 13
1377 Marques Vitória 9
1212 Pedroso Vitória 15
1431 Nunes Fortaleza 22
1118 Becker Goiânia 10

Agora uti­li­za­mos SQL HAVING para descobrir quantos clientes de Vitória fizeram pedidos de dez ou mais itens. Usamos o seguinte código e indicamos a quan­ti­dade com um alias em SQL chamado “Número de Pedidos”:

SELECT Localização, COUNT(Localização) AS Número de Pedidos
FROM Lista de Clientes
WHERE Localização = 'Vitória'
GROUP BY Localização, Itens
HAVING COUNT(Itens) > 10;
sql

A saída cor­res­pon­dente é a seguinte:

Lo­ca­li­za­Ã§Ã£o Número de Pedidos
Vitória 1

Combinar SQL HAVING e INNER JOIN

Você também pode combinar SQL HAVING com a palavra-chave INNER JOIN. Para isso, criamos uma segunda tabela chamada “Item_01”, onde é re­gis­trado com que frequên­cia e quando um de­ter­mi­nado item foi pedido. Ela contém um número do pedido, um número de cliente, a quan­ti­dade e uma data de pedido e é exibida da seguinte forma:

Número do Pedido Número do Cliente Quan­ti­dade Data
00283 1427 4 2024-01-15
00284 1211 7 2024-01-19
00285 1275 15 2024-01-29
00286 1431 10 2024-02-01
00287 1427 9 2024-02-05

Agora podemos instruir o sistema a exibir todos os clientes que re­a­li­za­ram mais de um pedido, agrupando-os pelo nome e contando o número de pedidos. O código adequado é o seguinte:

SELECT Lista_de_Clientes.Nome, COUNT(Item_01.Número_do_Pedido) AS Número_de_Pedidos
FROM (Item_01
INNER JOIN Lista_de_Clientes ON Item_01. Número_do_Cliente = Lista_de_Clientes.Número_do_Cliente)
GROUP BY Nome
HAVING COUNT(Item_01.Número_do_Pedido) > 1;
sql

Esta é a saída que obtemos:

Nome Número de Pedidos
Schmidt 2

Al­ter­na­tiva ao SQL HAVING

Uma al­ter­na­tiva ao SQL HAVING é o WHERE. No entanto, ambas as opções não podem ser usadas exa­ta­mente da mesma forma. WHERE é utilizado para registros in­di­vi­du­ais e pode ser combinado com SELECT, DELETE ou UPDATE. HAVING, por outro lado, é ex­clu­si­va­mente para registros agrupados e só é com­pa­tí­vel com SELECT. WHERE é usado antes de GROUP BY, enquanto HAVING é usado depois. Além disso, apenas o SQL HAVING pode trabalhar com funções de agregação.

Dica

Um servidor per­fei­ta­mente ajustado às suas ne­ces­si­da­des: com o SQL Server Hosting da IONOS, você escolhe entre MSSQL, MySQL e MariaDB e se beneficia de uma forte ar­qui­te­tura de segurança, de­sem­pe­nho excelente e um aten­di­mento pessoal a qualquer momento.

Ir para o menu principal