MySQL táblaösszekapcsolási módszerek (JOIN vs. FROM)


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.

Részletes Magyarázat

Inner Join jellemzői

Az INNER JOIN egy explicit, modern módszer a táblák összekapcsolására:

FROM-os táblaösszekapcsolás

A régebbi stílusú összekapcsolás:

Példa mindkét módszerre

-- 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.


Explicit ö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 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.

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ó

rendelesek

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; 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: