Adatok lekérdezése több táblából
A JOIN parancs bemutatása, az adatok lekérdezéséhez több táblázatból
- Főoldal
/
- Kurzusok
/
- SQL
/
- SQL kezdőknek
Adatok lekérdezése több táblából
Vegyük az előbbi leckéből szármzazó példát: Egy könyvtárban személyek adatait tároljuk, és hogy kik milyen könyvet kölcsönöztek ki. Minden ember kölcsönözhet több könyvet egyszerre. Az SQL alapokból tudjuk, hogy egy oszlopba csakis egy adatot menthetünk, ezért nem készíthetünk a személyek táblázatában olyan oszlopot, hogy: books_rent, melynek az értéke pl: 1,3,7,9 ahol a számok a könyvek azonosító számai. Egy ilyen adat elmentése a későbbiekben rengeteg problémát okozna, főként kereséseknél.
Ezért szükségünk lesz egy új táblázatra amelybe mentjük a személyek azonosító számait és a könyvekét is egyaránt, így könnyedén meg tudjuk keresni a nekünk megfelelő adatokat.
Több táblázatból való adatok együttes lekérdezéséhez használjuk a JOIN parancsot.
A JOIN parancs felépítése a következő formában néz ki:
// Adatok lekérdezése esetén
SELECT *
FROM `peoples`
JOIN `books_rent` ON 'összekapcsolási feltételek'
Az összekapcsolási feltételek megírásához mindkét táblázatból kell legalább egy adat, amelyet össze tudunk kapcsolni, pl: a felhasználó azonosító száma, ID-ja.
// Adatok lekérdezése esetén
SELECT *
FROM `peoples`
JOIN `books_rent` ON `peoples`.`id` = `books_rent`.`user_id`
A peoples táblázatban az azonosító neve az ID, míg a kölcsönzött könyvek táblázatban user_id, hogy tudjuk az egy személy ID azonosítójával kell megegyezzen.
A kapcsolódási feltételeknél meg kell határozni azt is, hogy melyik táblázatból szereplő oszlop egyenlő a másik táblázatban szereplő melyik oszloppal, ezért a táblázatok neveit is le kell írni, és a . segítségével hivatkozhatunk a benne levő oszlopra.
Ahhoz, hogy ne kelljen mindig leírni a táblázat nevét, lehetőségünk van a rövidítésére is az AS segítségével az alábbi módon:
// Adatok lekérdezése esetén
SELECT *
FROM `peoples` AS p
JOIN `books_rent` AS br ON `p`.`id` = `br`.`user_id`
Így kicsit egyszerűbb és rövidebb is a parancsunk.
Összekapcsolási feltételnek előfordul hogy nem elegendő csak egy oszlop szerint meghatározni a kapcsolatot, vagy a kapcsolatot már egyenesen szeretnénk megszűrni, pl. amikor valaki rendszeresen kölcsönöz ki könyveket, idén is, tavaly is, stb. és nekünk csak az ideiek kellenek:
// Adatok lekérdezése esetén
SELECT *
FROM `peoples` AS p
JOIN `books_rent` AS br ON `p`.`id` = `br`.`user_id`
AND `br`.`insert_date` > 'egy dátum aminél nagyobb legyen'
Az előbbi példákban még felmerülhet az is, hogy kell nekünk a könyv neve is, ezáltal egy harmadik táblázattal is össze kell kapcsolódjunk:
// Adatok lekérdezése esetén
SELECT *
FROM `peoples` AS p
JOIN `books_rent` AS br ON `p`.`id` = `br`.`user_id`
AND `br`.`insert_date` > 'egy dátum aminél nagyobb legyen'
JOIN `books` AS b ON `b`.`id` = `br`.`book_id`
Egyszerre több táblázattal is kapcsolódhatunk az adataink lekérdezéséhez, amennyire épp szükség van.
Felmerül a kérdés, mi történik ha például nem létezik a felhasználó, vagy nem létezik egy adott könyv már a rendszerben? A JOIN miatt azokat a sorokat a rendszer nem fogja visszatéríteni, csak azokat ahol mindhárom táblázatban léteznek adatok a kapcsolódási feltételek alapján.
JOIN típusok
1. JOIN
A sima JOIN parancs, amint az előbb is leírtuk ebben az esetben minden táblázatban kell legyen a kapcsolódási feltételeknek megfelelően adat. Ha nincs csak az egyik táblázatban (pl. csak felhasználó létezik) akkor nem kapunk vissza adatot.
2. LEFT JOIN
Hasonló a JOIN függvényhez, annyi különbséggel, hogy ebben az esetben ha abban a táblázatban nem létezik adat amelyikkel kapcsolódni szeretnénk, akkor is kapni fogunk adatokat, viszont ebből a táblázatból származó adatok értékei mind NULL értéket fognak kapni.
// Adatok lekérdezése esetén
SELECT *
FROM `peoples` AS p
LEFT JOIN `books_rent` AS br ON `p`.`id` = `br`.`user_id`
AND `br`.`insert_date` > 'egy dátum aminél nagyobb legyen'
JOIN `books` AS b ON `b`.`id` = `br`.`book_id`
Ezzel a JOIN típussal ha nem vigyázunk, pl. a fenti esetben is, annak a táblázatnak az egyik oszlopával, melyben nem kell kötelezően szerepeljenek adatok számunkra, tovább csatlakoztattuk egy harmadik táblázattal, ezáltal könnyen előfordulhat, hogy a books_rent táblázat összes olyan sorát ahol értékeknek NULL-t fog kapni, megpróbálja csatlakoztatni a books táblázat összes sorával. Néha ez elég nagy mértékben megtudja növelni a lekérendő adatok számát, akár több milliót is eredményezve.
3. RIGHT JOIN
Hasonló a LEFT JOIN függvényhez, annyi különbséggel, hogy ebben az esetben ha abban a táblázatban nem létezik adat amelyikből kapcsolódni szeretnénk, akkor is kapni fogunk adatokat, viszont ebből a táblázatból származó adatok értékei mind NULL értéket fognak kapni.
// Adatok lekérdezése esetén
SELECT *
FROM `peoples` AS p
RIGHT JOIN `books_rent` AS br ON `p`.`id` = `br`.`user_id`
AND `br`.`insert_date` > 'egy dátum aminél nagyobb legyen'
Ezzel a JOIN típussal is vigyáznunk kell, ahogy a LEFT JOIN-al is, könnyen megsokszorozhatjuk az adatok számát.
A JOIN feltételek esetében, függetlenól a típustól, tudni kell, hogy ha két oszlop neve megegyezik két különböző táblázatban, amelyeket összekapcsolunk, azon a néven szereplő adatként azt fogjuk megkapni, amelyiket utoljára veszi ki a rendszer.
Például, ha a peoples és a books_rent táblázatban is van id nevű oszlopunk, és SELECT * -t írtunk, akkor a JOIN miatt a books_rent táblázatból fogjuk venni utoljára az adatokat, ezáltal a books_rent táblázat id oszlopa felülírja a peoples táblázat id oszlopának értékét! Ha mindkét id oszlopra szükségünk van, akkor a SELECT-en belül más néven kell kivegyük őket, pl:
// Adatok lekérdezése esetén
SELECT *, `p`.`id` AS id, `br`.`id` AS br_id
FROM `peoples` AS p
JOIN `books_rent` AS br ON `p`.`id` = `br`.`user_id`
AND `br`.`insert_date` > 'egy dátum aminél nagyobb legyen'
JOIN `books` AS b ON `b`.`id` = `br`.`book_id`
Vagy ha nincs szükségünk mindkét ID oszlopra, akkor csak az egyik táblázatból olvassuk ki az adatokat, pl. a peoples-ből:
// Adatok lekérdezése esetén
SELECT `p`.*
FROM `peoples` AS p
JOIN `books_rent` AS br ON `p`.`id` = `br`.`user_id`
AND `br`.`insert_date` > 'egy dátum aminél nagyobb legyen'
JOIN `books` AS b ON `b`.`id` = `br`.`book_id`
- Előző lecke: Adatok lekérdezése
Részletek
- Megtekintve: 181
- Haszontalannak jelölve: 0
- Hasznosnak jelölve: 0
- Értékelés: