Introdução à cláusula SQL HAVING

A questão muito básica que vem à mente é o que é essa cláusula HAVING? Bem, a cláusula HAVING é usada para filtrar os resultados de uma consulta SQL com funções agregadas. Para entender em inglês simples, ele está comandando o analisador de SQL 'Hey SQL, da nossa tabela de dados do cliente, traga-me os nomes dos países com mais de 1 milhão de clientes'.

Espere, é isso que a cláusula WHERE faz, não é? Sim, isso é muito semelhante ao modo como a cláusula WHERE opera, mas com uma pequena diferença. A cláusula WHERE não funciona com funções agregadas.

Agora, apenas para recapitular um pouco sobre as funções agregadas, são funções que recebem várias linhas como entrada e fornecem uma saída processada mais significativamente. Alguns exemplos são Contagem (), Soma (), Mín (), Máx (), Média () etc.

Por que ter e não onde?

Vemos que as cláusulas HAVING e WHERE executam uma tarefa muito semelhante para filtrar os resultados. Então, qual era a necessidade da cláusula HAVING? Por que a cláusula WHERE não pode ser usada com funções agregadas?

Para responder a isso, precisamos entender como o mecanismo SQL trata as duas cláusulas. A cláusula FROM em todos os comandos SQL informa ao mecanismo de onde ler as linhas. Os dados são armazenados no disco e são buscados na memória para processamento. Como as linhas são lidas uma a uma do disco para a memória, elas são verificadas quanto à cláusula WHERE. As linhas que falham na cláusula WHERE não são carregadas na memória. Portanto, a cláusula WHERE é avaliada para cada linha à medida que são processadas pelo mecanismo SQL.

Pelo contrário, a cláusula HAVING só aparece na imagem depois que as linhas foram carregadas na memória. Uma vez carregadas na memória, as funções agregadas executam sua tarefa nas linhas que possuem a condição desejada.

Agora, se colocarmos uma cláusula WHERE com a função agregada, como avg (), isso confundirá o mecanismo SQL sobre a inclusão da linha para calcular a média ou não. Essencialmente, estaríamos comandando o mecanismo para não ler a linha, pois ele não passou nos critérios avg () na cláusula WHERE. Mas, ei, para determinar se ele passou ou não nos critérios de cálculo avg (), a linha precisa ser lida na memória. Um estado de impasse.

A sintaxe

SELECT
FROM


ONDE - opcional
GROUP BY - agrupa as linhas para aplicar a função agregada
HAVING - função agregada na condição
ORDENAR POR ; - defina a ordem de classificação, opcional

Nota - A cláusula GROUP BY é necessária com a cláusula HAVING. Isso ocorre porque a cláusula Having precisa de um grupo de dados para aplicar uma função agregada e filtrar os resultados.

Como a cláusula HAVING funciona?

Vamos entender o funcionamento da cláusula HAVING no SQL.

A cláusula HAVING é sempre acompanhada pela cláusula GROUP BY. A cláusula GROUP BY agrupa os dados que correspondem a um determinado critério. Possui três fases - dividir, aplicar e combinar. A fase de divisão divide as linhas em grupos. A fase de aplicação aplica algumas funções agregadas nos grupos de dados. A fase combinada produz um único resultado combinando os grupos com o resultado da função agregada.

Agora que os grupos são formados, a cláusula HAVING entra em cena. A cláusula HAVING filtra os grupos que não atendem à condição especificada.

SELECT Col_A, avg(Col_B) as Col_B
FROM MyTable
GROUP BY Col_A
HAVING avg(Col_B)>30

Assim, no exemplo acima, vemos que a tabela é dividida em três grupos com base na coluna Col_A. A função agregada para calcular a média dos valores de Col_B é então aplicada aos grupos. Isso resulta em uma única linha para cada grupo. As linhas são então combinadas e filtradas com base na condição na cláusula HAVING.

Exemplo

Agora vamos ver um exemplo do mundo real. Considere que temos a seguinte tabela de clientes e os pedidos que eles fizeram conosco.

