Documente Academic
Documente Profesional
Documente Cultură
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.
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
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.
Lista int poate conine expresii ce utilizeaz valorile atributelor din fiecare linie selectat. Exemplu Interogarea 3: Gsii salariul lunar al angajailor cu numele Popescu.
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
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
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.
Interogarea 7: S se gseasc oraele n care locuiesc persoanele cu numele Ionescu, fiecare ora aprnd o singur dat.
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.
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:
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.
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) from Angajati a, Departament d where a.Dept = d.Dept and Oras = Iasi
ntr-o prim faz interogarea este executat fr a ine cont de clauza group by. De fapt se execut interogarea
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
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]
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
select Prenume as NumeAngajat from Angajati intersect select Nume from Angajati
NumeAngajat Vasile
select Prenume as NumeAngajat from Angajati except select Nume from Angajati
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
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.
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.