Sunteți pe pagina 1din 39

5.

2 Interogri n SQL
Cererile de interogare exprimate n SQL prezint un aspect declarativ deoarece sunt specificate proprietile rezultatului i nu modul de obinere (SQL urmrete principiile calculului relaional). Cererile SQL sunt pasate pentru execuie optimizatorului de cereri. Optimizatorul de cereri este o component a sistemului de gestiune a bazelor de date care analizeaz cererea; selecteaz o strategie de execuie; formuleaz o cerere echivalent n limbajul procedural intern al sistemului de gestiune a bazelor de date.

5.2.1 Interogri simple


Interogarea unei baze de date poate fi exprimat n SQL prin intermediul instruciunii select, care are sintaxa:

Select ExprAtribut [[as] Alias ] {, ExprAtribut [[as] Alias]} from NumeTabel [[as] Alias ] {, NumeTabel [[as] Alias]} [where Conditie]
O cerere SQL va lua n considerare doar liniile ce aparin produsului cartezian al tabelelor listate n clauza from i va stabili liniile ce satisfac condiia exprimat n clauza where. Rezultatul execuiei unei cereri SQL este un tabel, avnd cte o linie pentru fiecare linie selectat de clauza where i ale crui coloane rezult din evaluarea expresiilor ExprAtribut ce apar n clauza select (lista int). Fiecare coloan poate fi redenumit cu ajutorul unui Alias ce urmeaz imediat dup expresie. Tabelele pot fi de asemenea redenumite prin intermediul unui Alias.

Exemplu
Se consider o baz de date care conine tabelele ANGAJATI (Nume, Prenume, Dept, Birou, Salariu), DEPARTAMENT (Dept, Adresa, Oras), cu precizarea ca salariul nregistrat este anual. ANGAJATI Nume Prenume Ionescu Maria Popescu Ion Popa Stefan Dumitrescu Vasile Ionescu Ion Manole Radu Luca Doru Vasile Alina Dept Birou Salariu Administratie 10 45 Productie 20 36 Administratie 20 40 Distributie 16 45 Planificare 14 80 Planificare 7 73 Administratie 75 40 Productie 20 46 DEPARTAMENT Dept Adresa Administratie Independentei Productie Primaverii Distributie Central Planificare Nicolina Cercetare Trandafirului Oras Iasi Bucuresti Focsani Iasi Cluj

Fig. 5.1 Coninutul tabelelor ANGAJATI i DEPARTAMENT

Interogarea 1: S se gseasc salariile angajailor cu numele Ionescu.

select Salariu as SalariuAnual from Angajati where Nume = Ionescu

Salariu 45 80
Fig. 5.2. Rezultatul interogrii 1

Lista int - specific elementele schemei tabelelor rezultat. Caracterul special * poate s apar n lista int i reprezint selecia tuturor atributelor tabelelor precizate n clauza from. Exemplu Interogarea 2: S se gseasc toate informaiile referitoare la angajatul cu numele Ionescu.

select * from Angajati where Nume = Ionescu


Nume Prenume Dept Birou Salariu Ionescu Maria Administratie 10 45 Ionescu Ion Planificare 14 80
Fig. 5.3 Rezultatul interogrii 2

Lista int poate conine expresii ce utilizeaz valorile atributelor din fiecare linie selectat. Exemplu Interogarea 3: Gsii salariul lunar al angajailor cu numele Popescu.

select Salariu/12 as SalariuLunar from Angajati where Nume = Popescu


SalariuLunar 3.00
Fig. 5.4 Rezultatul interogrii 3

Clauza from
Dac o interogare implic nregistrri din mai multe tabele, argumentul din clauza from va reprezenta o list de tabele. Condiiile din clauza where sunt aplicate n acest caz produsului cartezian al acestor tabele; se poate specifica o jonciune prin indicarea explicit a comparaiilor ntre atribute din tabele diferite. Interogarea 4: S se gseasc numele angajailor i oraele n care acetia lucreaz.

select Angajati.Nume, Angajati.Prenume, Departament.Oras from Angajati, Departament where Angajati.Dept = Departament.Dept
Nume Ionescu Popescu Popa Dumitrescu Ionescu Manole Luca Vasile Prenume Maria Ion Stefan Vasile Ion Radu Doru Alina Oras Iasi Bucuresti Iasi Focsani Iasi Iasi Iasi Bucuresti

Fig. 5.5 Rezultatul interogrii 4

n interogarea precedent s-a folosit operatorul punct (.) pentru identificarea tabelului din care se extrag atributele. Folosirea acestei construcii este necesar n cazul n care tabelele din clauza from au atribute cu acelai nume, pentru a distinge ntre referinele la atribute omonime. n cazul n care nu exist posibilitatea apariiei unei ambiguiti se poate specifica atributul fr a preciza tabelul cruia i aparine. ntr-o interogare se pot utiliza alias-uri pentru tabele cu scopul de a scurta referina la acestea. Exemplu Interogarea S se gseasc numele angajailor i oraele n care acetia lucreaz se poate exprima astfel:

select a.Nume, a.Prenume, d.Oras from Angajati a, Departament d where a.Dept = d.Dept

Clauza where
Condiia din clauza where este o expresie boolean format prin combinarea predicatelor simple cu operatorii and, or i not. Fiecare predicat simplu utilizeaz operatorii de comparaie (=, >, >=, <, <=, <>) i are, ntr-un membru, o expresie format din valori ale atributelor dintr-o linie i n cellalt membru o valoarea constant sau o alt expresie. Prioritar este operatorul not, dar nu se introduce o preceden ntre and i or. Dac ntr-o expresie se folosesc ambii operatori and i or este indicat specificarea precedenei prin utilizarea parantezelor. Exemplu Interogarea 5: S se gseasc prenumele angajailor cu numele Ionescu care lucreaz n departamentele Administratie sau Productie.

select Prenume from Angajati where Nume = Ionescu and (Dept = Administratie or Dept = Productie)
Prenume Maria
Fig. 5.6 Rezultatul interogrii 5

Operatorul like - pentru compararea irurilor de caractere


Acest operator compar un ir cu alt ir, specificat parial cu ajutorul caracterelor speciale _ i %. Caracterul _ substituie un caracter oarecare Caracterul % substituie un ir oarecare de caractere, posibil vid. Exemplu Comparaia like ab%ba_ va fi satisfcut de toate irurile de caractere ce ncep cu secvena ab i au n componen perechea ba nainte de ultimul caracter.

Gestiunea valorilor NULL


Predicatul is NULL care este adevrat doar dac atributul are valoarea NULL. Predicatul is not NULL este adevrat n caz contrar celui prezentat anterior. Sintaxa: Atribut is [not] NULL

Duplicate
n SQL un tabel poate avea mai multe linii ce conin aceleai valori pentru toate atributele (duplicate), spre deosebire de algebra relaional i calculul relaional. Dac se dorete emularea comportrii din algebra relaional n SQL ar trebui eliminate toate duplicatele la fiecare execuie a unei operaii de proiecie. Deoarece operaia de eliminare a duplicatelor este consumatoare de timp i adesea nu este necesar, executarea acestei operaii este lsat la latitudinea persoanei ce implementeaz interogarea. Sintaxa eliminarea duplicatelor: select [<distinct | [all]>] Opiunea all indic faptul c vor fi pstrate toate nregistrrile din rezultat (deci inclusiv duplicatele) i este opiunea implicit.

Exemplu Se consider tabelul PERSOANA (Cod, Nume, Prenume, Oras)


PERSOANA Cod Nume IS001122 Ionescu BC012345 Popescu IS123456 Ionescu SV342345 Ionescu Prenume Maria Ion Vasile Radu Oras Iasi Bucuresti Iasi Suceava

Fig. 5.7 Coninutul tabelei PERSOANA

Interogarea 6: S se gseasc oraele n care locuiesc persoanele cu numele Ionescu.

select Oras from Persoana where Nume = Ionescu

Oras Iasi Iasi Suceava

Interogarea 7: S se gseasc oraele n care locuiesc persoanele cu numele Ionescu, fiecare ora aprnd o singur dat.

select distinct Oras from Persoana where Nume = Ionescu

Oras Iasi Suceava

Jonciuni
SQL-2 introduce o sintax alternativ pentru specificarea jonciunilor, fiind astfel posibil realizarea unei distincii ntre condiiile ce reprezint condiii de jonciune i cele ce reprezint selecii de linii. Sintaxa este:

