Corso
In questo tutorial ti spiego la differenza tra INNER JOIN e OUTER JOIN in SQL con alcuni esempi. Dopo aver chiarito questo punto, potresti voler seguire il nostro corso Joining Data in SQL, che tratta altri tipi di join interessanti, come SELF JOIN e CROSS JOIN, oltre a concetti più ampi come la teoria degli insiemi.
Risposta rapida
INNER JOIN restituisce solo le righe corrispondenti tra tabelle in base a una colonna comune, escludendo quelle non corrispondenti. Ad esempio, la query seguente mostra gli ordini con i dettagli del cliente solo quando c'è una corrispondenza.
-- Inner Join: Returns only matching rows from both tables
SELECT o.OrderID, c.CustomerName
FROM Orders o
INNER JOIN Customers c ON o.CustomerID = c.CustomerID;
OUTER JOIN include sia le righe corrispondenti sia quelle non corrispondenti di una o entrambe le tabelle. La query seguente restituisce tutti i clienti, inclusi quelli senza ordini.
-- Left Outer Join: Returns all rows from Customers and matching rows from Orders
SELECT c.CustomerName, o.OrderID
FROM Customers c
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID;
Uno sguardo da vicino a SQL INNER JOIN e OUTER JOIN
Vediamo ora più nel dettaglio INNER JOIN e OUTER JOIN in SQL, uno alla volta. Mentre li analizziamo, considera le due tabelle seguenti:

Esempio di tabella employees. Immagine dell'autore.

Esempio di tabella departments. Immagine dell'autore.
Come funziona INNER JOIN
Un INNER JOIN recupera solo le righe con una corrispondenza in entrambe le tabelle in base alla condizione specificata.
La query seguente seleziona employee_id, demployee_name, department_name e salary e poi restituisce le righe in cui esiste department_id.
-- Example: Get employees with matching departments
SELECT employees.employee_id, employees.employee_name, departments.department_name, employees.salary
FROM employees
INNER JOIN departments
-- Returns only employees assigned to a department
ON employees.department_id = departments.department_id;

Esempio di tabella unita con SQL INNER JOIN. Immagine dell'autore.
Come funziona OUTER JOIN
L'OUTER JOIN include le righe non corrispondenti da una o entrambe le tabelle, a seconda del tipo di OUTER JOIN utilizzato.
LEFT OUTER JOIN (LEFT JOIN)
Il LEFT OUTER JOIN restituisce tutti i record della tabella di sinistra e i record corrispondenti della tabella di destra. Se non c'è corrispondenza, per le colonne della tabella di destra vengono restituiti valori NULL.
Nel seguente esempio vengono recuperati tutti i record della tabella employees, anche dove ci sono record non corrispondenti. I department_name mancanti per i dipendenti vengono restituiti come NULL.
-- Get all employees, even those without a department
SELECT employees.employee_id, employees.employee_name, departments.department_name, employees.salary
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.department_id;

Esempio di tabella unita con SQL left outer join. Immagine dell'autore.
LEFT JOIN e LEFT OUTER JOIN vengono usati in modo intercambiabile in SQL poiché entrambe le query recuperano tutte le righe dalla tabella di sinistra e le righe corrispondenti dalla tabella di destra.
RIGHT OUTER JOIN (RIGHT JOIN)
Il RIGHT OUTER JOIN restituisce tutti i record della tabella di destra e i record corrispondenti della tabella di sinistra. Le righe non corrispondenti nella tabella di sinistra restituiscono NULL.
La query seguente restituisce tutti i record della tabella departments, anche dove non ci sono dipendenti corrispondenti.
-- Get all departments, even those without employees
SELECT employees.employee_id, employees.employee_name, departments.department_name, employees.salary
FROM employees
RIGHT JOIN departments
ON employees.department_id = departments.department_id;

Esempio di tabella unita con SQL Right outer join. Immagine dell'autore.
FULL OUTER JOIN
Il FULL OUTER JOIN combina i risultati dei left e right outer join. Restituisce tutti i record di entrambe le tabelle, riempiendo con NULL dove non esistono corrispondenze.
La query seguente restituisce tutti i record delle tabelle employees e departments, anche con righe non corrispondenti.
-- Combine all employees and departments
SELECT employees.employee_id, employees.employee_name, departments.department_name, employees.salary
FROM employees
FULL JOIN departments
ON employees.department_id = departments.department_id;

