Salta ai contenuti
Manuale LogoManuale Logo

HAVING

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.

Per esempio, puoi dividere gli studenti per classe e mantenere solo le classi con almeno 20 studenti. Questo secondo filtro usa HAVING.

SELECT citta, COUNT(*) AS numero_clienti
FROM clienti
GROUP BY citta
HAVING COUNT(*) >= 2;

Questa query mostra solo le città con almeno due clienti.

Partiamo da questa tabella:

nome citta
Luca Roma
Sara Roma
Marta Milano

La query:

SELECT citta, COUNT(*) AS numero_clienti
FROM clienti
GROUP BY citta
HAVING COUNT(*) >= 2;

produce:

citta numero_clienti
Roma 2

Milano non appare perché il suo gruppo contiene un solo cliente.

Puoi usare entrambi nella stessa query:

SELECT citta, COUNT(*) AS numero_clienti_attivi
FROM clienti
WHERE attivo = TRUE
GROUP BY citta
HAVING COUNT(*) >= 2;

Qui avvengono due passaggi:

  1. WHERE attivo = TRUE tiene solo i clienti attivi.
  2. HAVING COUNT(*) >= 2 tiene solo le città con almeno due clienti attivi.

Prima filtri le righe, poi crei i gruppi e infine filtri i gruppi.

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.

  • WHERE filtra righe singole.
  • HAVING filtra gruppi.
  • HAVING si usa dopo GROUP BY.
  • Si usa spesso con funzioni aggregate come COUNT(), SUM() e AVG().