Vai al contenuto
eLearner.app
Modulo 3 · Lezione 1 di 49/57 nel corso~12 min
Lezioni del modulo (1/4)

Unire due tabelle: INNER JOIN

Fino a qui abbiamo letto una tabella alla volta. Nel mondo reale però i dati sono distribuiti su più tabelle collegate: nel nostro dataset, ad esempio, ogni dipendente ha un department_id che punta alla tabella departments. Per vedere il nome del dipartimento (e non solo il suo id) dobbiamo unire le due tabelle. L'operatore che lo fa si chiama JOIN.

La sintassi base

SQL
SELECT colonne
FROM   tabella_a
JOIN   tabella_b ON tabella_a.x = tabella_b.y;

Letta in italiano: "prendi tabella_a, accostagli tabella_b accoppiando ogni riga in cui tabella_a.x è uguale a tabella_b.y". Il risultato è una nuova tabella virtuale con le colonne di entrambe.

SQL
-- Per ogni dipendente, mostra anche il nome del suo dipartimento:
SELECT employees.first_name,
       employees.last_name,
       departments.name AS dipartimento
FROM   employees
JOIN   departments ON employees.department_id = departments.id;

La parte dopo ON si chiama condizione di join: è ciò che dice al motore "queste due righe parlano della stessa cosa, accostale". Nella stragrande maggioranza dei casi è un'uguaglianza tra una chiave primaria e una chiave esterna (qui departments.id e employees.department_id).

INNER JOIN, in dettaglio

La parola intera è INNER JOIN, ma JOIN da solo è il sinonimo standard. "Inner" significa che vengono restituite solo le righe che hanno una corrispondenza in entrambe le tabelle:

  • se un dipendente ha department_id = NULL, non comparirà nel risultato;
  • se un dipartimento non ha nessun dipendente, non comparirà nel risultato.

Qualificare i nomi delle colonne

Quando due tabelle hanno colonne con lo stesso nome (qui entrambe hanno id, ed entrambe hanno name se ci pensi), devi specificare da quale tabella arriva la colonna scrivendola tabella.colonna. Per non ripetere nomi lunghi si usano spesso gli alias (li hai visti nel Modulo 2):

SQL
SELECT e.first_name, e.last_name, d.name AS dipartimento
FROM   employees   AS e
JOIN   departments AS d ON e.department_id = d.id;

AS è opzionale anche qui: FROM employees e funziona uguale.

Prova tu

Esercizio#sql.m3.l1.e1
Tentativi: 0Caricamento…

Per ogni dipendente del dipartimento Ingegneria, mostra nome (first_name), cognome (last_name) e la città del dipartimento (departments.city). Tre colonne, una riga per dipendente.

Caricamento editor…
Mostra suggerimento

Completa la condizione ON con l'uguaglianza tra e.department_id e d.id, poi seleziona d.city come terza colonna.

Soluzione disponibile dopo 3 tentativi

Esercizio di ripasso

Esercizio#sql.m3.l1.e2
Tentativi: 0Caricamento…

Elenca nome (first_name) e cognome (last_name) di tutti i dipendenti che lavorano in un dipartimento con sede a Milano. Filtra su departments.city, non sul nome del dipartimento.

Caricamento editor…
Mostra suggerimento

Stessa JOIN dell'esercizio precedente, ma filtra su d.city = 'Milano' invece che sul nome del dipartimento.

Soluzione disponibile dopo 3 tentativi