Torna all'elenco degli articoli Articoli
Tempo di lettura: 28 minuti

Le 10 principali domande di colloquio su JOIN in SQL e le relative risposte

Ti siete mai chiesto quali domande sulle istruzioni JOIN in SQL ti potrebbero essere poste nel corso di un colloquio? Ti senti preparato a rispondere? Questo articolo illustra le domande più comuni poste durante i colloqui sull'operatore JOIN di SQL e spiega come rispondere.

Se ti stai candidando per un lavoro come data analyst o sviluppatore di software, è probabile che ti vengano poste domande sulle tue conoscenze in merito alle clausole JOIN in SQL. Questi operatori sono un ottimo argomento che molti esaminatori andranno a valutare. Esistono molte varianti della clausola JOIN e ognuna svolge una funzione diversa.

Esistono molte ottime risorse per imparare a conoscere le clausole JOIN in SQL, come per esempio il corso interattivo di LearnSQL.it sulle istruzioni JOIN in SQL. Questo articolo, invece, affronta l'argomento in vista di un colloquio di lavoro e tratta alcune delle domande più comuni sull'operatore JOIN in SQL che puoi aspettarti di affrontare.

  1. Che cos'è la clausola JOIN in SQL e quando è necessaria?
  2. Come scriveresti una query per unire queste due tabelle?
  3. Quali tipi di JOIN esistono?
  4. Che cos'è OUTER JOIN?
  5. Qual è la differenza tra INNER JOIN e LEFT JOIN in SQL?
  6. Qual è la differenza tra LEFT JOIN e FULL JOIN?
  7. Scrivi una query che unisca queste due tabelle, in modo che tutte le righe della tabella 1 siano presenti nel risultato.
  8. Come si fa a unire più di due tabelle?
  9. Come si fa a unire una tabella a se stessa?
  10. La condizione di JOIN deve essere sempre un confronto di uguaglianza?

1. Che cos'è la clausola JOIN in SQL e quando è necessaria?

L'operatore JOIN viene utilizzato per unire i dati di due tabelle in SQL. La clausola JOIN viene spesso utilizzata quando le tabelle hanno almeno una colonna di dati in comune.

In genere, la condizione di JOIN è l'uguaglianza tra le colonne delle diverse tabelle, ma sono possibili anche altre condizioni per questa clausola. È possibile unire più di due tabelle utilizzando operatori JOIN consecutivi.

Esistono diversi tipi di JOIN: INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN e altri. La funzione della clausola JOIN è illustrata da questa immagine:

INNER JOIN

2. Come scriveresti una query per unire queste due tabelle?

Durante il colloquio, potresti essere chiamato ad applicare le tue conoscenze a uno scenario pratico scrivendo un'istruzione JOIN. Vediamo un esempio, in modo che tu possa risolvere questo problema con facilità.

Abbiamo due tabelle:

  • employees - Questa tabella contiene l'ID, il nome e l'ID del reparto di ciascun dipendente.

idemployee_namedepartment_id
1Homer Simpson4
2Ned Flanders1
3Barney Gumble5
4Clancy Wiggum3
5Moe SyzslakNULL
  • departments - Questa tabella contiene l'ID e il nome di ciascun reparto.

department_iddepartment_name
1Sales
2Engineering
3Human Resources
4Customer Service
5Research And Development

Se ti è stato chiesto di creare una tabella con JOIN, cerca di trovare una colonna che esista in entrambe le tabelle. In questo esempio, si tratta della colonna department_id.

SELECT * 
FROM employees 
JOIN departments 
ON employees.department_id = departments.department_id;

L'esecuzione di questo codice produrrà il seguente risultato:

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research And Development
4Clancy Wiggum33Human Resources

La condizione ON indica come le due tabelle (quella dopo FROM e quella dopo JOIN) devono essere combinate. Nell'esempio precedente puoi notare che entrambe le tabelle contengono la colonna department_id. La nostra query SQL restituirà le righe in cui employees.department_id è uguale a departments.department_id.

A volte i campi relazionali sono un po' meno ovvi. Per esempio, potresti avere una tabella chiamata employees con un campo chiamato id, che potrebbe essere unito a employee_id in qualsiasi altra tabella.

È possibile anche specificare le colonne esatte da restituire da ciascuna delle tabelle incluse nella clausola JOIN. Quando includi il nome di una colonna che esiste in entrambe le tabelle, è necessario specificare la tabella esatta da cui desideri recuperarla.

Non è possibile scrivere department_id perché ciò causerebbe un errore di ambiguità in SQL. È necessario scrivere employees.department_id o departments.department_id. Per esempio, potremmo scrivere:

SELECT 
employees.department_id, employee_name, department_name
FROM employees 
JOIN departments 
ON employees.department_id = departments.department_id;

Nota la nostra istruzione SELECT. Abbiamo specificato il nome esatto della tabella per la colonna department_id perché esiste in entrambe le tabelle che compongono la nostra clausola JOIN. Al contrario, non è necessario farlo per le colonne employee_name o department_name perché hanno un riferimento univoco. L'esecuzione di questa query SQL produce il seguente set di risultati:

department_idemployee_namedepartment_name
1Ned FlandersSales
3Clancy WiggumHuman Resources
4Homer SimpsonCustomer Service
5Barney GumbleResearch And Development

