SGBD curs 8

download SGBD curs 8

of 30

Transcript of SGBD curs 8

Subinterogri (Subcereri)O caracteristic foarte puternic a limbajului SQL sunt subinterogrile (numite i selecii), care, aa cum sugereaz i numele, se refer la o instruciune SELECT care conine o instruciune SELECT subordonat. De cele mai multe ori, pentru a implementa anumite interogri, nu este suficient o singur cerere SELECT ci sunt necesare subcereri. Subcererile sunt comenzi SELECT ncapsulate n oricare din clauzele , SELECT, WHERE, HAVING, FROM, numit instruciune printe. Dac subcererea urmeaz clauzei WHERE sau HAVING, ea poate conine unul dintre operatorii ALL, ANY, IN (=ANY), EXIST, NOT IN (!=ALL) care sunt specifici cererilor care ntorc mai multe linii (multiple-row subquery) sau unul dintre operatorii de comparare (=, , >=, ANY mai mare ca minimul; = ANY IN. Pentru operatorul ALL se presupune c este adevrat condiia, dac comparaia este adevrat pentru toate elementele listei returnate. Pentru operatorul ALL sunt evidente relaiile: < ALL mai mic ca minimul; > ALL mai mare ca maximul; ! = ALL NOT IN.

Exemplu: WHERE codec > ALL (C1, C2) este superior tuturor elementelor din list; WHERE codec > ANY (C1, C2) este superior cel puin unui element din list. Exemplu: S se obin salariaii al cror salariu este mai mare ca salariile medii din toate departamentele. SELECT FROM WHERE nume, job angajati sal > ALL(SELECT FROM GROUP BY

AVG(sal) angajati cod_dep);

Exist subcereri care au ca rezultat mai multe coloane (multiple-column subquery). Aceste interogri au urmtoarea sintax general: SELECT FROM WHERE col,col, tabel (col,col,) IN (SELECT col,col, FROM tabel WHERE condiie);

Dac una din valorile returnate de subcerere este valoarea null atunci cererea nu ntoarce nici o linie. Prin urmare, dac valoarea null poate s fac parte din rezultatul subcererii nu trebuie utilizat operatorul NOT IN. Problema nu mai apare dac se utilizeaz operatorul IN.

Exemplu: S se obin salariaii care nu au subordonai. SELECT FROM WHERE a.nume angajati a a.cod_ang NOT IN (SELECT m.mgr FROM angajati m);

n acest caz, instruciunea SQL nu ntoarce nici o linie deoarece una din valorile furnizate de subcerere este valoarea null.

Subinterogri necorelate (nesincronizate) O subinterogare necorelat (noncorrelated subselect) este o subinterogare n care interogarea intern nu face nici o referire la interogarea extern care o conine. Subcererile necorelate returneaz o valoare care este utilizat de cererea extern (cererea principal). Cererile care conin subcereri necorelate sunt evaluate n modul urmtor: cererea intern este executat prima i determin o valoare (sau o mulime de valori); cererea extern se execut o singur dat, utiliznd valorile returnate de cererea intern. n general, o cerere imbricat, necorelat are urmtoarea form: SELECT FROM WHERE lista_select nume_tabel expresie operator (SELECT lista_select FROM nume_tabel);

n aceast sintax, identificatorul operator poate fi de tip: single-row operator (>, =, >=, (SELECT AVG ( INCHIRIAT_TAXA) FROM FILM_INCHIRIAT) TRANZACTIE_ID TRANZ_DATA 9 03/01/2005 10 03/01/2005 Exemplu(din galeria de arta): a) S se afieze titlul, codul artistului i valoarea operelor create de artistul cruia i aparine opera avnd codul 180 i care se afl expuse n aceeai galerie cu operele al cror cod este 100 sau 110. Se presupune c o oper are un singur autor. SELECT titlu, cod_artist, valoare FROM opera WHERE cod_artist = (SELECT cod_artist

AND

FROM opera WHERE cod_opera = 180) cod_galerie IN (SELECT cod_galerie FROM opera WHERE cod_opera IN (100, 110));

b) S se determine artistul pentru care valoare medie a operelor sale de art este minim. SELECT cod_artist, AVG(valoare) FROM opera GROUP BY cod_artist HAVING AVG(valoare) = (SELECT MIN(AVG(valoare)) FROM opera GROUP BY cod_artist); c) Pentru fiecare artist, s se afieze titlul i valoarea celei mai ieftine opere de art expuse n muzeu. SELECT titlu, cod_artist, valoare FROM opera WHERE valoare IN (SELECT MIN(valoare) FROM opera GROUP BY cod_artist); d) S se afieze operele de art care nu sunt expuse n galeria avnd codul 30 i a cror valoare este mai mic dect a unei opere din galeria 30. SELECT cod_opera, titlu, valoare FROM opera WHERE valoare < ANY (SELECT valoare FROM opera WHERE cod_galerie = 30) AND cod_galerie 30; Dac operatorul ANY se nlocuiete cu operatorul ALL, cererea precedent returneaz operele care nu sunt expuse n galeria 30 i a cror valoare este mai mic dect a oricrei opere din galeria respectiv. e) S se afieze cele mai scumpe 3 opere de art din muzeu. SELECT ROWNUM "Nr.Crt", titlu, valoare FROM (SELECT titlu, valoare FROM opera ORDER BY valoare DESC)

WHERE ROWNUM