5th Sep 2022 Tempo di lettura: 28 minuti Le 10 principali domande di colloquio su JOIN in SQL e le relative risposte Andrew Bone sql imparare sql sql join lavori e carriera Indice 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? INNER JOIN SQL LEFT JOIN SQL RIGHT JOIN SQL FULL JOIN SQL CROSS JOIN NATURAL JOIN SQL 4. Che cos'è un OUTER JOIN? LEFT OUTER JOIN SQL RIGHT OUTER JOIN SQL FULL OUTER JOIN SQL 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 uniscono più di due tabelle? 9. Come si fa a unire una tabella a se stessa? 10. La condizione della clausola JOIN deve essere di uguaglianza? Le 10 domande più frequenti dei colloqui su SQL 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. Che cos'è la clausola JOIN in SQL e quando è necessaria? Come scriveresti una query per unire queste due tabelle? Quali tipi di JOIN esistono? Che cos'è OUTER JOIN? Qual è la differenza tra INNER JOIN e LEFT JOIN in SQL? Qual è la differenza tra LEFT JOIN e FULL JOIN? Scrivi una query che unisca queste due tabelle, in modo che tutte le righe della tabella 1 siano presenti nel risultato. Come si fa a unire più di due tabelle? Come si fa a unire una tabella a se stessa? 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: 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: 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. 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: 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: 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: 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. 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: Abbina i record che hanno lo stesso nome. 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. Tags: sql imparare sql sql join lavori e carriera