HAVING
Filtrare dopo il raggruppamento
Sezione intitolata “Filtrare dopo il raggruppamento”HAVING assomiglia a WHERE, ma lavora in un momento diverso.
WHERE filtra le righe prima di creare i gruppi. HAVING filtra i gruppi dopo che GROUP BY li ha creati.
Immagina di dividere gli studenti per classe. Prima crei i gruppi. Poi tieni solo le classi con almeno 20 studenti. Quel secondo filtro è il lavoro di HAVING.
SELECT citta, COUNT(*) AS numero_clientiFROM clientiGROUP BY cittaHAVING COUNT(*) >= 2;Questa query mostra solo le città con almeno due clienti.
Un esempio piccolo
Sezione intitolata “Un esempio piccolo”Partiamo da questa tabella:
| nome | citta |
|---|---|
| Luca | Roma |
| Sara | Roma |
| Marta | Milano |
La query:
SELECT citta, COUNT(*) AS numero_clientiFROM clientiGROUP BY cittaHAVING COUNT(*) >= 2;produce:
| citta | numero_clienti |
|---|---|
| Roma | 2 |
Milano non appare perché il suo gruppo contiene un solo cliente.
WHERE e HAVING insieme
Sezione intitolata “WHERE e HAVING insieme”Puoi usare entrambi nella stessa query:
SELECT citta, COUNT(*) AS numero_clienti_attiviFROM clientiWHERE attivo = TRUEGROUP BY cittaHAVING COUNT(*) >= 2;Qui succedono due cose:
WHERE attivo = TRUEtiene solo i clienti attivi.HAVING COUNT(*) >= 2tiene solo le città con almeno due clienti attivi.
Prima filtri le righe. Poi crei i gruppi. Poi filtri i gruppi.
Quando ti serve HAVING
Sezione intitolata “Quando ti serve HAVING”Usa HAVING quando la condizione riguarda un risultato aggregato:
- città con più di 10 clienti
- prodotti con vendite sopra una certa soglia
- mesi con almeno 100 ordini
- categorie con prezzo medio superiore a 50
Se nella condizione compare COUNT(), SUM(), AVG() o una funzione simile, probabilmente ti serve HAVING.
Riepilogo rapido
Sezione intitolata “Riepilogo rapido”WHEREfiltra righe singole.HAVINGfiltra gruppi.HAVINGsi usa dopoGROUP BY.- Si usa spesso con funzioni aggregate come
COUNT(),SUM()eAVG().