inner join vs outer join
Inner Join Vs Outer Join: Gjør deg klar til å utforske de nøyaktige forskjellene mellom indre og ytre sammenføyning
Før vi utforsker forskjellene mellom Inner Join Vs Outer Join, la oss først se hva som er en SQL JOIN?
En sammenføyningsklausul brukes til å kombinere poster eller til å manipulere postene fra to eller flere tabeller gjennom en sammenkoblingsbetingelse. Sammenføyningsbetingelsen indikerer hvordan kolonnene fra hver tabell samsvarer med hverandre.
Delta er basert på en relatert kolonne mellom disse tabellene. Et vanligste eksempel er sammenkoblingen mellom to tabeller gjennom hovednøkkelkolonnen og utenlandsk nøkkelkolonne.
Anta at vi har en tabell som inneholder lønn for ansatte, og det er en annen tabell som inneholder ansattes detaljer.
I dette tilfellet vil det være en vanlig kolonne som ansattes ID som vil bli med i disse to tabellene. Denne kolonnen for ansattes ID vil være den viktigste nøkkelen til tabellene over de ansatte og utenlandsk nøkkel i lønnstabellen for de ansatte.
Det er veldig viktig å ha en felles nøkkel mellom de to enhetene. Du kan tenke på en tabell som en enhet og nøkkelen som en felles lenke mellom de to tabellene som brukes til å bli med.
legge til en verdi i en matrise
I utgangspunktet er det to typer Delta i SQL, dvs. Indre sammenføyning og ytre sammenføyning . Ytre skjøt er videre delt inn i tre typer, dvs. Venstre ytre skjøt, høyre ytre sammenføyning og full ytre sammenføyning.
I denne artikkelen vil vi se forskjellen mellom Indre sammenføyning og ytre sammenføyning i detalj. Vi vil holde Cross Joins og Uqual Joins utenfor omfanget av denne artikkelen.
Hva du vil lære:
- Hva er Inner Join?
- Hva er Outer Join?
- Forskjellen mellom indre og ytre sammenføyning
- Opptreden
- MS Access indre og ytre sammenføyning
- Left Join vs Left Outer Join
- Venstre ytre sammenføyning mot høyre ytre sammenføyning
- Forskjellen mellom indre sammenføyning og ytre sammenføyning i tabellformat
- Inner and Yuter Join vs Union
- Konklusjon
- Anbefalt lesing
Hva er Inner Join?
En indre sammenføyning returnerer bare radene som har samsvarende verdier i begge tabellene (vi vurderer her sammenføyningen skjer mellom de to tabellene).
Hva er Outer Join?
Den ytre skjøten inkluderer de matchende radene, så vel som noen av de ikke-samsvarende radene mellom de to tabellene. En ytre sammenføyning skiller seg i utgangspunktet fra den indre sammenføyningen i hvordan den håndterer falsk matchtilstand.
Det finnes tre typer ytre skjøter:
- Venstre ytre skjøt : Returnerer alle radene fra VENSTRE tabellen og samsvarende poster mellom begge tabellene.
- Høyre ytre sammenføyning : Returnerer alle radene fra RIGHT-tabellen og samsvarende poster mellom begge tabellene.
- Full ytre sammenføyning : Den kombinerer resultatet av Venstre ytre skjøt og Høyre ytre skjøt.
Forskjellen mellom indre og ytre sammenføyning
(bilde kilde )
Som vist i diagrammet ovenfor er det to enheter, det vil si tabell 1 og tabell 2, og begge tabellene deler noen vanlige data.
En indre sammenføyning returnerer fellesområdet mellom disse tabellene (det grønne skyggelagte området i diagrammet ovenfor), dvs. alle postene som er vanlige mellom tabell 1 og tabell 2.
Venstre ytre skjøt vil returnere alle radene fra tabell 1 og bare de radene fra tabell 2 som også er felles for tabell 1. En Right Yuter Join vil gjøre det motsatte. Det vil gi alle postene fra tabell 2 og bare de tilsvarende samsvarende postene fra tabell 1.
Videre vil en full ytre sammenføyning gi oss alle postene fra tabell 1 og tabell 2.
La oss starte med et eksempel for å gjøre dette tydeligere.
Anta at vi har to tabeller: EmpDetails og EmpSalary .
EmpDetails-tabell:
Ansatt ID | Arbeidstakers navn |
7 | Lily |
1 | John |
to | Samantha |
3 | Ingen |
4 | Silkeaktig |
5 | RAM |
6 | Arpit |
8 | Sita |
9 | Farah |
10 | Jerry |
EmpSalary Tabell:
Ansatt ID | Arbeidstakers navn | Ansattes lønn |
---|---|---|
elleve | Rose | 90000 |
1 | John | 50.000 |
to | Samantha | 120000 |
3 | Ingen | 75000 |
4 | Silkeaktig | 25000 |
5 | RAM | 150000 |
6 | Arpit | 80000 |
12 | Sakshi | 45000 |
1. 3 | Jack | 250000 |
La oss gjøre en indre samling på disse to bordene og observere resultatet:
Spørsmål:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails INNER JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Resultat:
Ansatt ID | Arbeidstakers navn | Ansattes lønn |
---|---|---|
7 | Lily | NULL |
1 | John | 50.000 |
to | Samantha | 120000 |
3 | Ingen | 75000 |
4 | Silkeaktig | 25000 |
5 | RAM | 150000 |
6 | Arpit | 80000 |
I ovenstående resultatsett kan du se at Inner Join har returnert de første 6 postene som var til stede i både EmpDetails og EmpSalary med en matchende nøkkel, dvs. EmployeeID. Derfor, hvis A og B er to enheter, vil den indre sammenføyningen returnere resultatsettet som vil være lik 'Records in A and B', basert på matchende nøkkel.
La oss nå se hva en Left Outer Join vil gjøre.
Spørsmål:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails LEFT JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Resultat:
Ansatt ID | Arbeidstakers navn | Ansattes lønn |
---|---|---|
1 | John | 50.000 |
to | Samantha | 120000 |
3 | Ingen | 75000 |
4 | Silkeaktig | 25000 |
5 | RAM | 150000 |
6 | Arpit | 80000 |
8 | Sita | NULL |
9 | Farah | NULL |
10 | Jerry | NULL |
I resultatsettet ovenfor kan du se at venstre ytre sammenføyning har returnert alle de 10 postene fra VENSTRE-tabellen, dvs. EmpDetails-tabellen, og da de første 6 postene samsvarer, har den returnert ansattes lønn for disse samsvarende postene.
Siden resten av postene ikke har en matchende nøkkel i RIGHT-tabellen, dvs. EmpSalary-tabellen, har den returnert NULL som tilsvarer disse. Siden Lily, Sita, Farah og Jerry ikke har samsvarende medarbeider-ID i EmpSalary-tabellen, vises lønnen deres som NULL i resultatsettet.
Så hvis A og B er to enheter, vil venstre ytre sammenføying returnere resultatsettet som vil være lik 'Records in A NOT B', basert på matchende nøkkel.
La oss nå observere hva Right Outer Join gjør.
Spørsmål:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails RIGHT join EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Resultat:
Ansatt ID | Arbeidstakers navn | Ansattes lønn |
---|---|---|
NULL | NULL | 90000 |
1 | John | 50.000 |
to | Samantha | 120000 |
3 | Ingen | 75000 |
4 | Silkeaktig | 25000 |
5 | RAM | 150000 |
6 | Arpit | 80000 |
NULL | NULL | 250000 |
NULL | NULL | 250000 |
I ovenstående resultatsett kan du se at Right Outer Join har gjort akkurat det motsatte av venstre join. Den har returnert alle lønningene fra høyre tabell, dvs. EmpSalary-tabellen.
Men ettersom Rose, Sakshi og Jack ikke har en samsvarende medarbeider-ID i venstre tabell, dvs. EmpDetails-tabellen, har vi deres medarbeider-ID og ansattnavn som NULL fra venstre tabell.
Så hvis A og B er to enheter, vil den høyre ytre sammenføyningen returnere resultatsettet som vil være lik 'Records in B NOT A', basert på matchende nøkkel.
La oss også se hva som blir resultatsettet hvis vi gjør en valgt operasjon på alle kolonnene i begge tabellene.
Spørsmål:
SELECT * FROM EmpDetails RIGHT JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Resultat:
Ansatt ID | Arbeidstakers navn | Ansatt ID | Arbeidstakers navn | Ansattes lønn |
---|---|---|---|---|
NULL | NULL | elleve | Rose | 90000 |
1 | John | 1 | John | 50.000 |
to | Samantha | to | Samantha | 120000 |
3 | Ingen | 3 | Ingen | 75000 |
4 | Silkeaktig | 4 | Silkeaktig | 25000 |
5 | RAM | 5 | RAM | 150000 |
6 | Arpit | 6 | Arpit | 80000 |
NULL | NULL | 12 | Sakshi | 250000 |
NULL | NULL | 1. 3 | Jack | 250000 |
La oss nå gå inn i Full Join.
En fullstendig ytre sammenføyning gjøres når vi vil ha alle dataene fra begge tabellene, uansett om det er samsvar eller ikke. Derfor, hvis jeg vil ha alle ansatte, selv om jeg ikke finner en matchende nøkkel, vil jeg kjøre et spørsmål som vist nedenfor.
Spørsmål:
SELECT * FROM EmpDetails FULL JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Resultat:
Ansatt ID | Arbeidstakers navn | Ansatt ID | Arbeidstakers navn | Ansattes lønn |
---|---|---|---|---|
7 | Lily | NULL | NULL | NULL |
1 | John | 1 | John | 50.000 |
to | Samantha | to | Samantha | 120000 |
3 | Ingen | 3 | Ingen | 75000 |
4 | Silkeaktig | 4 | Silkeaktig | 25000 |
5 | RAM | 5 | RAM | 150000 |
6 | Arpit | 6 | Arpit | 80000 |
8 | Sita | NULL | NULL | NULL |
9 | Farah | NULL | NULL | NULL |
10 | Jerry | NULL | NULL | NULL |
NULL | NULL | elleve | Rose | 90000 |
NULL | NULL | 12 | Sakshi | 250000 |
NULL | NULL | 1. 3 | Jack | 250000 |
Du kan se i resultatsettet ovenfor at da de første seks postene samsvarer i begge tabellene, har vi fått alle dataene uten NULL. De neste fire postene eksisterer i venstre tabell, men ikke i høyre tabell, og dermed er de tilsvarende dataene i høyre tabell NULL.
De tre siste postene eksisterer i høyre tabell og ikke i venstre tabell, derfor har vi NULL i de tilsvarende dataene fra venstre tabell. Så hvis A og B er to enheter, vil den fullstendige ytre sammenføyningen returnere resultatsettet som vil være lik 'Records in A AND B', uavhengig av matchende nøkkel.
Teoretisk sett er det en kombinasjon av Left Join og Right Join.
Opptreden
La oss sammenligne en Inner Join mot en Left Outer Join i SQL-serveren. Når vi snakker om hastigheten på operasjonen, er en venstre ytre JOIN åpenbart ikke raskere enn en indre sammenføyning.
hvordan du spiller world of warcraft private server
I henhold til definisjonen, må en ytre skjøt, enten det er venstre eller høyre, utføre alt arbeidet med en indre skjøte sammen med tilleggsarbeidet uten å utvide resultatene. En ytre sammenføyning forventes å gi et større antall poster som ytterligere øker den totale utførelsestiden bare på grunn av det større resultatsettet.
Dermed er en ytre skjøt langsommere enn en indre skjøt.
Videre kan det være noen spesifikke situasjoner der venstre skjøte vil være raskere enn en indre sammenføyning, men vi kan ikke fortsette for å erstatte dem med hverandre, da en venstre ytre sammenføyning ikke er funksjonelt tilsvarende en indre skjøt.
La oss diskutere en forekomst der Left Join kan være raskere enn Inner Join. Hvis tabellene som er involvert i sammenkoblingsoperasjonen, er for små, kan du si at de har mindre enn 10 poster, og at tabellene ikke har tilstrekkelige indekser til å dekke spørringen, i så fall er Left Join generelt raskere enn Inner Join.
La oss lage de to tabellene nedenfor og gjøre et INNER JOIN og en VENSTRE YTRE JOIN mellom dem som et eksempel:
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 | Navn | ID | Navn | |
---|---|---|---|---|
Nedenfor er visualiseringen av en indre sammenføyning: ![]() | Nedenfor er visualiseringen av en ytre skjøt ![]() | |||
1 | 1 | TIL | 1 | TIL |
to | to | B | to | B |
3 | 3 | C | 3 | C |
4 | 4 | D | 4 | D |
5 | 5 | ER | 5 | ER |
SELECT * FROM (SELECT 38 AS bah) AS foo JOIN (SELECT 35 AS bah) AS bar ON (55=55);
ID | Navn | ID | Navn | |
---|---|---|---|---|
1 | 1 | TIL | 1 | TIL |
to | to | B | to | B |
3 | 3 | C | 3 | C |
4 | 4 | D | 4 | D |
5 | 5 | ER | 5 | ER |
Som du kan se ovenfor, har begge spørsmålene returnert det samme resultatsettet. I dette tilfellet, hvis du ser på utførelsesplanen for begge spørringene, vil du oppdage at den indre sammenføyningen har kostet mer enn den ytre sammenføyningen. Dette er fordi, for en indre sammenkobling, gjør SQL-serveren en hash-match, mens den gjør nestede sløyfer for venstre sammenføyning.
En hash-kamp er normalt raskere enn de nestede løkkene. Men i dette tilfellet, ettersom antall rader er så lite og det ikke er noen indeks å bruke (som vi gjør bli med i navnekolonnen), har hashoperasjonen vist seg å være et dyreste indre sammenføyningsspørsmål.
Men hvis du endrer matchende nøkkel i sammenføyningsspørringen fra Navn til ID, og hvis det er et stort antall rader i tabellen, vil du oppdage at den indre sammenføyningen vil være raskere enn den venstre ytre sammenføyningen.
MS Access indre og ytre sammenføyning
Når du bruker flere datakilder i MS Access-spørring, bruker du JOINs for å kontrollere postene du vil se, avhengig av hvordan datakildene er koblet til hverandre.
I en indre sammenføyning er bare de relaterte fra begge tabellene kombinert i et enkelt resultatsett. Dette er en standard deltakelse i Access og den hyppigst brukte også. Hvis du bruker en join, men ikke eksplisitt spesifiserer hvilken type Join det er, antar Access at det er en indre join.
I ytre sammenføyninger kombineres alle relaterte data fra begge tabellene riktig, pluss alle de gjenværende radene fra en tabell. I full ytre sammenføyninger kombineres alle data der det er mulig.
Left Join vs Left Outer Join
I SQL server er nøkkelordet ytre valgfritt når du bruker venstre ytre sammenføyning. Dermed gjør det ingen forskjell om du enten skriver ‘LEFT OUTER JOIN’ eller ‘LEFT JOIN’ da begge skal gi deg det samme resultatet.
EN VENSTRE JOIN B er en tilsvarende syntaks til A VENSTRE YTRE JOIN B.
Nedenfor er listen over tilsvarende syntakser i SQL-serveren:
(bilde kilde )
Venstre ytre sammenføyning mot høyre ytre sammenføyning
Vi har allerede sett denne forskjellen i denne artikkelen. Du kan referere til spørsmålene Left Outer Join og Right Outer Join og resultatsettet for å se forskjellen.
Hovedforskjellen mellom Left Join og Right Join ligger i inkluderingen av ikke-samsvarende rader. Venstre ytre sammenføyning inkluderer de umatchede radene fra tabellen til venstre for sammenføyningsklausulen, mens en høyre ytre sammenføyning inkluderer de umatchede radene fra tabellen som er til høyre for sammenføyningsparagrafen.
Folk spør hva som er bedre å bruke, dvs. Venstre bli med eller Høyre bli med? I utgangspunktet er de samme type operasjoner, bortsett fra at argumentene er omvendt. Derfor spør du om du skal skrive en når du spør hvilken sammenføyning du skal bruke en. Det er bare et spørsmål om preferanse.
Generelt foretrekker folk å bruke Left join i SQL-spørringen. Jeg vil foreslå at du holder deg konsistent i måten du skriver spørringen på for å unngå forvirring i å tolke spørringen.
Vi har sett alt om Inner join og alle typer Ytre join så langt. La oss raskt oppsummere forskjellen mellom Inner Join og Outer Join.
Forskjellen mellom indre sammenføyning og ytre sammenføyning i tabellformat
Inner Join | Ytre sammenføyning |
---|---|
Returnerer bare radene som har samsvarende verdier i begge tabellene. | Inkluderer de samsvarende radene samt noen av de ikke-samsvarende radene mellom de to tabellene. |
I tilfelle det er et stort antall rader i tabellene og det er en indeks å bruke, er INNER JOIN generelt raskere enn OUTER JOIN. | Vanligvis er en OUTER JOIN langsommere enn en INNER JOIN, da den trenger å returnere flere antall poster sammenlignet med INNER JOIN. Imidlertid kan det være noen spesifikke scenarier der OUTER JOIN er raskere. |
Når en kamp ikke blir funnet, returnerer den ikke noe. | Når en kamp ikke blir funnet, plasseres en NULL i kolonneverdien som returneres. |
Bruk INNER JOIN når du vil slå opp detaljert informasjon om en bestemt kolonne. | Bruk OUTER JOIN når du vil vise listen over all informasjon i de to tabellene. |
INNER JOIN fungerer som et filter. Det må være en kamp på begge bordene for at en indre sammenføyning skal returnere data. | De fungerer som data-add ons. |
Implisitt sammenføyningsnotasjon eksisterer for indre sammenføyning som viser tabeller som skal settes sammen på kommaadskilt måte i FROM-setningen. Eksempel: VELG * FRA produkt, kategori HVOR produkt.KategoriID = kategori.KategoriID; | Ingen implisitt sammenføyningsnotasjon er der for ytre sammenføyning. |
Inner and Yuter Join vs Union
Noen ganger forveksler vi Join og Union, og dette er også et av de mest stilte spørsmålene i SQL-intervjuer . Vi har allerede sett forskjellen mellom indre sammenføyning og ytre sammenføyning. La oss nå se hvordan en JOIN er forskjellig fra et UNION.
UNION plasserer en linje med spørsmål etter hverandre, mens join skaper et kartesisk produkt og delmengder det. Dermed er UNION og JOIN helt forskjellige operasjoner.
La oss kjøre nedenstående to spørsmål i MySQL og se resultatet.
UNION-spørring:
SELECT 28 AS bah UNION SELECT 35 AS bah;
Resultat:
Bah | |
---|---|
1 | 28 |
to | 35 |
BLI MED SPØRSMÅL:
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-operasjon setter resultatet av to eller flere spørsmål i ett resultatsett. Dette resultatsettet inneholder alle postene som returneres gjennom alle spørsmålene som er involvert i UNIONEN. Dermed kombinerer et UNION i utgangspunktet de to resultatsettene.
En sammenkoblingsoperasjon henter data fra to eller flere tabeller basert på de logiske forholdene mellom disse tabellene, dvs. basert på sammenkoblingsbetingelsen. I sammenføyningsspørring brukes data fra en tabell til å velge poster fra en annen tabell. Den lar deg koble lignende data som finnes over forskjellige tabeller.
For å forstå det veldig enkelt, kan du si at en UNION kombinerer rader fra to tabeller, mens en join kombinerer kolonner fra to eller flere tabeller. Dermed brukes begge til å kombinere dataene fra n tabeller, men forskjellen ligger i hvordan dataene kombineres.
Nedenfor er de billedlige representasjonene av UNION og JOIN.
Ovenstående er en illustrasjon av en Join Operation som viser at hver post i resultatsettet inneholder kolonner fra begge tabellene, dvs. tabell A og tabell B. Dette resultatet returneres basert på sammenkoblingsbetingelsen som brukes i spørringen.
En sammenføyning er vanligvis resultatet av denormalisering (motsatt av normalisering), og den bruker den fremmede nøkkelen til en tabell for å slå opp kolonneverdiene ved å bruke primærnøkkelen i en annen tabell.
Ovenstående er en illustrasjon av en UNION-operasjon som viser at hver rekord i resultatsettet er en rad fra et av de to tabellene. Dermed har resultatet av UNION kombinert radene fra tabell A og tabell B.
Videre lesing = >> MySQL UNION forklart med eksempler
Konklusjon
I denne artikkelen har vi sett de store forskjellene mellom Inner Join og Ytre Join i SQL . Vi så også klassifiseringen av en Outer Join dvs. Left join, Right join og Full join. Vi har sett hvordan hver av disse sammenføyningstypene fungerer, og hvordan de varierer fra hverandre.
Vi har også foretatt en sammenligning av ytelse mellom disse sammenføyningstypene. Vi diskuterte også hvordan en medlemskap er forskjellig fra en fagforening.
Les også = >> MySQL-typer
Håper denne artikkelen ville ha hjulpet deg med å fjerne tvilen din om forskjellene mellom de forskjellige sammenføyningstypene. Vi er sikre på at dette faktisk får deg til å bestemme hvilken type type du vil velge, basert på ønsket resultatsett.
Anbefalt lesing
- Nøyaktig forskjell mellom bekreftelse og validering med eksempler
- Modem mot ruter: Kjenn den nøyaktige forskjellen
- Forskjellen mellom SQL Vs MySQL Vs SQL Server (med eksempler)
- Python DateTime Tutorial med eksempler
- LAN Vs WAN Vs MAN: Nøyaktig forskjell mellom typer nettverk
- Klipp kommandoen i Unix med eksempler
- Unix Cat Command Syntax, Alternativer med eksempler
- Bruk av markør i MongoDB med eksempler