Voltar para a lista de artigos Artigos
6 minutos de leitura

A Cláusula SQL HAVING Explicada

O que é a cláusula do HAVING em SQL? Por que você precisa dela e onde você a usa? Vamos explicar HAVING em detalhes.

HAVING é uma cláusula muito comum nas consultas a SQL. Como WHERE, ela ajuda a filtrar dados; entretanto, HAVING funciona de uma maneira diferente. Se você está familiarizado com a cláusula GROUP BY e só ouviu falar do HAVING - ou se você não está familiarizado com HAVING de maneira alguma - este artigo é o que você precisa. Leia e amplie seus conhecimentos sobre o HAVING em SQL!

O que é a Cláusula SQL HAVING?

Em SQL, a cláusula HAVING:

  • Filtra os dados com base em critérios definidos.
  • É comumente usada na criação de relatórios.
  • É usada apenas no SELECT.
  • Funciona com GROUP BY.

Se você conhece a cláusula GROUP BY, você sabe que ela é usada para agregar valores: ela coloca os registros em grupos para calcular valores de agregação (estatísticas) para eles. HAVING filtra os registros de acordo com esses valores agregados. Discutiremos isso exaustivamente aqui, mas você encontrará mais detalhes em nosso curso interativo SQL para Iniciantes.

Se você precisar de uma atualização sobre GROUP BY, recomendo os artigos Getting the Hang of the GROUP BY Clause de Marian Dziubak e Grouping Data in SQL Server de Belma Mesihovic.

Sintaxe de HAVING

Antes de começarmos com um exemplo, vejamos a sintaxe da cláusula HAVING. HAVING é sempre colocada após as cláusulas WHERE e GROUP BY, mas antes da cláusula ORDER BY. Dê uma olhada:

SELECT column_list 
FROM table_name
WHERE where_conditions
GROUP BY column_list
HAVING having_conditions
ORDER BY order_expression

A cláusula HAVING especifica a condição ou condições para um grupo ou uma agregação.

O employee A tabela abaixo nos ajuda a analisar a cláusula HAVING. Ela contém os IDs dos funcionários (a coluna emp_id ), o department onde esse funcionário trabalha e o salary do funcionário.

employee_iddepartmentsalary
1HR23000
2HR28000
3Finance35000
4Marketing15000
5Marketing25000
6Finance56000
7Finance41000

Para calcular a soma dos salários de cada departamento, você escreveria esta consulta:

SELECT department, SUM(salary)
FROM employee
GROUP BY department;

Aqui está o resultado:

departmentsalary
HR51000
Marketing40000
Finance132000

Agora, suponha que você precisa exibir os departamentos onde a soma dos salários é de US$ 50.000 ou mais. Neste caso, você deve usar uma cláusula de HAVING:

SELECT department, SUM(salary)
FROM employee
GROUP BY department
HAVING SUM(salary) >= 50000;

E o resultado é:

departmentsalary
HR51000
Finance132000

Como você vê, o conjunto de resultados contém apenas a soma dos salários para os departamentos de RH e Finanças. Isto porque a soma dos salários de Marketing é inferior a $50.000.

Esta consulta primeiro agrupa registros de acordo com os departamentos e calcula valores agregados - neste caso, a soma de todos os salários. Na etapa seguinte, a condição em HAVING é verificada: comparamos o valor retornado por SUM(salary) para um determinado departamento com $50.000. Se este valor for US$ 50.000 ou mais, o registro é devolvido. Em nosso exemplo, são mostrados os salários somados para os departamentos de RH ($51.000) e Finanças ($132.000).

Linhas de filtragem usando WHERE e HAVING

A seguir, vamos ver como filtrar linhas no nível de registro e no nível de grupo na mesma consulta. Primeiro, veja os dados na tabela de relatórios sale:

salesman_idsale_monthtotal_value
1January34000
1February14000
1March22000
1April2000
2January20000
2February0
2March17000
2April0
3March1000
3April35000

A consulta abaixo seleciona a soma de todas as vendas para cada vendedor cujo valor médio de venda é superior a $20.000. (Nota: O vendedor com ID=3 não está incluído, pois só começou a trabalhar em março).

SELECT salesman_id, SUM(total_value)  
FROM sale 
WHERE salesman_id != 3
GROUP BY salesman_id 
HAVING SUM(total_value) > 40000;

Aqui está o resultado:

salesman_idsum
172000

Esta consulta filtra primeiro os registros, usando a cláusula WHERE para selecionar registros com identificação de vendedor diferente de 3 (WHERE salesman_id != 3). Em seguida, calcula a soma das vendas totais para os representantes de vendas com os IDs 1 e 2. Ele faz isto agrupando individualmente os registros para ambos os representantes (GROUP BY salesman_id). No final, a consulta filtra os registros usando HAVING para verificar se o valor agregado (soma das vendas totais) é superior a $40.000 (HAVING SUM(total_value) > 40000).

Filtragem de linhas em valores múltiplos usando HAVING

A cláusula HAVING também permite filtrar linhas usando mais de um valor agregado (ou seja, valores de diferentes funções agregadas). Veja a próxima consulta:

SELECT salesman_id, SUM(total_value) 
FROM sale 
WHERE salesman_id != 3
GROUP BY salesman_id 
HAVING SUM(total_value) > 36000 AND AVG(total_value) > 15000;

O resultado:

salesman_idsum
172000

Esta consulta retorna os IDs dos vendedores que 1) têm vendas totais acima de $36.000, e 2) têm vendas médias acima de $15.000 em cada mês. Somente o representante de vendas com ID=1 satisfaz as duas condições. Note que não selecionamos a média de vendas totais para cada vendedor, mas apenas a soma de todas as suas vendas; a média está apenas na condição de HAVING.

A diferença entre HAVING e WHERE

O exemplo da última seção mostrou como filtrar registros tanto com WHERE como com HAVING. Agora vamos considerar a diferença entre estas duas cláusulas.

A diferença básica é que WHERE trabalha com registros individuais e HAVING trabalha com registros agrupados (depois que o GRUPO BY é processado). HAVING é usado somente em declarações SELECT, mas ONDE pode ser usado em outras declarações, como DELETE ou UPDATE.

HAVING e WHERE filtram dados em momentos diferentes. ONDE é processado antes do GROUP BY. Isto significa que primeiro os registros são selecionados e depois filtrados com ONDE. É a filtragem de nível de registro. Depois disso, os registros de resultados são agrupados e o valor agregado é calculado.

HAVING filtra os registros em nível de grupo - depois de WHERE e GROUP BY. HAVING verifica se o valor agregado para um grupo satisfaz sua(s) condição(ões). Você deve usar uma função agregada para filtrar registros somente em HAVING; ONDE não pode incluir uma função agregada.

Você pode ler mais sobre a diferença entre WHERE e HAVING em HAVING vs. WHERE em SQL: O que você deve saber por Ignacio L. Bisso.

HAVING: Uma Cláusula Muito Útil

HAVING é muito útil em consultas SQL. Ele filtra os dados após as linhas serem agrupadas e os valores agregados - algo que você fará freqüentemente em relatórios.

Espero que este artigo tenha ajudado você a entender a cláusula HAVING. Talvez até o ajude a ampliar seus conhecimentos em SQL. Se você estiver interessado em aprender mais sobre SQL, experimente nossa SQL para Iniciantes curso sobre o LearnSQL.com.br plataforma.