Belső csatlakozás Vs Külső csatlakozás:

Inner Join Vs Outer Join: Get Ready to Explore the Exact Differences Between Inner and Outer Join

Before exploring the differences between Inner Join Vs Outer Join, let us first see what is a SQL JOIN?

A join záradékot rekordok összekapcsolására vagy két vagy több táblázat rekordjainak manipulálására használjuk egy join feltétel segítségével. A csatlakozási feltétel jelzi, hogy az egyes táblák oszlopai hogyan illeszkednek egymáshoz.

A join egy kapcsolódó oszlopon alapul e táblák között. A leggyakoribb példa a két tábla közötti csatlakozás az elsődleges kulcs oszlopon és az idegen kulcs oszlopon keresztül.

INNER JOIN VS OUTER JOIN

Tegyük fel, hogy van egy táblázatunk, amely tartalmazza az alkalmazottak fizetését, és van egy másik táblázat, amely tartalmazza az alkalmazottak adatait.

Ez esetben lesz egy közös oszlop, például az alkalmazott azonosítója, amely összekapcsolja a két táblát. Ez a munkavállaló azonosítója oszlop lenne az elsődleges kulcs a munkavállaló adatai táblában és idegen kulcs a munkavállaló fizetése táblában.

Ez nagyon fontos, hogy legyen egy közös kulcs a két entitás között. A táblát egy entitásnak, a kulcsot pedig a két tábla közötti közös kapcsolatnak tekinthetjük, amelyet a join művelethez használunk.

Az SQL-ben alapvetően kétféle Join létezik: Inner Join és Outer Join. Az Outer Join további három típusra osztható: Left Outer Join, Right Outer Join és Full Outer Join.

Ebben a cikkben részletesen megnézzük a Belső Join és az Outer Join közötti különbséget. A Cross Join és az Unequal Joins nem tartozik a cikk tárgykörébe.

Mi az Inner Join?

A Inner Join csak azokat a sorokat adja vissza, amelyek mindkét táblában egyező értékekkel rendelkeznek (itt a két tábla közötti csatlakozásról van szó).

Mi az Outer Join?

A Outer Join tartalmazza az egyező sorokat és néhány nem egyező sort is a két tábla között. Az Outer Join alapvetően abban különbözik a Inner Join-tól, hogy hogyan kezeli a hamis egyezés feltételét.

A Outer Join-nak 3 típusa van:

  • Left Outer Join: Visszaadja az összes sort a bal oldali táblából és a két tábla közötti megfelelő rekordokat.
  • Right Outer Join:
  • Full Outer Join: Egyesíti a Left Outer Join és a Right Outer Join eredményét.

Differencia a Inner és Outer Join között

Differencia az INNER JOIN és az OUTER JOIN között

A fenti ábrán látható, hogy két entitás van, azaz az 1. és a 2. táblázat, és mindkét táblázatnak vannak közös adatai.

Egy Inner Join a táblák közötti közös területet adja vissza (a fenti ábrán a zöld színnel árnyékolt terület), azaz az összes olyan rekordot, amely közös az 1. és a 2. táblázat között.

A Left Outer Join az 1. táblázat összes sorát adja vissza, és csak azokat a sorokat a 2. táblázatból, amelyek az 1. táblával is közösek. A Right Outer Join éppen az ellenkezőjét teszi. A 2. táblázat összes rekordját adja vissza, és csak az 1. táblázat megfelelő megfelelő rekordjait.

A Full Outer Join továbbá az 1. és a 2. táblázat összes rekordját adja vissza.

Kezdjük egy példával, hogy érthetőbb legyen.

Tegyük fel, hogy van két táblázatunk: EmpDetails és EmpSalary.

EmpDetails táblázat:

.

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

EmpSalary Table:

.

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

Végezzünk egy Inner Join-t ezen a két táblán és figyeljük meg az eredményt:

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

A fenti eredményhalmazban, látható, hogy az Inner Join visszaadta az első 6 olyan rekordot, amelyek mind az EmpDetails, mind az EmpSalary adatbázisban jelen voltak, és amelyeknek van egyező i kulcsuk.EmployeeID. Ennélfogva, ha A és B két entitás, akkor az Inner Join olyan eredményhalmazt fog visszaadni, amely megegyezik az ‘A és B rekordjai’-val, az egyező kulcs alapján.

Lássuk most, hogy mit tesz egy 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 Hakuna 75000
4 Selymes 25000
5 Ram 150000
6 Arpit 80000
7 Lily NULL
8 Sita NULL
9 Farah NULL
10 Jerry NULL

A fenti eredményhalmazban, látható, hogy a bal oldali külső csatlakozás mind a 10 rekordot visszaadta a LEFT i táblázatból.azaz az EmpDetails táblából, és mivel az első 6 rekord egyezik, ezeknek az egyező rekordoknak az alkalmazotti fizetését adta vissza.

