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.
Az első négy (1.-4.) összekapcsolások közötti különbséget az alábbi ábra szemlélteti:
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.
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: