inner join vs outer join
Inre anslutning mot yttre anslutning: Gör dig redo att utforska de exakta skillnaderna mellan inre och yttre anslutning
Innan vi undersöker skillnaderna mellan Inner Join Vs Outer Join, låt oss först se vad som är en SQL JOIN?
En kopplingsklausul används för att kombinera poster eller för att manipulera posterna från två eller flera tabeller genom ett kopplingsvillkor. Kopplingsvillkoret anger hur kolumner från varje tabell matchas mot varandra.
Delta är baserat på en relaterad kolumn mellan dessa tabeller. Ett vanligaste exempel är kopplingen mellan två tabeller genom kolumnen primär nyckel och främmande nyckel.
Anta att vi har en tabell som innehåller anställdas lön och det finns en annan tabell som innehåller information om anställda.
I det här fallet kommer det att finnas en vanlig kolumn som anställd-ID som kommer att gå med i dessa två tabeller. Den här kolumnen för anställd-ID skulle vara den primära nyckeln i tabellen över anställda och utländsk nyckel i löntabellen för anställda.
Det är mycket viktigt att ha en gemensam nyckel mellan de två enheterna. Du kan tänka på en tabell som en enhet och nyckeln som en gemensam länk mellan de två tabellerna som används för anslutningsoperation.
hur man öppnar .bin-filer windows 10
I grund och botten finns det två typer av Delta i SQL, dvs. Inre anslutning och yttre anslutning . Yttre skarv är ytterligare indelad i tre typer, dvs. Vänster yttre anslutning, höger yttre anslutning och full yttre anslutning.
I den här artikeln kommer vi att se skillnaden mellan Inre anslutning och yttre anslutning i detalj. Vi kommer att hålla tvärföreningar och ojämna föreningar utanför denna artikel.
Vad du kommer att lära dig:
- Vad är Inner Join?
- Vad är yttre anslutning?
- Skillnad mellan inre och yttre anslutning
- Prestanda
- MS Access Inre och yttre anslutning
- Left Join vs Left Outer Join
- Vänster yttre anslutning vs höger yttre anslutning
- Skillnad mellan inre anslutning och yttre anslutning i tabellformat
- Inre och yttre anslutning mot union
- Slutsats
- Rekommenderad läsning
Vad är Inner Join?
En inre koppling returnerar endast de rader som har matchande värden i båda tabellerna (vi överväger här att kopplingen görs mellan de två tabellerna).
Vad är yttre anslutning?
Den yttre kopplingen innehåller matchande rader samt några av de icke-matchande raderna mellan de två tabellerna. En yttre koppling skiljer sig i princip från den inre kopplingen i hur den hanterar tillståndet med falsk matchning.
Det finns tre typer av yttre anslutningar:
- Vänster yttre anslutning : Returnerar alla rader från VÄNSTER-tabellen och matchande poster mellan båda tabellerna.
- Höger yttre anslutning : Returnerar alla rader från RIGHT-tabellen och matchande poster mellan båda tabellerna.
- Fullständig yttre anslutning : Den kombinerar resultatet av vänster yttre anslutning och höger yttre anslutning.
Skillnad mellan inre och yttre anslutning
(bild källa )
Som visas i ovanstående diagram finns det två enheter, dvs tabell 1 och tabell 2, och båda tabellerna delar några vanliga data.
En inre koppling returnerar det gemensamma området mellan dessa tabeller (det gröna skuggade området i diagrammet ovan), dvs. alla poster som är vanliga mellan tabell 1 och tabell 2.
En vänster yttre anslutning returnerar alla rader från tabell 1 och endast de rader från tabell 2 som också är gemensamma för tabell 1. En rätt yttre anslutning gör precis tvärtom. Det ger alla poster från tabell 2 och endast motsvarande matchande poster från tabell 1.
Dessutom kommer en fullständig yttre anslutning att ge oss alla poster från tabell 1 och tabell 2.
Låt oss börja med ett exempel för att göra detta tydligare.
Anta att vi har två tabeller: EmpDetails och EmpSalary .
EmpDetails-tabell:
Anställnings-ID | Anställd Namn |
7 | Lilja |
1 | John |
två | Samantha |
3 | Ingen |
4 | Silkig |
5 | Bagge |
6 | Arpit |
8 | Sita |
9 | Farah |
10 | Jerry |
EmpSalary Tabell:
Anställnings-ID | Anställd Namn | Lön |
---|---|---|
elva | Reste sig | 90000 |
1 | John | 50 000 |
två | Samantha | 120000 |
3 | Ingen | 75000 |
4 | Silkig | 25000 |
5 | Bagge | 150000 |
6 | Arpit | 80000 |
12 | Sakshi | 45000 |
13 | Jack | 250 000 |
Låt oss göra en Inner Join på dessa två bord och observera resultatet:
Fråga:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails INNER JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Resultat:
Anställnings-ID | Anställd Namn | Lön |
---|---|---|
7 | Lilja | NULL |
1 | John | 50 000 |
två | Samantha | 120000 |
3 | Ingen | 75000 |
4 | Silkig | 25000 |
5 | Bagge | 150000 |
6 | Arpit | 80000 |
I ovanstående resultatuppsättning kan du se att Inner Join har returnerat de första 6 posterna som fanns i både EmpDetails och EmpSalary med en matchande nyckel, dvs. EmployeeID. Följaktligen, om A och B är två enheter, kommer den inre föreningen att returnera resultatuppsättningen som kommer att vara lika med 'Rekord i A och B', baserat på matchande nyckel.
Låt oss nu se vad en vänster yttre anslutning kommer att göra.
Fråga:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails LEFT JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Resultat:
Anställnings-ID | Anställd Namn | Lön |
---|---|---|
1 | John | 50 000 |
två | Samantha | 120000 |
3 | Ingen | 75000 |
4 | Silkig | 25000 |
5 | Bagge | 150000 |
6 | Arpit | 80000 |
8 | Sita | NULL |
9 | Farah | NULL |
10 | Jerry | NULL |
I ovanstående resultatuppsättning kan du se att den vänstra yttre kopplingen har returnerat alla de 10 posterna från VÄNSTER-tabellen, dvs. EmpDetails-tabellen, och eftersom de sex första posterna matchar har den returnerat anställdens lön för dessa matchande poster.
Eftersom resten av posterna inte har en matchande nyckel i RIGHT-tabellen, dvs. EmpSalary-tabellen, har den returnerat NULL motsvarande dem. Eftersom Lily, Sita, Farah och Jerry inte har något matchande anställd-ID i EmpSalary-tabellen, visas deras lön som NULL i resultatuppsättningen.
Så, om A och B är två enheter, kommer den vänstra yttre kopplingen att returnera resultatuppsättningen som kommer att vara lika med 'Record in A NOT B', baserat på matchningsknappen.
Låt oss nu observera vad Right Outer Join gör.
Fråga:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails RIGHT join EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Resultat:
Anställnings-ID | Anställd Namn | Lön |
---|---|---|
NULL | NULL | 90000 |
1 | John | 50 000 |
två | Samantha | 120000 |
3 | Ingen | 75000 |
4 | Silkig | 25000 |
5 | Bagge | 150000 |
6 | Arpit | 80000 |
NULL | NULL | 250 000 |
NULL | NULL | 250 000 |
I ovanstående resultatuppsättning kan du se att höger yttre anslutning har gjort precis motsatsen till vänster koppling. Det har returnerat alla löner från rätt tabell, dvs EmpSalary-tabellen.
Men eftersom Rose, Sakshi och Jack inte har ett matchande medarbetar-ID i den vänstra tabellen, dvs. EmpDetails-tabellen, har vi deras anställd-ID och anställd namn som NULL från vänster bord.
Så om A och B är två enheter, kommer den högra yttre kopplingen att returnera resultatuppsättningen som kommer att vara lika med 'Records in B NOT A', baserat på matchande nyckel.
Låt oss också se vad som kommer att bli resultatuppsättningen om vi gör en väljoperation på alla kolumnerna i båda tabellerna.
Fråga:
SELECT * FROM EmpDetails RIGHT JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Resultat:
Anställnings-ID | Anställd Namn | Anställnings-ID | Anställd Namn | Lön |
---|---|---|---|---|
NULL | NULL | elva | Reste sig | 90000 |
1 | John | 1 | John | 50 000 |
två | Samantha | två | Samantha | 120000 |
3 | Ingen | 3 | Ingen | 75000 |
4 | Silkig | 4 | Silkig | 25000 |
5 | Bagge | 5 | Bagge | 150000 |
6 | Arpit | 6 | Arpit | 80000 |
NULL | NULL | 12 | Sakshi | 250 000 |
NULL | NULL | 13 | Jack | 250 000 |
Låt oss nu gå in i Full Join.
En fullständig yttre koppling görs när vi vill ha all data från båda tabellerna oavsett om det finns en matchning eller inte. Därför, om jag vill ha alla anställda även om jag inte hittar en matchande nyckel, kör jag en fråga som visas nedan.
Fråga:
SELECT * FROM EmpDetails FULL JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Resultat:
Anställnings-ID | Anställd Namn | Anställnings-ID | Anställd Namn | Lön |
---|---|---|---|---|
7 | Lilja | NULL | NULL | NULL |
1 | John | 1 | John | 50 000 |
två | Samantha | två | Samantha | 120000 |
3 | Ingen | 3 | Ingen | 75000 |
4 | Silkig | 4 | Silkig | 25000 |
5 | Bagge | 5 | Bagge | 150000 |
6 | Arpit | 6 | Arpit | 80000 |
8 | Sita | NULL | NULL | NULL |
9 | Farah | NULL | NULL | NULL |
10 | Jerry | NULL | NULL | NULL |
NULL | NULL | elva | Reste sig | 90000 |
NULL | NULL | 12 | Sakshi | 250 000 |
NULL | NULL | 13 | Jack | 250 000 |
Du kan se i ovanstående resultatuppsättning att eftersom de sex första posterna matchar i båda tabellerna har vi fått all data utan NULL. De nästa fyra posterna finns i den vänstra tabellen men inte i den högra tabellen, varför motsvarande data i den högra tabellen är NULL.
De sista tre posterna finns i den högra tabellen och inte i den vänstra tabellen, därför har vi NULL i motsvarande data från den vänstra tabellen. Så, om A och B är två enheter, kommer hela yttre kopplingen att returnera resultatuppsättningen som kommer att vara lika med 'Rekord i A OCH B', oavsett matchande nyckel.
Teoretiskt sett är det en kombination av Left Join och Right Join.
Prestanda
Låt oss jämföra en Inner Join mot en Left Outer Join i SQL-servern. När vi talar om driftshastigheten är en vänster yttre JOIN uppenbarligen inte snabbare än en inre fog.
Enligt definitionen måste en yttre skarv, vare sig den är vänster eller höger, utföra allt arbete med en inre skarv tillsammans med tilläggsarbetet utan att utvidga resultaten. En yttre koppling förväntas returnera ett större antal poster som ytterligare ökar dess totala körtid bara på grund av det större resultatuppsättningen.
Således är en yttre fog långsammare än en inre fog.
Dessutom kan det finnas vissa specifika situationer där vänster koppling kommer att vara snabbare än en inre koppling, men vi kan inte fortsätta för att ersätta dem med varandra eftersom en vänster yttre koppling inte är funktionellt likvärdig med en inre koppling.
java hur man vänder om en matris
Låt oss diskutera en instans där Left Join kan vara snabbare än Inner Join. Om tabellerna som är involverade i kopplingsoperationen är för små, säg att de har mindre än tio poster och tabellerna inte har tillräckligt med index för att täcka frågan, i så fall är Left Join i allmänhet snabbare än Inner Join.
Låt oss skapa de två nedanstående tabellerna och göra ett INNER JOIN och ett VÄNSTER YTTRE JOIN mellan dem som ett exempel:
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 t1 INNER JOIN #Table2 t2 ON t2.Name = t1.Name
ID | namn | ID | namn | |
---|---|---|---|---|
Nedan visas visualiseringen av en inre koppling: ![]() | Nedan visas visualiseringen av en yttre koppling ![]() | |||
1 | 1 | TILL | 1 | TILL |
två | två | B | två | B |
3 | 3 | C | 3 | C |
4 | 4 | D | 4 | D |
5 | 5 | ÄR | 5 | ÄR |
SELECT * FROM (SELECT 38 AS bah) AS foo JOIN (SELECT 35 AS bah) AS bar ON (55=55);
ID | namn | ID | namn | |
---|---|---|---|---|
1 | 1 | TILL | 1 | TILL |
två | två | B | två | B |
3 | 3 | C | 3 | C |
4 | 4 | D | 4 | D |
5 | 5 | ÄR | 5 | ÄR |
Som du kan se ovan har båda frågorna returnerat samma resultatuppsättning. I det här fallet, om du ser körplanen för båda frågorna, kommer du att upptäcka att den inre kopplingen har kostat mer än den yttre kopplingen. Detta beror på att för en inre koppling gör SQL-servern en hash-matchning medan den gör kapslade loopar för den vänstra kopplingen.
En hasmatchning är normalt snabbare än de kapslade öglorna. Men i det här fallet, eftersom antalet rader är så litet och det inte finns något index att använda (eftersom vi gör föreningen i namnkolumnen), har hashoperationen visat sig vara en dyra inre föreningsfråga.
Men om du ändrar matchningsnyckeln i kopplingsfrågan från namn till ID och om det finns ett stort antal rader i tabellen, kommer du att upptäcka att den inre kopplingen blir snabbare än den vänstra yttre kopplingen.
MS Access Inre och yttre anslutning
När du använder flera datakällor i MS Access-frågan, använder du JOINs för att kontrollera de poster som du vill se, beroende på hur datakällorna är kopplade till varandra.
I en inre koppling kombineras endast de relaterade från båda tabellerna i en enda resultatuppsättning. Detta är en standardkoppling i Access och den mest använda också. Om du använder en koppling men inte uttryckligen anger vilken typ av koppling det är, antar Access att det är en inre koppling.
I yttre sammanfogningar kombineras all relaterad data från båda tabellerna korrekt plus alla återstående rader från en tabell. I fullständiga yttre sammanfogningar kombineras all data när det är möjligt.
Left Join vs Left Outer Join
I SQL-server är nyckelordet yttre valfritt när du tillämpar vänster yttre koppling. Således gör det ingen skillnad om du antingen skriver 'VÄNSTER YTTRE GÅNG' eller 'VÄNSTER GÅ MED' eftersom båda kommer att ge dig samma resultat.
EN VÄNSTER FÖRENING B är en motsvarande syntax till VÄNSTER UTRE FÖRENING B.
Nedan är listan över motsvarande syntaxer på SQL-servern:
(bild källa )
Vänster yttre anslutning vs höger yttre anslutning
Vi har redan sett denna skillnad i den här artikeln. Du kan hänvisa till frågorna om vänster yttre anslutning och höger yttre anslutning och resultat för att se skillnaden.
Huvudskillnaden mellan Left Join och Right Join ligger i inkluderingen av rader som inte matchar. Vänster yttre koppling inkluderar de omatchade raderna från tabellen som finns till vänster om kopplingssatsen medan en höger yttre koppling inkluderar de omatchade raderna från tabellen som är till höger om kopplingssatsen.
Folk frågar vad som är bättre att använda, dvs. vänster gå med eller höger gå med? I grund och botten är de samma typ av operationer förutom med deras argument omvända. Följaktligen, när du frågar vilken anslutning du ska använda, frågar du faktiskt om du ska skriva en a. Det är bara en fråga om preferens.
I allmänhet föredrar folk att använda Left join i sin SQL-fråga. Jag föreslår att du ska vara konsekvent på det sätt som du skriver frågan för att undvika förvirring i tolkningen av frågan.
Vi har sett allt om Inner join och alla typer av yttre anslutningar hittills. Låt oss snabbt sammanfatta skillnaden mellan Inner Join och Outer Join.
Skillnad mellan inre anslutning och yttre anslutning i tabellformat
Inre koppling | Yttre anslutning |
---|---|
Returnerar endast de rader som har matchande värden i båda tabellerna. | Inkluderar matchande rader samt några av de icke-matchande raderna mellan de två tabellerna. |
Om det finns ett stort antal rader i tabellerna och det finns ett index att använda är INNER JOIN i allmänhet snabbare än OUTER JOIN. | Generellt sett är en OUTER JOIN långsammare än en INNER JOIN eftersom den behöver returnera fler antal poster jämfört med INNER JOIN. Det kan dock finnas vissa specifika scenarier där OUTER JOIN går snabbare. |
När en matchning inte hittas returnerar den inte något. | När en matchning inte hittas placeras en NULL i det kolumnvärde som returneras. |
Använd INNER JOIN när du vill leta upp detaljerad information om någon specifik kolumn. | Använd OUTER JOIN när du vill visa listan med all information i de två tabellerna. |
INNER JOIN fungerar som ett filter. Det måste finnas en matchning på båda borden för att en inre koppling ska returnera data. | De fungerar som data-add ons. |
Implicit anslutningsnotation existerar för inre koppling som visar tabeller som ska förenas på kommaseparerat sätt i FROM-satsen. Exempel: VÄLJ * FRÅN produkt, kategori VAR produkt.KategoriID = kategori.KategoriID; | Ingen implicit anslutningsnotation finns för yttre anslutning. |
Inre och yttre anslutning mot union
Ibland förvirrar vi Join och Union och detta är också en av de vanligaste frågorna i SQL-intervjuer . Vi har redan sett skillnaden mellan innerfog och yttre fog. Låt oss nu se hur en JOIN skiljer sig från en UNION.
UNION placerar en rad frågor efter varandra, medan join skapar en kartesisk produkt och undergrupper. Således är UNION och JOIN helt olika operationer.
Låt oss köra nedanstående två frågor i MySQL och se deras resultat.
UNION-fråga:
SELECT 28 AS bah UNION SELECT 35 AS bah;
Resultat:
Bah | |
---|---|
1 | 28 |
två | 35 |
Gå med i frågan:
SELECT * FROM (SELECT 38 AS bah) AS foo JOIN (SELECT 35 AS bah) AS bar ON (55=55);
Resultat:
foo | Bar | |
---|---|---|
1 | 38 | 35 |
En UNION-operation placerar resultatet av två eller flera frågor i en enda resultatuppsättning. Denna resultatuppsättning innehåller alla poster som returneras genom alla frågor som är inblandade i UNIONEN. Således i grund och botten kombinerar en UNION de två resultatuppsättningarna.
En kopplingsåtgärd hämtar data från två eller flera tabeller baserat på de logiska förhållandena mellan dessa tabeller, dvs. baserat på kopplingsvillkoret. I anslutningsfrågan används data från en tabell för att välja poster från en annan tabell. Det låter dig länka liknande data som finns över olika tabeller.
För att förstå det mycket enkelt kan du säga att en UNION kombinerar rader från två tabeller medan en koppling kombinerar kolumner från två eller flera tabeller. Således används båda för att kombinera data från n-tabeller, men skillnaden ligger i hur data kombineras.
Nedan följer de bildliga framställningarna av UNION och JOIN.
Ovanstående är en bildrepresentation av en anslutningsoperation som visar att varje post i resultatuppsättningen innehåller kolumner från båda tabellerna, dvs. tabell A och tabell B. Detta resultat returneras baserat på det kopplingsvillkor som tillämpas i frågan.
En koppling är i allmänhet resultatet av denormalisering (motsatsen till normalisering) och den använder den främmande nyckeln i en tabell för att slå upp kolumnvärdena genom att använda primärnyckeln i en annan tabell.
Ovanstående är en bildrepresentation av en UNION-operation som visar att varje rekord i resultatuppsättningen är en rad från någon av de två tabellerna. Således har resultatet av UNIONEN kombinerat raderna från tabell A och tabell B.
Ytterligare läsning = >> MySQL UNION förklaras med exempel
Slutsats
I den här artikeln har vi sett de stora skillnaderna mellan Inre anslutning och yttre anslutning i SQL . Vi såg också klassificeringen av en yttre anslutning, dvs. vänster koppling, höger koppling och full koppling. Vi har sett hur var och en av dessa sammanfogningstyper fungerar och hur de skiljer sig från varandra.
Vi gjorde också en viss jämförelse mellan dessa anslutningstyper. Vi diskuterade också hur en anslutning skiljer sig från en fackförening.
Läs också = >> MySQL-anslutningstyper
Hoppas att den här artikeln skulle ha hjälpt dig att ta bort dina tvivel angående skillnaderna mellan de olika kopplingstyperna. Vi är säkra på att detta verkligen får dig att välja vilken typ av koppling du vill välja baserat på önskad resultatuppsättning.
Rekommenderad läsning
- Exakt skillnad mellan verifiering och validering med exempel
- Modem mot router: känn den exakta skillnaden
- Skillnad mellan SQL Vs MySQL Vs SQL Server (med exempel)
- Python DateTime-handledning med exempel
- LAN Vs WAN Vs MAN: Exakt skillnad mellan typer av nätverk
- Klipp kommandot i Unix med exempel
- Unix Cat Command Syntax, alternativ med exempel
- Användning av markören i MongoDB med exempel