SQL táblák összekapcsolása: INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN (Adatbázis-lekérdezések utasításai példákkal)

Ebben az adatbázis-kezeléssel foglalkozó leckében a táblák összekapcsolásának módjait mutatjuk be: az INNER JOIN-t, a LEFT (OUTER) JOIN-t, a RIGHT (OUTER) JOIN-t és a FULL OUTER JOIN-t.

SQL alapok kezdőknek, SQL ismeretek kurzus borítókép

SQL táblák összekapcsolása: INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN (Adatbázis-lekérdezések utasításai példákkal)

Ebben az újabb adatbázis-kezeléssel foglalkozó leckében a táblák összekapcsolásának módjaival fogunk megismerkedni. Bemutatjuk az INNER JOIN-t, a LEFT (OUTER) JOIN-t, a RIGHT (OUTER) JOIN-t és a FULL OUTER JOIN-t.

Mi az az összekapcsolás? Miért van szükség rá?

Egy adatbázisban általában nem csak egy táblát tárolunk, hanem többet is. Az adatok átláthatóságának érdekében az adatokat célszerű több táblába rendezni.

Például egy webshop esetében érdemes külön adatbázis táblát létrehozni a vásárlók és a vásárlások számára. Fölösleges egyetlen egy táblában tárolni a vásárló nevét és a vásárlás részleteit, például a rendelés azonosítót és a rendelt termékeket. Miért? Mert, ha egy vásárló többször vásárol, akkor a személyes adatai (például név, telefonszám, cím) többször szerepelni az adatbázisban. Ezt nevezzük redundanciának.

Ha készítünk egy külön táblát a vásárlóknak, amelyben az adataikat tároljuk és egy külön táblát a vásárlásoknak, akkor a vásárlást tartalmazó rekordban csak a vásárlóra kell hivatkozni, azaz nem kell megadni minden adatát újból, mert a vásárló tábla már tartalmazza azt.

Az összekapcsolással (angolul JOIN) két vagy több táblát tudunk összekötni egy összefüggő mező alapján, azaz két különböző tábla rekordjait tudjuk egybefűzve megjeleníteni.

Nézzük meg egy példán keresztül, úgy sokkal érthetőbb lesz. A webáruházas példánál maradva legyen egy „vasarlok” és egy „vasarlas” táblánk. A „vasarlok” táblában tároljuk a vásárlók adatait, minden vásárlónak megadtunk egy egyedi azonosítót (ID), amely alapján egyértelműen beazonosítható. A „vasarlasok” táblában van egy a vásárlást azonosító ID és egy a vásárlót azonosító ID. A két tábla között a kapcsolódási pont a „vasarlok” tábla ID-ja és a „vasarlasok” tábla vasarloID-ja.

vasarlok tábla

IDvezeteknevkeresztnevlakhelyszuletesi_ev
1HorváthTamásBudapest1989
2LakatosDezsőDebrecen1961
5LosoncziLénaNyíregyháza2005

vasarlasok tábla

vasarlasIDvasarloIDtermekdarab
11laptop1
25telefon2
32TV1
42egér5

Kód nélkül és az összekapcsolás pontos bemutatása nélkül, ilyen lekérdezéseket készíthetünk a fenti két tábla összekapcsolásával. Ha nem külön táblában tárolnánk az adatokat, akkor a lenti példában nagyon jól látszik, hogy lennének redundáns adatokat, azaz egy személy adata többször is előfordulna az adatbázisban. De így, hogy két táblára bontottuk az adatokat, így az adatbázisban nem fogunk ismétlődő adatokat tárolni. A lent látható ismétlődő adatok csak a lekérdezés eredményét mutatják be, nem kerülnek eltárolásra az adatbázisban duplán, így végsősoron az adatbázis mérete kisebb lesz, a lekérdezések lefutásának ideje pedig gyorsabb.

Lekérdezés eredménye

vasarlasIDvasarloIDvezeteknevkeresztnevlakhelyszuletesi_evtermekdarab
11HorváthTamásBudapest1989laptop1
25LosoncziLénaNyíregyháza2005telefon2
32LakatosDezsőDebrecen1961TV1
42LakatosDezsőDebrecen1961egér5

Összekapcsolások közötti különbségek: INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN

Bár a címben és a bevezetőben már volt említve, hogy többféle összekapcsolás is létezik, de kifejtésre csak itt kerülnek.

Az összekapcsolásoknak négy típusát különböztetjük meg:

  • (INNER) JOIN
  • LEFT (OUTER) JOIN
  • RIGHT (OUTER) JOIN
  • FULL OUTER JOIN

A főbb különbözőségek az alábbi ábrán látszanak, lentebb pedig következik a kifejtés.

Összekapcsolások közötti különbségek: INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN
A kép kattintásra nagyobbodik!

Minden JOIN esetében vegyünk kettő táblát. Legyen egy bal oldali és egy jobb oldali tábla, csak úgy, mint az ábrán a halmaz.

INNER JOIN

Csak azokat a rekordokat adja vissza, amelyeknek a párja mind a két táblában előfordul.

LEFT JOIN

Visszaadja az összes rekordot a bal oldali táblából, melyhez társítja azokat a jobb oldali rekordokat, amelyekhez talált párt. Amely rekordokhoz nem talált párt, azokat NULL értékekkel tölti fel.

RIGHT JOIN

