Inner Join vs Outer Join: Diferența exactă cu exemple

Inner Join Vs Outer Join: Pregătiți-vă să explorați diferențele exacte dintre Inner Join și Outer Join

Înainte de a explora diferențele dintre Inner Join Vs Outer Join, haideți să vedem mai întâi ce este un SQL JOIN?

O clauză join este utilizată pentru a combina înregistrări sau pentru a manipula înregistrările din două sau mai multe tabele prin intermediul unei condiții join. Condiția de îmbinare indică modul în care coloanele din fiecare tabel sunt comparate între ele.

Join se bazează pe o coloană legată între aceste tabele. Cel mai comun exemplu este alăturarea dintre două tabele prin intermediul coloanei cheie primară și a coloanei cheie externă.

INNER JOIN VS OUTER JOIN

Să presupunem că avem un tabel care conține salariul angajatului și un alt tabel care conține detaliile angajatului.

În acest caz, va exista o coloană comună, cum ar fi ID-ul angajatului, care va uni aceste două tabele. Această coloană ID-ul angajatului va fi cheia primară a tabelelor de detalii ale angajatului și cheia externă în tabelul de salarii al angajatului.

Este foarte important să avem o cheie comună între cele două entități. Vă puteți gândi la un tabel ca la o entitate, iar cheia ca la o legătură comună între cele două tabele care este utilizată pentru operațiunea de îmbinare.

În principiu, există două tipuri de îmbinare în SQL, și anume Inner Join și Outer Join. Îmbinarea exterioară este în continuare subdivizată în trei tipuri, și anume Left Outer Join, Right Outer Join și Full Outer Join.

În acest articol, vom vedea în detaliu diferența dintre Inner Join și Outer Join. Vom păstra îmbinările încrucișate și îmbinările inegale în afara domeniului de aplicare a acestui articol.

Ce este îmbinarea interioară?

O îmbinare interioară returnează numai rândurile care au valori care se potrivesc în ambele tabele (considerăm aici că îmbinarea se face între cele două tabele).

Ce este îmbinarea exterioară?

Bucătura exterioară include rândurile care se potrivesc, precum și unele dintre rândurile care nu se potrivesc între cele două tabele. O îmbinare exterioară diferă practic de îmbinarea interioară prin modul în care gestionează condiția de potrivire falsă.

Există 3 tipuri de îmbinare exterioară:

  • Left Outer Join: Returnează toate rândurile din tabelul LEFT și înregistrările care corespund între cele două tabele.
  • Right Outer Join: Returnează toate rândurile din tabelul RIGHT și înregistrările corespunzătoare dintre ambele tabele.
  • Full Outer Join: Combină rezultatul Left Outer Join și Right Outer Join.
  • Diferența dintre Inner și Outer Join

    Diferența dintre INNER JOIN și OUTER JOIN

    După cum se arată în diagrama de mai sus, există două entități, și anume tabelul 1 și tabelul 2, iar ambele tabele au date comune.

    Un Inner Join va returna zona comună dintre aceste tabele (zona umbrită cu verde în diagrama de mai sus), adică toate înregistrările care sunt comune între tabelul 1 și tabelul 2.

    Un Left Outer Join va returna toate rândurile din tabelul 1 și doar acele rânduri din tabelul 2 care sunt comune și cu tabelul 1. Un Right Outer Join va face exact opusul. Acesta va oferi toate înregistrările din tabelul 2 și numai înregistrările corespunzătoare din tabelul 1.

    În plus, un Full Outer Join ne va oferi toate înregistrările din tabelul 1 și tabelul 2.

    Să începem cu un exemplu pentru a clarifica acest lucru.

    Să presupunem că avem două tabele: EmpDetails și EmpSalary.

    Tabela AmpDetails:

    .

    .

    .

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

    Tabelă de salarizare a angajaților:

    .

    .

    .

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

    Să facem un Inner Join pe aceste două tabele și să observăm rezultatul:

    Query:

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

Rezultat:

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

Rezultat:

.

.

.

.

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

În setul de rezultate de mai sus, se poate observa că Inner Join a returnat primele 6 înregistrări care erau prezente atât în EmpDetails, cât și în EmpSalary și care au o cheie corespunzătoare i.și anume EmployeeID. Prin urmare, dacă A și B sunt două entități, Inner Join va returna setul de rezultate care va fi egal cu „Records in A and B” (Înregistrări în A și B), pe baza cheii de potrivire.

Vezi acum ce va face un Left Outer Join.

Query:

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

Result:

.

.

.

.

