1. Che cos’è la clausola HAVING?
La clausola HAVING è una sintassi SQL utilizzata per applicare condizioni ai risultati aggregati dopo che i dati sono stati raggruppati. Viene tipicamente usata in combinazione con la clausola GROUP BY e svolge il ruolo di filtrare i dati dopo l’aggregazione. Utilizzando la clausola HAVING, è possibile estrarre solo i gruppi che soddisfano criteri specifici.
Ad esempio, la clausola HAVING è usata quando si desidera estrarre i clienti il cui totale delle vendite supera una certa cifra o i gruppi il cui punteggio medio è al di sopra di una soglia specifica. Mentre la clausola WHERE applica condizioni a singole righe prima dell’aggregazione, la clausola HAVING applica condizioni ai risultati dopo l’aggregazione.
Esempio di utilizzo della clausola HAVING
Ad esempio, la query seguente estrae i clienti il cui totale delle vendite supera i 10.000.
SELECT customer_id, SUM(sales) AS total_sales
FROM sales_table
GROUP BY customer_id
HAVING SUM(sales) > 10000;
Questa query utilizza la funzione SUM per calcolare le vendite totali per ciascun cliente ed estrae solo quei clienti il cui totale supera i 10.000.
2. Sintassi di base e utilizzo della clausola HAVING
La sintassi di base della clausola HAVING è la seguente:
SELECT column_name, aggregate_function(column_name)
FROM table_name
GROUP BY column_name
HAVING condition;
Questa sintassi raggruppa i dati usando la clausola GROUP BY e filtra i risultati aggregati specificando condizioni nella clausola HAVING. Ad esempio, la query seguente estrae i clienti che hanno effettuato cinque o più ordini dalla tabella degli ordini.
SELECT customer_id, COUNT(order_id) AS order_count
FROM orders_table
GROUP BY customer_id
HAVING COUNT(order_id) >= 5;
Qui, la funzione COUNT è usata per contare il numero di ordini per cliente, e vengono filtrati solo i clienti con cinque o più ordini.
3. Applicazioni pratiche della clausola HAVING
La clausola HAVING è uno strumento potente per l’analisi avanzata dei dati quando combinata con funzioni aggregate. Di seguito sono riportati diversi esempi concreti di come può essere applicata.
Esempio 1: Filtrare per vendite totali
Per estrarre i prodotti il cui totale delle vendite supera i 10.000, utilizzare la funzione SUM come mostrato di seguito.
SELECT product_id, SUM(sales) AS total_sales
FROM products_table
GROUP BY product_id
HAVING SUM(sales) > 10000;
Questa query calcola le vendite totali per ciascun prodotto ed estrae solo quei prodotti il cui totale supera i 10.000.
Esempio 2: Filtrare per numero di ordini
Se un cliente specifico ha effettuato più di 10 ordini, estrarre quel cliente come segue.
SELECT customer_id, COUNT(order_id) AS order_count
FROM orders_table
GROUP BY customer_id
HAVING COUNT(order_id) > 10;
Questa query calcola il numero di ordini per cliente ed estrae solo i clienti che hanno effettuato più di 10 ordini.
4. Differenza tra HAVING e WHERE
Sia la clausola HAVING sia la clausola WHERE vengono utilizzate per filtrare i dati, ma differiscono nel momento in cui vengono applicate.
Differenza nel momento di applicazione
- Clausola WHERE : Applicata prima del raggruppamento e filtra le singole righe.
- Clausola HAVING : Applicata dopo il raggruppamento e filtra i risultati aggregati.
Ad esempio, in una query che combina le clausole WHERE e HAVING, la clausola WHERE filtra prima i dati dove le vendite sono pari o superiori a 1.000, e poi la clausola HAVING estrae i risultati dove il totale delle vendite supera i 5.000.
SELECT customer_id, SUM(sales) AS total_sales
FROM sales_table
WHERE sales >= 1000
GROUP BY customer_id
HAVING SUM(sales) > 5000;
In questa query, GROUP BY e HAVING sono applicati ai dati filtrati dalla clausola WHERE, estraendo solo i clienti il cui totale delle vendite è pari o superiore a 5.000.

5. Note importanti quando si utilizza la clausola HAVING
Deve essere usata con funzioni aggregate
Poiché la clausola HAVING filtra i risultati aggregati, deve essere utilizzata insieme a funzioni aggregate come SUM o COUNT. Per le condizioni che si applicano a singole righe, è opportuno usare la clausola WHERE.
Utilizzo degli alias
Nella clausola HAVING è possibile scrivere condizioni usando gli alias specificati con AS. Ad esempio, è possibile assegnare un alias al totale delle vendite e usarlo nella condizione come mostrato di seguito.
SELECT customer_id, SUM(sales) AS total_sales
FROM sales_table
GROUP BY customer_id
HAVING total_sales > 10000;
Questa query estrae i clienti il cui totale delle vendite supera i 10.000.
6. Riepilogo: Come utilizzare efficacemente la clausola HAVING
La clausola HAVING è uno strumento potente che consente di filtrare in modo flessibile i dati aggregati applicando condizioni ai risultati di sintesi. In particolare, quando si analizzano dati aggregati come i totali delle vendite o il conteggio degli ordini, l’uso della clausola HAVING permette un’analisi dei dati più efficiente. Comprendendo la differenza tra la clausola HAVING e la clausola WHERE e utilizzandole in modo appropriato insieme, è possibile massimizzare la flessibilità delle proprie query SQL.


