Sommario: in questo tutorial, imparerete come usare la clausola MySQL HAVING per specificare una condizione di filtro per gruppi di righe o aggregati.

Introduzione alla clausola HAVING di MySQL

La clausola HAVING è usata nell’istruzione SELECT per specificare condizioni di filtro per un gruppo di righe o aggregati.

La clausola HAVING è spesso usata con la clausola GROUP BY per filtrare gruppi basati su una condizione specificata. Se la clausola GROUP BY viene omessa, la clausola HAVING si comporta come la clausola WHERE.

Il seguente illustra la sintassi della clausola HAVING:

SELECT select_listFROM table_nameWHERE search_conditionGROUP BY group_by_expressionHAVING group_condition;
Code language: SQL (Structured Query Language) (sql)

In questa sintassi, si specifica una condizione nella clausola HAVING. Se una riga, generata dalla clausola group by, fa sì che il group_condition venga valutato vero, la query la includerà nel set di risultati.

Nota che la clausola HAVING applica una condizione di filtro ad ogni gruppo di righe, mentre la clausola WHERE applica la condizione di filtro ad ogni singola riga.

MySQL valuta la clausola HAVING dopo la FROMWHERESELECT e GROUP BY clausole e prima delle clausole ORDER BY, e LIMIT.

Nota che lo standard SQL specifica che il HAVING viene valutato prima della clausola SELECT e dopo la clausola GROUP BY.

Esempi di clausola HAVING MySQL

Facciamo alcuni esempi di utilizzo della clausola HAVING per vedere come funziona. Useremo la tabella orderdetails nel database di esempio per la dimostrazione.

Il seguente usa la clausola GROUP BY per ottenere i numeri d’ordine, il numero di articoli venduti per ordine e il totale delle vendite per ciascuno dalla tabella orderdetails:

SELECT ordernumber, SUM(quantityOrdered) AS itemsCount, SUM(priceeach*quantityOrdered) AS totalFROM orderdetailsGROUP BY ordernumber;
Code language: SQL (Structured Query Language) (sql)

Prova

Ora, è possibile trovare quale ordine ha vendite totali maggiori di 1000 utilizzando la clausola HAVING come segue:

SELECT ordernumber, SUM(quantityOrdered) AS itemsCount, SUM(priceeach*quantityOrdered) AS totalFROM orderdetailsGROUP BY ordernumberHAVING total > 1000;
Code language: SQL (Structured Query Language) (sql)

Prova

È possibile costruire una condizione complessa nella clausola HAVING utilizzando operatori logici come OR e AND.

L’esempio seguente utilizza la clausola HAVING per trovare gli ordini che hanno importi totali maggiori di 1000 e contengono più di 600 articoli:

SELECT ordernumber, SUM(quantityOrdered) AS itemsCount, SUM(priceeach*quantityOrdered) AS totalFROM orderdetailsGROUP BY ordernumberHAVING total > 1000 AND itemsCount > 600;
Code language: SQL (Structured Query Language) (sql)

Prova

Supponiamo che tu voglia trovare tutti gli ordini che sono in stato spedito e hanno l’importo totale maggiore di 1500, potete unire la tabella orderdetails con la tabella orders utilizzando la clausola INNER JOIN e applicare una condizione sulla colonna status e total aggregata come mostrato nella seguente query:

SELECT a.ordernumber, status, SUM(priceeach*quantityOrdered) totalFROM orderdetails aINNER JOIN orders b ON b.ordernumber = a.ordernumberGROUP BY ordernumber, statusHAVING status = 'Shipped' AND total > 1500;
Code language: SQL (Structured Query Language) (sql)

Prova

Il HAVING è utile solo quando la si usa con la clausola GROUP BY per generare l’output dei report di altodi alto livello. Per esempio, potete usare la clausola HAVING per rispondere a domande come trovare il numero di ordini di questo mese, di questo trimestre o di questo anno che hanno vendite totali superiori a 10K.

In questo tutorial, hai imparato ad usare la clausola MySQL HAVING con la clausola GROUP BY per specificare condizioni di filtro per gruppi di righe o aggregati.

  • Questo tutorial è stato utile?
  • SìNo

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *