Sunteți pe pagina 1din 119

qwertyuiopasdfghjklzxcvbnmqwertyu iopasdfghjklzxcvbnmqwertyuiopasdfg hjklzxcvbnmqwertyuiopasdfghjklzxcv bnmqwertyuiopasdfghjklzxcvbnmqwe rtyuiopasdfghjklzxcvbnmqwertyuiopa sdfghjklzxcvbnmqwertyuiopasdfghjkl zxcvbnmqwertyuiopasdfghjklzxcvbnm qwertyuiopasdfghjklzxcvbnmrtyuiopa sdfghjklzxcvbnmqwertyuiopasdfghjkl zxcvbnmqwertyuiopasdfghjklzxcvbnm qwertyuiopasdfghjklzxcvbnmqwertyu iopasdfghjklzxcvbnmqwertyuiopasdfg Departamentul de nvmnt la Distan

i Formare Continu hjklzxcvbnmqwertyuiopasdfghjklzxcv Facultatea de tiine Economice bnmqwertyuiopasdfghjklzxcvbnmqwe rtyuiopasdfghjklzxcvbnmqwertyuiopa sdfghjklzxcvbnmqwertyuiopasdfghjkl zxcvbnmqwertyuiopasdfghjklzxcvbnm qwertyuiopasdfghjklzxcvbnmrtyuiopa sdfghjklzxcvbnmqwertyuiopasdfghjkl
Coordonator de disciplin: Lect. univ. drd. Florin RADU

Suport de curs nvmnt la distan Contabilitate i Informatic de gestiune , Anul I, Semestrul II


Prezentul curs este protejat potrivit legii dreptului de autor i orice folosire alta dect n scopuri personale este interzis de lege sub sanciune penal ISBN 978-9731955-04-9

2010-2011

UVT
BAZE DE DATE

Suport de curs nvmnt la distan


2

SEMNIFICAIA PICTOGRAMELOR

= INFORMAII DE REFERIN/CUVINTE CHEIE

= TEST DE AUTOEVALUARE

= BIBLIOGRAFIE

= TIMPUL NECESAR PENTRU STUDIUL UNEI UNITI DE NVARE

= INFORMAII SUPLIMENTARE PUTEI GSI PE PLARFORMA ID

CUPRINS - Studiu individual (S.I.) MODUL 1. INTRODUCERE IN BAZELE DE DATE / pag. 6 Obiective / pag. 6 UI.1. Concepte fundamentale privind bazele de date / pag. 7 1.1. Conceptul de baz de date / pag. 7 1.2. Utilizatorii bazei de date / pag. 9 UI.2. Modele de reprezentare a datelor / pag. 11 2.1. Modelul ierarhic / pag. 11 2.2. Modelul reea / pag. 13 2.3. Modelul relaional / pag. 14 2.4. Modelul obiectual / pag. 18 UI.3. Sisteme de gestiune a bazelor de date / pag. 21 3.1. Funciile unui SGBD / pag. 21 3.2. Arhitectura funcional a unui SGBD / pag. 25 3.3. Arhitectura operaional a unei aplicaii baze de date / pag. 27 Bibliografie / pag. 30 MODUL 2. ALGEBRA RELAIONAL / pag. 36 Obiective / pag. 36 UI. 4. Caracterizarea general a limbajelor de programare / pag. 37 UI.5. Operatorii asambliti: Reuniunea, Intersecia, Diferena, Produsul cartezian / pag. 39 5.1. Reuniunea / pag. 39 5.2. Intersecia / pag. 40 5.3. Diferena / pag. 40 5.4. Produsul cartezian / pag. 41 UI. 6. Operatorii relaionali: Selecia, Proiecia, Jonciunea, Diviziunea / pag. 43 6.1. Selecia / pag. 43 6.2. Proiecia / pag. 45 6.3. nlnuirea consultrilor / pag. 46 6.4. Jonciunea / pag. 48 6.5. Diviziunea / pag. 55 Bibliografie / pag. 67 MODUL 3. LIMBAJUL DE INTEROGARE RELAIONAL SQL / pag. 68 Obiective / pag. 69 UI.7. Prezentare general; Elemente de baz ale interogrilor SQL / pag. 70 7.1. Prezentare general / pag.70 7.2. Elemente de baz ale interogrilor SQL / pag. 71 UI.8. Coloane expresii; Opiunea ORDER BY / pag. 79 4

8.1. Coloane expresii / pag. 79 8.2. Opiunea ORDER BY / pag. 80 UI.9. Operatorii LIKE, BETWEEN, IN / pag. 82 9.1. Operatorul BETWEEN / pag. 82 9.2. Operatorul LIKE / pag. 83 9.3. Operatorul IN / pag. 84 UI.10. Theta i echijonciunea / pag. 86 UI.11. Sinonime locale i jonciunea unei tabele cu ea nsi / pag. 89 UI.12. Subconsultri / pag. 91 UI.13. Funcii agregat: COUNT, SUM, AVG, MIN i MAX / pag. 95 13.1. Funcia COUNT / pag. 95 13.2. Funcia SUM / pag. 96 13.3. Funcia AVG / pag. 98 13.4. Funciile MAX i MIN / pag. 99 UI.14. Gruparea tuplurilor: clauza GROUP BY i clauza HAVING / pag. 101 14.1. Clauza GROUP BY / pag. 101 14.2. Clauza HAVING / pag. 103 Bibliografie / pag. 118

MODUL I INTRODUCERE N BAZELE DE DATE

1. 2. 3. 4. 5.

Cuprins Obiectiv general Obiective operaionale Dezvoltarea temei Bibliografie selectiv

Cuprins UI 1. Concepte fundamentale privind bazele de date: date abstracte, modele de baze de date, independena datelor, limbaje de definire i manipulare a datelor n bazele de date = 1 ore UI 2. Modele de reprezentare a datelor: modelul ierarhic, modelul reea, modelul relaional i modelul obiectual = 2 ore UI 3. Sisteme de gestiune a bazelor de date = 1 ore

Obiectiv general: Dobndirea cunotinelor privind locul, rolul i importana bazelor de date; dobndirea de cunotine privind modele de reprezentare a datelor Obiective operaionale: nsuirea cunotinelor privind evoluia metodelor de stoacre a informaiilor; cunoaterea categoriilor de personal implicat n crearea, dezvoltarea i exploatarea bazelor de date. nsuirea de cunotine specifice fiecrui domeniu: relaie, legturi, domeniu, tuplu, atibut, cmp, cheie primar, obiect

UNITATEA DE NVARE 1 CONCEPTE FUNDAMENTALE PRIVIND BAZELE DE DATE 1.1. Conceptul de baz de date n cadrul oricrei ntreprinderi, datele constituie o resurs organizaional crucial i n consecin ele trebuiesc gestionate similar altor active importante. Fr date asupra funcionrii interne i asupra mediului extern ntreprinderile nu ar putea s se menin n competiie sau s reueasc n afaceri. Volumul acestor sate este n continu cretere. Organizarea i memorarea acestor date pe suporturi tehnice adresabile (HDD, FDD, CD) este mult facilitat de faptul, c n majoritatea cazurilor, se opereaz cu structuri de date. Determinarea structurilor de date i a legturilor ntre realizrile acestora nu este o activitate deloc uoar. Ea presupune utilizarea unor modele de date i respectiv a unor formalisme de modelare a datelor i are ca obiectiv definirea structurilor de date de gestionat n memoria secundar. Organizarea datelor pe memoria extern a parcurs n timp mai multe etape: fiiere, fiiere cu legturi i a culminat cu bazele de date actuale. Un fiier este un ansamblu de nregistrri fizice, omogene din punct de vedre al coninutului i al prelucrrii. Fiierele conin n cea mai mare parte elemente comune iar asocierile dintre date nu sunt prea bine exploatate dat fiind faptul c fi ierele sunt utilizate izolat i independent unele de altele. Soluia fiierelor a fost specific anilor 6070, dar mai sunt ntlnite i n prezent n cadrul unor aplicaii economice care folosesc limbaje clasice i ndeosebi limbajul COBOL.

F
definiia bazei de date

Dominat n prezent este o alt soluie, care const n organizarea datelor n baze de date. O baz de date este o colecie organizat de date folosit n scopul de a modela un anumit tip de organizaie sau proces organizaional. n gestiunea bazelor de date exist dou tipuri de baze de date: operaionale i analitice. Bazele de date operaionale constituie suportul a numeroase companii, instituii i organizaii din ntreaga lume. Aceast categorie de baze de date este utilizat n cazul prelucrrilor on-line a tranzaciilor (OLTP On Line Transaction Processing), adic n acele situaii n care este necesar colectarea, modificarea i ntreinerea zilnic a bazelor de date. Datele stocate ntr-o baz de date operaional sunt date de tip dinamic, ceea ce nseamn c se modific n permanen i reflect ntotdeauna informaii actualizate la zi. 7

Contrar acestora, bazele de date analitice sunt folosite n special n prelucrrile analitice on-line (OLAP On Line Analitical Processing), cnd este necesar stocarea i urmrirea datelor istorice i dependente de timp. O baz de date analitice este de un real folos atunci cnd este necesar urmrirea tendinelor, vizualizarea datelor statistice aferente unei perioade mai lungi de timp sau efectuarea de previziuni tactice sau strategice de afaceri. Acest tip de baz de date stocheaz date statice, ceea ce nseamn c datele respective nu se modific niciodat (sau foarte rar). Informaiile culese dintr-o baz de date analitic reflect o fotografie a datelor la un anumit moment de timp. Bazele de date analitice utilizeaz frecvent bazele de date operaionale ca surs principal de date, deci poate exista o oarecare asociere ntre cele dou tipuri; cu toate acestea, bazele de date operaionale i analitice satisfac tipuri de necesiti foarte concrete privind prelucrarea datelor. 1. Care sunt etapele prin care a trecut organizarea datelor? (vezi pag. 31-35)

2. Ce este o baz de date analitic? (vezi pag. 31-35)

3. Ce este o baz de date? (vezi pag. 31-35)

4. Ce este o baz de date operaional? (vezi pag. 31-35)

5. Ce reprezint OLTP? (vezi pag. 31-35)

6. Ce reprezint OLAP? (vezi pag. 31-35) 7. Exist legtur ntre bazele de date operaionale i cele analitice? (vezi pag. 31-35)

1.2. Utilizatorii bazei de date O baz de date poate avea unul sau mai muli utilizatori. n funcie de rolul

F F

acestora distingem trei clase de utilizatori ai bazelor de date:

Programatorii de aplicaii, sunt cei care scriu programele ce utilizeaz


bazele de date. Indiferent de limbajul de programare utilizat (COBOL, C, PASCAL), aceste programe asigur accesul la datele stocate n baza de date, adugarea de noi date, tergerea sau modificarea datelor existente. Aceste funcii se execut printr-o interogare adresat SGBD-ului.

Utilizatorii finali, cuprind dou categorii de utilizatori:


Utilizatorul expert, informatician, cunoscnd limbajele de programare i limbajele bazelor de date; Utilizatorul neinformatician, care nu este specialist n baze de date. Utilizatorii finali interacioneaz cu baza de date de la o staie de lucru sau de la un terminal, utiliznd fie una din aplicaiile menionate la punctul precedent, fie o interfa care face parte integrant din SGBD. Majoritatea SGBD-urilor furnizeaz cel puin un procesor de limbaj de interogare interactiv, care permite utilizatorului s adreseze SGBD-ului comenzi de nivel nalt (ca SELECT, INSERT etc). Limbajul SQL este un limbaj tipic de interogare. Unele sisteme ofer utilizatorilor si alte tipuri de interfee n care nu pot adresa o comand explicit (ca SELECT), dar pot s aleag o comand dintrun meniu sau s completeze rubrici n structuri predefinite. Aceste meniuri sau interfee grafice sunt mai uor de folosit de utilizatorii care nu au cuno tine formale n tehnologia informaiei. 9

Administratorul BD, care asigur administrarea unitar a datelor din


baza de date. Funciile asigurate de ctre administratorul bazei de date sunt: Definirea schemei conceptuale (n care sunt incluse i regulile care s asigure integritatea datelor). Definirea schemei interne. Definirea schemei externe (sau sprijinirea utilizatorului final n definirea acestora). Definirea procedurilor de salvare i restaurare. Definirea utilizatorilor bazei de date i a drepturilor de acces (la baza de date sau la anumite obiecte ale bazei de date). Supervizarea performanelor i asigurarea evoluiei bazei de date, etc. 8. Cine sunt utilizatorii bazei de date? (vezi pag. 31-35)

9. Care sunt funciile asigurate de administratorul bazei de date? (vezi pag. 31-35)

10

UNITATEA DE NVARE 2 MODELE DE REPREZENTARE A DATELOR N BAZELE DE DATE 2.1. Modelul ierarhic Primul model utilizat n bazele de date este modelul ierarhic, care are la baz o structur arborescent, n care un nod printe poate avea mai multe noduri fiu, n timp de un nod fiu nu poate avea dect un singur nod printe. Schema ierarhiei are un singur nod rdcin, iar pentru reprezentarea relaiilor de tipul m:n ntr-o structur de baz de date ierarhic se admite duplicate pentru instanele nregistrrilor fiu. Pentru a realiza reprezentarea acestui model se folosesc diagramele de structur care sunt formate din dou elemente principale: dreptunghiuri pentru tipurile de nregistrri i linii pentru legturi. Aceste diagrame se aseamn cu o structur arborescent, locul liniilor fiind luat de tipurile de nregistrare. Pentru a pune n eviden legturile care pot exista ntre tipurile de nregistrri, se folosesc urmtoarele reprezentri grafice:

relaia 1:1 se consider tipurile de nregistrri CONTRIBUABIL i ROL. ntre aceste dou tipuri de nregistrri exist urmtoarea legtur: orice contribuabil aflat n evidena administraiei financiare are deschis un singur rol, iar fiecare rol deschis la administraiei nu aparine dect unui singur contribuabil. Reprezentarea grafic a acestei legturi este urmtoarea: CONTRIBUABIL ROL

relaia 1:n se consider tipul de nregistrri COMAND i CLIENT.

F F

ntre aceste tipuri de nregistrri exist urmtoarea legtur: un client emite mai multe comenzi, n timp ce o comand este emis de un singur client. Reprezentarea grafic a acestei legturi este urmtoarea: CLIENT COMAND

relaia m:n - se consider tipul de nregistrri COMAND i PRODUSE. ntre aceste tipuri de nregistrri exist urmtoarea legtur: o comand poate conine mai multe produse, iar un produs poate fi inclus n mai multe comenzi. Reprezentarea grafic a acestei legturi este urmtoarea: COMAND PRODUSE

11

O baz de date ierarhic este constituit dintr-un grup de nregistrri interconectate prin intermediul unor legturi. O nregistrare reprezint o colecie de cmpuri, fiecare cmp coninnd o singur valoare, iar prin legtur se nelege o asociere ntre cele dou cmpuri. Fiecare tip de nregistrare din diagrama de structur are asociat n baza de date un anumit numr de realizri, ceea ce nseamn c pentru fiecare tip de nregistrare printe pot exista nici una, una sau mai multe nregistrri ale tipului de nregistrare fiu. De exemplu, un anumit client

nu a emis nici o comand. Exemplu: Se consider o baz de date cu informaii despre studenii i specializrile unei facult i. O specializare are mai muli studeni, n schimb, un student nu poate urma dect o singur specializare. Reprezentarea modelul ierarhic al exemplului este prezentat mai jos:

n acest exemplu, tipului de nregistrare printe SPECIALIZARE i corespund patru nregistrri: (CIG, Contabilitate), (FB, Finane), (MG, Management) i (MK, Marketing). Prima nregistrare, (CIG, Contabilitate) este printe pentru (120, Popa Dan, Vaslui), care este o realizare a tipului de entitate STUDENI, a doua nregistrare nu are nregistrri fiu, a treia nregistrare are doi fii (322, Radu Ioana, Arad) i (187, Vlad Andrei, Iai), n timp ce ultima nregistrare are un singur fiu (562, Sima Ileana, Titu). 10. Enumerai modelele de descriere a datelor. (vezi pag. 31-35)

12

11. Care sunt tipurile de relaii folosite n modelul relaional? (vezi pag. 31-35)

12. Ce este o baz de dat ierarhic? (vezi pag. 31-35)

2.2. Modelul reea Este un model care are la baz o structur de tip reea. Acest model este oarecum similar cu modelul ierarhic, n sensul c un nod printe poate avea mai muli fii, deosebirea constnd n faptul c un nod fiu poate avea mai muli prini. Ca i modelul ierarhic i modelul reea folosete diagramele de structur, care se aseamn cu un graf, nodurile fiind nlocuite de tipurile de nregistrare. Reprezentarea grafic a legturilor care pot exista ntre tipurile de nregistrri (legturi 1:1, 1:n, n:m) este similar modelului ierarhic. Exemplu: Se consider o baz de date cu informaii despre studeni, specializarea urmat de acetia i bursele pe care acetia le primesc. O specializare are mai muli studeni, n schimb, un student nu poate urma dect o singur specializare; bursa poate fi obinut de mai muli studeni, n schimb, un student poate obine o singur burs. Reprezentarea modelul reea al exemplului este realizat n cele ce urmeaz:

13

n acest exemplu, tipului de nregistrare printe SPECIALIZARE i corespund patru nregistrri: (CIG, Contabilitate), (FA, Finane), (MG, Management) i (MK, Marketing), tipului de nregistrare BURSE trei realizri (Studiu, 1.200.000), (Social, 1.000.000) i (Merit, 1.900.000), iar tipului de nregistrare STUDENI patru realizri (120, Popa Dan, Vaslui), (322, Radu Ioana, Arad) , (187, Vlad Andrei, ) i (562, Sima Ileana, Titu). nregistrrile (CIG, Contabilitate) SPECIALIZARE i (Studiu, 1.200.000) BURSE sunt prin i pentru (120, Popa Dan, Studiu) STUDENI. nregistrarea (FA, Finane) nu are nregistrri fiu. nregistrarea (Social, 1.000.000) BURSE i (MG, Management) SPECIALIZARE sunt prini pentru (322, Radu Ioana, Social). Realizarea (187, Vlad Andrei, ) are drept printe (MG, Management), iar nregistrarea (562, Sima Ileana, Merit) este copilul realizrilor (MK, Marketing) i (Merit, 1.900.000). 13. Reprezentarea grafic a legturilor care pot exista ntre tipurile de nregistrri (legturi 1:1, 1:n, n:m) n modelul reea este similar modelului ierarhic? (vezi pag. 31-35)

2.3. Modelul relaional Modelul relaional a fost introdus de E. F. Codd i reprezint astzi cel mai utilizat model pentru gestionarea bazelor de date. Modelul are la baz conceptul de relaie definit n teoria matematic a mulimilor ca fiind o submulime a produsului cartezian al mai multor mulimi: R a M1 x M2 x x Mn. Familia de mulimi pe care este definit relaia se numete domeniu, atunci cnd M1 = M2 = = Mn se spune c relaia este omogen. Numrul n se numete gradul relaiei, un element al relaiei t = (m1, m2, , mn) se numete tuplu, iar numrul de tupluri indic cardinalitatea relaiei. Schema unei relaii este format din numele relaiei, atributele acesteia i restriciile de integritate. Domeniul reprezint mulimea tuturor valorilor posibile care definesc o anumit proprietate a unui obiect. Atributul reprezint mulimea valorilor 14

existente la un moment dat n coloana pe care acesta o desemneaz n cadrul unei relaii. ntr-o relaiei pot exista mai multe atribute care s ia valori n acela i domeniu. Relaia STUDENI se scrie n felul urmtor

Relaiile se prezint sub forma unor tabele, supuse urmtoarelor restricii: - fiecare coloan din tabel conine acelai fel de valori; - n tabel ordinea liniilor nu este stabilit i n acelai timp nu se admit valori duplicate; - orice valoare este un numr sau un ir de caractere (nu are cum s fie un ansamblu); - orice coloan este identificat printr-un nume care reprezint atributul relaiei. O baz de date, privit din punct de vedere al modelului relaional, este vzut ca o colecie de tabele (relaii), n care fiecare coloan reprezint un atribut distinct, iar fiecare rnd, un tuplu distinct. Tuplurile unei relaii se pot identifica n mod unic prin intermediul valorilor unuia sau mai multor atribute, care joac rolul de cheie primar a relaiei respective. Orice relaie posed cel puin o cheie. Cnd aceast cheie este alctuit dintr-un singur atribut, poart numele de cheie simpl, iar atunci cnd este format din mai multe atribute ea se numete cheie compus.

Cheia primar a unei tabele este un atribut sau un grup de atribute care permite identificarea fr ambiguitate a fiecrui tuplu din tabel. La alegerea unei astfel de chei, administratorul bazei de date trebuie s aib n vedere criterii prin care s asigure identificarea efectiv a tuplurilor (lungime, natur). 15

