Introduzione alla clausola HAVING di SQL
La domanda fondamentale che viene in mente è: che cos'è questa clausola HAVING? Bene, la clausola HAVING viene utilizzata per filtrare i risultati da una query SQL con funzioni aggregate. Per capire in parole povere, sta comandando il parser SQL "Hey SQL, dalla nostra tabella dei dati dei clienti, prendimi i nomi dei Paesi che hanno più di 1 milione di clienti".
Aspetta, è quello che fa la clausola WHERE, vero? Sì, è molto simile a come funziona la clausola WHERE ma con una leggera differenza. La clausola WHERE non funziona con le funzioni aggregate.
Ora, solo per ricapitolare un po 'le funzioni aggregate, queste sono funzioni che accettano più righe come input e forniscono un output elaborato in modo più significativo. Alcuni esempi sono Count (), Sum (), Min (), Max (), Avg () ecc.
Perché AVERE e non DOVE?
Vediamo che le clausole HAVING e WHERE svolgono un compito molto simile per filtrare i risultati. Allora qual era la necessità della clausola HAVING? Perché la clausola WHERE non può essere utilizzata con le funzioni aggregate?
Per rispondere a questo, dovremmo capire come il motore SQL tratta le due clausole. La clausola FROM in ogni comando SQL indica al motore da dove leggere le righe. I dati vengono archiviati sul disco e vengono recuperati in memoria per l'elaborazione. Quando le righe vengono lette una ad una dal disco nella memoria, vengono verificate le clausole WHERE. Le righe che non superano la clausola WHERE non vengono caricate nella memoria. Pertanto, la clausola WHERE viene valutata per ogni riga mentre vengono elaborati dal motore SQL.
Al contrario, la clausola HAVING viene visualizzata solo dopo che le righe sono state caricate in memoria. Una volta caricate in memoria, le funzioni di aggregazione eseguono il loro compito sulle righe AVENDO la condizione desiderata.
Ora, se dovessimo mettere una clausola WHERE con la funzione aggregata come avg (), questo confonderebbe il motore SQL sulla possibilità di includere la riga per il calcolo della media o meno. In sostanza, comanderemmo al motore di non leggere la riga poiché non ha superato i criteri avg () nella clausola WHERE. Ma ehi, per determinare se ha superato o meno i criteri di calcolo avg (), la riga deve essere letta in memoria. Uno stato di stallo.
La sintassi
SELECT
FROM
Identificativo del cliente | Nome del cliente | Città | Nazione |
1 | Anja Damian | Berlino | Germania |
2 | Denny Cockett | Messico DF | Messico |
3 | Eleonora Calnan | Messico DF | Messico |
4 | Albertha Albury | Londra | UK |
5 | Latisha Nembhard | Luleå | Svezia |
6 | Madalene Bing | Mannheim | Germania |
7 | Rebecka Beegle | Strasburgo | Francia |
8 | Rosy Tippie | Madrid | Spagna |
9 | Audie Khan | Marsiglia | Francia |
10 | Hildegard Burrowes | Tsawassen | Canada |
11 | Cordell Dutremble | Londra | UK |
12 | Nora Reyna | Buenos Aires | Argentina |
13 | Ursula Laforest | Messico DF | Messico |
14 | Claudie Neel | Berna | Svizzera |
15 | Portia Yee | San Paolo | Brasile |
16 | Angila Segarra | Londra | UK |
17 | Lise Wexler | Aachen | Germania |
18 | Ned Mendivil | Nantes | Francia |
19 | Sara Vidaurri | Londra | UK |
20 | Tayna Navin | Graz | Austria |
21 | Pura Ray | San Paolo | Brasile |
22 | Erika Byard | Madrid | Spagna |
23 | Jimmie Luke | Lille | Francia |
24 | Shayla Byington | Bräcke | Svezia |
25 | Christiana Boden | München | Germania |
26 | Irina Nitta | Nantes | Francia |
27 | Bryanna Alls | Torino | Italia |
28 | Norah Picken | Lisboa | Portogallo |
29 | Moriah Stwart | Barcellona | Spagna |
30 | Idella Harriott | Siviglia | Spagna |
ID ordine | Identificativo del cliente | Data dell'ordine |
10254 | 14 | 1996/11/07 |
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 | 1996/12/08 |
10280 | 5 | 14-08-1996 |
10289 | 11 | 26-08-1996 |
10290 | 15 | 27-08-1996 |
10297 | 7 | 1996/04/09 |
10303 | 30 | 1996/11/09 |
10308 | 2 | 18-09-1996 |
10311 | 18 | 20-09-1996 |
10326 | 8 | 1996/10/10 |
10327 | 24 | 1996/11/10 |
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 | 1996/06/11 |
10351 | 20 | 1996/11/11 |
10352 | 28 | 1996/12/11 |
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 | 1996/03/12 |
10378 | 24 | 1996/10/12 |
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 | 1997/02/01 |
10403 | 20 | 1997/03/01 |
10408 | 23 | 1997/08/01 |
10410 | 10 | 1997/10/01 |
10411 | 10 | 1997/10/01 |
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 | 1997/03/02 |
10435 | 16 | 1997/04/02 |
10436 | 7 | 1997/05/02 |
10442 | 20 | 1997/11/02 |
Ora, vogliamo conoscere i clienti di quali paesi hanno effettuato un totale combinato di 5 o più ordini con noi. Potrebbe essere un singolo cliente che effettua più di 5 ordini o 5 clienti che effettuano 1 ordine ciascuno.
Per raggiungere questo obiettivo, avremmo bisogno
Passaggio 1 : unire i due tavoli
Passaggio 2: raggruppare i clienti in base ai rispettivi paesi
Passaggio 3: contare il numero di ordini per ciascun gruppo
Passaggio 4: filtrare i risultati per 5 o più ordini
Formuliamo il 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
Ecco i risultati:
Nazione | NumberOfOrders |
Austria | 10 |
Francia | 9 |
Svezia | 7 |
Germania | 6 |
UK | 6 |
Conclusione - Clausola HAVING SQL
Pertanto, abbiamo visto qual è lo scopo della clausola HAVING e come funziona. È importante comprendere il funzionamento di base, altrimenti potresti finire per confonderti sul motivo per cui la clausola HAVING non sta producendo i risultati desiderati. Continua a giocare con vari tavoli, join e combinazioni insieme alla clausola HAVING.
Articoli consigliati
Questa è una guida alla clausola HAVING di SQL. Qui discutiamo del funzionamento della clausola HAVING in SQL ed esempio con la seguente tabella di clienti. Puoi anche consultare i nostri altri articoli suggeriti:
- Query di inserimento SQL
- Chiave esterna in SQL
- Parola chiave distinta in SQL
- Visualizzazioni SQL
- Primi 6 esempi di query di Inner Join in Oracle