Quando scriviamo le clausole JOIN in SQL, possiamo anche utilizzare gli alias SQL. I nomi delle colonne possono essere piuttosto tecnici e poco comprensibili. Questo può rendere difficile la comprensione dell'output della query. Ecco alcune regole da seguire quando si implementa un alias in SQL:

  • Per dare a una colonna un nome descrittivo, puoi usare un alias per quella colonna.
  • Per assegnare un alias a una colonna, devi utilizzare la parola chiave AS seguita dall'alias.
  • Se il nome alternativo contiene spazi, è necessario metterlo tra virgolette singole.

Un alias SQL può essere applicato sia ai nomi delle tabelle, sia a quelli delle colonne. Se riscriviamo la nostra query precedente in modo da includere un alias per ogni nome di colonna, il risultato potrebbe essere simile a questo:

SELECT 
employees.department_id AS ID, 
employee_name AS ‘Employee Name’, 
department_name AS Department
FROM employees 
JOIN departments 
ON employees.department_id = departments.department_id;

Nota che abbiamo dovuto usare le virgolette singole per la colonna ‘Employee Name’ perché questo nuovo nome contiene spazi.

Se riscriviamo il codice precedente, questa volta utilizzando un alias per ogni nome di tabella, otterremo il seguente risultato:

SELECT * 
FROM employees AS emp 
JOIN departments AS dep 
ON emp.department_id = dep.department_id;

Anche la parola chiave AS utilizzata in questo caso è del tutto facoltativa. È possibile ometterla dalla dichiarazione. L'implementazione di questa piccola modifica ha come risultato che il nostro codice appare come segue:

SELECT * 
FROM employees emp 
JOIN departments dep 
ON emp.department_id = dep.department_id;

Queste dovrebbero essere tutte le informazioni necessarie per unire due tabelle con JOIN e per rispondere a tutte le domande che potrebbero esserti poste in merito alla sintassi di base di JOIN.

3. Quali tipi di JOIN esistono?

Come accennato nell'introduzione di questo articolo, esistono molte varianti della clausola JOIN in SQL. Dimostrare di avere padronanza di ogni operatore è un metodo per evidenziare la propria conoscenza delle istruzioni JOIN in SQL. Ecco alcuni dei tipi più comuni di clausole JOIN che incontrerete:

INNER JOIN SQL

La clausola INNER JOIN è l'operatore JOIN predefinito di SQL. Riprendendo l'esempio precedente (SELECT * FROM employees JOIN departments), l'istruzione in realtà era una INNER JOIN.

INNER JOIN viene utilizzata per restituire le righe di entrambe le tabelle che soddisfano la condizione data. La clausola INNER JOIN corrisponde alle righe della prima e della seconda tabella che soddisfano la condizione ON.

Questa immagine mostra la relazione tra le due tabelle incluse nella nostra clausola INNER JOIN:

INNER JOIN

Esploriamo ulteriormente la sintassi e le funzionalità di INNER JOIN con un esempio pratico che utilizza le due tabelle, employees e departments, descritte in precedenza.

Il seguente codice SQL cerca le corrispondenze tra le tabelle employees e departments in base alla colonna department_id.

SELECT * from employees emp 
INNER JOIN departments dep 
ON emp.department_id = dep.department_id;

L'esecuzione di questo codice produrrà il seguente risultato:

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research And Development
4Clancy Wiggum33Human Resources

Osservando il risultato, noterai che manca il nostro dipendente Moe Szyslak. Nella nostra tabella employees questo dipendente non ha un indirizzo department_id attuale. Pertanto, non è stato possibile trovare alcuna corrispondenza quando si è tentato di eseguire l'istruzione JOIN per unire la tabella departments a partire da questa colonna. Pertanto, il dipendente viene escluso dal risultato. Risolveremo questo problema con il tipo seguente di operatore JOIN, LEFT JOIN.

Se ti interessa vedere altri esempi di INNER JOIN, consulta un articolo con esempi visivi e di facile comprensione che ti aiuterà a comprendere questo argomento complesso.

LEFT JOIN SQL

Simile alla clausola INNER JOIN, LEFT JOIN consente di interrogare i dati di due tabelle. Ma qual è la differenza fondamentale tra LEFT JOIN e INNER JOIN? LEFT JOIN restituisce tutte le righe presenti nella prima tabella (sinistra) elencata. Vengono restituite anche le righe corrispondenti della tabella di destra.

Quando si utilizza la clausola LEFT JOIN, vengono introdotti i concetti di tabella sinistra e tabella destra.

LEFT JOIN

Nel diagramma precedente, la tabella 1 è quella di sinistra e la 2 quella di destra.

La clausola LEFT JOIN seleziona i dati a partire dalla tabella di sinistra. Abbina quindi ogni riga della tabella di sinistra con le righe di quella di destra, in base alla condizione della clausola JOIN.

La clausola LEFT JOIN in SQL restituisce tutte le righe della tabella di sinistra, anche se non ci sono corrispondenze nella tabella di destra. Ciò significa che se la clausola ON non corrisponde a nessun record della tabella destra, JOIN restituirà comunque una riga nel risultato, ma con NULL in ogni colonna della tabella destra.

LEFT JOIN in SQL restituisce tutti i valori della tabella di sinistra, più quelli corrispondenti della tabella di destra. Se non viene trovata alcuna corrispondenza, LEFT JOIN restituisce un valore NULL.

