logo

Ugnezdene poizvedbe v SQL

Predpogoji: Osnove SQL

java baza podatkov jdbc

Ugnezdene poizvedbe so način za izvajanje kompleksnih poizvedb z vdelavo ene poizvedbe v drugo. Zunanja poizvedba lahko uporabi nekatere pogoje za rezultate notranje poizvedbe. Naj uporabimo ŠTUDENT, TEČAJ, ŠTUDENT_TEČAJ tabele za razumevanje ugnezdenih poizvedb.



ŠTUDENT

S_ID S_NAME S_NASLOV S_PHONE ŽAJBELJ
S1 Oven DELHI 9455123451 18
S2 RAMESH GURGAON 9652431543 18
S3 SUJIT ROHTAK 9156253131 dvajset
S4 SUREŠ DELHI 9156768971 18

TEČAJ

C_ID C_NAME
C1 DSA
C2 Programiranje
C3 DBMS

ŠTUDENT_TEČAJ



system.out.println
S_ID C_ID
S1 C1
S1 C3
S2 C1
S3 C2
S4 C2
S4 C3

Obstajata predvsem dve vrsti ugnezdenih poizvedb:

  • Neodvisne ugnezdene poizvedbe: Pri neodvisnih ugnezdenih poizvedbah se izvajanje poizvedbe začne od najbolj notranje poizvedbe do najbolj oddaljenih poizvedb. Izvedba notranje poizvedbe je neodvisna od zunanje poizvedbe, vendar se rezultat notranje poizvedbe uporabi pri izvedbi zunanje poizvedbe. Pri pisanju neodvisnih ugnezdenih poizvedb se uporabljajo različni operatorji, kot so IN, NOT IN, ANY, ALL itd.
    IN: Če hočemo izvedeti S_ID ki so vpisani v C_NAME 'DSA' ali 'DBMS', lahko zapišemo s pomočjo neodvisne ugnezdene poizvedbe in IN operatorja. Od TEČAJ tabelo, lahko ugotovimo C_ID za C_NAME 'DSA' ali DBMS' in jih lahko uporabimo C_ID s za iskanje S_ID s iz ŠTUDENT_TEČAJ TABELA. KORAK 1: Najdba C_ID za C_NAME ='DSA' ali 'DBMS' Izberite C_ID od TEČAJ kje C_NAME = ‘DSA’ oz C_NAME = 'DBMS' 2. KORAK: Uporaba C_ID 1. koraka za iskanje S_ID Izberite S_ID od ŠTUDENT_TEČAJ kje C_ID V (IZBERI C_ID od TEČAJ kje C_NAME = ‘DSA’ oz C_NAME ='DBMS'); Notranja poizvedba bo vrnila niz s članoma C1 in C3, zunanja poizvedba pa ju bo vrnila S_ID s za katere C_ID je enak kateremu koli členu množice (v tem primeru C1 in C3). Torej bo vrnil S1, S2 in S4. Opomba: Če želimo izvedeti imena ŠTUDENT ki so se vpisali v 'DSA' ali 'DBMS', lahko to storite tako: Izberite S_NAME iz ŠTUDENT kje S_ID IN (Izberite S_ID od ŠTUDENT_TEČAJ kje C_ID V (IZBERI C_ID od TEČAJ kje C_NAME ='DSA' oz C_NAME ='DBMS'));
    NI NOTRI: Če hočemo izvedeti S_ID s od ŠTUDENT ki se niso vpisali niti v 'DSA' niti v 'DBMS', lahko to storite kot: Izberite S_ID od ŠTUDENT kje S_ID NI V (Izberite S_ID od ŠTUDENT_TEČAJ kje C_ID V (IZBERI C_ID od TEČAJ kje C_NAME ='DSA' oz C_NAME ='DBMS')); Najbolj notranja poizvedba bo vrnila niz s članoma C1 in C3. Druga notranja poizvedba jih bo vrnila S_ID s za katere C_ID je enak kateremu koli členu množice (v tem primeru C1 in C3), ki so S1, S2 in S4. Najbolj oddaljena poizvedba jih bo vrnila S_ID kje je S_ID ni član množice (S1, S2 in S4). Torej bo vrnil S3.
  • Sorodne ugnezdene poizvedbe: Pri sorodnih ugnezdenih poizvedbah je rezultat notranje poizvedbe odvisen od vrstice, ki se trenutno izvaja v zunanji poizvedbi. npr.; Če hočemo izvedeti S_NAME od ŠTUDENT ki so vpisani v C_ID 'C1', to lahko storite s pomočjo sorodne ugnezdene poizvedbe kot: Izberite S_NAME iz ŠTUDENT S kjer OBSTAJA ( izberite * iz ŠTUDENT_TEČAJ SC, kjer je S. S_ID =SC. S_ID in SC. C_ID ='C1'); Za vsako vrstico ŠTUDENT S, bo našel vrstice iz ŠTUDENT_TEČAJ kjer je S. S_ID = SC. S_ID in SC. C_ID ='C1'. Če za a S_ID od ŠTUDENT S, obstaja vsaj vrsta ŠTUDENT_TEČAJ SC z C_ID ='C1', potem bo notranja poizvedba vrnila true in ustrezno S_ID bo vrnjen kot rezultat.

PRIMER V KODI SQL:

IZBERITE ime študenta



OD študentov

WHERE StudentID IN (

IZBERITE ID študenta

bfs proti dfs

OD Ocene

WHERE Predmet = 'Matematika' IN rezultat> 90

);