Inner Join Vs Outer Join: Præcis forskel med eksempler

Inner Join Vs Outer Join: Lad os først se, hvad der er en SQL JOIN: Bliv klar til at udforske de nøjagtige forskelle mellem Inner Join Vs Outer Join

Hvor vi udforsker forskellene mellem Inner Join Vs Outer Join, lad os først se, hvad er en SQL JOIN?

En join-klausul bruges til at kombinere poster eller til at manipulere posterne fra to eller flere tabeller gennem en join-betingelse. Joinbetingelsen angiver, hvordan kolonner fra hver tabel matches mod hinanden.

Join er baseret på en relateret kolonne mellem disse tabeller. Et mest almindeligt eksempel er sammenføjningen mellem to tabeller via primærnøglespalten og fremmednøglespalten.

INNER JOIN VS OUTER JOIN

Sæt, vi har fået en tabel, som indeholder medarbejderens løn, og der er en anden tabel, som indeholder medarbejderoplysninger.

I dette tilfælde vil der være en fælles kolonne som medarbejder-ID, som vil sammenføje disse to tabeller. Denne kolonne medarbejder-id vil være primærnøglen i tabellerne med medarbejderoplysninger og fremmednøglen i tabellen medarbejderløn.

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, som bruges til join-operationen.

Grundlæggende er der to typer af Join i SQL, nemlig Inner Join og Outer Join. Outer Join er yderligere underopdelt i tre typer, dvs. Left Outer Join, Right Outer Join og Full Outer Join.

I denne artikel vil vi se forskellen mellem Inner Join og Outer Join i detaljer. Vi vil holde Cross Joins og Unequal Joins uden for denne artikels anvendelsesområde.

Hvad er Inner Join?

Et Inner Join returnerer kun de rækker, der har matchende værdier i begge tabeller (vi overvejer her, at joinet er udført mellem de to tabeller).

Hvad er Outer Join?

Outer Join omfatter de matchende rækker samt nogle af de ikke-matchende rækker mellem de to tabeller. Et Outer Join adskiller sig grundlæggende fra Inner Join ved den måde, hvorpå den håndterer betingelsen om falsk matchning.

Der findes 3 typer Outer Join:

  • Left Outer Join:
  • : Returnerer alle rækker fra tabellen LEFT og matchende poster mellem begge tabeller.
  • : Right Outer Join:
  • Full Outer Join: Returnerer alle rækker fra tabellen RIGHT og tilsvarende poster mellem de to tabeller.
  • Full Outer Join: Returnerer alle rækker fra tabellen RIGHT og tilsvarende poster mellem de to tabeller: Det kombinerer resultatet af Left Outer Join og Right Outer Join.

Forskel mellem Inner og Outer Join

 Forskel mellem INNER JOIN og OUTER JOIN

Som det fremgår af ovenstående diagram, er der to enheder, dvs. tabel 1 og tabel 2, og begge tabeller har nogle fælles data.

Et Inner Join returnerer det fælles område mellem disse tabeller (det grønt skraverede område i diagrammet ovenfor), dvs. alle de poster, der er fælles for tabel 1 og tabel 2.

Et Left Outer Join returnerer alle rækker fra tabel 1 og kun de rækker fra tabel 2, som også er fælles for tabel 1. Et Right Outer Join vil gøre det stik modsatte. Det vil give alle poster fra tabel 2 og kun de tilsvarende matchende poster fra tabel 1.

En Full Outer Join vil desuden give os alle poster fra tabel 1 og tabel 2.

Lad os starte med et eksempel for at gøre dette tydeligere.

Sæt, vi har to tabeller: EmpDetails og EmpSalary.

Tabel EmpDetails:

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

EmpSalærtabel:

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

Lad os lave et Inner Join på disse to tabeller og observere resultatet:

Søgning:

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

Resultat:

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

I ovenstående resultatmængde, kan du se, at Inner Join har returneret de første 6 poster, der var til stede i både EmpDetails og EmpSalary, og som har en matchende nøgle i.e. EmployeeID. Hvis A og B er to enheder, vil Inner Join derfor returnere det resultatsæt, der vil være lig med “Records in A and B”, baseret på den matchende nøgle.

