Torna all'elenco degli articoli Articoli
Tempo di lettura: 5 minuti

Tutorial SQL HAVING

Imparate a utilizzare la clausola HAVING di SQL per filtrare i gruppi utilizzando le condizioni da voi specificate.

La clausola HAVING di SQL è spesso un concetto difficile da comprendere, soprattutto per i principianti. Inoltre, i suoi casi d'uso specifici possono essere difficili da visualizzare senza esempi specifici basati su set di dati reali. In questa esercitazione imparerete ad applicare la clausola SQL HAVING per filtrare gruppi di record in base a condizioni specifiche. Vedrete esempi di applicazione di questo concetto per risolvere problemi aziendali su un set di dati realistico.

La funzione della clausola HAVING SQL

La clausola SQL HAVING viene solitamente utilizzata con la clausola GROUP BY per filtrare gruppi di righe. Solo quando la condizione specificata è VERA, le righe vengono incluse nel gruppo.

La clausola SQL GROUP BY organizza i dati in gruppi basati su valori comuni; viene utilizzata soprattutto per ottenere informazioni di riepilogo e calcolare statistiche aggregate. Se volete un aggiornamento più approfondito su questo argomento, consultate questo articolo su SQL GROUP BY.

Si potrebbe fare un po' di confusione su WHERE e HAVING, ma la differenza è facilmente spiegabile. La clausola WHERE applica una condizione sull'intera colonna filtrando le singole righe. Non funziona con le funzioni aggregate come SUM() e AVG(). D'altra parte, HAVING pone condizioni di filtro sui gruppi creati dalla clausola GROUP BY. Può essere utilizzata con le funzioni aggregate.

Ad esempio, consideriamo la tabella seguente. Mostra un elenco di clienti raggruppati per città in diversi Paesi. Se volessimo vedere i gruppi di città con 3 o più clienti, avremmo bisogno di una clausola HAVING che soddisfi questa condizione su ciascuna delle città (cioè i gruppi).

CustomerIDCityCountry
009BerlinGermany
045BerlinGermany
101BerlinGermany
098BernSwitzerland
003BernSwitzerland
154Buenos AiresArgentina
111Buenos AiresArgentina
039Buenos AiresArgentina
191WallaPoland

In altre parole, la clausola HAVING è essenzialmente una clausola WHERE che opera sui record restituiti da GROUP BY. (Abbiamo anche un confronto più approfondito tra HAVING e WHERE se siete interessati ad approfondire).

La sintassi SQL HAVING

HAVING non funziona senza la clausola GROUP BY. Deve seguire la clausola GROUP BY in una query e deve precedere la clausola ORDER BY (se se ne usa una). Verranno restituiti solo i gruppi che soddisfano i criteri di HAVING.

Per esempio, proviamo la seguente query sulla tabella customers tabella:

SELECT COUNT(CustomerID), City, Country
FROM Customers
WHERE Country = 'Brazil'
GROUP BY City, Country
HAVING COUNT(CustomerID) > 1

Cosa succede in questa query?

  • Innanzitutto, la clausola WHERE filtra le righe applicabili per il Paese "Brasile".
  • In secondo luogo, la clausola GROUP BY raggruppa le voci in base ai valori delle colonne City e Country.
  • In terzo luogo, la clausola HAVING filtra i gruppi: in questo caso, siamo interessati solo alle città brasiliane che hanno più di un cliente.

Il corso LearnSQL.it SQL Basics copre la sintassi e l'applicazione della clausola HAVING in un ambiente coinvolgente e interattivo. Se volete fare pratica, ve lo consiglio. Ma prima, vediamo altri esempi di HAVING.

Esempi di HAVING SQL

Vediamo alcuni esempi che presentano diverse funzioni aggregate, in modo da capire come funziona davvero la clausola HAVING. Utilizzeremo la seguente tabella clienti OrderDetails cliente. Essa contiene un totale di 518 righe di dati relativi a ordini semplici. Sono incluse informazioni quali Quantity e ProductID ordinati e un OrderID univoco per ogni ordine.