select ExprAtribut [[as] Alias] {, ExprAtribut [[as] Alias]} from NumeTabel [[as] Alias] {[TipJonctiune] join NumeTabel [[as] Alias] on CondJonctiune} [where AlteConditii]
n acest fel, condiia de jonciune este mutat din clauza where n clauza from. Parametrul TipJonctiune specific tipul jonciunii: inner, left sau full. Inner join corespunde theta-jonciunii din algebra relaional. Exemplu Interogarea S se gseasc numele angajailor i oraele n care acetia lucreaz se poate rescrie sub forma

select Nume, Prenume, Oras from Angajati a inner join Departament d on a.Dept = d.Dept

n cazul unei jonciuni, liniile dintr-un tabel ce nu au linii corespondente n cellalt tabel vor fi eliminate din rezultat. Pentru a fora apariia unor astfel de linii n rezultat se poate apela la jonciunea extern, cu cele trei variante: left join furnizeaz acelai rezultat ca i inner join, dar include i liniile tabelului ce apare n stnga jonciunii pentru care nu exist linii corespondente n tabelul din dreapta; right join pstreaz liniile tabelului din dreapta ce nu au corespondent n tabelul din stnga; full join furnizeaz acelai rezultat ca i inner join, suplimentat cu liniile excluse din ambele tabele.

Exemplu Se consider o baz de date care conine tabelele prezentate n figur


SOFERI Nume Ionescu Popescu Popa Prenume Maria Ion Stefan ID VR 001Y PZ 111B AP 222C AUTOVEHICULE NrInreg Marca Model IS01AAA BMW 323 SV02BBB BMW Z3 IS02CCC Lancia Delta IS01EFD BMW 316 ID VR 001Y VR 001Y PZ 111B MI 222C

Fig. 5.9 Coninutul tabelelor SOFERI i AUTOVEHICULE

Interogarea 8: S se gseasc oferii ce dein autovehicule, incluznd i oferii fr autovehicule.

select Nume, Prenume, Soferi.ID, NrInreg, Marca, Model from Soferi left join Autovehicule on (Soferi.ID = Autovehicule.ID)
Nume Ionescu Ionescu Popescu Popa Prenume Maria Maria Ion Stefan ID VR 001Y VR 001Y PZ 111B AP 222C NrInreg IS01AAA SV02BBB IS02CCC NULL Marca BMW BMW Lancia NULL Model 323 Z3 Delta NULL

Interogarea 9: S se gseasc toi oferii i toate mainile mpreun cu posibilele relaii ntre ele.

select Nume, Prenume, Soferi.ID, NrInreg, Marca, Model from Soferi full join Autovehicule on (Soferi.ID = Autovehicule.ID)
Nume Ionescu Ionescu Popescu Popa NULL Prenume Maria Maria Ion Stefan NULL ID VR 001Y VR 001Y PZ 111B AP 222C NULL NrInreg IS01AAA SV02BBB IS02CCC NULL IS01EFD Marca BMW BMW Lancia NULL BMW Model 323 Z3 Delta NULL 316

Unele implementri de SQL specific jonciunea extern prin adugarea unui caracter special sau a unei secvene de caractere (* sau (+)) la atributele implicate n condiia de jonciune. Exemplu Interogarea S se gseasc oferii ce dein autovehicule, incluznd i oferii fr autovehicule se poate exprima sub forma

select Nume, Prenume, Soferi.ID, NrInreg, Marca, Model from Soferi , Autovehicule where Soferi.ID * = Autovehicule.ID
SQL-2 ofer posibilitatea realizrii jonciunii naturale (jonciune pe baza atributelor cu acelai nume) a dou tabele prin utilizarea cuvntului cheie natural n faa tipului jonciunii. Exemplu Interogarea S se gseasc toi oferii i toate mainile mpreun cu posibilele relaii ntre ele se poate exprima sub forma

select Nume, Prenume, Soferi.ID, NrInreg, Marca, Model from Soferi natural full join Autovehicule

Observaii

n mod normal, jonciunea natural nu este disponibil n sistemele comerciale. Motivele acestei excluderi sunt : - comportarea unei interogri se poate modifica n mod semnificativ ca rezultat al unei mici modificri a schemei; - jonciunea natural impune analizarea complet a schemelor tabelelor implicate, cu scopul de a nelege condiia de jonciune.

Utilizarea variabilelor
Prin folosirea alias-urilor se poate referi un tabel de mai multe ori, ntr-un mod similar operatorului de redenumire din algebra relaional. Cnd este introdus un alias, se declar o variabil tip tabel care are ca valoare coninutul tabelului pentru care se introduce alias-ul. Cnd un tabel apare doar o singur dat n interogare, nu este nici o diferen ntre a interpreta alias-ul ca pseudonim sau ca o nou variabil. Cnd tabelul apare de mai multe ori este esenial s privim alias-ul ca o nou variabil. Exemplu Interogarea 10: Se consider baza de date din figura 5.1. S se gseasc toi angajaii ce au acelai nume (dar prenume diferite) cu un angajat care lucreaz n departamentul Producie.

select a1.Nume, a1.Prenume from Angajati a1, Angajati a2 where a1.Nume = a2.Nume and a1.Prenume <> a2.Prenume and a2.Dept = Productie

Utilizarea alias-urilor de tabel are importan din urmtoarele puncte de vedere: se evit necesitatea scrierii ntregului nume al tabelului ori de cte ori este cerut acest lucru; se poate face referire de mai multe ori la acelai tabel; introducerea unui alias are semnificaia declarrii unei variabile de tip tabel, ce are acelai coninut cu tabelul al crui alias este; se pot specifica cererile imbricate.

Ordonarea
n general, rezultatul unei interogri conine linii, aranjate ntr-o ordine oarecare. Dac se dorete impunerea unei ordonri dup un anumit criteriu asupra liniilor returnate de o interogare se va utiliza clauza order by. Sintaxa este:

order by Atribut [asc | desc] {, Atribut [asc | desc]}


Exemplu Interogarea 11: Extragei coninutul tabelului AUTOVEHICULE n ordine descendent dup Marc i Model.

select * from Autovehicule order by Marca desc, Model desc


NrInreg IS02CCC SV02BBB IS01AAA IS01EFD Marca Lancia BMW BMW BMW Model Delta Z3 323 316 ID PZ 111B VR 001Y VR 001Y MI 222C

5.2.2 Interogri agregate


Operatorii agregai constituie una din cele mai importante extensii ale SQL n comparaie cu algebra relaional. n algebra relaional toate condiiile sunt evaluate pentru un singur tuplu la un moment dat. Adesea apare necesitatea evalurii unor proprieti ce depind de o mulime de tupluri (de exemplu aflarea numrului de angajai ce lucreaz n departamentul Producie). Operatorii agregai sunt: count Sintax: count ( < * | [distinct | all] ListaAtribute>) Opiunea * returneaz numrul de linii din rezultat. Opiunea distinct returneaz numrul valorilor distincte pentru lista de atribute din rezultat. Opiunea all returneaz numrul liniilor ce conin valori diferite de NULL pentru lista de atribute. Dac se specific un atribut fr un distinct sau all se consider opiunea implicit all.

Exemplu Se consider baza de date cu relaiile ANGAJATI (Nume, Prenume, Dept, Birou, Salariu), DEPARTAMENT (Dept, Adresa, Oras). Interogarea 12: S se gseasc numrul angajailor din departamentul Productie.

select count (*) from Angajati where Dept = Productie


Interogarea 13: S se gseasc numrul valorilor distincte pentru atributul Salariu pentru toi angajaii din tabela ANGAJAI.

select count (distinct Salariu) from Angajati


Interogarea 14: S se gseasc numrul de linii din tabelul ANGAJATI care au valori diferite de NULL pentru atributul Salariu.

select count (all Salariu) from Angajati

sum, max, min, avg Sintax: <sum | max | min | avg> ([distinct | all] ExprAtribut) Aceti operatori se aplic liniilor selectate de clauza where a interogrii i au urmtoarele semnificaii: - sum returneaz suma valorilor deinute de expresia atribut; - max i min returneaz valoarea maxim, respectiv minim; - avg returneaz media valorilor expresiei atribut. Expresia atribut ExprAtribut poate fi un atribut sau o expresie. Operatorii sum i avg accept ca argument expresii ce reprezint valori numerice sau intervale de timp. Funciile min si max necesit definirea unei ordini n expresia atribut, fiind aplicabile i asupra irurilor de caractere i momentelor de timp. Cuvintele cheie distinct i all au semnificaiile discutate deja la operatorul count.