Visszaadja az összes rekordot a jobb oldali táblából, melyhez társítja azokat a bal oldali rekordokat, amelyekhez talált párt. Amely rekordokhoz nem talált párt, azokat NULL értékekkel tölti fel.

FULL OUTER JOIN

Visszaadja az összes rekordot függetlenül attól, hogy van-e párja valamelyik oldalon vagy sem. Amely rekordokhoz nem talált párt, azokat NULL értékekkel tölti fel.

JOIN-ok a gyakorlatban: szintaxisok és példák

Most hogy elméletben átvettük az SQL összekapcsolásokat, itt az ideje, hogy megnézzük gyakorlatban is őket. Hogy ez ne legyen egy végtelenbe nyúló cikk, így ide most elhelyezzük a két táblát, amelyen a JOIN-okat fogjuk alkalmazni, lentebb pedig már csak az SQL kódokat és az eredményeket fogjuk megjeleníteni.

vasarlok tábla

IDvezeteknevkeresztnevlakhelyszuletesi_ev
1HorváthTamásBudapest1989
2LakatosDezsőDebrecen1961
5LosoncziLénaNyíregyháza2005

vasarlasok tábla

vasarlasIDvasarloIDtermekdarab
11laptop1
25telefon2
32TV1
42egér5

INNER JOIN szintaxis

SELECT oszlop(ok)
FROM tábla1
INNER JOIN tábla2
ON tábla1.azonosító1=tábla2.azonosító2;
Code language: SQL (Structured Query Language) (sql)

A FROM után meg kell adnunk az egyik táblát, majd ezt követi az INNER JOIN és a második tábla, amelyiket az elsőhöz szeretnénk kapcsolni. Ezt követően egy ON kulcsszó után meg kell adnunk az egyik és a másik tábla azon mezőit, amelyek azonos értékeket tartalmaznak, ezen mentén fog történni az összekapcsolás.

INNER JOIN példa

SQL kód

SELECT * FROM vasarlok
INNER JOIN vasarlasok
ON vasarlok.ID=vasarlasok.vasarloID;
Code language: SQL (Structured Query Language) (sql)

Eredmény

IDvezeteknevkeresztnevlakhelyszuletesi_evvasarlasIDvasarloIDtermekdarab
1HorváthTamásBudapest198911laptop1
5LosoncziLénaNyíregyháza200525telefon2
2LakatosDezsőDebrecen196132TV1
2LakatosDezsőDebrecen196142egér5

LEFT JOIN szintaktika

SELECT oszlop(ok)
FROM tábla1
LEFT JOIN tábla2
ON tábla1.azonosító1=tábla2.azonosító2;
Code language: SQL (Structured Query Language) (sql)

A FROM után meg kell adnunk az egyik táblát, majd ezt követi a LEFT JOIN és a második tábla, amelyiket az elsőhöz szeretnénk kapcsolni. Ezt követően egy ON kulcsszó után meg kell adnunk az egyik és a másik tábla azon mezőit, amelyek azonos értékeket tartalmaznak, ezen mentén fog történni az összekapcsolás.

LEFT JOIN példa

SQL kód

SELECT * FROM vasarlok
LEFT JOIN vasarlasok
ON vasarlok.ID=vasarlasok.vasarloID;
Code language: SQL (Structured Query Language) (sql)

Eredmény

IDvezeteknevkeresztnevlakhelyszuletesi_evvasarlasIDvasarloIDtermekdarab
1HorváthTamásBudapest198911laptop1
5LosoncziLénaNyíregyháza200525telefon2
2LakatosDezsőDebrecen196132TV1
2LakatosDezsőDebrecen196142egér5
6BaloghBeatrixMiskolc1985NULLNULLNULLNULL
9KovácsIstvánBudapest1957NULLNULLNULLNULL
10LakatosBoldizsárDebrecen2009NULLNULLNULLNULL

RIGHT JOIN szintaxis

SELECT oszlop(ok)
FROM tábla1
RIGHT JOIN tábla2
ON tábla1.azonosító1=tábla2.azonosító2;
Code language: SQL (Structured Query Language) (sql)

A FROM után meg kell adnunk az egyik táblát, majd ezt követi a RIGHT JOIN és a második tábla, amelyiket az elsőhöz szeretnénk kapcsolni. Ezt követően egy ON kulcsszó után meg kell adnunk az egyik és a másik tábla azon mezőit, amelyek azonos értékeket tartalmaznak, ezen mentén fog történni az összekapcsolás.

RIGHT JOIN példa

SQL kód

SELECT * FROM vasarlasok
RIGHT JOIN vasarlok
ON vasarlasok.vasarloID=vasarlok.ID;
Code language: SQL (Structured Query Language) (sql)

Eredmény

vasarloIDvasarlasIDtermekvasarlasIDvasarloIDvezeteknevkeresztnevlakhelyszuletesi_ev
11laptop11HorváthTamásBudapest1989
52telefon25LosoncziLénaNyíregyháza2005
23TV32LakatosDezsőDebrecen1961
24egér42LakatosDezsőDebrecen1961
NULLNULLNULLNULL6BaloghBeatrixMiskolc1985
NULLNULLNULLNULL9KovácsIstvánBudapest1957
NULLNULLNULLNULL10LakatosBoldizsárDebrecen2009

FULL OUTER JOIN

A MySQL-ben a FULL JOIN nem elérhető, de egy LEFT JOIN és egy RIGHT JOIN uniójával emulálható.

Ha hasznos volt számodra, akkor kérlek oszd meg másokkal is, hogy ezzel támogass minket!