1. Cos’è la clausola HAVING?
La clausola HAVING in SQL viene utilizzata per applicare condizioni ai risultati aggregati dopo aver raggruppato i dati. Viene tipicamente usata insieme alla clausola GROUP BY e serve a filtrare i dati dopo l’aggregazione. Utilizzando HAVING, è possibile estrarre solo quei gruppi che soddisfano criteri specifici.
Ad esempio, HAVING può essere usata quando si desidera selezionare i clienti il cui totale delle vendite supera una certa cifra o i gruppi il cui punteggio medio supera una soglia specifica. A differenza della clausola WHERE, che applica condizioni a singole righe prima dell’aggregazione, HAVING applica condizioni ai risultati aggregati dopo il raggruppamento.
Esempio di utilizzo della clausola HAVING
Ad esempio, la query seguente estrae i clienti il cui totale delle vendite supera i 10.000 yen:
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 il totale delle vendite di ciascun cliente ed estrae solo quelli il cui totale supera i 10.000 yen.
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 con la clausola HAVING. Ad esempio, la query seguente estrae i clienti che hanno effettuato almeno 5 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 conta il numero di ordini per ciascun cliente, e vengono filtrati solo quelli con 5 o più ordini.

3. Esempi di utilizzo della clausola HAVING
La clausola HAVING è uno strumento potente per l’analisi avanzata dei dati quando viene combinata con funzioni aggregate. Di seguito alcuni esempi specifici.
Esempio 1: Filtrare per vendite totali
Per estrarre i prodotti con vendite superiori a 10.000 yen, utilizzare la funzione SUM come segue:
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 quelli con un totale superiore a 10.000 yen.
Esempio 2: Filtrare per numero di ordini
Per estrarre i clienti che hanno effettuato 10 o più ordini:
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 ciascun cliente ed estrae solo quelli che ne hanno effettuati 10 o più.
4. Differenza tra HAVING e WHERE
Sia la clausola HAVING sia la clausola WHERE effettuano filtraggi, ma vengono applicate in fasi diverse.
Differenza nel momento di applicazione
- Clausola WHERE : Applicata prima del raggruppamento, filtra le singole righe.
- Clausola HAVING : Applicata dopo il raggruppamento, filtra i risultati aggregati.
Ad esempio, combinando WHERE e HAVING in una query, si può prima filtrare i dati dove le vendite sono almeno 1.000 yen usando WHERE, e poi utilizzare HAVING per estrarre i gruppi dove le vendite totali superano i 5.000 yen.
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, i dati filtrati dalla clausola WHERE vengono raggruppati con GROUP BY, e la clausola HAVING viene poi applicata per estrarre solo i clienti con vendite totali superiori a 5.000 yen.

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 condizioni su singole righe, la clausola WHERE è più appropriata.
Uso di alias
Nella clausola HAVING, è possibile utilizzare gli alias specificati con AS nelle espressioni di condizione. Ad esempio, è possibile assegnare un alias alle vendite totali e usarlo come segue:
SELECT customer_id, SUM(sales) AS total_sales
FROM sales_table
GROUP BY customer_id
HAVING total_sales > 10000;
Questa query estrae i clienti le cui vendite totali superano i 10.000 yen.
6. Riepilogo: Come utilizzare la clausola HAVING
La clausola HAVING è uno strumento potente per filtrare in modo flessibile i dati aggregati applicando condizioni. È particolarmente utile quando si analizzano dati aggregati come vendite o conteggi di ordini, consentendo un’analisi efficiente dei dati. Comprendendo le differenze rispetto alla clausola WHERE e usandole appropriatamente insieme, è possibile massimizzare la flessibilità delle proprie query SQL.