OrderDetailIDOrderIDProductIDQuantity
1102481112
2102484210
310248725
410249149
510249142
6102495140
518104432812

In qualità di analista di dati, uno dei vostri compiti principali è quello di ottenere informazioni sui dati di vendita. Esploreremo tre semplici problemi che mirano a trovare alcune di queste intuizioni.

Esempio 1: HAVING con COUNT()

PROBLEMA: Elencare tutti i prodotti con più di 12 ordini individuali effettuati.

DOMANDA:

SELECT COUNT(ProductID), ProductID
FROM OrderDetails
GROUP BY ProductID
HAVING COUNT(ProductID) > 12

RISULTATO:

Number of Records: 5
COUNT(ProductID)ProductID
1431
1459
1362
1371
1472

Se non avessimo incluso la clausola HAVING, questa query restituirebbe essenzialmente il numero di record pari al numero univoco di ProductIDs. Qui, GROUP BY mette in gruppo gli ordini con lo stesso ProductID. Quindi, la clausola HAVING pone la condizione di filtraggio su ciascuno di questi gruppi e restituisce quelli che hanno un conteggio superiore a 12.

Esempio 2: HAVING con SUM()

PROBLEMA: Elencare tutti i prodotti per i quali sono state ordinate più di 350 quantità totali.

DOMANDA:

SELECT SUM(Quantity), ProductID
FROM OrderDetails
GROUP BY ProductID
HAVING SUM(Quantity) > 350
ORDER BY SUM(Quantity) DESC

RISULTATO:

Number of Records: 3
COUNT(ProductID)ProductID
45831
43060
36935

Nell'esempio precedente, GROUP BY raggruppa in modo simile gli ordini per ProductID. Quindi, la clausola HAVING pone la condizione di filtraggio (la somma della colonna Quantity deve essere superiore a 350) su ciascuno di questi gruppi. Infine, ORDER BY restituisce i risultati in ordine decrescente.

Esempio 3: HAVING con AVG()

PROBLEMA: Elencare tutti i prodotti che hanno avuto più di 35 quantità ordinate in media e almeno 4 ordini effettuati.

DOMANDA:

SELECT AVG(Quantity), COUNT(ProductID), ProductID
FROM OrderDetails
GROUP BY ProductID
HAVING AVG(Quantity) > 35 AND COUNT(ProductID) > 3
ORDER BY AVG(Quantity) DESC

RISULTATO:

Number of Records: 6
AVG(Quantity)ProductIDCOUNT(ProductID)
41.25234
41359
38.75584
35.836012
35.6445
35.11339

Nell'esempio 3, dopo aver raggruppato gli ordini in base a ProductID, la clausola HAVING pone due condizioni di filtraggio sui gruppi: una quantità media di ordini superiore a 35 e un numero di ordini singoli superiore a 3.

Sulla base dei tre esempi precedenti, abbiamo appreso che ProductID 31, ad esempio, è stato incluso nel maggior numero di ordini singoli (14) e ha avuto anche il maggior numero di quantità ordinate tra tutti gli ordini effettuati (458). Questo è sicuramente uno dei prodotti più popolari del negozio!

Inoltre, ProductIDs 23, 35 e 58 hanno registrato le quantità medie più elevate per ordine. Informazioni chiave come queste sono preziose e consentono alle aziende di sapere su quali prodotti concentrarsi e come commercializzarli.

Padroneggiare la clausola HAVING di SQL

Come abbiamo appena visto, la clausola HAVING è indispensabile per calcolare valori aggregati su gruppi di dati. Pertanto, viene sempre utilizzata in combinazione con la clausola GROUP BY e limita i dati ai record raggruppati piuttosto che ai singoli record.

Se volete saperne di più sull'uso della clausola HAVING di SQL, provate il nostro corso SQL Basics . Copre in dettaglio la clausola HAVING e spiega meglio come raggruppare, filtrare e ordinare i dati. Ci sono anche molti problemi pratici e quiz che permettono di prendere confidenza con l'SQL di base.