Förutsättningar: Grunderna i SQL
Kapslade frågor är ett sätt att utföra komplexa frågor genom att bädda in en fråga i en annan. Den yttre frågan kan tillämpa vissa villkor på resultaten av den inre frågan. Låt oss använda STUDENT, KURS, STUDENT_KURS tabeller för att förstå kapslade frågor.
STUDERANDE
| S_ID | S_NAME | S_ADRESS | S_PHONE | SALVIA |
| S1 | Bagge | DELHI | 9455123451 | 18 |
| S2 | RAMESH | GURGAON | 9652431543 | 18 |
| S3 | SUJIT | ROHTAK | 9156253131 | tjugo |
| S4 | VISST | DELHI | 9156768971 | 18 |
KURS
| C_ID | C_NAME |
| C1 | DSA |
| C2 | Programmering |
| C3 | DBMS |
STUDENT_KURS
| S_ID | C_ID |
| S1 | C1 |
| S1 | C3 |
| S2 | C1 |
| S3 | C2 |
| S4 | C2 |
| S4 | C3 |
Det finns huvudsakligen två typer av kapslade frågor:
- Oberoende kapslade frågor: I oberoende kapslade frågor startar frågekörning från den innersta frågan till den yttersta frågan. Exekveringen av den inre frågan är oberoende av den yttre frågan, men resultatet av den inre frågan används vid exekveringen av den yttre frågan. Olika operatorer som IN, NOT IN, ANY, ALL etc används för att skriva oberoende kapslade frågor.
I: Om vi vill ta reda på det S_ID som är inskrivna C_NAME 'DSA' eller 'DBMS', vi kan skriva det med hjälp av oberoende kapslade fråga och IN-operator. Från KURS tabell kan vi ta reda på C_ID för C_NAME 'DSA' eller DBMS' och vi kan använda dessa C_ID s för att hitta S_ID s från STUDENT_KURS TABELL. STEG 1: Fynd C_ID för C_NAME ='DSA' eller 'DBMS' Välj C_ID från KURS var C_NAME = 'DSA' eller C_NAME = 'DBMS' STEG 2: Använder sig av C_ID av steg 1 för att hitta S_ID Välj S_ID från STUDENT_KURS var C_ID IN (VÄLJ C_ID från KURS var C_NAME = 'DSA' eller C_NAME ='DBMS'); Den inre frågan kommer att returnera en uppsättning med medlemmarna C1 och C3 och den yttre frågan kommer att returnera dessa S_ID s för vilket C_ID är lika med vilken medlem som helst i mängden (C1 och C3 i detta fall). Så det kommer att returnera S1, S2 och S4. Notera: Om vi vill ta reda på namn på STUDERANDE för de som antingen har registrerat sig i 'DSA' eller 'DBMS' kan det göras som: Välj S_NAME från STUDERANDE var S_ID IN (Välj S_ID från STUDENT_KURS var C_ID IN (VÄLJ C_ID från KURS var C_NAME ='DSA' eller C_NAME ='DBMS'));
INTE I: Om vi vill ta reda på det S_ID Så f STUDERANDE för de som varken har registrerat sig i 'DSA' eller i 'DBMS', kan det göras som: Välj S_ID från STUDERANDE var S_ID INTE I (Välj S_ID från STUDENT_KURS var C_ID IN (VÄLJ C_ID från KURS var C_NAME ='DSA' eller C_NAME ='DBMS')); Den innersta frågan kommer att returnera en uppsättning med medlemmarna C1 och C3. Den andra inre frågan kommer att returnera dessa S_ID s för vilket C_ID är lika med vilken medlem av mängd som helst (Cl och C3 i detta fall) som är S1, S2 och S4. Den yttersta frågan kommer att returnera dessa S_ID s var S_ID är inte medlem i uppsättningen (S1, S2 och S4). Så det kommer att returnera S3.
- Samrelaterade kapslade frågor: I samrelaterade kapslade frågor beror utdata från den inre frågan på raden som för närvarande körs i den yttre frågan. t.ex.; Om vi vill ta reda på det S_NAME av STUDERANDE s som är inskrivna C_ID 'C1', det kan göras med hjälp av samrelaterad kapslad fråga som: Välj S_NAME från STUDERANDE S där FINNS ( välj * från STUDENT_KURS SC där S. S_ID =SC. S_ID och SC. C_ID ='C1'); För varje rad av STUDERANDE S, det kommer att hitta raderna från STUDENT_KURS vart är. S_ID = SC. S_ID och SC. C_ID ='C1'. Om för en S_ID från STUDERANDE S, åtminstone en rad finns i STUDENT_KURS SC med C_ID ='C1', då returnerar den inre frågan true och motsvarande S_ID kommer att returneras som utdata.
EXEMPEL I SQL-KOD:
VÄLJ Studentnamn
FRÅN studenter
VAR StudentID I (
VÄLJ StudentID
FRÅN betyg
WHERE Ämne = 'Matematik' OCH Poäng> 90
java jämförbar);