Lekérdezések egymásba ágyazása
Komplexebb SQL problémák megoldásához előfordulhat, hogy nem elegendő egy lekérdezés. Ezen esetekben lehetőségünk van több lekérdezés egymásba ágyazására, melyre általában kerek zárójeleket használunk. Ezek használatára viszonylag sok különféle lehetőség áll rendelkezésre, ezek közül csak néhány alapesetet mutatunk be ebben a fejezetben.
Allekérdezés beágyazása egyszerű feltételekbe
Készítsünk lekérdezést, amely meghatározza Kovács Péter osztálytársait a diak tábla felhasználásával. Ehhez először meg kell találnunk, hogy melyik osztályba jár Kovács Péter:
SELECT `osztaly` FROM `diak` WHERE `nev` = "Kovács Péter"
SELECT `nev` FROM `diak`
WHERE `osztaly` = (SELECT `osztaly` FROM `diak` WHERE `nev` = "Kovács Péter")
A lekérdezés kilistázza Kovács Péter osztályának összes tanulójának a nevét. A lekérdezést persze még egy kicsit továbbfejleszthetjük, hogy Kovács Péter maga ne jelenjen meg, csak a többi osztálytársa:
SELECT `nev` FROM `diak`
WHERE `osztaly` = (SELECT `osztaly` FROM `diak` WHERE `nev` = "Kovács Péter")
AND `nev` <> "Kovács Péter"
Az IN és NOT IN kulcsszó használata
Másik gyakori felhasználása az allekérdezéseknek az IN vagy a NOT IN kulcsszavak használata. Amennyiben azt szeretnénk vizsgálni, hogy egy adott érték szerepel-e egy másik lekérdezés által visszaadott értékek helyett, akkor az IN kulcsszót tudjuk használni. Ez abban tér el az = operátortól, hogy az = csak egy értékkel tud összehasonlítani, az IN viszont több értékkel is.
A tavaszi C# alapozó bootcampünk tananyagait továbbra is megvásárolhatod! Bár az élő előadásokon már túl vagyunk, az összes előadás anyaga továbbra is visszanézhető!
Irány a bootcampPéldaként próbáljuk meghatározni azokat a diákokat, akik dicséretben, valamint intőben is részesültek. Ehhez először listázzuk ki azon diákokat, akik kaptak dicséretet:
SELECT `diak`.`nev` FROM `diak`
JOIN `beiras` ON `diak`.`id` = `beiras`.`diak_id`
WHERE `tipus` = "dicséret"
Most pedig keressük meg azokat a diákokat, akik kaptak intőt, ÉS szerepel a nevük az előző lekérdezés eredményében is (azaz dicséretet is kaptak):
SELECT `diak`.`nev` FROM `diak`
JOIN `beiras` ON `diak`.`id` = `beiras`.`diak_id`
WHERE `tipus` = "intő"
AND `nev` IN (SELECT `diak`.`nev` FROM `diak`
JOIN `beiras` ON `diak`.`id` = `beiras`.`diak_id`
WHERE `tipus` = "dicséret")
A lekérdezést ide kattintva áttekintheted, módosíthatod, kipróbálhatod az SQL homokozóban! A NOT IN kifejezés az IN ellentétje, azokat a rekordokat adja meg, amelyek adott értéke nem szerepel az allekérdezés értékei között. Ezzel tehát megkaphatjuk azokat az intőt kapott diákokat, akik NEM kaptak dicséretet:
SELECT `diak`.`nev` FROM `diak`
JOIN `beiras` ON `diak`.`id` = `beiras`.`diak_id`
WHERE `tipus` = "intő"
AND `nev` NOT IN (SELECT `diak`.`nev` FROM `diak`
JOIN `beiras` ON `diak`.`id` = `beiras`.`diak_id`
WHERE `tipus` = "dicséret")
Allekérdezések egyéb felhasználása
Az allekérdezéseket ezen felül felhasználhatjuk a HAVING-ben, de akár a SELECT-ben, vagy a JOIN-ban is.
További példák hamarosan!