Mivel a többi rekordnak nincs egyező kulcsa a Jobb oldali, azaz az EmpSalary táblában, ezeknek megfelelő NULL értéket adott vissza. Mivel Lily, Sita, Farah és Jerry nem rendelkezik megfelelő munkavállalói azonosítóval az EmpSalary táblában, a fizetésük NULL-ként jelenik meg az eredményhalmazban.

Ha tehát A és B két entitás, akkor a bal oldali külső csatlakozás az eredményhalmazt adja vissza, amely a megfelelő kulcs alapján megegyezik az “A NEM B-ben lévő rekordok”-kal.

Most nézzük meg, mit csinál a jobb oldali külső csatlakozás.

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

A fenti eredményhalmazban, láthatjuk, hogy a Right Outer Join éppen az ellenkezőjét tette, mint a left join. Visszaadta az összes fizetést a jobb oldali táblából, azaz az EmpSalary táblából.

De mivel Rose, Sakshi és Jack nem rendelkezik megfelelő munkavállalói azonosítóval a bal oldali táblában, azaz az EmpDetails táblában, ezért a bal oldali táblából NULL-nak kaptuk meg a munkavállalói azonosítójukat és a munkavállalói nevüket.

Ha tehát A és B két entitás, akkor a jobb oldali külső összekapcsolás a megfelelő kulcs alapján olyan eredményhalmazt fog visszaadni, amely megegyezik a ‘Records in B NOT A’ értékkel.

Nézzük meg azt is, hogy mi lesz az eredményhalmaz, ha mindkét tábla összes oszlopán select műveletet végzünk.

Kérdés:

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

Eredmény:

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

Eredmény:

EmployeeID EmployeeName EmployeeID EmployeeName EmployeeName EmployeeSalary
1 John 1 John 50000
2 Samantha 2 Samantha 120000
3 Hakuna 3 Hakuna 75000
4 Silky 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

Most, térjünk át a teljes csatlakozásra.

A teljes külső csatlakozásra akkor kerül sor, ha mindkét táblából az összes adatot szeretnénk, függetlenül attól, hogy van-e egyezés vagy nincs. Ezért, ha az összes alkalmazottat akarom, még akkor is, ha nem találok egyező kulcsot, akkor az alábbi lekérdezést futtatom.

Kérdés:

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

Eredmény:

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
5 Ram 5 Ram 150000
6 Arpit 6 Arpit 80000
7 Lily NULL NULL NULL
8 Sita NULL NULL NULL NULL
9 Farah NULL NULL NULL
10 Jerry NULL NULL NULL NULL
NULL NULL 11 Rose 90000
NULL NULL 12 Sakshi 250000
NULL NULL 13 Jack 250000

A fenti eredményhalmazban látható, hogy az első hat rekord mindkét táblázatban megegyezik, az összes adatot NULL nélkül kaptuk meg. A következő négy rekord létezik a bal oldali táblázatban, de a jobb oldali táblázatban nem, így a megfelelő adat a jobb oldali táblázatban NULL.

Az utolsó három rekord létezik a jobb oldali táblázatban, de a bal oldali táblázatban nem, így a bal oldali táblázat megfelelő adataiban NULL van. Tehát, ha A és B két entitás, akkor a teljes külső összeillesztés olyan eredményhalmazt fog visszaadni, amely megegyezik az “A ÉS B rekordjai”-val, függetlenül a megfelelő kulcstól.

elméletileg ez a Left Join és a Right Join kombinációja.

Teljesítmény

Hasonlítsuk össze egy Inner Join-t a Left Outer Join-nal az SQL szerverben. Ha a művelet sebességéről beszélünk, egy bal külső JOIN nyilvánvalóan nem gyorsabb, mint egy belső join.

A definíció szerint egy külső join, legyen az bal vagy jobb, a belső join összes munkáját el kell végeznie a további munkával együtt null- kiterjesztve az eredményeket. A külső csatlakozás várhatóan nagyobb számú rekordot ad vissza, ami tovább növeli a teljes végrehajtási időt, már csak a nagyobb eredményhalmaz miatt is.

A külső csatlakozás tehát lassabb, mint a belső csatlakozás.

Mégis lehetnek olyan speciális helyzetek, amikor a Left join gyorsabb lesz, mint a Inner join, de nem folytathatjuk a kettő egymás felcserélését, mivel a left outer join funkcionálisan nem egyenértékű a inner join-nal.

Mondjunk el egy olyan esetet, amikor a Left Join gyorsabb lehet, mint a Inner Join. Ha az egyesítési műveletben részt vevő táblák túl kicsik, mondjuk 10 rekordnál kevesebbet tartalmaznak, és a táblák nem rendelkeznek elegendő indexszel a lekérdezés lefedéséhez, ebben az esetben a Left Join általában gyorsabb, mint a Inner Join.

