Nella lezione scorsa abbiamo parlato dei vari tipi di JOIN in SQL. Oggi ci concentriamo meglio su INNER JOIN.
INNER JOIN è un tipo di join nei database relazionali che ti permette di prendere righe da due tabelle e restituire solo quelle che "matchano" secondo una condizione che decidi tu. In pratica, INNER JOIN restituisce solo le parti in comune tra le due tabelle, ignorando tutto il resto.
Immagina di avere due scatole. In una ci sono le schede degli studenti, nell'altra le schede dei corsi a cui sono iscritti gli studenti. Vuoi sapere quali studenti sono iscritti a quali corsi. Se non c'è corrispondenza (tipo, uno studente non è iscritto a nessun corso), questi dati per ora non ci interessano. Questo scenario è perfetto per INNER JOIN.
Sintassi di INNER JOIN
La sintassi è piuttosto diretta: indichi le due tabelle che vuoi unire e imposti la condizione di join usando la parola chiave ON.
SELECT colonne
FROM tabella1 INNER JOIN tabella2
ON tabella1.campo = tabella2.campo;
tabella1etabella2— sono le tabelle che vuoi unire.campo— sono le colonne su cui fai il match.- La condizione dopo
ONindica le regole di corrispondenza tra le righe delle due tabelle.
Esempi di utilizzo di INNER JOIN
Per i prossimi esempi lavoreremo con due tabelle:
Tabella students — dati sugli studenti
| student_id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Anna | 22 |
| 3 | Peter | 19 |
| 4 | Dia | 21 |
Tabella enrollments — dati sulle iscrizioni ai corsi
| enrollment_id | student_id | course_id |
|---|---|---|
| 101 | 1 | 501 |
| 102 | 2 | 502 |
| 103 | 2 | 503 |
| 104 | 3 | 504 |
Nota che la studentessa Dia (con student_id = 4) non è iscritta a nessun corso.
Esempio 1: Ottenere studenti e i loro corsi
Vogliamo sapere quali studenti sono iscritti ai corsi. Questo è un classico esempio di INNER JOIN. Ci interessa solo dove c'è corrispondenza tra le tabelle students e enrollments sulla base di student_id.
SELECT students.name, enrollments.course_id
FROM students INNER JOIN enrollments
ON students.student_id = enrollments.student_id;
Risultato:
| name | course_id |
|---|---|
| Otto | 501 |
| Anna | 502 |
| Anna | 503 |
| Peter | 504 |
Cosa vediamo? INNER JOIN ha restituito solo gli studenti iscritti ai corsi. Dia, che non è iscritta da nessuna parte, è rimasta fuori.
Esempio 2: Ottenere ordini e clienti
Ora vediamo un altro esempio. Supponiamo di avere le tabelle orders (ordini) e customers (clienti). Vogliamo ottenere la lista di tutti gli ordini con i nomi dei clienti.
Tabella orders
| order_id | customer_id | amount |
|---|---|---|
| 1 | 101 | 500 |
| 2 | 102 | 300 |
| 3 | 103 | 700 |
Tabella customers
| customer_id | name |
|---|---|
| 101 | Otto |
| 102 | Anna |
| 104 | Peter |
Obiettivo: dobbiamo unire orders e customers su customer_id, così da restituire solo gli ordini che hanno un cliente corrispondente.
SELECT orders.order_id, customers.name, orders.amount
FROM orders INNER JOIN customers
ON orders.customer_id = customers.customer_id;
Risultato:
| order_id | name | amount |
|---|---|---|
| 1 | Otto | 500 |
| 2 | Anna | 300 |
Nota che l'ordine con order_id = 3 non è nel risultato, perché il cliente con customer_id = 103 non esiste nella tabella customers.
Come INNER JOIN aiuta a collegare le tabelle (e cosa può andare storto)
INNER JOIN è uno strumento base che userai praticamente in ogni progetto che coinvolge un database relazionale. È come una chiave inglese nel tuo kit di attrezzi: puoi provare a farne a meno, ma sarà molto più difficile ottenere risultati. Per esempio:
- Quando crei report in cui devi combinare dati da più tabelle.
- Per fare analisi, quando devi collegare fatti e dimensioni (tipo vendite e clienti).
- Per integrare dati da sistemi esterni.
L'errore più comune tra i principianti è dimenticare ON o scrivere male la condizione di join. Se non imposti la condizione giusta, invece del risultato che ti aspetti otterrai il prodotto cartesiano delle due tabelle — e possono essere migliaia o milioni di righe senza senso.
Esempio di errore:
In questo esempio manca la condizione di join, quindi la query crea ogni possibile combinazione di righe tra le due tabelle (e probabilmente non è quello che vuoi):
SELECT students.name, enrollments.course_id
FROM students, enrollments; -- ERRORE: manca la condizione di join!
Il risultato sarà un caos: ogni riga di students si combina con ogni riga di enrollments.
GO TO FULL VERSION