Capire SQL spesso significa porsi le domande giuste. Quando lavori con dati distribuiti su più tabelle, il full outer join diventa davvero utile. Anche se è piuttosto comune in alcuni sistemi di gestione di database, il concetto di FULL OUTER JOIN è un po' più complicato in MySQL. Perché? Perché non è supportato nativamente. Interessante, vero? Ma aspetta, c'è una soluzione alternativa!
In questo tutorial esploriamo nel dettaglio come implementare un full outer join in MySQL. Allacciate le cinture: stiamo per tuffarci in un mare di esempi di codice.
🔖 Riferimento rapido: Ti serve un riepilogo veloce di tutti i tipi di JOIN? Dai un'occhiata al nostro SQL JOIN Cheat Sheet con diagrammi visivi ed esempi di codice.
Cos'è un Full Outer Join?
Prima di iniziare, definiamo cos'è un FULL OUTER JOIN. In SQL, un full outer join combina l'effetto di un left outer join e di un right outer join. In altre parole, recupera i record con valori corrispondenti in entrambe le tabelle, oltre a tutti i record di entrambe le tabelle i cui valori non compaiono nell'altra.
Ecco un esempio. Supponiamo di avere due tabelle, Employees e Departments.
Tabella Employees:
| id | name |
|---|---|
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
Tabella Departments:
| id | department |
|---|---|
| 2 | HR |
| 3 | IT |
| 4 | Marketing |
Usando la query FULL OUTER JOIN:
SELECT * FROM Employees
FULL OUTER JOIN Departments ON Employees.id = Departments.id;
Il risultato sarà:
| Employees.id | Employees.name | Departments.id | Departments.department |
|---|---|---|---|
| 1 | Alice | NULL | NULL |
| 2 | Bob | 2 | HR |
| 3 | Charlie | 3 | IT |
| NULL | NULL | 4 | Marketing |
Questo output combina tutti i record di Employees e Departments. Include:
- I record con valori
idcorrispondenti in entrambe le tabelle (Bob e Charlie). - I record di
Employeessenza un record corrispondente inDepartments(Alice). - I record di
Departmentssenza un record corrispondente inEmployees(Marketing).
Per quanto utile, questa sintassi non è supportata direttamente in MySQL. Quindi, come ne usciamo? Scopriamolo.
Simulare un Full Outer Join in MySQL
Come detto sopra, MySQL non supporta esplicitamente la parola chiave FULL OUTER JOIN. Tuttavia, possiamo comunque ottenere il risultato desiderato combinando LEFT JOIN e UNION
L'idea per simulare un full outer join in MySQL prevede due passaggi:
- Esegui un
LEFT JOINsulla prima tabella per ottenere tutti i suoi record, insieme ai record corrispondenti della seconda tabella. - Usa
UNIONper combinare i risultati con quelli di unRIGHT JOIN, così da ottenere tutti i record della seconda tabella insieme ai record corrispondenti della prima.
Ecco come funziona ogni componente:
Left Join:
Right Join:
Esempio di Full Outer Join in MySQL
Ecco un esempio della soluzione alternativa usando gli stessi dati di prima
SELECT
Employees.id AS Employees_id,
Employees.name,
Departments.id AS Departments_id,
Departments.department
FROM
Employees
LEFT JOIN
Departments ON Employees.id = Departments.id
UNION
SELECT
Employees.id AS Employees_id,
Employees.name,
Departments.id AS Departments_id,
Departments.department
FROM
Departments
RIGHT JOIN
Employees ON Departments.id = Employees.id;
Questa query è composta da due parti:
- Un
LEFT JOINper ottenere tutti i record della tabellaEmployeese i record corrispondenti della tabellaDepartments. - Un
RIGHT JOINper ottenere tutti i record della tabellaDepartmentse i record corrispondenti della tabellaEmployees.
UNION combina i risultati di queste due query eliminando le righe duplicate.
Con le stesse tabelle di esempio, il risultato sarà:
| Employees_id | name | Departments_id | department |
|---|---|---|---|
| 1 | Alice | NULL | NULL |
| 2 | Bob | 2 | HR |
| 3 | Charlie | 3 | IT |
| NULL | NULL | 4 | Marketing |
Questo output, come il FULL OUTER JOIN in SQL, combina tutti i record di Employees e Departments.
UNION filtra automaticamente i duplicati
Nel caso specifico del nostro esempio con le tabelle Employees e Departments, la UNION usata nella soluzione alternativa di MySQL per un FULL OUTER JOIN non produrrà duplicati. Questo perché l'operatore UNION elimina automaticamente le righe duplicate dal risultato.
Per chiarire, vediamo come funziona UNION in questo contesto:
-
La prima parte della query (il
LEFT JOIN) recupera tutti i record della tabella Employees e i record corrispondenti della tabella Departments. Questo include le righe con valori id corrispondenti in entrambe le tabelle e le righe di Employees senza corrispondenza in Departments. -
La seconda parte della query (il
RIGHT JOIN) recupera tutti i record della tabella Departments e i record corrispondenti della tabella Employees. Questo include le righe con valori id corrispondenti in entrambe le tabelle e le righe di Departments senza corrispondenza in Employees.
Poiché UNION rimuove i duplicati, le righe con valori id corrispondenti (quelle che comparirebbero sia nei risultati del LEFT JOIN sia in quelli del RIGHT JOIN) appariranno una sola volta nel risultato finale.
In sintesi, usare UNION in questo contesto garantisce che ogni combinazione unica di dati di Employees e Departments compaia una sola volta nel risultato, imitando così il comportamento di un FULL OUTER JOIN senza duplicati.
Fai pratica in Beekeeper Studio
Spero che questo tutorial sul full outer join in MySQL ti sia stato utile. Nei prossimi articoli continueremo a esplorare altre funzionalità avanzate di MySQL, condividendo altri esempi di codice e approfondendo perché e come funzionano. Nel frattempo, continua ad allenare le tue competenze SQL, magari usando Beekeeper Studio.
Beekeeper Studio è una GUI per database gratuita & open source
Il miglior strumento per query & editor SQL che abbia mai usato. Offre tutto ciò che mi serve per gestire il mio database. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio è veloce, intuitivo e facile da usare. Beekeeper supporta tantissimi database e funziona alla grande su Windows, Mac e Linux.
Cosa dicono gli utenti di Beekeeper Studio
"Beekeeper Studio ha sostituito completamente il mio vecchio workflow SQL. È veloce, intuitivo e rende di nuovo piacevole lavorare con i database."
"Ho provato molte GUI per database, ma Beekeeper trova il perfetto equilibrio tra funzionalità e semplicità. Funziona e basta."