Identificação do ClienteNome do clienteCidadePaís
1 1Anja DamianBerlimAlemanha
2Denny CockettMéxico DFMéxico
3Eleanor CalnanMéxico DFMéxico
4Albertha AlburyLondresReino Unido
5Latisha NembhardLuleåSuécia
6Madalene BingMannheimAlemanha
7Rebecka BeegleEstrasburgoFrança
8Rosy TippieMadridEspanha
9Audie KhanMarselhaFrança
10Tocas de HildegardTsawassenCanadá
11Cordell DutrembleLondresReino Unido
12Nora ReynaBuenos AiresArgentina
13Ursula LaforestMéxico DFMéxico
14Claudie NeelBernaSuíça
15Portia YeeSão PauloBrasil
16Angila SegarraLondresReino Unido
17Lise WexlerAachenAlemanha
18Ned MendivilNantesFrança
19Sara VidaurriLondresReino Unido
20Tayna NavinGrazÁustria
21Pura RaySão PauloBrasil
22Erika ByardMadridEspanha
23Jimmie LukeLilleFrança
24Shayla ByingtonBräckeSuécia
25Christiana BodenMünchenAlemanha
26Irina NittaNantesFrança
27Bryanna AllsTorinoItália
28.Norah PickenLisboaPortugal
29Moriah StwartBarcelonaEspanha
30Idella HarriottSevilhaEspanha
OrderIDIdentificação do ClienteData do pedido
102541411-07-1996
102582017-07-1996
102591318-07-1996
102632023-07-1996
102642424-07-1996
10265725-07-1996
102672529-07-1996
10278512-08-1996
10280514-08-1996
102891126-08-1996
102901527-08-1996
10297704-09-1996
103033011-09-1996
10308218-09-1996
103111820-09-1996
10326810-10-1996
103272411-10-1996
1032828.14-10-1996
10331916-10-1996
103372524-10-1996
10340929-10-1996
103422530-10-1996
103472106-11-1996
103512011-11-1996
1035228.12-11-1996
10355415-11-1996
10360722-11-1996
10362925-11-1996
103631726-11-1996
103641926-11-1996
10365327-11-1996
103662928-11-1996
103682029-11-1996
103701403-12-1996
103782410-12-1996
103822013-12-1996
10383416-12-1996
10384516-12-1996
103862118-12-1996
103891020-12-1996
103902023-12-1996
103911723-12-1996
103962527-12-1996
104001901-01-1997
104022002-01-1997
104032003-01-1997
104082308-01-1997
104101010-01-1997
104111010-01-1997
104142114-01-1997
104222722-01-1997
104262927-01-1997
104302030-01-1997
104311030-01-1997
104342403-02-1997
104351604-02-1997
10436705-02-1997
104422011-02-1997

Agora, queremos conhecer os clientes de quais países fizeram um total combinado de 5 ou mais pedidos conosco. Pode ser um único cliente fazendo mais de 5 pedidos ou 5 clientes fazendo 1 pedido cada.

Para conseguir isso, precisaríamos

Etapa 1 : unir as duas tabelas

Etapa 2: agrupe os clientes com base em seus países

Etapa 3: conte o número de pedidos para cada grupo

Etapa 4: filtrar os resultados para 5 ou mais pedidos

Vamos formular o comando:

SELECT C.Country, COUNT(O.OrderId) as NumberOfOrders -- Step 1, 3
FROM Customers C -- Step 1
INNER JOIN Orders O on C.CustomerID = O.CustomerID -- Step 1
GROUP BY C.Country -- Step 2
HAVING COUNT(O.OrderId) >= 5 -- Step 4
ORDER BY COUNT(O.OrderId) DESC

Aqui estão os resultados:

PaísNúmero de pedidos
Áustria10
França9
Suécia7
Alemanha6
Reino Unido6

Conclusão - Cláusula SQL HAVING

Assim, vimos qual é o objetivo da cláusula HAVING e como ela funciona. É importante entender o trabalho básico ou você pode ficar confuso sobre o motivo pelo qual a cláusula HAVING não está produzindo os resultados desejados. Continue jogando com várias mesas, junções e combinações, juntamente com a cláusula HAVING.

Artigos recomendados

Este é um guia para a cláusula SQL HAVING. Aqui discutimos o funcionamento da cláusula HAVING no SQL e exemplo com a seguinte tabela de clientes. Você também pode consultar nossos outros artigos sugeridos -

  1. Consulta de Inserção SQL
  2. Chave estrangeira no SQL
  3. Palavra-chave distinta no SQL
  4. Exibições SQL
  5. Os 6 principais exemplos de consulta de junção interna no Oracle