Fájlok írása Pytonban!
Elkészült a Python nyelv Szövegfájlok írása tananyagunk! Jó tanulást, jó gyakorlást!

<info9>

Lekérdezés több táblából

Gyakori, hogy egyszerre egynél több táblából szeretnénk információkhoz jutni. Példaképp tekintsük az alábbi adatbázisszerkezetet:

Ha ebből az adatbázisból szeretnénk megtudni, hogy melyik tantárgyból milyen érdemjegyek születtek, a tantargy, valamint a jegy táblára is szükségünk van. A jegyek értéke ugyanis a jegy tábla jegy mezőjében szerepel, a tantárgy neve viszont a tantargy tábla nev mezőjében található meg. Ilyen lekérdezések esetén két lehetőség áll rendelkezésünkre:

Összekapcsolás a WHERE kulcsszóval

Felvehetjük mindkét táblát a lekérdezés FROM részébe, majd összekapcsolhatjuk őket a WHERE kulcsszóban megadott feltételen keresztül. Jelenleg az ábrán láthatjuk, hogy a jegy táblában a targy_id mező határozza meg a jegyhez tartozó tantárgy azonosítóját, ez alapján kell megkeresni a hozzá tartozó értéket a tantárgy tábla id mezőjében. Most határozzuk meg ezt a feltételt SQL utasítással:

SELECT `nev`, `jegy` FROM `jegy`, `tantargy` WHERE `jegy`.`targy_id` = `tantargy`.`id`

Ennek a megoldásnak hátránya, hogy precízebb beállításokra (lásd lentebb) nem ad lehetőséget, és komplexebb lekérdezések esetén az átláthatóságra is rossz hatással lehet. Ettől függetlenül, ez is egy gyakran látható összekapcsolási megoldás, így mindenképp érdemes említést tenni róla – de a másik megoldás a legtöbb esetben a JOIN jobb megoldásként szolgál.

Itt a húsvét!

Szeretnél az ünnepek alatt is gyakorolni? Vár az Easter Bug Hunt játékunk! Csatlakozz, és keresd meg az összes hibát - akár még jutalom is ütheti a markod!

Irány a játék

Összekapcsolás a JOIN … ON … kulcsszóval

A másik összekapcsolási lehetőség a JOIN, amely több lehetőséget kínál. Ezen kulcsszó esetén a FROM után csak egy táblát kell megadnunk, majd ezt követi a JOIN kulcsszó, mely után a hozzá kapcsolandó tábla neve jön, majd az ON, majd az összekapcsolás feltétele. Több összekapcsolás esetén itt jöhet utána a következő JOIN, stb. Nézzük tehát a fentebbi példát a JOIN-nal kifejezve:

SELECT `nev`, `jegy` FROM `jegy` JOIN `tantargy` ON `jegy`.`targy_id` = `tantargy`.`id`

Próbáld ki és nézd meg a lekérdezést a homokozóban! A JOIN egyik fontos előnye, hogy az összekapcsoló feltételeket a WHERE többi feltételétől elkülönítve adhatjuk meg, így a lekérdezésünk mindig átláthatóbb marad. Másik előnye azonban, hogy a JOIN utasítás extra lehetőségeket is kínál. Jelen feladatunk egyszerű volt, hiszen minden jegyhez biztosan tartozik tantárgy, azonban nem minden kapcsolat ilyen “kényelmes”.

Tegyük fel, szükségünk van az osztályból az összes diák nevére, és a hozzájuk kapcsolódó beírásokra. Ez a feladat eltérő az előzőtől, most ugyanis MINDEN diákra szükségünk van, azokra is, akiknek nincs beírásuk. Ha az előbbi példára készítjük el a feltételt, akkor azon kapjuk magunkat, hogy csak azok a diákok jelennek meg, akiknek vannak beírásaik, mivel a többi sor esetén az összekapcsolás nem talál egyezést. Ezt azonban áthidalhatjuk a LEFT vagy a RIGHT kulcsszó segítségével. Ha a LEFT JOIN kulcsszót használjuk, akkor a MySQL vissza fog adni minden rekordot a lekérdezésben a kulcsszótól balra (=előtte) taláható táblákból, és ha van hozzájuk tartozó rekord a tőle jobbra lévő táblában, úgy azt hozzákapcsolja, ha nem, akkor a többi mező egyszerűen üres marad. Az “összes diák, és akinek van, annak a beírásai” megoldása tehát:

SELECT * FROM `diak` LEFT JOIN `beiras` ON `diak`.`id` = `beiras`.`diak_id`

A RIGHT JOIN ugyanezt teszi, csak fordítva, ha tehát a táblákat a másik sorrendben adjuk meg, ezt is tudjuk használni:

SELECT * FROM `beiras` RIGHT JOIN `diak` ON `diak`.`id` = `beiras`.`diak_id`

És hogy mi ennek a haszna? Az, hogy innentől már csak egy apró lépés azok meghatározása, akiknek NINCS beírásuk. Mivel a beírással nem rendelkező diákok esetén az összekapcsolás üresen hagyja a beírás tábla mezőit, erre könnyen szűrhetünk. A diákok, akiknek nincs beírásuk, tehát:

SELECT * FROM `diak` LEFT JOIN `beiras` ON `diak`.`id` = `beiras`.`diak_id` WHERE `beiras`.`id` IS NULL

Azokban az esetekben, ha szükségünk van valamelyik tábla összes elemére garantáltan, úgy csak a JOIN lehet a segítségünkre, ezt a “finomhangolást” nem tudjuk megtenni a WHERE-es összekapcsolás esetén. (A JOIN-nal használható harmadik kulcsszó az INNER JOIN, ez lényegében ugyanaz, mint a sima JOIN, de az átláthatóság jegyében ezt is kitehetjük)

Kettőnél több tábla összekötése

Tudtad?
Az átláthatóság érdekében az SQL lekérdezéseket akár több sorba is tördelheted, ez nem befolyásolja a működésüket.
Íme egy-egy példa kettőnél több tábla összekapcsolásáról:

SELECT * FROM `diak`, `jegy`, `tantargy` WHERE `diak`.`id` = `jegy`.`diak_id` AND `jegy`.`targy_id` = `tantargy`.`id`
SELECT * FROM `jegy` 
JOIN `tantargy` ON `jegy`.`targy_id` = `tantargy`.`id`
JOIN `diak` ON `diak`.`id` = `jegy`.`diak_id`