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
ID | vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|---|
1 | Horváth | Tamás | Budapest | 1989 |
2 | Lakatos | Dezső | Debrecen | 1961 |
5 | Losonczi | Léna | Nyíregyháza | 2005 |
vasarlasok tábla
vasarlasID | vasarloID | termek | darab |
---|---|---|---|
1 | 1 | laptop | 1 |
2 | 5 | telefon | 2 |
3 | 2 | TV | 1 |
4 | 2 | egér | 5 |
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
vasarlasID | vasarloID | vezeteknev | keresztnev | lakhely | szuletesi_ev | termek | darab |
---|---|---|---|---|---|---|---|
1 | 1 | Horváth | Tamás | Budapest | 1989 | laptop | 1 |
2 | 5 | Losonczi | Léna | Nyíregyháza | 2005 | telefon | 2 |
3 | 2 | Lakatos | Dezső | Debrecen | 1961 | TV | 1 |
4 | 2 | Lakatos | Dezső | Debrecen | 1961 | egér | 5 |
Ö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.
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
ID | vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|---|
1 | Horváth | Tamás | Budapest | 1989 |
2 | Lakatos | Dezső | Debrecen | 1961 |
5 | Losonczi | Léna | Nyíregyháza | 2005 |
vasarlasok tábla
vasarlasID | vasarloID | termek | darab |
---|---|---|---|
1 | 1 | laptop | 1 |
2 | 5 | telefon | 2 |
3 | 2 | TV | 1 |
4 | 2 | egér | 5 |
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
ID | vezeteknev | keresztnev | lakhely | szuletesi_ev | vasarlasID | vasarloID | termek | darab |
---|---|---|---|---|---|---|---|---|
1 | Horváth | Tamás | Budapest | 1989 | 1 | 1 | laptop | 1 |
5 | Losonczi | Léna | Nyíregyháza | 2005 | 2 | 5 | telefon | 2 |
2 | Lakatos | Dezső | Debrecen | 1961 | 3 | 2 | TV | 1 |
2 | Lakatos | Dezső | Debrecen | 1961 | 4 | 2 | egér | 5 |
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
ID | vezeteknev | keresztnev | lakhely | szuletesi_ev | vasarlasID | vasarloID | termek | darab |
---|---|---|---|---|---|---|---|---|
1 | Horváth | Tamás | Budapest | 1989 | 1 | 1 | laptop | 1 |
5 | Losonczi | Léna | Nyíregyháza | 2005 | 2 | 5 | telefon | 2 |
2 | Lakatos | Dezső | Debrecen | 1961 | 3 | 2 | TV | 1 |
2 | Lakatos | Dezső | Debrecen | 1961 | 4 | 2 | egér | 5 |
6 | Balogh | Beatrix | Miskolc | 1985 | NULL | NULL | NULL | NULL |
9 | Kovács | István | Budapest | 1957 | NULL | NULL | NULL | NULL |
10 | Lakatos | Boldizsár | Debrecen | 2009 | NULL | NULL | NULL | NULL |
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
vasarloID | vasarlasID | termek | vasarlasID | vasarloID | vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|---|---|---|---|---|
1 | 1 | laptop | 1 | 1 | Horváth | Tamás | Budapest | 1989 |
5 | 2 | telefon | 2 | 5 | Losonczi | Léna | Nyíregyháza | 2005 |
2 | 3 | TV | 3 | 2 | Lakatos | Dezső | Debrecen | 1961 |
2 | 4 | egér | 4 | 2 | Lakatos | Dezső | Debrecen | 1961 |
NULL | NULL | NULL | NULL | 6 | Balogh | Beatrix | Miskolc | 1985 |
NULL | NULL | NULL | NULL | 9 | Kovács | István | Budapest | 1957 |
NULL | NULL | NULL | NULL | 10 | Lakatos | Boldizsár | Debrecen | 2009 |
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ó.