Cheia primar trebuie s verifice urmtoarele trei restricii: - unicitatea: o cheie identific un singur tuplu al relaiei; - compoziia minimal: atunci cnd cheia primar este compus, nici un atribut cheie nu poate fi eliminat fr distrugerea unicit ii tuplului n cadrul relaiei; - valorile non-nule: valorile atributului sau ale ansamblului de atribute care desemneaz cheia primar sunt ntotdeauna specificate, deci nenule; nici un atribut din compoziia cheii primare nu poate avea valori nule. Dac ntr-o relaie exist mai multe combinaii de atribute care confer unicitatea tuplului, acestea sunt denumite chei candidate. Atunci cnd o cheie candidat nu este cheie primar este considerat cheie alternativ (secundar). Legturile ntre tuplurile din relaii diferite se realizeaz prin atribute sau combinaii de atribute numite chei strine (externe). Reflectnd un aspect din realitate, relaiile se spun unor restricii, ce pot fi de dou feluri: restricii de integritate depind de semantica valorilor domeniilor i impun relaiilor s se supun regulilor: - integritatea entitii valorile cheii primare trebuie s fie diferite de zero, pentru c altfel, cheia respectiv nu va mai fi identificator; - integritatea referirii valorile unei chei externe trebuie s refere tuplurile unei alte relaii. alte restricii se aplic asupra domeniilor i reflect anumite corelaii de ordin valoric (egalitate, inegalitate). Avantajele modelului relaional n comparaie cu celelalte tipuri de modele sunt: - independena sporit a programelor de aplicaie fa de modul de reprezentare intern a datelor i de metodele de acces la date; - definirea unei structuri conceptuale optime, minimaliznd redundana datelor i erorile la actualizare; - utilizarea unor limbaje procedurale bazate pe algebra relaional i a unor limbaje neprocedurale care contribuie la mbunt irea comunicrii dintre sistem i neinformaticieni. 14. Din ce este format schema unei relaii? (vezi pag. 31-35)

16

15. Ce este domeniul? (vezi pag. 31-35)

16. Ce este atributul? (vezi pag. 31-35)

17. Care sunt restriciile la care sunt supuse relaiile? (vezi pag. 31-35)

18. Ce este o cheie primar? (vezi pag. 31-35)

19. Care sunt restriciile pentru cheie primar? (vezi pag. 31-35)

20. Care sunt avantajele modelului relaional? (vezi pag. 31-35)

17

2.4. Modelul obiectual Dei n prezent cel mai utiliza model este modelul relaional, el nu permite: descrierea unor structuri de date complexe (documente electronice, date n format multimedia); partajarea i reutilizarea structurilor de date; declararea prelucrrilor aferente structurilor de date (datele sunt descrise separat de prelucrri). Rspunsul la astfel de cerine l constituie modelul orientat obiect. Modelarea orientat obiect se bazeaz pe urmtoarele concepte: obiect, abstractizare, ncapsulare, motenire, polimorfism. Obiectul este definit ca o entitate cu o identitate proprie, caracterizat printr-o stare i un comportament. Orice entitate a lumii reale este un obiect, i invers, orice obiect reprezint o entitate a realitii. Obiectele pot comunica ntre ele prin intermediul mesajelor. Identitatea unui obiect este proprietatea acestuia care l distinge de alte obiecte, ea fiind o adres logic invariabil. Dac n modelul relaional datele sunt identificate prin valorile cheilor primare definite de utilizato, n modelul orientat obiect, identificarea obiectelor este fcut automat de sistem la crearea acestora i este transparent utilizatorului. Dou obiecte O1 i O2 sunt identice (O1==O2) dac au acelai identificator; n schimb dou obiecte sun egale (O1=O2) dac au aceleai valori (O1==O2, implic O1=O2, reciproca nefiind valabil). Starea unui obiect este definit de valorile atributelor sale (realizrile). Un atribut se definete printr-un nume i poate lua valori elementare (numeric, alfanumeric) sau complexe (referine spre alte obiecte). Exemplu: Clientul CL1: Cod = 678 Denumire = S.C. N&L Localitate = Trgovite Comanda CDA1: Numr = 17865 Data = 10/12/2003 CotaTVA = 19% Client = CL1. Comportamentul unui obiect este definit ca un set de operaii aplicate obiectului respectiv. Operaiile unui obiect reprezint modalit ile de rspuns la mesajele primite din exterior de obiectul respectiv; ele sunt de regul proceduri sau funcii ce acioneaz asupra obiectului respectiv.

18

Abstractizarea este procesul prin care obiectele care au aceleai atribute i comportament similar sunt grupate n tipuri abstracte de obiecte numite i clase. Obiectele devin astfel instanieri (realizri) ale claselor; n timp ce obiectele descriu entiti ale realitii, clasele sunt reprezentri abstracte ale acestor entiti. Exemplu: Client, Comand, Student. ncapsularea const n capacitatea obiectelor de a conine la un loc att date ct i operaii, dar numai o parte a acestora este vizibil din exterior. Se poate spune c n felul aceste obiectele apar ca nite cutii negre, care ascund detaliile de implementare, ele oferind o interfa simpl de rezolvare a unei probleme. Motenirea este procesul prin care toate atributele i metodele vizibile ale unei clase (numit i clas se baz) sunt preluate n mod automat de o alt clas nrudit cu aceast (numit i subclas sau clas derivat). Clasele derivate pe lng acestea pot conine i atribute sau metode specifice. Motenirea se constituie ca o cale de ncurajare a partajrii i reutilizrii structurilor de date; prin intermediul ei se pot exprima relaii deosebit de importante ntre clase, cum ar fi: clasificarea, generalizarea sau specializarea. Exemplu: Se consider clasa PERSOANA definit prin atributele publice (vizibile din exterior): CNP, NumePrenume, DataNaterii, Sex i metoda public ReturneazVrsta(An). Din clasa PERSOANA pot fi derivate clasele ANGAJAT i STUDENT, de acelai fel cu ea, fiecare student angajat fiind descris prin CNP, nume i prenume, data naterii, sex i vrst, calculat n funcie de anul naterii. STUDENT poate conine ca atribute specifice NumrMatricol, AnStudiu iar ca metod proprie MediaGeneral, n timp ce clasa ANGAJAT poate fi descris prin atributele proprii Marca, DataAngajrii i metoda ReturneazVechime().

PERSOAN

ANGAJAT

STUDENT

19

Polimorfismul reprezint posibilitate unui obiect, instan a unei clase, de a rspunde n mod diferit la primirea aceluiai mesaj. Poate fi asigurat n dou variante: - redefinirea metodelor motenite n clasele derivate; - crearea unor metode cu acelai nume sar cu parametri diferi i (suprancrcarea unei metode). Polimorfismul mrete flexibilitatea modelului orientat obiect de a reprezenta ct mai sintetic realitatea.

21. Care sunt conceptele pe care se bazeaz modelarea orientat obiect? (vezi pag. 31-35)

20

UNITATEA DE NVARE 3 SISTEMUL DE GESTIUNE AL BAZELOR DE DATE O baz de date este un ansamblu organizat i structurat de date. Acest ansamblu trebuie s permit o reprezentare fidel a datelor cu minim de constrngeri. SGBD-ul este un instrument care permite o astfel de organizare i manipulare a datelor. Este un ansamblu de programe care permite descrierea, memorarea, manipularea i restaurarea datelor pentru a asigura securitatea acestora. Se numete aplicaie baz de date sau sistem de baz de date un ansamblu de programe construite n jurul unei baze de date i integrnd un SGBD pentru gestiunea informaiilor. 3.1. Funciile unui SGBD n primul rnd trebuie menionate funciile eseniale, adic cele pentru care SGBD-ul este conceput. Ele sunt n numr de patru: descrierea datelor, introducerea, extragerea/interogarea i actualizarea. Descrierea datelor este acea parte care permite, nainte de introducerea datelor, de a defini numele acestor date, structura i coninutul lor. De exemplu baza de date a unei biblioteci comport un ansamblu de date referitoare la cr i. nainte de a putea nregistra aceste date, trebuie definit cu precizie ansamblul informaiilor care se dorete a fi administrat cu privire la aceste cr i: numrul (cota), titlul, numrul de exemplare, etc. Trebuie, de asemenea, estimat mrimea sau cel puin s fie definit mrimea maxim admis: 30 caractere pentru titlu, 5 pentru numr, etc. Odat definite structurile, funcia de introducere permite tuturor utilizatorilor inserarea de date n baz. Aceast funcie de introducere trebuie, n plus, s asigure toate controalele posibile, al acestor date. n cazul bibliotecii, SGBD-ul trebuie s verifice dac numrul crii este n forma cerut, dac mrimea titlului nu depete numrul maxim de caractere prevzut, dac numrul de exemplare este un numr ntreg pozitiv, etc. Extragerea datelor desemneaz toate operaiile regulate sau punctuale, de cutare i de ieire pe ecran, pe suport de hrtie sau pe un alt suport, n ntregime sau doar n parte a informaiilor din baza de date. Se va putea, de exemplu, s se extrag toate crile care sunt scrise de un anumit autor sau toate crile aprute n colecia Baze de date.

21

n fine, funcia de actualizare trebuie s asigure modificare sistematic a informaiilor pe msur ce acestea evolueaz. La fiecare cumprare a unei cr i, trebuie modificat numrul de exemplare al titlului corespunztor din baza de date. Pentru c datele sunt partajate de ctre mai multe aplicaii, dezvoltarea funciilor descrise anterior, antreneaz i alte necesiti. Punerea n comun a unui ansamblu de date are ca i consecin necesitatea de a prevedea controlul accesului la date. Exist dou aspecte legate de protecia datelor. Primul privete confidenialitatea: informaia nu poate fi cunoscut de toi. Pentru fiecare tip de informaie trebuie stabilit lista persoanelor sau a grupurilor autorizate a le consulta. Al doilea aspect se refer la integritate: informaia nu poate fi modificat de toi. n acest caz, se convine la definirea unui cerc de persoane, n general foarte mic, abilitate s actualizeze informaia. SGBDul trebuie s permit personalizarea accesului la baza de date. Trebuie deci s se poat identifica utilizatorii i controla aceast identificare, ceea ce se cheam autentificarea accesului. Dup caz, protecia se poate face la mai multe nivele: accesul la ntreaga baz, la o parte din ea sau la un singur element al bazei. Protecia datelor este unul din aspectele unei funcii destul de importante care este securitatea bazei de date. La aceast funcie se adaug i funciile de rezisten n cazul unor pene, pe care trebuie sa le furnizeze SGBD-ul. Un program nu poate mpiedica n totalitate apariia incidentelor sau a problemelor majore. Totui, el trebuie s fie n msur s furnizeze mecanisme care s faciliteze recuperarea datelor n cazul n care apar probleme grave. Bazele de date sunt utilizate pentru a evita redundana informaiilor stocate. Uneori, pentru a minimiza consecinele legate de eventualele probleme ce pot aprea, este necesar efectuarea de salvri ale bazei de date. Aceste salvri nu sunt nimic altceva dect date redundante, dar, n acest caz duplicarea informaiilor este controlat de SGBD. SGBD-ul este dedicat manipulrii datelor. Pentru aceasta trebuie s asigure un acces optimal la date. Dincolo de organizarea fizic a datelor, SGBD-ul trebuie s faciliteze cutarea acestora. n aceeai ordine de idei, SGBD-ul trebuie s faciliteze accesul la date pentru toate programele, dar i pentru toate categoriile de utilizatori. Pentru aceasta, el trebuie s furnizeze instrumentele care s permit interfaarea comunicarea SGBD-ului cu alte programe. Trebuie oferit un acces direct la date

22

sub o form compatibil cu categoriile de utilizatori, de exemplu o interfa grafic pentru nespecialiti, un limbaj de acces puternic pentru informaticieni. O alt funcie important este controlul concurenei. ntr-adevr o baz de date trebuie s permit accesul simultan al mai multor utilizatori, fr nici un fel de incident. S lum exemplu unui sistem de rezervare a locurilor pentru cursele aeriene, fondat pe o baz de date. Aceasta trebuie s permit alocarea fiecrui loc unei singure persoane i numai uneia. O agenie conectat la baza de date respectiv, ntreab dac a mai rmas un loc liber pentru zborul 747. I se rspunde c a mai rmas unul singur. O alt agenie pune imediat aceeai ntrebare, nainte ca prima agenie s fi confirmat interesul su pentru locul rmas. Locul este nc disponibil. Prima agenie l-a rezervat. A doua, de asemenea, a ntrebat. Se produce n acest caz o problem zis de acces concurent pe care SGBD-ul trebuie s o previn. Realizarea unei baze de date are drept consecin punerea n comun i partajarea unui ansamblu de informaii. Aceast punere n comun trebuie s respecte dou principii de independen: respectiv independena fizic i independena logic. Independena fizic desemneaz principiul conform cruia un program care acceseaz datele din baz, trebuie s manipuleze aceste date ntr-un mod abstract, independent de organizarea lor fizic. Independena logic caracterizeaz accesul simultan al diferiilor utilizatori sau programe la aceeai baz de date. Fiecare program trebuie s poat lucra doar asupra pr ii de date care dorete. Pentru aceasta la realizarea programului se vor folosi doare datele utile acestuia. Trebuie s se poat utiliza pentru calificarea acestor date, termeni care sunt proprii programului, eventual diferii de cuvintele care vor fi utilizate n alte programe sau de ali utilizatori pentru a desemna aceleai date. Mecanisme precum subschema n cazul bazelor de date reea sau vederile n cazul bazelor de date relaionale permit ceast independen logic. 22. Care sunt funciile unui SGBD? (vezi pag. 31-35)

23

23. Ce presupune descrierea datelor? (vezi pag. 31-35)

24. n ce const extragerea datelor? (vezi pag. 31-35)

25. Ce implic protecia datelor? (vezi pag. 31-35)

26. Care sunt cele dou principii de independen? (vezi pag. 31-35)

24

3.2. Arhitectura funcional a unui SGBD Un SGBD este format din diferite module fiecare avnd n sarcin una sau mai multe din funciile descrise anterior. SGBD Interfaa utilizator SGBD Interfaa de administrare SGBD Gestiunea acceselor SGBD Gestiunea tranzaciilor SGF Gestiunea fiierelor SGBD Mecanisme specifice SGBD Gestiunea discurilor

Discuri

Figura 1.1. Arhitectura funcional a unui SGBD Ansamblul acestor module constituie puntea de legtur ntre baza de date stocat pe unul sau mai multe discuri magnetice i ansamblul utilizatorilor. La cel mai nalt nivel SGBD ul conine un ansamblu de instrumente administrnd comunicarea direct cu utilizatorii. n funcie de SGBD, oferta n termeni de interfee este mai mult sau mai puin bogat. Editorii de SGBD-uri tind s propun diferite limbaje de acces la baza de date, adaptate gradului de competen sau nevoilor categoriilor de utilizatori desemnai s lucreze cu datele, interfee interactive dispun de instrumentele necesare punerii n legtur a programelor de acces la date scrise n limbaje de programare clasice cu baza de date. Instrumentele respective permit munca cu datele coninute n baza de date. SGBD-ul ofer, n plus, o interfa care permite de a aciona asupra structurii bazelor de date i/sau asupra aspectelor tehnice, cum ar fi optimizarea bazelor, configurarea lor. Aceast interfa este numit interfaa de administrare. Ea este rezervat, n general, informaticienilor dau utilizatorilor foarte avizai. Este instrumentul de munc privilegiat al administratorului bazei de date.

25

Indiferent care ar fi interfaa de comunicare aleas pentru a accede la baza de date, trebuie s existe un drept de acces la aceasta din urm. Drepturile sunt atribuite de administrator i se concretizeaz ntr-o identificare (nume utilizator) i o autentificare (parol). Modulul de gestiune a acceselor are n sarcin aceste controale. El asigur n acelai timp i controlul integritii. Altfel spus, el protejeaz datele verificnd dat toate actualizrile respect un ansamblu de reguli numite constrngeri de integritate. Se mpiedic modificrile care violeaz aceste constrngeri i avertizeaz utilizatorul de problemele ntlnite. Tipurile de constrngeri admise de un SGBD vor fi descrie mai trziu. n fine modulul de gestiune a acceselor asigur optimizarea acestora. Astfel, n majoritatea SGBD-urilor, accesul la date este formulat n limbaje evoluate precum SQL (Structured Query Language). Modulul de gestiune a tranzaciilor este indispensabil pentru a asigura, n acelai timp, buna execuie a acceselor simultane i pentru a realiza aciunile care vor permite, n caz de pan, recuperarea datelor n cea mai bun stare posibil. Rspunsul editorilor de SGBD-uri la aceste dou nevoi a fost cvasi unanim: punerea la punct a unui mecanism numit tranzacie care permite definirea ansamblului de executat totul sau nimic asupra bazei de date. Astfel, se asigur c utilizatorii pot lucra simultan fr conflicte: cererea disponibilitii unui loc n avion i rezervarea sa trebuie s fac pare din aceeai tranzacie. Prin acela i mijloc, n caz de pan, nu se reia dect tranzaciile corect executate, adic tranzaciile terminate i valide. Toate modulele descrie pn acum sunt parte component a SGBD. Totui, SGBD-ul nu este n relaie direct cu baza de date. Dup cum am vzut baza de date este constituit dintr-un ansamblu de fiiere, mbogite cu structuri zise de acces. Aceste fiiere sunt, n general, administrate de sistemul de gestiune al fiierelor (SGF) care face parte din sistemul de operare al calculatorului: Unix, Windows. Altfel spus, SGBD utilizeaz SGBD-ul xxx, dar poate, n anumite cazuri, pune la dispoziie mecanisme suplimentare de organizare i acces la datele stocate n aceste fiiere. Ultimul strat reprezentat n figur nu este intern SGBD. El reprezint sistemul de gestiune al intrrilor-ieirilor al sistemului de operare. El permite convertirea comenzilor scrise n straturile superiore n ordinea citire, scriere, deplasare i poziionare a capetelor pe discuri. Realizeaz, de asemenea, operaiile necesare pentru cutarea i actualizarea datelor. De fapt, baze de date este stocat 26

pe disc. Totui, toate informaiile asupra datelor sunt efectuate n memoria central. Gestiunea discurilor asigur deci toate transferurile ntre memoria central i spaiul de stocare de pe disc.

27. Descriei grafic (vezi pag. 31-35)

arhitectura

funcional

unui

SGBD

3.3. Arhitectura operaional a unei aplicaii baze de date La nceput, SGBD-urile erau concepute pentru sisteme centralizate. Utilizatorii conectai la aceste sisteme partajau aceleai date implantate pe acela i disc i ncrcate n acelai spaiu de memorie central. Apariia micro-informaticii n anii 1980 a dus la realizarea de SGBD la nivel micro. Totui, utilizatorii i-au exprimat rapid dorina de a putea interaciona cu baza de date centralizat prin intermediul microcalculatorului. Acestea nu avea ns puterea i securitatea marilor sisteme. 27

La nceputul anilor 1990 apare conceptul de arhitectur client/server. Se consider c o aplicaie informatic comport n general trei tipuri de tratamente: gestiunea datelor (cutare, actualizare), logica aplicativ care nseamn calcule, reflecii i n cele din urm prezentarea rezultatelor. Se vorbete de client/server de ndat ce aceste tratamente sunt repartizate ntre cel puin dou calculatoare. Este evident faptul c gestiunea datelor este mai bine asigurat de marile sisteme. n schimb, prezentarea rezultatelor este mai mulumitoarea via un microcalculator. Cea mai clasic arhitectur client/server poate fi descris dup cum urmeaz: - client este microcalculatorul care emite cererile de acces la baza de date situat pe un server; - cererea este executat pe server care remite clientului liniile rezultat; - acest rezultat este afiat pe postul client, de exemplu prin intermediului unui tabel.

Server

Client 1

Client 2

Client n

Cererea client ctre server Rspunsul serverului ctre client Figura 1.2. Arhitectura client server Acest tip de funcionare este eficace n msura n care fiecare dintre cei doi efectueaz sarcina pentru care este cel mai adaptat: prezentarea rezultatelor este efectuat de ctre client, gestiunea datelor (coerena, integritatea) este asigurat de server. Logica aplicativ poate fi executat fie de client, fie de server. Totui, n primul caz, inconvenientul este c ansamblul de date uneori voluminos tranziteaz reeaua. Dac numrul utilizatorilor este foarte mare, reeaua poate fi foarte ncrcat .

28

n cazul n care logic aplicativ este efectuat de server, acesta poate fi foarte solicitat de un mare numr de utilizatori simultan. n ciuda acestor inconveniente, arhitecturi de acest tip sunt nc foarte utilizate n ntreprinderi. n aceste configuraii, conexiunea ntre programe este realizat de programe de comunicare numite middlewares. Pentru a rezolva inconvenientul citat mai sus, de acum nainte se realizeaz arhitecturi pe 3 niveluri. Cele 3 componente care sunt gestiunea datelor, logica aplicativ i prezentarea rezultatelor sunt repartizate ntre trei calculatoare: serverul de date, serverul de aplicaie i postul client:

Server

Server de aplicaie

Client 1

Client 2

Client n

Figura 1.3. Arhitectura pe 3 niveluri

28. Descriei grafic arhitectura client/server. (vezi pag. 31-35)

29

29. Descriei grafic arhitectura pe 3 niveluri. (vezi pag. 31-35)

BIBLIOGRAFIE SELECTIV I. Tratate i monografii. 1. Michael Hernandez Proiectarea bazelor de date, Editura Teora, Bucureti, 2003 2. Mariana Milo escu Baze de date n Visual FoxPro, Editura Teora, 2003 3. Marin Fotache, Proiectarea bazelor de date, Editura Polirom, Iai, 2005 4. Grupul BDASEIG, Baze de date. Fundamente teoretice i practice, Editura Infomega, Bucureti, 2002 5. Florin Radu, Baze de date, Editura Bibliotheca, Trgovite, 2007