La sintassi della clausola LEFT JOIN in SQL è la seguente:

SELECT * FROM employees emp 
LEFT JOIN departments dep 
ON emp.department_id = dep.department_id;

Abbiamo specificato che vogliamo eseguire l'istruzione LEFT JOIN. Questo metodo identificativo è lo stesso per tutti i tipi di JOIN. Specifica quale variante di JOIN stai utilizzando prima della parola chiave JOIN.

La parola chiave ON funziona come nell'esempio INNER JOIN. Cerchiamo valori corrispondenti tra la colonna department_id della tabella employees e quella department_id della nostra tabella departments.

In questo caso, employees agirà come tabella di sinistra, perché è la prima specificata.

Il risultato dell'esecuzione di questa query SQL sarà il seguente set di risultati:

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research And Development
4Clancy Wiggum33Human Resources
5Moe SzyslakNULLNULLNULL

Nota come il nostro dipendente, Moe Szyslak, sia stato incluso nel set di risultati, anche se non c'è una corrispondenza nella colonna department_id della tabella departments. Questo è esattamente lo scopo della clausola LEFT JOIN: includere tutti i dati della tabella di sinistra, indipendentemente dal fatto che siano state trovate corrispondenze.

RIGHT JOIN SQL

RIGHT JOIN è simile a LEFT JOIN, tranne per il fatto che l'azione eseguita sulle tabelle unite è invertita. In sostanza, questo operatore esegue l'azione opposta di LEFT JOIN. Questo significa che RIGHT JOIN restituisce tutti i valori della tabella di destra, più i valori corrispondenti della tabella di sinistra o NULL nel caso in cui non vengano trovate corrispondenze con il predicato dell'istruzione JOIN.

Nel diagramma seguente, la tabella 2 è quella di destra e la 1 quella di sinistra:

RIGHT JOIN

Applicando il seguente codice alle nostre tabelle employees e departments:

SELECT * FROM employees emp 
RIGHT JOIN departments dep 
ON emp.department_id = dep.department_id;

La sintassi è simile a quella della clausola LEFT JOIN. Specifichiamo che vogliamo eseguire una RIGHT JOIN, cercando in particolare le corrispondenze tra la tabella departments e quella employees.

In questo caso, employees fungerà da tabella di sinistra, poiché è la prima che specifichiamo. La tabella departments sarà quella di destra. Il risultato dell'esecuzione di questa query SQL JOIN sarà il seguente set di risultati:

idemployee_namedepartment_iddepartment_iddepartment_name
2Ned Flanders11Sales
NULLNULLNULL2Engineering
4Clancy Wiggum33Human Resources
1Homer Simpson44Customer Service
3Barney Gumble55Research And Development

RIGHT JOIN inizia a selezionare i dati dalla tabella di destra (departments). Ogni riga della tabella di destra viene confrontata con ogni riga della tabella di sinistra. Se la condizione dell'istruzione JOIN è vera per entrambe le righe, l'operatore combina le colonne in una nuova riga e la include nel set di risultati.

FULL JOIN SQL

FULL JOIN in SQL combina i risultati di entrambi gli operatori join esterni, sinistro e destro. La tabella unita conterrà tutti i record di entrambe le tabelle e inserirà i valori NULL per le corrispondenze mancanti su entrambi i lati.

Tieni presente che la clausola FULL JOIN può potenzialmente restituire un set di dati molto grande. Un'istruzione FULL JOIN restituisce tutte le righe delle tabelle unite, indipendentemente dal fatto che venga trovata una corrispondenza.

