0Pricing
SQL Academy · Lezione

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 orders

Combinare 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:

  1. FROM — seleziona le tabelle ed esegue i join
  2. WHERE — filtra le righe
  3. GROUP BY — crea i gruppi
  4. HAVING — filtra i gruppi
  5. SELECT — proietta le colonne
  6. ORDER BY — ordina
  7. LIMIT — 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 1M

Alias 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 / MySQL

HAVING 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

  1. COUNT, SUM, AVG, MIN, MAX
  2. GROUP BY con una o più colonne
  3. HAVING rispetto a WHERE
  4. Problemi comuni: i NULL nelle aggregazioni
← Torna a SQL Academy