Immagina di avere due tabelle: una lista di studenti e una lista delle loro iscrizioni ai corsi. Non tutti gli studenti sono iscritti ai corsi e vuoi vedere la lista completa di tutti gli studenti, anche quelli che per qualche motivo non hanno ancora scelto un corso. Con INNER JOIN vedresti solo quelli iscritti ai corsi, ma che fine fanno gli altri studenti? Ecco perché esiste LEFT JOIN.
LEFT JOIN restituisce tutte le righe dalla tabella di sinistra (quella che metti per prima nella query) e le righe corrispondenti dalla tabella di destra. Se non ci sono corrispondenze, per le colonne della tabella di destra verrà restituito NULL.
Sintassi di LEFT JOIN
SELECT
tabella1.colonna1,
tabella1.colonna2,
tabella2.colonna1,
tabella2.colonna2
FROM
tabella1 LEFT JOIN tabella2
ON
tabella1.colonna_comune = tabella2.colonna_comune;
tabella1— è la tabella "di sinistra".tabella2— è la tabella "di destra".colonna_comune— la colonna su cui si fa il join.
Esempio semplice
Se la tabella students è così:
| student_id | name |
|---|---|
| 1 | Otto |
| 2 | Anna |
| 3 | Peter |
E la tabella enrollments è così:
| enrollment_id | student_id | course |
|---|---|---|
| 1 | 1 | Matematica |
| 2 | 1 | Fisica |
| 3 | 2 | Biologia |
Allora la query:
SELECT
students.name,
enrollments.course
FROM
students LEFT JOIN enrollments
ON
students.student_id = enrollments.student_id;
restituirà:
| name | course |
|---|---|
| Otto | Matematica |
| Otto | Fisica |
| Anna | Biologia |
| Peter | NULL |
Come vedi, nel risultato ci sono tutti gli studenti, anche Peter, che non si è ancora iscritto a nessun corso. Per Peter nella colonna course c'è NULL.
Esempi di utilizzo di LEFT JOIN
Esempio 1: Ottenere la lista di tutti gli studenti e i loro corsi
Supponiamo che tu debba ottenere la lista completa degli studenti insieme ai corsi a cui sono iscritti, se ce ne sono. Se uno studente non ha ancora scelto un corso, anche questo deve essere mostrato.
La stessa query:
SELECT
students.name,
enrollments.course
FROM
students LEFT JOIN enrollments
ON
students.student_id = enrollments.student_id;
Risultato:
| name | course |
|---|---|
| Otto | Matematica |
| Otto | Fisica |
| Anna | Biologia |
| Peter | NULL |
Questo è un esempio classico di utilizzo di LEFT JOIN.
Esempio 2: Mostrare prodotti e le loro vendite
Supponiamo di avere due tabelle:
Tabella products, che contiene tutti i prodotti:
| product_id | product_name |
|---|---|
| 1 | Smartphone |
| 2 | Tablet |
| 3 | Notebook |
Tabella sales, che contiene i dati sulle vendite:
| sale_id | product_id | quantity |
|---|---|---|
| 1 | 1 | 5 |
| 2 | 1 | 3 |
| 3 | 2 | 2 |
Ora vuoi vedere tutti i prodotti e la quantità delle loro vendite, inclusi quelli che non sono ancora stati venduti.
SELECT
products.product_name,
SUM(sales.quantity) AS total_sold
FROM
products LEFT JOIN sales
ON
products.product_id = sales.product_id
GROUP BY
products.product_name;
Risultato:
| product_name | total_sold |
|---|---|
| Smartphone | 8 |
| Tablet | 2 |
| Notebook | NULL |
Caratteristiche e problemi nell'uso di LEFT JOIN
Serve sempre il NULL?
A volte LEFT JOIN mette NULL dove non te lo aspetti. In questi casi puoi sostituire NULL con un valore più chiaro usando la funzione COALESCE().
SELECT
students.name,
COALESCE(enrollments.course, 'Corso non scelto') AS course
FROM
students LEFT JOIN enrollments
ON
students.student_id = enrollments.student_id;
Risultato:
| name | course |
|---|---|
| Otto | Matematica |
| Otto | Fisica |
| Anna | Biologia |
| Peter | Corso non scelto |
Doppi indesiderati
Se i dati nella tabella di destra hanno dei duplicati, il risultato della query avrà più righe di quanto ti aspetti. Guarda bene i dati con cui lavori e usa DISTINCT se non vuoi i duplicati.
GO TO FULL VERSION