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
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.
-- 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):
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
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.
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
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.
Mostra suggerimento
Stessa JOIN dell'esercizio precedente, ma filtra su d.city = 'Milano' invece che sul nome del dipartimento.
Soluzione disponibile dopo 3 tentativi