0Pricing
SQL Interview Prep · Lezione

ON e WHERE nei join

Capire quando una condizione appartiene a ON anziché a WHERE e perché questo influisce sui risultati

ON e WHERE nei join è una lezione SQL 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 SQL Interview Prep, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Interview Prep include 4 lezioni in totale.

Un predicato può trovarsi in due punti

Una volta imparato a scrivere un INNER JOIN, la domanda successiva dell'intervistatore diventa più precisa: questa condizione va inserita in ON o in WHERE?

Per un INNER JOIN la risposta spesso è «il risultato non cambia». Ma non appena si passa a un outer join, la scelta modifica completamente il risultato. Gli intervistatori lo chiedono proprio perché chi ha poca esperienza mette tutto in WHERE per abitudine.

Questa lezione rende la regola chiara.

Cosa fa ON

La clausola ON definisce come vengono abbinate le righe. Viene applicata durante la costruzione del join e decide quale riga della tabella sinistra corrisponde a quale riga della tabella destra.

Consideri ON come la risposta alla domanda: «queste due righe appartengono allo stesso insieme?»

SELECT c.name, o.amount
FROM customers c
JOIN orders o
  ON o.customer_id = c.id;   -- pairing rule

Cosa fa WHERE

La clausola WHERE viene applicata dopo che il join ha prodotto le righe combinate. Filtra quel set di risultati ed elimina le righe che non superano il test.

Consideri WHERE come la risposta alla domanda: «ora che ho unito le righe, quali voglio mantenere?»

SELECT c.name, o.amount
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;   -- filter after pairing

Con INNER JOIN spesso coincidono

Con un INNER JOIN, un filtro aggiuntivo produce lo stesso risultato sia che venga inserito in ON sia che venga inserito in WHERE. Entrambe le query qui sotto restituiscono solo l'ordine da 50 $ di Ada e quello da 99 $ di Bob.

Poiché le righe senza corrispondenza vengono già eliminate da un inner join, spostare il predicato non cambia quali righe rimangono.

-- predicate in ON
SELECT c.name, o.amount FROM customers c
JOIN orders o
  ON o.customer_id = c.id AND o.amount > 30;

-- predicate in WHERE -- same result here
SELECT c.name, o.amount FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;

Perché lo stile preferisce comunque ON per le chiavi di join

Anche quando i risultati coincidono, la convenzione stabilisce di inserire in ON le condizioni della relazione tra le tabelle e in WHERE i filtri di business.

  • ON: o.customer_id = c.id (come sono collegate le tabelle)
  • WHERE: o.amount > 30 (quali risultati si desidera ottenere)

Questa separazione rende evidente l'intento sia al lettore successivo sia all'intervistatore che valuta il suo stile.

Dove la differenza conta davvero: gli outer join

La distinzione diventa decisiva con un LEFT JOIN, che mantiene ogni riga a sinistra anche quando non corrisponde ad alcuna riga a destra. Ecco una rapida anteprima con clienti e ordini, dove Cleo non ha ordini.

Un LEFT JOIN mantiene Cleo con colonne dell'ordine impostate a NULL. Ora osservi l'effetto di ON e WHERE su di lei.

SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;
-- keeps Ada, Bob, AND Cleo (NULL amount)

Filtro in ON: le righe vengono preservate

Inserisca la condizione amount > 30 in ON di un LEFT JOIN: in questo modo influisce solo sulle righe a destra che vengono associate. Le righe a sinistra senza corrispondenza vengono comunque mantenute, con valori NULL.

Cleo rimane nel risultato. Un ordine che non supera il test semplicemente non viene associato e lascia un valore NULL.

SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o
  ON o.customer_id = c.id AND o.amount > 30;
-- Ada 50, Bob 99, Cleo NULL  (3 rows, Cleo kept)

Filtro in WHERE: l'outer join scompare

Sposti la stessa condizione in WHERE per filtrare il risultato del join. La riga di Cleo ha amount = NULL e NULL > 30 non è vero, quindi viene eliminata.

Il LEFT JOIN si comporta di fatto come un INNER JOIN. Questa è la trappola sui join più famosa nei colloqui.

SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;
-- Ada 50, Bob 99  (Cleo GONE -> back to inner-join behavior)

La regola da ricordare

Enunci la regola in modo chiaro durante un colloquio:

  • Una condizione in ON decide se la riga a destra viene associata; le righe a sinistra vengono preservate.
  • Una condizione in WHERE filtra le righe finali e può eliminare le righe a sinistra preservate quando riguarda una colonna che potrebbe contenere NULL.

Quindi, con gli outer join, i predicati sulla tabella opzionale vanno inseriti in ON, a meno che non si desideri intenzionalmente eliminare le righe senza corrispondenza.

L'uso legittimo di WHERE su NULL

C'è un caso in cui filtrare in WHERE una colonna di un outer join è esattamente la scelta corretta: l'anti-join. Il test IS NULL individua le righe a sinistra che non hanno trovato corrispondenza.

Qui WHERE mantiene intenzionalmente solo le righe senza corrispondenza, restituendo i clienti con zero ordini. La meccanica è la stessa, ma l'intento è opposto.

SELECT c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;   -- customers with no orders -> Cleo

Test mentale rapido

Prima del quiz, utilizzi questo elenco di controllo quando incontra una condizione di join:

  • È una chiave di join che mette in relazione le tabelle? -> ON.
  • È un filtro sulla tabella obbligatoria? -> WHERE o ON vanno entrambi bene.
  • È un filtro sulla tabella opzionale (esterna) e vuole mantenere le righe senza corrispondenza? -> ON.
  • Vuole trovare le righe senza corrispondenza? -> WHERE ... IS NULL.

Verifica rapida

Applichi la regola ON rispetto a WHERE a un outer join.

Riepilogo: ON rispetto a WHERE

I concetti chiave da portare al colloquio:

  • ON controlla l'abbinamento e, negli outer join, stabilisce se la riga opzionale viene associata, preservando il lato mantenuto.
  • WHERE filtra il risultato già unito e può eliminare le righe preservate.
  • Con un INNER JOIN le due clausole sono spesso intercambiabili; con gli outer join non lo sono.
  • I filtri sulla tabella esterna vanno inseriti in ON, a meno che non si desideri un anti-join con IS NULL in WHERE.

Domande Frequenti

La lezione «ON e WHERE nei join» è gratuita?

Sì — il testo completo di «ON e WHERE nei join» è 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 Interview Prep, passa a CoddyKit PRO. Il corso SQL Interview Prep include 4 lezioni in totale.

Cosa imparerò in «ON e WHERE nei join»?

Capire quando una condizione appartiene a ON anziché a WHERE e perché questo influisce sui risultati Eserciti SQL 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 SQL Interview Prep?

Non è richiesta alcuna esperienza precedente. SQL 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 «ON e WHERE nei join»?

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 Interview Prep?

Sì. Ogni lezione SQL 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. Come INNER JOIN abbina le righe
  2. ON e WHERE nei join
  3. Espansione dei join e moltiplicazione delle righe
  4. Unire tre o più tabelle
← Torna a SQL Interview Prep