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

);