Sia i join interni che quelli esterni vengono utilizzati per combinare i dati di due o più tabelle; tuttavia, ci sono alcune differenze fondamentali! Leggi questo articolo per scoprire i punti di forza di ogni comando e quando usarli.
Per ottenere il massimo da questa e dalle altre nostre lezioni, assicurati di esercitarti usando gli esempi!
gli esempi di questa lezione si basano su Microsoft SQL Server Management Studio e sul database AdventureWorks2012. Inizia a utilizzare questi strumenti gratuiti utilizzando la mia Guida Introduzione alluso di SQL Server.
Qual è la differenza tra Inner Joins e Outer Joins?
Inner e outer join sono righe combinate di due o più tabelle in un unico risultato utilizzando una condizione di join. La condizione di join specifica in che modo le colonne di ciascuna tabella vengono abbinate luna allaltra. Nella maggior parte dei casi, lobiettivo è trovare valori uguali tra le tabelle e includere tali corrispondenze.
Il caso più comune è quando si abbina la chiave esterna di una tabella alla chiave primaria di unaltra , ad esempio quando si utilizza e ID per cercare un valore.
Sebbene i join interni ed esterni includano righe di entrambe le tabelle quando la condizione di corrispondenza ha esito positivo, differiscono nel modo in cui gestiscono una condizione di falsa corrispondenza.
I join interni non includono righe non corrispondenti; mentre gli outer join li includono.
Analizziamo un po più a fondo i meccanismi di ciascuna
Inner join Mechanics
Un inner join viene utilizzato per restituire i risultati combinando righe di due o più tabelle.
Nel suo caso più semplice, dove non esiste una condizione di join, un inner join combina tutte le righe di una tabella con quelle di unaltra. Se la prima tabella conteneva tre righe e la seconda quattro, il risultato finale ne conterrebbe dodici (3 x 4 = 12)!
Lo scopo della condizione di join è limitare le righe da combinare. Nella maggior parte dei casi, limitiamo le righe a quelle che corrispondono a una colonna.
Se una persona ha più di un numero di telefono, viene creata più di una corrispondenza. Da questo, puoi vedere che potremmo ottenere più righe restituite di quante ne abbiamo per ogni persona.
Al contrario, se una persona non ha numero di telefono, non ci sarà una voce in PersonPhone e non verrà effettuata alcuna corrispondenza. Quella persona in particolare non verrà inclusa nei risultati, poiché sono incluse solo quelle con corrispondenze.
Proviamo un esempio.
Esempio di Inner Join
Supponiamo il responsabile delle risorse umane desidera creare una rubrica telefonica. Vogliono il nome, il cognome, il titolo e i numeri di telefono della persona. Quale query potresti usare per crearlo?
Eccone una che farebbe il trucco:
SELECT P.FirstName, P.LastName, P.Title, PH.PhoneNumberFROM Person.Person AS P INNER JOIN Person.PersonPhone AS PH ON P.BusinessEntityID = PH.BusinessEntityID AND PH.PhoneNumberTypeID = 3ORDER BY P.LastName
LINNER JOIN specifica quali tabelle partecipare e le condizioni di corrispondenza per farlo. La condizione PH.Phone NumberTyeID = 3 limita la query ai numeri di lavoro.
Se esegui quanto sopra, ottieni i seguenti risultati:
Tieni presente che il join interno restituisce solo la riga in cui la condizione di corrispondenza è vero. In questo esempio, le righe in cui BusinessEntityID non corrispondono non vengono incluse. Questo potrebbe essere un problema se una persona non ha un numero di telefono poiché quei dipendenti non sarebbero nellelenco.
Se desideri includere questi dipendenti, puoi utilizzare ununione esterna.
Meccaniche di join esterno
Un join esterno viene utilizzato per restituire risultati combinando righe da due o più tabelle. Ma a differenza di un join interno, il join esterno restituirà ogni riga da una tabella specificata, anche se la condizione di join fallisce.
Prendi lesempio della directory del telefono sopra. Se il responsabile delle risorse umane desidera elencare tutti i dipendenti indipendentemente dal fatto che abbiano un numero di telefono di lavoro, lutilizzo di un outer join lo farebbe.
SELECT P.FirstName, P.LastName, P.Title, PH.PhoneNumberFROM Person.Person AS P LEFT OUTER JOIN Person.PersonPhone AS PH ON P.BusinessEntityID = PH.BusinessEntityID AND PH.PhoneNumberTypeID = 3ORDER BY P.LastName
Puoi scopri di più sugli outer join sinistro e destro in questo articolo, per ora capisci che quando viene utilizzato un LEFT OUTER JOIN, tutte le righe per la tabella nella clausola FROM vengono incluse nel risultato, anche se non viene trovata una corrispondenza con la altra tabella.
Quando non viene trovata una corrispondenza, viene inserito un NULL nella colonna.
Puoi vederlo in azione di seguito:
Si noti nellesempio il PhoneNumber per Catherine Abel è NULL. Questo perché il numero di lavoro di Catherine non è elencato e non è stata trovata alcuna corrispondenza durante il join.
Se questo fosse stato un inner join, questa riga non sarebbe stata inclusa nei risultati.