Cerințe preliminare: Bazele SQL
Interogările imbricate sunt o modalitate de a efectua interogări complexe prin încorporarea unei interogări în alta. Interogarea exterioară poate aplica unele condiții asupra rezultatelor interogării interioare. Să folosim STUDENT, COURSE, STUDENT_COURSE tabele pentru înțelegerea interogărilor imbricate.
STUDENT
| S_ID | S_NAME | S_ADDRESS | S_PHONE | SALVIE |
| S1 | RAM | DELHI | 9455123451 | 18 |
| S2 | RAMESH | GURGAON | 9652431543 | 18 |
| S3 | SUJIT | ROHTAK | 9156253131 | douăzeci |
| S4 | SURESH | DELHI | 9156768971 | 18 |
CURS
| C_ID | C_NAME |
| C1 | DSA |
| C2 | Programare |
| C3 | SGBD |
STUDENT_COURSE
| S_ID | C_ID |
| S1 | C1 |
| S1 | C3 |
| S2 | C1 |
| S3 | C2 |
| S4 | C2 |
| S4 | C3 |
Există în principal două tipuri de interogări imbricate:
- Interogări imbricate independente: În interogările imbricate independente, execuția interogărilor începe de la interogarea cea mai interioară la interogările cele mai exterioare. Execuția interogării interioare este independentă de interogarea exterioară, dar rezultatul interogării interioare este utilizat în execuția interogării externe. Diferiți operatori precum IN, NOT IN, ANY, ALL etc sunt utilizați în scrierea interogărilor imbricate independente.
ÎN: Dacă vrem să aflăm S_ID care sunt înscriși în C_NAME „DSA” sau „DBMS”, îl putem scrie cu ajutorul unei interogări imbricate independente și al operatorului IN. Din CURS masa, putem afla C_ID pentru C_NAME „DSA” sau DBMS” și le putem folosi C_ID s pentru a găsi S_ID s din STUDENT_COURSE MASA. PASUL 1: Găsind C_ID pentru C_NAME =’DSA’ sau ‘DBMS’ Selectați C_ID din CURS Unde C_NAME = „DSA” sau C_NAME = „DBMS” PASUL 2: Folosind C_ID din pasul 1 pentru găsire S_ID Selectați S_ID din STUDENT_COURSE Unde C_ID IN (SELECT C_ID din CURS Unde C_NAME = „DSA” sau C_NAME =’DBMS’); Interogarea interioară va returna un set cu membrii C1 și C3, iar interogarea exterioară le va returna S_ID s pentru care C_ID este egal cu orice membru al mulțimii (C1 și C3 în acest caz). Deci, va returna S1, S2 și S4. Notă: Dacă vrem să aflăm nume ale STUDENT cei care s-au înscris fie în „DSA” fie în „DBMS”, se poate face astfel: Selectați S_NAME din STUDENT Unde S_ID IN (Selectați S_ID din STUDENT_COURSE Unde C_ID IN (SELECT C_ID din CURS Unde C_NAME =’DSA’ sau C_NAME =’DBMS’));
NU ÎN: Dacă vrem să aflăm S_ID s din STUDENT cei care nu s-au înscris nici în „DSA” și nici în „DBMS”, se poate face astfel: Selectați S_ID din STUDENT Unde S_ID NU ÎN (Selectați S_ID din STUDENT_COURSE Unde C_ID IN (SELECT C_ID din CURS Unde C_NAME =’DSA’ sau C_NAME =’DBMS’)); Interogarea cea mai interioară va returna un set cu membrii C1 și C3. A doua interogare interioară le va returna S_ID s pentru care C_ID este egal cu orice membru al mulțimii (C1 și C3 în acest caz) care sunt S1, S2 și S4. Interogarea cea mai exterioară le va returna S_ID e unde S_ID nu este membru al mulțimii (S1, S2 și S4). Deci va returna S3.
- Interogări imbricate corelate: În interogările imbricate corelate, rezultatul interogării interioare depinde de rândul care se execută în prezent în interogarea exterioară. de exemplu.; Dacă vrem să aflăm S_NAME de STUDENT cei care sunt înscriși în C_ID „C1”, se poate face cu ajutorul unei interogări imbricate corelate ca: Selectați S_NAME din STUDENT S unde EXISTĂ (selectați * din STUDENT_COURSE SC unde S. S_ID =SC. S_ID și SC. C_ID =’C1’); Pentru fiecare rând de STUDENT S, va găsi rândurile de la STUDENT_COURSE unde S. S_ID = SC. S_ID și SC. C_ID =’C1’. Dacă pentru a S_ID din STUDENT S, există cel puțin un rând în STUDENT_COURSE SC cu C_ID =’C1’, atunci interogarea interioară va returna adevărată și corespunzătoare S_ID va fi returnat ca ieșire.
EXEMPLU ÎN COD SQL:
SELECTAȚI StudentName
DE LA Studenți
WHERE StudentID IN (
SELECTAȚI ID Student
DIN Clase
WHERE Subiect = „Matematică” ȘI Scor> 90
);