30

Rezolvarea testelor de autoevaluare 1. Care sunt etapele prin care a trecut organizarea datelor? a.fiiere b.fiiere cu legturi c.bazele de date actuale 2. Ce este o baz de date analitic? Bazele de date analitice sunt folosite n special n prelucrrile analitice on-line (OLAP On Line Analitical Processing), cnd este necesar stocarea i urmrirea datelor istorice i dependente de timp 3. Ce este o baz de date? O baz de date este o colecie organizat de date folosit n scopul de a modela un anumit tip de organizaie sau proces organizaional 4. Ce este o baz de date operaional? Baza de date operaional este utilizat n cazul prelucrrilor on-line a tranzaciilor (OLTP On Line Transaction Processing), adic n acele situaii n care este necesar colectarea, modificarea i ntreinerea zilnic a bazelor de date 5. Ce reprezint OLTP? OLTP On Line Transaction Processing 6. Ce reprezint OLAP? OLAP On Line Analitical Processing 7. Exist legtur ntre bazele de date operaionale i cele analitice? Bazele de date analitice utilizeaz frecvent bazele de date operaionale ca surs principal de date, deci poate exista o oarecare asociere ntre cele dou tipuri; cu toate acestea, bazele de date operaionale i analitice satisfac tipuri de necesiti foarte concrete privind prelucrarea datelor. 8. Cine sunt utilizatorii bazei de date? a.Programatorii de aplicaii b.Utilizatorii finali c. Administratorul BD

31

9. Care sunt funciile asigurate de administratorul bazei de date? a. Definirea schemei conceptuale b.Definirea schemei interne. c.Definirea schemei externe d.Definirea procedurilor de salvare i restaurare. 10. Enumerai modelele de descriere a datelor a.modelul ierarhic b.modelul reea c.modelul relaional d.modelul obiectual; 11. Care sunt tipurile de relaii folosite n modelul rela ional? a.relaia 1:1 b.relaia 1:n c.relaia m:n 12. Ce este o baz de dat ierarhic? O baz de date ierarhic este constituit dintr-un grup de nregistrri interconectate prin intermediul unor legturi 13. Reprezentarea grafic a legturilor care pot exista ntre tipurile de nregistrri (legturi 1:1, 1:n, n:m) n modelul reea este similar modelului ierarhic? DA 14. Din ce este format schema unei relaii? Schema unei relaii este format din numele relaiei, atributele acesteia i restriciile de integritate. 15. Ce este domeniul? Domeniul reprezint mulimea tuturor valorilor posibile care definesc o anumit proprietate a unui obiect 16. Ce este atributul? Atributul reprezint mulimea valorilor existente la un moment dat n coloana pe care acesta o desemneaz n cadrul unei relaii 17. Care sunt restriciile la care sunt supuse relaiile? a. fiecare coloan din tabel conine acelai fel de valori; b.n tabel ordinea liniilor nu este stabilit i n acelai timp nu se admit valori duplicate; c.orice valoare este un numr sau un ir de caractere; d.orice coloan este identificat printr-un nume care reprezint atributul relaiei. 32

18. Ce este o cheie primar? Cheia primar a unei tabele este un atribut sau un grup de atribute care permite identificarea fr ambiguitate a fiecrui tuplu din tabel 19. Care sunt restriciile pentru cheie primar? a.unicitatea b.compoziia minimal c.valorile non-nule 20. Care sunt avantajele modelului relaional? a.independena sporit a programelor de aplicaie fa de modul de reprezentare intern a datelor i de metodele de acces la date; b.definirea unei structuri conceptuale optime, minimaliznd redundana datelor i erorile la actualizare; c.utilizarea unor limbaje procedurale bazate pe algebra relaional i a unor limbaje neprocedurale care contribuie la mbuntirea comunicrii dintre sistem i neinformaticieni. 21. Care sunt conceptele pe care se bazeaz modelarea orientat obiect? Modelarea orientat obiect se bazeaz pe urmtoarele concepte: obiect, abstractizare, ncapsulare, motenire, polimorfism. 22. Care sunt funciile unui SGBD? a.descrierea datelor b.introducerea datelor c.extragerea/interogarea datelor d.actualizarea datelor 23. Care sunt cele dou principii de independen? Independena fizic i independena logic

33

24. Descriei grafic arhitectura funcional a unui SGBD

25. Ce presupune descrierea datelor? Descrierea datelor este acea parte care permite, nainte de introducerea datelor, de a defini numele acestor date, structura i coninutul lor. De exemplu baza de date a unei biblioteci comport un ansamblu de date referitoare la cri.

26. n ce const extragerea datelor? Extragerea datelor desemneaz toate operaiile regulate sau punctuale, de cutare i de ieire pe ecran, pe suport de hrtie sau pe un alt suport, n ntregime sau doar n parte a informaiilor din baza de date.

27. Ce implic protecia datelor? Exist dou aspecte legate de protecia datelor. Primul privete confidenialitatea: informaia nu poate fi cunoscut de toi. Pentru fiecare tip de informaie trebuie stabilit lista persoanelor sau a grupurilor autorizate a le consulta. Al doilea aspect se refer la integritate: informaia nu poate fi modificat de toi. n acest caz, se convine la definirea unui cerc de persoane, n general foarte mic, abilitate s actualizeze informaia. 34

28. Descriei grafic arhitectura client/server.

29. Descriei grafic arhitectura pe 3 niveluri.

35

M.2. ALGEBRA RELAIONAL


1. 2. 3. 4. 5. Cuprins Obiectiv general Obiective operaionale Dezvoltarea temei Bibliografie selectiv

Cuprins UI. 4. Caracterizarea general a limbajelor de programare; = 1 or UI. 5. Operatorii asambliti: Diferena, Produsul cartezian;

Reuniunea,

Intersecia,

= 1 or UI. 6. Operatorii relaionali: Selecia, Proiecia, Jonciunea, Diviziunea = 10 ore

Obiectiv general: Dobndirea cunotinelor cu privire la operatorii algebrei relaionale Obiective operaionale: Cunoaterea modului de aplicare a operatorilor asambliti (reuniune, intersecie, produs cartezian, diferen) i a celor relaionali (selecie, proiecie, jonciune, diviziune)

36

UNITATEA DE NVARE 4 CARACTERIZARE GENERAL A LIMBAJELOR DE INTEROGARE

Bazele de date relaionale au ca principal obiectiv acoperirea nevoilor informaionale ale conducerii firmei la toate nivelurile ierarhice. Pn la consacrarea definitiv a SGBDR-urilor, extragerea informaiilor dorite din baza de date se realiza n principal prin aplicaii dezvoltate exclusiv prin intermediul limbajelor procedurale, n care se precizau att datele dorite, ct i metodele de cutare i de extragere a acestora. Generalizarea SGBDR-urilor este strns legat

de elaborarea i implementarea unor limbaje performante pentru manipularea bazelor de date limbajele de interogare. Limbajele relaionale sunt limbaje neprocedurale, n sensul c utilizatorul definete doar datele ce trebuie extrase din baza de date, sarcina cutrii i extragerii fiind n sarcina exclusiv a SGBD-ului. Limbajele de manipulare a datelor, plecnd de la cele dou modaliti de definire a unei relaii (ca predicat aplicat asupra unor domenii i ca ansamblu de tupluri), sunt grupate n dou mari categorii: limbaje predicative bazate pe teoria predicatelor; limbaje asambliste bazate pe teoria ansamblurilor (a tuplurilor). La rndul lor limbajele predicative sunt mprite n: limbaje care au la baz calculul relaional asupra tuplurilor; limbaje n care calculul relaional se aplic doar asupra domeniilor. Pentru limbajele de manipulare a datelor bazate pe calculul predicatelor, elementul definitoriu l constituie noiunea de variabil, noiune ce poate fi asociat att tuplurilor, ct i domeniilor. O alt clasificare este cea care realizeaz o delimitare ntre limbajele nongrafice i cele grafice. Prima categorie permite realizarea unei consult ri, prin dispunerea succesiv a operatorilor, atributelor i relaiilor, n timp ce a doua categorie permite redactarea consult rii n mod interactiv, prin afiarea pe ecran a unui sistem de meniuri i elemente de dialog din care opiunile pot fi selectate i modificate uor cu ajutorul mouse-ului Exist o serie de caracteristici comune tuturor limbajelor de interogare: rezultatul consultrii este o nou relaie ce poate servi, n continuare, ca argument ntr-o nou consultare; 37

operatoriile relaionali se aplic relaiilor considerate n totalitatea lor, adic tuturor tuplurilor care alctuiesc relaiile respective; logica operatorilor se bazeaz pe valorile atributelor, aceasta constituind singurul mod de acces la baza de date. Accesul total independent de limbaj este asigurat prin compararea valorilor atributelor definite pe domenii compatibile. Pentru a se realiza o consultare ntr-un limbaj relaional, nainte de toate trebuie parcurs o faz de analiz, pentru determinarea rezultatului, a legturilor dintre tabele precum i a eventualelor restricii ce trebuie respectate.

Algebra relaional cuprinde dou tipuri de operatori: asambliti (REUNIUNE, INTERSECIE, DIFEREN, PRODUS CARTEZIAN) i relaionali (SELECIE, PROIECIE, JONCIUNE, DIVIZIUNE). ntr-o alt clasificare se face diferena ntre operatorii fundamentali, ireductibili (reuniunea, diferena, produsul cartezian, selecia i proiecia) i operatorii derivai, a cror funcionalitate poate fi realizat prin combinarea operatorilor fundamentali (intersecia, jonciunea i diviziunea). Pe parcursul acestui capitol se vor folosi notaiile: t un tuplu al unei relaii (o linie a unei tabele) i t(A), un subtuplu al relaiei R, relativ la atributul A (valoarea atributului A n linia t). Ca i calculul relaional, algebra relaional, servete ca punct de referin n caracterizarea unui limbaj ca fiind complet sau incomplet, din punct de vedere relaional. Dac un limbaj permite exprimarea tuturor operatorilor aminti i anterior i ofer cel puin facilitii algebrei relaionale, se poate spune despre respectivul limbaj c este un limbaj complet relaional.

38

UNITATEA DE NVARE 5 OPERATORII ASAMBLITI Trei dintre operatorii asambliti reuniune (), intersecie () i diferen () pot opera numai cu dou relaii unicompatibile. Ce nelegem prin relaii unicompatibile? Fie R1 (A1, A2, .., An) i R2 (B1, B2,.., Bm) dou relaii. Spunem despre R1 i R2 c sunt unicompatibile dac: 1. n=m 2. " i (1, 2, ., n), Ai i Bi sunt de acelai tip sintactic. Relaiile R1 i R2 din figura 3.1. sunt unicompatibile deoarece: 1. ambele au acelai numr de atribute; 2. atributele C1, C2, C3 din R1 (R1.C1, R1.C2, R1.C3) corespund sintactic atributelor C3, C4 i C5 (R2.C3, R2.C4, R2.C5). R1
C1 100 200 400 500 900 C2 AAA AAB ABA BBB ABB C3 500 750 250 700 400

R2
C3 500 300 400 700 900 C4 BBB BAA BBA AAA ABB C5 300 250 300 500 400

Figura 1. Relaiile R1 i R2 unicompatibile 5.1. Reuniunea

Reuniunea a dou relaii R1 i R2, notat R3 R1 R2, este definit astfel: R1 R2 = {tuplu t | t R1 sau t R2}. Coninutul tabelei-reuniune R3 este prezentat n figura 2. Primele cinci tupluri din aceast tabel sunt preluate din R1, iar ultimele trei din R2. R3 conine opt tupluri deoarece dou din tupluri sunt comune tabelelor R1 i R2. Algebra relaional elimin automat duplicatele (tuplurile identice), n felul acesta asigurndu-se restricia de unicitate dup fiecare operaie. Reuniunea este comutativ. Singura problem neclar ar fi legat de numele atributelor n relaia rezultat, ns se poate institui regula conform creia numele atributelor relaiei-reuniune s fie numele atributelor primei rela ii participante la operaie.

39

R3
C1 100 200 400 500 900 300 400 700 C2 AAA AAB ABA BBB ABB BAA BBA AAA C3 500 750 250 700 400 250 300 500

Figura 2. Reuniunea relaiilor R1 i R2 5.2. Intersecia

Intersecia a dou relaii R1 i R2, notat R4 R1 R2, este definit astfel: R1 R2 = {tuplu t | t R1 i t R2}. Coninutul tabelei-intersecie este prezentat n figura 3.3. Deoarece doar dou tupluri sunt absolut identice i n R1 i n R2, tabela rezultat va fi alctuit doar din dou linii. Ca i reuniunea, intersecia este comutativ, iar numele atributelor relaiei intersecie sunt extrase din prima relaia participant la operaie. R4 C1 C2 C3 500 BBB 700 900 ABB 400 Figura 3. Intersecia relaiilor R1 i R2 5.3. Diferena

Diferena a dou relaii R1 i R2, notat R5 R1 R2, este definit astfel: R1 R2 = {tuplu t | t R1 i t R2}. Coninutul tabelei-diferen (figura 3.4.) conine doar tuplurile din R1, care nu se regsesc n R2. Aadar, din rezultat sunt eliminate ultimele dou tupluri din R1, deoarece valorile acestora se reg sesc i n R2 (primul i ultimul tuplu din R2). Spre deosebire de reuniune i intersecie, diferena nu este comutativ. Atributele relaiei-diferen sunt cele ale primei relaii, iar tuplurile care sunt extrase din relaia-desczut nu se regsesc n relaia scztor. Pe lng asta, nu 40

exist restricii privind cardinalitatea (numrul tuplurilor) celor dou relaii n sensul c nu este obligatoriu ca relaia desczut s conin mai multe tupluri dect cea scztor. R5 C1 C2 100 AAA 200 AAB 400 ABA C3 500 750 250

Figura 4. Diferena relaiilor R1 i R2 5.4. Produsul cartezian Produsul cartezian dintre dou relaii R1 i R2, notat R6 R1 R2, este ansamblul tuturor tuplurilor obinute prin concatenarea fiecrei liniile din tabela R1 cu toate linie din tabela R2. Este definit astfel: R1 R2 = {(t1, t2) | t1 R1 i t2 R2} Spre deosebire de celelalte trei operaiuni precedente, produsul cartezian nu face apel la noiunea de relaii unicompatibile, iar relaia rezultat cumuleaz atributele celor dou relaii argument. n figura 3.5. este prezentat rezultatul produsului cartezian al tabelelor R1 i R2. R6 C1 100 100 100 100 100 200 200 200 200 200 400 400 400 400 400 500 500 500 500 C2 AAA AAA AAA AAA AAA AAB AAB AAB AAB AAB ABA ABA ABA ABA ABA BBB BBB BBB BBB R1.C3 R2.C3 500 500 300 500 400 500 700 500 300 500 500 750 300 750 400 750 700 750 900 750 500 250 300 250 400 250 700 250 900 250 500 700 300 700 400 700 700 700 C4 BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB BBB BAA BBA AAA C5 300 250 300 500 400 300 250 300 500 400 300 250 300 500 400 300 250 300 500 41

500 BBB 700 900 ABB 400 BBB 300 500 40 ABB 900 BAA 250 300 40 ABB 900 BBA 300 400 40 ABB 900 AAA 400 700 40 ABB 900 ABB 500 900 40 ABB 900 Figura 5. Produsul cartezian al relaiilor R1 i R2 Tabela-rezultat R6 are o structur nou cu ase atribute (trei preluate din R1 i trei din R2). Deoarece exist un atribut cu nume comun C3, pentru a deosebi cele dou apariii, acestea sunt prefixate, n antetul tabelei, cu numele relaiei din care provine atributul respectiv (R1.C3 i R2. C3). Prima linie din R6 este obinut prin unirea primului tuplu din R1 cu primul tuplu din R2, a doua din primul tuplu din R1 cu al doilea din R2 .a.m.d. Cum R1 are 5 tupluri i R2 tot 5, tabela-rezultat a produsului cartezian va avea 5 * 5 = 25 tupluri. Nu prea exist situaii care s reclame folosirea direct i exclusiv a produsului cartezian. Cel mai important merit al acestuia n algebra rela ional este c permite alipirea a dou relaii, fundamentnd astfel operatorul cheie care este jonciunea.

42

UNITATEA DE NVARE 6 OPERATORII RELAIONALI Dac cei patru operatori prezentai n paragraful anterior sunt generali, cei din paragraful de fa sunt specifici algebrei relaionale. Sunt grupai n dou categorii: - operatori unari de restricie, care permit decupajul unei relaii, pe orizontal SELECIA i pe vertical PROIECIA; - operatori binari de extensie: JONCIUNEA i DIVIZIUNEA. 6.1. Selecia Selecia triaz dintr-o tabel numai tuplurile care satisfac condiia specificat printr-un predicat. Se noteaz R1 SELECIE {R; expresie_logic} unde: - R este relaia R (A1, A2, ..., An) asupra creia se aplic selecia (Ai sunt atributele sale); - R1 este noua tabel obinut n urma seleciei, care va avea aceea i schem relaional cu R R1(A1, A2, ..., An) - expresie_logic este compus din operanzi care sunt nume de atribute sau constante, operatori de comparaie aritmetic (>, , <, , =, ) i operatori logici (I, SAU, NU). OBSERVAIE: Relaiile R1 i R2 folosite pentru exemplificare pe parcursul acestui subcapitol, sunt cele din figura 3.1. din subcapitolul anterior. Toate celelalte relaii folosite aici, precum i n capitolul urmtor (Limbajul de interogare SQL) sunt prezentate n anex. Exemplul 1. Care sunt liniile din R1 pentru care valorile atributului C1 sunt mai mici de 500? R SELECIE (R1; C1 > 500) R
C1 900 C2 ABB C3 500

Figura 6. Rezultat selecie exemplul 1 43

Exemplul 2. Care sunt liniile din R1 pentru care valorile atributului C3 sunt cuprinse n intervalul 250 350? R SELECIE (R1; C3 > = 250 AND C3 < = 350) R
C1 400 C2 ABA C3 250

Figura 7. Rezultat selecie exemplul 2 Exemplul 3. Care sunt liniile din R1 pentru care valorile atributelor C1 i C3 sunt mai mari dect 300? R SELECIE (R1; C1 > 300 AND C3 > 300) R C1 C2 C3 900 ABB 40 Figura 8. Rezultat selecie exemplul 3 Exemplul 4. Care sunt studenii Facultii de tiine Economice? Pentru a afla aceast informaie, mai nti trebuie s identificm n baza de date tabela (sau dup caz, tabelele) din care se extrage rezultatul. n cazul de fa, tabela este STUDENT. Apoi se stabilesc atributele din tabel, asupra crora se va aplica predicatul (atributul) de selecie. Se obine n felul acesta soluia: R SELECIE (STUDENT, facultate = Stiinte Economice) Exemplul 5. Care sunt studenii Facultii de tiine Economice, specializarea Contabilitate i Informatic de Gestiune? Tabela n care va opera operatorul de selecie este STUDENT. Predicatul de selecie va opera asupra atributelor facultate i sectia: R SELECIE (STUDENT, facultate = Stiinte Economice AND sectia = CIG) Exemplul 6. Ce burse au fost ridicate n luna februarie 2004? Tabela n care va opera de aceast dat operatorul de selecie este tabela BURSA, iar atributul folosit este data_incasarii. R SELECIE (BURSA; data_incasarii >= 01/02/2004 AND data_incasarii <= 29/02/2004

44

6.2. Proiecia Proiecia permite selectarea ntr-o tabel rezultat doar a atributelor dorite spre deosebire de selecie care extrage anumite linii dintr-o tabel pe baza condiiei ndeplinite de valorile unora dintre atribute. Cu alte cuvinte se realizeaz decuparea pe vertical a unei relaii. Proiecia relaiei R(A1, A2, , An) este o relaie care se obine dup parcurgerea a doi pai: 1. eliminarea din Ai a acelor atribute care nu sunt specificate 2. suprimarea tuplurilor identice (dublurile). Se noteaz: R1 PROIECIE {R; Aj, Ak, , Ax} Spre deosebire de R, schema relaiei R1 este alctuir numai din atributele indicate: R1 (Aj, Ak, ..., Ax). Dac dup extragerea coloanelor nu exist tupluri identice, R1 va avea acelai numr de linii ca i relaia R. n caz contrar, numrul lor va fi mai mic, n funcie de numrul dublurilor. Exemplul 7. Care sunt valorile atributului C3 n relaia R1? R PROIECIE (R1; C3) R
C3 500 750 250 700 400

Figura 9. Rezultat proiecie exemplul 7 Exemplul 8. Care sunt valorile combinaiei atributelor C1 i C3 n relaia R1? R PROIECIE (R1; C1, C3) R
C1 100 200 400 500 900 C3 500 750 250 700 400

Figura 10. Rezultat proiecie exemplul 8 Exemplul 9. Care sunt facultile preluate n baza de date? Tabela n care sunt preluate facultile este STUDENT. Singura coloan care ne intereseaz n acest caz este facultate. 45

n prima faz se realizeaz decuparea pe vertical a coloanei respective, obinndu-se o relaie temporar notat R, iar apoi prin eliminarea duplicatelor se obine rezultatul final n relaia R. R PROIECIE (STUDENT; facultate) R
facultate Stiinte Economice Stiinte Economice Colegiul Economic Stiinte Juridice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Juridice Stiinte Economice Colegiul Economic Stiinte Economice Stiinte Economice Colegiul Economic Stiinte Economice Stiinte Juridice Stiinte Economice Colegiul Economic Stiinte Economice Stiinte Economice

R
facultate Colegiul Economic Stiinte Economice Stiinte Juridice

Figura 11. Rezultat proiecie exemplul 9 Exemplul 10. S se identifice cota, titlul, domeniul i numrul de

exemplare al fiecrei cri. Tabela care intereseaz este CARTE, iar din aceasta se decupeaz patru coloane: cota_carte, titlu, domeniu i nr_exemplare. R PROIECIE (CARTE; cota_carte, titlu, domeniu, nr_exemplare) 6.3. nlnuirea consultrilor Dup cum am vzut, rezultatul unei consultri este o tabel (relaie) nou. Avnd n vedere acesta, pentru obinerea tabelei rezultat, se pot nlnui dou sau mai multe operaii redactndu-se astfel interogri complexe. Exemplul 11. Care este facultatea pe care o urmeaz studentul Barbu Elena?

46

n cazul de fa soluia este relativ simpl. Folosind selecia se decupeaz din tabela STUDENT doar studentul care se numete Barbu Elena. Se obine n felul acesta o relaie nou, notat R1. Avnd n vedere c ne intereseaz doar facultatea, se aplic asupra lui R1 o proiecie i se obine relaia R2, n care se afl rspunsul la problema luat n discuie. R1 SELECIE (STUDENT, nume = Barbu Elena) R2 PROIECIE (R1, facultate) Exemplul 12. Care sunt regiunile din care fac parte judeele Dmbovia i Vlcea? Tabela interogat este LOCALITATE. Pentru a rspunde la aceast variant pot fi formulate dou soluii. Soluia 1. R1 SELECIE (LOCALITATE; judet = Valcea) R2 PROIECIE (R1; judet, Soluia 2. R1 SELECIE (LOCALITATE; R2 PROIECIE (R1; judet, R3 SELECIE (LOCALITATE; R4 PROIECIE (R3, judet, R5 R2 R4 judet = Dambovita OR regiune) judet = Dambovita) regiune) judet = Valcea) regiune)

Exemplul 13. Care sunt studenii Facultii de tiine Economice de la specializrile CIG i FA? Tabela interogat este STUDENT, iar rspunsul la aceast ntrebare poate fi formulat n 2 moduri. Soluia 1. R1 SELECIE (STUDENT; facultate = Stiinte Economice AND sectia = CIG OR sectia = FA) R2 PROIECIE (R1; nume, sectia) Soluia 2. R1 SELECIE (STUDENT; facultate = Stiinte Economice AND sectia = CIG) R2 PROIECIE (R1; nume, sectia) R3 SELECIE (STUDENT; facultate = Stiinte Economice AND sectia = FA) R4 PROIECIE (R2; nume, sectia) R5 R2 R4 Exemplul 14. Care sunt crile care au aprut i la editurile Eficient i Macarie? 47

Tabela din care vor fi extrase datele este CARTE. Rezultatul se bazeaz pe intersecia relaiei care conine cr ile aprute la editura Eficient (R2) cu cr ile aprute la editura Macarie (R4). R1 R2 R3 R4 R5 SELECIE (CARTE; editura = Eficient) PROIECIE (R2; titlu) SELECIE (CARTE; editura = Macarie) PROIECIE (R3; titlu) R2 R4

6.4. Jonciunea Dup cum am vzut, produsul cartezian permite fuzionarea a dou tabele ntr-una singur ce conine toate atributele i liniile obinute prin combinarea fiecrui tuplu dintr-o relaia cu fiecare tuplu din cealalt. Jonciunea spre deosebire de produsul cartezian care este o fuziune necondiionat a dou tabele, este o fuziune a dou relaii care au o proprietate comun. Fie dou relaii R1(A1, A2, , An) i R2(B1, B2, , Bp) i Ai i Bj dou atribute definite pe acelai domeniu i q ansamblul operatorilor de comparaie {=, <, >, , , } ce pot fi aplicai celor dou atribute Ai i Bj. Jonciunea relaiei R1, prin Ai cu relaia R2, prin Bj notat R1 (Ai q Bj) R2 este relaia ale crei tupluri sunt obinute prin concatenarea fiecrui tuplu al relaiei R1 cu tuplurile relaiei R2, pentru care este verificat condiia q instituit ntre Ai i Bj. Se noteaz: R1 (Ai q Bj) R2 = {t | t R1 R2 i t(Ai) q t(Bj)}. Jonciunea este echivalent cu un produs cartezian urmat de o selecie. Aceast jonciune este cunoscut n literatura de specialitate sub denumirea de theta-jonciune. n lucrul cu bazele de date relaionale se utilizeaz cu precdere echi-jonciunea, ce reprezint un caz particular al theta-jonciunii, atunci cnd q este operatorul de egalitate =. Se noteaz: R1 (Ai = Bj) R2 = {t | t R1 R2 i t(Ai) = t(Bj)}. Exemplul 15 Theta jonciune Pentru exemplificarea acestui operator se folosesc aceleai dou tabele R1 i R2. Rezultatul jonciunii (theta - jonciunii) exprimat prin expresia R JONCIUNE (R1, R2, R1.C1 > R2.C5), este obinut n 2 pai, dup cum se observ n figura urmtoare: 48

R1 C1 100 200 400 500 900 R2 C3 500 300 400 700 900

C2 AAA AAB ABA BBB ABB

C3 500 750 250 700 400

C4 BBB BAA BBA AAA ABB

C5 300 250 300 500 400

R = SELECIE (R; C1 > C5) C1 C2 R1.C3 R2.C3 400 ABA 250 500 400 ABA 250 300 400 ABA 250 400 500 BBB 700 500 500 BBB 700 300 500 BBB 700 400 500 BBB 700 800 900 ABB 400 500 900 ABB 400 300 900 ABB 400 400 900 ABB 400 700 900 ABB 400 900

C4 BBB BAA BBA BBB BAA BBA ABB BBB BAA BBA AAA ABB

C5 300 250 300 300 250 300 400 300 250 300 500 400

R R1 R2 C1 C2 R1.C3 100 AAA 500 100 AAA 500 100 AAA 500 100 AAA 500 100 AAA 500 200 AAB 750 750 200 AAB 200 AAB 750 200 AAB 750 200 AAB 750 400 ABA 250 400 ABA 250 400 ABA 250 400 ABA 250 400 ABA 250 500 BBB 700 500 BBB 700 500 BBB 700 500 BBB 700 700 500 BBB 900 ABB 400 900 ABB 400 900 ABB 400 900 ABB 400 900 ABB 400

R2.C3 500 300 400 700 300 500 300 400 700 900 500 300 400 700 900 500 300 400 700 900 500 300 400 700 900

C4 BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB

C5 300 250 300 500 400 300 250 300 500 400 300 250 300 500 400 300 250 300 500 400 300 250 300 400 500

Figura 12. Mecanismul de theta-joncionare exemplul 15 Exemplul 16 Echi jonciune Pentru a fi o echijonciune, operatorul de comparaie dintre cele dou atribute este, n mod obligatoriu, semnul de egalitate. R JONCIUNE (R1, R2; R1.C1 = R2.C5)

49

R1 C1 100 200 400 500 900 R2 C3 500 300 400 700 900

C2 AAA AAB ABA BBB ABB

C3 500 750 250 700 400

C4 BBB BAA BBA AAA ABB

C5 300 250 300 500 400

R R1 R2 C1 C2 100 AAA 100 AAA 100 AAA 100 AAA 100 AAA 200 AAB AAB 200 200 AAB 200 AAB 200 AAB 400 ABA 400 ABA 400 ABA 400 ABA 400 ABA 500 BBB 500 BBB 500 BBB 500 BBB 500 BBB 900 ABB 900 ABB 900 ABB 900 ABB 900 ABB

R1.C3 500 500 500 500 500 750 750 750 750 750 250 250 250 250 250 700 700 700 700 700 400 400 400 400 400

R2.C3 500 300 400 700 300 500 300 400 700 900 500 300 400 700 900 500 300 400 700 900 500 300 400 700 900

C4 BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB

C5 300 250 300 500 400 300 250 300 500 400 300 250 300 500 400 300 250 300 500 400 300 250 300 400 500

R = SELECIE (R; C1 = C5) C1 C2 R1.C3 R2.C3 500 BBB 700 700

C4 AAA

C5 500

Figura 13. Echi-jonciune exemplul 16 Exemplul 17 Jonciune natural Jonciunea natural, pe lng faptul c presupune ca operatorul de comparaie s fie semnul de egalitate, implic i denumirea identic a atributelor de legtur ntre cele dou tabele. R JONCIUNE (R1, R2; R1.C3 = R2.C3) sau se poate folosi i forma simplificat, datorit faptului c ambele atribute au acelai nume R JONCIUNE (R1, R2; C3) Avnd n vedere c cele dou atribute au acelai nume, se poate considera c tabela rezultat pstreaz numai unul dintre cele dou atribute.

50

R1 C1 100 200 400 500 900 R2 C3 500 300 400 700 900

C2 AAA AAB ABA BBB ABB

C3 500 750 250 700 400

C4 BBB BAA BBA AAA ABB

C5 300 250 300 500 400

R R1 R2 C1 C2 100 AAA 100 AAA 100 AAA 100 AAA 100 AAA 200 AAB AAB 200 200 AAB 200 AAB 200 AAB 400 ABA 400 ABA 400 ABA 400 ABA 400 ABA 500 BBB 500 BBB 500 BBB 500 BBB 500 BBB 900 ABB 900 ABB 900 ABB 900 ABB 900 ABB

R1.C3 500 500 500 500 500 750 750 750 750 750 250 250 250 250 250 700 700 700 700 700 400 400 400 400 400

R2.C3 500 300 400 700 300 500 300 400 700 900 500 300 400 700 900 500 300 400 700 900 500 300 400 700 900

C4 BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB

C5 300 250 300 500 400 300 250 300 500 400 300 250 300 500 400 300 250 300 500 400 300 250 300 400 500

R = SELECIE (R; R1.C3 = R2.C3) C1 C2 C2 C3 C4 100 AAA 500 BBB 300 500 BBB 700 AAA 500 900 ABB 400 BBA 300

Figura 14. Jonciune natural exemplul 17 Deoarece selecia este un operator care se aplic doar unei singure tabele (operator unar), este necesar fuzionarea tabelelor din care se dorete extragerea datelor pentru obinerea unei relaii agregat, la care se aplic predicatul suplimentar de selecie. Fuzionarea tabelelor este posibil numai prin jonciune. Prin joncionarea tuturor relaiilor dintr-o baz de date se poate ajunge la o relaie universal Exemplul 18. S se afle pentru fiecare student bursier ce tip de burs primete i care este valoarea acesteia. Tabela STUDENT se joncioneaz cu tabela BURSA pe baza atributului comun (nr_matricol) iar la tabela intermediar rezultat, se aplic selecia. 51

R1 JONCIUNE (STUDENT, BURSA, Nr_matricol) R2 PROIECIE (R1; nume, tip_bursa, suma_incasata) Exemplul 19. S se afle numele, facultate i secia studenilor care stau n cminul Miclas. Soluia 1. R1 JONCIUNE (STUDENT, STUDCAMIN; Nr_matricol) R2 SELECIE (R1; nume_camin = MICLAS) R3 PROIECIE (R2; nume, facultate, sectia, nume_camin) Soluia 2. Mai nti se aplic relaia asupra tabelei STUDCAMIN iar tabela intermediar se joncioneaz cu STUDENT. R1 SELECIE (STUDCAMIN; nume_camin = Miclas) R2 JONCIUNE (STUDENT, R1; Nr_matricol) R3 PROIECIE (R2; nume, facultate, sectia, nume_camin) Care dintre cele dou variante este de preferat? A doua variant este mai bun dect prima, deoarece jonciunea opereaz asupra a dou tabele mai reduse ca dimensiuni (tabela STUDCAMIN deja a fost filtrat prin aplicarea predicatului de selecie). Diferena este cu att mai vizibil atunci cnd tabela STUDENT conine toi studenii dintr-o universitate. Iar dac ne gndim c naintea oricrei jonciuni se realizeaz produsul cartezian apare ndrept it amnarea jonciunii, pn cnd aceasta va opera asupra unor tabele cu un numr mai mic de linii i coloane. Exemplul 20. Care sunt crile scrise de Victor Stanciu ? Elementul de noutate n cazul acestui exemplu l reprezint faptul c se dorete obinerea unei informaii ce provine dintr-o relaie (atributul nume_carte din tabela CARTE), pe baza unei condiii aplicate altei relaii (atributul nume_autor din tabela AUTOR), iar cele dou relaii nu sunt n raport de printe copil. n asemenea situaii se recomand folosirea i a altor relaii, n cazul nostru tabela AUTORCARTE. Soluia 1: R1 JONCIUNE (CARTE, AUTORCARTE; cota_carte) R2 JONCIUNE (R1,AUTOR; nume_autor) R3 SELECIE (R2; nume_autor = Victor Stanciu) R4 PROIECIE (R3; titlu) 52

Soluia 2: R1 SELECIE (AUTOR, nume_autor = Victor Stanciu) R2 PROIECIE (R1; nume_autor) R3 JONCIUNE (R2,AUTORCARTE; nume_autor) R4 PROIECIE (R3; Cota_carte) R5 JONCIUNE (R4, CARTE; cota_carte) R6 PROIECIE (R5; titlu) naintea calculrii relaiei intermediare au fost eliminate nu numai tuplurile ci i atributele de prisos. Exemplul 21. Numele studenilor care au mprumutat cri din domeniul Informatic. i n acest caz se dorete obinerea unei informaii ce provine dintr-o tabel (atributul nume din tabela STUDENT) pe baza unei condiii aplicate unei alte tabele iar ntre cele dou tabele nu exist legtur printe copil. De aceast dat se folosete ca legtur tabela STUDCARTE. Soluia 1: R1 JONCIUNE (STUDENT; STUDTCARTE; nr_matricol) R2 JONCIUNE (R1, CARTE; cota_carte) R3 SELECIE (R2; domeniu = Informatica) R4 PROIECIE (R3; nume) Soluia 2: R1 SELECIE (CARTE; domeniu = Informatica) R2 JONCIUNE (R1, STUDCARTE; cota_carte) R3 PROIECIE (R2; nr_matricol) R4 JONCIUNE (R3, STUDENT; nr_matricol) R5 PROIECIE (R4; nume) Exemplul 22. Numele i secia studenilor facultii de tiine Economice care au mprumutat cartea Informatic de gestiune n perioada 15-29 februarie 2004. Relaia rezultat trebuie s conin valori ale atributelor nume i sectia din tabela STUDENT. Predicatul de selecie se aplic ns asupra tabelei CARTE (atributul nume_carte = Informatica de gestiune) i asupra tabelei STUDCARTE (atribut data_mprumut > = 15/02/2004 i < = 29/02/2004). R1 SELECIE (CARTE; titlu = Informatica de gestiune) R2 JONCIUNE (R1, STUD_CARTE; cota_carte) R3 SELECIE (R2; data_imprumut > = 15/02/2004 AND data_imprumut < = 29/02/2004) R4 PROIECIE (R3; nr_matricol) 53

R5 JONCIUNE (R4; STUDENT; nr_matricol) R6 SELECIE (R5; facultate = Stiinte Economice) R7 PROIECIE (R6; nume, sectia) Exemplul 23. De la ce secii sunt studenii care au mprumutat i cartea Informatic de gestiune i Contabilitate general? Rezultatul conine atributul secia din tabela STUDENT, dar predicatul de selecie se aplic asupra tabelei produse. Soluia 1: R1 SELECIE (CARTE; nume_carte = Informatica de gestiune) R2 JONCIUNE (R1, STUD_CARTE; cota_carte) R3 JONCIUNE (R2, STUDENT; nr_matricol) R4 PROIECIE (R3; sectia) R5 SELECIE (CARTE; nume_carte = Contabilitate generala) R6 JONCIUNE (R5, STUDCARTE; cota_carte) R7 JONCIUNE (R6, STUDENT; nr_matricol) R8 PROIECIE (R7; SECTIA) R9 R4 R8 Soluia 2: R1 SELECIE (CARTE; titlu = Informatica de gestiune) R2 JONCIUNE (R1, STUD_CARTE; cota_carte) R3 JONCIUNE (R2, STUDENT; nr_matricol) R4 SELECIE (CARTE; nume_carte = Contabilitate generala) R5 JONCIUNE (R4, STUDCARTE; cota_carte) R6 JONCIUNE (R5, STUDENT; nr_matricol) R7 JONCIUNE (R3; R6; sectia) R8 PROIECIE (R7, sectia) n prima soluie s-a intersectat relaia seciilor studenilor care au mprumutat cartea Contabilitate general (R8). n cea de-a doua variant s-a operat direct jonciunea ntre R3 i R6. Exemplul 24. n ce cmin sunt cazai studenii care au mprumutat crile Informatic de gestiune i Contabilitate general, dar nu au mprumutat cartea Economie politic? Lucrurile n acest caz nu sunt att de complicate precum par la prima vedere, deoarece vom folosi elemente din exemplul anterior, plus operatorul diferen. 54

R1 SELECIE (CARTE; titlu = Informatica de gestiune) R2 JONCIUNE (R1, STUD_CARTE; cota_carte) R3 JONCIUNE (R2, STUDENT; nr_matricol) R4 JONCIUNE (R3, STUDCAMIN; nr_matricol) R5 PROIECIE (R4, nume_camin) R6 SELECIE (CARTE; nume_carte = Contabilitate general) R7 JONCIUNE (R6, STUDCARTE; cota_carte) R8 JONCIUNE (R7, STUDENT; nr_matricol) R9 JONCIUNE (R8, STUDCAMIN; nr_matricol) R10 PROIECIE (R9; nume_camin) R11 SELECIE (CARTE; nume_carte = Economie politica) R12 JONCIUNE (R11, STUDCARTE; cota_carte) R13 JONCIUNE (R12, STUDENT; nr_matricol) R14 JONCIUNE (R13, STUDCAMIN; nr_matricol) R15 PROIECIE (R14; nume_camin) R16 R5 R10 R15 Exemplul 25 Ce studeni studiaz la aceeai secie cu Dinescu Monica? Fa de interogrile de pn acum, condiia de selecie n acest caz este una indirect, n sensul c mai nti trebuie determinat secia la care studiaz Dinescu Monica. Apoi trebuie extrase din tabela STUDENT, liniile pentru care secia are valoarea seciei reper. R1 R2 R3 R4 SELECIE (STUDENT; nume = Dinescu Monica) PROIECIE (R1; sectia) JONCIUNE (R2, STUDENT; sectia) PROIECIE (R3; nume)

6.5. Diviziunea Diviziunea este cel mai complex i mai greu de explicat dintre operatori. Codd l-a imaginat ca un operator invers produsului cartezian. Pentru al defini se pornete de la dou relaii R1(A,B) i R2(B). Diviziunea relaional R1R2 are ca rezultat o relaie definit ca ansamblul subtuplurilor R1(A), pentru care produsul lor cartezian cu R2(B) este un subansamblu al R1(A,B). Rezultatul expresiei R1R2 reprezint ctul diviziunii, ea fiind o relaie ce poate fi notat R3(A). ntr-o alt formulare ai R3 dac i numai dac " bi R2 $ (ai, bi) R1.

55

n continuare pentru simplitate A i B sunt considerate dou atribute, de i ele pot fi i grupe de atribute. n figura de mai jos este prezentat diviziunea relaional. R1 A a1 a2 a3 a1 a3 a4 a1 a3 a6 a1 a3 a4 a1 a2 a3 a5 B b1 b1 b1 b2 b2 b2 b3 b3 b3 b4 b4 b4 b5 b5 b5 b5

R2 B b1 b2 b3 b4 R3 A a1 a2

Figura 15. Diviziunea relaional Determinarea relaiei R3 R1 R2 este sinonim cu a rezolva problema: care dintre a1, a2, a3, a4 i a5 apar n tupluri R1 mpreun cu toate valorile lui B din R2, respectiv b1, b2, b3, b4 i b5? Toate valorile atributului A din R1 sunt parcurse pe rnd: a1 apare cu b1 (n tuplul 1), cu b2 (n tuplul 2), cu b3 (n tuplul 7), cu b4 (n tuplul 10) i cu b5 (n tuplul 13). Prin urmare a1 ndeplinete condiie i va fi inclus n relaia R3; a2 apare cu b1 (n tuplul 2) dar nu apare cu b2 nu va face parte din R3; a3 apare cu b1 (n tuplul 3), cu b2 (n tuplul 5), cu b3 (n tuplul 8), cu b4 (n tuplul 11) i cu b5 (n tuplul 15) ndeplinete condiia i ca fi inclus n R3; a4 nu apare cu b1 nu va face parte din R3; a5 nu apare cu b1 nu va face parte din R3;

56

n urma acestui raionament, tabele R3 va fi alctuit din dou tupluri (a1 i a3). Diviziunea relaional este deosebit de util pentru formularea consultrilor n care apare clauza " (oricare ar fi) Test de evaluare Se consider urmtoarea baz de date: PACIENT (codpacient, nume, prenume, datanasterii, localitate) PROGRAMARE (nrprogramare, dataprogramare, oraprogramare, codpacient) CONSULTATIE (nrconsultatie, tipconsultatie, codpacient, dataconsultatie) MEDICI (codmedic, numemedic, prenumemedic) MEDIC_CONSULTATIE (nrconsultatie, codmedic) TARIFE (tipconsultatie, tarif) Folosind operatorii algebrei relaionale s se determine: 1. Care sunt pacienii din Trgovite; (vezi pag. 63-67)

2. Care sunt pacienii din Trgovite i Titu; (vezi pag. 63-67)

3. Care pacieni nu sunt din Trgovite i Titu; (vezi pag. 63-67)

4. Care sunt pacienii care s-au nscut n anul 1989; (vezi pag. 63-67)

57

5. Care sunt tarifele mai mari de 25 RON; (vezi pag. 63-67)

6. Din ce localiti sunt pacienii din baz; (vezi pag. 63-67)

7. Care este nume i prenumele medicilor care ofer consultaii; (vezi pag. 63-67)

8. Care sunt tarifele practicate; (vezi pag. 63-67)

9. Din ce localitate sunt pacienii nscui n luna ianuarie 1990; (vezi pag. 63-67)

10. Care sunt orele pentru care sunt prevzute consultaii n data de 09.02.2006; (vezi pag. 63-67)

58

11. Cum se numesc (vezi pag. 63-67)

pacienii

din

Trgovite

Moreni;

12. Care este prenumele medicilor cu numele de familie Ghionea; (vezi pag. 63-67)

13. La ce data i la ce or are programare Popa Georgeta; (vezi pag. 63-67)

14. Care sunt datele la care au fcut programare pacienii din Trgovite; (vezi pag. 63-67)

15. Numele pacienilor care au fost consultai n luna februarie 2006; (vezi pag. 63-67)

16. Data la care a fcut programare Dinescu Mircea i Vancea Ioan; (vezi pag. 63-67)

59

17. Numele medicilor care au acordat consultaii n data de 23.02.2006; (vezi pag. 63-67)

18. De ce medic a fost consultat Popa Georgeta; (vezi pag. 63-67)

19. Numele pacienilor consultai de Grecu Anca; (vezi pag. 63-67)

20. Nume pacienilor care au fcut programare i n luna ianuarie i n luna februarie 2006; (vezi pag. 63-67)

60

21. Care este tariful consultaiei pacientului Popa Georgeta; (vezi pag. 63-67)

22. Numele pacienilor care au fcut programare n data de 10.02.2006 n intervalul 14-16; (vezi pag. 63-67)

23. Datele la care au efectuat consultaii Grecu Anca i Minea Ion n luna februarie 2006; (vezi pag. 63-67)

61

24. Numele i prenumele medicilor care au consultat pacieni din Trgovite i Moreni dar nu din Titu; (vezi pag. 63-67)

25. Numele pacienilor consultai de Grecu Anca n luna februarie 2006; (vezi pag. 63-67)

62

26. Data la care au fost consultai pacienii care au fcut programare n data de 10.02.2006; (vezi pag. 63-67)

27. Nume pacienilor care au avut programare n data de 10.20.2006 n intervalul 12-14 i au fost consultai de ctre Grecu Anca. (vezi pag. 63-67)

Rezolvare tem de autoevaluare 1. Care sunt pacienii din Trgovite; R1 SELECIE(PACIENT; localitate=Targoviste) 2. Care sunt pacienii din Trgovite i Titu; R1 SELECIE(PACIENT; localitate=Targoviste or localitate=Titu) 3. Care pacieni nu sunt din Trgovite i Titu; R1 SELECIE(PACIENT; localitate<>Targoviste and localitate<>Titu) sau R1 SELECIE(PACIENT; localitate=Targoviste or localitate=Titu) R2 PACIENT R1 63

4. Care sunt pacienii care s-au nscut n anul 1989; R1 SELECIE(PACIENT; datanasterii>= 01/01/1989 and datanasterii<= 31/12/1989) 5. Care sunt tarifele mai mari de 25 RON; R1 SELECIE(TARIFE; tarif>25) 6. Din ce localiti sunt pacienii din baz; R1 PROIECIE(PACIENT; localitate) 7. Care este nume i prenumele medicilor care ofer consultaii; R1 JONCIUNE(MEDICI; MEDIC_CONSULTATIE; codmedic) R2 PROIECIE(R1; numemedic, prenumemedic) 8. Care sunt tarifele practicate; R1 PROIECIE(TARIFE; tarif) 9. Din ce localitate sunt pacienii nscui n luna ianuarie 1990; R1 SELECIE(PACIENT; datanasterii>= 01/01/1990 and datanasterii<= 31/01/1990) R2 PROIECIE(R1; localitate) 10. Care sunt orele pentru care sunt prevzute consultaii n data de 09.02.2006; R1 SELECIE(CONSULTATIE; dataconsultatie = 09/02/2006) R2 JONCIUNE(R1, PROGRAMARE; nrconsultatie) R3 PROIECIE(R2; oraprogramare) 11. Cum se numesc pacienii din Trgovite i Moreni; R1 SELECIE(PACIENT; localitate = Targoviste) R2 PROIECIE(R1; nume) R3 SELECIE(PACIENT; localitate = Titu) R4 PROIECIE(R3; nume) R5 R2 R4 12. Care este prenumele medicilor cu numele de familie Ghionea; R1 SELECIE(MEDICI; numemedic = Ghionea) R2 PROIECIE(R1; prenumemedic) 13. La ce data i la ce or are programare Popa Georgeta; R1 SELECIE(MEDICI; numemedic = Ghionea) R2 PROIECIE(R1; prenumemedic) 14. Care sunt datele la care au fcut programare pacienii din Trgovite; R1 SELECIE(PACIENT; localitate = Targoviste) R2 JONCIUNE(R1, PROGRAMARE; codpacient) R3 PROIECIE(R3; dataprogramare, oraprogramare) 64

15. Numele pacienilor care au fost consultai n luna februarie 2006; R1 JONCIUNE(PACIENT, PROGRAMARE; codpacient) R2 JONCIUNE(R1, CONSULTATIE; nrconsultatie) R3 SELECIE(R2; dataconsultatie >= 01/02/2006 and dataconsultatie <= 28/02/2006) R4 PROIECIE(R3; nume, prenume) 16. Data la care a fcut programare Dinescu Mircea i Vancea Ioan; R1 SELECIE(PACIENT; nume = Dinescu and prenume = Mircea) R2 JONCIUNE(R1, PROGRAMARE; codpacient) R3 PROIECIE(R2, dataprogramare) R4 SELECIE(PACIENT; nume = Vancea and prenume = Ioan) R5 JONCIUNE(R4, PROGRAMARE; codpacient) R6 PROIECIE(R5, dataprogramare) R7 R4 R6 17. Numele medicilor care au acordat consultaii n data de 23.02.2006; R1 SELECIE(CONSULTATIE; dataconsultatie = 23/02/2006) R2 JONCIUNE(R1, MEDIC_CONSULTATIE; nrconsultatie) R3 JONCIUNE(R2, MEDICI; codmedic) R4 PROIECIE(RE; numemedic, prenumemedic) 18. De ce medic a fost consultat Popa Georgeta; R1 JONCIUNE(PACIENT, CONSULTATIE; codpacient) R2 JONCIUNE(R1, MEDIC_CONSULTATIE; nrconsultatie) R3 JONCIUNE(R2, MEDICI; codmedic) R4 SELECIE(R3; nume = Popa and prenume = Georgeta) R5 PROIECIE(R4; numemedic, prenumemedic) 19. Numele pacienilor consultai de Grecu Anca; R1 SELECIE(MEDICI; numemedic = Grecu and prenumemedic = Anca) R2 JONCIUNE(R1, MEDIC_CONSULTATIE; codmedic) R3 JONCIUNE(R2, CONSULTATIE; nrconsultatie) R4 JONCIUNE(R3, PACIENT; codpacient) R5 PROIECIE(R4; nume, prenume) 20. Nume pacienilor care au fcut programare i n luna ianuarie i n luna februarie 2006; R1 JONCIUNE(PACIENT, CONSULTATIE; codpacient) R2 SELECIE(R1; dataprogramare >= 01/01/2006 and dataprogramare <= 31/01/2006) R3 SELECIE(R1; dataprogramare >= 01/02/2006 and dataprogramare <= 2831/02/2006) R4 R2 R3 R5 PROIECIE(R4; nume, prenume) 65

21. Care este tariful consultaiei pacientului Popa Georgeta; R1 SELECIE(PACIENT; nume = Popa and prenume = Georgeta) R2 JONCIUNE(R1, CONSULTATIE; codpacient) R3 JONCIUNE(R2, TARIFE; nrconsultatie) R4 PROIECIE(R3; tarif) 22. Numele pacienilor care au fcut programare n data de 10.02.2006 n intervalul 14-16; R1 SELECIE(PROGRAMARE; dataprogramare = 10/02/2006) R2 SELECIE(R1; oraprogramare>= 14 and oraprogramare <=16) R3 JONCIUNE(R2, PACIENT; codpacient) R4 PROIECIE(R3; nume, prenume) 23. Datele la care au efectuat consultaii Grecu Anca i Minea Ion n luna februarie 2006; R1 SELECIE(MEDICI; numemedic = Grecu and prenumemedic = Anca) R2 JONCIUNE(R1, MEDIC_CONSULTATIE; codmedic) R3 JONCIUNE(R2, CONSULTATIE; nrconsultatie) R4 SELECIE(R3; dataconsultatie >= 01/02/2006 and dataconsultatie <= 28/02/2006) R5 PROIECIE(R4; dataconsultatie) R6 SELECIE(MEDICI; numemedic = Minea and prenumemedic = Ion) R7 JONCIUNE(R6, MEDIC_CONSULTATIE; codmedic) R7 JONCIUNE(R7, CONSULTATIE; nrconsultatie) R9 SELECIE(R8; dataconsultatie >= 01/02/2006 and dataconsultatie <= 28/02/2006) R10 PROIECIE(R9; dataconsultatie) R11 R5 R10 24. Numele i prenumele medicilor care au consultat pacieni din Trgovite i Moreni dar nu din Titu; R1 JONCIUNE(MEDICI, MEDIC_CONSULTATIE; codmedic) R2 JONCIUNE(R1, CONSULTATIE; nrconsultatie) R3 JONCIUNE(R2, PACIENT; codpacient) R4 SELECIE(R3; localitate = Targoviste) R5 PROIECIE(R4; numemedic, prenumemedic) R6 SELECIE(R3; localitate = Moreni) R7 PROIECIE(R6; numemedic, prenumemedic) R8 SELECIE(R3; localitate = Titu) R9 PROIECIE(R8; numemedic, prenumemedic) R10 R5 R7 R9

66

25. Numele pacienilor consultai de Grecu Anca n luna februarie 2006; R1 SELECIE(MEDICI; numemedic = Grecu and prenumemedic = Anca) R2 JONCIUNE(R1, MEDIC_CONSULTATIE; codmedic) R3 JONCIUNE(R2, CONSULTATIE; nrconsultatie) R4 SELECIE(R3; dataconsultatie >= 01/02/2006 and dataconsultatie <= 28/02/2006) R5 JONCIUNE(R4, PACIENT; codpacient) R6 SELECIE(R5; nume, prenume) 26. Data la care au fost consultai pacienii care au fcut programare n data de 10.02.2006; R1 JONCIUNE(PACIENT, PROGRAMARE; codpacient) R2 SELECIE(R1; dataprogramare = 10/02/2006) R3 JONCIUNE(R2, CONSULTATIE; nrconsultatie) R4 PROIECIE(R3; dataconsultatie) 27. Nume pacienilor care au avut programare n data de 10.20.2006 n intervalul 12-14 i au fost consultai de ctre Grecu Anca. R1 JONCIUNE(PACIENT, PROGRAMARE; codpacient) R2 JONCIUNE(R1, CONSULTATIE; nrconsultatie) R3 JONCIUNE(R2, MEDIC_CONSULTATIE; nrconsultatie) R4 JONCIUNE(R3, MEDICI; codmedic) R5 SELECIE(R4; dataprogramare = 10/02/2006) R6 SELECIE(R5; oraprogramare >= 12 and oraprogramare <=16) R7 SELECIE(R6; numemedic = Grecu and prenume Anca) R8 PROIECIE(R7; nume, prenume)

BIBLIOGRAFIE SELECTIV 1. Michael Hernandez Proiectarea bazelor de date, Editura Teora, Bucureti, 2003 2. Mariana Milo escu Baze de date n Visual FoxPro, Editura Teora, 2003 3. Marin Fotache, Proiectarea bazelor de date, Editura Polirom, Iai, 2005 4. Grupul BDASEIG, Baze de date. Fundamente teoretice i practice, Editura Infomega, Bucureti, 2002 5. Florin Radu, Baze de date, Editura Bibliotheca, Trgovite, 2007 67

M.3. LIMBAJUL DE INTEROGARE RELAIONAL SQL.


1. 2. 3. 4. 5. Cuprins Obiectiv general Obiective operaionale Dezvoltarea temei Bibliografie selectiv

Cuprins UI.7. Prezentare general; Elemente de baz ale interogrilor SQL; = 0,5 ore UI.8. Coloane expresii; Opiunea ORDER BY; = 0,5 ore UI.9. Operatorii LIKE, BETWEEN, IN; = 2 ore UI.10. Theta i echijonciunea; = 3 ore UI.11. Sinonime locale i jonciunea unei tabele cu ea nsi; = 1 ore UI.12. Subconsultri; = 2 ore UI.13. Funcii agregat: COUNT, SUM, AVG, MIN i MAX); = 2 ore UI.14. Gruparea tuplurilor: clauza GROUP BY i clauza HAVING = 1 ore

