
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
| Identificação do Cliente | Nome do cliente | Cidade | País |
| 1 1 | Anja Damian | Berlim | Alemanha |
| 2 | Denny Cockett | México DF | México |
| 3 | Eleanor Calnan | México DF | México |
| 4 | Albertha Albury | Londres | Reino Unido |
| 5 | Latisha Nembhard | Luleå | Suécia |
| 6 | Madalene Bing | Mannheim | Alemanha |
| 7 | Rebecka Beegle | Estrasburgo | França |
| 8 | Rosy Tippie | Madrid | Espanha |
| 9 | Audie Khan | Marselha | França |
| 10 | Tocas de Hildegard | Tsawassen | Canadá |
| 11 | Cordell Dutremble | Londres | Reino Unido |
| 12 | Nora Reyna | Buenos Aires | Argentina |
| 13 | Ursula Laforest | México DF | México |
| 14 | Claudie Neel | Berna | Suíça |
| 15 | Portia Yee | São Paulo | Brasil |
| 16 | Angila Segarra | Londres | Reino Unido |
| 17 | Lise Wexler | Aachen | Alemanha |
| 18 | Ned Mendivil | Nantes | França |
| 19 | Sara Vidaurri | Londres | Reino Unido |
| 20 | Tayna Navin | Graz | Áustria |
| 21 | Pura Ray | São Paulo | Brasil |
| 22 | Erika Byard | Madrid | Espanha |
| 23 | Jimmie Luke | Lille | França |
| 24 | Shayla Byington | Bräcke | Suécia |
| 25 | Christiana Boden | München | Alemanha |
| 26 | Irina Nitta | Nantes | França |
| 27 | Bryanna Alls | Torino | Itália |
| 28. | Norah Picken | Lisboa | Portugal |
| 29 | Moriah Stwart | Barcelona | Espanha |
| 30 | Idella Harriott | Sevilha | Espanha |
| OrderID | Identificação do Cliente | Data do pedido |
| 10254 | 14 | 11-07-1996 |
| 10258 | 20 | 17-07-1996 |
| 10259 | 13 | 18-07-1996 |
| 10263 | 20 | 23-07-1996 |
| 10264 | 24 | 24-07-1996 |
| 10265 | 7 | 25-07-1996 |
| 10267 | 25 | 29-07-1996 |
| 10278 | 5 | 12-08-1996 |
| 10280 | 5 | 14-08-1996 |
| 10289 | 11 | 26-08-1996 |
| 10290 | 15 | 27-08-1996 |
| 10297 | 7 | 04-09-1996 |
| 10303 | 30 | 11-09-1996 |
| 10308 | 2 | 18-09-1996 |
| 10311 | 18 | 20-09-1996 |
| 10326 | 8 | 10-10-1996 |
| 10327 | 24 | 11-10-1996 |
| 10328 | 28. | 14-10-1996 |
| 10331 | 9 | 16-10-1996 |
| 10337 | 25 | 24-10-1996 |
| 10340 | 9 | 29-10-1996 |
| 10342 | 25 | 30-10-1996 |
| 10347 | 21 | 06-11-1996 |
| 10351 | 20 | 11-11-1996 |
| 10352 | 28. | 12-11-1996 |
| 10355 | 4 | 15-11-1996 |
| 10360 | 7 | 22-11-1996 |
| 10362 | 9 | 25-11-1996 |
| 10363 | 17 | 26-11-1996 |
| 10364 | 19 | 26-11-1996 |
| 10365 | 3 | 27-11-1996 |
| 10366 | 29 | 28-11-1996 |
| 10368 | 20 | 29-11-1996 |
| 10370 | 14 | 03-12-1996 |
| 10378 | 24 | 10-12-1996 |
| 10382 | 20 | 13-12-1996 |
| 10383 | 4 | 16-12-1996 |
| 10384 | 5 | 16-12-1996 |
| 10386 | 21 | 18-12-1996 |
| 10389 | 10 | 20-12-1996 |
| 10390 | 20 | 23-12-1996 |
| 10391 | 17 | 23-12-1996 |
| 10396 | 25 | 27-12-1996 |
| 10400 | 19 | 01-01-1997 |
| 10402 | 20 | 02-01-1997 |
| 10403 | 20 | 03-01-1997 |
| 10408 | 23 | 08-01-1997 |
| 10410 | 10 | 10-01-1997 |
| 10411 | 10 | 10-01-1997 |
| 10414 | 21 | 14-01-1997 |
| 10422 | 27 | 22-01-1997 |
| 10426 | 29 | 27-01-1997 |
| 10430 | 20 | 30-01-1997 |
| 10431 | 10 | 30-01-1997 |
| 10434 | 24 | 03-02-1997 |
| 10435 | 16 | 04-02-1997 |
| 10436 | 7 | 05-02-1997 |
| 10442 | 20 | 11-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ís | Número de pedidos |
| Áustria | 10 |
| França | 9 |
| Suécia | 7 |
| Alemanha | 6 |
| Reino Unido | 6 |
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 -
- Consulta de Inserção SQL
- Chave estrangeira no SQL
- Palavra-chave distinta no SQL
- Exibições SQL
- Os 6 principais exemplos de consulta de junção interna no Oracle
