12th Dec 2022 6 minutos de leitura A Cláusula SQL HAVING Explicada Dorota Wdzięczna sql aprender sql group by Índice O que é a Cláusula SQL HAVING? Sintaxe de HAVING Linhas de filtragem usando WHERE e HAVING Filtragem de linhas em valores múltiplos usando HAVING A diferença entre HAVING e WHERE HAVING: Uma Cláusula Muito Útil 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. Tags: sql aprender sql group by