Hozzuk létre az alábbi két táblát, és példaként végezzünk egy INNER JOIN-t és egy LEFT OUTER JOIN-t közöttük:

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 Név ID Név
1 1 A 1 A
2 2 2 B 2 2 B
3 3 C 3 C
4 4 4 D 4 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 Név ID Név
1 1 A 1 A
2 2 2 B 2 B
3 3 C 3 C
4 4 D 4 D
5 5 E 5 E

Amint fentebb látható, mindkét lekérdezés ugyanazt az eredményhalmazt adta vissza. Ebben az esetben, ha megnézzük mindkét lekérdezés végrehajtási tervét, akkor láthatjuk, hogy a belső csatlakozás többe került, mint a külső csatlakozás. Ennek az az oka, hogy a belső csatlakozásnál az SQL-kiszolgáló hash-illesztést végez, míg a bal oldali csatlakozásnál egymásba ágyazott ciklusokat.

A hash-illesztés általában gyorsabb, mint az egymásba ágyazott ciklusok. De ebben az esetben, mivel a sorok száma olyan kicsi, és nincs index, amit használhatnánk (mivel a név oszlopon végezzük a join-t), a hash művelet a legdrágább belső join lekérdezéssé vált.

Ha azonban a join lekérdezésben a megfelelő kulcsot névről azonosítóra változtatjuk, és ha a táblázatban nagy számú sor van, akkor a belső join gyorsabb lesz, mint a bal külső join.

MS Access belső és külső csatlakozás

Ha több adatforrást használ az MS Access lekérdezésben, akkor JOIN-okat alkalmazunk a látni kívánt rekordok ellenőrzésére, attól függően, hogy az adatforrások hogyan kapcsolódnak egymáshoz.

A belső csatlakozásban csak a két táblából származó kapcsolódó rekordok kerülnek egyetlen eredményhalmazba. Ez egy alapértelmezett összekapcsolás az Accessben, és a leggyakrabban használt is. Ha join-t alkalmazunk, de nem adjuk meg kifejezetten, hogy milyen típusú join-ról van szó, akkor az Access azt feltételezi, hogy belső join-ról van szó.

A külső join-ban a két táblából az összes kapcsolódó adatot helyesen kombinálja, plusz az egyik tábla összes megmaradt sorát. A full outer joinoknál az összes adatot kombináljuk, ahol csak lehetséges.

Left Join vs Left Outer Join

Az SQL szerveren a left outer join alkalmazásakor az outer kulcsszó opcionális. Így nincs különbség, ha azt írjuk, hogy ‘LEFT OUTER JOIN’ vagy ‘LEFT JOIN’, mivel mindkettő ugyanazt az eredményt adja.

A LEFT JOIN B egyenértékű szintaxis az A LEFT OUTER JOIN B-vel.

Az alábbiakban az SQL szerver egyenértékű szintaxisainak listája található:

Egyenértékű szintaxisok az SQL szerverben

Left Outer Join vs Right Outer Join

Ezt a különbséget már láttuk ebben a cikkben. A Left Outer Join és a Right Outer Join lekérdezések és eredményhalmazok segítségével láthatja a különbséget.

A Left Join és a Right Join közötti fő különbség a nem illeszkedő sorok bevonásában rejlik. A Left outer join tartalmazza a nem illeszkedő sorokat abból a táblából, amelyik a join záradék bal oldalán van, míg a Right outer join tartalmazza a nem illeszkedő sorokat abból a táblából, amelyik a join záradék jobb oldalán van.

Az emberek azt kérdezik, hogy melyik a jobb, azaz a Left join vagy a Right join? Alapvetően ugyanolyan típusú műveletek, csak az argumentumaik felcserélődnek. Ezért amikor azt kérdezzük, hogy melyik join-t használjuk, valójában azt kérdezzük, hogy a<b vagy b>a-t írjunk. Ez csak preferencia kérdése.

Az emberek általában a Left join (bal oldali csatlakozás) használatát részesítik előnyben SQL-lekérdéseikben. Azt javaslom, hogy maradjunk következetesek abban, ahogyan a lekérdezést írjuk, hogy elkerüljük a félreértéseket a lekérdezés értelmezésében.

Eddig mindent láttunk az Inner joinról és az összes típusú Outer joinról. Foglaljuk össze gyorsan a Belső Join és az Outer Join közötti különbséget.

A Belső Join és az Outer Join közötti különbség táblázatos formában

