inner join vs outer join
Inner Join versus Outer Join: maak je klaar om de exacte verschillen tussen Inner en Outer Join te ontdekken
Voordat we de verschillen tussen Inner Join versus Outer Join gaan onderzoeken, laten we eerst eens kijken wat een SQL JOIN is?
Een join-clausule wordt gebruikt om records te combineren of om de records van twee of meer tabellen te manipuleren via een join-voorwaarde. De join-voorwaarde geeft aan hoe kolommen uit elke tabel met elkaar worden vergeleken.
Join is gebaseerd op een gerelateerde kolom tussen deze tabellen. Een bekend voorbeeld is de koppeling tussen twee tabellen via de kolom met de primaire sleutel en de kolom met de externe sleutel.
Stel dat we een tabel hebben met het salaris van de werknemer en er is een andere tabel met de gegevens van de werknemer.
In dit geval zal er een gemeenschappelijke kolom zijn, zoals de werknemers-ID, die deze twee tabellen samenvoegt. Deze kolom Werknemers-ID zou de primaire sleutel zijn van de tabellen met werknemersgegevens en de externe sleutel in de salaristabel voor werknemers.
Het is erg belangrijk om een gemeenschappelijke sleutel tussen de twee entiteiten te hebben. U kunt een tabel zien als een entiteit en de sleutel als een gemeenschappelijke koppeling tussen de twee tabellen die wordt gebruikt voor het samenvoegen.
core java interviewvragen en antwoorden voor ervaren
In principe zijn er twee soorten Join in SQL, d.w.z. Inner Join en Outer Join Outer join is verder onderverdeeld in drie typen, d.w.z. Linker Outer Join, Right Outer Join en Full Outer Join.
In dit artikel zullen we het verschil zien tussen Inner Join en Outer Join in detail. We zullen de Cross Joins en Unequal Joins buiten het bestek van dit artikel houden.
Wat je leert:
- Wat is Inner Join?
- Wat is Outer Join?
- Verschil tussen Inner en Outer Join
- Prestatie
- MS Access Inner en Outer Join
- Linker verbinding versus linker buitenste verbinding
- Linker buitenste verbinding versus rechter buitenste verbinding
- Verschil tussen Inner Join en Outer Join in tabelvorm
- Innerlijke en uiterlijke Join versus Union
- Gevolgtrekking
- Aanbevolen literatuur
Wat is Inner Join?
Een Inner Join retourneert alleen de rijen met overeenkomende waarden in beide tabellen (we beschouwen hier dat de join wordt uitgevoerd tussen de twee tabellen).
Wat is Outer Join?
De Outer Join bevat zowel de overeenkomende rijen als enkele niet-overeenkomende rijen tussen de twee tabellen. Een Outer join verschilt fundamenteel van de Inner join in de manier waarop deze omgaat met de valse matchconditie.
Er zijn 3 soorten Outer Join:
- Linker Outer Join : Retourneert alle rijen uit de LINKER-tabel en overeenkomende records tussen beide tabellen.
- Rechts buitenste verbinding : Retourneert alle rijen uit de tabel RIGHT en overeenkomende records tussen beide tabellen.
- Volledige Outer Join : Het combineert het resultaat van de Left Outer Join en Right Outer Join.
Verschil tussen Inner en Outer Join
(beeld bron
Zoals getoond in het bovenstaande diagram, zijn er twee entiteiten, d.w.z. 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 die rijen uit tabel 2 die ook in tabel 1 voorkomen. Een Right Outer Join doet precies het tegenovergestelde. Het geeft alle records uit tabel 2 en alleen de overeenkomstige overeenkomende records uit tabel 1.
Bovendien geeft een Full Outer Join ons alle records van tabel 1 en tabel 2.
Laten we beginnen met een voorbeeld om dit duidelijker te maken.
Stel dat we er twee hebben tafels: EmpDetails en EmpSalary
EmpDetails Tabel:
EmployeeID | Naam werknemer |
7 | Lelie |
1 | John |
twee | Samantha |
3 | Geen |
4 | Zijdezacht |
5 | RAM |
6 | Arpit |
8 | Sita |
9 | Farah |
10 | Jerry |
EmpSalary Tabel:
EmployeeID | Naam werknemer | Werknemer Salaris |
---|---|---|
elf | Roos | 90000 |
1 | John | 50.000 |
twee | Samantha | 120000 |
3 | Geen | 75000 |
4 | Zijdezacht | 25000 |
5 | RAM | 150000 |
6 | Arpit | 80000 |
12 | Sakshi | 45000 |
13 | Jack | 250.000 |
Laten we een Inner Join doen op deze twee tafels en het resultaat bekijken:
Vraag:
Resultaat:
EmployeeID | Naam werknemer | Werknemer Salaris |
---|---|---|
7 | Lelie | NUL |
1 | John | 50.000 |
twee | Samantha | 120000 |
3 | Geen | 75000 |
4 | Zijdezacht | 25000 |
5 | RAM | 150000 |
6 | Arpit | 80000 |
In de bovenstaande resultatenset kunt u zien dat Inner Join de eerste 6 records heeft geretourneerd die aanwezig waren in zowel EmpDetails als EmpSalary met een overeenkomende sleutel, d.w.z. EmployeeID. Als A en B twee entiteiten zijn, retourneert de Inner Join de resultatenset die gelijk is aan ‘Records in A en B’, op basis van de overeenkomende sleutel.
Laten we nu eens kijken wat een Left Outer Join zal doen.
Vraag:
Resultaat:
EmployeeID | Naam werknemer | Werknemer Salaris |
---|---|---|
1 | John | 50.000 |
twee | Samantha | 120000 |
3 | Geen | 75000 |
4 | Zijdezacht | 25000 |
5 | RAM | 150000 |
6 | Arpit | 80000 |
8 | Sita | NUL |
9 | Farah | NUL |
10 | Jerry | NUL |
In de bovenstaande resultatenset kunt u zien dat de linker buitenste join alle 10 records uit de LINKER-tabel heeft geretourneerd, d.w.z. de EmpDetails-tabel en aangezien de eerste 6 records overeenkomen, heeft het het werknemerssalaris voor deze overeenkomende records geretourneerd.
Aangezien de rest van de records geen overeenkomende sleutel heeft in de tabel RIGHT, d.w.z. de tabel EmpSalary, heeft deze NULL geretourneerd die overeenkomt met die. Aangezien Lily, Sita, Farah en Jerry geen overeenkomend werknemers-ID hebben in de EmpSalary-tabel, wordt hun salaris weergegeven als NULL in de resultatenset.
Dus als A en B twee entiteiten zijn, retourneert de linksbuitenste join de resultaatset die gelijk is aan ‘Records in A NOT B’, op basis van de overeenkomende sleutel.
Laten we nu kijken wat de Right Outer Join doet.
Vraag:
Resultaat:
EmployeeID | Naam werknemer | Werknemer Salaris |
---|---|---|
NUL | NUL | 90000 |
1 | John | 50.000 |
twee | Samantha | 120000 |
3 | Geen | 75000 |
4 | Zijdezacht | 25000 |
5 | RAM | 150000 |
6 | Arpit | 80000 |
NUL | NUL | 250.000 |
NUL | NUL | 250.000 |
In de bovenstaande resultatenset kun je zien dat de Right Outer Join precies het tegenovergestelde heeft gedaan van de linker join. Het heeft alle salarissen uit de juiste tabel geretourneerd, d.w.z. de EmpSalary-tabel.
Maar aangezien Rose, Sakshi en Jack geen overeenkomend werknemers-ID hebben in de linkertabel, d.w.z. de tabel EmpDetails, hebben we hun werknemers-ID en werknemersnaam als NULL uit de linkertabel.
Dus als A en B twee entiteiten zijn, retourneert de rechter buitenste join de resultatenset die gelijk is aan ‘Records in B NOT A’, op basis van de overeenkomende sleutel.
Laten we ook zien wat de resultaatset zal zijn als we een selectiebewerking uitvoeren op alle kolommen in beide tabellen.
Vraag:
Resultaat:
EmployeeID | Naam werknemer | EmployeeID | Naam werknemer | Werknemer Salaris |
---|---|---|---|---|
NUL | NUL | elf | Roos | 90000 |
1 | John | 1 | John | 50.000 |
twee | Samantha | twee | Samantha | 120000 |
3 | Geen | 3 | Geen | 75000 |
4 | Zijdezacht | 4 | Zijdezacht | 25000 |
5 | RAM | 5 | RAM | 150000 |
6 | Arpit | 6 | Arpit | 80000 |
NUL | NUL | 12 | Sakshi | 250.000 |
NUL | NUL | 13 | Jack | 250.000 |
Laten we nu naar de Full Join gaan.
Een volledige outer join wordt gedaan als we alle gegevens van beide tabellen willen, ongeacht of er een overeenkomst is of niet. Daarom, als ik alle werknemers wil, zelfs als ik geen overeenkomende sleutel vind, zal ik een zoekopdracht uitvoeren zoals hieronder wordt weergegeven.
Vraag:
Resultaat:
EmployeeID | Naam werknemer | EmployeeID | Naam werknemer | Werknemer Salaris |
---|---|---|---|---|
7 | Lelie | NUL | NUL | NUL |
1 | John | 1 | John | 50.000 |
twee | Samantha | twee | Samantha | 120000 |
3 | Geen | 3 | Geen | 75000 |
4 | Zijdezacht | 4 | Zijdezacht | 25000 |
5 | RAM | 5 | RAM | 150000 |
6 | Arpit | 6 | Arpit | 80000 |
8 | Sita | NUL | NUL | NUL |
9 | Farah | NUL | NUL | NUL |
10 | Jerry | NUL | NUL | NUL |
NUL | NUL | elf | Roos | 90000 |
NUL | NUL | 12 | Sakshi | 250.000 |
NUL | NUL | 13 | Jack | 250.000 |
U kunt in de bovenstaande resultatenset zien dat, aangezien de eerste zes records in beide tabellen overeenkomen, we alle gegevens hebben zonder NULL. De volgende vier records staan in de linker tabel maar niet in de rechter tabel, dus de corresponderende gegevens in de rechter tabel zijn NULL.
De laatste drie records staan in de rechtertabel en niet in de linkertabel, daarom hebben we NULL in de overeenkomstige gegevens van de linkertabel. Dus als A en B twee entiteiten zijn, retourneert de volledige outer join de resultatenset die gelijk is aan ‘Records in A AND B’, ongeacht de overeenkomende sleutel.
Theoretisch is het een combinatie van Left Join en Right Join.
Prestatie
Laten we een Inner Join vergelijken met een Left Outer Join in de SQL-server. Over de snelheid van werken gesproken, een linker buitenste JOIN is natuurlijk niet sneller dan een innerlijke join.
Volgens de definitie moet een buitenste verbinding, of het nu links of rechts is, al het werk van een binnenste verbinding uitvoeren, samen met het extra werk dat de resultaten op nul zet. Van een outer join wordt verwacht dat het een groter aantal records retourneert, waardoor de totale uitvoeringstijd verder toeneemt, alleen al vanwege de grotere resultaatset.
Een buitenste verbinding is dus langzamer dan een binnenste verbinding.
Bovendien kunnen er een aantal specifieke situaties zijn waarin de linkse join sneller zal zijn dan een innerlijke join, maar we kunnen ze niet door elkaar vervangen omdat een linkse outer join functioneel niet gelijk is aan een inner join.
Laten we een geval bespreken waarbij de Left Join mogelijk sneller is dan de Inner Join. Als de tabellen die bij de join-bewerking betrokken zijn, te klein zijn, bijvoorbeeld dat ze minder dan 10 records hebben en de tabellen niet voldoende indexen hebben om de query te dekken, dan is de Left Join over het algemeen sneller dan Inner Join.
Laten we de twee onderstaande tabellen maken en een INNER JOIN en een LEFT OUTER JOIN ertussen doen als voorbeeld:
ID kaart | Naam | ID kaart | Naam | |
---|---|---|---|---|
Hieronder ziet u de visualisatie van een inner join: ![]() | Hieronder ziet u de visualisatie van een buitenste verbinding ![]() | |||
1 | 1 | NAAR | 1 | NAAR |
twee | twee | B. | twee | B. |
3 | 3 | C | 3 | C |
4 | 4 | D | 4 | D |
5 | 5 | IS | 5 | IS |
ID kaart | Naam | ID kaart | Naam | |
---|---|---|---|---|
1 | 1 | NAAR | 1 | NAAR |
twee | twee | B. | twee | B. |
3 | 3 | C | 3 | C |
4 | 4 | D | 4 | D |
5 | 5 | IS | 5 | IS |
Zoals u hierboven kunt zien, hebben beide query's dezelfde resultatenset geretourneerd. Als u in dit geval het uitvoeringsplan van beide query's bekijkt, zult u zien dat de binnenste join meer heeft gekost dan de buitenste join. Dit komt omdat, voor een inner join, de SQL-server een hash-overeenkomst uitvoert, terwijl het geneste lussen doet voor de linker join.
Een hash-overeenkomst is normaal gesproken sneller dan de geneste lussen. Maar in dit geval, omdat het aantal rijen zo klein is en er geen index is om te gebruiken (zoals we aan het doen zijn in de naamkolom), is de hash-bewerking een duurste innerlijke join-query gebleken.
Als u echter de overeenkomende sleutel in de join-query wijzigt van Naam in ID en als er een groot aantal rijen in de tabel staat, zult u zien dat de binnenste join sneller zal zijn dan de linker buitenste join.
MS Access Inner en Outer Join
Wanneer u meerdere gegevensbronnen in MS Access-query's gebruikt, past u JOINs toe om de records te beheren die u wilt zien, afhankelijk van hoe de gegevensbronnen met elkaar zijn verbonden.
Bij een inner join worden alleen de gerelateerde uit beide tabellen gecombineerd in één resultaatset. Dit is een standaard join in Access en ook de meest gebruikte. Als u een join toepast maar niet expliciet specificeert welk type Join het is, dan gaat de 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. Bij volledige outer joins worden alle gegevens zoveel mogelijk gecombineerd.
Linker verbinding versus linker buitenste verbinding
In SQL Server is het trefwoord outer optioneel wanneer u left outer join toepast. Het maakt dus geen enkel verschil of u ‘LEFT OUTER JOIN’ of ‘LEFT JOIN’ schrijft, aangezien beide u hetzelfde resultaat zullen geven.
A LEFT JOIN B is een syntaxis die gelijk is aan A LEFT OUTER JOIN B.
Hieronder vindt u de lijst met equivalente syntaxis in de SQL-server:
(beeld bron
Linker buitenste verbinding versus rechter buitenste verbinding
We hebben dit verschil al in dit artikel gezien. U kunt de query's en resultaatset Left Outer Join en Right Outer Join raadplegen om het verschil te zien.
Het belangrijkste verschil tussen de Left Join en Right Join ligt in het opnemen van niet-overeenkomende rijen. Linker buitenste join bevat de niet-overeenkomende rijen van de tabel die zich aan de linkerkant van de join-clausule bevindt, terwijl een rechter buitenste join de niet-overeenkomende rijen van de tabel aan de rechterkant van de join-clausule bevat.
Mensen vragen wat het beste is om te gebruiken, d.w.z. Left join of Right join? In wezen zijn het hetzelfde type bewerkingen, behalve dat hun argumenten zijn omgekeerd. Dus als je vraagt welke join je moet gebruiken, vraag je eigenlijk of je een een. Het is gewoon een kwestie van voorkeur.
Over het algemeen geven mensen de voorkeur aan Left join in hun SQL-query. Ik zou willen voorstellen dat u consequent blijft in de manier waarop u de vraag schrijft om verwarring bij het interpreteren van de vraag te voorkomen.
We hebben tot nu toe alles gezien over Inner join en alle soorten Outer joins. Laten we snel het verschil tussen Inner Join en Outer Join samenvatten.
Verschil tussen Inner Join en Outer Join in tabelvorm
Innerlijke verbinding | Outer Join |
---|---|
Retourneert alleen de rijen met overeenkomende waarden in beide tabellen. | Bevat de overeenkomende rijen en enkele niet-overeenkomende rijen tussen de twee tabellen. |
Als de tabellen een groot aantal rijen bevatten en er is een index om te gebruiken, is INNER JOIN over het algemeen sneller dan OUTER JOIN. | Over het algemeen is een OUTER JOIN langzamer dan een INNER JOIN omdat het meer records moet retourneren in vergelijking met INNER JOIN. Er kunnen echter enkele specifieke scenario's zijn waarin OUTER JOIN sneller is. |
Als een match niet wordt gevonden, wordt er niets geretourneerd. | Als er geen overeenkomst wordt gevonden, wordt een NULL in de geretourneerde kolomwaarde geplaatst. |
Gebruik INNER JOIN als u gedetailleerde informatie van een specifieke kolom wilt opzoeken. | Gebruik OUTER JOIN als u de lijst met alle informatie in de twee tabellen wilt weergeven. |
INNER JOIN werkt als een filter. Er moet een overeenkomst zijn in beide tabellen voordat een inner join gegevens kan retourneren. | Ze werken als data-add-ons. |
Er bestaat een impliciete samenvoegingsnotatie voor innerlijke join die tabellen oproept die op de door komma's gescheiden manier in de FROM-component moeten worden samengevoegd. Voorbeeld: SELECT * FROM product, category WHERE product.CategoryID = category.CategoryID; | Er is geen impliciete join-notatie voor outer join. |
Innerlijke en uiterlijke Join versus Union
Soms verwarren we Join en Union en dit is ook een van de meest gestelde vragen in SQL-interviews We hebben al het verschil gezien tussen inner join en outer join. Laten we nu eens kijken hoe een JOIN anders is dan een UNION.
UNION plaatst een reeks query's na elkaar, terwijl join een cartesiaans product maakt en het subsets. UNION en JOIN zijn dus totaal verschillende operaties.
welk proces vereist geautomatiseerde builds en tests om software tijdens de ontwikkeling te verifiëren
Laten we de onderstaande twee vragen in MySQL uitvoeren en het resultaat bekijken.
UNION-vraag:
Resultaat:
Bah | |
---|---|
1 | 28 |
twee | 35 |
Join Query:
Resultaat:
foo | Bar | |
---|---|---|
1 | 38 | 35 |
Een UNION-bewerking plaatst het resultaat van twee of meer query's in één resultaatset. Deze resultatenset bevat alle records die worden geretourneerd via alle query's die bij de UNION zijn betrokken. Dus in feite combineert een UNION de twee resultatensets samen.
Een join-bewerking 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-voorwaarde. Bij een samenvoegquery worden gegevens uit de ene tabel gebruikt om records uit een andere tabel te selecteren. Hiermee kunt u vergelijkbare gegevens koppelen die aanwezig zijn in verschillende tabellen.
Om het heel eenvoudig te begrijpen, kun je zeggen dat een UNION rijen van twee tabellen combineert, terwijl een join kolommen van twee of meer tabellen combineert. Beide worden dus gebruikt om de gegevens uit n tabellen te combineren, maar het verschil zit in de manier waarop de gegevens worden gecombineerd.
Hieronder staan de afbeeldingen van UNION en JOIN.
Het bovenstaande is een grafische weergave van een samenvoegbewerking die aangeeft dat elk record in de resultatenset kolommen bevat uit zowel de tabellen, d.w.z. Tabel A en Tabel B. Dit resultaat wordt geretourneerd op basis van de samenvoegvoorwaarde die in de query is toegepast.
Een join is doorgaans het resultaat van denormalisatie (het tegenovergestelde van normalisatie) en gebruikt de externe sleutel van de ene tabel om de kolomwaarden op te zoeken door de primaire sleutel in een andere tabel te gebruiken.
Het bovenstaande is een picturale weergave van een UNION-operatie die aangeeft dat elk record in de resultatenset een rij is uit een van de twee tabellen. Het resultaat van de UNION heeft dus de rijen uit tabel A en tabel B gecombineerd.
Verder lezen = >> MySQL UNION uitgelegd met voorbeelden
Gevolgtrekking
In dit artikel hebben we de belangrijkste verschillen tussen de Inner Join en Outer Join in SQL We zagen ook de classificatie van een Outer Join, d.w.z. Left join, Right join en Full join. We hebben gezien hoe elk van deze join-typen werkt en hoe ze van elkaar verschillen.
We hebben ook een prestatievergelijking gemaakt tussen deze join-typen. We hebben ook besproken hoe een join verschilt van een vakbond.
Lees ook = >> MySQL-join-typen
Ik hoop dat dit artikel je zou hebben geholpen bij het wegnemen van je twijfels over de verschillen tussen de verschillende soorten joins. We zijn er zeker van dat dit u inderdaad zal doen beslissen uit welk type join u kiest op basis van de gewenste resultaatset.
Aanbevolen literatuur
- Exact verschil tussen verificatie en validatie met voorbeelden
- Modem Vs Router: ken het exacte verschil
- Verschil tussen SQL versus MySQL versus SQL Server (met voorbeelden)
- Python DateTime-zelfstudie met voorbeelden
- LAN versus WAN versus MAN: exact verschil tussen soorten netwerken
- Snijd Commando in Unix met voorbeelden
- Unix Cat Command Syntax, opties met voorbeelden
- Gebruik van Cursor in MongoDB met voorbeelden