Vereisten: Basisprincipes van SQL
Geneste query's zijn een manier om complexe query's uit te voeren door de ene query in de andere in te sluiten. De buitenste query kan enkele voorwaarden toepassen op de resultaten van de binnenste query. Laten we gebruiken STUDENT, CURSUS, STUDENT_CURSUS tabellen voor het begrijpen van geneste query's.
STUDENT
| S_ID | S_NAME | S_ADRES | S_PHONE | VERSTANDIG |
| S1 | RAM | DELHI | 9455123451 | 18 |
| S2 | RAMESJ | GURGAON | 9652431543 | 18 |
| S3 | SIJIT | ROHTAK | 9156253131 | twintig |
| S4 | ZEKER | DELHI | 9156768971 | 18 |
CURSUS
| C_ID | C_NAME |
| C1 | DSA |
| C2 | Programmering |
| C3 | DBMS |
STUDENT_CURSUS
| S_ID | C_ID |
| S1 | C1 |
| S1 | C3 |
| S2 | C1 |
| S3 | C2 |
| S4 | C2 |
| S4 | C3 |
Er zijn hoofdzakelijk twee typen geneste query's:
- Onafhankelijke geneste zoekopdrachten: Bij onafhankelijke geneste query's begint de uitvoering van query's vanaf de binnenste query tot de buitenste query's. De uitvoering van de innerlijke query is onafhankelijk van de buitenste query, maar het resultaat van de innerlijke query wordt gebruikt bij de uitvoering van de buitenste query. Verschillende operatoren zoals IN, NOT IN, ANY, ALL enz. worden gebruikt bij het schrijven van onafhankelijke geneste zoekopdrachten.
IN: Als we het willen weten S_ID die zijn ingeschreven C_NAME ‘DSA’ of ‘DBMS’, we kunnen het schrijven met behulp van een onafhankelijke geneste query en IN-operator. Van CURSUS tafel, daar kunnen we achter komen C_ID voor C_NAME ‘DSA’ of DBMS’ en deze kunnen we gebruiken C_ID s voor het vinden S_ID s van STUDENT_CURSUS TAFEL. STAP 1: Vinden C_ID voor C_NAME =’DSA’ of ‘DBMS’ Selecteer C_ID van CURSUS waar C_NAME = ‘DSA’ of C_NAME = ‘DBMS’ STAP 2: Gebruik makend van C_ID van stap 1 voor het vinden S_ID Selecteer S_ID van STUDENT_CURSUS waar C_ID IN (SELECT C_ID van CURSUS waar C_NAME = ‘DSA’ of C_NAME =’DBMS’); De binnenste query retourneert een set met leden C1 en C3 en de buitenste query retourneert deze S_ID s waarvoor C_ID is gelijk aan elk lid van de set (in dit geval C1 en C3). Het retourneert dus S1, S2 en S4. Opmerking: Als we namen willen weten van STUDENT s die zich hebben ingeschreven voor ‘DSA’ of ‘DBMS’, kan dit als volgt worden gedaan: Selecteer S_NAME uit STUDENT waar S_ID IN (Select S_ID van STUDENT_CURSUS waar C_ID IN (SELECT C_ID van CURSUS waar C_NAME =’DSA’ of C_NAME =’DBMS’));
NIET IN: Als we het willen weten S_ID s van STUDENT Voor degenen die zich niet hebben ingeschreven voor ‘DSA’ en ook niet voor ‘DBMS’, kan dit als volgt worden gedaan: Selecteer S_ID van STUDENT waar S_ID NIET IN (Select S_ID van STUDENT_CURSUS waar C_ID IN (SELECT C_ID van CURSUS waar C_NAME =’DSA’ of C_NAME =’DBMS’)); De binnenste query retourneert een set met leden C1 en C3. De tweede innerlijke query retourneert deze S_ID s waarvoor C_ID is gelijk aan elk lid van de set (in dit geval C1 en C3), namelijk S1, S2 en S4. De buitenste query retourneert deze S_ID waar S_ID is geen lid van de set (S1, S2 en S4). Het zal dus S3 retourneren.
- Co-gerelateerde geneste zoekopdrachten: Bij co-gerelateerde geneste query's is de uitvoer van de binnenquery afhankelijk van de rij die momenteel wordt uitgevoerd in de buitenquery. bijvoorbeeld; Als we het willen weten S_NAME van STUDENT s die zijn ingeschreven C_ID ‘C1’, dit kan worden gedaan met behulp van een co-gerelateerde geneste zoekopdracht als: Selecteer S_NAME uit STUDENT S waar BESTAAT (selecteer * uit STUDENT_CURSUS SC waar S. S_ID =SC. S_ID en SC. C_ID =’C1’); Voor elke rij van STUDENT S, het zal de rijen vinden van STUDENT_CURSUS waar S. S_ID = SC. S_ID en SC. C_ID =’C1’. Als voor een S_ID van STUDENT S, er bestaat tenminste een rij in STUDENT_CURSUS SC met C_ID =’C1’, dan zal de innerlijke query waar en corresponderend retourneren S_ID wordt als uitvoer geretourneerd.
VOORBEELD IN SQL-CODE:
SELECTEER Studentnaam
VAN Studenten
WAAR StudentID IN (
SELECTEER StudentID
VAN Cijfers
WAAR Onderwerp = ‘Wiskunde’ EN Score> 90
database met zuureigenschappen);