Inner Join Outer Join
Csak azokat a sorokat adja vissza, amelyek mindkét táblázatban azonos értékekkel rendelkeznek. Az egyező sorokat és néhány nem egyező sort is tartalmaz a két tábla között.
Ha a táblákban nagy számú sor van, és indexet kell használni, az INNER JOIN általában gyorsabb, mint az OUTER JOIN. Az OUTER JOIN általában lassabb, mint az INNER JOIN, mivel az INNER JOIN-hoz képest több rekordot kell visszaadnia. Lehetnek azonban olyan speciális forgatókönyvek, amikor az OUTER JOIN gyorsabb.
Ha nem talál egyezést, nem ad vissza semmit. Ha nem talál egyezést, a visszaadott oszlopértékbe egy NULL kerül.
Az INNER JOIN-t akkor használja, ha egy adott oszlop részletes információit szeretné megnézni. A OUTER JOIN-t akkor használja, ha a két táblázat összes információjának listáját szeretné megjeleníteni.
A INNER JOIN szűrőként működik. Mindkét táblában egyezésnek kell lennie ahhoz, hogy a belső csatlakozás adatokat adjon vissza. Az adatok hozzáadásaként viselkedik.
A belső csatlakozáshoz létezik implicit join jelölés, amely a FROM záradékban vesszővel elválasztva sorolja fel az összekapcsolandó táblákat.
Példa: CategoryID = category.CategoryID;
A külső csatlakozáshoz nincs implicit join jelölés.
Az alábbiakban egy belső csatlakozás vizualizációja látható:
egy belső join vizualizációja
Az alábbiakban egy külső join vizualizációja
egy külső join vizualizációja

Belső és külső join vs. unió

Néha összekeverjük a Join-t és az Union-t, és ez az egyik leggyakrabban feltett kérdés is az SQL interjúkon. Már láttuk a különbséget a belső csatlakozás és a külső csatlakozás között . Most pedig nézzük meg, hogy miben különbözik a JOIN az UNION-tól.

AUNION egymás után helyezi a lekérdezések egy sorát, míg a join egy kartéziánterméket hoz létre és részhalmazokat alkot. Így az UNION és a JOIN teljesen különböző műveletek.

Futtassuk le az alábbi két lekérdezést a MySQL-ben, és nézzük meg az eredményüket.

Bah
1 28
2 35

JOIN lekérdezés:

foo Bár
1 38 35

A UNION művelet két vagy több lekérdezés eredményét helyezi egyetlen eredményhalmazba. Ez az eredményhalmaz tartalmazza az UNION műveletben részt vevő összes lekérdezés által visszaadott összes rekordot. Az UNION tehát alapvetően két eredményhalmazt egyesít.

A join művelet két vagy több táblából szerez adatokat a táblák közötti logikai kapcsolatok, azaz a join feltétel alapján. Az egyesítési lekérdezésben az egyik táblából származó adatokat egy másik táblából származó rekordok kiválasztására használjuk. Lehetővé teszi a különböző táblákban található hasonló adatok összekapcsolását.

Az egyszerűbb megértés érdekében azt mondhatjuk, hogy az UNION két táblázat sorait egyesíti, míg az egyesítés két vagy több táblázat oszlopait egyesíti. Tehát mindkettőt n táblázat adatainak összekapcsolására használják, de a különbség az adatok összekapcsolásának módjában rejlik.

Az alábbiakban az UNION és a JOIN képi ábrázolása látható.

UNION és JOIN1

A fenti kép a Join művelet képi ábrázolása, amely azt mutatja, hogy az eredményhalmaz minden egyes rekordja tartalmaz oszlopokat mindkét táblából, azaz az A és a B táblából.

A join általában a denormalizáció eredménye (a normalizáció ellentéte), és az egyik tábla idegen kulcsát használja az oszlopértékek keresésére egy másik tábla elsődleges kulcsának felhasználásával.

UNION és JOIN2

A fenti képi ábrázolása az UNION műveletnek, amely azt mutatja, hogy az eredményhalmaz minden rekordja a két tábla valamelyikéből származó sor. Az UNION eredménye tehát az A és a B táblázat sorait egyesítette.

További olvasmányok =>> MySQL UNION magyarázat példákkal

Következtetés

Ezzel a cikkel megismertük a főbb különbségeket a belső és a külső csatlakozás között az SQL-ben. Láttuk az Outer Join osztályozását is, azaz a Left Join, a Right Join és a Full Join osztályozását. Láttuk, hogyan működnek ezek a csatlakozási típusok, és miben különböznek egymástól.

Teljesítmény-összehasonlítást is végeztünk ezen csatlakozási típusok között. Azt is megvitattuk, hogy miben különbözik a join az uniontól.

Még olvassa el =>> MySQL Join Types

Reméljük, hogy ez a cikk segített a különböző join típusok közötti különbségekkel kapcsolatos kételyeinek tisztázásában. Biztosak vagyunk benne, hogy így valóban el tudja majd dönteni, hogy a kívánt eredményhalmaz alapján melyik join típust válassza.