Esempio di tabella unita con SQL Full outer join. Immagine dell'autore.
INNER JOIN vs. OUTER JOIN: differenze principali
INNER JOIN e OUTER JOIN differiscono in modo fondamentale nel modo in cui gestiscono le righe non corrispondenti durante l'unione delle tabelle. Capire queste differenze è importante per scegliere il tipo di join giusto nelle query al database. Confrontiamo queste differenze.
Cosa restituisce INNER JOIN
INNER JOIN restituisce solo le righe con valori corrispondenti in entrambe le tabelle. Questo tipo di join si usa quando hai bisogno di dati presenti in entrambi i dataset.
La query seguente recupera record da employees con righe corrispondenti dalla tabella departments.
-- Example: Get employees with matching departments
SELECT employees.employee_id, employees.employee_name, departments.department_name
FROM employees
INNER JOIN departments
-- Returns only employees assigned to a department
ON employees.department_id = departments.department_id;

Esempio di tabella unita con SQL INNER JOIN. Immagine dell'autore.
Cosa restituisce OUTER JOIN
OUTER JOIN include le righe non corrispondenti da una o entrambe le tabelle, a seconda del tipo di OUTER JOIN. Ad esempio, il LEFT OUTER JOIN restituisce tutte le righe della tabella di sinistra e le righe corrispondenti della tabella di destra. Le righe non corrispondenti della tabella di destra avranno valori NULL.
La query seguente recupera i record dei dipendenti, inclusi quelli senza reparto.
-- Get all employees, even those without a department
SELECT employees.employee_id, employees.employee_name, departments.department_name
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.department_id;

Esempio di dati recuperati con SQL LEFT OUTER JOIN. Immagine dell'autore.
Quando usare SQL INNER JOIN e OUTER JOIN
INNER JOIN e OUTER JOIN differiscono anche nei casi d'uso pratici per il recupero dei dati.
Quando usare INNER JOIN
INNER JOIN è più efficace quando ti servono solo i dati di intersezione tra due tabelle. Ad esempio, puoi usare INNER JOIN quando analizzi i dati di vendita per trovare i prodotti che sono stati venduti, ovvero quando sia la tabella dei prodotti sia quella delle vendite hanno voci corrispondenti.
Quando usare OUTER JOIN
OUTER JOIN è indicato quando devi restituire un dataset completo, includendo le righe non corrispondenti. Ad esempio, quando generi un report per mostrare tutti i dipendenti, inclusi quelli senza assegnazione a un reparto, o tutti i reparti, inclusi quelli senza dipendenti.
Conclusione
Comprendere la differenza tra INNER JOIN e OUTER JOIN è importante per scrivere query efficienti. Imparare queste tecniche aiuta anche a migliorare l'ottimizzazione delle query per un recupero dei dati più rapido. Ti incoraggio a continuare a fare pratica per sviluppare altre competenze di gestione dei database.
Ti consiglio di provare il nostro percorso professionale Associate Data Analyst in SQL per diventare un buon data analyst. Il nostro corso Reporting in SQL ti aiuterà anche a diventare abile nella creazione di report e dashboard complessi per un'efficace presentazione dei dati. Se ti stai preparando per un colloquio in cui dovrai mostrare le tue competenze SQL, ti consiglio di consultare il nostro blog, 20 Top SQL Joins Interview Questions, per aiutarti a prepararti.
SQL INNER JOIN e OUTER JOIN: domande frequenti
Qual è la differenza tra INNER JOIN e OUTER JOIN in SQL?
INNER JOIN restituisce solo le righe corrispondenti di entrambe le tabelle, mentre OUTER JOIN include anche le righe non corrispondenti, con NULL a colmare le lacune quando non si trovano dati corrispondenti.
Quando dovrei usare un INNER JOIN in SQL?
Usa un INNER JOIN quando devi recuperare solo le righe con valori corrispondenti in entrambe le tabelle.
Quali sono i tipi di OUTER JOIN in SQL?
I tipi di OUTER JOIN sono LEFT OUTER JOIN, RIGHT OUTER JOIN e FULL OUTER JOIN.
Come funziona un LEFT OUTER JOIN in SQL?
Un left outer join restituisce tutte le righe della tabella di sinistra, le righe corrispondenti della tabella di destra e le righe non corrispondenti della sinistra.
Che cos'è un FULL OUTER JOIN in SQL?
Un FULL OUTER JOIN restituisce tutte le righe di entrambe le tabelle, incluse quelle non corrispondenti di ciascuna.


