inner join vs outer join
Indre sammenføjning mod ydre tilslutning: Gør dig klar til at udforske de nøjagtige forskelle mellem indre og ydre sammenføjning
Før vi udforsker forskellene mellem Inner Join Vs Outer Join, lad os først se, hvad der er en SQL JOIN?
En sammenføjningsklausul bruges til at kombinere poster eller til at manipulere poster fra to eller flere tabeller gennem en sammenføjningsbetingelse. Forbindelsesbetingelsen angiver, hvordan kolonner fra hver tabel matches med hinanden.
Deltagelse er baseret på en relateret kolonne mellem disse tabeller. Et mest almindeligt eksempel er samlingen mellem to tabeller gennem den primære nøglekolonne og den udenlandske nøglekolonne.
Antag, vi har en tabel, der indeholder medarbejderløn, og der er en anden tabel, der indeholder medarbejderoplysninger.
I dette tilfælde vil der være en fælles kolonne som medarbejder-id, som vil slutte sig til disse to tabeller. Denne kolonne medarbejder-id ville være den primære nøgle i tabellerne om medarbejderoplysninger og udenlandsk nøgle i medarbejderens lønnstabel.
Det er meget vigtigt at have en fælles nøgle mellem de to enheder. Du kan tænke på en tabel som en enhed og nøglen som et fælles link mellem de to tabeller, der bruges til sammenkædningsoperation.
hvordan man bruger en apk-fil
Dybest set er der to typer af Join in SQL, dvs. Indvendig samling og ydre samling . Ydre sammenføjning er yderligere opdelt i tre typer, dvs. Venstre ydre sammenføjning, højre ydre sammenføjning og fuld ydre sammenføjning.
I denne artikel vil vi se forskellen mellem Indvendig samling og ydre samling i detaljer. Vi holder krydsforbindelser og ulige sammenføjninger uden for denne artikels anvendelsesområde.
Hvad du lærer:
- Hvad er Inner Join?
- Hvad er Outer Join?
- Forskel mellem indre og ydre sammenføjning
- Ydeevne
- MS Access Indre og ydre tilslutning
- Venstre tilslutning vs Venstre ydre sammenføjning
- Venstre ydre sammenføjning vs højre ydre sammenføjning
- Forskel mellem indre sammenføjning og ydre sammenføjning i tabelformat
- Indre og ydre tilslutning vs Union
- Konklusion
- Anbefalet læsning
Hvad er Inner Join?
En indre sammenføjning returnerer kun de rækker, der har matchende værdier i begge tabeller (vi overvejer her, at sammenføjningen sker mellem de to tabeller).
Hvad er Outer Join?
Den ydre samling inkluderer de matchende rækker såvel som nogle af de ikke-matchende rækker mellem de to tabeller. En ydre sammenføjning adskiller sig grundlæggende fra den indre sammenføjning i, hvordan den håndterer den falske matchtilstand.
Der er 3 typer ydre samlinger:
- Venstre ydre samling : Returnerer alle rækkerne fra VENSTRE-tabellen og matchende poster mellem begge tabeller.
- Højre ydre samling : Returnerer alle rækkerne fra RIGHT-tabellen og matchende poster mellem begge tabeller.
- Fuld ydre tilslutning : Det kombinerer resultatet af venstre ydre samling og højre ydre samling.
Forskel mellem indre og ydre sammenføjning
(billede kilde )
Som vist i ovenstående diagram er der to enheder, dvs. tabel 1 og tabel 2, og begge tabeller deler nogle fælles data.
En indre sammenføjning returnerer det fælles område mellem disse tabeller (det grønne skraverede område i diagrammet ovenfor), dvs. alle de poster, der er fælles mellem tabel 1 og tabel 2.
Venstre ydre sammenføjning returnerer alle rækkerne fra tabel 1 og kun de rækker fra tabel 2, som også er fælles for tabel 1. En højre ydre samling vil gøre det modsatte. Det giver alle poster fra tabel 2 og kun de tilsvarende matchende poster fra tabel 1.
Desuden vil en fuld ydre sammenføjning give os alle optegnelser fra tabel 1 og tabel 2.
Lad os starte med et eksempel for at gøre dette tydeligere.
Antag, at vi har to tabeller: EmpDetails og EmpSalary .
EmpDetails-tabel:
Medarbejder-ID | Ansattes navn |
7 | Lilje |
1 | John |
to | Samantha |
3 | Ingen |
4 | Silkeblød |
5 | Vædder |
6 | Arpit |
8 | Sita |
9 | Farah |
10 | Jerry |
EmpSalary tabel:
Medarbejder-ID | Ansattes navn | MedarbejderLøn |
---|---|---|
elleve | Rose | 90000 |
1 | John | 50.000 |
to | Samantha | 120000 |
3 | Ingen | 75000 |
4 | Silkeblød | 25000 |
5 | Vædder | 150000 |
6 | Arpit | 80000 |
12 | Sakshi | 45000 |
13 | Jack | 250000 |
Lad os lave en indre sammenføjning på disse to borde og observere resultatet:
Forespørgsel:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails INNER JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Resultat:
Medarbejder-ID | Ansattes navn | MedarbejderLøn |
---|---|---|
7 | Lilje | NUL |
1 | John | 50.000 |
to | Samantha | 120000 |
3 | Ingen | 75000 |
4 | Silkeblød | 25000 |
5 | Vædder | 150000 |
6 | Arpit | 80000 |
I ovenstående resultatsæt kan du se, at Inner Join har returneret de første 6 poster, der var til stede i både EmpDetails og EmpSalary med en matchende nøgle, dvs. EmployeeID. Derfor, hvis A og B er to enheder, returnerer den indre sammenføjning resultatsættet, der svarer til 'Optegnelser i A og B', baseret på matchende nøgle.
Lad os nu se, hvad en Left Outer Join vil gøre.
Forespørgsel:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails LEFT JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Resultat:
Medarbejder-ID | Ansattes navn | MedarbejderLøn |
---|---|---|
1 | John | 50.000 |
to | Samantha | 120000 |
3 | Ingen | 75000 |
4 | Silkeblød | 25000 |
5 | Vædder | 150000 |
6 | Arpit | 80000 |
8 | Sita | NUL |
9 | Farah | NUL |
10 | Jerry | NUL |
I ovenstående resultatsæt kan du se, at venstre ydre sammenføjning har returneret alle de 10 poster fra VENSTRE-tabellen, dvs. EmpDetails-tabellen, og da de første 6 poster matcher, har den returneret medarbejderlønnen for disse matchende poster.
Da resten af posterne ikke har en matchende nøgle i RIGHT-tabellen, dvs. EmpSalary-tabellen, har den returneret NULL svarende til dem. Da Lily, Sita, Farah og Jerry ikke har et matchende medarbejder-id i EmpSalary-tabellen, vises deres løn som NULL i resultatsættet.
Så hvis A og B er to enheder, returnerer venstre ydre sammenføjning resultatsættet, der svarer til 'Optegnelser i A IKKE B', baseret på matchende nøgle.
Lad os nu observere, hvad Right Outer Join gør.
Forespørgsel:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails RIGHT join EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Resultat:
Medarbejder-ID | Ansattes navn | MedarbejderLøn |
---|---|---|
NUL | NUL | 90000 |
1 | John | 50.000 |
to | Samantha | 120000 |
3 | Ingen | 75000 |
4 | Silkeblød | 25000 |
5 | Vædder | 150000 |
6 | Arpit | 80000 |
NUL | NUL | 250000 |
NUL | NUL | 250000 |
I ovenstående resultatsæt kan du se, at Right Outer Join har gjort lige det modsatte af venstre join. Det har returneret alle lønningerne fra den rigtige tabel, dvs. EmpSalary-tabellen.
Men da Rose, Sakshi og Jack ikke har et matchende medarbejder-id i venstre tabel, dvs. EmpDetails-tabellen, har vi deres medarbejder-id og medarbejdernavn som NULL fra venstre bord.
Så hvis A og B er to enheder, vil den højre ydre sammenføjning returnere resultatsættet, der svarer til 'Optegnelser i B IKKE A', baseret på matchende nøgle.
Lad os også se, hvad der bliver resultatsættet, hvis vi udfører en markeringsoperation på alle kolonnerne i begge tabeller.
Forespørgsel:
SELECT * FROM EmpDetails RIGHT JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Resultat:
Medarbejder-ID | Ansattes navn | Medarbejder-ID | Ansattes navn | MedarbejderLøn |
---|---|---|---|---|
NUL | NUL | elleve | Rose | 90000 |
1 | John | 1 | John | 50.000 |
to | Samantha | to | Samantha | 120000 |
3 | Ingen | 3 | Ingen | 75000 |
4 | Silkeblød | 4 | Silkeblød | 25000 |
5 | Vædder | 5 | Vædder | 150000 |
6 | Arpit | 6 | Arpit | 80000 |
NUL | NUL | 12 | Sakshi | 250000 |
NUL | NUL | 13 | Jack | 250000 |
Lad os nu gå ind i Full Join.
En fuld ydre sammenføjning udføres, når vi ønsker alle data fra begge tabeller, uanset om der er et match eller ikke. Derfor, hvis jeg vil have alle medarbejdere, selvom jeg ikke finder en matchende nøgle, kører jeg en forespørgsel som vist nedenfor.
Forespørgsel:
SELECT * FROM EmpDetails FULL JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Resultat:
Medarbejder-ID | Ansattes navn | Medarbejder-ID | Ansattes navn | MedarbejderLøn |
---|---|---|---|---|
7 | Lilje | NUL | NUL | NUL |
1 | John | 1 | John | 50.000 |
to | Samantha | to | Samantha | 120000 |
3 | Ingen | 3 | Ingen | 75000 |
4 | Silkeblød | 4 | Silkeblød | 25000 |
5 | Vædder | 5 | Vædder | 150000 |
6 | Arpit | 6 | Arpit | 80000 |
8 | Sita | NUL | NUL | NUL |
9 | Farah | NUL | NUL | NUL |
10 | Jerry | NUL | NUL | NUL |
NUL | NUL | elleve | Rose | 90000 |
NUL | NUL | 12 | Sakshi | 250000 |
NUL | NUL | 13 | Jack | 250000 |
Du kan se i ovenstående resultatsæt, at da de første seks poster matcher i begge tabeller, har vi fået alle data uden NULL. De næste fire poster findes i venstre tabel, men ikke i højre tabel, så de tilsvarende data i højre tabel er NULL.
De sidste tre poster findes i højre tabel og ikke i venstre tabel, og derfor har vi NULL i de tilsvarende data fra venstre tabel. Så hvis A og B er to enheder, returnerer den fulde ydre sammenføjning resultatsættet, der svarer til 'Optegnelser i A OG B', uanset den matchende nøgle.
Teoretisk er det en kombination af Left Join og Right Join.
Ydeevne
Lad os sammenligne en indre sammenkædning med en venstre ydre sammenkædning i SQL-serveren. Når vi taler om driftshastigheden, er en venstre ydre JOIN naturligvis ikke hurtigere end en indre sammenføjning.
I henhold til definitionen skal en ydre sammenføjning, det være sig venstre eller højre, udføre alt arbejdet med en indre sammenføjning sammen med det ekstra arbejde, der nulstiller resultaterne. En ydre sammenføjning forventes at returnere et større antal poster, hvilket yderligere øger dens samlede eksekveringstid bare på grund af det større resultatsæt.
Således er en ydre sammenføjning langsommere end en indre sammenføjning.
Derudover kan der være nogle specifikke situationer, hvor venstre sammenføjning vil være hurtigere end en indre sammenføjning, men vi kan ikke fortsætte med at erstatte dem med hinanden, da en venstre ydre sammenføjning ikke er funktionelt svarende til en indre sammenføjning.
Lad os diskutere et tilfælde, hvor Left Join måske er hurtigere end Inner Join. Hvis tabellerne, der er involveret i sammenkædningsoperationen, er for små, skal du sige, at de har mindre end 10 poster, og tabellerne ikke har tilstrækkelige indekser til at dække forespørgslen, i så fald er Left Join generelt hurtigere end Inner Join.
Lad os oprette de to nedenstående tabeller og lave en INNER JOIN og en LEFT YDRE JOIN mellem 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 af en indre sammenføjning: ![]() | Nedenfor er visualiseringen af en ydre sammenføjning ![]() | |||
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 forespørgsler returneret det samme resultatsæt. I dette tilfælde, hvis du ser udførelsesplanen for begge forespørgsler, vil du opdage, at den indre sammenføjning har kostet mere end den ydre sammenføjning. Dette skyldes, at SQL-serveren for en indre sammenføjning har en hash-match, mens den indlejrede sløjfer for den venstre sammenføjning.
En hash-match er normalt hurtigere end de indlejrede sløjfer. Men i dette tilfælde, da antallet af rækker er så lille, og der ikke er noget indeks at bruge (som vi laver sammenføjning i navnesøjlen), har hash-operationen vist sig at være en dyreste indre sammenføjningsforespørgsel.
Men hvis du ændrer den matchende nøgle i joinforespørgslen fra navn til ID, og hvis der er et stort antal rækker i tabellen, vil du opdage, at den indre sammenføjning vil være hurtigere end den venstre ydre sammenføjning.
MS Access Indre og ydre tilslutning
Når du bruger flere datakilder i MS Access-forespørgsel, anvender du JOIN'er til at kontrollere de poster, du vil se, afhængigt af hvordan datakilderne er forbundet med hinanden.
hvordan man opsætter formørkelse til c ++
I en indre sammenføjning er kun de relaterede fra begge tabeller kombineret i et enkelt resultatsæt. Dette er en standardtilslutning i Access og den hyppigst anvendte også. Hvis du anvender en sammenkædning, men ikke udtrykkeligt angiver, hvilken type tilslutning det er, antager Access, at det er en indre sammenføjning.
I ydre sammenføjninger kombineres alle relaterede data fra begge tabeller korrekt plus alle de resterende rækker fra en tabel. I fuld ydre sammenføjninger kombineres alle data, hvor det er muligt.
Venstre tilslutning vs Venstre ydre sammenføjning
I SQL-server er nøgleordet ydre valgfrit, når du anvender venstre ydre sammenføjning. Således betyder det ikke nogen forskel, hvis du enten skriver 'LEFT OUTER JOIN' eller 'LEFT JOIN', da begge vil give dig det samme resultat.
EN VENSTRE SAMLING B er en ækvivalent syntaks med EN VENSTRE YDRE BUND B.
Nedenfor er listen over tilsvarende syntakser på SQL-serveren:
(billede kilde )
Venstre ydre sammenføjning vs højre ydre sammenføjning
Vi har allerede set denne forskel i denne artikel. Du kan henvise til forespørgsler om venstre ydre tilslutning og højre ydre tilslutning og resultatsæt for at se forskellen.
Hovedforskellen mellem Left Join og Right Join ligger i inkluderingen af ikke-matchede rækker. Venstre ydre sammenføjning inkluderer de umatchede rækker fra tabellen, der er til venstre for sammenføjningsklausulen, mens en højre ydre sammenføjning inkluderer de umatchede rækker fra tabellen, der er til højre for sammenføjningsklausulen.
Folk spørger, hvad der er bedre at bruge, dvs. venstre deltagelse eller højre deltagelse? Dybest set er de den samme type operationer undtagen med deres argumenter omvendt. Derfor, når du spørger, hvilken deltager du skal bruge, spørger du faktisk om du skal skrive en en. Det er bare et spørgsmål om præference.
Generelt foretrækker folk at bruge Left join i deres SQL-forespørgsel. Jeg vil foreslå, at du skal være konsekvent i den måde, du skriver forespørgslen på for at undgå enhver forvirring i fortolkningen af forespørgslen.
Vi har set alt om indre sammenføjning og alle typer ydre sammenføjninger hidtil. Lad os hurtigt opsummere forskellen mellem indre sammenføjning og ydre sammenføjning.
Forskel mellem indre sammenføjning og ydre sammenføjning i tabelformat
Indre sammenføjning | Ydre sammenføjning |
---|---|
Returnerer kun de rækker, der har matchende værdier i begge tabeller. | Omfatter de matchende rækker såvel som nogle af de ikke-matchende rækker mellem de to tabeller. |
Hvis der er et stort antal rækker i tabellerne, og der er et indeks at bruge, er INNER JOIN generelt hurtigere end OUTER JOIN. | Generelt er en OUTER JOIN langsommere end en INNER JOIN, da den skal returnere flere antal poster sammenlignet med INNER JOIN. Der kan dog være nogle specifikke scenarier, hvor OUTER JOIN er hurtigere. |
Når en kamp ikke findes, returnerer den ikke noget. | Når et match ikke findes, placeres en NULL i den returnerede søjleværdi. |
Brug INNER JOIN, når du vil slå detaljerede oplysninger om en bestemt kolonne op. | Brug OUTER JOIN, når du vil vise listen med alle oplysningerne i de to tabeller. |
INNER JOIN fungerer som et filter. Der skal være et match på begge borde for at en indre sammenføjning kan returnere data. | De fungerer som data-add ons. |
Der findes en implicit sammenføjningsnotation for indre sammenføjning, som anbringer tabeller, der skal sammenføjes med kommasepareret måde i FROM-klausulen. Eksempel: VÆLG * FRA produkt, kategori HVOR produkt.KategoriID = kategori.KategoriID; | Ingen implicit tilslutningsnotation er der for ydre tilslutning. |
Indre og ydre tilslutning vs Union
Til tider forvirrer vi Join og Union, og dette er også et af de mest stillede spørgsmål i SQL-interviews . Vi har allerede set forskellen mellem indre sammenføjning og ydre sammenføjning. Lad os nu se, hvordan en JOIN er forskellig fra en UNION.
UNION placerer en række forespørgsler efter hinanden, mens sammenføjning skaber et kartesisk produkt og undersæt det. Således er UNION og JOIN helt forskellige operationer.
Lad os køre nedenstående to forespørgsler i MySQL og se deres resultat.
UNION-forespørgsel:
SELECT 28 AS bah UNION SELECT 35 AS bah;
Resultat:
Bah | |
---|---|
1 | 28 |
to | 35 |
BLIV FORESPØRGSEL:
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 placerer resultatet af to eller flere forespørgsler i et enkelt resultatsæt. Dette resultatsæt indeholder alle de poster, der returneres gennem alle de forespørgsler, der er involveret i UNIONEN. Således grundlæggende kombinerer en UNION de to resultatsæt sammen.
En sammenkædningsoperation henter data fra to eller flere tabeller baseret på de logiske forhold mellem disse tabeller, dvs. baseret på sammenkædningsbetingelsen. I joinforespørgsel bruges data fra en tabel til at vælge poster fra en anden tabel. Det lader dig linke lignende data, der findes over forskellige tabeller.
For at forstå det meget simpelt kan du sige, at en UNION kombinerer rækker fra to tabeller, mens en sammenføjning kombinerer kolonner fra to eller flere tabeller. Således bruges begge til at kombinere data fra n-tabeller, men forskellen ligger i, hvordan dataene kombineres.
Nedenfor er de billedlige repræsentationer af UNION og JOIN.
Ovenstående er en billedlig gengivelse af en Join-operation, der viser, at hver post i resultatsættet indeholder kolonner fra både tabellerne, dvs. tabel A og tabel B. Dette resultat returneres baseret på den sammenføjningsbetingelse, der er anvendt i forespørgslen.
En sammenføjning er generelt resultatet af denormalisering (modsat af normalisering), og den bruger den fremmede nøgle i en tabel til at slå kolonneværdierne op ved at anvende den primære nøgle i en anden tabel.
Ovenstående er en billedlig gengivelse af en UNION-operation, der viser, at hver rekord i resultatsættet er en række fra en af de to tabeller. Resultatet af UNION har således kombineret rækkerne fra tabel A og tabel B.
Yderligere læsning = >> MySQL UNION forklaret med eksempler
Konklusion
I denne artikel har vi set de store forskelle mellem Indre tilslutning og ydre tilslutning i SQL . Vi så også klassificeringen af en Outer Join, dvs. venstre join, højre join og fuld sammenføjning. Vi har set, hvordan hver af disse sammenføjningstyper fungerer, og hvordan de varierer fra hinanden.
Vi lavede også en præstationssammenligning mellem disse sammenføjningstyper. Vi diskuterede også, hvordan en deltagelse er forskellig fra en fagforening.
Læs også = >> MySQL-tilslutningstyper
Håber, at denne artikel ville have hjulpet dig med at fjerne din tvivl om forskellene mellem de forskellige sammenføjningstyper. Vi er sikre på, at dette faktisk får dig til at beslutte, hvilken type du vil vælge, baseret på det ønskede resultatsæt.
Anbefalet læsning
- Den nøjagtige forskel mellem verifikation og validering med eksempler
- Modem mod router: Kend den nøjagtige forskel
- Forskellen mellem SQL Vs MySQL Vs SQL Server (med eksempler)
- Python DateTime-tutorial med eksempler
- LAN Vs WAN Vs MAN: Præcis forskel mellem typer netværk
- Klip kommando i Unix med eksempler
- Unix Cat Command Syntax, indstillinger med eksempler
- Brug af markør i MongoDB med eksempler