68

Obiectiv general: Dobndirea cunotinelor fundamentale privind limbajul relaional de interogare SQL Obiective operaionale: nsuirea cunotinelor privind elementele de baz ale SQL, modul de operare al unei fraze SELECT impreun cu clauzele obligatorii i cele opionale: FROM, WHERE, ORDER BY, GROUP BY sau HAVING

69

UNITATEA DE NVARE 7 PREZENTARE GENERAL; ELEMENTE DE BAZ ALE INTEROGRILOR

7.1. Prezentare general n prezent SQL (Structured Query Language) este unul dintre cele mai puternice limbaje structurate pentru interogarea bazelor de date relaionale. Literele S de la Structured (structurat) i L de la Language (limbaj) sunt destul de sugestive, n schimb, litera Q de la Query (interogare), dac este analizat din punct de vedere literal, poate provoca unele confuzii n sensul c se limiteaz doar la a pune ntrebri bazei de date. Din fericire, SQL face mult mai mult dect att: se pot crea tabele, se adaug, se modific sau se terg date, se combin i se memoreaz interogrile n cadrul bazei de date. Istoria SQL ncepe n laboratoarele firmei IBM, unde limbajul a fost dezvoltat n ultimii ani ai deceniului 8, odat cu lansarea proiectului System/R. Dei este uor accesibil utilizatorilor nceptori, el nu rmne dator nici programatorilor experimentai, punndu-le la dispoziie faciliti deosebite. Datorit puterii sale relaionale, a uurinei n nelegere i utilizare, SQL a fost ales de ANSI (American National Standards Organization Organizaia pentru Standarde Naionale Americane) i apoi de ctre ISO (International Standards Organization Organizaia pentru Standarde Internaionale) drept limbaj standard pentru lucru cu baze de date relaionale. Pe parcursul acestui curs standardul pentru SQL avut n vedere este standardul ANSI-92. Standardul SQL-92 propune 3 niveluri de conformitate: nivelul de intrare (entry level), nivelul intermediar (intermediate level) i nivelul maximal (full level). Fiecare firm i declar nivelul de conformitate al propriului SGBD n raport de SQL-92. Limbajul SQL este un limbaj neprocedural (sau declarativ), termenul de neprocedural fiind vzut mai degrab prin ce dect prin cum, n sensul c nu se specific dect ce informaie este solicitat i nu cum este obinut aceast informaie. SQL poate fi utilizat autonom (manipularea interactiv a bazei de date) sau poate fi utilizat prin inserare de comenzi SQL ntr-un limbaj de programare.

70

Instruciunile SQL n funcie de rolul avut n manipularea datelor i a tranzaciilor se pot grupa astfel: instruciuni pentru definirea datelor care asigura descrierea structurii bazei de date; instruciuni de manipulare a datelor ce au ca scop adugarea, modificarea i tergerea nregistrrilor; instruciuni de selecie a datelor care permit consultarea bazei de date; instruciuni de procesare a tranzaciilor ce reprezint operaii multiple de manipulare a datelor; instruciuni de control al cursorului; instruciuni privind controlul accesului la date. Exist trei metode de baz privind implementarea limbajului SQL: prin apelare direct (Direct Invocation) care presupune introducerea instruciunilor SQL direct de la prompter; metoda modular (Modul Language) care folosete proceduri apelate de programele aplicaiei; metoda de tip ncapsulat (Embedded SQL) care permite ncapsularea instruciunilor n codul de program. 7.2. Elemente de baz ale interogrilor SQL

Modalitatea prin care, pornind de la o schem relaional, pot fi obinute diverse informaii dintr-o baz de date se numete interogare (QUERY), iar formularea unei interogri nseamn redactarea unei fraze SELECT. Termenul de interogare este oarecum impropriu. O interogare SQL nu este neaprat o ntrebare pus bazei de date. Ea poate fi i o comand pentru executarea uneia din aciunile urmtoare: - s construiasc sau s tearg o baz de date; - s insereze, s modifice sau s tearg linii sau cmpuri; - s caute n cteva tabele o anumit informaie i s returneze rezultatele ntr-o anumit ordine; - s modifice securitatea informaiilor. O fraz SELECT are un format simplu i flexibil. Cele trei clauze principale sunt SELECT, FROM i WHERE dintre care doar primele dou sunt obligatorii. 71

Sintaxa oarecum simplificat a unei interogri SQL este urmtoarea: SELECT [ALL/DISTINCT/] lista_atribute FROM nume-tabele [WHERE criteriu_de_cutare] [GROUP BY atribut_de_grupare] [HAVING criteriu_de_grupare] [ORDER BY criteriu_de_ordonare [ASC/DESC]]; unde: lista_atribute nume-tabele ALL DISTINCT WHERE ORDER BY GROUP BY - specific atributele ale cror valori vor fi returnate - specific tabelele din care se vor extrage datele specific returnarea tuturor tuplurilor care ndeplinesc condiiile precizate n blocul de cerere - elimin tuplurile care prezint valori duplicate coninute n atributele specificate - permite, prin precizarea unei expresii, exprimarea criteriului de selecie - precizeaz atributul dup care se va face ordonarea - folosit pentru a partiiona o relaie n grupuri, acordnd acestora valori pe un atribut sau list de atribute HAVING - folosit pentru a specifica criterii de selecie pe grupuri de tupluri n continuare este realizat o paralel ntre clauzele principale ale frazei SELECT cu operatorii algebrei relaionale prezentai n capitolul 3 Algebra relaional. Selecie i proiecie Clauza SELECT n algebra relaional corespunde operatorului proiecie, ea fiind folosit pentru a desemna care sunt coloanele care vor aprea n rezultat. Clauza FROM este folosit pentru a enumera tabelele (relaiile) din care vor fi extrase informaiile aferente consultrii. Prin clauze WHERE este desemnat predicatul selectiv al algebrei relaionale, ce se aplic atributelor din relaiile care apar n clauza FROM. O consultare simpl n SQL, la modul cel mai general i simplist, poate fi prezentat astfel: 72

SELECT C1, C2, ..., Cn FROM T1, T2, ..., Tm WHERE P Rezultatul unei astfel de fraze SQL se prezint sub o form tabelar. Aceast form poate fi o list (text), o tabel propriu-zis sau o tabel temporar, dar i o tabel derivat (imagine). Sunt i cazuri n care rezultatul poate fi obinut i ca o variabil masiv (tablou). Ci reprezint coloanele (care pot fi atribute sau expresii de atribute rezultat); Tj tabelele ce trebuie parcurse pentru obinerea rezultatului; P predicatul (condiia) simplu sau compus ce trebuie ndeplinit de tupluri pentru a putea fi incluse n rezultat. Atunci cnd clauza WHERE nu este prezent , se consider n mod implicit c valoarea logic a predicatului P este adevrat i n consecin, toate liniile din tabela sau produsul cartezian al tabelelor specificat/specificate n clauza FROM vor fi incluse n rezultat. Dac n locul coloanelor C1, C2, ..., Cn, apare simbolul * (asterisc), rezultatul va fi format din toate atributele tabelelor specificate n clauza FROM. De asemenea, numele atributelor rezultatului sunt numele atributelor din tabela (tabelele) specificat n FROM. Dac se dorete schimbarea acestui nume rezultat se apeleaz la clauza AS. Conform restriciei de unicitate, ntr-o relaie nu pot exista dou linii identice. n schimb, n SQL, tabela obinut dintr-o consultare poate conine dou sau mai multe tupluri identice. Spre deosebire de algebra relaional, unde tuplurile identice (dublurile) sunt eliminate automat din rezultat, n SQL nu se ntmpl acelai lucru. Pentru aceasta este necesar folosirea opiunii DISTINCT. SELECT DISTINCT C1, C2, ..., Cn FROM T1, T2, ..., Tm WHERE P Din cele prezentate pn acum se poate trage concluzia c o fraz SELECT corespunde: - unei proiecii (SELECT C1), - unui produs cartezian (FROM R1 R2 ... Rm), - unei selecii algebrice (WHERE P).

