Zowel innerlijke als buitenste joins worden gebruikt om gegevens uit twee of meer tabellen te combineren; er zijn echter enkele belangrijke verschillen! Lees dit artikel om de sterke punten van elk commando te ontdekken en wanneer je ze moet gebruiken.
Om het meeste uit deze en onze andere lessen te halen, moet je oefenen met het gebruik van de voorbeelden!
Alle voorbeelden voor deze les zijn gebaseerd op Microsoft SQL Server Management Studio en de AdventureWorks2012-database. Ga aan de slag met het gebruik van deze gratis tools met behulp van mijn Gids Aan de slag met SQL Server.
Wat is het verschil tussen Inner Joins en Outer Joins?
Binnenste en buitenste joins zijn combinatierijen van twee of meer tabellen in één resultaat met behulp van een join-voorwaarde. De join-voorwaarde geeft aan hoe kolommen uit elke tabel aan elkaar worden gekoppeld. In de meeste gevallen is het doel om gelijke waarden tussen tabellen te vinden en die overeenkomsten op te nemen.
Het meest voorkomende geval hiervoor is wanneer u de externe sleutel van de ene tabel vergelijkt met de primaire sleutel van een andere , zoals bij het gebruik van en ID om een waarde op te zoeken.
Hoewel zowel innerlijke als buitenste joins rijen uit beide tabellen bevatten wanneer de matchconditie succesvol is, verschillen ze in de manier waarop ze omgaan met een valse matchconditie.
Inner joins bevatten geen niet-overeenkomende rijen; terwijl buitenste joins ze wel bevatten.
Laten we wat dieper in de mechanica van elk graven
Inner Join Mechanics
Een inner join wordt gebruikt om resultaten te retourneren door rijen van twee of meer tabellen te combineren.
In het eenvoudigste geval, waar er geen voorwaarde is voor join, combineert een inner join alle rijen van de ene tabel met die van een andere. Als de eerste tabel drie rijen bevat, en de tweede vier, dan zou het eindresultaat twaalf bevatten (3 x 4 = 12)!
Het doel van de join-voorwaarde is om te beperken welke rijen worden gecombineerd. In de meeste gevallen beperken we rijen tot de rijen die overeenkomen met een kolom.
Als een persoon meer dan één telefoonnummer heeft, wordt er meer dan één overeenkomst gevonden. Hieruit kunt u zien dat we mogelijk meer rijen geretourneerd krijgen dan we hebben voor elke persoon.
Omgekeerd, als een persoon geen telefoonnummer heeft, zal er geen invoer zijn in PersonPhone en is er geen match gemaakt. Die specifieke persoon wordt niet opgenomen in de resultaten, omdat alleen diegenen met overeenkomsten worden opgenomen.
Laten we een voorbeeld proberen.
Voorbeeld innerlijke join
Stel dat de HR-manager wil een telefoonboek aanmaken. Ze willen de voornaam, achternaam, titel en telefoonnummers van de persoon. Welke query zou je kunnen gebruiken om dit te maken?
Hier is er een die de slag zou kunnen slaan:
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
De INNER JOIN specificeert welke tabellen om mee te doen en de wedstrijdvoorwaarde om dit te doen. De voorwaarde PH.Phone NumberTyeID = 3 beperkt de zoekopdracht tot werknummers.
Als u het bovenstaande uitvoert, krijgt u de volgende resultaten:
Houd er rekening mee dat de binnenste join alleen een rij retourneert waar de overeenkomstvoorwaarde is is waar. In dit voorbeeld zijn de rijen waar de BusinessEntityIDs niet overeenkomen, niet opgenomen. Dit kan een probleem zijn als een persoon geen telefoonnummer heeft, aangezien die werknemers niet op de lijst zouden staan.
Als u deze werknemers wilt opnemen, kunt u een outer join gebruiken.
Outer Join Mechanics
Een outer join wordt gebruikt om resultaten te retourneren door rijen van twee of meer tabellen te combineren. Maar in tegenstelling tot een inner join, zal de outer join elke rij van een gespecificeerde tabel retourneren, zelfs als de join-voorwaarde mislukt.
Neem het voorbeeld van de telefoonlijst hierboven. Als de HR-manager elke werknemer wilde vermelden, ongeacht of ze een werktelefoonnummer hadden, zou het gebruik van een outer join dit mogelijk maken.
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
Dat kan. leer meer over left en right outer joins in dit artikel, begrijp voor nu dat wanneer een LEFT OUTER JOIN wordt gebruikt, alle rijen voor de tabel in de FROM-component in het resultaat worden opgenomen, zelfs als er geen overeenkomst wordt gevonden met de andere tabel.
Als er geen overeenkomst wordt gevonden, wordt een NULL in de kolom geplaatst.
U kunt dit hieronder in actie zien:
Let in het voorbeeld op de Telefoonnummer voor Catherine Abel is NULL. Dit komt doordat het werknummer van Catherine niet wordt vermeld en er geen overeenkomst is gevonden tijdens de join.
Als dit een innerlijke join zou zijn geweest, dan zou deze rij niet in de resultaten zijn opgenomen.