Come INNER JOIN abbina le righe
Il modello mentale dell'abbinamento tra coppie di righe che rende semplice ogni domanda sui join
Come INNER JOIN abbina le righe è una lezione Coding Interview Prep gratuita su CoddyKit. Questa è la lezione 1 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 prima JOIN richiesta dagli intervistatori
Quando un intervistatore dice «unisci queste due tabelle», quasi sempre intende INNER JOIN. È la JOIN predefinita e quella che rivela se si comprende davvero come vengono abbinate le righe.
L'intero argomento si riduce a una frase: una INNER JOIN considera ogni possibile coppia di righe delle due tabelle e mantiene solo le coppie che soddisfano la condizione ON. Se non c'è corrispondenza, la riga scompare semplicemente dal risultato.
Fissi questo modello mentale e ogni domanda più difficile sulle JOIN diventerà più semplice.
Due tabelle su cui ragionare
Nel corso di questa lezione useremo due tabelle piccole. customers contiene i clienti che hanno effettuato ordini, mentre orders registra ogni ordine e il cliente a cui appartiene.
customers(id, name)orders(id, customer_id, amount)
Il collegamento tra le due tabelle è orders.customer_id = customers.id. Questa uguaglianza è il predicato di join da cui dipende l'intero risultato.
customers
id | name
1 | Ada
2 | Bob
3 | Cleo -- no orders yet
orders
id | customer_id | amount
10 | 1 | 50
11 | 1 | 20
12 | 2 | 99La query INNER JOIN di base
Ecco la query canonica che un intervistatore vuole vedere. Osservi tre elementi: le due tabelle, il JOIN ... ON che abbina le righe e le colonne da restituire.
La parola chiave INNER è facoltativa in tutti i principali database. Scrivere semplicemente JOIN equivale a INNER JOIN, ma esplicitarlo segnala l'intento ed evita ambiguità durante una revisione del codice.
SELECT c.name, o.amount
FROM customers AS c
INNER JOIN orders AS o
ON o.customer_id = c.id;Come si presenta il risultato
Eseguendo la query sui dati di esempio si ottengono tre righe. Ada ha due ordini, quindi compare due volte. Bob compare una volta.
Cleo è scomparsa. Non ha alcun ordine corrispondente, quindi la INNER JOIN la elimina completamente. Esplicitare la scomparsa delle righe senza corrispondenza è la cosa più importante da fare durante un colloquio sulle JOIN.
name | amount
Ada | 50
Ada | 20
Bob | 99Il modello mentale dell'abbinamento delle righe
Immagini che il database formi prima il prodotto cartesiano: ogni cliente abbinato a ogni ordine. Con 3 clienti e 3 ordini si ottengono 9 coppie candidate.
Successivamente applica il predicato ON e mantiene solo le coppie per cui è vero. Delle 9 candidate, solo 3 soddisfano o.customer_id = c.id.
Non si ragiona in questo modo per analizzare le prestazioni, ma è il modello esatto per rispondere a ogni domanda del tipo «quante righe vengono restituite?».
Analisi delle coppie candidate
Vediamolo passo per passo. Il commento dopo ogni coppia indica se il predicato è vero.
Solo le tre righe TRUE sopravvivono nel risultato. Ogni coppia che coinvolge Cleo (id 3) non soddisfa la condizione, quindi non contribuisce in alcun modo.
-- customer.id vs order.customer_id
(Ada=1, ord10 cust=1) -> TRUE keep
(Ada=1, ord11 cust=1) -> TRUE keep
(Ada=1, ord12 cust=2) -> FALSE
(Bob=2, ord10 cust=1) -> FALSE
(Bob=2, ord12 cust=2) -> TRUE keep
(Cleo=3, anything) -> FALSE (no order matches 3)INNER JOIN è indipendente dall'ordine
Una domanda frequente è: conta quale tabella si inserisce per prima? Per una INNER JOIN, no. Queste due query restituiscono righe identiche perché la condizione ON è simmetrica.
L'ottimizzatore è libero di leggere per prima l'una o l'altra tabella, indipendentemente da come viene scritta la query. Questo NON vale per le JOIN LEFT/RIGHT, che vedremo più avanti.
-- These return the same rows
SELECT c.name, o.amount
FROM customers c JOIN orders o ON o.customer_id = c.id;
SELECT c.name, o.amount
FROM orders o JOIN customers c ON c.id = o.customer_id;Gli alias delle tabelle sono lo standard atteso
Gli intervistatori si aspettano alias brevi e chiari. Confronti la versione prolissa con nomi completamente qualificati con quella più pulita che usa gli alias.
Gli alias diventano anche obbligatori quando un nome di colonna è presente in entrambe le tabelle. Se qui selezionasse id senza qualificazione, otterrebbe un errore di colonna ambigua; deve quindi scrivere c.id oppure o.id.
-- verbose
SELECT customers.name, orders.amount
FROM customers JOIN orders
ON orders.customer_id = customers.id;
-- aliased, preferred
SELECT c.name, o.amount
FROM customers c JOIN orders o
ON o.customer_id = c.id;Unire più di una colonna
Il predicato ON non si limita a una singola uguaglianza. Quando una relazione è definita da una chiave composta, si combinano le condizioni con AND.
Qui un prezzo si applica a ogni prodotto in ogni area geografica, quindi entrambe le colonne devono corrispondere. Gli intervistatori usano questo esempio per verificare che non abbia imparato a memoria solo i join su una colonna.
SELECT s.units, p.unit_price
FROM sales s
INNER JOIN price_list p
ON p.product_id = s.product_id
AND p.region = s.region;Esistono anche i non-equi join
La condizione ON può essere qualsiasi espressione booleana, non solo =. Un non-equi join usa intervalli o disuguaglianze. Un esempio classico assegna un punteggio alla fascia di voto corrispondente.
Ogni punteggio corrisponde all'unica fascia il cui intervallo lo contiene. Menzionare che i join non sono limitati alle uguaglianze è un modo rapido per dimostrare esperienza.
SELECT s.student, g.grade
FROM scores s
INNER JOIN grades g
ON s.points >= g.min_points
AND s.points <= g.max_points;JOIN esplicito vs join con virgola
Nella programmazione su codice legacy e in alcune domande di colloquio incontrerà ancora la vecchia sintassi dei join con virgola. Queste due query sono equivalenti per un INNER JOIN.
Preferisca la forma esplicita JOIN ... ON. La sintassi con virgola può facilmente trasformarsi, a causa di un errore di battitura, in un prodotto cartesiano accidentale (se si dimentica WHERE), proprio il bug che gli intervistatori sperano di individuare.
-- old implicit join
SELECT c.name, o.amount
FROM customers c, orders o
WHERE o.customer_id = c.id;
-- modern explicit join (preferred)
SELECT c.name, o.amount
FROM customers c
JOIN orders o ON o.customer_id = c.id;Verifica rapida
Verifichi il concetto fondamentale dell'associazione con INNER JOIN.
Riepilogo: come abbina INNER JOIN
I concetti da ripetere durante un colloquio:
- INNER JOIN mantiene solo le coppie corrispondenti; le righe senza corrispondenza su entrambi i lati vengono eliminate.
- Modello mentale: formi tutte le coppie candidate, poi mantenga quelle per cui il predicato ON è vero.
- È indipendente dall'ordine e la parola chiave
INNERè facoltativa. - ON può usare chiavi composte, intervalli e disuguaglianze, non solo un singolo
=. - Usi
JOIN ... ONespliciti con alias chiari per evitare errori di colonna ambigua e prodotti cartesiani accidentali.
Domande Frequenti
La lezione «Come INNER JOIN abbina le righe» è gratuita?
Sì — il testo completo di «Come INNER JOIN abbina le righe» è 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 «Come INNER JOIN abbina le righe»?
Il modello mentale dell'abbinamento tra coppie di righe che rende semplice ogni domanda sui join 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 1 di 4.
Quanto tempo richiede la lezione «Come INNER JOIN abbina le righe»?
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