Exemplu Se consider baza de date cu relaiile ANGAJATI (Nume, Prenume, Dept, Birou, Salariu), DEPARTAMENT (Dept, Adresa, Oras). Interogarea 15: S se gseasc salariul maxim, mediu i minim pentru toi angajaii din tabela ANGAJAI.

select max(Salariu), avg(Salariu), min(Salariu) from Angajati


Interogarea 16: S se gseasc salariul maxim pentru angajaii care lucreaz ntr-un departament din Iasi.

select max(Salariu) from Angajati a, Departament d where a.Dept = d.Dept and Oras = Iasi

5.2.3 Interogri group by


Funciile agregat prezentate opereaz pe toate liniile returnate de interogare. n cazul n care se dorete utilizarea funciilor agregat pe o submulime a liniilor selectate SQL pune la dispoziie clauza group by. Aceast clauz specific modul n care va fi mprit tabelul n submulime de linii. Clauza accept ca argument o mulime X de atribute, iar interogarea va opera separat pe fiecare mulime de linii ce posed aceleai valori pentru X. Pentru a nelege mai bine semnificaia clauzei group by s analizm urmtorul exemplu: Exemplu Se consider tabela ANGAJATI (Nume, Prenume, Dept, Birou, Salariu) Interogarea 17: S se gseasc suma salariilor angajailor din acelai departament.

select Dept, sum(Salariu) from Angajati group by Dept

ntr-o prim faz interogarea este executat fr a ine cont de clauza group by. De fapt se execut interogarea

select Dept, Salariu from Angajati


Dept Salariu Administratie 45 Productie 36 Administratie 40 Distributie 45 Planificare 80 Planificare 73 Administratie 40 Productie 46
Fig. 5.13 Proiecia pe atributele Dept i Salariu a tabelei ANGAJAI

Tabelul rezultat este apoi mprit n mulimi ce au aceeai valoare pentru atributele listate n clauza group by.
Dept Salariu Administratie 45 Administratie 40 Administratie 40 Productie 36 Productie 46 Distributie 45 Planificare 80 Planificare 73
Fig. 5.14 Regrupare n acord cu valorile atributului Dept

Odat stabilite grupurile de linii, funcia agregat se aplic fiecrui grup n parte. Rezultatul final al interogrii este tabelul din figura 5.15.
Dept Salariu Administratie 125 Productie 82 Distributie 45 Planificare 153
Fig. 5.15 Rezultatul final al interogrii

Restricie - atributele ce pot aprea n clauza select s fie o submulime a atributelor din clauza group by. Motivul acestei restricii va fi prezentat prin urmtorul exemplu. Exemplu Se consider tabelul ANGAJATI (Nume, Prenume, Dept, Birou, Salariu). Fie interogarea

select Birou from Angajati group by Dept


Aceast interogare este incorect, deoarece pentru aceeai valoare a atributului Dept, atributul Birou deine mai multe valori. Dup ce liniile au fost grupate dup atributul Dept, fiecare grup trebuie s corespund unei singure linii n tabelul returnat de interogare. Interogarea corect este

select Birou from Angajati group by Dept, Birou

Pentru a lua n considerare doar grupurile de linii ce satisfac anumite condiii trebuie utilizat clauza having. Dac aceste condiii pot fi verificate la nivel de linie, atunci este suficient utilizarea predicatelor corespunztoare ca argument al clauzei where. Clauza having conine condiii ce trebuie aplicate la terminarea execuiei interogrii ce utilizeaz clauza group by. Fiecare submulime de linii va participa la formarea rezultatului doar dac satisface condiia din clauza having. Sintaxa permite ca n clauza having s apar expresii booleene, formate din predicate simple i operatori booleeni. Predicatele simple pot fi: comparaii ntre rezultatul evalurii unei funcii agregat i o expresie generic comparaii ntre atribute ce formeaz clauza group by i o expresie generic. Se recomand ca n clauza having s apar doar predicatele ce implic o funcie agregat i restul predicatelor s fie incluse n contextul clauzei where.

Exemplu Se consider tabelul ANGAJATI (Nume, Prenume, Dept, Birou, Salariu) Interogarea 18: S se gseasc departamentele n care salariul mediu al angajailor din biroul 20 este mai mare ca 25.

select Dept from Angajati where Birou = 20 group by Dept having avg(Salariu) > 25

Forma complet a unei instruciuni select devine InterogareSQL ::= select ListaTinta from ListaTabele [where Conditie] [group by ListaAtributeGrupare] [having ConditieAgregata] [order by ListaAtributeOrdonare]

5.2.4 Interogri cu operatori din teoria mulimilor


SQL pune la dispoziie operatori din teoria mulimilor, cum ar fi operatorii de reuniune (union), intersecie (intersect) i diferen (except sau minus). Orice interogare ce utilizeaz operatorii de intersecie i diferen poate fi exprimat cu ajutorul interogrilor imbricate. Sintaxa pentru utilizarea operatorilor din teoria mulimilor este:

InterogareSQL {<union | intersect | except> [all] InterogareSQL}


Operatorii din teoria mulimilor presupun eliminarea duplicatelor ca opiunea implicit. Dac se dorete utilizarea acestor operatori cu meninerea duplicatelor este suficient specificarea opiunii all. Observaii. SQL nu impune ca schemele pe care se execut operaiile s fie identice (spre deosebire de algebra relaional), ci doar ca atributele s aib domenii compatibile. Corespondena ntre atribute nu se bazeaz pe nume, ci pe poziia atributelor. Dac atributele au nume diferite, rezultatul va prelua numele de atribute din primul operand.

Exemple Se consider tabelul ANGAJATI (Nume, Prenume, Dept, Birou, Salariu)

a) S se gseasc numele i prenumele tuturor angajailor.

select Prenume as NumeAngajat from Angajati union select Nume from Angajati

NumeAngajat Ionescu Popescu Popa Dumitrescu Manole Luca Vasile Maria Ion Stefan Radu Doru Alina

b) S se gseasc numele de angajai care sunt i prenume

select Prenume as NumeAngajat from Angajati intersect select Nume from Angajati

NumeAngajat Vasile

c) S se gseasc numele de angajai care nu sunt i prenume

select Prenume as NumeAngajat from Angajati except select Nume from Angajati

NumeAngajat Ionescu Popescu Popa Dumitrescu Manole Luca

5.2.5 Interogri imbricate


Pn acum toate interogrile formulate conineau n clauza where o condiie compus, n care fiecare predicat reprezint o comparaie ntre dou valori. Se pot defini predicate cu structur complex, n care o expresie valoric poate fi comparat cu rezultatul execuiei unei interogri SQL. Interogarea utilizat n comparaie se definete n interiorul predicatului din clauza where i se numete interogare imbricat. n general, primul operand al unei comparaii de genul celei amintite anterior este un atribut, n timp ce n cellalt membru avem o mulime de valori (rezultatul interogrii). Pentru a rezolva aceast problem a eterogenitii termenilor comparaiei, SQL pune la dispoziie cuvintele cheie any i all pentru a extinde operatorii de comparaie. any - specific faptul c linia este valid dac valoarea atributului se afl n relaie cu cel puin o valoare returnat de interogarea imbricat. all - specific faptul c linia este valid dac valoarea atributului se afl n relaie cu toate valorile returnate de interogare. Sintaxa cere ca domeniul elementelor returnate de interogarea imbricat s fie compatibil cu atributul cu care se face comparaia.

Exemplu Se consider tabelele ANGAJATI (Nume, Prenume, Dept, Birou, Salariu), DEPARTAMENT (Dept, Adresa, Oras). Interogarea 19: S se gseasc angajaii ce lucreaz ntr-un departament din Iai.

select Nume, Prenume from Angajati where Dept = any (select Dept from Departament where Oras = Iasi)
Observaie. Aceast interogare poate fi rezolvat prin realizarea unei jonciuni ntre cele dou tabele.

Interogarea 20: S se gseasc departamentele n care nu lucreaz nici un angajat cu numele Ionescu.

Select Dept from Departament where Dept <> all (select Dept from Angajati where Nume = Ionescu)

select Dept from Departament except select Dept from Angajati where Nume = Ionescu

Operatorii in i not in - reprezint apartenena la o mulime. Aceti operatori


sunt echivaleni cu = any, respectiv <> all. S mai facem observaia c funciile agregat max i min pot fi utilizate n interogrile imbricate. Exemplu Se consider tabelele ANGAJATI i DEPARTAMENT prezentate n figura 5.1. Interogarea 21: S se gseasc departamentele n care lucreaz angajaii ce ctig cel mai mare salariu. select Dept select Dept from Angajati from Angajati where Salariu = any (select max(Salariu) where Salariu >= all (select Salariu from Angajati) from Angajati) Observaii. Dei cele dou interogri sunt echivalente, este indicat folosirea funciilor agregat deoarece sunt mai concludente i se execut mai eficient. n cazul primei interogri nu exist nici o diferena dac n loc de operatorul any se folosete operatorul all (deoarece interogarea intern are ca rezultat o singur linie).

Pentru a nelege mecanismul rezolvrii interogrilor ce conin interogri imbricate se pleac de la presupunerea c interogarea imbricat se execut naintea analizei liniilor din interogarea extern. Rezultatul interogrii poate fi salvat ntr-o variabil temporar i predicatul interogrii externe poate fi evaluat cu ajutorul rezultatului temporar. Uneori interogarea imbricat face referire la contextul interogrii n care este imbricat; acest lucru are loc prin intermediul unei variabile definit n interogarea extern i utilizat n cea intern. Un astfel de mecanism este cunoscut sub numele de transferul legturilor dintr-un context n altul. n acest caz, noua interpretare pentru interogrile imbricate este urmtoarea: pentru fiecare linie din interogarea extern se evalueaz mai nti interogarea imbricat i apoi se evalueaz predicatul din interogarea extern. Vizibilitatea variabilelor SQL O variabil poate fi utilizat doar n interiorul interogrii n care este definit sau n interogarea imbricat din interogarea n care este definit. Dac o interogare conine interogri imbricate pe acelai nivel, variabilele declarate n clauza from a unei interogri nu pot fi utilizate n contextul celeilalte interogri.

Operatorului logic exists


Acest operator accept ca parametru o interogare imbricat i returneaz valoarea adevrat doar dac interogarea nu produce un rezultat vid. Exemplu Se consider relaia PERSOANA (Cod, Nume, Prenume, Oras). Interogarea 22: S se gseasc persoanele care au acelai nume i prenume, dar coduri diferite.

select * from Persoana P where exists (select * from Persoana P1 where P1.Nume = P.Nume and P1.Prenume = P.Prenume and P1.Cod <> P.Cod )
n acest caz nu se poate executa interogarea imbricat naintea evalurii interogrii externe, dat fiind c interogarea imbricat nu este definit pn cnd nu se asigneaz o valoare variabilei P. Este necesar n schimb s se evalueze interogarea imbricat pentru fiecare linie produs n cadrul interogrii externe. n exemplul prezentat vor fi examinate mai nti liniile variabilei P una cte una. Pentru fiecare din aceste linii va fi executat interogarea imbricat. Aceast interogare poate fi formulat realiznd o jonciune a tabelei PERSOANA cu ea nsi.

O alt cale de a formula interogarea din exemplul anterior este prin folosirea constructorului de tuplu, reprezentat de o pereche de paranteze rotunde care marcheaz lista de atribute. Exemplu Se consider relaia PERSOANA (Cod, Nume, Prenume, Oras). Interogarea 23: S se gseasc toate persoanele ce nu au omonime. select * from Persoana P where (Nume, Prenume) not in (select Nume, Prenume from Persoana P1 where P1.Cod <> P.Cod ) Sistemele comerciale nu rezolv ntotdeauna interogrile imbricate prin scanarea tabelului extern i producerea unei interogri pentru fiecare linie din relaie. n schimb se ncearc procesarea ct mai multor interogri ntr-o manier orientat pe mulimi, cu scopul de a manevra cantiti mari de date prin ct mai puine operaii posibile.