inner join vs outer join
Notranje združevanje proti zunanjemu pridružitvi: Pripravite se na raziskovanje natančnih razlik med notranjim in zunanjim združevanjem
Preden preučimo razlike med Inner Join Vs Zuter Join, najprej poglejmo, kaj je SQL JOIN?
Klavzula združevanja se uporablja za združevanje zapisov ali za manipulacijo zapisov iz dveh ali več tabel prek pogoja združevanja. Pogoj združevanja označuje, kako se stolpci iz vsake tabele ujemajo med seboj.
Združevanje temelji na povezanem stolpcu med temi tabelami. Najpogostejši primer je združitev dveh tabel skozi stolpec primarnega ključa in stolpec tujega ključa.
Recimo, da imamo tabelo, ki vsebuje plačo zaposlenih, obstaja pa še tabela, ki vsebuje podrobnosti o zaposlenih.
V tem primeru bo skupni stolpec, kot je ID zaposlenega, ki bo združil ti dve tabeli. Ta stolpec z ID-jem zaposlenega bi bil primarni ključ tabel s podatki o zaposlenem in tuji ključ v tabeli plač zaposlenega.
Zelo pomembno je, da imamo skupni ključ med obema entitetama. Tabelo si lahko predstavljate kot entiteto, ključ pa kot skupno povezavo med obema tabelama, ki se uporablja za operacijo združevanja.
razlika med soapui in soapui pro
V osnovi obstajata dve vrsti združevanja v SQL, tj. Notranji in zunanji . Zunanje združevanje je nadalje razdeljeno na tri vrste, tj. Levo zunanje, desno zunanje in popolno zunanje.
V tem članku bomo videli razliko med Notranji in zunanji Podrobno. Navzkrižna združevanja in neenaka združevanja ne bodo vključena v obseg tega članka.
Kaj se boste naučili:
- Kaj je Inner Join?
- Kaj je zunanji spoj?
- Razlika med notranjim in zunanjim združevanjem
- Izvedba
- MS Access Notranja in zunanja pridružitev
- Levo Pridružitev vs Levo Zunanje Pridružitev
- Levo Zunanje Pridružitev vs Desno Zunanje Pridružitev
- Razlika med notranjim in zunanjim združevanjem v tabelarni obliki
- Notranja in zunanja pridružitev proti Unionu
- Zaključek
- Priporočeno branje
Kaj je Inner Join?
Notranje združevanje vrne samo vrstice, ki imajo ujemajoče se vrednosti v obeh tabelah (tukaj upoštevamo, da se združevanje izvede med obema tabelama).
Kaj je zunanji spoj?
Zunanje združevanje vključuje ujemajoče se vrstice in nekatere neujemajoče se vrstice med obema tabelama. Zunanje združevanje se v bistvu razlikuje od notranjega združevanja po tem, kako obravnava pogoj napačnega ujemanja.
Obstajajo 3 vrste zunanjega pridruževanja:
- Levo zunanje pridruživanje : Vrne vse vrstice iz LEFT tabele in ujemajoče se zapise med obema tabelama.
- Desno zunanje pridruživanje : Vrne vse vrstice iz tabele DESNO in ujemajoče se zapise med obema tabelama.
- Polno zunanje pridružitev : Združuje rezultat levega zunanjega in desnega zunanjega združevanja.
Razlika med notranjim in zunanjim združevanjem
(slika vir )
Kot je prikazano na zgornjem diagramu, obstajata dve entiteti, tj. Tabela 1 in tabela 2, obe pa si delita nekaj skupnih podatkov.
Notranje združevanje bo vrnilo skupno območje med temi tabelami (zeleno osenčeno območje v zgornjem diagramu), to je vse zapise, ki so skupni med tabelo 1 in tabelo 2.
Levo zunanje združevanje bo vrnilo vse vrstice iz tabele 1 in samo tiste vrstice iz tabele 2, ki so skupne tudi tabeli 1. Pravilno zunanje združevanje bo storilo ravno nasprotno. Dala bo vse zapise iz tabele 2 in samo ustrezne ujemajoče se zapise iz tabele 1.
Poleg tega nam bo Full Outer Join priskrbel vse zapise iz tabele 1 in tabele 2.
Začnimo s primerom, da bo to bolj jasno.
Recimo, da imamo dva tabele: EmpDetails in EmpSalary .
Tabela EmpDetails:
ID zaposlenega | Ime zaposlenega |
7. | Lily |
1. | Janez |
dva | Samantha |
3. | Nobenega |
4. | Svilnato |
5. | Oven |
6. | Arpit |
8. | Sita |
9. | Farah |
10. | Jerry |
Tabela plač:
ID zaposlenega | Ime zaposlenega | Plača zaposlenega |
---|---|---|
enajst | Rose | 90000 |
1. | Janez | 50.000 |
dva | Samantha | 120000 |
3. | Nobenega | 75000 |
4. | Svilnato | 25000 |
5. | Oven | 150000 |
6. | Arpit | 80000 |
12. | Sakshi | 45000 |
13. | Jack | 250.000 |
Naredimo notranji spoj na teh dveh mizah in opazujmo rezultat:
Poizvedba:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails INNER JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Rezultat:
ID zaposlenega | Ime zaposlenega | Plača zaposlenega |
---|---|---|
7. | Lily | NIČ |
1. | Janez | 50.000 |
dva | Samantha | 120000 |
3. | Nobenega | 75000 |
4. | Svilnato | 25000 |
5. | Oven | 150000 |
6. | Arpit | 80000 |
V zgornjem naboru rezultatov lahko vidite, da je Inner Join vrnil prvih 6 zapisov, ki so bili prisotni v EmpDetails in EmpSalary z ustreznim ključem, tj. EmployeeID. Če sta A in B torej dve entiteti, bo notranje združevanje na podlagi ujemajočega se ključa vrnilo nabor rezultatov, ki bo enak 'Zapisi v A in B'.
Poglejmo zdaj, kaj bo storilo levo zunanje združenje.
Poizvedba:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails LEFT JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Rezultat:
ID zaposlenega | Ime zaposlenega | Plača zaposlenega |
---|---|---|
1. | Janez | 50.000 |
dva | Samantha | 120000 |
3. | Nobenega | 75000 |
4. | Svilnato | 25000 |
5. | Oven | 150000 |
6. | Arpit | 80000 |
8. | Sita | NIČ |
9. | Farah | NIČ |
10. | Jerry | NIČ |
V zgornjem naboru rezultatov lahko vidite, da je levo zunanje združevanje vrnilo vseh 10 zapisov iz LEFT tabele, tj. Tabele EmpDetails, in ker se prvih 6 zapisov ujema, je vrnilo plačo zaposlenih za te ujemajoče se zapise.
Ker ostali zapisi nimajo ujemajočega se ključa v tabeli DESNO, to je tabela EmpSalary, je vrnil NULL, ki ustreza tem. Ker Lily, Sita, Farah in Jerry nimajo ustreznega ID-ja zaposlenega v tabeli EmpSalary, se njihova plača v nizu rezultatov prikaže kot NULL.
Torej, če sta A in B dve entiteti, bo levo zunanje združevanje vrnilo nabor rezultatov, ki bo na podlagi ujemajočega se ključa enak 'Zapisi v A NOT B'.
Zdaj pa opazujmo, kaj naredi Prava zunanja zveza.
Poizvedba:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails RIGHT join EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Rezultat:
ID zaposlenega | Ime zaposlenega | Plača zaposlenega |
---|---|---|
NIČ | NIČ | 90000 |
1. | Janez | 50.000 |
dva | Samantha | 120000 |
3. | Nobenega | 75000 |
4. | Svilnato | 25000 |
5. | Oven | 150000 |
6. | Arpit | 80000 |
NIČ | NIČ | 250.000 |
NIČ | NIČ | 250.000 |
V zgornjem naboru rezultatov lahko vidite, da je desno zunanje združevanje storilo ravno nasprotno od levega. Vrnil je vse plače iz prave mize, tj. Tabele EmpSalary.
Ker pa Rose, Sakshi in Jack v levi tabeli nimajo ustreznega ID-ja zaposlenega, tj. Tabele EmpDetails, imamo iz leve tabele njihov ID zaposlenega in EmployeeName kot NULL.
Torej, če sta A in B dve entiteti, bo desno zunanje združevanje vrnilo nabor rezultatov, ki bo na podlagi ujemajočega se ključa enak 'Zapisi v B NE A'.
Poglejmo tudi, kakšen bo rezultat, če izvajamo izbrano operacijo v vseh stolpcih obeh tabel.
Poizvedba:
SELECT * FROM EmpDetails RIGHT JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Rezultat:
ID zaposlenega | Ime zaposlenega | ID zaposlenega | Ime zaposlenega | Plača zaposlenega |
---|---|---|---|---|
NIČ | NIČ | enajst | Rose | 90000 |
1. | Janez | 1. | Janez | 50.000 |
dva | Samantha | dva | Samantha | 120000 |
3. | Nobenega | 3. | Nobenega | 75000 |
4. | Svilnato | 4. | Svilnato | 25000 |
5. | Oven | 5. | Oven | 150000 |
6. | Arpit | 6. | Arpit | 80000 |
NIČ | NIČ | 12. | Sakshi | 250.000 |
NIČ | NIČ | 13. | Jack | 250.000 |
Zdaj pa pojdimo na Full Join.
Popolno zunanje združevanje se opravi, ko želimo vse podatke iz obeh tabel, ne glede na to, ali obstaja ujemanje ali ne. Če želim vse zaposlene, tudi če ne najdem ustreznega ključa, bom izvedel poizvedbo, kot je prikazano spodaj.
Poizvedba:
SELECT * FROM EmpDetails FULL JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Rezultat:
ID zaposlenega | Ime zaposlenega | ID zaposlenega | Ime zaposlenega | Plača zaposlenega |
---|---|---|---|---|
7. | Lily | NIČ | NIČ | NIČ |
1. | Janez | 1. | Janez | 50.000 |
dva | Samantha | dva | Samantha | 120000 |
3. | Nobenega | 3. | Nobenega | 75000 |
4. | Svilnato | 4. | Svilnato | 25000 |
5. | Oven | 5. | Oven | 150000 |
6. | Arpit | 6. | Arpit | 80000 |
8. | Sita | NIČ | NIČ | NIČ |
9. | Farah | NIČ | NIČ | NIČ |
10. | Jerry | NIČ | NIČ | NIČ |
NIČ | NIČ | enajst | Rose | 90000 |
NIČ | NIČ | 12. | Sakshi | 250.000 |
NIČ | NIČ | 13. | Jack | 250.000 |
V zgornjem naboru rezultatov lahko vidite, da ker se prvih šest zapisov ujema v obeh tabelah, imamo vse podatke brez NULL. Naslednji štirje zapisi obstajajo v levi tabeli, v desni tabeli pa ne, zato so ustrezni podatki v desni tabeli NULL.
Zadnji trije zapisi obstajajo v desni tabeli in ne v levi tabeli, zato imamo v ustreznih podatkih iz leve tabele NULL. Torej, če sta A in B dve entiteti, bo celotno zunanje združevanje vrnilo nabor rezultatov, ki bo enak 'Zapisi v A IN B', ne glede na ujemajoči se ključ.
Teoretično gre za kombinacijo levega in desnega.
Izvedba
Primerjajmo notranje združevanje z levim zunanjim združevanjem v strežniku SQL. Če govorimo o hitrosti delovanja, levi zunanji JOIN očitno ni hitrejši od notranjega.
V skladu z definicijo mora biti zunanji spoj, naj bo levi ali desni, vsa dela notranjega spoja skupaj z dodatnim delom, ki razširi rezultate. Pričakuje se, da bo zunanje združevanje vrnilo večje število zapisov, kar še poveča njen skupni čas izvajanja samo zaradi večjega niza rezultatov.
Tako je zunanji spoj počasnejši od notranjega.
Poleg tega lahko pride do nekaterih posebnih situacij, ko bo levo združevanje hitrejše od notranjega, vendar jih ne moremo nadomestiti med seboj, saj levo zunanje združevanje funkcionalno ni enakovredno notranjemu.
Pogovorimo se o primeru, ko je levo združevanje lahko hitrejše od notranjega. Če so tabele, vključene v operacijo združevanja, premajhne, recimo, da imajo manj kot 10 zapisov in tabele nimajo dovolj indeksov, da bi lahko pokrivale poizvedbo, v tem primeru je levo združevanje praviloma hitrejše od notranjega združevanja.
Ustvarimo dve spodnji tabeli in kot primer naredimo NOTRANJI PRIKLJUČEK in LEVI ZUNANJI PRIKLJUČEK:
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 | Ime | ID | Ime | |
---|---|---|---|---|
Spodaj je vizualizacija notranjega združevanja: ![]() | Spodaj je vizualizacija zunanjega spoja ![]() | |||
1. | 1. | TO | 1. | TO |
dva | dva | B | dva | B |
3. | 3. | C | 3. | C |
4. | 4. | D | 4. | D |
5. | 5. | JE | 5. | JE |
SELECT * FROM (SELECT 38 AS bah) AS foo JOIN (SELECT 35 AS bah) AS bar ON (55=55);
ID | Ime | ID | Ime | |
---|---|---|---|---|
1. | 1. | TO | 1. | TO |
dva | dva | B | dva | B |
3. | 3. | C | 3. | C |
4. | 4. | D | 4. | D |
5. | 5. | JE | 5. | JE |
Kot lahko vidite zgoraj, sta poizvedbi vrnili enak nabor rezultatov. Če si v tem primeru ogledate načrt izvedbe obeh poizvedb, boste ugotovili, da je notranje združenje stalo več kot zunanje. To je zato, ker se za notranje združevanje strežnik SQL ujema z zgoščeno, medtem ko za levo združi ugnezdene zanke.
Razpršeno ujemanje je običajno hitrejše od ugnezdenih zank. Toda v tem primeru, ker je število vrstic tako majhno in ni indeksa, ki bi ga lahko uporabili (kot delamo združevanje v stolpcu z imeni), je bila operacija zgoščevanja najdražja poizvedba notranjega združevanja.
Če pa v poizvedbi za pridružitev spremenite ujemajoči se ključ iz Name na ID in če je v tabeli veliko število vrstic, boste ugotovili, da bo notranje združevanje hitrejše od levega zunanjega.
MS Access Notranja in zunanja pridružitev
Ko v poizvedbi MS Access uporabljate več virov podatkov, nato uporabite JOINs za nadzor zapisov, ki jih želite videti, odvisno od tega, kako so viri podatkov med seboj povezani.
Pri notranjem združevanju so v enem nizu rezultatov združeni samo sorodni iz obeh tabel. To je privzeto združitev v Accessu in tudi najpogosteje uporabljeno. Če uporabite pridružitev, vendar izrecno ne navedete, za katero vrsto pridružitve gre, potem Access predpostavlja, da gre za notranje združevanje.
Pri zunanjih združevanjih so vsi povezani podatki iz obeh tabel pravilno kombinirani in vse preostale vrstice iz ene tabele. V popolnih zunanjih združitvah se vsi podatki združijo, kjer je to mogoče.
Levo Pridružitev vs Levo Zunanje Pridružitev
V strežniku SQL je ključna beseda zunanja neobvezna, ko uporabite levo zunanje združitev. Tako ne bo pomembno, če napišete 'LEFT OUTER JOIN' ali 'LEFT JOIN', saj bosta oba dala enak rezultat.
LEFT JOIN B je enakovredna sintaksa A LEFT OUTER JOIN B.
Spodaj je seznam enakovrednih sintaks v strežniku SQL:
(slika vir )
Levo Zunanje Pridružitev vs Desno Zunanje Pridružitev
To razliko smo že videli v tem članku. Če želite videti razliko, se lahko obrnete na poizvedbe Left Outer Join in Right Zuter Join ter nabor rezultatov.
Glavna razlika med levim in desnim združevanjem je v vključitvi neskladnih vrstic. Levo zunanje združevanje vključuje neprimerljive vrstice iz tabele na levi strani klavzule o pridružitvi, medtem ko Desno zunanje združevanje vključuje neprimerljive vrstice iz tabele, ki je na desni strani klavzule o združevanju.
Ljudje se vprašajo, kaj je bolje uporabiti, tj. Levo ali Desno? V bistvu gre za isto vrsto operacij, razen če so njihovi argumenti obrnjeni. Ko torej vprašate, katero združitev uporabiti, dejansko vprašate, ali naj napišem a. Gre samo za prednost.
Na splošno ljudje raje uporabljajo Left join v poizvedbi SQL. Predlagam, da ostanete dosledni pri načinu pisanja poizvedbe, da ne bi prišlo do zmede pri razlagi poizvedbe.
Doslej smo videli vse o notranjem združevanju in vseh vrstah zunanjih. Naj na hitro povzamemo razliko med Notranjim in Zunanjim.
Razlika med notranjim in zunanjim združevanjem v tabelarni obliki
Notranje pridružitev | Zunanje Pridružite se |
---|---|
Vrne samo vrstice, ki imajo ujemajoče se vrednosti v obeh tabelah. | Vključuje ujemajoče se vrstice in nekatere neujemajoče se vrstice med obema tabelama. |
Če je v tabelah veliko število vrstic in obstaja indeks za uporabo, je INNER JOIN na splošno hitrejši od OUTER JOIN. | Na splošno je OUTER JOIN počasnejši od INNER JOIN, saj mora vrniti večje število zapisov v primerjavi z INNER JOIN. Vendar obstajajo nekateri posebni scenariji, pri katerih je ZUNANJE PRIDRUŽITEV hitrejše. |
Ko ujemanja ni mogoče najti, ne vrne ničesar. | Ko ujemanja ni mogoče najti, se v vrnjeno vrednost stolpca postavi NULL. |
Uporabite INNER JOIN, če želite poiskati podrobne informacije o katerem koli določenem stolpcu. | Uporabite ZUNANJO PRIDRUŽITEV, če želite prikazati seznam vseh informacij v dveh tabelah. |
INNER JOIN deluje kot filter. V obeh tabelah mora biti ujemanje, da lahko notranje združevanje vrne podatke. | Delujejo kot dodajanje podatkov. |
Implicitni zapis združevanja obstaja za notranje združevanje, ki navaja tabele, ki jih je treba združiti na vejico v stavku FROM. Primer: SELECT * FROM product, category WHERE product.CategoryID = category.CategoryID; | Za zunanje združevanje ni nobenega implicitnega zapisa združevanja. |
Notranja in zunanja pridružitev proti Unionu
Včasih zamenjamo Pridružitev in Zveza in to je tudi eno najpogostejših vprašanj v SQL intervjuji . Razliko med notranjim in zunanjim spajanjem smo že videli. Zdaj pa poglejmo, kako se JOIN razlikuje od UNIJE.
UNION postavlja vrstico poizvedb drug za drugim, medtem ko join ustvari kartezični izdelek in ga podnastavi. Tako sta UNION in JOIN popolnoma različni operaciji.
Zaženimo spodnji dve poizvedbi v MySQL in si oglejte njihov rezultat.
UNION Poizvedba:
SELECT 28 AS bah UNION SELECT 35 AS bah;
Rezultat:
Bah | |
---|---|
1. | 28. |
dva | 35 |
PRIDRUŽI se poizvedbi:
SELECT * FROM (SELECT 38 AS bah) AS foo JOIN (SELECT 35 AS bah) AS bar ON (55=55);
Rezultat:
foo | Bar | |
---|---|---|
1. | 38 | 35 |
Operacija UNION rezultat dveh ali več poizvedb postavi v en nabor rezultatov. Ta nabor rezultatov vsebuje vse zapise, ki se vrnejo prek vseh poizvedb, vključenih v UNION. Tako UNION v osnovi združuje oba nabora rezultatov.
Operacija združevanja pridobi podatke iz dveh ali več tabel na podlagi logičnih razmerij med temi tabelami, tj. Na podlagi pogoja združevanja. Pri poizvedbi za pridružitev se podatki iz ene tabele uporabljajo za izbiro zapisov iz druge tabele. Omogoča vam povezavo podobnih podatkov, ki so prisotni v različnih tabelah.
Če ga želite razumeti zelo preprosto, lahko rečete, da UNION združuje vrstice iz dveh tabel, medtem ko združuje stolpce iz dveh ali več tabel. Tako se oba uporabljata za kombiniranje podatkov iz n tabel, razlika pa je v tem, kako se podatki kombinirajo.
Spodaj so slikovni upodobitvi UNION in JOIN.
Zgoraj je slikovna predstavitev operacije združevanja, ki prikazuje, da vsak zapis v naboru rezultatov vsebuje stolpce iz obeh tabel, tj. Tabele A in tabele B. Ta rezultat se vrne na podlagi pogoja združevanja, uporabljenega v poizvedbi.
Združevanje je na splošno rezultat denormalizacije (v nasprotju z normalizacijo) in uporablja tuji ključ ene tabele za iskanje vrednosti stolpca z uporabo primarnega ključa v drugi tabeli.
Zgoraj je slikovna predstavitev operacije UNION, ki prikazuje, da je vsak zapis v naboru rezultatov vrstica iz ene od obeh tabel. Rezultat UNION je tako združil vrstici iz tabele A in tabele B.
Nadaljnje branje = >> MySQL UNION je pojasnil s primeri
Zaključek
V tem članku smo videli glavne razlike med Notranji in zunanji pridružite v SQL . Videli smo tudi razvrstitev zunanjega pridruževanja, tj. Levega, desnega in popolnega. Videli smo, kako deluje vsaka od teh vrst združevanja in kako se med seboj razlikujejo.
Opravili smo tudi primerjavo zmogljivosti med temi vrstami združevanja. Razpravljali smo tudi o tem, kako se pridružitev razlikuje od zveze.
izvedba hash tabele v kodi c ++
Preberite tudi = >> Vrste združevanja MySQL
Upam, da bi vam ta članek pomagal odpraviti dvome glede razlik med različnimi vrstami združevanja. Prepričani smo, da se boste zaradi tega resnično odločili, katero vrsto združevanja boste izbrali na podlagi želenega nabora rezultatov.
Priporočeno branje
- Natančna razlika med preverjanjem in potrjevanjem s primeri
- Modem proti usmerjevalniku: vedite natančno razliko
- Razlika med SQL Vs MySQL Vs SQL Server (s primeri)
- Vadnica Python DateTime s primeri
- LAN VS WAN Vs MAN: Natančna razlika med vrstami omrežij
- Izreži ukaz v Unixu s primeri
- Sintaksa ukaza Unix Cat, možnosti s primeri
- Uporaba kazalca v MongoDB s primeri