Inner Join Vs Outer Join: Exacte verschillen met voorbeelden

Inner Join Vs Outer Join: Bereid u voor op de exacte verschillen tussen Inner Join en Outer Join

Voordat we de verschillen tussen Inner Join Vs Outer Join gaan onderzoeken, moeten we eerst weten wat een SQL JOIN is.

Een join clause wordt gebruikt om records te combineren of om de records van twee of meer tabellen te manipuleren door middel van een join voorwaarde. De join conditie geeft aan hoe kolommen uit elke tabel worden gematched tegen elkaar.

Join is gebaseerd op een gerelateerde kolom tussen deze tabellen. Een veelvoorkomend voorbeeld is de join tussen twee tabellen via de primary key-kolom en de foreign key-kolom.

INNER JOIN VS OUTER JOIN

Voorstel dat we een tabel hebben met het salaris van een werknemer en een andere tabel met de gegevens van de werknemer.

In dit geval is er een gemeenschappelijke kolom, zoals ID van de werknemer, die deze twee tabellen zal joinen. Deze werknemer ID-kolom zou de primaire sleutel van de werknemer details tabellen en foreign key in de werknemer salaris tabel.

Het is zeer belangrijk om een gemeenschappelijke sleutel tussen de twee entiteiten. U kunt denken aan een tabel als een entiteit en de sleutel als een gemeenschappelijke link tussen de twee tabellen die wordt gebruikt voor join operatie.

Basically, zijn er twee soorten Join in SQL dat wil zeggen Inner Join en Outer Join. Outer join is verder onderverdeeld in drie soorten, te weten Left Outer Join, Right Outer Join, en Full Outer Join.

In dit artikel zullen we zien het verschil tussen Inner Join en Outer Join in detail. We houden de Cross Joins en ongelijke joins buiten het bestek van dit artikel.

Wat is Inner Join?

Een Inner Join retourneert alleen de rijen die overeenkomende waarden hebben in beide tabellen (we overwegen hier de join wordt gedaan tussen de twee tabellen).

Wat is Outer Join?

De Outer Join omvat de overeenkomende rijen en een aantal van de niet-overeenkomende rijen tussen de twee tabellen. Een Outer join verschilt in principe van de Inner join in hoe het de false match conditie behandelt.

Er zijn 3 soorten Outer Join:

  • Left Outer Join: Geeft alle rijen van de LEFT tabel en overeenkomende records tussen beide tabellen.
  • Right Outer Join: Geeft alle rijen van de RECHTER tabel en overeenkomende records tussen beide tabellen.
  • Full Outer Join: Het combineert het resultaat van de Left Outer Join en Right Outer Join.

Verschil tussen Inner en Outer Join

Verschil tussen INNER JOIN en OUTER JOIN

Zoals in bovenstaand diagram is te zien, zijn er twee entiteiten, te weten tabel 1 en tabel 2, en beide tabellen delen enkele gemeenschappelijke gegevens.

Een Inner Join retourneert het gemeenschappelijke gebied tussen deze tabellen (het groen gearceerde gebied in het bovenstaande diagram), d.w.z. alle records die gemeenschappelijk zijn tussen tabel 1 en tabel 2.

Een Left Outer Join retourneert alle rijen uit tabel 1 en alleen de rijen uit tabel 2 die ook gemeenschappelijk zijn met tabel 1. Een Right Outer Join retourneert alle rijen uit tabel 1 en alleen de rijen uit tabel 2 die ook gemeenschappelijk zijn met tabel 1. Een Right Outer Join zal juist het tegenovergestelde doen. Het zal alle records van tabel 2 geven en alleen de overeenkomende records van tabel 1.

Verder zal een Full Outer Join ons alle records van tabel 1 en tabel 2 geven.

Laten we beginnen met een voorbeeld om dit duidelijker te maken.

Voorstel dat we twee tabellen hebben: EmpDetails en EmpSalaris.

EmpDetails tabel:

EmployeeID EmployeeName
1 John
2 Samantha
3 Hakuna
4 Silky
5 Ram
6 Arpit
7 Lily
8 Sita
9 Farah
10 Jerry

EmpSalaris tabel:

EmployeeID EmployeeName EmployeeSalary
1 John 50000
2 Samantha 120000
3 Hakuna 75000 4 Silky 25000
5 Ram 150000
6 Arpit 80000
11 Rose 90000
12 Sakshi 45000
13 Jack 250000

Laten we een Inner Join doen op deze twee tabellen en het resultaat bekijken:

Query:

SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalaryFROM EmpDetails INNER JOIN EmpSalaryON EmpDetails. EmployeeID = EmpSalary. EmployeeID;

Resultaat:

EmployeeID EmployeeName EmployeeSalary
1 John 50000
2 Samantha 120000
3 Hakuna 75000
4 Silky 25000
5 Ram 150000
6 Arpit 80000

In de bovenstaande resultatenset, kun je zien dat Inner Join de eerste 6 records heeft geretourneerd die aanwezig waren in zowel EmpDetails als EmpSalary met een overeenkomende sleutel, nl.d.w.z. EmployeeID. Dus, als A en B twee entiteiten zijn, zal de Inner Join de resultatenset teruggeven die gelijk is aan ‘Records in A and B’, gebaseerd op de overeenkomende sleutel.

Laten we nu zien wat een Left Outer Join zal doen.

Query:

SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalaryFROM EmpDetails LEFT JOIN EmpSalaryON EmpDetails. EmployeeID = EmpSalary. EmployeeID;

Result:

EmployeeID EmployeeName EmployeeSalary
1 John 50000
2 Samantha 120000
3 Hakuna 75000
4 Silky 25000
5 Ram 150000
6 Arpit 80000
7 Lily NULL
8 Sita NULL
9 Farah NULL
10 Jerry NULL

In de bovenstaande resultatenset, kun je zien dat de left outer join alle 10 records heeft teruggegeven uit de LEFT tabel, d.w.z.EmpDetails-tabel en aangezien de eerste 6 records overeenkomen, heeft het het salaris van de werknemer voor deze overeenkomende records teruggegeven.

Zoals de rest van de records geen overeenkomende sleutel in de RECHTER tabel hebben, d.w.z. EmpSalary-tabel, heeft het NULL teruggegeven die overeenkomen met die. Omdat Lily, Sita, Farah, en Jerry geen overeenkomende werknemer-ID in de EmpSalary tabel hebben, wordt hun salaris weergegeven als NULL in de resultatenset.

Dus, als A en B twee entiteiten zijn, dan zal de left outer join de resultatenset teruggeven die gelijk zal zijn aan ‘Records in A NOT B’, gebaseerd op de overeenkomende sleutel.

Nu laten we eens kijken wat de Right Outer Join doet.

Query:

SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalaryFROM EmpDetails RIGHT join EmpSalaryON EmpDetails. EmployeeID = EmpSalary. EmployeeID;

Result:

EmployeeID EmployeeName EmployeeSalary
1 John 50000
2 Samantha 120000
3 Hakuna 75000
4 Silky 25000
5 Ram 150000
6 Arpit 80000
NULL NULL 90000
NULL NULL 250000
NULL NULL 250000

In de bovenstaande resultatenset, kunt u zien dat de Right Outer Join precies het tegenovergestelde heeft gedaan van de left join. Het heeft alle salarissen uit de rechtertabel, d.w.z. EmpSalary tabel, teruggegeven.

Maar, omdat Rose, Sakshi, en Jack geen overeenkomende werknemer-ID in de linkertabel, d.w.z. EmpDetails tabel hebben, hebben we hun Employee ID en EmployeeName als NULL uit de linkertabel gekregen.

Dus, als A en B twee entiteiten zijn, dan zal de right outer join de resultatenset teruggeven die gelijk zal zijn aan ‘Records in B NOT A’, gebaseerd op de overeenkomende sleutel.

Laten we ook eens kijken wat de resultatenset zal zijn als we een select operatie doen op alle kolommen in beide tabellen.

Query:

SELECT *FROM EmpDetails RIGHT JOIN EmpSalaryON EmpDetails. EmployeeID = EmpSalary. EmployeeID;

Result:

EmployeeID EmployeeName EmployeeID EmployeeName EmployeeSalary
1 John 1 John 50000
2 Samantha 2 120000
3 Hakuna 3 Hakuna 75000
4 Silky 4 Silky 25000
5 Ram 5 150000
6 Arpit 6 Arpit 80000
NULL NULL 11 Rose 90000
NULL NULL 12 Sakshi 250000
NULL NULL 13 Jack 250000

Nu, laten we overgaan tot de volledige toetreding.

Een full outer join wordt gedaan wanneer we alle gegevens uit beide tabellen willen hebben, ongeacht of er een overeenkomst is of niet. Dus, als ik alle werknemers wil, zelfs als ik geen overeenkomende sleutel vind, zal ik een query uitvoeren zoals hieronder getoond.

Query:

SELECT *FROM EmpDetails FULL JOIN EmpSalaryON EmpDetails. EmployeeID = EmpSalary. EmployeeID;

Result:

NULL

EmployeeID EmployeeName EmployeeID EmployeeName EmployeeSalary
1 John 1 John 50000
2 Samantha 2 120000
3 Hakuna 3 Hakuna 75000
4 Silky 4 25000
5 Ram 5 Ram 150000
6 Arpit 6 80000
7 Lily NULL NULL NULL
8 Sita NULL NULL
9 Farah NULL NULL NULL
10 Jerry NULL NULL NULL
NULL NULL 11 Rose 90000
NULL NULL 12 Sakshi 250000
NULL NULL 13 Jack 250000

U kunt in de bovenstaande resultaten zien dat de eerste zes records in beide tabellen overeenkomen, we alle gegevens hebben zonder enige NULL. De volgende vier records bestaan in de linkertabel, maar niet in de rechtertabel, zodat de overeenkomstige gegevens in de rechtertabel NULL zijn.

De laatste drie records bestaan in de rechtertabel en niet in de linkertabel, zodat we NULL hebben in de overeenkomstige gegevens van de linkertabel. Dus, als A en B zijn twee entiteiten, zal de full outer join retourneren de resultaten set die gelijk zal zijn aan ‘Records in A EN B’, ongeacht de overeenkomende sleutel.

Theoretisch is het een combinatie van Left Join en Right Join.

Prestaties

Laten we vergelijken een Inner Join tegen een Left Outer Join in de SQL-server. Praten over de snelheid van de operatie, een links buiten JOIN is natuurlijk niet sneller dan een inner join.

Volgens de definitie, een buitenste join, of het nu de linker of rechts, het moet al het werk van een inner join uit te voeren, samen met het extra werk null-uitbreiding van de resultaten. Van een outer join wordt verwacht dat hij een groter aantal records teruggeeft, waardoor de totale uitvoeringstijd alleen al door de grotere resultatenverzameling toeneemt.

Dus is een outer join langzamer dan een inner join.

Daarnaast kunnen er enkele specifieke situaties zijn waarin de Left join sneller zal zijn dan een Inner join, maar we kunnen ze niet door elkaar halen, omdat een left outer join functioneel niet gelijkwaardig is aan een inner join.

Laten we een geval bespreken waarin de Left Join sneller zou kunnen zijn dan de Inner Join. Als de tabellen die betrokken zijn bij de join operatie zijn te klein, laten we zeggen ze hebben minder dan 10 records en de tabellen niet beschikken over voldoende indexen om de query te dekken, in dat geval, de Left Join is over het algemeen sneller dan Inner Join.

Laten we de twee onderstaande tabellen en doe een INNER JOIN en een LEFT OUTER JOIN tussen hen als een voorbeeld:

CREATE TABLE #Table1(ID int NOT NULL PRIMARY KEY,Name varchar(50) NOT NULL)INSERT #Table1 (ID, Name) VALUES (1, 'A')INSERT #Table1 (ID, Name) VALUES (2, 'B')INSERT #Table1 (ID, Name) VALUES (3, 'C')INSERT #Table1 (ID, Name) VALUES (4, 'D')INSERT #Table1 (ID, Name) VALUES (5, 'E')CREATE TABLE #Table2(ID int NOT NULL PRIMARY KEY,Name varchar(50) NOT NULL)INSERT #Table2 (ID, Name) VALUES (1, 'A')INSERT #Table2 (ID, Name) VALUES (2, 'B')INSERT #Table2 (ID, Name) VALUES (3, 'C')INSERT #Table2 (ID, Name) VALUES (4, 'D')INSERT #Table2 (ID, Name) VALUES (5, 'E')SELECT *FROM #Table1 t1INNER JOIN #Table2 t2ON t2.Name = t1.Name

ID Naam
1 1 A 1 A
2 2 B 2 B
3 3 C 3 C
4 4 D 4 D
5 5 E E
SELECT * FROM (SELECT 38 AS bah) AS foo JOIN (SELECT 35 AS bah) AS barON (55=55);
ID Name ID Name
1 1 A 1 A
2 2 B 2 B
3 3 C 3 C
4 4 D 4 D
5 5 E 5 E

Zoals u hierboven kunt zien, hebben beide query’s hetzelfde resultaat opgeleverd. In dit geval, als je het uitvoeringsplan van beide queries bekijkt, zul je zien dat de inner join meer heeft gekost dan de outer join. Dit komt omdat de SQL server voor een inner join een hash match uitvoert, terwijl hij voor de left join geneste lussen uitvoert.

Een hash match is normaal gesproken sneller dan geneste lussen. Maar in dit geval, omdat het aantal rijen zo klein is en er geen index te gebruiken is (omdat we join op de naamkolom doen), is de hash operatie een zeer dure inner join query geworden.

Hoewel, als je de matching key in de join query verandert van Name in ID en als er een groot aantal rijen in de tabel staan, dan zul je zien dat de inner join sneller zal zijn dan de left outer join.

MS Access Inner and Outer Join

Wanneer je meerdere gegevensbronnen gebruikt in een MS Access query, dan pas je JOINs toe om te bepalen welke records je wilt zien, afhankelijk van hoe de gegevensbronnen met elkaar zijn verbonden.

In een inner join worden alleen de gerelateerde records uit beide tabellen gecombineerd in een enkele set resultaten. Dit is een standaard join in Access en de meest gebruikte ook. Als je een join toepast, maar niet expliciet aangeeft welk type join het is, dan gaat Access ervan uit dat het een inner join is.

In outer joins worden alle gerelateerde gegevens uit beide tabellen correct gecombineerd, plus alle resterende rijen uit één tabel. In full outer joins worden alle gegevens waar mogelijk gecombineerd.

Left Join vs Left Outer Join

In SQL server is het sleutelwoord outer optioneel wanneer u left outer join toepast. Het maakt dus geen verschil of je ‘LEFT OUTER JOIN’ of ‘LEFT JOIN’ schrijft, want beide geven hetzelfde resultaat.

Een LEFT JOIN B is een equivalente syntaxis voor Een LEFT OUTER JOIN B.

Hieronder vindt u de lijst met equivalente syntaxis in de SQL-server:

equivalente syntaxis in SQL-server

Left Outer Join vs Right Outer Join

Dit verschil hebben we in dit artikel al gezien. U kunt de Left Outer Join- en Right Outer Join-query’s en -resultaten raadplegen om het verschil te zien.

Het belangrijkste verschil tussen de Left Join en Right Join ligt in het opnemen van niet-gematchte rijen. Left outer join omvat de niet-gematchte rijen van de tabel die aan de linkerkant van de join-clausule terwijl een Right outer join omvat de niet-gematchte rijen van de tabel die aan de rechterkant van de join-clausule.

Mensen vragen wel wat is beter om te gebruiken, dat wil zeggen links aansluiten of rechts aansluiten? In principe zijn het dezelfde soort operaties, behalve dat de argumenten zijn omgedraaid. Dus, als je vraagt welke join je moet gebruiken, vraag je eigenlijk of je a<b of b>a moet schrijven. Het is gewoon een kwestie van voorkeur.

In het algemeen geven mensen er de voorkeur aan om Left join te gebruiken in hun SQL query. Ik zou voorstellen dat u consistent te blijven in de manier waarop u het schrijven van de query om eventuele verwarring te voorkomen bij de interpretatie van de query.

We hebben alles gezien over Inner join en alle soorten Outer joins tot nu toe. Laten we snel het verschil tussen Inner Join en Outer Join samenvatten.

Verschil tussen Inner Join en Outer Join in tabelvorm

Inner Join Outer Join
Retourneert alleen de rijen die overeenkomende waarden in beide tabellen hebben. Bevat zowel de overeenkomende rijen als enkele van de niet-overeenkomende rijen tussen de twee tabellen.
In het geval dat er een groot aantal rijen in de tabellen is en er een index moet worden gebruikt, is een INNER JOIN in het algemeen sneller dan een OUTER JOIN. In het algemeen is een OUTER JOIN langzamer dan een INNER JOIN, omdat er meer records moeten worden geretourneerd in vergelijking met een INNER JOIN. Er zijn echter enkele specifieke scenario’s waarin OUTER JOIN sneller is.
Wanneer er geen overeenkomst wordt gevonden, wordt er niets geretourneerd. Wanneer er geen overeenkomst wordt gevonden, wordt er een NULL geplaatst in de geretourneerde kolomwaarde.
Gebruik INNER JOIN wanneer u gedetailleerde informatie van een specifieke kolom wilt opzoeken. Gebruik OUTER JOIN wanneer u de lijst van alle informatie in de twee tabellen wilt weergeven.
INNER JOIN werkt als een filter. Er moet een overeenkomst zijn tussen beide tabellen om gegevens te kunnen retourneren. Ze werken als data-add-ons.
Impliciete join-notatie bestaat voor inner join die tabellen op een door komma’s gescheiden manier in de FROM-clausule opsomt om te worden samengevoegd.
Voorbeeld: SELECT * FROM product, category WHERE product.CategoryID = category.CategoryID;
Er bestaat geen impliciete join-notatie voor outer join.
Hieronder ziet u de visualisatie van een inner join:
visualisatie van een inner join
Hieronder ziet u de visualisatie van een outer join
visualisatie van een outer join

