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


DOVE - facoltativo
Raggruppa per: raggruppa le righe per applicare la funzione aggregata
HAVE - funzione aggregata nella condizione
ORDINATO DA ; - Definire l'ordinamento, facoltativo

Nota: la clausola GROUP BY è obbligatoria con la clausola HAVING. Questo perché la clausola Avere ha bisogno di un gruppo di dati per applicare una funzione aggregata e filtrare i risultati.

Come funziona la clausola HAVING?

Cerchiamo di capire il funzionamento della clausola HAVING in SQL.

La clausola HAVING è sempre accompagnata dalla clausola GROUP BY. La clausola GROUP BY raggruppa i dati che soddisfano un determinato criterio. Ha tre fasi: dividere, applicare e combinare. La fase suddivisa divide le righe in gruppi. La fase di applicazione applica alcune funzioni aggregate sui gruppi di dati. La fase combinata produce un singolo risultato combinando i gruppi con il risultato della funzione aggregata.

Ora che i gruppi sono formati, la clausola HAVING entra in scena. La clausola HAVING quindi filtra i gruppi che non soddisfano la condizione specificata.

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

Quindi, nell'esempio sopra, vediamo che la tabella deve essere prima divisa in tre gruppi in base alla colonna Col_A. La funzione aggregata per calcolare la media dei valori Col_B viene quindi applicata ai gruppi. Ciò si traduce in una singola riga per ciascun gruppo. Le righe vengono quindi combinate e filtrate in base alla condizione nella clausola HAVING.

Esempio

Ora diamo un'occhiata a un esempio del mondo reale. Considera che abbiamo la seguente tabella di clienti e gli ordini che hanno effettuato con noi.

Identificativo del clienteNome del clienteCittàNazione
1Anja DamianBerlinoGermania
2Denny CockettMessico DFMessico
3Eleonora CalnanMessico DFMessico
4Albertha AlburyLondraUK
5Latisha NembhardLuleåSvezia
6Madalene BingMannheimGermania
7Rebecka BeegleStrasburgoFrancia
8Rosy TippieMadridSpagna
9Audie KhanMarsigliaFrancia
10Hildegard BurrowesTsawassenCanada
11Cordell DutrembleLondraUK
12Nora ReynaBuenos AiresArgentina
13Ursula LaforestMessico DFMessico
14Claudie NeelBernaSvizzera
15Portia YeeSan PaoloBrasile
16Angila SegarraLondraUK
17Lise WexlerAachenGermania
18Ned MendivilNantesFrancia
19Sara VidaurriLondraUK
20Tayna NavinGrazAustria
21Pura RaySan PaoloBrasile
22Erika ByardMadridSpagna
23Jimmie LukeLilleFrancia
24Shayla ByingtonBräckeSvezia
25Christiana BodenMünchenGermania
26Irina NittaNantesFrancia
27Bryanna AllsTorinoItalia
28Norah PickenLisboaPortogallo
29Moriah StwartBarcellonaSpagna
30Idella HarriottSivigliaSpagna
ID ordineIdentificativo del clienteData dell'ordine
10254141996/11/07
102582017-07-1996
102591318-07-1996
102632023-07-1996
102642424-07-1996
10265725-07-1996
102672529-07-1996
1027851996/12/08
10280514-08-1996
102891126-08-1996
102901527-08-1996
1029771996/04/09
10303301996/11/09
10308218-09-1996
103111820-09-1996
1032681996/10/10
10327241996/11/10
103282814-10-1996
10331916-10-1996
103372524-10-1996
10340929-10-1996
103422530-10-1996
10347211996/06/11
10351201996/11/11
10352281996/12/11
10355415-11-1996
10360722-11-1996
10362925-11-1996
103631726-11-1996
103641926-11-1996
10365327-11-1996
103662928-11-1996
103682029-11-1996
10370141996/03/12
10378241996/10/12
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
10402201997/02/01
10403201997/03/01
10408231997/08/01
10410101997/10/01
10411101997/10/01
104142114-01-1997
104222722-01-1997
104262927-01-1997
104302030-01-1997
104311030-01-1997
10434241997/03/02
10435161997/04/02
1043671997/05/02
10442201997/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:

NazioneNumberOfOrders
Austria10
Francia9
Svezia7
Germania6
UK6

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:

  1. Query di inserimento SQL
  2. Chiave esterna in SQL
  3. Parola chiave distinta in SQL
  4. Visualizzazioni SQL
  5. Primi 6 esempi di query di Inner Join in Oracle