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 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.
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 ruleCosa 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 pairingCon 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 -> CleoTest 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 NULLin 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 Coding Interview Prep, passa a CoddyKit PRO. Il corso Coding 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 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 «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 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
- Come INNER JOIN abbina le righe
- ON e WHERE nei join
- Espansione dei join e moltiplicazione delle righe
- Unire tre o più tabelle