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
:
Code language: SQL (Structured Query Language) (sql)SELECT select_listFROM table_nameWHERE search_conditionGROUP BY group_by_expressionHAVING group_condition;
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 FROM
WHERE
SELECT
e GROUP BY
clausole e prima delle clausole ORDER BY
, e LIMIT
.
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
:
Code language: SQL (Structured Query Language) (sql)SELECT ordernumber, SUM(quantityOrdered) AS itemsCount, SUM(priceeach*quantityOrdered) AS totalFROM orderdetailsGROUP BY ordernumber;
Prova
Ora, è possibile trovare quale ordine ha vendite totali maggiori di 1000
utilizzando la clausola HAVING
come segue:
Code language: SQL (Structured Query Language) (sql)SELECT ordernumber, SUM(quantityOrdered) AS itemsCount, SUM(priceeach*quantityOrdered) AS totalFROM orderdetailsGROUP BY ordernumberHAVING total > 1000;
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:
Code language: SQL (Structured Query Language) (sql)SELECT ordernumber, SUM(quantityOrdered) AS itemsCount, SUM(priceeach*quantityOrdered) AS totalFROM orderdetailsGROUP BY ordernumberHAVING total > 1000 AND itemsCount > 600;
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:
Code language: SQL (Structured Query Language) (sql)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;
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