inner join vs outer join
Alăturare interioară împotriva alăturării externe: Pregătește-te să explorezi diferențele exacte dintre îmbinarea interioară și exterioară
Înainte de a explora diferențele dintre Inner Join Vs Outer Join, hai să vedem mai întâi ce este un SQL JOIN?
O clauză de asociere este utilizată pentru a combina înregistrări sau pentru a manipula înregistrările din două sau mai multe tabele printr-o condiție de asociere. Condiția de asociere indică modul în care coloanele din fiecare tabel se potrivesc una cu cealaltă.
Alăturarea se bazează pe o coloană legată între aceste tabele. Un exemplu cel mai frecvent este îmbinarea dintre două tabele prin coloana cheie primară și coloana cheie străină.
Să presupunem că avem un tabel care conține salariul angajaților și există un alt tabel care conține detalii despre angajați.
În acest caz, va exista o coloană comună, cum ar fi ID-ul angajatului, care se va alătura acestor două tabele. Această coloană ID angajat ar fi cheia principală a tabelelor cu detalii despre angajați și cheia străină din tabelul salariilor angajaților.
Este foarte important să aveți o cheie comună între cele două entități. Vă puteți gândi la un tabel ca la o entitate și la cheie ca la o legătură comună între cele două tabele care este utilizată pentru operația de asociere.
software-ul de recunoaștere a vorbirii este cel mai popular pentru
Practic, există două tipuri de Join in SQL, adică Alăturare interioară și alăturare exterioară . Îmbinarea exterioară este în continuare împărțită în trei tipuri, adică Alăturare exterioară stângă, Alăturare exterioară dreaptă și Alăturare exterioară completă.
În acest articol, vom vedea diferența dintre Alăturare interioară și alăturare exterioară detaliat. Vom menține Îmbinările încrucișate și Îmbinările inegale în afara acestui domeniu.
Ce veți învăța:
- Ce este Inner Join?
- Ce este Outer Join?
- Diferența dintre îmbinarea interioară și exterioară
- Performanţă
- Alăturare interioară și exterioară MS Access
- Alăturare stânga vs Alăturare exterioară stângă
- Alăturare exterioară stângă vs Alăturare exterioară dreaptă
- Diferența dintre îmbinarea interioară și îmbinarea exterioară în format tabelar
- Inner and Outer Join vs Union
- Concluzie
- Lectură recomandată
Ce este Inner Join?
O Asociere interioară returnează numai rândurile care au valori potrivite în ambele tabele (luăm în considerare aici asocierea se face între cele două tabele).
Ce este Outer Join?
Îmbinarea exterioară include rândurile potrivite, precum și unele dintre rândurile care nu se potrivesc între cele două tabele. O îmbinare exterioară diferă practic de îmbinarea interioară în modul în care gestionează condiția de potrivire falsă.
Există 3 tipuri de îmbinare exterioară:
- Stânga la exterior : Returnează toate rândurile din tabelul STÂNGA și înregistrările potrivite între ambele tabele.
- Alăturați-vă la dreapta : Returnează toate rândurile din tabelul DREAPTA și înregistrările potrivite între ambele tabele.
- Alăturare completă exterioară : Combină rezultatul îmbinării exterioare stânga și îmbinării exterioare dreapta.
Diferența dintre îmbinarea interioară și exterioară
(imagine sursă )
Așa cum se arată în diagrama de mai sus, există două entități, adică tabelul 1 și tabelul 2 și ambele tabele împărtășesc câteva date comune.
O Alăturare interioară va returna zona comună dintre aceste tabele (zona verde umbrită din diagrama de mai sus), adică toate înregistrările care sunt comune între tabelul 1 și tabelul 2.
O îmbinare exterioară stângă va returna toate rândurile din tabelul 1 și numai acele rânduri din tabelul 2 care sunt comune și tabelului 1. O îmbinare exterioară dreaptă va face exact opusul. Va da toate înregistrările din tabelul 2 și numai înregistrările corespunzătoare corespunzătoare din tabelul 1.
În plus, o completare completă ne va oferi toate înregistrările din tabelul 1 și tabelul 2.
Să începem cu un exemplu pentru a face acest lucru mai clar.
Să presupunem că avem două Mese: EmpDetails și EmpSalary .
Tabel EmpDetails:
Card de identitate al angajatului | Numele angajatului |
7 | Crin |
1 | Ioan |
Două | Samantha |
3 | Nici unul |
4 | Mătăsos |
5 | RAM |
6 | Arpit |
8 | Sita |
9 | Farah |
10 | Jerry |
Tabel EmpSalary:
Card de identitate al angajatului | Numele angajatului | Salariul angajaților |
---|---|---|
unsprezece | Trandafir | 90000 |
1 | Ioan | 50.000 |
Două | Samantha | 120000 |
3 | Nici unul | 75000 |
4 | Mătăsos | 25000 |
5 | RAM | 150000 |
6 | Arpit | 80000 |
12 | Sakshi | 45000 |
13 | Jack | 250.000 |
Să facem o Alăturare interioară pe aceste două tabele și să observăm rezultatul:
Interogare:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails INNER JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Rezultat:
Card de identitate al angajatului | Numele angajatului | Salariul angajaților |
---|---|---|
7 | Crin | NUL |
1 | Ioan | 50.000 |
Două | Samantha | 120000 |
3 | Nici unul | 75000 |
4 | Mătăsos | 25000 |
5 | RAM | 150000 |
6 | Arpit | 80000 |
În setul de rezultate de mai sus, puteți vedea că Inner Join a returnat primele 6 înregistrări care erau prezente atât în EmpDetails, cât și în EmpSalary având o cheie potrivită, adică EmployeeID. Prin urmare, dacă A și B sunt două entități, Unirea interioară va returna setul de rezultate care va fi egal cu „Înregistrări în A și B”, pe baza cheii potrivite.
Să vedem acum ce va face o Alăturare exterioară stângă.
Interogare:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails LEFT JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Rezultat:
Card de identitate al angajatului | Numele angajatului | Salariul angajaților |
---|---|---|
1 | Ioan | 50.000 |
Două | Samantha | 120000 |
3 | Nici unul | 75000 |
4 | Mătăsos | 25000 |
5 | RAM | 150000 |
6 | Arpit | 80000 |
8 | Sita | NUL |
9 | Farah | NUL |
10 | Jerry | NUL |
În setul de rezultate de mai sus, puteți vedea că îmbinarea exterioară stângă a returnat toate cele 10 înregistrări din tabelul STÂNGA, adică tabelul EmpDetails și, deoarece primele 6 înregistrări sunt potrivite, a returnat salariul angajaților pentru aceste înregistrări potrivite.
Deoarece restul înregistrărilor nu au o cheie potrivită în tabela DREAPTA, adică tabela EmpSalary, a returnat NUL corespunzător celor. Întrucât, Lily, Sita, Farah și Jerry nu au un ID de angajat corespunzător în tabelul EmpSalary, Salariul lor apare ca NULL în setul de rezultate.
Deci, dacă A și B sunt două entități, atunci unirea exterioară stângă va returna setul de rezultate care va fi egal cu „Înregistrări în A NU B”, pe baza cheii potrivite.
Acum, să observăm ce face Îmbinarea Exterioară Dreaptă.
Interogare:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails RIGHT join EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Rezultat:
Card de identitate al angajatului | Numele angajatului | Salariul angajaților |
---|---|---|
NUL | NUL | 90000 |
1 | Ioan | 50.000 |
Două | Samantha | 120000 |
3 | Nici unul | 75000 |
4 | Mătăsos | 25000 |
5 | RAM | 150000 |
6 | Arpit | 80000 |
NUL | NUL | 250.000 |
NUL | NUL | 250.000 |
În setul de rezultate de mai sus, puteți vedea că îmbinarea exterioară dreaptă a făcut exact opusul îmbinării stânga. A returnat toate salariile din tabelul din dreapta, adică din tabelul EmpSalary.
Dar, întrucât Rose, Sakshi și Jack nu au un ID de angajat care se potrivește în tabelul din stânga, adică tabelul EmpDetails, le-am obținut ID-ul de angajat și Numele de angajat ca NULL din tabelul din stânga.
Deci, dacă A și B sunt două entități, atunci îmbinarea exterioară dreaptă va returna setul de rezultate care va fi egal cu „Înregistrări în B NU A”, pe baza cheii potrivite.
Să vedem, de asemenea, care va fi setul de rezultate dacă facem o operație de selectare pe toate coloanele din ambele tabele.
Interogare:
SELECT * FROM EmpDetails RIGHT JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Rezultat:
Card de identitate al angajatului | Numele angajatului | Card de identitate al angajatului | Numele angajatului | Salariul angajaților |
---|---|---|---|---|
NUL | NUL | unsprezece | Trandafir | 90000 |
1 | Ioan | 1 | Ioan | 50.000 |
Două | Samantha | Două | Samantha | 120000 |
3 | Nici unul | 3 | Nici unul | 75000 |
4 | Mătăsos | 4 | Mătăsos | 25000 |
5 | RAM | 5 | RAM | 150000 |
6 | Arpit | 6 | Arpit | 80000 |
NUL | NUL | 12 | Sakshi | 250.000 |
NUL | NUL | 13 | Jack | 250.000 |
Acum, să ne mutăm în Alăturare Completă.
O îmbinare exterioară completă 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 potrivită, voi rula o interogare așa cum se arată mai jos.
Interogare:
SELECT * FROM EmpDetails FULL JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Rezultat:
Card de identitate al angajatului | Numele angajatului | Card de identitate al angajatului | Numele angajatului | Salariul angajaților |
---|---|---|---|---|
7 | Crin | NUL | NUL | NUL |
1 | Ioan | 1 | Ioan | 50.000 |
Două | Samantha | Două | Samantha | 120000 |
3 | Nici unul | 3 | Nici unul | 75000 |
4 | Mătăsos | 4 | Mătăsos | 25000 |
5 | RAM | 5 | RAM | 150000 |
6 | Arpit | 6 | Arpit | 80000 |
8 | Sita | NUL | NUL | NUL |
9 | Farah | NUL | NUL | NUL |
10 | Jerry | NUL | NUL | NUL |
NUL | NUL | unsprezece | Trandafir | 90000 |
NUL | NUL | 12 | Sakshi | 250.000 |
NUL | NUL | 13 | Jack | 250.000 |
Puteți vedea în setul de rezultate de mai sus că, deoarece primele șase înregistrări se potrivesc în ambele tabele, avem toate datele fără NULL. Următoarele patru înregistrări există în tabelul din stânga, dar nu în tabelul din dreapta, astfel 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. Deci, dacă A și B sunt două entități, îmbinarea exterioară completă va returna setul de rezultate care va fi egal cu „Înregistrări în A ȘI B”, indiferent de cheia potrivită.
Teoretic, este o combinație de Îmbinare stângă și Alăturare dreaptă.
Performanţă
Să comparăm o Alăturare interioară cu o Alăturare exterioară stângă în serverul SQL. Vorbind despre viteza de funcționare, un JOIN exterior stâng nu este evident mai rapid decât un join interior.
Conform definiției, o îmbinare exterioară, fie ea stângă sau dreaptă, trebuie să efectueze toate lucrările unei îmbinări interioare împreună cu lucrarea suplimentară nulă - extindând rezultatele. O îmbinare exterioară este de așteptat să returneze un număr mai mare de înregistrări, ceea ce crește și mai mult timpul său de execuție doar datorită setului de rezultate mai mare.
Astfel, o îmbinare exterioară este mai lentă decât o îmbinare interioară.
Mai mult, pot exista anumite situații specifice în care îmbinarea stângă va fi mai rapidă decât o îmbinare interioară, dar nu putem continua pentru înlocuirea lor 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 despre un caz în care Alăturarea stângă ar putea fi mai rapidă decât Alăturarea interioară. Dacă tabelele implicate în operațiunea de asociere sunt prea mici, spuneți că au mai puțin de 10 înregistrări și că tabelele nu au indici suficienți pentru a acoperi interogarea, în acest caz, Asocierea la stânga este în general mai rapidă decât Asocierea interioară.
Haideți să creăm cele două tabele de mai jos și să facem un JOINER INTERIOR și un JOIN 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 t1 INNER JOIN #Table2 t2 ON t2.Name = t1.Name
ID | Nume | ID | Nume | |
---|---|---|---|---|
Mai jos este vizualizarea unei îmbinări interioare: | Mai jos este vizualizarea unei îmbinări exterioare | |||
1 | 1 | LA | 1 | LA |
Două | Două | B | Două | B |
3 | 3 | C | 3 | C |
4 | 4 | D | 4 | D |
5 | 5 | ESTE | 5 | ESTE |
SELECT * FROM (SELECT 38 AS bah) AS foo JOIN (SELECT 35 AS bah) AS bar ON (55=55);
ID | Nume | ID | Nume | |
---|---|---|---|---|
1 | 1 | LA | 1 | LA |
Două | Două | B | Două | B |
3 | 3 | C | 3 | C |
4 | 4 | D | 4 | D |
5 | 5 | ESTE | 5 | ESTE |
După cum puteți 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, veți descoperi 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 face bucle imbricate pentru îmbinarea din stânga.
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ă un index de utilizat (așa cum facem unirea pe coloana nume), operația hash a dovedit o interogare de îmbinare interioară cea mai scumpă.
Cu toate acestea, dacă schimbați cheia de potrivire din interogarea de asociere de la Nume la ID și dacă există un număr mare de rânduri în tabel, atunci veți descoperi că îmbinarea interioară va fi mai rapidă decât îmbinarea exterioară din stânga.
Alăturare interioară și exterioară MS Access
Când utilizaț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ă, numai cele aferente din ambele tabele sunt combinate într-un singur set de rezultate. Aceasta este o asociere implicită în Access și cea mai frecvent utilizată. Dacă aplicați o asociere, dar nu specificați în mod explicit ce tip de asociere este, atunci Access presupune că este o asociere interioară.
În îmbinările exterioare, toate datele aferente din ambele tabele sunt combinate corect, plus toate rândurile rămase dintr-un singur tabel. În îmbinările exterioare complete, toate datele sunt combinate ori de câte ori este posibil.
Alăturare stânga vs Alăturare exterioară stângă
În serverul SQL, cuvântul cheie extern este opțional atunci când aplicați unirea exterioară la stânga. Astfel, nu are nicio diferență dacă scrieți „LEFT OUTER JOIN” sau „LEFT JOIN”, deoarece ambele vă vor oferi același rezultat.
A LEFT JOIN B este o sintaxă echivalentă cu A LEFT OUTER JOIN B.
Mai jos este lista sintaxelor echivalente din serverul SQL:
cel mai bun pop-blocker pentru Google Chrome
(imagine sursă )
Alăturare exterioară stângă vs Alăturare exterioară dreaptă
Am văzut deja această diferență în acest articol. Pentru a vedea diferența, puteți consulta interogările și setul de rezultate pentru îmbinarea exterioară stângă și dreapta pentru îmbinarea exterioară dreaptă.
Principala diferență între Îmbinarea stângă și Îmbinarea dreaptă constă în includerea de rânduri care nu se potrivesc. Îmbinarea exterioară stângă include rândurile neegalate din tabelul care se află în stânga clauzei unirii, în timp ce o îmbinare exterioară dreaptă include rândurile neegalate din tabelul care se află în dreapta clauzei unirii.
Oamenii întreabă care este mai bine să se folosească, adică unirea la stânga sau la dreapta? Practic, sunt același tip de operații, cu excepția argumentelor lor inversate. Prin urmare, când întrebați ce alăturare să utilizați, vă întrebați de fapt dacă să scrieți un A. Este doar o chestiune de preferință.
În general, oamenii preferă să utilizeze Left join în interogarea lor SQL. Aș sugera să rămâneți consecvent în modul în care scrieți interogarea pentru a evita orice confuzie în interpretarea interogării.
Am văzut până acum totul despre îmbinările interioare și toate tipurile de îmbinări exterioare. Haideți să rezumăm rapid diferența dintre Alăturare interioară și Alăturare exterioară.
Diferența dintre îmbinarea interioară și îmbinarea exterioară în format tabelar
Alăturare interioară | Alăturare exterioară |
---|---|
Returnează numai rândurile care au valori potrivite în ambele tabele. | Include rândurile potrivite, 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 există un index de utilizat, 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 mai multe înregistrări în comparație cu INNER JOIN. Cu toate acestea, pot exista unele scenarii specifice în care OUTER JOIN este mai rapid. |
Atunci când un meci nu este găsit, nu returnează nimic. | Când nu se găsește o potrivire, un NULL este plasat în valoarea de coloană returnată. |
Utilizați INNER JOIN atunci când doriți să căutați informații detaliate ale oricărei coloane specifice. | Utilizați OUTER JOIN 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 pe ambele tabele pentru ca o îmbinare interioară să returneze date. | Aceștia acționează ca niște adăugări de date. |
Notarea de îmbinare implicită există pentru îmbinarea interioară, care înregistrează tabelele care urmează să fie unite în mod separat prin virgulă în clauza FROM. Exemplu: SELECT * FROM product, category WHERE product.CategoryID = category.CategoryID; | Nu există nicio notare implicită de asociere pentru asocierea exterioară. |
Inner and Outer Join vs Union
Uneori, confundăm Unirea și Unirea și aceasta este, de asemenea, una dintre cele mai frecvente întrebări din Interviuri SQL . Am văzut deja diferența dintre îmbinarea interioară și îmbinarea exterioară. Acum, haideți să vedem cum diferă un JOIN de la UNION.
UNION plasează o linie de interogări una după alta, în timp ce unirea creează un produs cartezian și îl subsetează. Astfel, UNION și JOIN sunt operațiuni complet diferite.
Să executăm cele două interogări de mai jos în MySQL și să vedem rezultatul acestora.
Interogare UNION:
SELECT 28 AS bah UNION SELECT 35 AS bah;
Rezultat:
Bah | |
---|---|
1 | 28 |
Două | 35 |
ÎNSCRIEȚI-VĂ la întrebare:
SELECT * FROM (SELECT 38 AS bah) AS foo JOIN (SELECT 35 AS bah) AS bar ON (55=55);
Rezultat:
foo | Bar | |
---|---|---|
1 | 38 | 35 |
O operațiune UNION plasează 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 UNION. Astfel, practic, o UNIUNE combină cele două seturi de rezultate împreună.
O operațiune de asociere preia date de la două sau mai multe tabele pe baza relațiilor logice dintre aceste tabele, adică pe baza condiției de asociere. În interogarea de asociere, datele dintr-un tabel sunt utilizate pentru a selecta înregistrările dintr-un alt tabel. Vă permite să legați date similare care sunt prezente pe diferite tabele.
Pentru a o înțelege foarte simplu, puteți spune că o UNIUNE combină rânduri din două tabele, în timp ce o îmbinare combină coloane din două sau mai multe tabele. Astfel, ambele sunt utilizate pentru a combina datele din n tabele, dar diferența constă în modul în care datele sunt combinate.
Mai jos sunt reprezentările picturale ale UNION și JOIN.
Cel de mai sus este o reprezentare ilustrativă a unei operații de unire care descrie că fiecare înregistrare din setul de rezultate conține coloane atât din tabele, adică din tabelul A, cât și din tabelul B. Acest rezultat este returnat pe baza condiției de asociere aplicată în interogare.
O unire este în general rezultatul denormalizării (opus normalizării) și folosește cheia externă a unui tabel pentru a căuta valorile coloanei folosind cheia primară într-un alt tabel.
Cel de mai sus este o reprezentare picturală a unei operațiuni UNION care descrie că fiecare înregistrare din setul de rezultate este un rând din oricare dintre cele două tabele. Astfel, rezultatul UNIUNII a combinat rândurile din tabelul A și tabelul B.
Lecturi suplimentare = >> MySQL UNION a explicat cu exemple
Concluzie
În acest articol, am văzut diferențele majore dintre Alăturare interioară și Alăturare exterioară în SQL . Am văzut, de asemenea, clasificarea unei îmbinări externe, adică unire stângă, unire dreaptă și unire completă. Am văzut cum funcționează fiecare dintre aceste tipuri de îmbinare și cum variază între ele.
De asemenea, am făcut unele comparații de performanță între aceste tipuri de unire. De asemenea, am discutat despre modul în care unirea este diferită de o uniune.
Citește și = >> Tipuri de alăturare MySQL
Sper că acest articol v-ar fi ajutat să vă clarificați îndoielile cu privire la diferențele dintre diferitele tipuri de uniri. Suntem siguri că acest lucru vă va determina într-adevăr să alegeți tipul de asociere pe baza setului de rezultate dorit.
Lectură recomandată
- Diferența exactă între verificare și validare cu exemple
- Modem Vs Router: Cunoașteți diferența exactă
- Diferența dintre SQL și MySQL împotriva SQL Server (cu exemple)
- Tutorial Python DateTime cu exemple
- LAN VS WAN VS MAN: Diferența exactă între tipurile de rețea
- Tăiați comanda în Unix cu exemple
- Sintaxa de comandă Cat Unix, Opțiuni cu exemple
- Utilizarea cursorului în MongoDB cu exemple