Salta ai contenuti

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.

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_clienti
FROM clienti
GROUP BY citta
HAVING COUNT(*) >= 2;

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

Partiamo da questa tabella:

nomecitta
LucaRoma
SaraRoma
MartaMilano

La query:

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

produce:

cittanumero_clienti
Roma2

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 succedono due cose:

  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. Poi 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().