Lad os nu se, hvad et Left Outer Join vil gøre.

Query:

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

Resultat:

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 Sita NULL 9 Farah NULL 10 Jerry NULL

I ovenstående resultatmængde, kan du se, at left outer joinet har returneret alle 10 poster fra LEFT-tabellen i.e. EmpDetails tabellen, og da de første 6 poster er matchende, 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 disse. Da Lily, Sita, Farah og Jerry ikke har et matchende medarbejder-id i tabellen EmpSalary, vises deres løn som NULL i resultatmængden.

Så hvis A og B er to enheder, vil left outer join returnere resultatmængden, der vil være lig med “Records in A NOT B”, baseret på den matchende nøgle.

Lad os nu se, hvad Right Outer Join gør.

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 90000 NULL NULL 250000 NULL NULL NULL 250000

I ovenstående resultatmængde, kan du se, at Right Outer Join har gjort lige det modsatte af Left Join. Det har returneret alle lønningerne fra den højre tabel, dvs. tabellen EmpSalary.

Men da Rose, Sakshi og Jack ikke har et matchende medarbejder-id i den venstre tabel, dvs. tabellen EmpDetails, har vi fået deres Employee ID og EmployeeName som NULL fra den venstre tabel.

Så, hvis A og B er to enheder, vil den højre ydre sammenføjning returnere resultatsættet, der vil være lig med “Records in B NOT A”, baseret på den matchende nøgle.

Lad os også se, hvad der vil være resultatsættet, hvis vi foretager en select-operation på alle kolonnerne i begge tabeller.

Query:

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

Resultat:

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

Nu, lad os gå over til 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 ej. Hvis jeg derfor vil have alle de ansatte, selv om jeg ikke finder en matchende nøgle, kører jeg en forespørgsel som vist nedenfor.

Query:

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

Resultat:

>

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

Du kan se i ovenstående resultatsæt, at de første seks poster matcher i begge tabeller, vi har fået alle data uden NULL. De næste fire poster findes i den venstre tabel, men ikke i den højre tabel, og de tilsvarende data i den højre tabel er derfor NULL.

De sidste tre poster findes i den højre tabel og ikke i den venstre tabel, og vi har derfor NULL i de tilsvarende data fra den venstre tabel. Så hvis A og B er to enheder, vil den fulde ydre sammenføjning returnere resultatsættet, der vil være lig med “Records in A AND B”, uanset den matchende nøgle.

Theoretisk set er det en kombination af Left Join og Right Join.

Performance

Lad os sammenligne en Inner Join med en Left Outer Join i SQL-serveren. Når vi taler om hastigheden af operationen, er et left outer JOIN naturligvis ikke hurtigere end et inner join.

Som pr. definition skal et outer join, uanset om det er venstre eller højre, udføre alt arbejdet i et inner join sammen med det ekstra arbejde null- udvidelse af resultaterne. Et outer join forventes at returnere et større antal poster, hvilket yderligere øger den samlede udførelsestid alene på grund af det større resultatsæt.

Dermed er et outer join langsommere end et inner join.

Dertil kommer, at der kan være nogle specifikke situationer, hvor Left join vil være hurtigere end et Inner join, men vi kan ikke fortsætte med at erstatte dem med hinanden, da et Left outer join ikke funktionelt svarer til et Inner join.

Lad os diskutere et eksempel, hvor Left join kan være hurtigere end Inner join. Hvis de tabeller, der er involveret i join-operationen, er for små, f.eks. har mindre end 10 poster, og tabellerne ikke har tilstrækkelige indekser til at dække forespørgslen, er Left Join generelt hurtigere end Inner Join.

Lad os oprette de to nedenstående tabeller og lave et INNER JOIN og et LEFT OUTER 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 t1INNER JOIN #Table2 t2ON t2.Name = t1.Name
ID Name ID ID Name
1 1 1 A 1 A 2 2 2 B 2 2 B 3 3 C 3 3 C 4 4 4 D D 4 D 5 5 E 5 E E

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

Som du kan se ovenfor, har begge forespørgsler returneret det samme sæt resultater. Hvis du i dette tilfælde ser udførelsesplanen for begge forespørgsler, vil du opdage, at det indre join har kostet mere end det ydre join. Det skyldes, at SQL-serveren for et inner join udfører et hash-match, mens den udfører nested loops for left join.

Et hash-match er normalt hurtigere end de nested loops. Men i dette tilfælde, da antallet af rækker er så lille, og der ikke er noget indeks at bruge (da vi laver join på navnespalten), har hash-operationen vist sig at være den dyreste inner join-forespørgsel.

Men hvis du ændrer den matchende nøgle i join-forespørgslen fra Name til ID, og hvis der er et stort antal rækker i tabellen, vil du opdage, at inner join vil være hurtigere end left outer join.

MS Access Inner og Outer Join

Når du bruger flere datakilder i MS Access-forespørgsler, anvender du JOINs for at styre de poster, du ønsker at se, afhængigt af, hvordan datakilderne er forbundet med hinanden.

I et inner join kombineres kun de relaterede fra begge tabeller i et enkelt resultatsæt. Dette er en standardforbindelse i Access, og det er også den mest anvendte. Hvis du anvender en sammenføjning, men ikke udtrykkeligt angiver, hvilken type sammenføjning det er, antager Access, at det er en indre sammenføjning.

I ydre sammenføjninger kombineres alle de relaterede data fra begge tabeller korrekt, plus alle de resterende rækker fra den ene tabel. I fulde outer joins kombineres alle data så vidt muligt.

Left Join vs Left Outer Join

I SQL server er nøgleordet outer valgfrit, når du anvender left outer join. Det gør således ingen forskel, om du enten skriver ‘LEFT OUTER JOIN’ eller ‘LEFT JOIN’, da begge vil give dig det samme resultat.

A LEFT JOIN B er en tilsvarende syntaks til A LEFT OUTER JOIN B.

Nedenfor er listen over ækvivalente syntakser i SQL server:

Ækvivalente syntakser i SQL server

Left Outer Join vs Right Outer Join

Vi har allerede set denne forskel i denne artikel. Du kan henvise til forespørgslerne Left Outer Join og Right Outer Join og resultatsættet for at se forskellen.

Den vigtigste forskel mellem Left Join og Right Join ligger i medtagelsen af ikke-overensstemmende rækker. Left outer join omfatter de ikke-matchede rækker fra den tabel, der er til venstre for join-klausulen, mens et Right outer join omfatter de ikke-matchede rækker fra den tabel, der er til højre for join-klausulen.

Mennesker spørger, hvad der er bedst at bruge, dvs. Left join eller Right join? Grundlæggende er det den samme type operationer, bortset fra at argumenterne er omvendt. Når man spørger, hvilken join man skal bruge, spørger man derfor i virkeligheden, om man skal skrive a<b eller b>a. Det er blot et spørgsmål om præference.

Generelt set foretrækker folk at bruge Left join i deres SQL-forespørgsel. Jeg vil foreslå, at du bør forblive konsekvent i den måde, du skriver forespørgslen på, for at undgå forvirring ved fortolkningen af forespørgslen.

Vi har set alt om Inner join og alle typer Outer joins indtil videre. Lad os hurtigt opsummere forskellen mellem Inner Join og Outer Join.

Forskellen mellem Inner Join og Outer Join i tabelformat

Inner Join Outer Join
Returnerer kun de rækker, der har matchende værdier i begge tabeller. Inkluderer de matchende rækker samt nogle af de ikke-matchende rækker mellem de to tabeller.
Hvis der er et stort antal rækker i tabellerne, og der skal bruges et indeks, 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 der ikke findes et match, returnerer den ikke noget. Når der ikke findes et match, placeres der en NULL i den returnerede kolonneværdi.
Brug INNER JOIN, når du vil søge detaljerede oplysninger om en bestemt kolonne. Brug OUTER JOIN, når du vil vise en liste over alle oplysninger i de to tabeller.
INNER JOIN fungerer som et filter. Der skal være et match i begge tabeller, for at et inner join kan returnere data. De fungerer som data-add ons.
Implicit join-notation findes for inner join, som angiver tabeller, der skal sammenføjes på en kommasepareret måde i FROM-klausulen.
Eksempel: SELECT * FROM product, category WHERE product.CategoryID = category.CategoryID;
Der er ingen implicit join-notation for outer join.
Nedenfor er visualiseringen af et indre join:
visualisering af et indre join
Nedenfor er visualiseringen af et ydre join
visualisering af et ydre join

Inner og Outer Join vs Union

I nogle tilfælde forveksler 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 inner join og outer join . Lad os nu se, hvordan en JOIN adskiller sig fra en UNION.

UNION placerer en række forespørgsler efter hinanden, hvorimod join skaber et kartesisk produkt og undergrupperer det. UNION og JOIN er således helt forskellige operationer.

Lad os køre nedenstående to forespørgsler i MySQL og se deres resultat.

UNION Forespørgsel:

SELECT 28 AS bahUNIONSELECT 35 AS bah;

Resultat:

SELECT 28 AS bahUNIONSELECT 35 AS bah;

Resultat:

Bah
1 28
2 35

JOIN Forespørgsel:

JOIN Forespørgsel:

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

Resultat:

SELECT * FROM(SELECT 38 AS bah) AS fooJOIN(SELECT 35 AS bah) AS barON (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 er returneret gennem alle de forespørgsler, der er involveret i UNION. En UNION kombinerer således grundlæggende de to resultatmængder sammen.

En join-operation henter data fra to eller flere tabeller på grundlag af de logiske relationer mellem disse tabeller, dvs. på grundlag af join-betingelsen. I en join-forespørgsel bruges data fra én tabel til at vælge poster fra en anden tabel. Det giver dig mulighed for at sammenkæde lignende data, der er til stede i forskellige tabeller.

For at forstå det meget enkelt kan man sige, at en UNION kombinerer rækker fra to tabeller, mens en join kombinerer kolonner fra to eller flere tabeller. Begge bruges således til at kombinere data fra n tabeller, men forskellen ligger i, hvordan dataene kombineres.

Nedenfor er de billedlige repræsentationer af UNION og JOIN.

UNION og JOIN1

Overstående er en billedlig fremstilling af en Join-operation, der viser, at hver post i resultatmængden indeholder kolonner fra begge tabeller, dvs. tabel A og tabel B. Dette resultat returneres på grundlag af den join-betingelse, der er anvendt i forespørgslen.

Et join er generelt resultatet af denormalisering (det modsatte af normalisering), og det bruger fremmednøglen i en tabel til at slå kolonneværdierne op ved hjælp af primærnøglen i en anden tabel.

UNION og JOIN2

Ovenstående er en billedlig fremstilling af en UNION-operation, der viser, at hver post i resultatmængden er en række fra en af de to tabeller. Således har resultatet af UNION’en kombineret rækkerne fra tabel A og tabel B.

Videre læsning =>> MySQL UNION forklaret med eksempler

Slutning

I denne artikel har vi set de store forskelle mellem Inner Join og Outer Join i SQL. Vi så også klassifikationen af et Outer Join, dvs. Left join, Right join og Full join. Vi har set, hvordan hver af disse join-typer fungerer, og hvordan de varierer fra hinanden.

Vi har også foretaget en sammenligning af ydeevnen mellem disse join-typer. Vi har også diskuteret, hvordan et join er forskelligt fra en union.

Læs også =>> MySQL Join Types

Håber denne artikel har hjulpet dig med at rydde din tvivl om forskellene mellem de forskellige join-typer. Vi er sikre på, at dette faktisk vil få dig til at beslutte, hvilken join-type du skal vælge fra baseret på det ønskede resultatsæt.