CodeGym /Corsi /SQL SELF /Basi di INNER JOIN

Basi di INNER JOIN

SQL SELF
Livello 11 , Lezione 1
Disponibile

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;
  • tabella1 e tabella2 — sono le tabelle che vuoi unire.
  • campo — sono le colonne su cui fai il match.
  • La condizione dopo ON indica 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.

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION