18th Jul 2022 Tempo di lettura: 7 minuti Come mantenere le righe non abbinate quando si uniscono due tabelle in SQL Tihomir Babic sql imparare sql sql joins Indice Quale JOIN vi dà le righe non corrispondenti? Conoscere i dati Che cosa succede quando si usa l'INNER JOIN? Ottenere tutte le righe corrispondenti e non corrispondenti da una tabella Uso della CONGIUNZIONE SINISTRA Uso della GIUNTA DESTRA La JOIN COMPLETA permette di ottenere tutte le righe abbinate e non abbinate? Quando usare quale JOIN Imparate i diversi tipi di JOIN per scegliere quello che vi serve! Imparate a usare JOIN per conservare sia le righe corrispondenti che quelle non corrispondenti quando unite due tabelle. L'unione di due o più tabelle è un'abilità molto richiesta se si lavora con i database. Per ripassare e mettere in pratica le abilità di unione in SQL, vi consiglio il corso interattivo SQL JOINs . Contiene oltre 90 esercizi e sezioni su diverse sfide di unione. Se vi capita spesso di unire tabelle in SQL, avrete probabilmente notato che non tutti i dati di una tabella corrispondono sempre ai dati di un'altra tabella. A volte sono necessari solo i dati che hanno una corrispondenza in entrambe le tabelle. A volte, invece, è necessario conservare le righe non corrispondenti. Come si fa in JOIN? Quale JOIN vi dà le righe non corrispondenti? Probabilmente lo sapete già, ma vale la pena ripeterlo. Lo scopo di JOIN è quello di ottenere i dati da due o più tabelle. Le si unisce in base alle colonne che hanno in comune. I quattro tipi principali di JOINs sono: (INNER) JOIN. LEFT (OUTER) JOIN. RIGHT (OUTER) JOIN. FULL (OUTER) JOIN. Quando si utilizza un semplice (INNER) JOIN, si otterranno solo le righe che hanno una corrispondenza in entrambe le tabelle. La query non restituirà in alcun modo le righe non corrispondenti. Se questo non è ciò che si desidera, la soluzione è utilizzare LEFT JOIN, RIGHT JOIN, o FULL JOIN, a seconda di ciò che si desidera vedere. Se non conoscete JOIN, qui trovate una spiegazione esauriente di ogni tipo di JOIN. Potete anche avere a portata di mano un foglio informativo sulle JOIN SQL per aiutarvi con la sintassi e l'uso di JOIN. Conoscere i dati I dati con cui lavoreremo sono costituiti da due tabelle: employee. project. La tabella employee ha quattro colonne: id: L'ID del dipendente; è la chiave primaria (PK) della tabella. first_name: Il nome del dipendente. last_name: Il cognome del dipendente. project_id: L'ID del progetto e la chiave esterna (FK) della tabella, che fa riferimento a un'altra tabella chiamata project. Ecco come appaiono i dati della tabella employee della tabella: idfirst_namelast_nameproject_id 1IngaDansken1 2RosinaSneezem5 3DarRisbie4 4LyneaBraveyNULL 5AlanahAbrashkov4 6EmmitJaime4 7KarrieLatek5 8GarrettCreginNULL 9CecilioZiemkeNULL 10MalanieChapellow1 11FraydaPinkett1 12MaddiMullissNULL 13BlaneTue5 14CarverVeighey5 15ChristosManleyNULL Ci sono due colonne nella tabella project: id: L'ID del progetto; è la chiave primaria (PK) della tabella. project_name: Il nome del progetto. Questi sono i dati della tabella: idproject_name 1Reporting Process 2Database Enhancement 3Sales Boosting 4Employee Satisfaction 5IT Security 6Diversity Program 7Policies & Procedures 8Social Media Visibility 9Mobile Banking 10Education Che cosa succede quando si usa l'INNER JOIN? Per ottenere il nome dei dipendenti e i progetti su cui stanno lavorando utilizzando INNER JOIN, è necessario scrivere questo codice: SELECT first_name, last_name, project_name FROM employee e JOIN project p ON e.project_id = p.id; Nota: naturalmente è possibile utilizzare come parola chiave JOIN o INNER JOIN, che sono la stessa cosa. Ecco cosa si ottiene come risultato: first_namelast_nameproject_name FraydaPinkettReporting Process MalanieChapellowReporting Process IngaDanskenReporting Process EmmitJaimeEmployee Satisfaction AlanahAbrashkovEmployee Satisfaction DarRisbieEmployee Satisfaction CarverVeigheyIT Security BlaneTueIT Security KarrieLatekIT Security RosinaSneezemIT Security Il risultato mostra solo le righe della tabella employee che corrispondono alle righe della tabella project. In altre parole, il codice restituisce solo i dipendenti a cui è stato assegnato un progetto. Questo, tuttavia, significa che ogni tabella può avere righe che non corrispondono all'altra tabella. Potrebbero esserci dei dipendenti che non sono assegnati ad alcun progetto e potrebbero esserci dei progetti a cui non è stato assegnato alcun dipendente. Come si fa a ottenere anche le righe non abbinate? Ottenere tutte le righe corrispondenti e non corrispondenti da una tabella Per ottenere tutte le righe da una sola tabella, sia quelle corrispondenti che quelle non corrispondenti, è necessario utilizzare il comando LEFT JOIN o RIGHT JOIN. Quale utilizzare dipende da quale tabella si desidera conservare le righe non corrispondenti. LEFT JOIN lo farà dalla tabella di sinistra, RIGHT JOIN da quella di destra. Vi mostrerò cosa significa in pratica. Uso della CONGIUNZIONE SINISTRA Per ottenere le righe abbinate e non abbinate da una tabella utilizzando LEFT JOIN, dovrete scrivere questo codice: SELECT first_name, last_name, project_name FROM employee e LEFT JOIN project p ON e.project_id = p.id; È quasi lo stesso codice dell'esempio precedente. L'unica differenza è che si utilizza la parola chiave LEFT JOIN invece di JOIN. In questo modo si otterranno tutti i dati dalla tabella di sinistra (employeein questo caso) e tutti i dati corrispondenti della tabella di destra (project). Quando non ci sono dati corrispondenti nella tabella projectsi ottengono i valori di NULL., ma si ottengono comunque tutti i valori dalla tabella employee. Guardate voi stessi: first_namelast_nameproject_name FraydaPinkettReporting Process MalanieChapellowReporting Process IngaDanskenReporting Process EmmitJaimeEmployee Satisfaction AlanahAbrashkovEmployee Satisfaction DarRisbieEmployee Satisfaction CarverVeigheyIT Security BlaneTueIT Security KarrieLatekIT Security RosinaSneezemIT Security ChristosManleyNULL MaddiMullissNULL CecilioZiemkeNULL GarrettCreginNULL LyneaBraveyNULL Come si interpretano questi dati? Ci sono tutti i dipendenti e i progetti a cui lavorano. Quando c'è un valore NULL nella colonna project_name, significa che il dipendente in questione non sta lavorando ad alcun progetto. Uso della GIUNTA DESTRA Ora scriviamo lo stesso codice con RIGHT JOIN invece di usare LEFT JOIN. SELECT first_name, last_name, project_name FROM employee e RIGHT JOIN project p ON e.project_id = p.id; È l'immagine speculare del codice precedente. Restituirà tutti i dati della tabella di destra, projecte solo le righe corrispondenti della tabella di sinistra, employee. Anche in questo caso, quando non ci sono dati corrispondenti nella tabella employeei valori saranno NULL. Questo è il risultato della query: first_namelast_nameproject_name FraydaPinkettReporting Process MalanieChapellowReporting Process IngaDanskenReporting Process NULLNULLDatabase Enhancement NULLNULLSales Boosting EmmitJaimeEmployee Satisfaction AlanahAbrashkovEmployee Satisfaction DarRisbieEmployee Satisfaction CarverVeigheyIT Security BlaneTueIT Security KarrieLatekIT Security RosinaSneezemIT Security NULLNULLDiversity Program NULLNULLPolicies & Procedures NULLNULLSocial Media Visibility NULLNULLMobile Banking NULLNULLEducation Ora, questi dati mostrano tutti i progetti esistenti nella tabella project. Quando le colonne first_name e last_name sono NULL, significa che non c'è nessun dipendente che lavora su quel progetto. La JOIN COMPLETA permette di ottenere tutte le righe abbinate e non abbinate? Credo che la query che utilizza la FULL JOIN e il suo risultato parlino da soli. Vediamo cosa fa. Innanzitutto, la query: SELECT first_name, last_name, project_name FROM employee e FULL JOIN project p ON e.project_id = p.id; Anche in questo caso, l'unica differenza rispetto alle query precedenti è il tipo di join utilizzato. Tutto il resto è uguale. Questa query FULL JOIN restituirà i seguenti dati: first_namelast_nameproject_name FraydaPinkettReporting Process MalanieChapellowReporting Process IngaDanskenReporting Process NULLNULLDatabase Enhancement NULLNULLSales Boosting EmmitJaimeEmployee Satisfaction AlanahAbrashkovEmployee Satisfaction DarRisbieEmployee Satisfaction CarverVeigheyIT Security BlaneTueIT Security KarrieLatekIT Security RosinaSneezemIT Security NULLNULLDiversity Program NULLNULLPolicies & Procedures NULLNULLSocial Media Visibility NULLNULLMobile Banking NULLNULLEducation ChristosManleyNULL MaddiMullissNULL CecilioZiemkeNULL GarrettCreginNULL LyneaBraveyNULL Esaminiamo un po' i dati. Ci sono righe che si trovano in entrambe le tabelle. Tuttavia, ci sono righe della tabella employee che non hanno righe corrispondenti nella tabella project. Queste righe possono essere identificate dai valori NULL nella colonna project_name. Ci sono anche righe della tabella project che non hanno righe corrispondenti nella tabella employee. Anche in questo caso, i valori di NULL si trovano qui. Questa volta, i valori NULLs saranno nelle colonne first_name e last_name. Quando usare quale JOIN Ora che si è visto cosa restituisce ogni JOIN, chiariamo cosa fa ogni JOIN. JOIN o INNER JOIN non restituisce alcuna riga non corrispondente. Restituisce solo le righe che corrispondono in entrambe le tabelle unite. Se si desidera ottenere righe non corrispondenti, non è consigliabile utilizzarlo. I metodi LEFT JOIN e RIGHT JOIN restituiscono sia le righe corrispondenti che quelle non corrispondenti. Tuttavia, è necessario sapere da quale tabella si ottengono le righe non abbinate. In base alle proprie esigenze, si utilizzerà LEFT JOIN o RIGHT JOIN. Entrambi ottengono tutte le righe da una tabella (abbinate e non abbinate) e tutte le righe corrispondenti dall'altra tabella. Quando nell'altra tabella non si trovano righe corrispondenti, le colonne dell'altra tabella mostrano i valori NULL. FULL JOIN fornisce tutti i dati di tutte le tabelle unite. È come combinare i tre join precedenti. Si ottengono tutte le righe corrispondenti come quando si usa INNER JOIN. Si ottengono anche le righe non corrispondenti dalla tabella di sinistra e dalla tabella di destra. È come se si usassero contemporaneamente LEFT JOIN e RIGHT JOIN. Ecco altri esempi per esercitarsi a unire le tabelle. Imparate i diversi tipi di JOIN per scegliere quello che vi serve! Sapere come funzionano queste JOINs è molto utile. Permettono di unire due o più tabelle e di ottenere diverse combinazioni di dati da ogni tabella. Non c'è alcuna differenza nel modo in cui si scrive il codice. L'unica cosa che cambia è la parola chiave che si usa a seconda del tipo di JOIN che serve. È molto importante capire quali dati restituisce ciascuno di questi JOINs. Per padroneggiare e mettere in pratica questa abilità, il corso SQL Basics e il corso SQL JOINs sono ciò che vi serve! Se avete bisogno di consigli su come esercitarvi con le JOIN, ecco alcuni suggerimenti. Tags: sql imparare sql sql joins