HAVING rispetto a WHERE
Distingua HAVING, che filtra i gruppi, da WHERE, che filtra le righe, e applichi correttamente entrambe nella stessa query
HAVING rispetto a WHERE è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Academy include 4 lezioni in totale.
Due fasi di filtraggio
WHERE filtra le singole righe PRIMA del raggruppamento. HAVING filtra i gruppi DOPO l'aggregazione. Sembrano simili, ma operano in fasi diverse.
Esempio di WHERE
WHERE filtra le righe non elaborate. Non può accedere agli aggregati:
-- Sum totals for rows where status is 'paid':
SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE status = 'paid'
GROUP BY user_id;Esempio di HAVING
HAVING filtra i gruppi. Può fare riferimento agli aggregati:
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5; -- only users with ≥ 5 ordersCombinare WHERE e HAVING
È possibile utilizzare entrambe nella stessa query:
SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE created_at >= NOW() - INTERVAL '90 days'
GROUP BY user_id
HAVING SUM(total) > 1000;Non inserisca gli aggregati in WHERE
Il pianificatore esegue WHERE prima del raggruppamento, quindi gli aggregati non sono ancora disponibili:
-- WRONG:
SELECT user_id, COUNT(*) FROM orders
WHERE COUNT(*) > 5 -- ERROR
GROUP BY user_id;
-- RIGHT — move to HAVING:
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING COUNT(*) > 5;Sposti i predicati in WHERE quando possibile
WHERE filtra prima del raggruppamento, quindi un numero inferiore di righe entra nell'aggregazione. Utilizzi HAVING solo per le condizioni che non possono essere espresse in WHERE.
-- Slightly slower (filters after grouping):
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING user_id IN (1,2,3);
-- Faster (filters before grouping):
SELECT user_id, COUNT(*) FROM orders
WHERE user_id IN (1,2,3)
GROUP BY user_id;Ordine logico di esecuzione
Ordine concettuale:
FROM— seleziona le tabelle ed esegue i joinWHERE— filtra le righeGROUP BY— crea i gruppiHAVING— filtra i gruppiSELECT— proietta le colonneORDER BY— ordinaLIMIT— restituisce i primi N risultati
HAVING senza GROUP BY
È possibile utilizzare HAVING senza GROUP BY: l'intera tabella diventa un unico gruppo:
SELECT SUM(total) FROM orders
HAVING SUM(total) > 1000000; -- prints only if total over 1MAlias in HAVING
Alcuni database permettono a HAVING di fare riferimento agli alias di SELECT; PostgreSQL e MySQL lo consentono, mentre SQL standard no. L'opzione più portabile consiste nel ripetere l'aggregato:
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5; -- portable
-- HAVING order_count >= 5 -- works in PG / MySQLHAVING con più aggregati
Utilizzi HAVING per condizioni composte sugli aggregati:
SELECT user_id, COUNT(*) AS orders, SUM(total) AS revenue
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5 AND SUM(total) > 1000;Nota sulle prestazioni
Un filtro sugli aggregati in HAVING non può utilizzare gli indici come può fare WHERE su una colonna. Sposti in WHERE tutto ciò che è possibile spostare.
Riepilogo
WHERE = filtra le righe. HAVING = filtra i gruppi.
- Gli aggregati vanno utilizzati solo in HAVING, mai in WHERE
- Sposti i predicati in WHERE per migliorare le prestazioni
- Utilizzi entrambe quando necessario
Verifica rapida
Desidera trovare gli utenti che hanno effettuato più di 10 ordini. Quale clausola esegue questo filtraggio?
Domande Frequenti
La lezione «HAVING rispetto a WHERE» è gratuita?
Sì — il testo completo di «HAVING rispetto a WHERE» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Academy, passa a CoddyKit PRO. Il corso SQL Academy include 4 lezioni in totale.
Cosa imparerò in «HAVING rispetto a WHERE»?
Distingua HAVING, che filtra i gruppi, da WHERE, che filtra le righe, e applichi correttamente entrambe nella stessa query Eserciti SQL Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare SQL Academy?
Non è richiesta alcuna esperienza precedente. SQL Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «HAVING rispetto a WHERE»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione SQL Academy?
Sì. Ogni lezione SQL Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- COUNT, SUM, AVG, MIN, MAX
- GROUP BY con una o più colonne
- HAVING rispetto a WHERE
- Problemi comuni: i NULL nelle aggregazioni