0Pricing
Coding Interview Prep · Lezione

HAVING e WHERE

Filtrare prima o dopo il raggruppamento e capire quale clausola vede l'aggregato

HAVING e WHERE è una lezione Coding Interview Prep gratuita su CoddyKit. Questa è la lezione 2 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 Coding Interview Prep, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Coding Interview Prep include 4 lezioni in totale.

La domanda che Le verrà posta

«Qual è la differenza tra WHERE e HAVING?» è una delle domande più frequenti nei colloqui su SQL. Una risposta debole dice: «HAVING serve per gli aggregati». Una risposta completa spiega quando viene eseguita ciascuna clausola nella pipeline della query.

La tempistica è il punto centrale: WHERE filtra le righe prima del raggruppamento; HAVING filtra i gruppi dopo l'aggregazione.

La loro posizione nell'ordine di esecuzione

Ricordi l'ordine logico di esecuzione di una query:

  • FROM / JOIN → costruiscono l'insieme di righe
  • WHERE → filtra le singole righe
  • GROUP BY → le raggruppa
  • HAVING → filtra i gruppi
  • SELECT → proietta le colonne
  • ORDER BY → ordina

WHERE viene eseguita prima che esistano i gruppi; HAVING viene eseguita dopo, quindi HAVING può vedere gli aggregati mentre WHERE non può.

WHERE non può vedere gli aggregati

Poiché WHERE viene eseguita prima del raggruppamento, non dispone ancora di valori aggregati. Scrivere WHERE COUNT(*) > 5 genera un errore di sintassi in ogni database conforme allo standard.

Nei colloqui viene inserita proprio questa riga per verificare se comprende la pipeline. L'aggregato non esiste ancora quando WHERE viene valutata.

-- ERROR: aggregate not allowed in WHERE
SELECT department, COUNT(*)
FROM employees
WHERE COUNT(*) > 5
GROUP BY department;

HAVING filtra i gruppi

Sposti la condizione sull'aggregato in HAVING: funzionerà perché HAVING viene eseguita dopo il calcolo dei gruppi e dei relativi aggregati.

La si può leggere così: «raggruppi i dipendenti, poi mantenga solo i reparti il cui conteggio supera cinque».

SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;

Inserisca i filtri sulle righe in WHERE

L'errore opposto consiste nel filtrare le righe originali in HAVING. Spesso produce la risposta corretta, ma è più lento e fuorviante, perché raggruppa righe che si intendeva scartare.

Regola pratica: filtra un valore di una colonna originale → WHERE. Filtra un aggregato → HAVING. Filtrare presto le righe riduce i dati che il raggruppamento deve elaborare.

-- Better: drop inactive rows BEFORE grouping
SELECT department, COUNT(*) AS headcount
FROM employees
WHERE status = 'active'
GROUP BY department
HAVING COUNT(*) > 5;

Le due clausole insieme

Una query completa utilizza spesso entrambe le clausole. WHERE restringe prima l'insieme di righe; HAVING mantiene poi solo i gruppi che soddisfano i criteri. Leggere dall'alto verso il basso rispecchia l'ordine logico.

Esempio svolto: tra gli ordini effettuati quest'anno, trovare i clienti che hanno speso complessivamente più di 1000.

SELECT customer_id, SUM(amount) AS total_spent
FROM orders
WHERE order_date >= '2024-01-01'
GROUP BY customer_id
HAVING SUM(amount) > 1000;

HAVING su colonne non aggregate

HAVING può fare riferimento a una colonna di raggruppamento, non solo agli aggregati. HAVING department = 'Sales' è valido, ma inutile: quel filtro dovrebbe trovarsi in WHERE, in modo da essere eseguito prima.

Se durante un colloquio Le mostrano una clausola HAVING che filtra una semplice colonna raggruppata, la critica attesa è: «la sposti in WHERE per maggiore efficienza».

-- Works but inefficient; prefer WHERE department = 'Sales'
SELECT department, COUNT(*)
FROM employees
GROUP BY department
HAVING department = 'Sales';

HAVING senza GROUP BY

Un caso sottile: HAVING è valida anche senza GROUP BY. L'intera tabella diventa un unico gruppo implicito, e HAVING filtra quel gruppo.

Se la condizione sull'aggregato è falsa, si ottengono zero righe; se è vera, una riga. È raramente utile, ma nei colloqui viene chiesto per verificare la comprensione del concetto di gruppo implicito.

-- Returns the count only if the table has > 100 rows
SELECT COUNT(*) AS total
FROM orders
HAVING COUNT(*) > 100;

HAVING può usare un alias di SELECT?

Come per il problema dell'ambito degli alias in altri contesti, i dialetti differiscono. Postgres e MySQL consentono a HAVING di fare riferimento a un alias di SELECT; SQL Server e Oracle no.

L'abitudine più portabile consiste nel ripetere l'espressione dell'aggregato in HAVING. Funziona in ogni motore ed evita sorprese in un colloquio su database diversi.

-- Portable: repeat the aggregate, do not rely on the alias
SELECT region, SUM(amount) AS total
FROM sales
GROUP BY region
HAVING SUM(amount) > 5000;

Aspetti prestazionali

Per fare una buona impressione, colleghi le clausole alle prestazioni: WHERE riduce le righe che il motore di raggruppamento deve scansionare e può utilizzare gli indici; HAVING viene eseguita su gruppi già aggregati, quindi non può ridurre il costo del raggruppamento.

Il concetto che gli intervistatori vogliono sentire è: sposti ogni filtro il più presto possibile. Solo le condizioni che dipendono realmente da un aggregato richiedono HAVING.

La risposta in una frase

Memorizzi questa frase per il colloquio: «WHERE filtra le righe prima del raggruppamento e non può vedere gli aggregati; HAVING filtra i gruppi dopo l'aggregazione ed è l'unica clausola che può verificare il valore di un aggregato.»

Aggiunga l'elenco dell'ordine di esecuzione e avrà fornito una risposta completa, dal tono professionale.

Verifica rapida

Decida a quale clausola appartiene ciascuna condizione.

Riepilogo

WHERE: filtra le righe prima di GROUP BY; gli aggregati non sono consentiti. HAVING: filtra i gruppi dopo l'aggregazione ed è l'unico punto in cui una condizione su un aggregato è valida.

  • Inserisca i filtri sulle colonne originali in WHERE per ottenere maggiore velocità e utilizzare gli indici.
  • HAVING può fare riferimento a colonne raggruppate, ma non dovrebbe essere usata per i filtri semplici.
  • HAVING funziona senza GROUP BY sul gruppo implicito che comprende l'intera tabella.
  • Ripeta le espressioni degli aggregati in HAVING per garantire la compatibilità tra dialetti.

Domande Frequenti

La lezione «HAVING e WHERE» è gratuita?

Sì — il testo completo di «HAVING e 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 Coding Interview Prep, passa a CoddyKit PRO. Il corso Coding Interview Prep include 4 lezioni in totale.

Cosa imparerò in «HAVING e WHERE»?

Filtrare prima o dopo il raggruppamento e capire quale clausola vede l'aggregato Eserciti Coding Interview Prep 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 Coding Interview Prep?

Non è richiesta alcuna esperienza precedente. Coding Interview Prep su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «HAVING e 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 Coding Interview Prep?

Sì. Ogni lezione Coding Interview Prep 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. La regola di GROUP BY per le colonne SELECT
  2. HAVING e WHERE
  3. Raggruppare per più colonne ed espressioni
  4. Contare e filtrare i gruppi
← Torna a Coding Interview Prep