73

i conduce la obinerea unui rezultat cu n coloane, fiecare coloan fiind un atribut din T1, T2, ..., Tm sau expresie calculat pe baza unor atribute din T1, T2, ..., Tm. n continuare vom transpune n SQL, cteva interogri din algebra relaional. Exemplul 1. Selecie SELECT * FROM R1 WHERE C1>500 Exemplul 2. Selecie SELECT * FROM R1 WHERE C3>250 AND C3<=350 Exemplul 3. Selecie SELECT * FROM R1 WHERE C1>300 AND C3>300 Exemplul 4. Care sunt studenii Facultii de tiine Economice? SELECT * FROM STUDENT WHERE facultate = Stiinte Economice Exemplul 5. Care sunt studenii Facultii de tiine Economice, specializarea Contabilitate i Informatic de Gestiune? SELECT * FROM STUDENT WHERE facultate = Stiinte Economice AND specializare = CIG Exemplul 6. Ce burse au fost ridicate n februarie 2004? Formatul general al unei constante de tip dat calendaristic este YYYYMM-DD, interogarea n SQL-92 poate avea forma. SELECT * FROM BURSA WHERE data_ncasarii>=2004/02/01 AND data_ncasarii<=2004/02/29 n Visual FoxPro aceeai interogare este de forma: 74

SELECT *; FROM BURSA; WHERE data_ncasarii>={^2004/02/01} AND; data_ncasarii<={^2004/02/29} Observaie: n Visual Foxpro caracterul ; este folosit pentru a specifica faptul c o comand este scris pe mai multe linii. Exemplul 7. Proiecie SELECT C3 FROM R1 Exemplul 8. Proiecie SELECT C1, C3 FROM R1 Exemplul 9. Care sunt facultile preluate n baz? SELECT facultate FROM STUDENT SQL, spre deosebire de algebra relaional, nu elimin automat duplicatele. Tabela obinut prin consultarea de mai sus are forma tabelei R (figura 3.13.). Pentru a obine rezultatul de forma tabelei R (o facultate s apar o singur dat), se folosete clauza DISTINCT. Exemplu 10. Care sunt: cota, titlul, domeniul i numr de exemplare al fiecrei cri? SELECT cota_carte, titlu, domeniu, nr_exemplare FROM CARTE n acest caz nu este necesar clauza DISTINCT, deoarece cota_carte este cheia primar a tabelei CARTE. Exemplul 11. Care este facultatea pe care o urmeaz studentul Barbu Costel? SELECT facultate FROM STUDENT WHERE nume = Barbu Costel Exemplul 12. Care sunt regiunile din care fac parte judeele Dmbovia i Vlcea? 75

SELECT judet, regiune FROM LOCALITATE WHERE judet = Dambovita OR JUDE = Valcea Exemplul 13. Care sunt studenii Facultii de tiine Economice de la specializrile CIG i FA? SELECT nume, sectia FROM STUDENT WHERE facultate = Stiinte Economice AND sectia = CIG OR sectia = FA Exemplul 14. Care sunt crile care au aprut la editurile Eficient i Macarie? SELECT titlu FROM CARTE WHERE editura = Eficient OR editura = Macarie

Reuniune, intersecie, diferen, produs cartezian Primii trei operatori asambliti prezint operatori SQL dedicai: UNION, INTERSECT, MINUS (EXTRACT) n timp ce produsul cartezian se obine automat prin simpla enumerare a celor dou tabele n clauza FROM. Reuniunea Un rezultat identic cu tabela R3 din figura 3.2., se obine prin urmtoarea fraz SELECT: SELECT * FROM R1 UNION SELECT * FROM R2 Revenind la exemplul 13 din capitolul 3 - Care sunt studenii Facultii de tiine Economice de la specializrile CIG i FA? -, fraza SQL echivalent cu soluia 2 bazat pe reuniune este: SELECT nume FROM STUDENT WHERE facultate = Stiinte Economice AND sectia = CIG UNION SELECT nume FROM STUDENT WHERE facultate = Stiinte Economice AND sectia = FA

76

Intersecia Raportndu-ne la exemplul din figura 33. , echivalentul tabelei R4 se obine n SQL prin: SELECT * FROM R1 INTERSECT SELECT * FROM R2 Pentru o prim reprezentare a utilizrii interseciei, transcriem soluia din algebra relaional formulat la exemplul 14 - Care sunt crile care au aprut la editurile Eficient i Macarie? SELECT titlu FROM CARTE WHERE editura = Eficient INTERSECT SELECT tilu FROM CARTE WHERE editura = Macarie Exemplul de mai sus funcioneaz n Oracle, nu ns i n Visual FoxPro, care nu are implementat operatorul INTERSECT, astfel nct intersecia trebuie realizat folosind alte clauze i operatori. Diferena Operatorul la care ne-am atepta n acest caz ar fi MINUS. n Standardul SQL 92 i n alte cteva SGBD-uri operatorul MINUS nu exist , el fiind substituit de EXCEPT, n timp ce n alte SGBD-uri nu exist nici unul, nici altul. Tabela R5 din figura 3.4., calculat prin expresia R1 R2, n SQL se obine prin interogarea: SELECT * FROM R1 EXCEPT SELECT * FROM R2 Ca i pentru INTERSECT, Visual FoxPro nu are implementat un operator SQL pentru realizarea diferenei a dou relaii. Avnd n vedere faptul c intersecia nu este un operator fundamental, fraza SELECT ce realizeaz intersecia se poate formula cu ajutorul diferenei astfel: 77

SELECT * FROM R1 EXCEPT (SELECT * FROM R1 EXCEPT SELECT * FROM R2)

Produsul cartezian SQL nu pune la dispoziie vreun operator special dedicat produsului cartezian i asta din simplul motiv c nici nu este nevoie s o fac. Tabela R6 din figura 3.5., se obine pur i simplu prin enumerarea celor dou relaii n clauza FROM. SELECT * FROM R1, R2

78

UNITATEA DE NVARE COLOANE EXPRESII; OPIUNEA ORDER BY 8.1. Coloane expresii n multe interogri SQL o facilitate important o constituie definirea, pe lng atributele tabelelor, a unor coloane noi (virtuale), pe baza unor expresii. Clauza AS permite denumirea coloanelor calculate sau redenumirea unor coloane ale tabelelor. S lum urmtorul exemplu: Care este suma cheltuit cu achiziionarea crii Informatic de gestiune? SELECT titlu, pret_unitar, nr_exemplare, pret_unitar*nr_exemplare AS suma FROM CARTE WHERE titlu = Informatica de gestiune A patra coloan este denumit suma, dup cum a fost specificat n clauza AS. Valorile sale sunt determinate pe baza expresiei pret_unitar*nr_exemplare. Un alt tip de expresii este cel bazat pe concatenare, adic pe alipirea mai multor constante i variabile ntr-o coloan nou. Operatorul SQL pentru concatenare este alctuit din dou bare verticale (||). Spre exemplu, interogarea urmtoare produce rezultatul din figura 4.2. . SELECT Judeul || judet || se afl n || regiune AS exemplu_concatenare FROM LOCALITATE Unele SGBD-uri, precum Visual FoxPro, nu au implementat acest operator, folosind n acest scop unul specific (n cazul VFP este +). SELECT DISTINCT "Judetul " + ALLTRIM(judet)+; " se afla n " + regiune AS; exemplu_concatenare FROM LOCALITATE S-a folosit funcia ALLTRIM() pentru a elimina toate spaiile goale din judet. Visual FoxPro folosete pentru conversia valorilor din numeric n ir de caractere funcia STR(), iar din dat calendaristic, dup caz, DTOC() sau DTOS(): 79

SELECT ALLTRIM(Nume) + cu numrul matricol ; + ALLTRIM(STR (nr_matricol)) + s-a nscut; n data + ALLTRIM(DTOC(data_nasterii)); AS exemplu_concatenare; FROM STUDENT n ceea ce privete expresiile de tip dat calendaristic, modurile n care au fost implementate aceste funciuni sunt foarte eterogene de la SGBD la SGBD. S presupunem c orice carte mprumutat trebuie restituit n maximum 10 zile. Visual Fox Pro permite formularea unei soluii simple. data_imprumut fiind un atribut de tip DATE, se consider implicit dac adunm 10, c acest 10 reprezint numrul de zile. SELECT cota_carte, data_imprumut, ; data_imprumut + 10 AS data_restituire ; FROM STUDCARTE Dac am presupune c o carte mprumutat poate fi restituit peste 3 luni, interogarea de mai sus trebuie modificat astfel: SELECT cota_carte, data_imprumut, GOMONTH ; (data_imprumut, 3) AS data_restituire ; FROM STUDCARTE Dac vrem s punem n eviden operaiunile de adunare i scdere ntre dou date calendaristice, s lum exemplul n care ne intereseaz intervalul dintre momentul curent (data curent ) i momentul mprumut rii fiecrei cri: Interogarea n Visual Fox Pro n acest caz este: SELECT cota_carte, data_imprumut, DATE() ; data_imprumut AS timp_scurs ; Rezultatul scderii a dou date calendaristice este un numeric care reprezint numrul de zile dintre cele dou date. 8.2. Opiunea ORDER BY Una din caracteristicile modelului relaional este faptul c din punct de vedere informaional, nici ordinea atributelor, nici ordinea liniilor n relaii nu prezint importan. Cu toate acestea, n practic forma de prezentare a

rezultatelor interogrii este foarte important. Spre exemplu o list a tuturor

80

localitilor este cu mult mai folositoare dac este prezentat n ordine alfabetic, posibil prin clauza ORDER BY. S se obin lista localitilor n ordine alfabetic. SELECT * FROM LOCALITATE ORDER BY nume_localitate Implicit aranjarea se face cresctor (ASC). Prin opiunea DESC, ordinea prezentrii se inverseaz. n plus se pot specifica mai multe coloane care s serveasc drept criterii suplimentare de ordonare. La valori egale ale primului atribut, intr n aciune criteriul de balotaj care este al doilea atribut .a.m.d. S se obin n ordinea descresctoare a editurilor i cresctoare a titlurilor, lista crilor din bibliotec. SELECT cota_carte, titlu, editura FROM CARTE ORDER BY editura DESC, titlu ASC

81

UNITATEA DE NVARE 9 OPERATORII BETWEEN, LIKE, IN Pentru formularea predicatului de selecie, SQL permite utilizarea, pe lng clasicii >, , <, , =, i a altor operatori, dintre care noi ne vom opri doar asupra lui BETWEEN (ntre, cuprins ntre), LIKE (ca i, la fel ca) i IN (n). 9.1. Operatorul BETWEEN Este util pentru definirea intervalelor de valori. Care sunt studenii care s-au nscut n anul 1982. n Visual Fox Pro constantele de tip dat calendaristic trebuie ncadrate ntre acolade. SELECT * ; FROM STUDENT ; WHERE data_nasterii BETWEEN {^1982/01/01} ; and {^1982/12/31} Soluia la exemplul de mai sus, n condiiile n care nu se folosea BETWEEN, ar fi folosit n clauza WHERE, o condiie compus. SELECT * ; FROM STUDENT ; WHERE data_naterii > = {^1982/01/01} ; AND data_naterii < = {^1982/12/31} S se obin n ordinea apariiei, lista crilor din bibliotec cu numrul de exemplare cuprins ntre 50 i 100. SELECT titlu, an_aparitie, nr_exemplare FROM CARTE WHERE nr_exemplare BETWEEN 50 AND 100 ORDER BY an_aparitie Soluia fr BETWEEN: SELECT titlu, an_aparitie, nr_exemplare FROM CARTE WHERE nr_exemplare >= 50 AND nr_exemplare <= 100 ORDER BY an_aparitie S se obin n ordinea descresctoare a judeelor, lista localitilor cu indicativul judeului cuprins ntre DB (Dmbovia) i VL (Vlcea). 82

SELECT cod_judet, nume_localitate, cod_localitate FROM LOCALITATE WHERE cod_judet BETWEEN DB AND VL ORDER BY cod_judet DESC Varianta fr BETWEEN: SELECT cod_judet, nume, cod_localitate FROM LOCALITATE WHERE cod_judet > = DB AND cod_judet < = VL ORDER BY cod_judet DESC 9.2. Operatorul LIKE

De multe ori, cnd se dorete obinerea unor informaii din baz suntem pui n postura de a nu ti cu exactitate cum se numete un student sau o carte. Acestea sunt situaiile pentru a cror rezolvare a fost gndit operatorul LIKE. Operatorul LIKE permite compararea unui atribut (expresii) cu un literal utiliznd o masc construit cu ajutorul specificatorilor multipli % sau _ . Procentul (%) substituie un ir de lungime variabil, 0-n caractere, n timp ce liniua (_) substituie un singur caracter. Care sunt crile din bibliotec care ncep cu litera C?. SELECT * FROM CARTE WHERE titlu LIKE C% Varianta fr LIKE (n VFP): SELECT * ; FROM CARTE ; WHERE LEFT(titlu,1)='C' S-a folosit funcia LEFT() pentru a extrage prima liter din titlu. Ce cri au titlul coninnd litera l pe a treia poziie? SELECT * FROM CARTE WHERE titlu LIKE __l% Dac exist cr i al cror titlu conine litera L majuscul pe a treia poziie, acestea nu sunt extrase n rezultat. Pentru siguran, n asemenea situaii, soluia este: 83

SELECT * FROM CARTE WHERE titlu LIKE __l% OR titlu LIKE __L% Varianta fr LIKE (n VFP):: SELECT * ; FROM CARTE ; WHERE SUBSTR(titlu,3,1)='l' OR ; SUBSTR(titlu,3,1)='L' S-a folosit funcia SUBSTR() pentru a extrage un subir (litera L) dintr-un ir (titlu) Titlul cror cri se termin n literele te? SELECT * FROM CARTE WHERE titlu LIKE %te Varianta fr LIKE (n VFP): SELECT * ; FROM CARTE ; WHERE RIGHT(ALLTRIM(titlu),2)=te Observm folosirea funcie RIGHT() pentru a extrage caracterele din dreapta n combinaie cu funcia ALLTRIM(). 9.3. Operatorul IN

Atunci cnd se testeaz dac valoarea unui atribut este ncadrabil ntr-o list dat de valori, n locul folosirii abundente a operatorului OR, o solu ie mult mai elegant este s se fac apel la operatorul IN. Formatul general este: expresie1 IN (expresie2, expresie3, ...) Rezultatul evalurii unui predicat ce conine acest operator va fi adevrat dac valoarea expresiei1 este cel puin egal cu una dintre valorile expresie2, expresie3, .... Care sunt studenii care urmeaz specializrile CIG, MG i MK? - fr operatorul IN SELECT * FROM STUDENT WHERE sectia = CIG OR sectia = MG 84

OR sectia = MK - cu operatorul IN SELECT * FROM STUDENT WHERE sectia IN (CIG, MG, MK) - o variant VFP: SELECT * ; FROM STUDENT ; WHERE INLIST(sectia, CIG, MG, MK) Care sunt crile care au aprut n anii 1999, 2001 i 2002? - fr operatorul IN SELECT * FROM CARTE WHERE an_aparitie=1999 OR an_aparitie=2001 or an_aparitie=2002 - cu operatorul IN SELECT * FROM CARTE WHERE an_aparitie IN (1999, 2001, 2002) - o variant VFP: SELECT * ; FROM CARTE ; WHERE INLIST(an_aparitie, 1999, 2001, 2002) Ce burse s-au ncasat pe 16, 18 i 20 februarie 2004? - fr operatorul IN SELECT * FROM BURSA WHERE data_incasarii = {^2004/02/16} OR data_incasarii = {^2004/02/18} OR data_incasarii = {^2004/02/20} - cu operatorul IN SELECT * FROM BURSA WHERE data_incasarii IN ({^2004/02/16}, {^2004/02/18}, {^2004/02/20}) 85

- o variant VFP: SELECT * ; FROM BURSA ; WHERE INLIST(data_incasarii, {^2004/02/16}, ; {^2004/02/18}, {^2004/02/20})

86

UNITATEA DE NVARE 10 THETA I ECHIJONCIUNEA

Dintre tipurile de jonciuni, vom insista n aceast subcapitol asupra theta jonciunii i echijonciunii. SQL nu prezint clauze sau operatori speciali pentru jonciune, ns dup cum am vzut, jonciunea se constituie ca o combinaie ntre produs cartezian i selecie. Exemplul 15 al algebrei relaionale pentru theta joncionarea relaiilor R1 i R2 (figura3.19.), se scrie: SELECT * FROM R1, R2 WHERE R1.C1 > R2.C5 iar pentru echijonciunea din exemplul 16 (figura 3.20.): SELECT * FROM R1, R2 WHERE R1.C1 = R2.C5 Jonciunea natural poate fi realizat numai prin specificarea numelor atributelor n clauza SELECT a frazei de interogare. n standardul SQL-92 i n implementrile SQL ale multor SGBD-uri se poate folosi o variant mai elegant, innd seama i de faptul c tot ce nseamn theta- i echijonciune reprezint pentru SQL, INNER JOIN (jonciune intern). Prin urmare, cele dou soluii de mai sus pot fi rescrise, dup cum urmeaz: SELECT * FROM R1 INNER JOIN R2 ON R1.C1 > R2.C5, respectiv SELECT * FROM R1 INNER JOIN R2 ON R1.C1 = R2.C3. Relum, pentru comparaie, exemplele din algebra relaional. Exemplul 19. S se afle numele, facultatea i secia studenilor care stau la cminul Miclas?. - varianta 1 (general): SELECT NUME, facultate, sectia, STUDCAMIN.nume_camin FROM STUDENT, STUDCAMIN WHERE STUDENT.nr_matricol = STUDCAMIN.nr_matricol AND STUDCAMIN.nume_camin = Miclas 87

- varianta 2 (Visual Fox Pro): SELECT nume, facultate, sectia, ; STUDCAMIN.nume_camin ; FROM STUDENT INNER JOIN STUDCAMIN ON ; STUDENT.nr_matricol = STUDCAMIN.nr_matricol ; AND STUDCAMIN.nume_camin = Miclas Numai atributul nume_camin a fost prefixat cu numele tabelei din care provine (STUDCAMIN). Prefixarea este obligatorie atunci cnd cmpul exist n dou sau mai multe dintre tabelele enumerate n clauza FROM. Exemplul 20. Care sunt crile scrise de Victor Stanciu? - varianta 1 (general): SELECT titlu, AUTOR.nume_autor FROM AUTOR, AUTORCARTE, CARTE WHERE AUTOR.cod_autor = AUTORCARTE.cod_autor AND AUTORCARTE.cota_carte = CARTE.cota_carte AND nume_autor = Victor Stanciu - varianta 2 (Visual Fox Pro): SELECT titlu, AUTOR.nume_autor ; FROM AUTOR INNER JOIN AUTORCARTE ON ; AUTOR.cod_autor = AUTORCARTE.cod_autor ; INNER JOIN CARTE ON AUTORCARTE.cota_carte = ; CARTE.cota_carte ; WHERE nume_autor = Niculae Feleag Exemplul 21. Numele studenilor care au mprumutat cri din domeniul Informatic. - varianta 1 (general): SELECT nume FROM CARTE, STUDCARTE, STUDENT WHERE CARTE.cota_carte = STUDCARTE.cota_carte AND STUDCARTE.nr_matricol = STUDENT.nr_matricol AND domeniu = Informatica - varianta 2 (Visual Fox Pro): SELECT nume ; FROM CARTE INNER JOIN STUDCARTE ON ; CARTE.cota_carte = STUDCARTE.cota_carte ; INNER JOIN STUDENT ON STUDCARTE.nr_matricol = ; STUDENT.nr_matricol ; WHERE domeniu = Informatica Exemplul 22. Numele i secia studenilor Facultii de tiine Economice care au mprumutat cartea Informatica de gestiune n februarie 2004?. - varianta 1 (general): SELECT nume, sectia FROM CARTE, STUDCARTE, STUDENT 88

