Összekapcsolás - JOIN

A JOIN művelet lehetővé teszi, hogy két vagy több táblát egyesítsünk egy lekérdezésben, közös oszlopok alapján. Ez hasznos lehet, amikor egy táblában vannak a részletek, egy másik táblában pedig a kapcsolódó adatok, és ezeket együtt szeretnénk kezelni.

A JOIN típusai:

  1. INNER JOIN: Közös sorokat ad vissza két tábla között.
  2. LEFT JOIN: A bal oldali tábla összes sorát adja vissza, és a jobb oldali tábla megfelelő sorait (ha vannak). Ha a jobb oldali táblában nincs megfelelő sor, akkor azokat NULL értékekkel tölti fel.
  3. RIGHT JOIN: A jobb oldali tábla összes sorát adja vissza, és a bal oldali tábla megfelelő sorait (ha vannak. Ha nincs, akkor NULL értékkel tölti fel).
  4. FULL OUTER JOIN: Mindkét tábla összes sorát adja vissza.
  5. CROSS JOIN: A két tábla Descartes-szorzatát adja vissza.
  6. SELF JOIN: Egy tábla önmagával való összekapcsolását teszi lehetővé.

Az első négy (1.-4.) összekapcsolások közötti különbséget az alábbi ábra szemlélteti:
alt text

Szintaxisok

SELECT oszlop(ok) FROM tábla1 INNER / LEFT / RIGHT / CROSS tábla2 ON tábla1.azonosító1=tábla2.azonosító2;

A FROM után meg kell adnunk az egyik táblát, majd ezt követi az INNER JOIN (LEFT JOIN / RIGHT JOIN / CROSS 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, ez alapján fog történni az összekapcsolás.

A JOIN-ok használatával hatékonyan és rugalmasan dolgozhatunk az adatokkal az adatbázisokban.

A JOIN-ok bemutatása példán keresztül

Tegyük fel, hogy van két táblánk:

vevok:

id nev
1 Kovács János
2 Tóth Péter
3 Szabó László

rendelések:

id vevo_id osszeg
1 1 1000
2 1 2000
3 2 3000

INNER JOIN:

SELECT vevok.nev, rendelesek.osszeg FROM vevok INNER JOIN rendelesek ON vevok.id = rendelesek.vevo_id;

Ez a lekérdezés visszaadja azokat a neveket és összegeket, ahol a vevok.id megegyezik a rendelések.vevo_id-vel.

Eredmény:

nev osszeg
Kovács János 1000
Kovács János 2000
Tóth Péter 3000

LEFT JOIN (vagy LEFT OUTER JOIN)

SELECT vevok.nev, rendelesek.osszeg FROM vevok LEFT JOIN rendelesek ON vevok.id = rendelesek.vevo_id;

Ez a lekérdezés visszaadja az összes vevő nevét és a hozzájuk tartozó rendelések összegét, ha van ilyen.

Eredmény:

nev osszeg
Kovács János 1000
Kovács János 2000
Tóth Péter 3000
Szabó László NULL

RIGHT JOIN (vagy RIGHT OUTER JOIN)

SELECT vevok.nev, rendelesek.osszeg FROM vevok RIGHT JOIN rendelesek ON vevok.id = rendelesek.vevo_id;

Ez a lekérdezés visszaadja az összes rendelések összegét és a hozzájuk tartozó vevő nevét, ha van ilyen.

Eredmény:

nev osszeg
Kovács János 1000
Kovács János 2000
Tóth Péter 3000

FULL OUTER JOIN

A MySQL alapértelmezés szerint nem támogatja a FULL OUTER JOIN-t, de szimulálható UNION segítségével:

SELECT vevok.nev, rendelesek.osszeg FROM vevok LEFT JOIN rendelesek ON vevok.id = rendelesek.vevo_id UNION SELECT vevok.nev, rendelesek.osszeg FROM vevok RIGHT JOIN rendelesek ON vevok.id = rendelesek.vevo_id WHERE vevok.id IS NULL;

Eredmény:

nev osszeg
Kovács János 1000
Kovács János 2000
Tóth Péter 3000
Szabó László NULL

CROSS JOIN Minden sor a bal oldali táblából kombinálva van minden sorral a jobb oldali táblából.

SELECT vevok.nev, rendelesek.osszeg FROM vevok CROSS JOIN rendelesek; vagy SELECT vevok.nev, rendelesek.osszeg FROM vevok,rendelesek;

Ez a lekérdezés visszaadja a vevők és rendelések összes lehetséges kombinációját.

Eredmény:

nev osszeg
Kovács János 1000
Kovács János 2000
Kovács János 3000
Tóth Péter 1000
Tóth Péter 2000
Tóth Péter 3000
Szabó László 1000
Szabó László 2000
Szabó László 3000

SELF JOIN

SELECT a.nev, b.nev FROM vevok a JOIN vevok b ON a.id < b.id;

Ez a lekérdezés visszaadja a vevők összes lehetséges párját, ahol az első vevő azonosítója kisebb, mint a második vevő azonosítója.

Eredmény:

nev nev
Kovács János Tóth Péter
Kovács János Szabó László
Tóth Péter Kovács János
Tóth Péter Szabó László
Szabó László Kovács János
Szabó László Tóth Péter

Források: