| Módszer | Inner Join | FROM-os Táblaösszekapcsolás |
|---|---|---|
| Szintaxis | SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.oszlop = tabla2.oszlop |
SELECT * FROM tabla1, tabla2 WHERE tabla1.oszlop = tabla2.oszlop |
| Explicit/Implicit | Explicit összekapcsolás | Implicit összekapcsolás |
| Olvashatóság | Könnyebben értelmezhető, modernebb | Régebbi, kevésbé ajánlott módszer |
| Teljesítmény | Általában optimalizáltabb | Kissé elavultabb |
| SQL szabvány | Megfelel a modern SQL szabványnak | Régebbi SQL szabvány |
A MySQL-ben az implicit (beleértett) és explicit (kifejezett) elnevezés arra utal, hogy az összekapcsolási szándékot közvetetten, egy feltételből vezetjük le, vagy közvetlenül, a JOIN kulcsszóval fejezzük ki.
Az INNER JOIN egy explicit, modern módszer a táblák összekapcsolására:
A régebbi stílusú összekapcsolás:
-- Inner Join módszer
SELECT * FROM alkalmazottak
INNER JOIN osztályok ON alkalmazottak.osztalyID = osztályok.ID;
-- FROM-os táblaösszekapcsolás
SELECT * FROM alkalmazottak, osztályok
WHERE alkalmazottak.osztalyID = osztályok.ID;
Fontos: A modern SQL fejlesztésben az INNER JOIN használata javasolt a jobb olvashatóság és karbantarthatóság érdekében.
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 tabla1
INNER / LEFT / RIGHT / CROSS tabla2
ON tabla1.azonosito1=tabla2.azonosito2;
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
|
rendelesek
|
INNER JOIN:
SELECT vevok.nev, rendelesek.osszeg
FROM vevok
INNER JOIN rendelesek
ON vevok.id = rendelesek.vevo_id;
vagy
SELECT vevok.nev, rendelesek.osszeg
FROM vevok, rendelesek
WHERE 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: