20th Jul 2022 Tempo di lettura: 7 minuti Cos'è una JOIN COMPLETA e quando usarla Zahin Rahman sql imparare sql sql joins Indice JOIN COMPLETO: introduzione Sintassi della JOIN COMPLETA Esempio Casi d'uso della giunzione completa Tipi di JOIN: Riepilogo Aumentate la vostra conoscenza delle JOIN COMPLETE in SQL Impariamo a conoscere la FULL JOIN, come si implementa, come si confronta con gli altri tipi di SQL JOINs e alcuni dei suoi casi d'uso unici. Prima di addentrarci nelle JOIN COMPLETE, ricapitoliamo rapidamente cos'è una JOIN SQL. In sostanza, una JOIN combina i dati di due o più tabelle all'interno di un database. Le tabelle sono solitamente collegate tra loro utilizzando identificatori unici in ogni tabella, ovvero chiavi primarie e straniere. Per mostrare un semplice SQL JOIN - noto anche come INNER JOIN - in azione, consideriamo le query Products e OrderDetails del noto database di esempio Northwind. La tabella Products contiene un elenco di tutti i prodotti e la tabella OrderDetails contiene un elenco di tutti gli ordini recenti. PRODUCTS ProductIDProductNameSupplierIDCategoryIDUnitPrice 1Chais1110 boxes x 20 bags18 2Chang1124 - 12 oz bottles19 3Aniseed Syrup1212 - 550 ml bottles10 .................. ORDERDETAILS OrderDetaiIDOrderIDProductIDQuantity 1102481112 2102484210 310248725 ............ Ecco la query: SELECT Products.ProductName, OrderDetails.OrderID, OrderDetails.Quantity FROM Products JOIN OrderDetails ON Products.ProductID=OrderDetails.ProductID ORDER BY Quantity Desc; E il risultato: ProductNameOrderIDQuantity Pâté chinois10398120 Steeleye Stout10286100 Sirop d'érable1044090 L'esempio precedente utilizza ProductID (che è disponibile in entrambe le tabelle) come chiave per unire le due tabelle e visualizzare ogni ordine ordinato in ordine decrescente per Quantity. Si noti che un semplice JOIN come quello sopra riportato restituisce solo le righe corrispondenti delle due tabelle. In questo caso, i risultati includeranno solo i prodotti ordinati di recente e gli ordini collegati a un ProductID valido. JOIN COMPLETO: introduzione A differenza di INNER JOIN, una FULL JOIN restituisce tutte le righe di entrambe le tabelle unite, indipendentemente dal fatto che abbiano o meno una riga corrispondente. Per questo motivo, una FULL JOIN viene anche chiamata FULL OUTER JOIN. Un FULL JOIN restituisce le righe non corrispondenti di entrambe le tabelle e la loro sovrapposizione. Quando non esistono righe corrispondenti per una riga della tabella di sinistra, le colonne della tabella di destra avranno NULL per quei record. Allo stesso modo, quando non esistono righe corrispondenti per una riga della tabella di destra, le colonne della tabella di sinistra avranno dei NULL. Per dimostrare la differenza tra un semplice SQL JOIN e un FULL OUTER JOIN, consideriamo le tabelle Projects e Employees come mostrato di seguito. La tabella Projects contiene un elenco di tutti i progetti intrapresi dall'azienda (progetti interni e in outsourcing), mentre la tabella Employees contiene un elenco di tutti i dipendenti attuali e specifica se sono coinvolti in qualche progetto aziendale. PROJECTS ProjectIDProjectNameCostYTDBusinessUnit 1CRM Upgrade45640Customer Relations 2Cybersecurity Protocol Implementation80200Cybersecurity 3HQ Office Renovations145000Facilities 4ERP Integration110000Corporate 5Database Stack Upgrade25000Engineering ............ 15Automated QA10000Engineering EMPLOYEES EmployeeIDEmployeeNameProjectIDStartDateBusinessUnit 001Albert Ross32012-02-11Facilities 002Hummer BairdNULL2012-02-11Corporate 003Matthias Dias152012-07-15Engineering 004Al Cooper12014-04-15Customer Relations 005Macron RalfNULL2014-04-15Legal ............... 025Hamza ImranNULL2020-07-11Engineering Se si effettuassero delle JOIN tra queste due tabelle facendo corrispondere le tabelle attraverso ProjectID come chiave primaria, i risultati di una semplice INNER JOIN e di una FULL OUTER JOIN sarebbero molto diversi. Un INNER JOIN produrrebbe una tabella contenente solo i risultati in cui c'è una corrispondenza tra le due voci corrispondenti in entrambe le tabelle. Il risultato di INNER JOIN contiene i nomi dei dipendenti e i nomi dei progetti corrispondenti: EmployeeNameProjectName Albert RossHQ Office Renovations Matthias DiasAutomated QA Al CooperCRM Upgrade Invece, un FULL OUTER JOIN produrrà i dati di entrambe le tabelle, indipendentemente dalla presenza di una corrispondenza nell'altra tabella: EmployeeNameProjectName Albert RossHQ Office Renovations Hummer BairdNULL Matthias DiasAutomated QA Al CooperCRM Upgrade ....... Hamza ImranNULL NULLERP Integration Il risultato di FULL JOIN contiene tutti i nomi dei dipendenti, indipendentemente dal fatto che siano assegnati a un progetto, e tutti i nomi dei progetti, anche se non ci sono dipendenti assegnati a quel progetto. Sintassi della JOIN COMPLETA La sintassi di base di FULL JOIN è simile a quella di altri tipi di JOIN: SELECT left_table.column1, right_table.column2,... FROM left_table FULL OUTER JOIN right_table ON left_table.key = right_table.key; La parola chiave OUTER è opzionale e può essere omessa. Esempio Esaminiamo ora l'esempio di una FULL OUTER JOIN che mostra sia la EmployeeName che la ProjectName. Ecco la query: SELECT Employees.EmployeeName, Projects.ProjectName FROM Employees FULL OUTER JOIN Projects ON Employees.ProjectID=Projects.ProjectID ORDER BY EmployeeID; E il risultato: EmployeeNameProjectName Albert RossHQ Office Renovations Hummer BairdNULL Matthias DiasAutomated QA Al CooperCRM Upgrade ....... Hamza ImranNULL NULLERP Integration Dalla tabella dei risultati si evince che anche FULL JOIN produce risultati NULL da entrambi i metodi Projects e Employees anche se non c'erano corrispondenze nell'altra tabella. I NULL nella colonna ProjectName indicano che il dipendente non è specificamente assegnato ad alcun progetto e probabilmente svolge altre funzioni in azienda. D'altra parte, un NULL nella colonna EmployeeName indica che il progetto specifico è probabilmente esternalizzato e non gestito direttamente da un dipendente dell'azienda. In alternativa, un valore NULL potrebbe anche indicare un potenziale errore o una cancellazione involontaria di dati nel database o nel sistema. (Ne parleremo più avanti). È bene notare che alcuni database, come MySQL, non supportano i join completi. In questo caso, è possibile utilizzare l'operatore UNION ALL per combinare le query LEFT JOIN e RIGHT JOIN. Il nostro precedente articolo su SQL JOINs contiene altri esempi da esaminare. Il nostro SQL JOINs corso fornisce anche esempi completi di FULL JOINs e include esercizi pratici per migliorare le vostre conoscenze. Casi d'uso della giunzione completa Rispetto agli altri tipi di SQL JOINs, è probabile che FULL JOIN venga utilizzato meno frequentemente. Detto questo, è uno strumento molto utile per alcune situazioni particolari. Alcuni dei suoi casi d'uso sono: Per recuperare tutti i record da entrambe le tabelle, indipendentemente dal fatto che vi sia o meno una corrispondenza. Questo è l'esempio che abbiamo visto sopra. Per trovare dati non corrispondenti o orfani da entrambe le tabelle. Un record orfano è un record il cui valore di chiave esterna fa riferimento a un valore di chiave primaria inesistente; ciò accade spesso in sistemi in rapida espansione o molto vecchi. Eseguire rapporti di eccezione. Si tratta di una forma di analisi dei dati che confronta un insieme di dati con un insieme di dati di base desiderato/previsto, evidenziando gli elementi che non corrispondono. Sebbene l'applicazione delle JOIN COMPLETE sia piuttosto particolare, sono un ottimo modo per trovare e diagnosticare potenziali problemi di integrità dei dati. Tipi di JOIN: Riepilogo Come abbiamo detto sopra, esistono altri tipi di JOIN. Una INNER JOIN restituisce le righe quando la condizione JOIN è soddisfatta sia nella tabella di sinistra che in quella di destra. In altre parole, restituisce solo i record corrispondenti delle tabelle. Questo è il tipo più comune di JOIN SQL ed è quello predefinito quando non viene specificato il tipo di JOIN. Un OUTER JOIN restituisce tutte le righe di una tabella e alcune o tutte le righe di un'altra tabella (a seconda del tipo di OUTER JOIN). Oltre a FULL OUTER JOIN, esistono altri due tipi: A LEFT OUTER JOIN restituisce tutte le righe della tabella di sinistra, anche se non sono state trovate righe corrispondenti nella tabella di destra. Se non ci sono record corrispondenti nella tabella di destra, la query restituirà valori NULL per le colonne. Un RIGHT OUTER JOIN restituisce tutte le righe della tabella giusta. Se non ci sono record corrispondenti nella tabella di sinistra, vengono restituiti i valori NULL per quelle colonne - l'inverso di un LEFT JOIN. Una CROSS JOIN (chiamata anche JOIN cartesiana) restituisce ogni possibile combinazione di righe delle tabelle unite. Poiché restituisce tutte le combinazioni possibili, questo è l'unico tipo JOIN che non necessita di una condizione JOIN e quindi non richiede una clausola ON. Per uno sguardo più dettagliato su ciascuno dei tipi di JOIN, consultate l'articolo SQL JOIN Types Explained. Inoltre, il nostro SQL JOINs copre tutti i diversi tipi e casi d'uso delle JOIN in modo molto dettagliato. Approfondisce anche argomenti più avanzati, come i JOIN non equi e i JOIN multipli. Le JOIN sono una delle funzioni fondamentali e più comunemente utilizzate di SQL e una parte essenziale del kit di strumenti di qualsiasi utente di SQL. Sono presenti anche nelle domande più comuni dei colloqui di lavoro; consultate il nostro articolo Le 10 principali domande di colloquio sulle JOIN in SQL e come rispondere per avere suggerimenti utili. Aumentate la vostra conoscenza delle JOIN COMPLETE in SQL In questo tutorial avete appreso le specifiche di SQL FULL JOINs e i loro casi d'uso principali nella diagnosi dell'integrità dei dati. È stato anche fatto un breve confronto tra FULL JOINs e gli altri tipi di JOIN. Per comprendere davvero FULL JOINs, è necessario immergersi in profondità, fare qualche esercizio e mettersi alla prova. Consiglio vivamente di provare il nostro corso SQL JOINs per passare al livello successivo di questa importantissima funzione di SQL. Tags: sql imparare sql sql joins