Inner en Outer Join vs Union

Soms verwarren we Join en Union en dit is ook een van de meest gestelde vragen in SQL interviews. We hebben al gezien wat het verschil is tussen inner join en outer join . Laten we nu eens kijken hoe een JOIN verschilt van een UNION.

UNION plaatst een rij query’s achter elkaar, terwijl join een cartesisch product maakt en deze subset. Dus, UNION en JOIN zijn totaal verschillende operaties.

Laten we de onderstaande twee query’s in MySQL en zie hun resultaat.

UNION Query:

SELECT 28 AS bahUNIONSELECT 35 AS bah;

Resultaat:

Bah
1 28
2 35

JOIN Query:

SELECT * FROM(SELECT 38 AS bah) AS fooJOIN(SELECT 35 AS bah) AS barON (55=55);

Resultaat:

foo Bar
1 38 35

Een UNION-bewerking plaatst het resultaat van twee of meer query’s in één enkele resultaatverzameling. Deze resultaatverzameling bevat alle records die via alle bij de UNION-operatie betrokken query’s zijn teruggezonden. In feite worden met een UNION dus de twee resultaatreeksen samengevoegd.

Een join-operatie haalt gegevens op uit twee of meer tabellen op basis van de logische relaties tussen deze tabellen, d.w.z. op basis van de join-conditie. Bij een join query worden gegevens uit de ene tabel gebruikt om records uit een andere tabel te selecteren. Hiermee kunt u gelijksoortige gegevens die in verschillende tabellen aanwezig zijn, met elkaar in verband brengen.

Om het heel eenvoudig te begrijpen, kunt u zeggen dat een UNION rijen uit twee tabellen combineert, terwijl een join kolommen uit twee of meer tabellen combineert. Beide worden dus gebruikt om de gegevens uit n tabellen te combineren, maar het verschil zit hem in de manier waarop de gegevens worden gecombineerd.

Hieronder vindt u de picturale voorstellingen van UNION en JOIN.

UNION en JOIN1

Het bovenstaande is een grafische voorstelling van een join-operatie die laat zien dat elke record in de resultatenset kolommen uit beide tabellen bevat, d.w.z. tabel A en tabel B. Dit resultaat wordt geretourneerd op basis van de join-conditie die in de query is toegepast.

Een join is in het algemeen het resultaat van denormalisatie (het tegenovergestelde van normalisatie) en gebruikt de foreign key van een tabel om de kolomwaarden op te zoeken door gebruik te maken van de primaire key in een andere tabel.

UNION en JOIN2

Het bovenstaande is een grafische voorstelling van een UNION-bewerking, waarbij wordt weergegeven dat elke record in de resultatenset een rij uit een van beide tabellen is. Het resultaat van de UNION heeft dus de rijen uit tabel A en tabel B gecombineerd.

Verder lezen =>> MySQL UNION uitgelegd met voorbeelden

Conclusie

In dit artikel hebben we de belangrijkste verschillen gezien tussen de Inner Join en Outer Join in SQL. We hebben ook de classificatie van een Outer Join gezien, d.w.z. Left join, Right join en Full join. We hebben gezien hoe elk van deze join types werkt en hoe ze van elkaar verschillen.

We hebben ook een performance vergelijking gemaakt tussen deze join types. We hebben ook besproken hoe een join verschilt van een union.

Lees ook =>> MySQL Join Types

Hoop dat dit artikel u heeft geholpen bij het wegnemen van uw twijfels over de verschillen tussen de verschillende join types. We zijn er zeker van dat dit u inderdaad zal doen beslissen welk join type te kiezen op basis van de gewenste resultatenset.