WHERE CARTE.cota_carte = STUDCARTE.cota_carte AND STUDCARTE.nr_matricol = STUDENT.nr_matricol AND titlu = Informatica de gestiune AND facultate = Stiinte Economice AND data_imprumut BETWEEN 01/02/2004 AND 29/02/2004 - varianta 2 (Visual Fox Pro): SELECT nume, sectia FROM CARTE INNER JOIN STUDCARTE ON CARTE.cota_carte = STUDCARTE.cota_carte INNER JOIN STUDENT ON STUDCARTE.nr_matricol = STUDENT.nr_matricol WHERE titlu = Informatica de gestiune AND facultate = Stiinte Economice AND data_imprumut BETWEEN {^2004/02/01} AND {^2004/02/29} Exemplul 23. De la ce secii sunt studenii care au mprumutat i cartea Informatic de gestiune i Contabilitate general? - soluia 1 - varianta 1 (nu funcioneaz n Visual Fox Pro): SELECT DISTINCT sectia FROM STUDENT, STUDCARTE, CARTE WHERE STUDENT.nr_matricol = STUDCARTE.nr_matricol AND STUDCARTE.cota_carte = CARTE.cota_carte AND titlu = Informatica de gestiune INTERSECT SELECT sectia FROM STUDENT, STUDCARTE, CARTE WHERE STUDENT.nr_matricol = STUDCARTE.nr_matricol AND STUDCARTE.cota_carte = CARTE.cota_carte AND titlu = Contabilitate generala - soluia 1 - varianta 2 (SQL - 92): SELECT DISTINCT sectia FROM STUDENT INNER JOIN STUDCARTE ON STUDENT.nr_matricol = STUDCARTE.nr_matricol INNER JOIN CARTE ON STUDCARTE.cota_carte = CARTE.cota_carte WHERE titlu = Informatica de gestiune INTERSECT SELECT DISTINCT sectia FROM STUDENT INNER JOIN STUDCARTE ON STUDENT.nr_matricol = STUDCARTE.nr_matricol INNER JOIN CARTE ON STUDCARTE.cota_carte = CARTE.cota_carte WHERE titlu = Contabilitate generala De notat folosirea clauzei DISTINCT pentru eliminarea eventualelor dubluri. Pentru variantele soluiei 2 vom avea nevoie de ceea ce se numete jonciunea unei tabele cu ea nsi, care va fi prezentat n subcapitolul urmtor.

89

UNITATEA DE NVARE 11 SINONIME LOCALE I JONCIUNEA UNEI TABELE CU EA NSI

Lucrul

cu

nume

lungi

de

tabele

(STUDCARTE)

atribute

(cod_localitate) prezint marele avantaj al lejerit ii la citire i nelegeri rapide a logicii de derulare a interogrii. n schimb, destul de muli informaticieni nu agreaz risipa de caractere (i, implicit de timp) implicat de redact rile presupuse de folosirea numelor lungi. Pentru aceasta n frazele SELECT, tabelelor li pot asocia sinonime sau aliasuri mai scurte. Pentru exemplificare, ultima interogare se poate rescrie astfel: SELECT DISTINCT nume_camin FROM STUDENT S, STUDCARTE S1, CARTE C, STUDCAMIN S2 WHERE S.nr_matricol = S2.nr_matricol AND S.nr_matricol = S1.nr_matricol AND S1.cota_carte = C.cota_carte AND titlu = Informatic de gestiune INTERSECT ................................................................................................ Tabelei STUDENT i s-a asociat sinonimul S, STUDCARTE S1, CARTE C, iar pentru STUDCAMIN S2. Sinonimele prefixeaz (atunci cnd este cazul) numele atributelor din clauzele SELECT i WHERE (eventual ORDER BY i GROUP BY). O operaie n care obligatoriu trebuie folosite sinonimele este joncionarea unei tabele cu ea nsi. Revenim la exemplul 25 din algebra relaional. Ce studeni studiaz la aceeai secie cu Dinescu Monica? SELECT S2.nume FROM STUDENT S1, STUDENT S2 WHERE S1.sectia = S2.sectia AND S1.nume = Dinescu Monica Jonciunea unei tabele cu ea nsi presupune, de fapt, jonciunea a dou instane ale tabelei respective. Rezultatul jonciunii S1 cu S2 este o tabel intermediar, asupra creia se aplic predicatul de selecie suplimentar S1.nume = Dinescu Monica. O alt variant se prezint astfel: 90

SELECT S2.nume FROM STUDENT S1 INNER JOIN STUDENT S2 ON S1.sectia = S2.sectia WHERE S1.nume = Dinescu Monica Am rmas datori cu formularea soluiei 2 din algebra relaional de la exemplul 22: De la ce secii sunt studenii care au mprumutat i cartea Informatic de gestiune i Contabilitate general? Joncionm o instan obinut prin jonciunea STUDENT-STUDCARTECARTE (n care titlu = Informatica de gestiune) cu o alt instan a aceleiai combinaii (n care titlu general) - soluia 2 varianta 1 (general): SELECT DISTINCT S1.sectia FROM STUDENT S1, STUDCARTE SC1, CARTE C1, STUDENT S2, STUDCARTE SC2, CARTE C2 WHERE S1.nr_matricol = SC1.nr_matricol AND SC1.cota_carte = C1.cota_carte AND C1.titlu = Informatica de gestiune AND S2.nr_matricol = SC2.nr_matricol AND SC2.cota_carte = C2.cota_carte AND C2.titlu = Contabilitate general AND S1.sectia = S2.sectia - soluia 2 varianta 2 (Visual Fox Pro): SELECT DISTINCT S1.sectia FROM CARTE C1 INNER JOIN STUDCARTE SC1 ON C1.cota_carte = SC1.cota_carte INNER JOIN STUDENT S1 ON SC1.nr_matricol = S1.nr_matricol INNER JOIN STUDENT S2 ON S1.sectia = S2. sectia INNER JOIN STUDCARTE SC2 ON SC2.nr_matricol = S2.nr_matricol INNER JOIN CARTE C2 ON SC2.cota_carte = C2.cota_carte WHERE C1.titlu = Informatica de gestiune AND C2. titlu = Contabilitate generala = Contabilitate

91

UNITATEA DE NVARE 12 SUBCONSULTRI Una dintre cele mai importante faciliti oferite de SQL const n includerea unei consultri n alta, pe dou sau mai multe niveluri cu alte cuvinte, utilizarea subconsultrilor. Prin aceste subconsultri se obin tabele temporare intermediare ce vor fi folosite drept argumente n frazele SELECT superioare.

n materie de subconsultri, cel mai utilizat operator este IN, pe care deja l-am ntlnit n capitolul precedent, dar ntr-o cu totul alt ipostaz testarea ncadrrii valorii unui atribut ntr-o list de constante. Revenim la exemplul din algebra relaional: Ce studeni studiaz la aceeai secie cu Dinescu Monica? SELECT nume FROM STUDENT WHERE sectia IN (SELECT sectia FROM STUDENT WHERE nume = Dinescu Monica) n cazul acestei interogri, execuia se realizeaz n doi timpi. Mai nti se execut subconsultarea SELECT sectia FROM STUDENT WHERE nume = Dinescu Monica obinndu-se o tabel intermediar ce conine o singur linie (pe care apare CIG) i o singur coloan (sectia). n cel de-al doilea pas sunt selectate liniile tabelei STUDENT care ndeplinesc condiia secia = CIG Observm c n rezultat a fost inclus i studentul de referin Dinescu Monica. Dac se dorete excluderea din rezultat a acestui student, fraza SELECT se modific astfel: SELECT nume FROM STUDENT WHERE sectia IN (SELECT sectia FROM STUDENT WHERE nume = Dinescu Monica) AND nume < > Dinescu Monica Ce studeni studiaz la alte secii dect Dinescu Monica? 92

SELECT nume FROM STUDENT WHERE sectia NOT IN (SELECT sectia FROM STUDENT WHERE nume = Dinescu Monica) n ce cmin sunt cazai studenii care studiaz la aceeai secie cu Dinescu Monica? SELECT DISTINCT nume_camin FROM STUDCAMIN WHERE nr_matricol IN (SELECT nr_matricol FROM STUDENT WHERE sectia IN SELECT sectia FROM STUDENT WHERE nume = Dinescu Monica)) Rezultatul este obinut prin folosirea a trei niveluri de interogare (fraza principal, o subconsultare i o sub-subconsultare). n Visual Fox Pro aceast ultim interogare face simit prezena uneia dintre cele mai serioase limitri SQL maxim 2 niveluri de consultare (fraza principal i o interogare subordonat). Mesajul de eroare are numrul 1842: SQL: Subquery nesting in too deep. Astfel, pentru a rspunde la ntrebare, soluia de interogare trebuie reformulat: SELECT nume_camin FROM STUDENT INNER JOIN STUDCAMIN; ON STUDENT.nr_matricol = STUDCAMIN.nr_matricol; WHERE sectia IN (SELECT sectia FROM STUDENT WHERE nume = Dinescu Monica) Din ce judee sunt studenii care au mprumutat cri scrise de autori de naionalitate romn? Am ales acest exemplu pentru a folosi n subconsultri ct mai multe tabele ale bazei de date SELECT judet FROM LOCALITATE WHERE cod_localitate IN (SELECT cod_localitate IN 93

FROM STUDENT WHERE cota_carte IN (SELECT nr_matricol FROM STUDCARTE WHERE cota_carte IN (SELECT cota_carte FROM CARTE WHERE cota_carte IN (SELECT cota_carte FROM AUTOR_CARTE WHERE nume_autor IN SELECT nume_autor FROM AUTOR WHERE natioanlitate = roman))))) Atunci cnd rezultatul unei subconsult ri se concretizeaz ntr-o tabel cu o singur coloan i o singur linie, corelarea poate fi fcut i cu operatorii de comparaie obinuii: =, >, >=, <, <=. n continuare vom ilustra aceast facilitate prin cteva exemple. Care este cel mai mic pre unitar la care s-a cumprat o carte? SELECT MIN (pret_unitar) AS maxim FROM CARTE Care este cel mai mic pre unitar i care este cartea, respectiv studentul care a mprumutat cartea cu preul respectiv? SELECT titlu, pret_unitar, nume FROM CARTE C, STUDCARTE SC, STUDENT S WHERE S.nr_matricol = SC.nr_matricol AND SC.cota_carte=C.cota_carte AND pret_unitar =(SELECT MIN (pret_unitar) FROM CARTE) Care sunt cele mai mari cinci preuri unitare, crile i studenii care au mprumutat crile care au cele cinci preuri maxime? SELECT titlu, pret_unitar, nume FROM STUDENT INNER JOIN STUDCARTE ON STUDENT.nr_matricol = STUDCARTE.nr_matricol INNER JOIN CARTE ON STUDCARTE.cota_carte = CARTE.cota_carte WHERE pret_unitar > (SELECT MAX (pret_unitar) FROM CARTE WHERE pret_unitar < (SELECT MAX (pret_unitar) FROM CARTE WHERE pret_unitar < (SELECT MAX (pret_unitar) FROM CARTE WHERE pret_unitar < 94

(SELECT MAX (pret_unitar) FROM CARTE WHERE pret_unitar < (SELECT MAX (pret_unitar) FROM CARTE))))) ORDER BY pret_unitar DESC Avnd n vedere nivelurile de interogare, pentru exemplul de mai sus, n Visual FoxPro nu se poate formula interogarea n aceast form. Avem ns la ndemn o soluie neverosimil de simpl bazat pe clauza TOP. SELECT TOP 5 titlu, pret_unitar, nume FROM STUDENT INNER JOIN STUDCARTE STUDENT.nr_matricol = STUDCARTE.nr_matricol INNER JOIN CARTE ON STUDCARTE.cota_carte CARTE.cota_carte ORDER BY pret_unitar DESC final sunt extrase doar primele cinci (prin TOP 5)

ON =

Liniile tabelei sunt ordonate descresctor dup preul unitar, iar n rezultatul

95

UNITATEA DE NVARE 13 FUNCII AGREGAT Formatul general al unei fraze SELECT care conine funcii agregat este: SELECT funcie 1, ..., funcie 2 FROM lista_tabele WHERE condiie Dac n clauza SELECT este prezent o funcie agregat, n lipsa opiunii ORDER BY, rezultatul va conine o singur linie. 13.1. Funcia COUNT Funcia COUNT contorizeaz valorile nenule ale unei coloane sau numrul de linii dintr-un rezultat al interogrii. Cu alte cuvinte, COUNT numr cte valori diferite de NULL are coloana specificat sau cte linii sunt. Cte cri sunt n bibliotec? SELECT COUNT(*) AS Nr_carti FROM CARTE Prezena asteriscului ca argument al funciei COUNT are ca efect numrarea tuturor liniilor tabelei CARTE. Folosind concatenarea se poate obine un rezultat ceva mai elegant. Spre exemplu, n Visual Fox Pro fraza se scrie n forma: SELECT In biblioteca sunt + STR (COUNT (*), 4) + carti AS Rezultat FROM CARTE Tabela CARTE are cheie primar atributul cota_carte, care nu poate avea valori nule, de aceea, la fel de corect este i soluia: SELECT COUNT(cota_carte) AS Nr_carti FROM CARTE Cte linii are produsul cartezian al tabelelor STUDENT i STUDCAMIN? SELECT COUNT(*) AS Produs FROM STUDENT, STUDCAMIN Ci studeni urmeaz cursurile Facultii de tiine Economice? SELECT COUNT(Nr_matricol) AS Nr_studenti FROM STUDENT WHERE facultate = Stiinte Economice 96

Ci studeni de la Facultatea de tiine Economice sunt bursieri? SELECT COUNT (*) AS Nr_bursieri FROM STUDENT S, BURSA B WHERE S.nr_matricol = B.nr_matricol AND facultate = Stiinte Economice Ci studeni stau n cmin? SELECT COUNT (*) AS Nr_caministi FROM STUDENT S, STUDCAMIN SC WHERE S.nr_matricol = SC.nr_matricol Care este numrul studenilor din Muntenia? SELECT COUNT (*) AS Nr_studenti FROM STUDENT S, LOCALITATE L WHERE S.cod_localitate = L.cod_localitate regiune = Muntenia Din cte localiti provin studenii? Tabela LOCALITATE conine i localiti din care nu avem studeni, pentru moment. De aceea, n locul soluiei: SELECT COUNT(cod_localitate) AS Nr_localitati FROM LOCALITATE de preferat ar fi folosirea variantei: SELECT COUNT(cod_localitate) AS Nr_localitati FROM STUDENT Problema este c rezultatul obinut (20) este incorect, deoarece funcia COUNT numr toate valorile nenule. Exist ns o clauz prin care o valoare s fie luat o singur dat n calcul: DISTINCT. Rezultatul corect (nr.) presupune urmtoarea variant: SELECT COUNT(DISTINCT cod_localitate) AS Nr_localitati FROM STUDENT 13.2. Funcia SUM

AND

SUM este una dintre cele mai utilizate funcii n aplicaiile economice, deoarece datele financiar-contabile i cele ale evidenei tehnico-operative sunt preponderent cantitative. 97

Ct s-a pltit fr TVA pentru cartea Informatic de gestiune? SELECT SUM (nr_exemplare*pret_unitar) AS Val_fara_TVA FROM CARTE WHERE titlu = Informatica de gestiune Ct s-a pltit fr TVA, care este valoarea TVA-ului i ct s-a pltit total pentru cartea Informatica de gestiune? SELECT SUM (nr_exemplare*pret_unitar)AS Val_fara_TVA, SUM(nr_exemplare*pret_unitar*0.19) AS TVA, SUM (nr_exemplare*pret_unitar + nr_exemplare*pret_unitar*0.19) AS Val_totala, FROM CARTE WHERE titlu = Informatica de gestiune Aceasta este o soluie atemporal, deoarece dup cum se tie, procentul de TVA (care n prezent este 19%) poate suferi n timp modificri. O vizualizare mai elegant a acestui rezultat poate fi realizat folosind urmtoarea interogare: SELECT Pentru cartea Informatica de gestiune fr TVA s-a pltit + STR (SUM (nr_exemplare* pret_unitar), 10) + valoarea TVA este + STR (SUM (nr_exemplare*pret_unitar*0.16), 10) + iar total s-au cheltuit + STR (SUM (nr_exemplare*pret_unitar + nr_exemplare*pret_unitar*0.16), 10) AS Rezultat FROM CARTE WHERE titlu = Informatica de gestiune La ct se situeaz suma ncasat ca burs de studeni n data de 20.02.2004? SELECT 20.02.2004 AS DATA, SUM (SUMA_incasata) AS Val_bursa FROM STUDENT, BURSA WHERE STUDENT.nr_matricol = BURSA.nr_matricol AND data_incasarii = {^2004/02/20} Care este suma total ncasat ca burs de studenii Facultii de tiine Economice? SELECT SUM (suma_incasata) AS Suma_bursa FROM STUDENT S, BURSA B WHERE S.nr_matricol = B.nr_matricol AND facultate = Stiinte Economice

98

Care este suma total ncasat ca burs de studenii cminiti? SELECT SUM (suma_incasata) AS Suma_bursa FROM STUDENT S, STUDCAMIN SC, BURSA B WHERE S.nr_matricol = SC.nr_matricol S.nr_matricol = B.nr_matricol

AND

Care este valoarea medie a preului (inclusiv TVA) la care a fost achiziionat cartea Informatic de gestiune? Aceast valoare medie nu o calculm folosind funcia AVG (pe care o vom descrie ceva mai ncolo), ci se bazeaz pe raportul dintre suma pltit i numrul de exemplare nsumate pentru aceast carte. SELECT SUM (nr_exemplare*pret_unitar*1.19) / SUM (nr_exemplare) AS Pret_mediu FROM CARTE WHERE titlu = Informatica de gestiune 13.3. Funcia AVG Dup cum i spune i numele (n englez), calculeaz media aritmetic a unei coloane ntr-o tabel oarecare, prin diviziunea sumei valorilor coloanei respective la numrul de valori nenule ale acesteia. Care este valoarea medie (fr TVA) la care au fost achiziionate crile din domeniul Informatic? SELECT Valoarea medie a cartilor din Informatica AS EXPLICATIE, (nr_exemplare*pret_unitar) AS Val_medie FROM CARTE WHERE domeniu = Informatica domeniul AVG

Care este valoarea medie a burselor ncasate de studenii Facultii de tiine Economice? SELECT Valoarea medie a burselor AS Explicatie, AVG (suma_incasata) AS Val_medie FROM STUDENT S, BURSA B WHERE S.nr_matricol = B.nr_matricol AND facultate = Stiinte Economice Care este valoarea medie a burselor ncasate de studenii cminiti? SELECT Valoarea medie a burselor AS Explicatie, AVG (suma_incasata) AS Val_medie 99

FROM STUDENT S, BURSA B, STUDCAMIN SC WHERE S.nr_matricol = B.nr_matricol S.nr_matricol = SC.nr_matricol

AND

Adeseori, prin aplicarea funciei AVG sau prin formularea unor expresii ce conin rapoarte ntre atribute i constante, se obin rezultate cu numeroase zecimale. Pentru a evita disconfortul unor astfel de rezultate se apeleaz la funcia ROUND. 13.4. Funciile MAX i MIN

Cele dou funcii care determin valoarea maxim i minim, pentru o coloan (atribut) sunt deosebit de utile n diverse tipuri de analiz. Se pot folosi i pentru atribute de tip caracter, caz n care elementul de comparaie este codul ASCII al elementelor. Care este studentul cu ultimul nume, n ordine alfabetic, de la facultatea de tiine Economice? SELECT MIN (nume) AS Primul_student, MAX (nume) AS Ultimul_student FROM STUDENT WHERE facultate = Stiinte Economice Care este primul i ultimul jude (n ordinea numelui) din care provin studenii? SELECT MIN (judet) AS Primul_judet MAX (judet) AS Ultimul_judet FROM STUDENT S, LOCALITATE L WHERE S.cod_localitate = L.cod_localitate Care este cartea cu cel mai mare numr de exemplare? SELECT titlu, MAX (nr_exemplare) AS Exemplare FROM CARTE Care este cartea pentru care s-a pltit cel mai puin? SELECT titlu, Val_minima FROM CARTE MIN (nr_exemplare*pret_unitar) AS

100

