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).
Kapcsolódó bejegyzések
- A State of AI Jelentés 5 Meglepő Tanulsága – Mit Üzen a Mesterséges Intelligencia Jövője?
- A Fájl, Ami Visszanéz – Kanári Tokenek
- Négy meglepő igazság a modern hekkertámadásokról
- Mi hajtja a számítástechnika forradalmait? – 3. rész
- A Számítástechnika Elképesztő Utazása 2.
- 💥 Az SQL Injection – Amikor a weboldalad saját magát árulja el
- A jövő munkahelyei:
- IoT eszközök: A kényelmes élet kulcsa vagy a privát szféra végét jelentik?
-
A titkosítás evolúciója: Hogyan vált a kulcsküldés problémája a digitális kor alappillérévé?
- Az internet titkos világa – Amit nem látsz a Google-ban
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:
- 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.
- 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:
- Konyvek és Szerzok összekapcsolása: Először összekapcsoljuk a Konyvek és Szerzok táblákat a szerzők neveinek lekérdezéséhez.
- 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.
- 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.