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