Både inre och yttre sammanfogningar används för att kombinera data från två eller flera tabeller; det finns dock några viktiga skillnader! Läs den här artikeln för att ta reda på styrkorna för varje kommando och när du ska använda dem.
För att få ut det mesta av detta och våra andra lektioner, se till att öva på att använda exemplen!
Alla exempel för den här lektionen är baserade på Microsoft SQL Server Management Studio och AdventureWorks2012-databasen. Kom igång med dessa gratisverktyg med hjälp av min guide Komma igång med SQL Server.
Vad är skillnaden mellan inre och yttre anslutningar?
Inre och yttre sammanfogningar är kombinerade rader från två eller fler tabeller till ett enda resultat med hjälp av ett kopplingsvillkor. Kopplingsvillkoret anger hur kolumner från varje tabell matchas med varandra. I de flesta fall är målet att hitta lika värden mellan tabellerna och inkludera dessa matchningar.
Det vanligaste fallet för detta är när du matchar den främmande nyckeln för en tabell till den primära nyckeln för en annan , till exempel när du använder och ID för att slå upp ett värde.
Även om både inre och yttre sammanfogningar inkluderar rader från båda tabellerna när matchningsvillkoret lyckas skiljer de sig åt i hur de hanterar ett felaktigt matchningsvillkor. / p>
Inre sammanfogningar inkluderar inte rader som inte matchar; medan yttre fogar inkluderar dem.
Låt oss gräva lite djupare in i mekaniken för varje
Inner Join Mechanics
En inre fog används för att ge resultat genom att kombinera rader från två eller flera tabeller.
I det enklaste fallet, där det inte finns något kopplingsvillkor, skulle en inre koppling kombinera alla rader från en tabell med de från en annan. Om den första tabellen innehöll tre rader och den andra, fyra, skulle slutresultatet innehålla tolv (3 x 4 = 12)!
Syftet med kopplingsvillkoret är att begränsa vilka rader som kombineras. I de flesta fall begränsar vi rader till de som matchar en kolumn.
Om en person har mer än ett telefonnummer, görs mer än en matchning. Från detta kan du se att vi kan få tillbaka fler rader än vad vi har för varje person.
Omvänt, om en person inte har något telefonnummer, kommer det inte att finnas någon post i PersonPhone och ingen matchning gjorts. Denna person kommer inte att ingå i resultaten, eftersom endast de med matchningar ingår.
Låt oss prova ett exempel.
Exempel på inre anslutning
Antag HR-chefen vill skapa en telefonkatalog. De vill ha personens förnamn, efternamn, titel och telefonnummer. Vilken fråga kan du använda för att skapa den här?
Här är en som skulle göra tricket:
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
INNER JOIN anger vilka tabeller att gå med och matchvillkoret för att göra det. Villkoret PH.Phone NumberTyeID = 3 begränsar frågan till arbetsnummer.
Om du kör ovanstående får du följande resultat:
Tänk på att den inre kopplingen bara returnerar raden där matchningsvillkoret är sant. I det här exemplet ingår inte raderna där BusinessEntityID inte matchar. Detta kan vara ett problem om en person inte har ett telefonnummer eftersom de anställda inte skulle vara med i listan.
Om du vill inkludera dessa anställda kan du använda en yttre koppling.
Mekanik för yttre anslutning
En yttre koppling används för att returnera resultat genom att kombinera rader från två eller flera tabeller. Men till skillnad från en inre koppling kommer den yttre kopplingen att returnera varje rad från en angiven tabell, även om kopplingsvillkoret misslyckas.
Ta exemplet med telefonkatalogen ovan. Om HR-chefen ville lista alla anställda oavsett om de hade ett arbetstelefonnummer, skulle det vara så att använda en yttre koppling.
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
Du kan läs mer om vänster och höger yttre sammanfogningar i den här artikeln, för nu är det bara att förstå att när en VÄNSTER YTTRE JOIN används, ingår alla rader för tabellen i FROM-satsen i resultatet, även om en matchning inte hittas med annan tabell.
När en matchning inte hittas placeras en NULL i kolumnen.
Du kan se detta i aktion nedan:
Lägg märke till i exemplet Telefonnummer för Catherine Abel är NULL. Detta beror på att Katrins arbetsnummer inte är listat och ingen matchning hittades under anslutningen.
Om detta skulle ha varit en inre koppling, skulle denna rad inte ha inkluderats i resultaten.