Care este cel mai mare i cel mai mic pre unitar la care au fost achiziionate crile din domeniul Informatic? SELECT MAX (Pret_minim = + STR (pret_unitar, 8) + domeniu + domeniu) AS Pret_max_informatica, MIN ( pret minim = + STR (pret_unitar, 8) + domeniu + domeniu) AS pret_min_informatica FROM CARTE WHERE domeniu = Informatica Care sunt cele mai mari dou preuri unitare la care au fost achiziionate crile din domeniu Informatic? SELECT Domeniu Informatica + MAX (Primul pret unitar + STR (C1.pret_unitar, 8) + al doilea pret unitar + STR (C2.pret_unitar, 8) AS Cele mai mari preturi unitare FROM CARTE C1, CARTE C2 WHERE C1.cota_carte = C2.cota_carte AND C1.pret_unitar > C2.pret_unitar AND C1.domeniu = Informatica

101

UNITATEA DE NVARE 14 Gruparea tuplurilor: clauza GROUP BY i clauza HAVING

Clauza GROUP BY formeaz grupe de tupluri ale unei relaii, pe baza valorilor comune ale unui atribut. n frazele SELECT de pn acum au fost selectate tupluri ale tabelei. Prin asocierea unei clauze HAVING la GROUP BY este posibil selectarea anumitor grupuri de tupluri, care ndeplinesc un criteriu valabil doar la nivel de grup (nu i la nivel de linie). 14.1. Clauza GROUP BY

Rezultatul unei fraze SELECT ce conine aceast clauz se obine prin regruparea tuturor liniilor din tabele enumerate n clauza FROM, extrgndu-se cte o apariie pentru fiecare valoare distinct a coloanei/grupului de coloane. Formatul general este: SELECT coloana 1, coloana 2,.., coloana n FROM lista_tabele GROUP BY coloana_de_regrupare Care este suma ncasat pe fiecare tip de burs n parte? SELECT tip_bursa, total_bursa FROM BURSA GROUP BY tip_bursa SUM (suma_incasata) AS

Rezultatul se obine prin urmtoarea succesiune de operaii: - se ordoneaz liniile tabelei BURSA dup atributul de grupare tip_bursa, - se constituie un grup pentru fiecare valoare distinct a tip_bursa, - se execut funcia SUM (suma_incasata) n cadrul fiecrui grup, - se obine rezultatul al crui numr de linii coincide cu valorile distincte ale tip_bursa. Care este valoarea total a burselor pentru fiecare zi n care s-au ncasat burse?

102

SELECT data_incasarii, Total_zi FROM BURSA GROUP BY data_incasarii

SUM

(suma_incasata)

AS

Care este totalul burselor pe faculti? SELECT facultate, SUM (suma_incasata) Total_facultate FROM STUDENT S, BURSA B WHERE S.nr_matricol = B.nr_matricol GROUP BY facultate Care este media burselor pe seciile facultii de tiine Economice? SELECT sectia, AVG (suma_incasata) AS Medie_sectie FROM STUDENT S, BURSA B WHERE S.nr_matricol = B.nr_matricol AND facultate = Stiinte Economice GROUP BY sectia Care este totalul burselor pe cmin, ncasate de studenii cminiti? SELECT nume_camin, SUM (suma_incasata) Total_camin FROM STUDENT S, BURSA B, STUDCAMIN SC WHERE S.nr_matricol = SC.nr_matricol S.nr_matricol = B.nr_matricol GROUP BY nume_camin AS AND AS

Care este numrul total de exemplare i valoarea total a fiecrei cri? SELECT titlu, Total_exemplare, SUM Val_totala FROM CARTE GROUP BY titlu SUM (nr_exemplare) (pret_unitar*nr_exemplare) AS AS

Care este numrul total de exemplare din fiecare domeniu n parte? SELECT domeniu, Total_exemplare FROM CARTE GROUP BY domeniu SUM (nr_exemplare) AS

Care este numrul crilor din bibliotec n funcie de naionalitatea autorilor? SELECT Nr_carti nationalitate, COUNT (C.cota_carte) AS 103

FROM CARTE C, AUTORCARTE AC, AUTOR A WHERE C.cota_carte = AC.cota_carte AC.cod_autor = A.cod_autor GROUP BY nationalitate

AND

Care este totalul burselor ncasate pe fiecare tip de burs pentru fiecare zi n care s-au ncasat burse? SELECT tip_bursa, SUM (suma_incasata) Total_bursa, data_incasarii FROM BURSA GROUP BY tip_bursa, data_incasarii AS

Care este numrul crilor din bibliotec n funcie de naionalitatea autorilor, pe domenii? SELECT nationalitate, domeniu (COUNT (cota_carte) AS Nr_carti) FROM CARTE C, AUTORCARTE AC, AUTOR A WHERE C.cota_carte = AC.cota_carte AND AC.cod_autor = A.cod_autor GROUP BY nationalitate, domeniu 14.2. Clauza HAVING Cea mai simpl definiie ar fi: clauza HAVING este WHERE-ul ce opereaz la nivel de grupuri. Dac WHERE acioneaz la nivel de tuplu, selectnd acele linii care ndeplinesc o condiie specificat, HAVING permite specificarea unor condi ii de selecie ce se aplic grupurilor de linii create prin clauza GROUP BY. Din rezultat sunt eliminate toate grupurile care nu satisfac condiia specificat. Formatul general este: SELECT coloana 1, coloana 2, ..., coloana n FROM lista_tabele GROUP BY coloana_de_regrupare HAVING criteriu_de_regrupare Care sunt zilele n care s-au ridicat cel puin 2 burse? SELECT data_incasarii, COUNT (*) AS Nr_burse FROM BURSA GROUP BY data_incasarii HAVING COUNT (*) > = 2 Care sunt crile pentru care s-au cheltuit peste 10.000.000 lei?

104

SELECT titlu, SUM (pret_unitar*nr_exemplare) AS Suma_cheltuita FROM CARTE GROUP BY titlu HAVING SUM (pret_unitar*nr_exemplare) > 10000000 Tem de autoevaluare Studiu de caz Se consider urmtoarea baz de date: PACIENT (codpacient, nume, prenume, datanasterii, localitate) PROGRAMARE (nrprogramare, dataprogramare, oraprogramare, codpacient) CONSULTATIE (nrconsultatie, tipconsultatie, codpacient, dataconsultatie) MEDICI (codmedic, numemedic, prenumemedic) MEDIC_CONSULTATIE (nrconsultatie, codmedic) TARIFE (tipconsultatie, tarif) Folosind comenzi SQL s se determine: 1. Care sunt pacienii din Trgovite; (vezi pag. 111-118)

2. Care sunt pacienii din Trgovite i Titu; (vezi pag. 111-118)

3. Care pacieni nu sunt din Trgovite i Titu; (vezi pag. 111-118)

4. Care sunt pacienii care s-au nscut n anul 1989 (vezi pag. 111-118)

105

5. Care sunt tarifele mai mari de 25 RON; (vezi pag. 111-118)

6. Din ce localiti sunt pacienii din baz; (vezi pag. 111-118)

7. Care este nume i prenumele medicilor care ofer consultaii; (vezi pag. 111-118)

8. Care sunt tarifele practicate; (vezi pag. 111-118)

9. Din ce localitate sunt pacienii nscui n luna ianuarie 1990; (vezi pag. 111-118)

10. Care sunt orele pentru care sunt prevzute consultaii n data de 09.02.2006; (vezi pag. 111-118)

106

11. Cum se numesc pacienii din Trgovite i Moreni; (vezi pag. 111-118)

12. Care este prenumele medicilor cu numele de familie Ghionea; (vezi pag. 111-118)

13. La ce data i la ce or are programare Popa Georgeta; (vezi pag. 111-118)

14. Care sunt datele la care au fcut programare pacienii din Trgovite; (vezi pag. 111-118)

15. Numele pacienilor care au fost consultai n luna februarie 2006; (vezi pag. 111-118)

16. Data la care a fcut programare Dinescu Mircea i Vancea Ioan; (vezi pag. 111-118)

107

17. Numele medicilor care au acordat consultaii n data de 23.02.2006; (vezi pag. 111-118)

18. De ce medic a fost consultat Popa Georgeta; (vezi pag. 111-118)

19. Numele pacienilor consultai de Grecu Anca; (vezi pag. 111-118)

20. Nume pacienilor care au fcut programare i n luna ianuarie i n luna februarie 2006; (vezi pag. 111-118)

21. Care este tariful consultaiei pacientului Popa Georgeta; (vezi pag. 111-118)

108

22. Numele pacienilor care au fcut programare n data de 10.02.2006 n intervalul 14-16; (vezi pag. 111-118)

23. Datele la care au efectuat consultaii Grecu Anca i Minea Ion n luna februarie 2006; (vezi pag. 111-118)

24. Numele i prenumele medicilor care au consultat pacieni din Trgovite i Moreni dar nu din Titu; (vezi pag. 111-118)

25. Data la care au fost consultai pacienii care au fcut programare n data de 10.02.2006; (vezi pag. 111-118)

109

26. Nume pacienilor care au avut programare n data de 10.20.2006 n intervalul 12-14 i au fost consultai de ctre Grecu Anca. (vezi pag. 111-118)

27. Numele pacienilor care sunt din aceeai localitate cu Popa Georgeta; (vezi pag. 111-118)

28. Numele medicilor care au prenumele Anca; (vezi pag. 111-118)

29. Numele i prenumele n ordine alfabetic al pacienilor pe localit i; (vezi pag. 111-118)

110

Rezolvare tem de autoevaluare 1. Care sunt pacienii din Trgovite; SELECT * FROM PACIENT WHERE localitate=Targoviste 2. Care sunt pacienii din Trgovite i Titu; SELECT * FROM PACIENT WHERE localitate=Targoviste or localitate=Titu 3. Care pacieni nu sunt din Trgovite i Titu; SELECT * FROM PACIENT WHERE localitate<>Targoviste and localitate<>Titu 4. Care sunt pacienii care s-au nscut n anul 1989 varianta general (SQL-92) SELECT * FROM PACIENT WHERE datanasterii >= 01/01/1989 and datanasterii<= 31/12/1989 varianta Visual FoxPro SELECT * FROM PACIENT WHERE datanasterii >= {^1989/01/01}and datanasterii<= {^1989/12/31} 5. Care sunt tarifele mai mari de 25 RON; SELECT tarif FROM TARIFE WHERE TARIF>= 25 6. Din ce localiti sunt pacienii din baz; SELECT localitate FROM PACIENT 7. Care este nume i prenumele medicilor care ofer consultaii; varianta general (SQL-92) SELECT numemedic, prenumemedic FROM MEDICI, MEDIC_CONSULTATIE WHERE MEDICI.codmedic=MEDIC_CONSULTATIE.codmedic varianta VFP SELECT numemedic, prenumemedic FROM MEDICI INNER JOIN MEDIC_CONSULTATIE ON MEDICI.codmedic=MEDIC_CONSULTATIE.codmedic

111

8. Care sunt tarifele practicate; SELECT tarif FROM TARIFE 9. Din ce localitate sunt pacienii nscui n luna ianuarie 1990; varianta general (SQL-92) SELECT localitate FROM PACIENT WHERE datanasterii >= 01/01/1990 and datanasterii <= 31/01/1990 varianta VFP SELECT localitate FROM PACIENT WHERE datanasterii >= {^1990/01/01} and datanasterii <= {^1990/12/31} 10. Care sunt orele pentru care sunt prevzute consultaii n data de 09.02.2006; SELECT oraprogramare FROM PROGRAMARE WHERE dataprogramare = 09/02/2006 11. Cum se numesc pacienii din Trgovite i Moreni; SELECT nume, prenume FROM PACIENT WHERE localitate = Targoviste or localitate = Moreni 12. Care este prenumele medicilor cu numele de familie Ghionea; SELECT prenumemedic FROM MEDICI WHERE numemedic = Ghionea 13. La ce data i la ce or are programare Popa Georgeta; varianta general (SQL-92) SELECT dataprogramare, oraprogramare FROM PACIENT P, PROGRAMARE PRG WHERE P.codpacient = PRG.codpacient and (nume=Popa and prenume = Georgeta) varianta VFP SELECT dataprogramare, oraprogramare FROM PACIENT P INNER JOIN PROGRAMARE PRG ON P.codpacient = PRG.codpacient WHERE nume=Popa and prenume = Georgeta 14. Care sunt datele la care au fcut programare pacienii din Trgovite; varianta general (SQL-92) SELECT dataprogramare FROM PACIENT P, PROGRAMARE PRG WHERE P.codpacient = PRG.codpacient and localitate = Targoviste 112

varianta VFP SELECT dataprogramare FROM PACIENT P INNER JOIN PROGRAMARE PRG ON P.codpacient = PRG.codpacient WHERE localitate = Targoviste 15. Numele pacienilor care au fost consultai n luna februarie 2006; varianta general (SQL-92) SELECT nume, prenume FROM PACIENT P, CONSULTATIE C WHERE P.codpacient = C.codpacient and (dataconsultatie >= 01/02/2006 and dataconsultatie <= 28/02/2006) varianta VFP SELECT nume, prenume FROM PACIENT P INNER JOIN CONSULTATIE C ON P.codpacient = C.codpacient WHERE dataconsultatie >= {^2006/02/01} and dataconsultatie <= {^2006/02/28} 16. Data la care a fcut programare Dinescu Mircea i Vancea Ioan; varianta general (SQL-92) SELECT dataprogramare FROM PACIENT P, PROGRAMARE PRG WHERE P.codpacient = PRG.codpacient and (nume = Dinescu and prenume = Mircea) and (nume = Vancea and prenume = Ioan varianta VFP SELECT dataprogramare FROM PACIENT P INNER JOIN PROGRAMARE PRG ON P.codpacient =PRG.codpacient WHERE (nume = Dinescu and prenume = Mircea) and (nume =Vancea and prenume = Ioan 17. Numele medicilor care au acordat consultaii n data de 23.02.2006; varianta general (SQL-92) SELECT numemedic, prenumemedic FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C WHERE M.codmedic=MC.codmedic and MC.nrconsultatie=C.nrconsultatie and dataconsultatie = 23/02/2006 varianta VFP SELECT numemedic, prenumemedic FROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ON M.codmedic = MC.codmedic INNER JOIN CONSULTATIE C ON MC.NRCONSULTATIE = C.nrconsultatie and dataconsultatie = {^2006/02/23}

113

18. De ce medic a fost consultat Popa Georgeta; varianta general (SQL-92) SELECT numemedic, prenumemedic FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C, PACIENT P WHERE M.codmedic=MC.codmedic and MC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacient and (nume = Popa and prenume = Georgeta) varianta VFP SELECT numemedic, prenumemedic FROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ON M.codmedic = MC.codmedic INNER JOIN CONSULTATIE C ON MC.nrconsultatie = C.nrconsultatie INNER JOIN PACIENT P ON C.codpacient = P.codpacient WHERE nume = Popa and prenume = Georgeta 19. Numele pacienilor consultai de Grecu Anca; varianta general (SQL-92) SELECT numemedic, prenumemedic FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C, PACIENT P WHERE M.codmedic=MC.codmedic and MC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacient and (numemedic = Grecu and prenumemedic = Anca) varianta VFP SELECT numemedic, prenumemedic FROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ON M.codmedic = MC.codmedic INNER JOIN CONSULTATIE C ON MC.nrconsultatie = C.nrconsultatie INNER JOIN PACIENT P ON C.codpacient = P.codpacient WHERE numemedic = Grecu and prenumemedic = Anca 20. Nume pacienilor care au fcut programare i n luna ianuarie i n luna februarie 2006; SELECT nume, prenume FROM PACIENT P, PROGRAMARE PRG WHERE P.codpacient = PRG.codpacient and dataprogramare >= 01/01/2006 and dataprogramare <= 31/01/2006 INTERSECT SELECT nume, prenume FROM PACIENT P, PROGRAMARE PRG WHERE P.codpacient = PRG.codpacient and dataprogramare >= 01/02/2006 and dataprogramare <= 28/02/2006 21. Care este tariful consultaiei pacientului Popa Georgeta; varianta general (SQL-92) SELECT tarif FROM PACIENT P, CONSULTATIE C, TARIFE T WHERE P.codpacient = C.codpcient and C.nrconsultatie = T.nrconsultatie and (nume = Popa and prenume = Georgeta) 114

varianta VFP SELECT tarif FROM PACIENT P INNER JOIN CONSULTATIE C ON P.codpacient = C.codpcient INNER JOIN TARIFE T ON C.nrconsultatie = T.nrconsultatie WHERE nume = Popa and prenume = Georgeta 22. Numele pacienilor care au fcut programare n data de 10.02.2006 n intervalul 14-16; varianta general (SQL-92) SELECT nume, prenume FROM PACIENT P, PROGRAMARE PRG WHERE P.codpacient = PRG.codpacient and dataprogramare = 10/02/2006 and (oraprogramare >= 14 and oraprogramare <=16) varianta VFP SELECT nume, prenume FROM PACIENT P INNER JOIN PROGRAMARE PRG ON P.codpacient =PRG.codpacient WHERE and dataprogramare = {^2006/02/10} and (oraprogramare >=14 and oraprogramare <=16) 23. Datele la care au efectuat consultaii Grecu Anca i Minea Ion n luna februarie 2006; varianta general (SQL-92) SELECT dataconsultatie FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C, PACIENT P WHERE M.codmedic=MC.codmedic and MC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacient and (numemedic = Grecu and prenumemedic = Anca) and (dataconsultatie >= 01/02/2006 and dataconsultatie <= 28/02/2006) INTERSECT SELECT dataconsultatie FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C, PACIENT P WHERE M.codmedic=MC.codmedic and MC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacient and (numemedic = Minea and prenumemedic = Ioan) and (dataconsultatie >= 01/02/2006 and dataconsultatie <= 28/02/2006) varianta VFP SELECT dataconsultatie FROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ON M.codmedic = MC.codmedic INNER JOIN CONSULTATIE C ON MC.nrconsultatie = C.nrconsultatie INNER JOIN PACIENT P ON C.codpacient = P.codpacient WHERE (numemedic = Grecu and prenumemedic = Anca) and (numemedic = Minea and prenumemedic = Ioan) and (dataconsultatie >= {^2006/02/01} and dataconsultatie <= {^2006/02/28}) 115

24. Numele i prenumele medicilor care au consultat pacieni din Trgovite i Moreni dar nu din Titu; varianta general (SQL-92) SELECT numemedic, prenumemedic FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C, PACIENT P WHERE M.codmedic=MC.codmedic and MC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacient localitate = Targoviste INTERSECT SELECT numemedic, prenumemedic FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C, PACIENT P WHERE M.codmedic=MC.codmedic and MC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacient localitate = Moreni MINUS SELECT numemedic, prenumemedic FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C, PACIENT P WHERE M.codmedic=MC.codmedic and MC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacient localitate = Titu varianta VFP SELECT numemedic, prenumemedic FROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ON M.codmedic = MC.codmedic INNER JOIN CONSULTATIE C ON MC.nrconsultatie = C.nrconsultatie INNER JOIN PACIENT P ON C.codpacient = P.codpacient WHERE (localitate = Targoviste or localitate = Moreni) and localitate <> Titu 25. Data la care au fost consultai pacienii care au fcut programare n data de 10.02.2006; varianta general (SQL-92) SELECT nume, prenume FROM PACIENT P, PROGRAMARE PRG WHERE P.codpacient=PRG.codpacient GROUP BY dataprogramare varianta VFP SELECT nume, prenume FROM PACIENT P INNER JOIN PROGRAMARE ON P.codpacient=PRG.codpacient GROUP BY dataprogramare

116

26. Nume pacienilor care au avut programare n data de 10.20.2006 n intervalul 12-14 i au fost consultai de ctre Grecu Anca. varianta general (SQL-92) SELECT nume, prenume FROM PACIENT P, PROGRAMARE PRG WHERE P.codpacient=PRG.codpacient GROUP BY dataprogramare varianta VFP SELECT nume, prenume FROM PACIENT P INNER JOIN PROGRAMARE ON P.codpacient=PRG.codpacient GROUP BY dataprogramare 27. Numele pacienilor care sunt din aceeai localitate cu Popa Georgeta; varianta general (SQL-92) SELECT nume, prenume FROM PACIENT P, PROGRAMARE PRG, CONSULTATIE C WHERE P.codpacient=PRG.codpacient and PRG.nrconsultatie=C.nrconsultatie GROUP BY dataconsultatie varianta VFP SELECT nume, prenume FROM PACIENT P INNER JOIN PROGRAMARE ON P.codpacient=PRG.codpacient INNER JOIN CONSULTATIE ON PRG.nrconsultatie=C.nrconsultatie GROUP BY dataconsultatie 28. Numele medicilor care au prenumele Anca; varianta general (SQL-92) SELECT COUNT(*) AS nrconsultatii FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C WHERE M.codmedic=MC.codmedic and MC.nrconsultatie=C.nrconsultatie and (dataconsultatie>=01/02/2006 and dataconsultatie<=28/02/2006) and (numemedic=Grecu and prenumemedic=Anca) varianta VFP SELECT COUNT(*) AS nrconsultatii FROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ON M.codmedic = MC.codmedic INNER JOIN CONSULTATIE C ON MC.nrconsultatie = C.nrconsultatie WHERE (dataconsultatie>={^2006/02/01} and dataconsultatie<={^2006/02/28}) and (numemedic = Grecu and prenumemedic = Anca)

117

29. Numele i prenumele n ordine alfabetic al pacienilor pe localit i; varianta general (SQL-92) SELECT COUNT(*) AS nrconsultatii, COUNT(*)*10 as onorariu FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C WHERE M.codmedic=MC.codmedic and MC.nrconsultatie=C.nrconsultatie and (dataconsultatie>=01/02/2006 and dataconsultatie<=28/02/2006) and (numemedic=Grecu and prenumemedic=Anca) varianta VFP SELECT COUNT(*) AS nrconsultatii, COUNT(*)*10 as onorariu FROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ON M.codmedic = MC.codmedic INNER JOIN CONSULTATIE C ON MC.nrconsultatie = C.nrconsultatie WHERE (dataconsultatie>={^2006/02/01} and dataconsultatie<={^2006/02/28}) and (numemedic = Grecu and prenumemedic = Anca)

BIBLIOGRAFIE SELECTIV I. Tratate i monografii. 1. Michael Hernandez Proiectarea bazelor de date, Editura Teora, Bucureti, 2003 2. Mariana Milo escu Baze de date n Visual FoxPro, Editura Teora, 2003 3. Marin Fotache, Proiectarea bazelor de date, Editura Polirom, Iai, 2005 4. Grupul BDASEIG, Baze de date. Fundamente teoretice i practice, Editura Infomega, Bucureti, 2002 5. Florin Radu, Baze de date, Editura Bibliotheca, Trgovite, 2007

118

ANEXA 1 STRUCTURA BAZEI DE DATE FOLOSITE PENTRU EXEMPLIFICRI STUDENT nr_matricol BURSA nr_matricol nume facultate sectia data_nasterii cod_localitate

data_incasarii

tip_bursa

suma_incasata

STUDCAMIN nr_matricol nume_camin LOCALITATE cod_localitate

camera

strada

nume_localitate

cod_judet

judet

regiune

STUDCARTE nr_matricol cota_carte CARTE cota_carte titlu editura AUTORCARTE cod_autor cota_carte AUTOR cod_autor

data_imprumut

domeniu

an_aparitie nr_exemplare pret_unitar

nume_autor

nationalitate

an_nastere

119