Az SQL nyelvben lehetőség van arra, hogy a lekérdezések feltételében is használjunk SQL lekérdező parancsot. Ilyenkor megkülönböztetünk külső és belső SELECT parancsot. Az ilyen lekérdezéseket beágyazott vagy belső lekérdezéseknek nevezzük.
Belső lekérdezést (subquery-t) akkor használunk, amikor egy lekérdezés eredményét egy másik lekérdezésben kell felhasználni. Az adattáblákból valamilyen "globális" információt szeretnénk kinyerni.
A belső SELECT-et mindig zárójelpárba kell megadni.
A belső SELECT is tartalmazhat belső SELECT-et, vagyis a SELECT-ek egymásba ágyazhatók.
Először a belső, majd a külső lekérdezés hajtódik végre.
A belső SELECT-ből is hivatkozhatunk a külső SELECT-re, ezeket az egymásba skatulyázott SELECT-eknek nevezzük.
A belső lekérdezés jellege alapján 2 esetet különböztethetünk meg.
Ezek a következők:
A belső lekérdezés egyetlen értékkel tér vissza. Ez a legegyszerűbb eset, ugyanis ilyenkor minden a hagyományos módon történik, azzal a különbséggel, hogy a feltételként megadott kifejezésben a belső lekérdezés által szolgáltatott értéket használja fel a rendszer.
Pl. Listázzuk ki azokat a dolgozókat, akiknek az átlagnál kisebb a fizetése.
DOLGOZO(id, nev, szulev, fizetes)
SELECT nev, fizetes FROM dolgozo WHERE fizetes < (SELECT AVG(fizetes) FROM dolgozo);
A belső lekérdezés egy listával tér vissza. Ekkor olyan feltételeket adhatunk meg, amelyek a belső lekérdezés által szolgáltatott oszlop adatait használja fel.
A belső lekérdezés eredménylistáját kezelhetjük az IN, ANY, ALL illetve EXISTS predikátumokkal.
Pl. Listázzuk ki azokat a tanulókat, akik nem kapnak segélyt.
TANULO(azon, nev, osztaly)
SEGELY(azon, segely)
SELECT nev, osztaly FROM tanulo WHERE azon NOT IN (SELECT azon FROM segely);
Predikátumok:
<oszlopkifejezés> [NOT] IN <belső lekérdezés>
Az <oszlopkifejezés> paraméterben megadott kifejezés értékéről fogja eldönteni, hogy szerepel-e a belső lekérdezés eredményei között. Ha szerepel akkor a feltétel értéke igaz, ha nem szerepel, akkor hamis lesz. A NOT kulcsszó hatására fordítva kell értelmezni a feltételt.
[NOT] <oszlopkifejezés> <reláció> ALL|ANY <belső lekérdezés>
Itt az <oszlopkifejezés> paraméterben megadott kifejezés értékére vonatkozóan azt fogja vizsgálni, hogy a megadott reláció teljesül-e a belső lekérdezés eredményeire. Ha az ALL kulcsszót használjuk, a feltétel akkor lesz igaz, ha a reláció az oszlop minden elemére teljesül, míg az ANY használatakor elegendő egyetlen elemre teljesülnie. A NOT kulcsszó itt is a feltétel ellentettjét jelenti.
[NOT] EXISTS <belső lekérdezés>
Az vizsgálja, hogy a keletkezett reláció üres vagy sem. Ehhez a vizsgálathoz az EXISTS kulcsszót kell használnunk, amit természetesen a NOT módosíthat.
Járatok adatbázis
A jaratok tábla szerkezete
| Név | Null? | Típus |
|---|---|---|
| SZAM | NOT NULL | NUMBER(3) |
| INDULAS | NOT NULL | NUMBER(4) |
| ERKEZES | NOT NULL | NUMBER(4) |
| HONNAN | NOT NULL | CHAR(3) |
| HOVA | NOT NULL | CHAR(3) |
| NAPOK | CHAR(7) |
A jaratok tábla tartalma
| SZAM | INDULAS | ERKEZES | HONNAN | HOVA | NAPOK |
|---|---|---|---|---|---|
| 123 | 1152 | 1436 | 001 | 002 | hksc-sv |
| 111 | 1023 | 1145 | 002 | 001 | hkscp-v |
| 112 | 1535 | 1643 | 001 | 003 | hkscpsv |
| 113 | 2032 | 2115 | 003 | 001 | hks-psv |
| 114 | 1322 | 1423 | 003 | 004 | -ks-p— |
| 115 | 1415 | 1510 | 001 | 003 | hkscpsv |
A palyaudvar tábla szerkezete
| Név | Null? | Típus |
|---|---|---|
| KOD | CHAR(3) | |
| VAROS | CHAR(25) | |
| DIJ | NUMBER(5) |
A pályaudvar tábla tartalma
| KOD | VAROS | DIJ |
|---|---|---|
| 001 | Budapest | 5000 |
| 002 | Prága | 5000 |
| 003 | Varsó | 8000 |
| 004 | Párizs | 10000 |
| 005 | London | 12000 |
A szamlak tábla szerkezete
| Név | Null? | Típus |
|---|---|---|
| RKOD | NOT NULL | CHAR(3) |
| OSSZEG | NOT NULL | NUMBER(5) |
| KELT | DATE | |
| SZLASZAM | CHAR(10) | |
| ROGZITO | NOT NULL | CHAR(30) |
A szamlak tábla tartalma
| RKO | OSSZEG | KELT | ROGZITO | SZLASZAM |
|---|---|---|---|---|
| 001 | 10000 | 1999-10-08 | kovacs | 99/M182 |
| 003 | 30000 | 1999-10-08 | NAGY | 99/R436 |
| 001 | 11328 | 1999-12-28 | Virag | 99/M183 |
| 002 | 2356 | 2000-01-13 | Lakatos A. | 00/M182 |
| 002 | 23560 | 2000-02-09 | Virag | 00/M011 |
| 002 | 48000 | 2000-09-11 | Hegyi | 00/M032 |
| 003 | 42000 | 2001-06-12 | Magyar Bela | 01/R136 |
| 004 | 9364 | 2001-07-30 | Kiss Edit | 01/R658 |
| 004 | 12000 | 2001-08-28 | Tóth Ádám | 01/R200 |