EmployeeID EmployeeName EmployeeSalary
1 John 50000
2 Samantha 120000
3 2 2 3 Hakuna 75000
4 Silky 25000
5 Ram 150000
6 Arpit 80000
7 Lily NULL
8 Sita NULL
9 Farah NULL
10 Jerry NULL

În setul de rezultate de mai sus, se poate observa că îmbinarea externă stângă a returnat toate cele 10 înregistrări din tabelul LEFT i.adică tabelul EmpDetails și, deoarece primele 6 înregistrări se potrivesc, a returnat salariul angajatului pentru aceste înregistrări corespunzătoare.

Deoarece restul înregistrărilor nu au o cheie corespunzătoare în tabelul RIGHT, adică în tabelul EmpSalary, a returnat NULL corespunzător acestora. Deoarece Lily, Sita, Farah, Farah și Jerry nu au un ID de angajat corespunzător în tabelul EmpSalary, salariul lor apare ca fiind NULL în setul de rezultate.

Atunci, dacă A și B sunt două entități, atunci left outer join va returna setul de rezultate care va fi egal cu „Records in A NOT B” (Înregistrări în A NOT B), pe baza cheii corespunzătoare.

Acum să observăm ce face Right Outer Join.

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

În setul de rezultate de mai sus, se poate observa că Right Outer Join a făcut exact opusul join-ului din stânga. Aceasta a returnat toate salariile din tabelul din dreapta, adică din tabelul EmpSalary.

Dar, deoarece Rose, Sakshi și Jack nu au un ID de angajat corespunzător în tabelul din stânga, adică în tabelul EmpDetails, am obținut ID-ul lor de angajat și EmployeeName ca fiind NULL din tabelul din stânga.

Atunci, dacă A și B sunt două entități, atunci îmbinarea exterioară dreaptă va returna setul de rezultate care va fi egal cu „Records in B NOT A” (Înregistrări în B NOT A), pe baza cheii de potrivire.

Să vedem, de asemenea, care va fi setul de rezultate dacă efectuăm o operațiune de selectare pe toate coloanele din ambele tabele.

Query:

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

Rezultat:

.

.

.

.

.

.

.

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

Acum, haideți să trecem la Full Join.

Un full outer join se face atunci când dorim toate datele din ambele tabele, indiferent dacă există sau nu o potrivire. Prin urmare, dacă vreau toți angajații chiar dacă nu găsesc o cheie de potrivire, voi executa o interogare așa cum se arată mai jos.

Query:

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

Rezultat:

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

Rezultat:

.

.

.

.

.

.

.

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

Puteți vedea în setul de rezultate de mai sus că primele șase înregistrări se potrivesc în ambele tabele, am obținut toate datele fără niciun NULL. Următoarele patru înregistrări există în tabelul din stânga, dar nu și în tabelul din dreapta, astfel încât datele corespunzătoare din tabelul din dreapta sunt NULL.

Ultimele trei înregistrări există în tabelul din dreapta și nu în tabelul din stânga, prin urmare avem NULL în datele corespunzătoare din tabelul din stânga. Așadar, dacă A și B sunt două entități, îmbinarea exterioară completă va returna setul de rezultate care va fi egal cu ‘Records in A AND B’, indiferent de cheia de potrivire.

Teoretic, este o combinație între Left Join și Right Join.

Performanță

Să comparăm o îmbinare interioară cu o îmbinare exterioară stângă în serverul SQL. Vorbind despre viteza de operare, un left outer JOIN nu este, în mod evident, mai rapid decât un inner join.

Conform definiției, un outer join, fie că este de stânga sau de dreapta, trebuie să efectueze toată munca unui inner join împreună cu munca suplimentară null- extinderea rezultatelor. Se așteaptă ca o îmbinare exterioară să returneze un număr mai mare de înregistrări, ceea ce crește și mai mult timpul total de execuție doar din cauza setului mai mare de rezultate.

Din acest motiv, o îmbinare exterioară este mai lentă decât o îmbinare interioară.

În plus, pot exista unele situații specifice în care îmbinarea stângă va fi mai rapidă decât o îmbinare interioară, dar nu putem merge mai departe pentru a le înlocui una cu cealaltă, deoarece o îmbinare exterioară stângă nu este echivalentă din punct de vedere funcțional cu o îmbinare interioară.

Să discutăm un exemplu în care îmbinarea stângă ar putea fi mai rapidă decât îmbinarea interioară. Dacă tabelele implicate în operațiunea de îmbinare sunt prea mici, să spunem că au mai puțin de 10 înregistrări, iar tabelele nu posedă indici suficienți pentru a acoperi interogarea, în acest caz, Left Join este, în general, mai rapid decât Inner Join.

