Oldal kiválasztása
Tábla módosítása

Lekérdezések Több Táblával:

A JOIN Műveletek és az Aliasok Használata

Az adatbázisok igazi ereje abban rejlik, hogy képesek több, kapcsolódó táblából lekérdezni adatokat. Ezt a JOIN műveletek segítségével tesszük, amelyek lehetővé teszik a logikailag összetartozó információk összekapcsolását a különböző táblákból.

Miért van szükség több táblára? A Normalizálás Elve

Az adatbázisok tervezésekor a normalizálás elvét követjük. Ennek célja az adatok hatékony tárolása, minimalizálva az adatredundanciát (azaz az ismétlődő adatokat) és maximalizálva az adatintegritást (azaz az adatok pontosságát és konzisztenciáját).

Például, ahelyett, hogy minden könyv rekordjában megismételnénk a szerző nevét és születési évét, külön táblában tároljuk a szerzőket (Szerzok tábla), és csak a szerzo_id-t hivatkozzuk a Konyvek táblában. Ez a megközelítés:

  • Helytakarékos: Csak egyszer tároljuk a szerzői adatokat.
  • Konzisztens: Ha egy szerző neve megváltozik, csak egy helyen kell módosítani.
  • Egyszerűsíti a karbantartást: Nincs többé szükség redundáns adatok frissítésére.

A Leggyakoribb JOIN Típusok Részletesen

Az alábbiakban a leggyakrabban használt JOIN típusokat vesszük sorra, példákkal és magyarázatokkal.

INNER JOIN

  • Ez a leggyakoribb JOIN típus.
  • Csak azokat a sorokat adja vissza, amelyek mindkét táblában megtalálhatók a megadott illesztési feltétel alapján. Más szóval, csak a „közös” adatokat kapjuk vissza.

Példa: Szeretnénk látni a könyvek címét és a szerzőjük nevét.

SELECT K.cim, S.nev AS SzerzoNeve
FROM Konyvek AS K
INNER JOIN Szerzok 
AS S ON K.szerzo_id = S.szerzo_id;

 

Magyarázat: Ez a lekérdezés összekapcsolja a Konyvek és Szerzok táblákat ott, ahol a Konyvek.szerzo_id megegyezik a Szerzok.szerzo_id-vel. Az eredmény csak azokat a könyveket és szerzőiket fogja tartalmazni, amelyek mindkét táblában megtalálhatók. Ha van egy könyv, aminek nincs szerzője a Szerzok táblában, vagy egy szerző, akinek nincs könyve a Konyvek táblában, azok nem jelennek meg az eredményben.

LEFT JOIN (vagy LEFT OUTER JOIN)

  • Visszaadja a bal oldali tábla összes sorát, és a jobb oldali tábla illeszkedő sorait.
  • Ha nincs illeszkedő sor a jobb oldali táblában, akkor NULL értékekkel tölti fel a jobb oldali tábla oszlopait.

Példa: Szeretnénk látni minden szerzőt, és ha van, a könyveik címét is. Ha egy szerzőnek nincs könyve a Konyvek táblában, akkor is szerepeljen az eredményben.

SELECT S.nev AS SzerzoNeve, K.cim AS KonyvCime
FROM Szerzok AS S
LEFT JOIN Konyvek AS K ON S.szerzo_id = K.szerzo_id;

Magyarázat: Ez a lekérdezés kilistázza az összes szerzőt a Szerzok táblából. Ha egy szerzőnek van könyve a Konyvek táblában, akkor megjeleníti a könyv címét is. Ha nincs, akkor a K.cim oszlop NULL lesz az adott szerző sorában.

RIGHT JOIN (vagy RIGHT OUTER JOIN)

  • Pontosan a LEFT JOIN ellentéte.
  • Visszaadja a jobb oldali tábla összes sorát, és a bal oldali tábla illeszkedő sorait. Ha nincs illeszkedő sor a bal oldali táblában, akkor NULL értékekkel tölti fel a bal oldali tábla oszlopait.

Példa: Szeretnénk látni az összes könyvet, még azokat is, amelyekhez valamilyen oknál fogva nincs szerző rendelve a Szerzok táblában. (Ez egy kevésbé gyakori forgatókönyv, de jól szemlélteti a RIGHT JOIN működését.)

SELECT K.cim AS KonyvCime, S.nev AS SzerzoNeve
FROM Szerzok AS S
RIGHT JOIN Konyvek 
AS K ON S.szerzo_id = K.szerzo_id;

 

Magyarázat: Ez a lekérdezés az összes könyvet visszaadja a Konyvek táblából. Ha egy könyvhöz van szerző a Szerzok táblában, akkor megjeleníti annak nevét. Ha nincs (például ha a szerzo_id NULL a Konyvek táblában, vagy olyan ID-re hivatkozik, ami nem létezik a Szerzok táblában), akkor az S.nev oszlop NULL lesz.

FULL OUTER JOIN

  • Visszaadja az összes sort mindkét táblából, illeszkedéssel vagy anélkül.
  • A nem illeszkedő részeket NULL értékkel tölti fel.
  • Fontos megjegyezni, hogy nem minden SQL nyelvjárás támogatja (pl. MySQL alapból nem, de PostgreSQL és SQL Server igen).

Példa: Szeretnénk látni az összes szerzőt és az összes könyvet, összekapcsolva, ahol lehetséges.

SELECT S.nev AS SzerzoNeve, K.cim AS KonyvCime
FROM Szerzok AS S
FULL OUTER JOIN Konyvek 
AS K ON S.szerzo_id = K.szerzo_id;

 

Magyarázat: Ez a lekérdezés visszaadja:

  • Azokat a szerzőket és a hozzájuk tartozó könyveket, amelyek mindkét táblában megtalálhatók.
  • Azokat a szerzőket, akiknek nincs könyvük (a K.cim NULL lesz).
  • Azokat a könyveket, amelyeknek nincs szerzőjük (az S.nev NULL lesz).

Az Aliasok Használata (AS)

Az aliasok (AS kulcsszóval vagy anélkül) rendkívül hasznosak a lekérdezések olvashatóságának és tömörségének javításában. Két fő típusa van:

  1. Tábla aliasok: A táblanevek rövidítésére szolgálnak, különösen akkor, ha több táblával dolgozunk, vagy ha a táblanevek hosszúak. Ezáltal a lekérdezés sokkal könnyebben olvashatóvá és írhatóvá válik.

Példa:

SELECT K.cim, S.nev
FROM Konyvek AS K
-- 'Konyvek' tábla aliasa 'K'
INNER JOIN Szerzok
AS S ON K.szerzo_id = S.szerzo_id;
-- 'Szerzok' tábla aliasa 'S'

 

Itt a K és S aliasok lehetővé teszik, hogy rövidebben hivatkozzunk a Konyvek és Szerzok táblákra, amikor oszlopokat választunk ki vagy JOIN feltételt adunk meg. A AS kulcsszó el is hagyható (pl. FROM Konyvek K), de az AS használata ajánlott a jobb olvashatóság miatt.

  1. Oszlop aliasok: Az eredményhalmazban megjelenő oszlopoknak adnak átmeneti nevet. Ez különösen hasznos, ha az oszlopnév eredetileg nem beszédes, vagy ha számított oszlopot hozunk létre.

Példa:

SELECT S.nev 
AS SzerzoNeve, K.cim AS KonyvCime
FROM Szerzok AS S
LEFT JOIN Konyvek
AS K ON S.szerzo_id = K.szerzo_id;

 

Itt az S.nev oszlop az eredményben SzerzoNeve néven, a K.cim pedig KonyvCime néven fog megjelenni.

Több JOIN egy Lekérdezésben

A JOIN műveleteket egymás után is fűzhetjük, hogy akár több táblát is összekapcsoljunk. Az SQL motor sorban hajtja végre a JOIN műveleteket, az előző JOIN eredményhalmazát használva a következő JOIN bemeneteként.

Példa: Melyik könyvet ki kölcsönözte ki, mikor, és ki a könyv szerzője? (Szerző neve + könyv címe + olvasó neve + kölcsönzés dátuma)

Ehhez négy táblára van szükségünk: Konyvek, Szerzok, Kolcsonzesek, és Olvasok.

SELECT
  S.nev AS SzerzoNeve,
  K.cim AS KonyvCime,
  O.nev AS OlvasoNeve,
  KO.kolcsonzes_datuma
FROM
  Konyvek AS K
INNER JOIN
  Szerzok AS S ON K.szerzo_id = S.szerzo_id
-- Konyvek és Szerzok összekapcsolása
INNER JOIN
  Kolcsonzesek AS KO ON K.konyv_id = KO.konyv_id
-- Konyvek (és Szerzok) és Kolcsonzesek összekapcsolása
INNER JOIN
  Olvasok AS O ON KO.olvaso_id = O.olvaso_id;
-- Kolcsonzesek (és Konyvek, Szerzok)
és Olvasok összekapcsolása

 

Magyarázat:

  1. Konyvek és Szerzok összekapcsolása: Először összekapcsoljuk a Konyvek és Szerzok táblákat a szerzők neveinek lekérdezéséhez.
  2. Kolcsonzesek összekapcsolása: Ezt az eredményhalmazt (könyvcímek és szerzőnevek) aztán összekapcsoljuk a Kolcsonzesek táblával, hogy hozzáférjünk a kölcsönzési adatokhoz.
  3. Olvasok összekapcsolása: Végül a Kolcsonzesek és Olvasok táblákat kapcsoljuk össze az olvasók neveiért.

Ez a lépésről lépésre történő JOIN folyamat lehetővé teszi, hogy komplex lekérdezéseket hozzunk létre, amelyek több, logikailag kapcsolódó információt vonnak össze egyetlen átfogó eredményhalmazba. A helyes JOIN típus megválasztása és az aliasok céltudatos használata elengedhetetlen a hatékony és olvasható SQL kód írásához.