Vnorené dotazy v SQL
Predpoklady: Základy SQL
Vnorené dotazy predstavujú spôsob vykonávania zložitých dotazov vložením jedného dotazu do druhého. Vonkajší dotaz môže aplikovať niektoré podmienky na výsledky vnútorného dotazu. Využime STUDENT, COURSE, STUDENT_COURSE tabuľky na pochopenie vnorených dopytov.
ŠTUDENT
| S_ID | S_NAME | S_ADDRESS | S_PHONE | S_AGE |
| S1 | RAM | DILLÍ | 9455123451 | 18 |
| S2 | RAMESH | GURGAON | 9652431543 | 18 |
| S3 | SUJIT | ROHTAK | 9156253131 | dvadsať |
| S4 | SURESH | DILLÍ | 9156768971 | 18 |
KURZ
| C_ID | C_NAME |
| C1 | DSA |
| C2 | Programovanie |
| C3 | DBMS |
STUDENT_COURSE
| S_ID | C_ID |
| S1 | C1 |
| S1 | C3 |
| S2 | C1 |
| S3 | C2 |
| S4 | C2 |
| S4 | C3 |
Existujú hlavne dva typy vnorených dopytov:
- Nezávislé vnorené dopyty: V nezávislých vnorených dotazoch sa vykonávanie dotazu začína od najvnútornejšieho dotazu po najvzdialenejšie dotazy. Vykonanie vnútorného dotazu je nezávislé od vonkajšieho dotazu, ale výsledok vnútorného dotazu sa použije pri vykonaní vonkajšieho dotazu. Pri písaní nezávislých vnorených dopytov sa používajú rôzne operátory ako IN, NOT IN, ANY, ALL atď.
IN: Ak to chceme zistiť S_ID ktorí sú zapísaní v C_NAME „DSA“ alebo „DBMS“, môžeme ho napísať pomocou nezávislého vnoreného dotazu a operátora IN. Od KURZ tabuľky, môžeme zistiť C_ID pre C_NAME „DSA“ alebo DBMS“ a môžeme ich použiť C_ID s na nájdenie S_ID s od STUDENT_COURSE TABLE. KROK 1: Hľadanie C_ID pre C_NAME = „DSA“ alebo „DBMS“ Vyberte C_ID od KURZ kde C_NAME = „DSA“ alebo C_NAME = 'DBMS' KROK 2: Použitím C_ID kroku 1 na nájdenie S_ID Vyberte S_ID od STUDENT_COURSE kde C_ID IN (VYBERTE C_ID od KURZ kde C_NAME = „DSA“ alebo C_NAME = „DBMS“); Vnútorný dotaz vráti množinu s členmi C1 a C3 a vonkajší dotaz ich vráti S_ID s pre ktoré C_ID sa rovná ktorémukoľvek členovi množiny (v tomto prípade C1 a C3). Takže vráti S1, S2 a S4. Poznámka: Ak chceme zistiť mená ŠTUDENT s, ktorí sa zaregistrovali do „DSA“ alebo „DBMS“, môžete to urobiť takto: Vyberte S_NAME z ŠTUDENT kde S_ID IN (Vyberte S_ID od STUDENT_COURSE kde C_ID IN (VYBERTE C_ID od KURZ kde C_NAME = „DSA“ alebo C_NAME = „DBMS“));
NIE V: Ak to chceme zistiť S_ID z ŠTUDENT s, ktorí nie sú zaregistrovaní ani v „DSA“ ani v „DBMS“, môžete to urobiť takto: Vyberte S_ID od ŠTUDENT kde S_ID NOT IN (Vyberte S_ID od STUDENT_COURSE kde C_ID IN (VYBERTE C_ID od KURZ kde C_NAME = „DSA“ alebo C_NAME = „DBMS“)); Najvnútornejší dotaz vráti množinu s členmi C1 a C3. Druhý vnútorný dotaz ich vráti S_ID s pre ktoré C_ID sa rovná ktorémukoľvek členovi množiny (v tomto prípade C1 a C3), ktorým sú S1, S2 a S4. Najvzdialenejší dotaz ich vráti S_ID s kde S_ID nie je členom množiny (S1, S2 a S4). Takže vráti S3.
- Súvisiace vnorené dopyty: V súvisiacich vnorených dotazoch závisí výstup vnútorného dotazu od riadku, ktorý sa práve vykonáva vo vonkajšom dotaze. napr. Ak to chceme zistiť S_NAME z ŠTUDENT s, ktorí sú zapísaní v C_ID „C1“, možno to urobiť pomocou súvisiaceho vnoreného dopytu ako: Vyberte S_NAME z ŠTUDENT S kde EXISTS (vyberte * z STUDENT_COURSE SC, kde S. S_ID =SC. S_ID a SC. C_ID = „C1“); Pre každý riadok ŠTUDENT S, nájde riadky z STUDENT_COURSE kde je. S_ID = SC. S_ID a SC. C_ID = „C1“. Ak pre a S_ID od ŠTUDENT S, existuje aspoň jeden riadok STUDENT_COURSE SC s C_ID = „C1“, potom vnútorný dopyt vráti hodnotu true a zodpovedajúcu S_ID sa vráti ako výstup.
PRÍKLAD V KÓDE SQL:
VYBERTE Meno študenta
OD študentov
WHERE StudentID IN (
VYBERTE ID študenta
OD ročníkov
WHERE Predmet = ‚Matematika‘ A Skóre> 90
);