Să creăm cele două tabele de mai jos și să facem un INNER JOIN și un LEFT OUTER JOIN între ele ca exemplu:

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 Nume ID Nume Nume
1 1 A 1 A
2 2 2 B 2 2 B 2 B
3 3 C 3 C 4 4 D 4 D
5 5 5 E 5 E
SELECT * FROM (SELECT 38 AS bah) AS foo JOIN (SELECT 35 AS bah) AS barON (55=55);

.

.

.

ID Nume ID Nume
1 1 A 1 A
2 2 2 B 2 B
3 3 C 3 C 4 4 4 D 4 4 D 5 5 E 5 E

Cum se poate vedea mai sus, ambele interogări au returnat același set de rezultate. În acest caz, dacă vizualizați planul de execuție al ambelor interogări, atunci veți constata că îmbinarea interioară a costat mai mult decât îmbinarea exterioară. Acest lucru se datorează faptului că, pentru o îmbinare interioară, serverul SQL face o potrivire hash, în timp ce pentru îmbinarea stângă face bucle imbricate.

O potrivire hash este în mod normal mai rapidă decât buclele imbricate. Dar, în acest caz, deoarece numărul de rânduri este atât de mic și nu există niciun index de utilizat (deoarece facem join pe coloana nume), operația hash s-a dovedit a fi cea mai costisitoare interogare de join intern.

Cu toate acestea, dacă schimbați cheia de potrivire în interogarea de join din Nume în ID și dacă există un număr mare de rânduri în tabel, atunci veți constata că joinul intern va fi mai rapid decât joinul extern stâng.

MS Access Inner and Outer Join

Când folosiți mai multe surse de date în interogarea MS Access, atunci aplicați JOIN-uri pentru a controla înregistrările pe care doriți să le vedeți, în funcție de modul în care sursele de date sunt legate între ele.

Într-o îmbinare interioară, doar cele legate din ambele tabele sunt combinate într-un singur set de rezultate. Aceasta este o îmbinare implicită în Access și, de asemenea, cea mai frecvent utilizată. Dacă aplicați o îmbinare, dar nu specificați în mod explicit ce tip de îmbinare este, atunci Access presupune că este o îmbinare interioară.

În îmbinările exterioare, toate datele legate din ambele tabele sunt combinate corect, plus toate rândurile rămase dintr-o singură tabelă. În îmbinările exterioare complete, toate datele sunt combinate ori de câte ori este posibil.

Left Join vs Left Outer Join

În SQL server, cuvântul cheie outer este opțional atunci când se aplică left outer join. Astfel, nu există nicio diferență dacă scrieți fie ‘LEFT OUTER JOIN’, fie ‘LEFT JOIN’, deoarece ambele vă vor da același rezultat.

A LEFT JOIN B este o sintaxă echivalentă cu A LEFT OUTER JOIN B.

Mai jos este lista de sintaxe echivalente în SQL server:

Sintaxe echivalente în SQL server

Left Outer Join vs Right Outer Join

Am văzut deja această diferență în acest articol. Puteți consulta interogările Left Outer Join și Right Outer Join și setul de rezultate pentru a vedea diferența.

Principala diferență între Left Join și Right Join constă în includerea rândurilor nepotrivite. Left outer join include rândurile nepotrivite din tabelul care se află în stânga clauzei de alăturare, în timp ce Right outer join include rândurile nepotrivite din tabelul care se află în dreapta clauzei de alăturare.

Oamenii se întreabă ce este mai bine de utilizat, adică Left join sau Right join? Practic, sunt același tip de operații, doar că au argumentele inversate. Prin urmare, atunci când întrebați ce join să folosiți, întrebați de fapt dacă să scrieți a<b sau b>a. Este doar o chestiune de preferință.

În general, oamenii preferă să folosească Left join în interogarea lor SQL. V-aș sugera să rămâneți consecvenți în modul în care scrieți interogarea pentru a evita orice confuzie în interpretarea interogării.

Am văzut totul despre Inner join și toate tipurile de Outer join până acum. Să rezumăm rapid diferența dintre Inner Join și Outer Join.

Diferența dintre Inner Join și Outer Join în format tabelar

Inner Join Outer Join
Întoarce numai rândurile care au valori corespunzătoare în ambele tabele. Include rândurile care se potrivesc, precum și unele dintre rândurile care nu se potrivesc între cele două tabele.
În cazul în care există un număr mare de rânduri în tabele și trebuie utilizat un index, INNER JOIN este, în general, mai rapid decât OUTER JOIN. În general, un OUTER JOIN este mai lent decât un INNER JOIN, deoarece trebuie să returneze un număr mai mare de înregistrări în comparație cu INNER JOIN. Cu toate acestea, pot exista unele scenarii specifice în care OUTER JOIN este mai rapid.
Când nu se găsește o potrivire, nu returnează nimic. Când nu se găsește o potrivire, se plasează un NULL în valoarea coloanei returnate.
Utilizați INNER JOIN atunci când doriți să căutați informații detaliate ale unei anumite coloane. Utilizați OUTER JOIN atunci când doriți să afișați lista tuturor informațiilor din cele două tabele.
INNER JOIN acționează ca un filtru. Trebuie să existe o potrivire în ambele tabele pentru ca o îmbinare interioară să returneze date. Actuează ca niște adaosuri de date.
Există o notație de îmbinare implicită pentru îmbinarea interioară care înrolează tabelele care urmează să fie îmbinate în mod separat prin virgulă în clauza FROM.
Exemplu: SELECT * FROM product, category WHERE product.CategoryID = category.CategoryID;
Nu există o notație de îmbinare implicită pentru îmbinarea exterioară.
Mai jos este vizualizată o îmbinare interioară:
vizualizarea unei îmbinări interioare
Mai jos este vizualizarea unei îmbinări exterioare
vizualizarea unei îmbinări exterioare

Inner and Outer Join vs Union

În anumite momente, confundăm Join și Union și aceasta este, de asemenea, una dintre cele mai frecvente întrebări adresate în interviurile SQL. Am văzut deja diferența dintre inner join și outer join . Acum, haideți să vedem prin ce se deosebește un JOIN de un UNION.

UNION plasează o linie de interogări una după alta, în timp ce join creează un produs cartezian și îl subsumează. Astfel, UNION și JOIN sunt operații complet diferite.

Să rulăm cele două interogări de mai jos în MySQL și să vedem rezultatul lor.

UNION Interogare:

SELECT 28 AS bahUNIONSELECT 35 AS bah;

Rezultat:

Bah
1 28
2 35

JOIN Query:

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

Rezultat:

.

foo Bar
1 38 35

Operația UNION pune rezultatul a două sau mai multe interogări într-un singur set de rezultate. Acest set de rezultate conține toate înregistrările care sunt returnate prin toate interogările implicate în operațiunea UNION. Astfel, practic, o UNION combină cele două seturi de rezultate împreună.

O operație de îmbinare extrage date din două sau mai multe tabele pe baza relațiilor logice dintre aceste tabele, adică pe baza condiției de îmbinare. În interogarea join, datele dintr-un tabel sunt utilizate pentru a selecta înregistrări dintr-un alt tabel. Aceasta vă permite să legați date similare care sunt prezente în tabele diferite.

Pentru a înțelege foarte simplu, se poate spune că o UNION combină rânduri din două tabele, în timp ce o join combină coloane din două sau mai multe tabele. Astfel, ambele sunt folosite pentru a combina datele din n tabele, dar diferența constă în modul în care sunt combinate datele.

Mai jos sunt reprezentările picturale ale UNION și JOIN.

UNION și JOIN1

Cea de mai sus este o reprezentare picturală a unei operații de îmbinare care descrie faptul că fiecare înregistrare din setul de rezultate conține coloane din ambele tabele, adică tabelul A și tabelul B. Acest rezultat este returnat pe baza condiției de îmbinare aplicată în interogare.

O alăturare este, în general, rezultatul denormalizării (opusul normalizării) și utilizează cheia externă a unui tabel pentru a căuta valorile coloanelor prin utilizarea cheii primare dintr-un alt tabel.

UNION și JOIN2

Cea de mai sus este o reprezentare picturală a unei operații UNION care arată că fiecare înregistrare din setul de rezultate este un rând din oricare dintre cele două tabele. Astfel, rezultatul operației UNION a combinat rândurile din tabelul A și tabelul B.

Citește mai departe =>> MySQL UNION explicat cu exemple

Concluzie

În acest articol, am văzut diferențele majore dintre Inner Join și Outer Join în SQL. Am văzut, de asemenea, clasificarea unui Outer Join, și anume Left join, Right join și Full join. Am văzut cum funcționează fiecare dintre aceste tipuri de join și cum diferă unul de celălalt.

Am făcut, de asemenea, o comparație de performanță între aceste tipuri de join. Am discutat, de asemenea, despre modul în care o îmbinare este diferită de o uniune.

De asemenea, citiți =>> MySQL Join Types

Sperăm că acest articol v-a ajutat să vă clarificați îndoielile cu privire la diferențele dintre diferitele tipuri de îmbinare. Suntem siguri că acesta vă va face într-adevăr să decideți ce tip de join să alegeți în funcție de setul de rezultate dorit.

.