FULL JOIN in SQL è un tipo di OUTER JOIN (di cui parleremo più avanti nell'articolo) e per questo motivo può essere indicata anche come FULL OUTER JOIN.

Ecco illustrato chiaramente il concetto di FULL JOIN in SQL:

FULL JOIN

Nota come nel nostro diagramma venga restituita ogni riga di entrambe le tabelle.

Vediamo la sintassi della clausola FULL JOIN in SQL con un esempio di codice.

SELECT * FROM employees emp 
FULL JOIN departments dep 
ON emp.department_id = dep.department_id;

Quando questa query SQL viene eseguita a partire dalle nostre tabelle employees e departments, viene prodotto il seguente risultato:

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research And Development
4Clancy Wiggum33Human Resources
5Moe SzyslakNULLNULLNULL
2Ned Flanders11Sales
NULLNULLNULL2Engineering
4Clancy Wiggum33Human Resources
1Homer Simpson44Customer Service
3Barney Gumble55Research And Development

Confronta questo set di risultati con i risultati delle precedenti istruzioni LEFT JOIN e RIGHT JOIN. Vedrai come questi dati sono una combinazione di quelli restituiti dai nostri esempi precedenti. Questo tipo specifico di clausola JOIN produce un vasto set di dati. Pensaci bene prima di usare la clausola FULL JOIN.

CROSS JOIN

In SQL, viene utilizzata l'istruzione CROSS JOIN quando è necessario scoprire tutte le possibilità di combinazione di due tabelle, in cui il set di risultati includa ogni riga di ciascuna tabella che contribuisce. La clausola CROSS JOIN restituisce il prodotto cartesiano delle righe delle tabelle unite.

Il diagramma seguente illustra bene come vengono combinate le righe:

CROSS JOIN

L'uso di CROSS JOIN produce un set di risultati la cui dimensione è il numero di righe della prima tabella moltiplicato per il numero di righe della seconda. Questo tipo di risultato è chiamato Prodotto cartesiano di due tabelle (Tabella 1 x Tabella 2).

Riprendiamo le nostre due tabelle di prima:

  • La tabella employees
idemployee_namedepartment_id
1Homer Simpson4
2Ned Flanders1
3Barney Gumble5
4Clancy Wiggum3
5Moe SyzslakNULL
  • La tabella departments
department_iddepartment_name
1Sales
2Engineering
3Human Resources
4Customer Service
5Research And Development

Per eseguire un'istruzione CROSS JOIN utilizzando queste tabelle, dovresti scrivere una query SQL come questa:

SELECT * FROM employees 
CROSS JOIN departments;

Nota che CROSS JOIN non utilizza ON o USING quando viene dichiarata, diversamente da quanto avveniva per le clausole JOIN che abbiamo visto in precedenza.

Dopo aver eseguito la query CROSS JOIN, il set di risultati è il seguente:

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson41Sales
2Ned Flanders11Sales
3Barney Gumble51Sales
4Clancy Wiggum31Sales
5Moe SzyslakNULL1Sales
1Homer Simpson42Engineering
2Ned Flanders12Engineering
3Barney Gumble52Engineering
4Clancy Wiggum32Engineering
5Moe SzyslakNULL2Engineering
1Homer Simpson43Human Resources
2Ned Flanders13Human Resources
3Barney Gumble53Human Resources
4Clancy Wiggum33Human Resources
5Moe SzyslakNULL3Human Resources
1Homer Simpson44Customer Service
2Ned Flanders14Customer Service
3Barney Gumble54Customer Service
4Clancy Wiggum34Customer Service
5Moe SzyslakNULL4Customer Service
1Homer Simpson45Research And Development
2Ned Flanders15Research And Development
3Barney Gumble55Research And Development
4Clancy Wiggum35Research And Development
5Moe SzyslakNULL5Research And Development

Il nostro set di risultati contiene tutte le combinazioni possibili tra le due tabelle. Anche quando le tabelle utilizzate hanno pochi dati, come nel caso di employees e departments, possono produrre un set di risultati enorme quando vengono combinate dalla clausola CROSS JOIN di SQL.

NATURAL JOIN SQL

Una NATURAL JOIN è un tipo di JOIN che combina tabelle basate su colonne con lo stesso nome e tipo di dati. Quando si utilizza questa clausola, viene creata un'istruzione JOIN implicita basata sulle colonne comuni delle due tabelle da unire.

Le colonne comuni sono quelle che hanno lo stesso nome in entrambe le tabelle. Non è necessario specificare i nomi delle colonne da unire. La tabella risultante non conterrà colonne ripetute.

La sintassi di NATURAL JOIN è semplice:

SELECT * FROM employees 
NATURAL JOIN departments;

Quando questa query viene eseguita, produrrà il seguente set di risultati:

department_ididemployee_namedepartment_name
12Ned FlandersSales
34Clancy WiggumHuman Resources
41Homer SimpsonCustomer Service
53Barney GumbleResearch And Development

L'istruzione NATURAL JOIN viene eseguita sulla colonna condivisa tra le due tabelle. In questo caso, si tratta della colonna department_id. Questa colonna presente in entrambe le tabelle viene visualizzata una sola volta nel nostro set di risultati.

4. Che cos'è un OUTER JOIN?

Con OUTER JOIN in SQL, è possibile restituire righe non corrispondenti in una o entrambe le tabelle. Esistono diverse varianti della clausola OUTER JOIN, alcune delle quali sono già state trattate in questo articolo. Ecco i tipi più comuni di clausole OUTER JOIN:

  • LEFT OUTER JOIN
  • RIGHT OUTER JOIN
  • FULL OUTER JOIN

LEFT JOIN è un sinonimo di LEFT OUTER JOIN. La funzionalità di entrambe è identica. Questa potrebbe essere una delle domande che ti verranno poste durante un colloquio sulle istruzioni JOIN in SQL! Lo stesso si può dire per RIGHT JOIN e RIGHT OUTER JOIN, FULL JOIN e FULL OUTER JOIN. Vediamo un esempio per ciascuno di questi operatori.

LEFT OUTER JOIN SQL

Utilizza una clausola LEFT OUTER JOIN quando desideri tutti i risultati che si trovano nella prima tabella elencata. LEFT OUTER JOIN restituirà solo le righe della seconda tabella che hanno una corrispondenza.

La sintassi della clausola LEFT OUTER JOIN è la seguente:

SELECT * FROM employees emp 
LEFT OUTER JOIN departments dep 
ON emp.department_id = dep.department_id;

Il risultato dell'esecuzione di questa query SQL sarà il seguente set di risultati:

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research And Development
4Clancy Wiggum33Human Resources
5Moe SzyslakNULLNULLNULL

Nota come il nostro dipendente, Moe Syzslak, sia stato incluso nel set di risultati anche se non esiste una corrispondenza con la colonna department_id nella tabella departments. Questo è esattamente lo scopo della clausola LEFT OUTER JOIN: includere tutti i dati della tabella di sinistra, indipendentemente dal fatto che siano state trovate corrispondenze.

RIGHT OUTER JOIN SQL

RIGHT OUTER JOIN è simile a LEFT OUTER JOIN, tranne per il fatto che l'azione eseguita sulle tabelle unite è invertita. In sostanza, esegue l'azione opposta di LEFT OUTER JOIN. Ciò significa che RIGHT OUTER JOIN restituisce tutti i valori della tabella di destra, più i valori corrispondenti della tabella di sinistra o NULL in caso di mancata corrispondenza.

Quando applichiamo la clausola RIGHT OUTER JOIN alle nostre tabelle employees e departments il codice appare come segue:

SELECT * FROM employees emp 
RIGHT OUTER JOIN departments dep 
ON emp.department_id = dep.department_id;

In questo caso, la nostra tabella employees sarà quella di sinistra, perché è la prima a essere stata specificata.

Il risultato dell'esecuzione di questa query SQL consiste nel seguente set di risultati:

idemployee_namedepartment_iddepartment_iddepartment_name
2Ned Flanders11Sales
NULLNULLNULL2Engineering
4Clancy Wiggum33Human Resources
1Homer Simpson44Customer Service
3Barney Gumble55Research And Development

RIGHT OUTER JOIN inizia a selezionare i dati dalla tabella di destra, in questo caso departments. L'operatore abbina ogni riga della tabella di destra con ogni riga della tabella di sinistra. Se la condizione JOIN è vera per entrambe le righe, l'istruzione combina le colonne in una nuova riga e la include nel set di risultati.

FULL OUTER JOIN SQL

FULL OUTER JOIN in SQL combina i risultati di entrambi gli operatori join esterni, sinistro e destro. La tabella unita conterrà tutti i record di entrambe le tabelle e inserirà voci NULL per le corrispondenze mancanti su entrambi i lati. FULL OUTER JOIN restituisce tutte le righe delle tabelle unite, indipendentemente dalla loro corrispondenza.

Vediamo la sintassi della clausola FULL OUTER JOIN in SQL:

SELECT * FROM employees emp 
FULL OUTER JOIN departments dep 
ON emp.department_id = dep.department_id;

Quando questa query SQL viene eseguita a partire dalle nostre tabelle employees e departments produce il seguente risultato:

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research And Development
4Clancy Wiggum33Human Resources
5Moe SzyslakNULLNULLNULL
2Ned Flanders11Sales
NULLNULLNULL2Engineering
4Clancy Wiggum33Human Resources
1Homer Simpson44Customer Service
3Barney Gumble55Research And Development

Nota che questo set di dati è una combinazione delle nostre precedenti query LEFT OUTER JOIN e RIGHT OUTER JOIN.

5. Qual è la differenza tra INNER JOIN e LEFT JOIN in SQL?

Ci sono alcune differenze fondamentali da ricordare su queste varianti JOIN comunemente utilizzate. INNER JOIN restituisce le righe quando c'è una corrispondenza in entrambe le tabelle. LEFT JOIN restituisce tutte le righe della tabella di sinistra e tutte le righe corrispondenti della tabella di destra.

Vediamo un esempio pratico per esplorare le differenze tra queste clausole. Questo vi aiuterà a rispondere con sicurezza a questa comune domanda dei colloqui su JOIN in SQL.

Immaginiamo di avere due tabelle:

  • employees - Questa tabella contiene l'ID, il nome e l'ID del reparto di ciascun dipendente.
idemployee_namedepartment_id
1Homer Simpson4
2Ned Flanders1
3Barney Gumble5
4Clancy Wiggum3
5Moe SyzslakNULL
  • departments - Questa tabella contiene l'ID e il nome di ogni reparto.
department_iddepartment_name
1Sales
2Engineering
3Human Resources
4Customer Service
5Research and Development

Il seguente codice SQL cerca le corrispondenze tra le tabelle employees e departments in base alla colonna department_id:

SELECT * from employees emp 
INNER JOIN departments dep 
ON emp.department_id = dep.department_id;

L'esecuzione di questo codice produrrà il seguente risultato:

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research and Development
4Clancy Wiggum33Human Resources

Osservando il risultato, puoi notare che manca il nostro dipendente, Moe Szyslak. Nella tabella employees questo dipendente non ha al momento un department_id. Pertanto, non è stato possibile trovare alcuna corrispondenza quando la query ha tentato di unire la tabella departments a partire da questa colonna. Pertanto, il dipendente viene escluso dal risultato.

Utilizziamo ora la clausola LEFT JOIN e vediamo quale risultato produce. LEFT JOIN in SQL restituisce tutti i valori della tabella di sinistra, più quelli corrispondenti della tabella di destra. Se non viene trovata alcuna corrispondenza, LEFT JOIN restituisce un valore NULL.

La sintassi della clausola LEFT JOIN in SQL è la seguente:

SELECT * FROM employees emp 
LEFT JOIN departments dep 
ON emp.department_id = dep.department_id;

La parola chiave ON funziona allo stesso modo dell'esempio INNER JOIN. Cerchiamo valori corrispondenti tra la colonna department_id della nostra tabella employees e la colonna department_id della nostra tabella departments.

In questo caso, employees agirà come tabella di sinistra, perché è la prima a essere stata specificata.

Il risultato dell'esecuzione di questa query SQL è il seguente set di risultati:

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research and Development
4Clancy Wiggum33Human Resources
5Moe SzyslakNULLNULLNULL

Nota come Moe Szyslak sia stato incluso in questo set di risultati, anche se non esiste una corrispondenza con la colonna department_id della tabella departments. Questo è esattamente lo scopo della clausola LEFT JOIN: includere tutti i dati della tabella di sinistra, indipendentemente dal fatto che siano state trovate corrispondenze.

6. Qual è la differenza tra LEFT JOIN e FULL JOIN?

Questa è una delle domande su JOIN in SQL che potresti trovarti ad affrontare durante un colloquio.

Come abbiamo già detto, un'istruzione LEFT JOIN in SQL restituisce tutti i valori della tabella di sinistra, più quelli con una corrispondenza della tabella di destra. Se non viene trovata alcuna corrispondenza, LEFT JOIN restituisce il valore NULL. FULL JOIN di SQL restituisce invece tutte le righe delle tabelle unite, indipendentemente dalla corrispondenza. Questa clausola combina essenzialmente le funzionalità di LEFT JOIN e RIGHT JOIN.

Confrontiamo il set di risultati che otterresti utilizzando una clausola LEFT JOIN con il set di risultati che deriva da un'istruzione FULL JOIN.

Di seguito è riportata una query che fa uso di LEFT JOIN:

SELECT * FROM employees emp 
LEFT JOIN departments dep 
ON emp.department_id = dep.department_id;

In questo caso, la nostra tabella employees sarà quella di sinistra perché è la prima a essere stata specificata.

Il risultato dell'esecuzione di questa query SQL è:

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research and Development
4Clancy Wiggum33Human Resources
5Moe SzyslakNULLNULLNULL

Vediamo il confronto con il set di risultati ottenuti attraverso l'uso della clausola FULL JOIN di SQL. La sintassi è simile, come dimostra questo codice:

SELECT * FROM employees emp 
FULL JOIN departments dep 
ON emp.department_id = dep.department_id;

Quando questa query SQL viene eseguita a partire dalle nostre tabelle employees e departments, produce il seguente risultato:

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research and Development
4Clancy Wiggum33Human Resources
5Moe SzyslakNULLNULLNULL
NULLNULLNULL2Engineering

Confrontiamo questo set di risultati con quelli prodotti dalle nostre precedenti query LEFT JOIN e RIGHT JOIN. Noterai che non è stata trovata alcuna corrispondenza per il dipartimento di Ingegneria, ma che il record è stato comunque restituito. È chiaro che questi dati sono una combinazione di quelli restituiti dagli esempi precedenti. Questo tipo specifico di clausola JOIN produce un vasto set di dati. Per questo motivo, dovresti riflettere bene prima di usare una clausola FULL JOIN in SQL.

7. Scrivi una query che unisca queste due tabelle in modo che tutte le righe della tabella 1 siano presenti nel risultato.

Durante il colloquio per un ruolo di data analyst o di sviluppatore di software, è possibile che ti venga chiesto di completare una sfida tecnica riguardante il linguaggio SQL. Un esercizio molto comune nei colloqui sulle clausole JOIN di SQL consiste nello scrivere una query che unisca due tabelle in un certo modo. Immaginiamo che ti venga chiesto di scrivere una query che unisca due tabelle in modo che tutte le righe della tabella 1 siano presenti nel risultato.

Innanzitutto, è necessario comprendere il concetto di tabella destra e sinistra.

LEFT JOIN

Nel diagramma precedente, la tabella 1 è quella di sinistra e la tabella 2 quella di destra. In altre parole, la tabella di sinistra è la prima della query; il suo nome deriva dal fatto che si trova a sinistra della condizione di unione. La tabella di destra viene dopo la parola chiave JOIN.

La clausola LEFT JOIN seleziona i dati a partire dalla tabella di sinistra. Fa corrispondere ogni riga della tabella di sinistra con quelle della tabella di destra, in base alle condizioni della clausola JOIN. Restituisce quindi tutti i valori della tabella di sinistra e quelli che hanno una corrispondenza nella tabella di destra. Se non viene trovata alcuna corrispondenza, LEFT JOIN restituisce il valore NULL. Questo significa che se la clausola ON non produce alcuna corrispondenza con i record della tabella di destra, LEFT JOIN restituirà comunque tutte le righe della tabella di sinistra, ma con un NULL in ogni colonna della tabella di destra.

Per il nostro esempio pratico, utilizzeremo le tabelle employees e departments dell'esempio precedente:

employees - Questa tabella contiene l'ID, il nome e l'ID del reparto di ciascun dipendente.

idemployee_namedepartment_id
1Homer Simpson4
2Ned Flanders1
3Barney Gumble5
4Clancy Wiggum3
5Moe SyzslakNULL

departments - Questa tabella contiene l'ID e il nome di ogni reparto.

department_iddepartment_name
1Sales
2Engineering
3Human Resources
4Customer Service
5Research and Development

Se desideriamo mantenere tutte le righe della tabella 1 (in questo caso, employees) dobbiamo specificare questa come tabella di sinistra.

La sintassi della clausola LEFT JOIN è la seguente:

SELECT * FROM employees emp 
LEFT JOIN departments dep 
ON emp.department_id = dep.department_id;

L'esecuzione di questa query produce questo set di risultati:

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research and Development
4Clancy Wiggum33Human Resources
5Moe SzyslakNULLNULLNULL

Nota che il dipendente Moe Szyslak è stato incluso in questo set di risultati, anche se non c'è alcuna corrispondenza con la colonna department_id della tabella departments. Questo è esattamente lo scopo della clausola LEFT JOIN: includere tutti i dati della tabella di sinistra, indipendentemente dal fatto che siano state trovate corrispondenze nella tabella di destra.

8. Come si uniscono più di due tabelle?

L'unione di più di due tabelle in una singola query SQL può essere piuttosto difficile da capire per i principianti. L'esempio seguente dovrebbe essere chiaro a tutti.

È necessario eseguire un'istruzione JOIN su più di due tabelle quando i dati che si vogliono includere nel risultato esistono in tre o più tabelle. Per ottenere questo obiettivo sono necessarie più operazioni JOIN consecutive: prima si uniscono la prima e la seconda tabella e si ottiene un set di risultati virtuale; poi si unisce un'altra tabella a questa tabella virtuale. Vediamo un esempio.

Per il nostro esempio di operazioni JOIN multiple, immaginiamo di avere tre tabelle:

departments - Questa tabella contiene l'ID e il nome di ogni reparto.

department_iddepartment_name
1Sales
2Engineering
3Human Resources
4Customer Service
5Research and Development

office - Questa tabella contiene l'indirizzo di ogni ufficio.

idaddress
15 Wisteria Lane, Springfield, USA
2124 Chestmount Street, Springfield, USA
36610 Bronzeway, Springfield, USA
4532 Executive Lane, Springfield, USA
510 Meadow View, Springfield, USA

department_office - Questa tabella collega le informazioni dell'ufficio al reparto associato. Alcuni reparti possono comprendere più uffici.

office_iddepartment_id
11
23
32
44
55
21
51
43

Nel nostro caso, abbiamo utilizzato una tabella di collegamento chiamata department_office che collega o mette in relazione la tabella departments con quella office.

Per scrivere una query SQL che presenti gli attributi department_name e address uno accanto all'altro, dobbiamo unire tre tabelle:

  • La prima clausola JOIN unisce departments e department_office e creerà una tabella temporanea che avrà una colonna office_id.
  • La seconda istruzione JOIN unirà questa tabella temporanea con quella office in base alla colonna office_id, in modo da ottenere il risultato desiderato.

Esamina la query SQL seguente:

SELECT department_name, address
FROM departments d 
JOIN department_office do ON d.department_id=do.department_id 
JOIN office o ON do.office_id=o.id;

Puoi notare che vogliamo recuperare solo due colonne, il nome del reparto e l'indirizzo associato. Uniamo la tabella department_office che ha un collegamento sia con quella departments che con office. Questo ci consente di unire la tabella office che contiene la colonna address nella nostra istruzione SELECT.

L'esecuzione di questo codice produce il seguente set di risultati:

department_nameaddress
Sales5 Wisteria Lane, Springfield, USA
Engineering124 Chestmount Street, Springfield, USA
Human Resources6610 Bronzeway, Springfield, USA
Customer Service532 Executive Lane, Springfield, USA
Research and Development10 Meadow View, Springfield, USA
Sales124 Chestmount Street, Springfield, USA
Sales10 Meadow View, Springfield, USA
Human Resources532 Executive Lane, Springfield, USA

Ecco fatto! Abbiamo il risultato desiderato: ogni reparto e l'indirizzo corrispondente. Nota come il reparto "Sales" sia il più grande, con tre uffici diversi. Il secondo reparto più grande è "Human Resources", che si estende su due uffici diversi.

Puoi notare come le clausole JOIN possano essere utilizzate su più tabelle per creare collegamenti tra tabelle che hanno colonne in comune. Esistono diverse situazioni in cui può essere utile unire più tabelle; per maggiori informazioni, consulta questo articolo su come unire tre o più tabelle in SQL.

9. Come si fa a unire una tabella a se stessa?

Molti principianti non se ne rendono conto, ma è possibile unire una tabella a se stessa. Questa operazione è comunemente chiamata self-join. È utile per interrogare dati gerarchici o per confrontare righe all'interno della stessa tabella. Quando si utilizza una self-join, è importante introdurre un alias SQL per ogni tabella.

Per il nostro esempio di self-join, utilizzeremo la seguente tabella:

employee - Questa tabella contiene i nomi di tutti i dipendenti dell'azienda, gli ID dei loro reparti e gli ID dei loro manager.

idemployee_namedepartment_idmanager_id
1Montgomery Burns4NULL
2Waylon Smithers11
3Homer Simpson21
4Carl Carlson51
5Lenny Leonard31
6Frank Grimes23

Supponiamo di voler ottenere un set di risultati che mostri solo i dipendenti e i loro manager. Puoi ottenere facilmente questo risultato utilizzando gli alias delle tabelle in combinazione con un self-join. Per il nostro primo self-join utilizzeremo la clausola LEFT JOIN di SQL. Osserva il codice seguente:

SELECT 
e.employee_name AS 'Employee',
m.employee_name AS 'Manager'
FROM employee e
LEFT JOIN employee m ON m.id = e.manager_id

Non cadere nell'errore di colonna ambigua, che può verificarsi facilmente se non presti attenzione quando scrivi una query self-join. Per evitarlo, è necessario fare buon uso degli alias SQL, ossia assegnare un alias a ogni occorrenza della tabella nella query SQL. Questo è dimostrato dalla seguente sezione della query precedente:

FROM employee e LEFT JOIN employee m

Anche i nomi delle colonne devono essere preceduti dall'alias della tabella, in modo che sia chiaro a quale tabella si riferisce ogni colonna. Abbiamo specificato esplicitamente e.employee_name e m.employee_name.

Queste regole ti aiuteranno a eseguire con successo una query SQL con un'operazione di self-join, evitando l'errore di colonna ambigua.

L'esecuzione della query precedente produce il seguente set di risultati:

EmployeeManager
Montgomery BurnsNULL
Waylon SmithersMontgomery Burns
Homer SimpsonMontgomery Burns
Carl CarlsonMontgomery Burns
Lenny LeonardMontgomery Burns
Frank GrimesHomer Simpson

Ecco il risultato desiderato! È possibile vedere chiaramente ogni dipendente e il suo manager corrispondente. La maggior parte dei dipendenti fa capo al signor Burns, anche se il manager di Frank Grimes è Homer Simpson. Nota il valore NULL nella colonna Manager per Montgomery Burns. Questo perché Montgomery Burns non ha un manager: è il capo.

Modifichiamo leggermente la query e utilizziamo questa volta la clasuola INNER JOIN:

SELECT 
e.employee_name AS 'Employee',
m.employee_name AS 'Manager'
FROM employee e
INNER JOIN tbl_employee m ON m.id = e.manager_id
EmployeeManager
Waylon SmithersMontgomery Burns
Homer SimpsonMontgomery Burns
Carl CarlsonMontgomery Burns
Lenny LeonardMontgomery Burns
Frank GrimesHomer Simpson

L'unica differenza importante è l'assenza di Montgomery Burns dalla colonna Employee. Questo perché il valore manager_id per lui era NULL; INNER JOIN restituisce solo le colonne con una corrispondenza, escludendo i valori NULL.

Ora sei in grado di eseguire operazioni di self-join, che sono applicabili in molti casi d'uso diversi. Per trovare altri esempi di self-join, consulta questa eccellente guida illustrata alle operazioni di self-join.

10. La condizione della clausola JOIN deve essere di uguaglianza?

Una non equi-join (o non equijoin) è una clausola JOIN che non utilizza l'uguaglianza ( = ) come condizione dell'operatore di unione. È possibile utilizzare i comuni operatori di confronto (per esempio <, >, <=, >=, != e <>) in combinazione alle clausole di unione. È possibile impiegare anche l'operatore BETWEEN.

Ci sono molte situazioni in cui le operazioni non equijoin possono rivelarsi utili, tra cui elencare le coppie uniche, fare una lista di record all'interno di un intervallo e identificare i duplicati. Vediamo l'ultimo caso d'uso: come individuare i duplicati usando una non equi-join.

Per prima cosa, esaminiamo i dati su cui svolgeremo la query. Per questo esempio utilizzeremo una sola tabella, la già nota employee:

idemployee_namedepartment_idmanager_id
1Montgomery Burns4NULL
2Waylon Smithers11
3Homer Simpson21
4Carl Carlson51
5Lenny Leonard31
6Frank Grimes23
7Lenny Leonard31

Se volessimo identificare rapidamente i valori duplicati, scriveremmo la seguente query, che fa un buon uso di una clausola non equijoin:

SELECT e1.id, e1.employee_name, e2.id, e2.employee_name
FROM employee e1
JOIN employee e2
ON e1.employee_name = e2.employee_name AND e1.id < e2.id

Osservando più da vicino la clausola JOIN, possiamo notare che ha due condizioni:

  1. Abbina i record che hanno lo stesso nome.
  2. Recupera i record il cui ID è inferiore all'ID della tabella temporanea creata dall'operatore JOIN.

L'esecuzione di questa query produce il seguente set di risultati:

idemployee_nameidemployee_name
5Lenny Leonard7Lenny Leonard

Possiamo vedere che Lenny Leonard ha un record duplicato in questa tabella. I duplicati possono causare errori imprevedibili e alterare i dati nei report.

Questo è solo uno dei tanti esempi possibili che dimostrano l'utilità delle operazioni non equi-join. Ci sono altre eccellenti risorse disponibili online, come questo articolo che mostra le applicazioni pratiche delle non equijoin.

Le 10 domande più frequenti dei colloqui su SQL

Ora hai le conoscenze necessarie per rispondere alle domande complesse dei colloqui sugli operatori JOIN in SQL. Se ti senti ancora sopraffatto dall'argomento o hai dubbi sulle clausole JOIN in SQL, qui troverai ottimi consigli sull'approccio migliore per esercitarti con le clausole JOIN di SQL.

È possibile utilizzare i nostri strumenti didattici in combinazione con la scheda informativa su JOIN in SQL, che costituisce un ottimo punto di riferimento sia per i programmatori SQL alle prime armi che per quelli più esperti. Sia che tu ti stia affacciando per la prima volta al linguaggio SQL, sia che tu senta il bisogno di rinfrescare le tue conoscenze sull'argomento, questo corso interattivo su JOIN in SQL è un'ottima risorsa di apprendimento.