Sunteți pe pagina 1din 103

BAZE DE DATE CAPITOLUL I. PROIECTARE (DESIGN) DE DATE (9 sapt.

)
CURS 1. Preliminarii
Bazele de date reprezint un instrument indispensabil pentru sistemele informatice. Modelarea bazelor de date constitue un subiect vast care nu poate fi tratat complet ntr-un singur curs. Baza de date reprezint o modalitate de stocare pe un suport extern a unei mulimi de date care modeleaz un proces (sistem) din lumea real, cu posibilitatea regsirii acesteia. De obicei o baz de date este memorat ntr-unul sau mai multe fiiere. Baza de date nsi poate fi privit ca un fel de cutie de umplere electronic - adic un container pentru o colecie de fiiere de date digitale. Bazele de date sunt manipulate cu ajutorul sistemelor de gestiune a bazelor de date. Acestea, SGBD-urile, sunt responsabile cu crearea, manipularea i ntreinerea unei baze de date. Principala funcie a acestuia este de a permite utilizatorilor (prin intermediul programelor) s acceseze date dintr-o baz de date. Cel mai rspndit model de baze de date este cel relaional, n care datele sunt memorate n tabele. Pe lng tabele, o baz de date relaional mai poate conine: indeci, proceduri stocate, trigger-e, utilizatori i grupuri de utilizatori, tipuri de date, mecanisme de securitate i de gestiune a tranzaciilor etc. Cursul propune trecerea n revist a principalelor probleme care apar n proiectarea i implementarea bazelor de date relaionale. Pentru exemplificarea conceptelor se utilizeaz sistemul de gestiune MySql.

Noiuni folosite n teoria bazelor de date


1. O baz de date : reprezint un ansamblu structurat de fiiere care grupeaz datele prelucrate n aplicaii informatice ale unei persoane, grup de persoane, instituii etc. este definit ca o colecie de date aflate n interdependen, mpreun cu descrierea datelor i a relaiilor dintre ele. Organizarea bazei de date se refer la structura bazei de date i reprezint un ansamblu de instrumente pentru descrierea datelor, relaiilor, restriciilor la care sunt supuse. Sistemul de gestiune a bazei de date (SGBD): este un sistem complex de programe care asigur interferena ntre o baz de date i utilizatorii acesteia (exemple de programe: ACCESS, Fox Pro, PARADOX, ORACLE, MySQL) este software-ul bazei de date care asigur: definirea structurii bazei de date; 1

2.

3.

1)

2) 3) 4) 5) 6) 4.

ncrcarea datelor n baza de date; accesul la baza de date (interogare, actualizare); ntreinerea bazei de date (refolosirea spaiilor goale, refacerea bazei de date n cazul unor incidente); reorganizarea bazei de date (restructurarea i modificarea strategiei de acces); securitatea datelor. Cele teri conceptele de baz utilizate n organizarea bazei de date sunt: entitatea atributul valoarea Prin entitate se nelege un obiect concret sau abstract reprezentat prin proprietile sale. O proprietate a unui obiect poate fi exprimat prin perechea (ATRIBUT, VALOARE). Exemplu: n exemplul Masa x are culoarea alba, atributul este culoare, iar valoarea este reprezentat de cuvntul alb. Alte exemple ar putea fi: (Sex, Feminin), (Nume, POP), (Profesie, Medic), (Salariu, 200). Observaie: Atributele pot caracteriza o clas de entiti, nu doar o entitate. Data este un model de reprezentare a informaiei, accesibil unui anumit procesor (om, program, calculator) i se definete prin: Identificator; Atribut; Valoare.

5.

Funcionarea unei baze de date


Exploatarea unei baze de date aflate pe un suport specific (magnetic), de ctre un utilizator, prin intermediul unui sistem de calcul, avnd la dispoziie un SGBD, parcurge uzual urmtoarele etape: 1. Utilizatorul, aflat la un terminal electronic, pune o "ntrebare" sau lanseaz o cerere de date, referitoare la informaiile din baza de date. ntrebarea se poate pune ntr-un limbaj de cereri specific SGBD-ului cu care se lucreaz (dac utilizatorul este familiarizat cu acest limbaj - de exemplu, SQL, FoxPro, dBase, Oracle) sau utilizatorul poate fi asistat n adresarea cererii de date de ctre SGBD (produsul soft pe care l folosete) printr-un sistem de meniuri, butoane sau ferestre de dialog (obiecte de control). 2. ntrebarea este analizat de ctre calculator, de fapt de SGBD, iar dac este corect, se ncearc (SGBD) s i se dea rspuns prin accesarea informaiilor din baza de date. Rspunsul va fi constituit din mulimea datelor cerute de utilizator, care verific criteriile specificate de acesta. Acest proces de lansare a unei cereri de date care va fi satisfcut prin furnizarea datelor care ndeplinesc proprietile cerute se numete interogarea bazei de date. 3. Rspunsul la cererea de date se va afia pe ecran, se va tipri la imprimant sau se va memora ntr-un fiier. n realizarea unei baze de date se urmrete: micorarea timpului de rspuns la o interogare 2

asigurarea costurilor minime de prelucrare i ntreinere adaptabilitatea la cerine noi (flexibilitate) sincronizarea n exploatarea simultan a datelor de ctre mai muli utilizatori asigurarea proteciei mpotriva accesului neautorizat (confidenialitate) posibilitatea recuperrii datelor n cazul deteriorrilor accidentale (integritate) etc.

Exemplu: n figura 1.1 este prezentat o baz de date foarte mic, ce conine un singur fiier, numit VINOTECA; la rndul su, aceasta cuprinde date despre coninutul unei anumite vinoteci. n figura 1.2 este prezentat un exemplu de operaie de consultare din baza de date, mpreun cu datele returnate prin aceast operaie.

raft#vinproducatoransticlelansat2Cab. SauvignonWindsor19951220043Pinot NoirFetzer19973200422Pinot NoirDehlinger19992200250MerlotClos du Bois199892004 Fig. 1.1. Baza de date pentru VINOTECA (fiierul VINOTECA) Consultare: SELECT vin, raft, producator FROM VINOTECA WHERE lansat = 2004; Rezultat ce apare pe monitorul unui PC:

vinraftproducatorCab. Sauvignon2WindsorPinot Noir3FetzerMerlot50Clos du Bois Fig. 1.2 Exemplu de consultare Observaii: n limbajul SQL, fiierul VINOTECA din figura 1.1 este numit tabela, rndurile unei astfel de tabele pot fi considerate ca nregistrri din fiier, iar coloanele pot fi considerate drept cmpuri.

Realizarea unei baze de date


Realizarea unei baze de date presupune parcurgerea etapelor: 1. analiza domeniului (sistemului) pentru care se realizeaz baza de date; 2. proiectarea structurii bazei de date; 3. ncrcarea datelor n baza de date;

4. exploatarea i ntreinerea bazei de date. 1. Analiza

3. ncrcarea datelor
LMD LMD, LDD Baza de date

2. Proiectarea
LDD LMD

4. ntreinerea

4. Exploatarea

Fig. 1 Realizarea unei baze de date a) Analiza sistemului Analiza sistemului presupune stabilirea temei, analiza componentelor sistemului i analiza legturilor (asocierilor) dintre aceste componente. Rezultatul analizei formeaz modelul conceptual al bazei de date. Cele patru etape necesare realizrii unei baze de date vor fi tratate pe parcusul ntregului curs urmrind un exemplu concret i anume o baz de date pentru o agenie imobiliar din ar, denumit AGENIE IMOBILIAR, care faciliteaz tranzacii de vnzare cumprare ntre vnztor i cumprtor, care gestioneaz documente legate de oferte imobiliare, de ntreinere a nomenclatoarelor specifice domeniului i care ofer o gam larg de rapoarte privind situaia vnzarecumprare. Odat stabilit tema proiectului, se trece la etapa urmtoare, i anume la identificarea tuturor tipurilor de informaii, a legturilor dintre informaii i a operaiilor necesare pentru gestionarea lor. Aceast etap va fi detaliat n cursul urmtor. b) Proiectarea structurii bazei de date Dac etapa de analiz a modelului conceptual se realizeaz independent de un SGBD, prin etapa de proiectare a structurii bazei de date se trece la luarea n considerare a SGBD-ului cu ajutorul cruia va fi implementat i exploatat baza de date. Proiectarea structurii bazei de date reprezint transpunerea rezultatelor obinute n urma analizei modelului conceptual n termenii unui model al datelor suportat de un anumit SGBD. Compilatorul limbajului de descriere a datelor permite aducerea schemei bazei de date la nivelul la care s poat fi memorat n baza de date. Astfel, proiectarea presupune o detaliere, de exemplu, de tip pseudocod a modulelor necesare realizrii bazei de date: module pentru crearea fiierelor, pentru introducerea datelor, pentru prelucrarea i extragerea rezultatelor, pentru tratarea erorilor etc. 4

c) ncrcarea datelor n baza de date Este etapa n care se realizeaz popularea masiv cu date a bazei de date, activitate care trebuie s se efectueze cu un minim de efort. d) Exploatarea i ntreinerea bazei de date Exploatarea bazei de date de ctre diferii utilizatori finali este realizat n scopul satisfacerii cerinelor de informare ale acestora. SGBD sprijin utilizatorii finali n exploatarea bazei de date, oferind o serie de mecanisme i instrumente cum ar fi limbajele de manipulare a datelor (LMD). ntreinerea bazei de date reprezint o activitate complex, realizat, n principal, de ctre administratorul bazei de date i care se refer la actualizarea datelor din cadrul bazei de date.

CURS 2. Construirea de diagrame entitate-relaie


Prima etap pentru realizarea unei baze de date const n analiza sistemului. Se cunosc mai multe tehnici de analiz, dar cea mai des ntlnit este tehnica entitate-relaie. Prin tehnica entiate-relaie (denumit i entitate-asociere) se construiete o diagram entiate-relaie (notat E-R) prin parcurgerea urmtorilor pai: a) identificarea entitilor (componentelor) din sistemul proiectului; b) identificarea asocierilor (relaiilor) dintre entiti i calificarea lor; c) identificarea atributelor corespunztoare entitilor; d) stabilirea atributelor de identificare a entitilor. a) Identificarea entitilor Prin entitate se nelege un obiect concret sau abstract reprezentat prin proprietile sale. Prin convenie, entitile sunt substantive, se scriu cu litere mari i se reprezint prin dreptunghiuri. ntr-o diagram nu pot exista dou entiti cu acelai nume, sau o aceeai entitate cu nume diferite. Pentru baza de date din domeniul imobiliar considerat anterior, se pot pune n eviden urmtoarele entiti: DATE_PERSOAN entitate care stocheaz date personale ale ofertantului (vnztorului) sau ale clientului (cumprtorului); CERERI_ OFERTE conine ofertele sau cererile imobiliare propuse de vnztori, respectiv cumprtori; DESCRIERE_IMOBIL stocheaz informaiile referitoare la imobile; JUDEE entitate ce conine judeele n care sunt amplasate imobilele; LOCALITI - entitate ce conine localitile n care sunt amplasate imobilele; STRZI - entitate ce precizeaz strzile n care sunt amplasate imobilele; FACTURI formularul necesar unei tranzacii de cumprare-vnzare. Figura urmtoare prezint o prim form a diagramei entitate-asociere (E-R). DATE_ PERSOANA CERERI_ OFERTE DESCRIERE_I MOBIL
FACTURI

LOCALITATI JUDETE STRAZI

Fig. 2.1. Diagrama E-R pentru domeniul imobiliar (prima form) b) Identificarea asocierilor dintre entiti i calificarea lor ntre majoritatea componentelor (adic a entitilor) unui sistem economic se stabilesc legturi (asocieri). 6

Exemplu: Exist o asociere ntre entitile CERERI_OFERTE i FACTURI deoarece facturile reprezint finalizarea unei cereri/oferte. Aceast asociere se reprezint ca n figura de mai jos.
(1,1)

CERERI_OFERTE

sunt finalizate prin

(0,1)

FACTURI

Fig. 2.2. Prezentarea asocierii dintre entitile CERERI_OFERTE i FACTURI Sunt necesare precizarea ctorva notaii i noiuni utilizate n exemplul de mai sus: legturile (asocierile) se reprezint prin arce neorientate ntre entiti; fiecrei legturi i se acord un nume plasat la mijlocul arcului i simbolizat printr-un romb (semnificaia legturii); numerele simbolizate deasupra arcelor se numesc cardinaliti i reprezint tipul legturii; cardinalitatea asocierilor exprim numrul minim i maxim de realizri a unei entiti cu cealalt entitate asociat. Exemplu: Cardinalitatea (1,1) ataat entitii CERERI_OFERTA nseamn c o factur poate fi rezultatul tranzacionrii a minim unei cereri/oferte i a unui numr maxim de tot o cerere/ofert. Cardinalitatea (0,1) ataat entitii FACTURI nseamn c o cerere se poate finaliza prin maxim o factur sau prin nici una (0 facturi) . Aceast cardinalitate reiese din analiz: CERERI_O FERTE 1 2 3 FACTURI F1 F2

Fig. 2.3. Determinarea cardinalitii asocierii dintre entitile CERERI_OFERTE i FACTURI Maximele unei cardinaliti sunt cunoscute i sub denumirea de grad de asociere, iar minimele unei cardinaliti, obligativitatea participrii entitilor la asociere.
Tipuri de asocieri (legturi) ntre entiti

Asocierile pot fi de mai multe feluri, iar odat cu asocierea, se impune stabilirea calificrii acesteia. Asocierea dintre entiti se face n funcie de i) cardinalitatea asocierii; ii) numrul de entiti distincte care particip la asociere. i. Dup cardinalitatea asocierii n funcie de maxima cardinalitii (gradul de asociere), se cunosc trei tipuri de asocieri, care, la rndul lor, sunt de dou tipuri, n funcie de minima cardinalitii (gradul de obligativitate al participrii la asociere): asocieri de tip unu la unu; o asocieri pariale de tip unu la unu o asocieri totale de tip unu la unu 7

asocieri de tip unu la mai muli o asocieri pariale de tip unu la muli o asocieri totale de tip unu la muli asocieri de tip muli la muli o asocieri pariale de tip muli la muli o asocieri totale de tip muli la muli. ii. Dup numrul de entiti distincte care particip la asociere: asocieri binare (ntre dou entiti distincte); asocieri recursive (asocieri ale entitilor cu ele nsele); asocieri complexe (ntre mai mult de dou entiti distincte). n continuare se descriu asocierile grupate dup cardinalitatea ei.
Asocieri n funcie de cardinalitatea legturii

1.

Asocieri de tip unu la unu sunt asocieri n care maximele cardinalitii au valoarea 1. E1
(...,1)

(...,1)

E2

Fig. 2.4. Asociere de tip unu la unu Exemplu: Asocierea din figura 2.3 este asociere de tip 1 la 1. 2. Asocieri de tip unu la mai muli sunt asocieri n care maxima cardinalitii unei entiti este unu, iar a celeilalte entiti are valoarea muli.
(...,1) (...,n) (...,n) (...,1)

E1

E2

E1

E2

Fig. 2.5. Asociere de tipul unu la mai muli Exemplu: A LOCALITATI L1 L2 L3


(1,1) i corespunde

B
CERERI_OFERTE

1 2 3
(0,n) CERERI_OFERTE

LOCALITATI

Fig. 2.6. Asociere de unu la mai muli ntre entitile LOCALITI i CERERI_OFERTE 3. Asocieri de tipul muli la muli sunt asocieri n care maximele cardinalitii au valoarea muli. 8

E1

(...,n)

(...,n)

E2

Fig. 2.7. Asociere de tipul muli la muli Exemplu:


DEPOZIT

D1 D2 D3

PRODUS

P1 P2 P3

DEPOZIT

(0,n)

nmagazi neaz

(0,n) PRODUS

Fig. 2.8. Asociere de tipul muli la muli ntre entitile DEPOZIT i PRODUS Observaie: Uneori (n cazul utilizrii unor SGBD), asocierea de tip muli la muli se transform n dou asocieri de tipul unul la muli fiind, de regul, mai uor de implementat i de utilizat i anume: Din
E1
(...,n) A (...,n)

E2

E1

(...,1) A1

(...,n)

E b)

(...,n)

A2

(...,1)

E2

a)

Fig. 2.9. Transformarea unei asocieri de tipul muli la muli (a) n asocieri de tipul unu la muli (b) Exemplu: n cazul exemplului de mai sus (vezi figura 2.8), transformarea asocierii muli la muli n asocieri de tipul unu la muli se poate realiza prin construirea unei noi entiti DEPOZIT_PRODUS astfel:
DEPOZIT_ PRODUS D1-P1 D1-P3 D2-P1 D3-P4 PRODUS P1 P2 P3 P4

DEPOZIT D1 D2 D3 D4

(1,n)

asociaz

(0,n)

(0,n)

asociaz (1,n)

Fig. 2.10. Transformarea asocierii de tipul muli la muli n asocieri de tipul unu la muli Asocieri pariale i totale 9

Printr-o asociere parial se nelege o asociere n care nu exist obligativitatea participrii la aceast asociere a tuturor entitilor vizate, ci numai a unora dintre ele sau a nici uneia. Asocierea parial se caracterizeaz prin faptul c minima cardinalitii ataat unei entiti este zero. Observaii (asupra minimii cardinalitii) minima cardinalitii este zero, are drept rezultat lipsa obligativitii participri partenerului la aceast asociere; minima cardinalitii este mai mare dect zero, are drept rezultat obligativitatea participrii. E1
(0,)

A a)

(,)

E2

E1

(,)

A b)

(0,)

E2

Fig. 2.11 Asocieri pariale ntre entitile E1 i E2 Exemplu: Asocierea dintre entitile CERERI_OFERTE i FACTURI din fig. 2.3 reprezint o asociere parial, deoarece participarea entitii FACTURI nu este obligatorie, minima caracteristicii corespunztoare entitii CERERI_OFERTE fiind 0. O asociere este total dac toate entitile au obligativitatea s participe la asociere, adic minima cardinalitii este mai mare dect zero.
E1
(1,)

A
a)

(1,)

E2

E1

(1,)

A
b)

(n,)

E2

E1

(n,)

A
c)

(1,)

E2

E1

(n,)

A
d)

(n,)

E2

Fig. 2.12 Asocieri totale ntre entitile E1 i E2 n continuare se dau cteva exemple de asocieri totale, respectiv pariale. Exemplu: Asocieri pariale de tip unu la unu CERERI_O FERTE 1 2 3 Exemplu: Asocieri totale de tip unu la unu

FACTURI F1 F2

10

CERERI_O FERTE 1 2 3 Exemplu: Asocieri pariale de tip unu la muli LOCALITATI L1 L2 L3

DESCRIERE_IMOBIL

I1 I2 I3

CERERI_OFERTE

1 2 3

Exemplu: Asocieri totale de tip unu la muli CLASE C1 C2 C3 Exemplu: Asocieri pariale de tip muli la muli
DEPOZIT PRODUS

ELEVI E1 E2 E3 E4

D1 D2 D3 D4 Exemplu: Asocieri totale de tip muli la muli


CURSURI

P1 P2 P3

C1 C2 C3

STUDENTI

S1 S2 S3 S4

Fig. 2.13 Asocieri dup gradul i obiectivitatea lor n exemplul bazei de date AGENTIE_IMOBILIARA, tipurile de asocieri dintre entiti stabilite n funcie de modul n care se desfoar activitatea modelat sunt: JUDETE-LOCALITATI 1:n deoarece unui jude i corespunde mai multe localiti; 11

LOCALITATI-STRAZI 1:n - deoarece unei localiti i corespunde mai multe strzi; STRAZI-CERERI_OFERTE 1:n deoarece unei strzi i poate corespunde mai multe oferte/cereri; FACTURI-CERERI_OFERTE 1:1 deoarece fiecare factur conine doar cte o ofert/cerere; CERERI_OFERTE-DECRIERE_IMOBIL 1:1 fiecrui i se face o singur descriere; FACTURI- DATE_PERSOANA 1:1 o factur este ncheiat de o singur persoan; DATE_PERSOANA -CERERI 1:n o persoan poate lansa mai multe cereri sau oferte de imobil. c) Identificarea atributelor entitilor i a asocierilor dintre entiti Atributele unei entiti reprezint proprieti ale acestora. Atributele sunt substantive, iar pentru fiecare atribut i se va preciza tipul fizic (integer, float, char, string etc.) Exemplu: Entitatea LOCALITI are urmtoarele atribute: codul localitii, notat cod_loc, simbolul de identificare al judeului simbol_jude i denumirea localitii nume_loc. d) Stabilirea atributelor de identificare a entitilor Un atribut de identificare (numit cheie primar), reprezint un atribut care se caracterizeaz prin unicitatea valorii sale pentru fiecare instan a entitii. n cadrul diagramei entitate-asociere, un atribut de identificare se marcheaz prin subliniere sau prin marcarea cu simbolul # plasat la sfritul numelui acestuia.
a (a) E a# (b) E

Fig. 2.14. Notaii uzuale pentru atributele de identificare Exemplu: Ca atribut de identificare putem considera codul numeric personal cnp pentru entitatea DATE_PERSOAN. Pentru ca un atribut s fie atribut de identificare, acesta trebuie s satisfac unele cerine: ofer o identificare unic n cadrul entitii; este uor de utilizat: este scurt (de cele mai multe ori, atributul de identificare apare i n alte entiti, drept cheie extern). Pentru o entitate pot exista mai multe atribute de identificare, numite atribute (chei) candidate. Dac exist mai muli candidai cheie se va selecta unul, preferndu-se unul cu valori mai scurte i mai puin volatile. Exemplu: n urma analizrii celor 4 etape necesare construirii diagramei entitateasociere: identificarea entitilor domeniului sau a sistemului economic; 12

identificarea asocierilor dintre entiti; identificarea atributelor aferente entitilor i asocierilor dintre acestea; stabilirea atributelor de identificare a entitilor, se poate prezenta forma complet a diagramei asociate domeniului ales n exemplu.
STRAZI
(1,1) se regsete (1,n) (1,1) (0,n) are asociat (1,1)

LOCALITAT I

(0,n)

are asociat

(1,1)

JUDETE

CERERI_ OFERTE
(1,1)

(1,n)

conin

DATE_PERSOANA
incheie (1,1) (0,1)

(1,1) finisate (0,1)

FACTURI

conin (1,1)

DESCRIERE _IMOBIL

Fig. 2.15. Diagrama E-R pentru domeniul imobiliar (a doua form) n cazul n care se dorete o diagram care s conin i atributele fiecrei entiti nsoite de precizarea atributelor de identificare (adic a cheilor primare), pentru a nu ncrca imaginea, diagrama proiectului se poate fragmenta pe mici domenii, dup cum este cazul entitii OFERTE, prezentat n figura 2.16. (S-au considerat un numr relativ mic de atribute).
id_co# tipul cnp data_inreg

CERERI_OFERTE

cod_loc id_strada nr_imobil pret_min pret_max


tip_solutionare

13

Fig. 2.16. Reprezentarea atributelor aferente entitii CERERI_OFERTE (detaliu dintr-o diagram E-R) n reprezentarea atributelor aferente entitii CERERI_OFERTE semnificaia atributelor este urmtoarea: cheia primar a entitii id_co reprezint numrul de ordine al cererii sau ofertei de imobil lansat de o anumit pesoan, atributul tipul specific dac este vorba de o cerere sau de o ofert, prin cnp se precizeaz codul numeric personal al clientului, data_inreg reprezint data la care s-a nregistrat oferta/cererea, apoi uremaz cteva date legate de imobil: codul strzii id_strada, numrul imobilului nr_imobil, preul minim, respectiv preul maxim al imobilului pret_min, pret_max. Ultimul atribut, tip_solutionare precizeaz dac cererea/oferta respectiv a fost soluionat; pentru o cerere/oferta nou introdus, acest atribut se va completa cu explicaia de nesoluionat. Astfel, diagrama bazei de date AGENIE IMOBILIAR conine 7 entiti a cror asociere a fost prezentat n figura 2.16.
DATE_PERSOANA cnp# numele adresa nr_telefon email banca_client nr_cont_client FACTURI nr_factura# id_oferta data_factura cnp pret TVA total STRZI id_strada# cod_loc# nume_str LOCALITATI cod_loc# simbol_judet nume_loc JUDETE simbol_judet# nume_judet

_
CERERI-OFERTE id_co # tip cnp data_inreg tip_solutionare cod_loc id_strada nr_imobil pret_min pret_max

DESCRIERE_IMOB IL id_co# tip_imobil etaj nr_camere suprafata garaj centrala_termica termopane

Fig. 2.16. Baza de date AGENIE IMOBILIAR- entiti i atribute

14

CURS 3. Proiectarea modelului relaional


Proiectarea corect a bazelor de date este crucial pentru obinerea unei aplicaii de nalt performan. Modelul relaional este cel mai utilizat dintre modelele de date existente (modele ierarhice, modele reea, modele orientate pe obiect). Fa de modele ierarhic i reea, modelul relaional prezint cteva avantaje: propune structuri de date uor de utilizat; amelioreaz independena logic i fizic; pune la dispoziia utilizatorilor limbaje neprocedurale; optimizeaz accesul la date; mbuntete confidenialitatea datelor. Din punct de vedere istoric, trebuie menionat c modelul relaional s-a conturat n dou articole publicate de ctre F.E. Codd n 1969 i 1970, matematician la centrul de cercetri (California) I.B.M. Codd a propus o structur de date tabelar, independent de tipul de echipamente i de software-ul de sistem pe care este implementat. Dei puternic matematizat, modelul relaional este relativ uor de neles. Dac, teoretic, modelul s-a consacrat n anii 1970, produsele software care s gestioneze baze de date au devenit populare abia n anii 80. Cele mai utilizate sisteme de gestiune a bazelor de date relaionale (SGBDR) dedicate uzului individual sunt: ACCESS, PARADOX, Visual Fox Pro. Pentru aplicaiile complexe din bnci i instituii de mari dimensiuni se folosesc SGBDR-urile de categorie grea, ORACLE, DB2 IBM, Informix IBM, SyBase (SyBase), SQL Server (MicroSoft). Sunt mult mai robuste, fiabile, dar i costisitoare. n ultimul timp i-au fcut apariia aa-zisele SGBD-uri (aproape) gratuite: PostgreSQL, MySQL, mSQL, FireBird etc. (Acestea ruleaz de obicei pe sisteme de operare Linux). Modelul relaional are la baz teoria matematic a relaiilor i poate fi privit ca o mulime de tabele obinute prin metoda normalizrii, eliminndu-se astfel anomaliile de actualizri. Conceptele modelului relaional sunt: 1. structura relaional a datelor; 2. operatorii modelului relaional; 3. restriciile de integritate ale modelului relaional. 3.1 Structura relaional a datelor O baz de date relaional (BDR) reprezint un ansamblu de relaii, prin care se reprezint datele i legturile dintre ele. n cadrul bazei de date relaionale, datele sunt organizate sub forma unor tablouri bidimensionale (tabele) de date, numite relaii. Asocierile dintre relaii se reprezint prin atributele de legtur. n cazul legturilor de tip unu la muli, aceste atribute figureaz ntr-una dintre relaiile implicate n asociere. n cazul legturilor de tip muli la muli, atributele sunt situate ntr-o relaie distinct, construit special pentru explicarea legturilor ntre relaii. Prezentarea structurii relaionale a datelor impune definirea noiunilor de: 15

domeniu; relaie; atribut; schem a unei relaii. Conceptele utilizate pentru a descrie formal, uzual sau fizic elementele de baz ale organizrii datelor sunt date n urmtorul tabel: FormalUzualFizicRealieTablouFiierT upluLinienregistrareAtributColoanCa mpDomeniuTip de datTip de dat Fig. 3.1. Concepte uzuale folosite n exprimarea formal, uzual i fizic Domeniul Domeniul reprezint o mulime de valori, notat prin litere mari D1,D2 etc., caracterizat printr-un nume. Modalitile de definire a unui domeniu sunt: explicit: prin enumerarea tuturor valorilor aparinnd domeniului; implicit: prin precizarea proprietilor pe care le au valorile din cadrul domeniului. Exemplu: D1: {Da, Nu} reprezint un domeniu definit explicit. D2: {x/ x este de dat calendaristic} sau D3: {s/ s este numr decimal} reprezint domenii definite implicit, unde prin numr decimal se nelege un numr zecimal pentru care se precizeaz numrul de cifre componente. Printr-un tuplu se nelege o succesiune de valori de diferite tipuri. Un tuplu se noteaz enumernd valorile sale <V1,V2,V3,...,Vn>, unde V1 este o valoare din domeniul D1, V2D2 etc. Exemplu: Considerm c tuplul referitor la persoana x din entitatea CERERI_OFERTE conine trei valori diferite ce desemneaz: codul numeric personal (cnp): 1701205230023; data nregistrrii ofertei (data_nreg): 2006-07-03; tipul soluionrii (tip_soluionare): Nu. Se formeaz tuplul <1701205230023, 2006-07-03, Nu>. Relaia Relaia R este un subansamblu al produsului cartezian dintre mai multe domenii D1, D2, ..., Dn, reprezentat sub forma unei tabele de date (tabelul bidimensional) i deci, o mulime de tupluri. Exemplu: Considerm c: D1 cuprinde valori referitoare la tipul soluionrii tranzaciei: Da, dac tranzacia a fost soluionat, Nu, n caz contrar; D2 cuprinde valori ale datei calendaristice; D3 conine valori care exprim cnp-ul persoanei. 16

De asemenea considerm c se cunosc datele a doi ofertani i c fiecare pune n vnzare doar cte un imobil. Atunci definim relaia R prin tuplurile care descriu aceste informaii ale ofertelor celor dou persoane:
R: {<1701205230023,2006-07-03, Nu>, <2661805270023,2006-05-27, Da>}.

sau R: D2
2661805270023 1701205230023

D3
2006-05-27 2006-07-03

D1
Da Nu

Fig. 3.2. Variante de prezentare a unei relaii R Observaia 1. ntr-o relaie, tuplurile trebuie s fie distincte. Observaia 2. Cardinalul relaiei este numrul tuplurilor dintr-o relaie. Gradul relaiei este numrul valorilor dintr-un tuplu. Atributul Atributul reprezint coloana unei tabele de date, caracterizat printr-un nume. Exemplu: R: cnp: D data_nreg:D tip_
2 3

soluionare:D3

2661805270023 1701205230023

2006-05-27 2006-07-03

Da Nu

Fig. 3.3. Relaia R reprezentat cu ajutorul atributelor Atributele sunt utile atunci cnd ntr-o relaie un domeniu apare de mai multe ori. Prin numele dat fiecrei coloane (atribut), se difereniaz coloanele care conin valori ale aceluiai domeniu, eliminnd dependena fa de ordine. Schema unei relaii Schema unei relaii este numele relaiei urmat de lista de atribute, pentru fiecare atribut precizndu-se domeniul asociat. Astfel, pentru o relaie R cu atributele A1, A2, ... , An i domeniile D1, D2, ... ,Dm, cu m n, schema relaiei R poate fi prezentat astfel: R(A1: D1, A2:D2, ... , An: Dm) sau R: A1:D1 ... An:Dm Fig. 3.4. Reprezentarea schemei relaiei R Ca o concluzie, dintre caracteristicile modelului relaional menionm: - nu exist tupluri identice; - ordinea liniilor i a coloanelor este arbitrar; - articolele unui domeniu sunt omogene; 17

- fiecare coloan definete un domeniu distinct i nu se poate repeta n cadrul aceleiai relaii.

18

CURS 4. Operatorii modelului relaional


3.2 Operatorii modelului relaional
Modelul relaional ofer dou colecii de operatori pe relaii: algebra relaional; calcul relaional: calcul relaional orientat pe tuplu; calcul relaional orientat pe domeniu. n acest curs va fi tratat doar cazul algebrei relaionale. Algebra relaional este o colecie de operaii pe relaii, fiecare operaie avnd drept operanzi una sau mai multe relaii, rezultatul fiind o alt relaie. Exist mai multe criterii de grupare a operaiilor: operaii de baz: reuniunea; diferena; produsul cartezian etc. operaii derivate: intersecia; diviziunea etc. sau operaii tradiionale pe mulimi (reuniune, intersecie, diviziune, produs cartezian) operaii relaionale speciale (selecia, proiecia, jonciunea, etc.) Reuniunea Reuniunea reprezint o operaie a algebrei relaional definit pe dou relaii: R1 i R2, ambele cu aceeai schem, n urma creia se construiete o nou relaie R3, cu aceeai schem ca i R1 i R2 i avnd drept extensie tuplurile din R1 i R2, luate mpreun o singur dat. Notaii: R1U R2 OR (R1, R2) APPEND (R1, R2) UNION (R1, R2) Reprezentarea grafic R3

R1 R2

Fig. 4.1. Reprezentarea grafic a operaiei de reuniune a dou relaii

19

Exemplu: Deoarece aplicaia AGENTIE IMOBILIARA luat ca exemplu n acest curs nu conine dou relaii cu aceeai structur, pentru a putea exemplifica operaia de reuniune se vor construi dou relaii ARHIVA_OFERTE i ARHIVA_CERERI populate cu informaiile aferente ofertelor respectiv cererilor soluionate (s-au ales doar trei atribute: id-ul ofertei sau a cererii, cnp-ul clientului, tipul soluionrii). Pentru a afla care sunt toate ofertele i cererile soluionate, se realizeaz operaia de reuniune.
REZ:

idtipulcnptip_solutionare1066oferta2660805270023 t Da1210oferta1881106300897Da220cerere282050630 D1 0898Da1 0 1316cerere1881106300897Da

ARHIVA_OFERTE: ARHIVA_CERERI:

idtipulcnptip_solutionare1066oferta266080527002 t 3Da1210oferta1881106300897Da 3 1

idtipulcnptip_solutionare210cerere2820506300898 t Da1316cerere1881106300897Da D1

Fig. 4.2. Reuniunea relaiilor ARHIVA_OFERTE i ARHIVA_CERERI Diferena Diferena reprezint o operaie a algebrei relaionale definit pe dou relaii R1 i R2, ambele cu o aceeai schem, n urma creia se construiete o nou relaie R 3, cu schema identic cu R1 i R2, avnd drept extensie acele tupluri ale relaiei R1 care nu se regsesc n relaia R2. Notaii: R1 R2 REMOVE (R1, R2) MINUS (R1, R2) Reprezentarea grafic: R3

R1 R2

Fig. 4.3. Reprezentarea grafic a operaiei de diferen a dou relaii Exemplu: Presupunnd c exist clieni care au nregistrri n ambele tabele (adic au oferit imobil spre vnzare, dar i au achiziionat un alt imobil n acelai timp), pentru a afla care au fost doar ofertanii de imobile, se aplic diferena dintre relaiile ARHIVA_OFERTE i ARHIVA_CERERI.

20

REZ:

idtipulcnptip_solutionare2066oferta266080527002 t 3Da 3

ARHIVA_OFERTE: ARHIVA_CERERI:

idtipulcnptip_solutionare1210oferta188110630089 t 7Da2066oferta2660805270023Da 7 2

idtipulcnptip_solutionare0221cerere282050630089 t 8Da1210cerere1881106300897Da3161cerere26901 8 1 25270032Da 2

Fig. 4.4. Diferena relaiilor ARHIVA_OFERTE i ARHIVA_CERERI Produsul cartezian Produsul cartezian reprezint o operaie a algebrei relaionale definit pe dou relaii R1 i R2, n urma creia se construiete o nou relaie R3, a crei schem se obine prin concatenarea schemelor relaiilor R1 i R2, avnd ca extensie toate combinaiile tuplurilor din R1 cu cele din R2 (operaie laborioas). Notaie: R1xR2 PRODUCT (R1, R2) TIMES (R1, R2) Reprezentarea grafic: R3

R1

R2

Fig. 4.5. Reprezentarea grafic a produsului cartezian Exemplu: Operaia de produs cartezian va fi exemplificat pe un exemplu independent de aplicaia AGENIA IMOBILIAR considerat. Astfel:
TRANSPORT:

Localit D1Jude D1Transport D3Tarif D4BoraMaramureautobus11 000BraovBraovautobuz11 DB 000 0 BoraMaramuretroleibuz10 000BraovBraovtroleibuz10 000 0 B

L Localit D1Jude D1Baia M MareMaramureBraovBra ov 21

LOCALIT:

TARIFE:

T Transport D3Tarif D4autobuz11 0 t 000troleibuz10 000

Fig. 4.6. Produsul cartezian dintre relaiile LOCALIT i TARIFE Proiecia Proiecia reprezint o operaie a algebrei relaionale definit asupra unei relaii R, n urma creia se construiete o nou relaie P, n care se gsesc acele atribute din R specificate explicit n cadrul operaiei. Prin operaie de proiecie se trece de la o relaie de grad n (are n coloane) la o relaie de grad mai mic, p (p<n). Notaie: A j , A j ,..., Am ( R ) R[ A j , A j ,..., Am ] PROJECT ( R, A j , A j ,..., Am ) Reprezentarea grafic: P Aj,Aj,...,Am R Fig. 4.7. Reprezentarea grafic a operaiei de proiecie Exemplu: Pentru a obine o list cu numele i numerele de telefon ale ofertanilor/cumprtorilor, se poate aplica operaia de proiecie a relaiei DATE_PERSOANE asupra atributelor numele, nr_telefon REZ: numelenr_telefonPop Ana-Sas n P I Ioan0362/409209

numele, nr_telefon DATE_PERSOANA:

cnpnumeleadresanr_telefonemail1701205230032Pop AnaStr. Viilor, nr.55/4, n Oradea, Bihorpa@yahoo.it p 2660805270023Sas IoanStr. Victoriei, nr.22/12, Baia Mare, Maramures0362/409209M

Fig. 4.8. Proiecia relaiei DATE_PERSOANA pe atributele numele, nr_telefon Selecia 22

Selecia reprezint o operaie din algebra relaional definit asupra unei relaii R, n urma creia se construiete o nou relaie S, cu aceeai schema ca R, avnd extensia construit din acele tupluri din R care satisfac o condiie menionat explicit n cadrul operaiei (se poate interpreta ca tiere orizontal: nu toate tuplurile din R satisfac aceast condiie). Condiia precizat n cadrul operaiei de selecie se reprezint sub forma: atribut, operator de comparaie, valoare unde operator de comparaie poate fi unul din semnele <, <=, >=, > sau . Notaie: condiie (R) R [condiie] RESTRICT (R, condiie) Reprezentarea grafic: S condiie

R Fig. 4.9. Reprezentarea grafic a operaiei de selecie Exemplu: n cazul n care se dorete afiarea ofertelor/cererilor anterioare datei de 2006-07-03, se poate aplica operaia de selecie asupra relaiei CERERI_OFERTE, dup cum se va vedea n figura 4.10.
OFERTE VECHI: id_ co#tipulcnp data_ inregCod_locId_ stradaNr_ imobiletajPret_minPret_ maxId_confort12oferta26608052700232006-05-27CJ14712022P45470012 m 1

Data_nreg<2006-07-03 OFERTE: id_ co#tipulcnp data_ inregCod_locId_ stradaNr_ imobiletajPret_minPret_ maxId_confort12oferta26608052700232006-05-27CJ14712022P4547001313oferta17012052300232006-07I 1

0 03BV23012052230350012 Fig. 4.10. Selecia efectuat asupra relaiei CERERI_OFERTE Jonciunea Jonciunea (joinul) reprezint o operaie a algebrei relaionale definit pe dou relaii: R1 i R2, n urma creia se construiete o alt relaie R3, prin concatenarea 23

unor tupluri din R1 cu tupluri din R2 care ndeplinesc o anumit condiie specificat explicit n cadrul operaiei. Notaie: R1 R2; JOIN(R1,R2,condiie) Reprezentarea grafic:
R3

atribut din R1

atribut din R2 Operator de comparaie R2

R1

Fig. 4.11. Reprezentarea grafic a operaiei de jonciune Condiia de concatenare din cadrul operaiei de jonciune este de forma: atribut din R1 operator de comparaie atribut din R2 n funcie de operatorul de comparaie din condiia de concatenare, joinul poate fi de mai multe feluri, ns cel mai important este equijoinul: atribut din R1 = atribut din R2

Exemplu: Aplicnd operaia de equijoin relaiilor DATE_PERSOANE i FACTURI pentru atributul cnp, se obin informaii referitoare la clienii care au ncheiat facturi. Pentru a nu ncrca figura, pentru cele dou relaii s-au ales doar cteva atribute.
REZ :
cnpnumeleadresanr_telefonnr_ facturaid_cocnp1551212245038Pop RaduStr. Al. Cuza, nr.4/34, c Ploiesti074430450522431551212245038 2

cnp

cnp

=
DATE_PERSOANA:

FACTURI:

cnp#numeleadresanr_ telefon1551212245038Pop RaduStr. Al. Cuza, nr.4/34, t Ploiesti07443045052560405570053Chis AlinaStr. Luminii, 76, P Buzau0721435622 B

nr_ factura#id_cocnp2243155121224 f 5038 5

Fig. 4.12. Operaia de equijoin a relaiilor DATE_PERSOANA i FACTURI Observaie: Operaia de jonciune se poate exprima cu ajutorul operaiilor de produs cartezian i selecie, rezultatul unui join fiind asemenea cu cel al operaiei de selecie asupra unui produs cartezian: 24

JOIN (R1, R2, condiie) = RESTRICT (PRODUCT (R1, R2), condiie). Este indicat utilizarea joinului n locul produsului cartezian, de cte ori este posibil. Tipuri de jonciuni n funcie de tipul condiiilor de conectare modul de definire a schemei extensia relaiei rezultate prin jonciune, vom studia: jonciunea natural jonciunea extern semijonciunea. Jonciunea natural Jonciunea natural este o operaie definit pe dou relaii R1 i R2, n urma creia se construiete o nou relaie R3, a crei schem este obinut prin reuniunea atributelor din relaiile R1 i R2 (atributele cu aceleai nume se iau o singur dat) i a crei extensie conine tuplurile obinute prin concatenarea tuplurilor din R1 cu cele din R2 care prezint aceleai valori pentru atributele cu aceleai nume. Jonciunea natural elimin inconvenientul ce apare n cazul equijoinului i anume: schema relaiei n cazul equijoinului conine toate atributele celor dou relaii. Astfel, n relaia R3 a jonciunii naturale, atributele cu acelai nume vor aprea o singur dat. Reprezentarea grafic:
R3

R1

R2

Fig. 4.13. Reprezentarea grafic a operaiei de jonciune natural Exemplul 1: Relund exemplul anterior, prin jonciunea natural se elimin atributul repetitiv cnp.

25

REZ :

cnpnumeleadresanr_telefonnr_ f facturaid_co1551212245038Pop RaduStr. Al. I. Cuza, nr.4/34, Ploiesti07443045052243 2

cnp

cnp

=
DATE_PERSOANA:

FACTURI:

cnp#numeleadresanr_ telefon1551212245038Pop RaduStr. Al. Cuza, nr.4/34, t Ploiesti07443045052560405570053Chis AlinaStr. Luminii, 76, P Buzau0721435622 B

nr_ factura#id_cocnp2243155121224 f 5038 5

Fig. 4.14. Operaia de jonciune natural a relaiilor DATE_PERSOANA i FACTURI Exemplul 2: Dac se dorete aflarea denumirilor localitilor n care sunt oferte sau cereri, cum n relaia CERERI_OFERTE se afl doar codul localitii respective iar n relaia LOCALITATI este asociat fiecrui cod de localitate denumirea localitii, trebuie s se realizeze o jonciune natural ntre aceste dou relaii. Astfel rezultatul jonciunii va fi cel prezentat n figura 4.15.
REZ:
id_ co#tipulcnp data_ inregcod_ locid_ stradanr_ imobilpret_ minpret_ maxtip_ solutionarenume _locsimbol_ judet12oferta17012052300232006-07-03BV230120523035daBrasovBV234cerere27608052700242006-05s 1

2 27CJ400120224547daCluj-NapocaCJ

cod_loc

cod_loc

LOCALITATI:

cod_loc#nume_locsimbol _judetCJ400Cluj_ NapocaCJB N BV230BrasovBV CERERI_OFERTE:

id_ co#tipulcnp data_ inregcod_locid_ stradanr_ imobilpret_ minpret_ maxtip_ solutionare1 s 12oferta17012052300232006-07-03BV230120523035da234cerere27608052700242006-09-

2 21CJ400120224547da44oferta26611112466422006-09-17MM430133450nu 4 Fig. 4.15. Jonciunea natural a relaiilor CERERI_OFERTE i LOCALITATI Jonciunea extern 26

Jonciunea extern este operaia definit pe dou relaii: R1 i R2, n urma creia se obine o nou relaie R3 prin joncionarea relaiilor R1 i R2. n relaia R3 apar i tuplurile din R1 i R2 care nu au participat la join (atributul de jonciune cel care are acelai nume i n relaia R1 i n relaia R2 nu prezint aceleai valori). Aceste tupluri sunt completate cu valora NULL. Jonciunea extern elimin inconvenientul cauzat de jonciunea intern i anume pierderea de tupluri (vezi figura 4.15, tuplul <44,oferta, 2661111246642, 200609-17, MM430, 133, 4, 50, nu> nu mai apare n relaia REZ deoarece simbolul MM430 corespunztoare atributului cod_loc din relaia CERERI_OFERTA nu figureaz printre valorile atributului cu acelai nume din relaia LOCALITATI. Reprezentarea grafic:
R3

R1

R2

Fig. 4.16. Reprezentarea grafic a operaiei de join extern Exemplu: Jonciunea extern este o operaie care din punct de vedere al programrii prezint inconvenientul manipulrii valorilor nule. n relaia REZ, judeului Braov nu i s-a asignat o localitate, deci nici codul localitii.
REZ:

cod_loc#denumiresimbol_judetdenumire430Baia MareMMMaramures435BorsaMMMaramures400ClujNapocaCJCluj710BotosaniBT---BVBrasov

simbol_judet

simbol_judet

LOCALITATI:

JUDETE:

cod_loc#nume_locsimbol_judet430Baia MareMM435BorsaMM400ClujNapocaCJ710BotosaniBT

simbol_judet#nume_judetMM MaramuresCJClujBVBrasov

Fig. 4.17. Operaia de jonciune extern a relaiilor LOCALITI i JUDEE Semijonciunea 27

Semijonciunea este o operaie definit pe dou relaii R1 i R2, n urma creia se construiete o nou relaie R3, a crei extensie conine tuplurile relaiei R1 care particip la jonciunea celor dou relaii, conservnd atributele relaiei R1. Notaie: R1 R2; SEMIJOIN(R1, R2). Reprezentarea grafic:
R3

R1

R2

Fig. 4.18. Reprezentarea grafic a operaiei de semijonciune Exemplu: Semijonciunea urmtoare realizeaz lista localitilor care au referin n relaia JUDETE.
REZ:

cod_loc#denumiresimbol_judetdenumire430Baia MareMMMaramures435BorsaMMMaramures400ClujNapocaCJCluj

simbol_judet

LOCALITATI:

JUDETE:

cod_loc#nume_locsimbol_judet430Baia MareMM435BorsaMM400ClujNapocaCJ710BotosaniBT

simbol_judet#nume_judetM MMaramuresCJClujBVBrasov

Fig. 4.19. Operaia de semijonciune a relaiilor LOCALITATI i JUDETE Observaia 1. Aceast operaie a fost introdus de P.A. Bernstein, fiind necesar la optimizarea cererilor de date. Observaia 2. Semijonciunea produce acelai rezultat ca operaia de proiecie pe atributele din relaia R1 efectuat asupra jonciunii dintre R1 i R2 PROJECT (JOIN (R1, R2, condiia), A1, A2, A3)=SEMIJOIN (R1, R2). Intersecia Intersecia reprezint o operaie algebrei relaionale definit pe dou relaii, R1 i R2, ambele cu aceeai schem, n urma creia se construiete o nou relaie R3, 28

cu schema identic cu a operanzilor i cu schema format din tuplurile comune lui R1 i R2. Notaie: R1R2 INTERSECT (R1, R2) AND (R1, R2) Reprezentarea grafic: R3

R1

R2

Fig. 4.20. Reprezentarea grafic a operaiei de intersecie Exemplu:


REZ:

l localitatejudetepopulatieBrasovBraso v v350 000

ORASE:

MUNICIPII:

l localitatejudetepopulatieBorsaMaram u ures27 000BrasovBrasov350 000 B

l localitatejudetepopulatieBaia
MareMaramures148 270BrasovBrasov350 000 2 B

Fig. 4.21. Intersecia relaiilor ORASE i MUNICIPII Observaie: Intersecia se poate exprima prin intermediul unor operaii de baz. De aceea intersecia este o operaie derivat. R1R2=R1-(R1-R2) R1R2=R2-(R2-R1) Diviziunea Diviziunea reprezint o operaie a algebrei relaionale definit asupra unei relaii R cu schema R(A1:D1, , Ap:Dk, , Ap+1:Di, , An:Dm), n urma creia se construiete o nou relaie Q cu ajutorul unei relaii r cu schema r (A p+1:Dl, , An:Dm), relaia Q avnd schema: Q(A1:D1, , Ap:Dk). Tuplurile relaiei Q concatenate cu tuplurile relaiei r permit obinerea tuplurilor relaiei R. Notaie: Rr Division (R, r). Reprezentarea grafic: 29

Fig. 4.22. Reprezentarea grafic a operaiei de diviziune Exemplul se lasa ca exerciiu suplimentar. Observaie: Operaia de diviziune este o operaie derivat deoarece se poate exprima prin intermediul operaiilor de baz: a diferenei, a produsului cartezian i a proieciei: R r = A1 ,..., Ap ( R ) A1 ,..., Ap (( A1 ,..., Ap ( R ) r ) R ) .

Complementarea Complementarea reprezint o operaie (adiional) a algebrei relaionale definit asupra unei relaii R, n urma creia se construiete o nou relaie C, numit complementarea relaiei R. Extensia relaiei C va conine ansamblul tuplurilor din produsul cartezian al domeniilor asociate atributelor relaiei, care nu figureaz n extensia relaiei considerate. Notaii: R NOT (R) COMP(R) Exemplu: Fie relaia: R(A1:D1, A2:D2), unde A1 = culoare; A2 = numr; D1 = {Rou, Galben, Albastru} D2 = {1, 2, 3} reprezentat prin tabelul: R: A1:D1 Rou Rou Galben A2.D2 1 2 3 a) relaia R

Complementarea relaiei R va fi relaia NOT (R) repezintat prin tabelul: NOT (R): A1:D1 A2:D2 Rou 3 Galben 1 Galben 2 Albastru 1 30

Albastru 2 Albastru 3 b) relaia not R Fig. 4.24. Complementarea relaiei R Observaie: Complementaritatea este puin utilizat, datorit rezultatului foarte mare de tupluri. Splitarea Splitarea (spargerea) reprezint o operaie (adiional) a algebrei relaionale definit asupra unei relaii R, n urma creia se construiesc dou relaii R1 i R2 cu aceeai schem cu R, relaii obinute pe baza unei condiii definite asupra atributelor din R. Extensia lui R1 conine tuplurile din R care verific condiia specificat, iar R 2 conine tuplurile din R care nu verific aceast condiie. Exemplu: Considernd relaia R din figura 4.24 (a) i condiia A2>2, operaia de splitare a relaiei R produce relaiile R1 i R2 reprezentate prin tabelele: R1 A1:D1 A2:D2 Galben 3 R2 A1:D1 A2:D2 Rou 1 Rou 2 Figura 4.25. Rezultatul operaiei de splitare a relaiei R din figura 4.24 (a) pe baza condiiei A2>2 nchiderea tranzitiv nchiderea tranzitiv este o operaie (adiional) a algebrei relaionale, definit asupra unei relaii R, a crei schem conine dou atribute A1 i A2 cu acelai domeniu asociat, operaie care const n adugarea la relaia R a tuplurilor care se obin succesiv prin tranzitivitate: dac n R exist tuplurile: <a,b> i <b,c> se va aduga la R tuplul <a,c>. Notaie: (R ) R+ CLOSE(R) Exemplu:

31

R:
Persoana: DUrma: DAnaMariaAnaIonIo

(R) :
Persoana: DUrma: DAnaMariaAnaIonIo

nVasileIonNicoletaM ariaOana
a)

nVasileIonNicoletaM ariaOanaAnaOanaAn aVasileAnaNicoleta


b)

Fig. 4.26. nchiderea tranzitiv a relaiei R

32

CURS 5. Restricii de integritate ale modelului relaional

3.3 Restricii de integritate ale modelului relaional Restriciile de integritate ale modelului relaional reprezint cerine pe care trebuie s le ndeplineasc datele din cadrul bazei de date pentru a putea fi considerate corecte i coerente n raport cu lumea real pe care o reflect. Dac o baz de date nu respect aceste cerine, ea nu poate fi utilizat cu un maxim de eficien. Restriciile sunt de dou tipuri: restricii de integritate structurale, care se definesc prin egalitatea sau inegalitatea unor valori din cadrul relaiilor: restricia de unicitate a cheilor; restricia entitii; dependenele ntre ele; restricii de integritate de comportament care in cont de semnificaia valorilor din cadrul bazei de date. Utilizarea modelului relaional nu impune definirea i verificarea tuturor acestor tipuri de restricii de integritate. Din acest punct de vedere exist restricii de integritate minimale. Acestea sunt obligatoriu de definit i de respectat cnd se lucreaz cu modelul relaional. Dintre restriciile minimale fac parte: restricia de unicitate a cheii; restricia referenial; restricia entitii. Alte restriciii de integritate ar fi dependenele; restricii de comportament. Restricii de integritate minimale Restriciile de integritate minimale sunt definite n raport cu noiunea de cheie a unei relaii. Cheia identific un tuplu n cadrul unei relaii fr a face apel la toate valorile din tuplu. Cheia unei relaii reprezint ansamblul minimal de atribute prin care se poate identifica n mod unic orice tuplu al relaiei. Oricare relaie posed cel puin o cheie: cheie simpl, cnd cheia este construit dintr-un singur atribut; cheie compus, cnd cheia este construit din mai multe atribute.

33

Exemplul 1:
R2: R1:

A:DAB:DBa1b1a2b3 3 a3b2 2
a) cheie simpl

ADAB:DBa1b1a1 A b2a2b3a3b2 2

b) cheie compus

Fig. 5.1. Chei simple i chei compuse Determinarea cheii unei relaii necesit cunoaterea tuturor extensiilor posibile, nu numai a aceleia din momentul n care se stabilete cheia. Astfel, presupunnd c R1 i R2 sunt versiuni ale aceleiai relaii R la momente de timp diferite: t1, respectiv t2, alegerea la momentul t1 drept cheie atributul A a relaiei R se dovedete a fi greit, ntruct atributul A nu face posibil identificarea unic a tuplurilor i la momentul t2. Cheia relaiei R este reprezentat, prin urmare, de perechea de atribute (A,B). Exemplul 2:
JUDETE: STRAZI:

simbol_judet#nume_judMM MaramuresABAlba

s simbol_judecod_loc#id_strad#nume_strBVBV230120I n ndependeneiBVBV230078GriiCJCJ147120Cireilor B C

Fig. 5.2. Chei simple i chei compuse n cadrul relaiilor JUDEE, respectiv STRZI Observaie: Cheia relaiei JUDEE este simbol_jude deoarece fiecare jude are o codificare unic a denumirii sale, deci fiecrui jude i corspunde un singur simbol. Cheia relaiei STRZI este compus din atributele cod_loc i id_strada. Dac s-ar alege drept cheie primar doar atributul id_strada, acesta nu ar identifica n mod unic numele unei strzi dintr-o localitate, numele strzii respective putndu-se regsi i n alte localiti ale aceluiai jude sau a altui jude. La fel, dac s-ar alege drept cheie primar atributul cod_loc, acesta nu ar mai identifica n mod unic un tuplu, deoarece ntr-o localitate exist mai multe strzi. O relaie poate avea mai multe combinaii de atribute, cu proprietatea de identificare unic a tuplurilor. Se spune n acest caz c relaia posed mai muli candidai cheie (chei candidate). Definiia 1. Se numete cheie primar, cheia aleas dintre cheile candidate care s serveasc n mod efectiv la identificarea tuplurilor. Cheia primar nu poate fi reactualizat. Cheia primar a unei relaii nu este altceva dect atributul de identificare a unei entiti, prin urmare se reprezint fie prin subliniere, fie urmate de semnul #. Definiia 2. Se numete cheie extern atributul/grupul de atribute dintr-o relaie R1 a crui/cror valori sunt definite pe acelai domeniu/aceleai domenii ca i cheia primar a unei alte relaii R2 i care are rolul de a modela asocierea ntre entitile 34

reprezentate prin relaiile R1 i R2. n acest caz, R1 se numete relaie care refer, iar R2 se numete relaie referit. Exemplul 1:
DATE_PERSOANA: JUDETE:

cnpnumele simbol_ judet j 1701205230023Sas IoanBV2 I 2660805270023Pop Ana

CJ

simbol_judetdescriereBVBraso d vC CJClujM MMMaramures

Fig. 5.3. Reprezentarea legturii dintre relaiile DATE_PERSOANA i JUDETE cu ajutorul cheii externe simbol_judet din cadrul relaiei DATE_PERSOANA Observaia1: n exemplul de mai sus, relaia DATE_PERSOANA are drept cheie primar atributul cnp, iar ca i cheie extern atributul simbol_judet, iar relaia JUDETE are drept cheie primar cheia simbol_judet. Relaia DATE_PERSOANA este relaia care refer, iar JUDETE este relaia referit. Observaia2: ntre cele dou relaii (entiti) avem urmtoarea asociere: (0,n) (1,1) are DATE_PERSOANA JUDETE reedina Fig. 5.4. Asocierea dintre entitile DATE_PERSOANA i JUDETE Exemplul 2:
JUDETE: LOCALITATI:

s simbol_judet#nume_judB V VBraovCJCluj C

s simbol_judecod_loc#nume_locBV B BV230BraovCJCJ147Dej C

STRZI:

s simbol_judetcod_loc#id_strada#nume_strBVBV230001I n ndependeneiBVBV230002GriiCJCJ147003Cireilor B C

Fig. 5.5. Reprezentarea legturii ntre relaiile JUDETE i LOCALITATI cu ajutorul cheilor externe simbol_judet i cod_localitate Restricia de unicitate a cheii Restricia de unicitate a cheii impune ca ntr-o relaie s nu existe dou linii identice (linii care s nu conin aceleai valori pentru toate atributele). Altfel spus, restricia de unicitate a cheii impune ca ntr-o relaie s nu existe dou tupluri cu o aceeai valoare pentru atributul cheie. Exemplele 1 i 2 respect restricia de unicitate a cheii. 35

Restricia referenial Restricia referenial impune ca ntr-o relaie R1 care refer o relaie R2, valorile cheii externe s figureze printre valorile cheii primare din R2 sau s fie valori null (nedefinite). R1 i R2 nu trebuie s fie neaprat distincte. Exemplele 1 i 2 prezint un mecanism de legare a relaiilor i respect restricia referenial a cheii.

Restricia entitii Restricia entitii impune ca ntr-o relaie atributele cheii primare s fie nenule. (Atributele cheie s nu conin valori nule). Dac exist valori null, cheia i poate pierde rolul de identificator de tuplu. Astfel, la ncrcarea unui tuplu, valoarea cheii trebuie s fie cunoscut, pentru a se putea verifica faptul c aceast valoare nu exist deja ncrcat. Exemplele 1 i 2 respect restricia entitii. Relaia REZ din figura 4.17 ncalc restricia entitii deoarece exist chei primare ce conin valori nule, dup cum este cazul judeului Braov. Alte restricii de integritate n categoria restricii de integritate intr urmtoarele tipuri de restricii: a) restricii referitoare la dependena datelor: dependen funcional; dependen multivaloare; dependen jonciune b) restricii de comportament: restricii de domeniu; restricii temporale. Restriciile referitoare la dependena datelor, reprezint modul n care datele depind unele de altele.

Dependenele funcionale Dependenele funcionale reprezint dependena ntre date prin care se poate identifica un atribut/grup de atribute prin intermediul altui atribut/grup de atribute. Dac X i Y sunt dou subansamble de atribute ale atributelor relaiei R, spunem c ntre X i Y exist o dependen funcional, notat X Y , dac i numai dac: (i) fiecare valoare a lui X poate fi asociat unei singure valori din Y, i (ii) dou valori distincte ale lui X nu pot fi asociate dect aceleiai valori ale lui Y. X se numete determinantul (sursa) dependenei, iar Y se numete determinatul (destinaia) dependenei. Exemple: Urmtoarele atribute se afl n dependen funcional: cod_potallocalitate, deoarece unui cod potal i corespunde o singur localitate (sensul dependenei este foarte important, deoarece, viceversa ar nsemna: o localitate are un singur cod_potal); 36

nr_facturdata_factur, deoarece cunoaterea numrului facturii determin cu exactitate data facturii. Dou atribute nu sunt n dependen funcional, notat X Y, atunci

cnd cunoaterea unei valori a primului atribut fie nu permite cunoaterea nici uneia dintre valorile celui de al doilea atribut, fie permite cunoaterea mai multor valori ale celui de al doilea atribut. Exemplu: Urmtorul atribut nu se afl n dependen funcional: cnp nr_factur, deoarece pentru o persoan se pot ntocmi mai multe facturi (aferente fiecrei vnzri). n cadrul modelului relaional, o dependen funcional este reprezentat printr-o sgeat ce pornete din surs i se termin n destinaie.
FACTURI:

nr_factura#data_facturiicnp12006-0705170120523002322006-06-282581023457723 Fig. 5.6. Reprezentarea dependenei funcionale ntre atributele nr_factura i data_facturii Dependenele multivaloare Dependenele multivaloare reprezint dependena n care un atribut/ grup de atribute poate reprezenta/ identifica mai multe valori pentru o singur valoare a unui alt atribut/ grup de atribute. Dac X,Y i Z sunt trei subansambluri de atribute ale atributelor relaiei R, spunem c ntre X i Y exist o dependen multivaloare, notat X Y sau X Y | Z , dac i numai dac: (i) la fiecare valoare a lui X poate fi asociat una sau mai multe valori ale lui Y, i (ii) aceast asociere nu depinde de apariiile lui Z. Altfel spus, dac X Y i (x,y,z), (x,y,z) sunt dou tupluri din R, atunci i (x,y,z), (x,y,z) sunt tupluri din R. Exemplu: n relaia OFERTE (alctuit din atributele: id_tip_oferte, cnp i simbol_judet) valorile atributului id_tip_oferte au urmtoarea semnificaie: 01 desemneaz imobil de tip apartament, iar 02, imobil de tip cas. Astfel, urmtoarea relaie conine dependene multivaloare:
OFERTE:

i id_tip_ofertecnpsimbol_judet011701205230023 MM012581023457723MM021701205230023S M012581023457723SM012581023457723SM0 22581023457723CJ deoarece 37

01 01 01 01

1701205230023 MM 2581023457723 SM 1701205230023 SM 2581023457723 MM

Fig. 5.7. Relaia OFERTE n care exist dependen multivaloare Dependenele de jonciune Dac X1, X2, ...,Xm sunt m subansambluri de atribute din relaia R, spunem c exist o dependen de jonciune de ordinul m ntre X 1, X2, ...,Xm, notat X1/ X2/ .../Xm, dac i numai dac R reprezint jonciunea proieciilor sale pe X1, X2, ...,Xm. Observaie: Dac m=2. atunci are loc dependena multivaloare.

38

CURS 6. Prelucrarea/evaluarea i optimizarea cerinelor


Regulile lui Codd Prin sistem de gestiune a bazelor de date relaionale (SGBDR) se nelege un SGBD care utilizeaz drept concepie de organizare a datelor modelul relaional. Definirea unui SGBDR impune o detaliere a caracteristicilor pe care trebuie s le prezinte un SGBD pentru a putea fi considerat relaional. n acest sens, Codd a formulat (n 1985) 13 reguli, care exprim cerinele pe care trebuie s le satisfac un SGBD. Aceste reguli sunt deosebit de utile n evaluarea unui SGBDR. R0: Regula privind gestionarea datelor la nivel de relaie. - sistemul trebuie s gestioneze BD numai prin mecanisme relaionale. R1: Regula privind reprezentarea logic a datelor. - ntr-o baz de date relaionat, informaia este reprezentat la nivel logic sub forma unor tabele (relaii); - acest lucru nseamn c toate datele trebuie s fie memorate i prelucrate n acelai mod. R2: Regula privind reprezentarea logic a datelor - orice data din baza de date relaionat trebuie s poat fi accesat prin specificarea: numelui relaiei; valorii cheii primare; numele atributului. R3: Regula privind valorile nule - sistemul trebuie s permit declararea i manipularea sistematic a valorilor NULL (semnific lipsa unor date); - valorile NULL difer de irurile de caractere spaiu, irurile vide de caractere. - valorile NULL sunt deosebit de importante n implementarea restriciilor de integritate: integritatea entitilor; integritatea referenial. R4: Regula privind metadatele - utilizatorii autorizai trebuie s poat aplica asupra descrierii bazei de date aceleai operaii ca i asupra datelor obinuite. R5: Regula privind facilitile limbajelor de utilizare: - trebuie s existe cel puin un limbaj care s exprime oricare din urmtoarele operaii: definirea relaiilor; sa vizualizeze; s regseasc informaia; s poat reactualiza informaia; s verifice i s corecteze datele de intrare, etc. - n general, toate implementrile SQL respect aceast regul. R6: Regula privind actualizarea tabelelor virtuale: - toate tabelele/relaiile virtuale trebuie s poat fi actualizate.

nu toate tabelele virtuale sunt teoretic actualizate. Exemplu: Fie tabela de baz PROD, cu urmtoarea schem PROD(Denp:D1, Cant:D2, Pret:D3), cu ajutorul tabelei PROD este definit o tabel virtual DISP, cu schema: DISP (Denp:D1, Cant:D2, Pret:D3, Val:D4). Valorile atributului Val se calculeaz astfel: Val=Cant*Pret. Presupunem c se dorete schimbarea preului unitar la un anumit produs, aceast schimbare trebuie efectuat n tabela de baz PROD, atributul Pret din tabela virtual DISP, fiind actualizabil, ntruct actualizarea se poate propaga spre tabela de baz. Presupunem c se dorete schimbarea valorii Val la un anumit produs: modificarea de la tabela virtual spre tabela de baz nu mai este posibil, atributul Val nu este actualizabil, deoarece schimbarea valorii Val se poate datora schimbrii cantitii Cant i/sau a preului unitar Pret. astfel trebuie s existe un mecanism prin care s se poat determina dac anumite vizualizri pot fi modificate sau nu. - majoritatea implementrilor SQL ndeplinesc aceast cerin. R7: Regula privind inserrile, modificrile i tergerile din baza de date. - un SGBDR nu trebuie s oblige utilizatorul s caute ntr-o relaie, tuplu cu tuplu, pentru a regsi informaia dorit; - aceast regul exprim cerina ca n operaiile prin care se schimb coninutul bazei de date s se lucreze la un moment dat pe o ntreag relaie. R8: Regula privind independena fizic a datelor - o schimbare a structurii fizice a datelor nu trebuie s blocheze funcionarea programelor de aplicaii; - ntr-un SGBDR trebuie s se separe aspectul fizic al datelor (stocare sau acces la date) de aspectul logic al datelor. R9: Regula privind independena logic a datelor. - o schimbare a relaiilor bazei de date nu trebuie s afecteze programele de aplicaie. R10: Regula privind restriciile de integritate - restriciile de integritate trebuie s fie definite ntr-un limbaj relaional, nu n programul de aplicaie. R11: Regula privind distribuirea geografic a datelor - distribuirea datelor pe mai multe calculatoare dintr-o reea de comunicaii de date, nu trebuie s afecteze programele de aplicaie. R12: Regula privind prelucrarea datelor la nivelul de baz - dac sistemul posed un limbaj (de baz orientat pe prelucrarea de tupluri i nu pe prelucrarea relaiilor, acest limbaj nu trebuie s fie utilizat pentru a evita restriciile de integritate). Clasificarea regulilor lui Codd n funcie de tipul de cerine pe care le exprim, regulile sunt grupate n 5 categorii: 1. Reguli de baz: R0 i R12;

2. 3. 4. 5.

Reguli structurale: R1 i R6; Reguli privind integritatea datelor: R3 i R10; Reguli privind manipularea datelor: R2, R4, R5, R7; Reguli privind independena datelor: R8, R9, R11.

Evaluarea/prelucrarea cerinelor i optimizarea n SGBDR interfaa cu utilizatorul este de tip neprocedural. Utilizatorul definete datele pe care dorete s le vizualizeze fr a da algoritmi de acces. Sistemul trebuie s converteasc cererea utilizatorului ntr-o cerere optimal. Evaluarea unei cereri se efectueaz n trei etape: 1. Analiza cererii ce const n studierea sintactic i semantic a cererii pentru a verifica corectitudinea sa i a simplifica criteriului de cutare. 2. Ordonanarea presupune: - descompunerea cererii ntr-o mulime de operaii elementare i - determinarea ordinii optimale a acestor aplicaii. 3. Execuia n paralel i/sau secvenial a operaiilor elementare pentru a obine rezultatul cererii. Presupunem c utilizatorul transmite sistemului de gestiune o cerere exprimat prin ordine SQL. Pentru a rspunde cererii, SGBD-ul trebuie s neleag cererea utilizatorului. Cererea trebuie s fie corect sintactic, datele trebuie s fie disponibile utilizatorului i trebuie localizate analiznd diferite drumuri de acces la ele. Ideea general este concretizat n schema de mai jos: cerere arbore algebric (nu este unic) plan de executie optimizare adic optimizarea cererilor de date se realizeaz prin parcurgerea urmtoarelor etape: 1. exprimarea cererilor sub forma unei expresii algebrice relaionale; 2. aplicarea unor transformri algebrice asupra expresiilor obinute n etapa precedent, n scopul executrii mai eficiente a lor; 3. planul de execuie; 4. optimizarea. Un plan de execuie implic o secven de pai pentru evaluarea cererii (n mod obinuit, fiecare pas din planul de execuie corespunde unei operaii relaionale) precum i metoda care va fi folosit pentru evaluarea operaiei. De obicei, pentru o operaie relaional dat, exist mai multe metode ce pot fi folosite pentru evaluarea acesteia. Dou planuri de execuie diferite care au ntotdeauna acelai rezultat se numesc echivalente. Planuri de execuie echivalente pot avea diferite costuri. Scopul optimizrii cererilor este de a gsi, printre diversele planuri de execuie echivalente, pe acela de cost minim. ntr-un sistem centralizat, costul evalurii unei cereri este suma a dou componente, costul I/O (transferuri de date) i costul CPU (verificare de condiii, operaii join etc.). Strategiile de optimizare pot fi de dou tipuri: 1. Strategii generale de optimizare (independente de modul de memorare al datelor);

2. Strategii specifice anumitor SGBDR (in cont de modul de memorare al datelor). Implementarea strategiilor generale de optimizare este permis datorit proprietilor operaiilor din algebra relaional. Aceste proprieti sunt: a) Comutativitatea operaiilor de join i produs cartezian E1E2 E2E1 E1 E2 E 2 E1 b) Asociativitatea operaiilor de join i produs cartezian (E1 E2) E3 E1 (E2 E3) (E1 E2 ) E3 E1 (E2 E3 ) c) Compunerea proieciilor

A1,...,Am (B1,...,Bn (R)) = A1,...,Am (R),


unde A1,...,Am trebuie s aparin de B1,...,Bn. d) Compunerea seleciilor F 1 ( F 2 ( R )) F 1 F 2 ( R ) . Deoarece F1 F 2 = F 2 F1 , seleciile se pot comuta F 1 ( F 2 ( R )) F 2 ( F 1 ( R)) . e) Comutarea seleciei i proieciei - Dac condiia F implic numai atributele A1,...,An, atunci A1,..., An ( F ( R )) = F ( A1,..., An ( R )) . - Dac condiia F implic i atributele B1,...,Bm, care nu aparine de A1,...,An atunci A1,..., An ( F ( R )) = A1,..., An ( F ( A1,..., An ,B1,..., Bm ( R))) . f) Comutarea seleciei cu produsul cartezian - Dac toate atributele menionate n F sunt atribute ale lui E1, atunci F ( E1 E 2 ) F ( E1 ) E 2 . -Dac, n plus, F este de forma F = F1 F2 i F1 implic numai atributele din E1, iar F2 implic numai atributele din E2, atunci F ( E1 E2 ) F 1 ( E1 ) F 2 ( E2 ) . Daca F1 implic numai atribute din E1, dar F2 implic atribute att din E1 ct i din E2, atunci F ( E1 E 2 ) F 2 ( F 1 ( E1 ) E 2 ) . g) Comutarea seleciei cu reuniunea F ( E1 E 2 ) F ( E1 ) F ( E 2 ) . h) Comutarea seleciei cu diferena F ( E1 E 2 ) F ( E1 ) F ( E 2 ) . i) Comutarea proieciei cu produsul cartezian Dac A1,A2,...,An sunt atribute din cadrul a dou expresii E1 i E2, formate din atributele B1,...,Bm ale lui E1 i din atributele C1,...,Ck ale lui E2, atunci A1,..., An ( E1 E 2 ) B1,..., Bm ( E1 ) C1,...,Ck ( E2 ) . j) Comutarea proieciei cu reuniunea A1,..., An ( E1 E 2 ) A1,..., An ( E1 ) A1,..., An ( E 2 ) . Aceste proprieti permit definirea unor strategii generale de optimizare a cererilor de date i anume:

Regula de optimizare 1. Seleciile se execut ct mai devreme posibil. Motivaia acestei reguli este c seleciile reduc substanial dimensiunea relaiilor. Regula de transformare 4 poate fi folosit pentru a separa dou sau mai multe selecii n selecii individuale care pot fi distribuite jonciunii (join-ului) sau produsului cartezian folosind comutarea seleciei cu jonciunea (join-ul). Regula de optimizare 2. Produsele carteziene se nlocuiesc cu join-uri, ori de cte ori este posibil. Un produs cartezian ntre dou relaii este de obicei mult mai scump (ca i cost) dect un join ntre cele dou relaii, deoarece primul genereaz concatenarea tuplurilor n mod exhaustiv i poate genera un rezultat foarte mare. Aceast transformare se poate realiza folosind legtura dintre produs cartezian, join i selecie. Regula de optimizare 3. Dac sunt mai multe join-uri atunci cel care se execut primul este cel mai restrictiv. Un join este mai restrictiv dect altul dac produce o relaie mai mic. Se poate determina care join este mai restrictiv pe baza factorului de selectivitate sau cu ajutorul informaiilor statistice. Algebric, acest lucru se poate realiza folosind regula de transformare 2. Regula de optimizare 4. Proieciile se execut la nceput pentru a ndeprta atributele nefolositoare. Dac un atribut al unei relaii nu este folosit n operaiile ulterioare atunci trebuie ndeprtat. n felul acesta se va folosi o relaie mai mic n operaiile ulterioare. Aceasta se poate realiza folosind comutarea proieciei cu join-ul.

CURS 7. Tehnica normalizrii relaiilor


La proiectarea structurii unei baze de date relaionale trebuie stabilite (dup cum s-a vzut n cursurile anterioare) n primul rnd tabelele n care vor fi memorate datele i asocierile dintre tabele. Acestea sunt stabilite ntr-o form iniial, dup care, prin rafinare succesiv se ajunge la forma definitiv. Acestei structuri iniiale i sunt aplicate un set de reguli care reprezint paii de obinere a unei baze de date normalizate. Dac o baz de date nu este normalizat ea nu poate fi utilizat cu un maxim de eficien. Algoritmul de normalizare a bazelor de date relaionale precum i paii acestuia au fost descrii de ctre E. F. Codd n 1972. Normalizarea este procesul reversibil de transformare a unei relaii n relaii de structur mai simpl. (Procesul este reversibil n sensul c nici o informaie nu este pierdut n timpul transformrii). Scopul normalizrii este de a suprima redundanele logice, de a evita anomaliile la reactualizare i rezolvarea problemei reconexiunii. Exemplu: Pentru a evidenia cteva exemple de redundane i anomalii, se va considera cazul relaiei iniiale OFERTANTI. Pentru a nu ncrca relaia, se vor considera valori ale atributelor prescurtate.
OFERTANTI:

cnp#numeleadresa_ clientnr_ telefonofertaadresa_ imobilCnp1N1Str. Victoriei, nr.22/12, Baia Mare, MaramuresNr1casaA_imobil1Cnp1N1Str. Victoriei, nr. 4/5, Cluj-Napoca, ClujNr1halaA_imobil2Cnp2N2Str. Viilor, nr.55/4, O Oradea, BihorNr2casaA_imobil3Cnp3N3Str. Grii, nr. 14, Bucuresti Nr3terenA_imobil4

Fig.7.1. Relaia OFERTANTI Redundana logic: Tripletul (N1, Str. Victoriei, nr.22/12, Baia Mare, Maramures, Nr1) apare de dou ori. Anomalii la inserare: Dac o persoan ofer spre vnzare mai multe imobile, pentru nregistrarea ofertei trebuie rescris codul numeric personal nc o dat, deci cheia devine duplicat. Anomalii de tergere: tergerea unei persoane din baza de date atrage dup sine pierderea informaiilor despre oferta respectiv. Anomalii la modificare: Dac se modific numele strzii Victoriei din localitatea Baia Mare n strada Independenei, modificarea trebuie efectuat pentru fiecare ofert din Baia Mare amplasat pe strada Victoriei. Dac ar exista 25 de oferte n aceast localitate pe strada Victoriei, costul modificrii ar fi mare pentru a modifica toate nregistrrile. Aceast redundan este eliminat dac atributul adresa este mprit n alte trei atribute: simbol_judet, cod_loc, id_strada. Valorile acestea vor fi codul judeului,

localitii, respectiv a strzii preluate din relaiile deja existente JUDETE, LOCALITATI, respectiv STRAZI. n acest caz, modificarea se face doar o singur dat, n tabela STRAZI. Normalizarea Codd a definit iniial 3 forme normale, notate prin FN 1, FN2 i FN3. ntruct ntro prim formulare, definiia FN3 ridic ceva probleme, Codd i Boyce au elaborat o nou variant, cunoscut sub numele de Boyce-Codd Normal Form (BCNF). Astfel BCNF este reprezentat separat n majoritatea lucrrilor. R. Fagin a tratat cazul FN 4 i FN5. O relaie este ntr-o form normal dac satisface o mulime de constrngeri specificat n figura 7.2. De exemplu, se spune c o relaie se afl n a doua form normal FN2 dac i numai dac se afl n FN1.

Relaia universal FN1 FN2 FN3 BCFN

FN4 FN5

Fig.7.2. Formele normale ale relaiilor dintr-o BDR Normalizarea bazei de date relaionale poate fi imaginat ca un proces prin care pornindu-se de la relaia iniial/universal R se realizeaz descompunerea succesiv a acesteia n subrelaii, aplicnd operatorul de proiecie. Relaia R poate fi ulterior reconstruit din cele n relaii obinute n urma normalizrii, prin operaii de jonciune.

7.1 Prima form normal (FN1)


FN1 este strns legat de noiunea de atomicitate a atributelor unei relaii. Astfel, aducerea unei relaii n FN1 presupune introducerea noiunilor de: atribut simplu; atribut compus; grupuri repetitive de atribute. Atributul simplu- Atribut compus Prin atribut simplu (atribut atomic) se nelege un atribut care nu mai poate fi descompus n alte atribute, n caz contrar, atributul este compus (atribut neatomic). Exemplu: Urmtoarele exemple de atribute pot fi considerate simple sau compuse n funcie de circumstane i de obiectivele bazei de date. Data calendaristic este un atribut n care apar cmpurile: zi, lun, an;

Adresa este un atribut n care apar cmpurile: strada, nr, bloc, scara, etaj, apartament, localitate, jude; Data operaiunii bancare este un atribut n care apar cmpurile data, ora; Buletin/carte identitate este un atribut n care apar cmpurile: seria, nr. Aceste atribute pot fi atomice sau neatomice. Astfel adresa clienilor ageniei imobiliare intereseaz la nivel global, pe cnd pentru adresa ofertei sau a cererii de imobile este vital prelucrarea separat a fiecrui cmp considerat. Analog, atributul nume reprezent un atribut simplu al acestei baze de date, deoarece numele clientului intereseaz la nivel global. Grupuri repetitive de atribute Un grup repetitiv este un atribut (grup de atribute) dintr-o relaie care apare cu valori multiple pentru o singur apariie a cheii primare a relaiei nenormalizate. Exemplu: Fie relaia nenormalizat (primar) FACTURI. Dorim s stabilim o structur de tabele care s permit stocarea informaiilor coninute n document (factur) i obinerea unor situaii sintetice privind evidena sumelor facturate pe produse, pe clinei, pe anumite perioade de timp. FACTURI nr_factura# data_factura nume_client adresa_client banca_client nr_cont_client delegat cod_produs denumire_produs unitate_de_masura cantiate pret_unitar valoare valoare_tva toal_valoare_factura toal_valoare_tva Fig. 7.3. Relaia FACTURI nenormalizat n cazul n care o factur conine mai multe produse, relaia de mai sus va avea grupurile repetitive: cod_produs, denumire_produs, cantitate, pret_unitar, valoare, valoare_tva. Aducerea unei relaii universale la FN1 FN1 este tratat n general cu superficialitate, deoarece principala cerin atomicitatea valorilor este uor de ndeplinit (cel puin la prima vedere).

Dintre toate formele normale, doar FN1 are caracter de obligativitate. Se spune c o baz de date este normalizat daca toate relaiile se afl mcar n FN1. O relaie este n FN1 dac domeniile pe care sunt definite atributele relaiei sunt constituite numai din valori atomice. Un tuplu nu trebuie s conin atribute sau grupuri de atribute repetitive. Aducerea relaiilor n FN1 presupune eliminarea atributelor compuse i a celor repetitive. Se cunosc trei soluii pentru determinarea grupurilor repetitive: eliminarea grupurilor repetitive pe orizontal (n relaia R iniial, n locul atributelor compuse se trec componentele acestora, ca atribute simple); eliminarea grupurilor repetitive prin adugarea de tupluri; eliminarea grupurilor repetitive prin construirea de noi relaii Primele dou metode genereaz relaii stufoase prin duplicarea forat a unor atribute, respectiv tupluri, crendu-se astfel redundane masive cu multiple anomalii de actualizare. Metoda a treia presupune eliminarea grupurilor repetitive prin construirea de noi relaii, ceea ce genereaz o structur ce ofer cel mai mic volum de redundan. Etapele de aducere a unei relaii n FN1 sunt: I. se construiete cte o relaie pentru fiecare grup repetitiv; II. n schema fiecrei noi relaii obinute la pasul 1 se introduce i cheia primar a relaiei R nenormalizate; III. cheia primar a fiecrei noi relaii va fi compus din atributele chei ale relaiei R, plus unul sau mai multe atribute proprii. Exemplu: Deoarece o factur poate avea unul sau mai multe produse nscrise pe aceasta, informaiile legate de produse vor fi separate ntr-o alt tabel. Aplicnd etapele de aducere la FN1, se obin dou relaii: LINII_FACTURI FACTURI nr_factura# data_factura nume_client adresa_client banca_client nr_cont_client delegat toal_valoare_factura toal_valoare_tva nr_factura# cod_produs# denumire_produs unitate_de_masura cantiate pret_unitar valoare valoare_tva

Fig. 7.4. Relaia FACTURI adus n forma normal FN1 Observaia1: Cmpul adresa_client curpinde informaii despre judeul, localitatea, strada i numrul domicililului clientului. Dac se consider c este de interes o eviden a sumelor factorizate pe judee sau localiti, se vor pune n locul cmpului adresa_client trei cmpuri distincte: judet_client, localitate_client, adresa_client, uurnd n acest fel interogrile.

Observaia2: ntre tabela FACTURI i tabela LINII_FACTURI exist o relaie de unu la muli, adic unui numr unic de factur i pot corespunde unul sau mai multe produse care sunt memorate ca nregistrri n tabele LINII_FACTURI. Cheia primar n aceast tabel este o cheie compus, format din dou cmpuri: nr_factura i cod_produs. ns eliminarea grupurilor repetitive, adic aducerea unei relaii la FN1, nu rezolv complet problema normalizrii.

7.2. A doua form normal (FN2)


FN2 este strns legat de noiunea de dependen funcional. Noiunea de dependen funcional a fost prezentat n cursul 5: Restricii de integritate ale modelului relaional. O relaie se afl n a doua form normal FN2 dac: 1. se afl n forma normal FN1 i 2. fiecare atribut care nu este cheie este dependent de ntreaga cheie primar. Etapele de aducere a unei relaii de la FN1 la FN2 sunt: I. Se identific posibila cheie primar a relaiei aflate n FN1; II. Se identific toate dependenele dintre atributele relaiei, cu excepia acelora n care sursa este un atribut component al cheii primare; III. Se identific toate dependenele care au ca surs un atribut sau subansamblu de atribute din cheia primar; IV. Pentru fiecare atribut (sau subansamblu) al cheii de la pasul III se creeaz o relaie care va avea cheia primar atributul (subansamblul) respectiv, iar celelalte atribute vor fi cele care apar ca destinaie n dependenele de la etapa III. Exemplu: Relaia care conine date redundante (de exemplu, modificarea denumirii unui produs atrage dup sine modificarea n fiecare tuplu n care apare acest produs) este relaia LINII_FACTURI. Se observ ca nu exist nici o dependen funcional ntre atributele necomponente ale cheii. n schimb, toate atributele care nu intr n alctuirea cheii compuse sunt dependente de aceasta, iar DF dintre atributul component al cheii primare sunt: cod_produs --> denumire_produs, cod_produs --> unitate_de_masura. Ca urmare se formeaz nc dou relaii. FACTURI nr_factura# data_factura nume_client adresa_client banca_client nr_cont_client delegat toal_valoare_factura toal_valoare_tva LINII_FACTURI nr_factura# cod_produs# cantiate pret_unitar valoare valoare_tva PRODUSE cod_produs# denumire_produs unitate_de_masura

Fig. 7.5. Relaia FACTURI n a doua forma normal FN2

Chiar dac au fost eliminate o parte din redundane, mai rmn i alte redundane ce se vor elimina aplicnd alte forme normale.

CURS 8. A treia form normal


7.3. A treia form normal (FN3)
O relaie este n forma normal trei FN3 dac: 1. se gsete n FN2 i 2. fiecare atribut care nu este cheie (nu particip la o cheie) depinde direct de cheia primar. A treia regul de normalizare cere ca toate cmpurile din tabele s fie independente ntre ele. Etapele de aducere a unei relaii de la FN2 la FN3 sunt: I. Se identific toate atributele ce nu fac parte din cheia primara i sunt surse ale unor dependene funcionale; II. Pentru aceste atribute, se construiete cte o relaie n care cheia primar va fi atributul respectiv, iar celelalte atribute, destinaiile din DF considerate; III. Din relaia de la care s-a pornit se elimin atributele destinaie din DF identificat la pasul I, pstrndu-se atributele surse. Exemplu: n relaia FACTURI se observ c atributul nume_client determin n mod unic atributele adresa_client, banca_client i nr_cont_client. Deci pentru atributul nume_client se construiete o relaie CLIENTI n care cheia primar va fi acest atribut, iar celelalte atribute vor fi adresa_client, banca_client i nr_cont_client. Cmpurile valoare i valoare_tva depind de cmpurile cantitate, pret_unitar, i de un procent fix de TVA. Fiind cmpuri ce se pot calcula n orice moment ele vor fi eliminate din tabel LINII FACTURI deoarece constituie informaie memorat redundant. LINII_FACTURI PRODUSE FACTURI CLIENTI nr_factura# cod_produs# nr_factura# cod_produs# nume_client# denumire_produs data_factura cantiate adresa_client unitate_de_masura nume_client pret_unitar banca_client delegat nr_cont_client toal_valoare_factura toal_valoare_tva Fig. 8.1. Relaia FACTURI n a treia forma normal FN3 Observaia 1: Aceast a treia form normal mai poate suferi o serie de rafinri pentru a putea obine o structur performant de tabele ale bazei de date. De exemplu se observ c nume_client este un cmp n care este nscris un text destul de lung format dintr-o succesiune de litere, semne speciale (punct, virgul, cratim), spaii, numere. Ordonarea i regsirea informaiilor dup astfel de cmpuri este lent i mai greoaie dect dup cmpuri numerice. Din acest motiv se poate

introduce un nou atribut cod_client care s fie numeric i care s fie cheia primar de identificare a pentru fiecare client. Observaia 2: O alt observaie care poate fi fcut n legtur cu tabelele aflate n cea de a treia form normal este aceea c total_valoare_factura este un cmp care ar trebui s conin informaii sintetice obinute prin nsumarea valorii tuturor ofertelor aflate pe o factur. Este de preferat ca astfel de cmpuri s fie calculate n rapoarte sau interogri iLINII_FACTURI s nu fie memorate n tabelele bazei de date. FACTURI CLIENTI PRODUSE nr_factura# data_factura delegat nr_factura# cod_produs# cantiate pret_unitar cod_produs# denumire_produs unitate_de_masura cod_client# nume_client adresa_client banca_client nr_cont_client

Verificarea aplicrii corecte a procesului de normalizare se realizeaz astfel nct uniunea acestora s produc relaia iniial, cu alte cuvinte, descompunerea este fr pierderi. Celelalte forme normale se ntlnesc mai rar n practic. Aceste forme nu sunt respectate, n general, pentru c beneficiile de eficien pe care le aduc nu compenseaz costul i munca de care este nevoie pentru a le respecta.

CAPITOLUL II. SQL (9 sapt.)


CURS 9. Limbajul SQL
Noiuni introductive Limbajul SQL (Structured Query Language) este limbajul utilizat de majoritatea sistemelor de baze de date relaionale (SGBDR) pentru definirea i manipularea datelor. Din punct de vedere istoric ar trebui menionat faptul c limbajul SQL a fost dezvoltat ntr-un prototip de sistem de gestiune a bazelor de date relaionale la IBM, n 1970. n 1979 corporaia Oracle a introdus prima implementare a limbajului SQL n varianta comercial. n 1987 Institutul Naional de Standarde (ANSI) a elaborat standardul limbajului SQL. Ulterior au avut loc mai multe revizii ale acestui standard. Majoritatea limbajelor posed un set de instruciuni comun unanim acceptat de toate marile companii productoare de soft, precum MICROSOFT sau ORACLE. Termenii utilizai de limbajul SQL sunt - tabel (Table) utilizat pentru a desemna o relaie; - linie (row) utilizat pentru a desemna un tuplu; - coloan (column) utilizat pentru a desemna un atribut. Componentele pe care le cuprinde limbajul SQL sunt urmtoarele: 1. componenta de descriere a datelor relaionale (limbajul de descriere a datelor - LDD), 2. componenta de manipulare a datelor relaionale (limbajul de manipulare a datelor - LMD), ambele fiind absolut necesare n gestiunea BD. Pe lng aceste componente principale, standardul SQL2 mai prevede i alte componente ale limbajului: 3. controlul tranzaciilor; 4. controlul securitii i refacerea datelor. Controlul tranzaciilor conine comenzi pentru specificarea tranzaciilor. Unele implementri adaug comenzilor prevzute n standard i alte comenzi suplimentare de control al concurenei i refacerea datelor. Controlul securitii i refacerea datelor conine comenzi de administrare a bazei de date pentru definirea utilizatorilor i a drepturilor acestora de acces la tabele. Aceast component este dependent de SGBD, iar pentru sisteme performante, administratorul BD este obiectul activitii unei categorii speciale de utilizatori ai BD administratori ai BD.

52

Structura lexical a limbajului SQL Elementele unei instruciuni (statement) sunt: cuvintele cheie (key words), dintre care fac parte comenzile (SELECT, UPDATE, INSERT etc), operatorii (AND, OR, NOT, LIKE), clauzele (WHERE, SET, VALUES etc); identificatorii (identifier) sunt elementele care denumesc tabela, coloana sau alt obiect BD; SQL face diferena ntre literele mari i mici, deci este case-sensitive; identificatorul care conine ghilimele se numete identificator delimitat; constantele (literal) reprezint iruri de caractere ( ), numere ntregi, numere reale (ex. 3.5; 4. ; .001; 5e2), constanta NULL care simbolizeaz lipsa de informare, constante de tip logic (1 pentru TRUE i 0 pentru FALSE); caracterele speciale, cum ar fi ; care semnific terminarea comenzilor, . care semnific virgula zecimal, sau * care simbolizeaz operatorul de nmulire.

Operatori SQL SQL are urmtorii operatori: operatori aritmetici binari: + * % modulo ^ ridicarea la putere & AND orientat pe bii | OR orientat pe bii # XOR orientat pe bii << deplasare la stnga >> deplasare la dreapta operatori binari de comparaie < > <= >= = <> sau != diferit operatori aritmetici mari

53

@ valoarea absolut ! factorial !! factorial, operator postfix ~ NOT orientat pe bii operatori de comparaie A BETWEEN min AND max (compar A cu dou valori: min i max) A IN (v1,...,vn) compar A cu o list de valori A IS NULL A IS NOT NULL A LIKE model_ir operatori logici Operatorii logici sunt legai prin cuvintele cheie AND, OR, NOT i returneaz o valoare logic TRUE, FALSE sau NULL. operatori relaionali UNION (reuniune) INTERSECT (intersecie) MINUS (diferena). Funcii definite n SQL Funcii agregat Funciile agregat calculeaz un rezultat din mai multe linii ale unui tabel (funcii de totalizare): COUNT (furnizeaz numrul de linii ale unui rezultat); SUM (execut suma tuturor valorilor dintr-o coloan); MAX (returneaz valoarea cea mai mare dintr-o coloan); MIN (returneaz valoarea cea mai mic dintr-o coloan); AVG (calculeaz media valorilor dintr-o coloan). Aceste funcii vor fi folosite n instruciunea SELECT. Funcii scalare Funciile scalare primesc unul sau mai multe argumente i returneaz valoarea calculat sau NULL n caz de eroare. Argumentele funciilor pot fi constante sau valori ale atributelor specificate prin numele coloanelor corespunztoare. Dintre funciile scalare amintim: funcii numerice - de calcul trigonometric: sin, cos, tg, ctg etc. - de calcul al logaritmului: ln, log, lg 54

- de calcul al puterilor: pow - de rotunjire: floor, ceil etc. funcii pentru manipularea irurilor de caractere funcii pentru data calendaristic funcii de conversie Tipuri de date n limbajul SQL sunt definite mai multe tipuri de date: numeric, ir de caractere, ir de bii, data (calendaristic), timp. Denumirile tipurilor de date precum i limitele acestora difer de la un SGBD la altul, dar n general, sunt destul de asemntoare. Tipul numeric include numere ntregi: INTEGER sau INT reprezentat pe 4 octei; SMALLINT reprezentat pe 2 octei; numere reale reprezentate n virgul flotant, cu diferite precizii: FLOAT reprezentat pe 4 octei; REAL reprezentat pe 8 octei; DOUBLE [PRECISION] reprezentat pe 8 octei; numere zecimale reprezentate cu precizia dorit: tipul NUMERIC sau DECIMAL, cu forma numeric[(p,s)], unde p este numrul total de cifre afiate, iar s este numrul de cifre dup punctul zecimal. Tipul ir de caractere CHARACTER (n) sau CHAR (n) definesc iruri de caractere cu lungimea fix. CHARACTER VARYING sau VARCHAR (n) definete irul de caractere cu lungimea variabil. Asemnarea dintre cele dou tipuri prezentate mai sus este aceea c ambele reprezint iruri de maxim n caractere, iar deosebirea este aceea c pentru iruri cu numr de caractere mai mic ca n, CHAR (n) completeaz irul cu spaii albe pn la n caractere, iar VARCHAR (n) memoreaz numai attea caractere cte are irul dat. Tipul iruri de bii BIT (n) definete secvene de cifre binare (care pot lua valoarea 0 sau 1) de lungime finit n; BIT VARYING (n) definete secvene de lungime variabil, cu limita maxim n. Tipuri pentru data calendaristic i timp DATE permite memorarea datelor calendaristice n formatul yyyy-mm-dd; 55

TIME permite memorarea timpului, folosind trei cmpuri hh:mm:ss; TIMESTAMP(p) permite memorarea combinat a datei calendaristice i a timpului, cu precizia p pentru cmpul SECOND (al secundelor); valoarea implicit a lui p este 6; INTERVAL este utilizat pentru memorarea intervalelor de timp. Tipurile de date sunt case-insensitive, deci nu in cont de caracterele mari sau mici.

56

CURS 10. Limbaje relaionale de definire a datelor (LDD)


Limbajul de definire a datelor (a schemei unei BD) include instruciuni ce permit: - crearea schemei bazei de date; - adugarea relaiilor la schema bazei; - tergerea unor relaii existente; - adugarea de noi atribute relaiilor existente; - optimizarea bazei de date (index, grup, declanator); - definirea structurii fizice i logice a unei BD; - restricii cu privire la utilizarea structurii de mai sus. Comenzi pentru crearea unei baze de date Comanda pentru crearea unei baze de date este CREATE DATABASE nume_baza; Exemplu: S se creeze baza de date AGENTIA_IMOBILIARA. CREATE DATABASE AGENTIA_IMOBILIARA; Aceast comand creeaz o BD cu numele nume_baza. Nu toate SGBDR suport noiunea explicit de BD, dei utilizarea unei asemenea noiuni poate facilita controlul drepturilor de acces la relaiile BD. Sisteme precum DB2 nu posed noiunea explicit de BD, n timp ce sistemul dBASE o suport. Creatorul bazei de date devine automat administratorul BD. Comenzi pentru suprimarea unei baze de date Comanda pentru suprimarea unei baze de date este DROP DATABASE nume_baza; Aceast comand distruge BD cu numele nume_baza. Comenzi pentru crearea relaiilor de baz n cadrul acestor comenzi se precizeaz numele relaiei precum i numele i tipul atributelor. n SQL, cele mai frecvente tipuri de date sunt: CHAR pentru ir de caractere de lungime fix; VARCHAR2 pentru ir de caractere de lungime variabil; NUMBER pentru numere ntregi sau reale de lungime variabil; DATE pentru date calendaristice; LONG pentru texte de lungime variabil RAW pentru informaie binar de lungime variabil. Comanda de creare a unei relaii este

57

CERATE TABLE nume_tabela (atribute); Crearea unei relaii indicnd cheia la nivel de coloan

Exemplu: S se creeze relaia JUDETE (simbol_judet, nume_judet). CREATE TABLE JUDETE (simbol_judet CHAR(2) PRIMARY KEY, nume_judet VARCHAR(30)); Crearea unei relaii indicnd cheile la nivel de tabel

Exemplu: S se creeze relaia LOCALITATI (cod_loc, simbol_judet, nume_loc). CREATE TABLE LOCALITATI (cod_loc VARCHAR(7), simbol_judet CHAR (2), nume_loc VARCHAR (50), PRIMARY KEY (cod_loc, simbol_judet), FOREIGN KEY (simbol_judet) REFERENCES JUDETE(simbol_judet)); Dac cheia primar are mai mult de o coloan atunci cheile trebuie indicate la nivel de tabel. Crearea unui tabel prin copiere

Exemplu: S se creeze relaia LOCALITATI_CLUJ (cod_loc, simbol_judet, nume_loc) utiliznd copierea datelor din relaia LOCALITATI. CREATE TABLE LOCALITATI_CLUJ SELECT cod_loc , simbol_judet , nume_loc FROM LOCALITATI WHERE simbol_judet LIKE 'CJ'; Comenzi pentru suprimarea unei relaii de baz Comanda de suprimarea unei relaii este DROP TABLE nume_tabela; Comanda SQL distruge relaia nume_tabela. Comenzi pentru schimbarea numelui unei relaii Comanda SQL pentru schimbarea numelui unei relaii este RENAME nume_tabela TO nume_tabela_nou;

58

Exemplu: S se modifice numele relaiei LOCALITATI_CLUJ n LOC_CJ, apoi s se suprime relaia LOC_CJ. RENAME TABLE LOCALITATI_CLUJ TO LOC_CJ; DROP TABLE LOC_CJ; Comenzi pentru modificarea structurii unei relaii Prin modificarea structurii unei relaii se nelege: extinderea schemei relaiei prin adugarea de noi atribute; restrngerea schemei unei relaii prin suprimarea unor atribute; modificarea numelui i/sau tipului unui atribut din cadrul relaiei. Unele limbaje relaionale (QBE) admit toate aceste tipuri de modificri n schema unei relaii, iar altele (SQL sau QUEL) numai o parte. Comanda de modificare a unei relaii este ALTER TABLE nume_tabel ... Adugarea unui atribut cu ajutorul opiunii ADD Exemplu: S se adauge atributul regiunea la relaia LOCALITATI. (Valorile acestui atribut vor fi: Transilvania, Banat, Oltenia, Muntenia, Moldova, Dobrogea.) ALTER TABLE LOCALITATI ADD (regiunea VARCHAR(10)); Modificarea unui atribut cu ajutorul opiunii MODIFY Exemplu: Presupunnd c relaia FACTURI a fost adugat bazei de date AGENTIA_IMOBILIARA i c atributul pret_unitar este de tip INTEGER, s se modifice forma preului unitar. ALTER TABLE FACTURI MODIFY pret_unitar DECIMAL (10,2) ; Comenzi pentru declararea restriciilor de integritate (a constrngerilor) Constrngere este un mecanism care asigur c valorile unei coloane sau a unei mulimi de coloane satisfac o condiie declarat. Unei constrngeri i se poate da un nume unic. Dac nu se specific un nume explicit atunci sistemul automat i atribuie un nume de forma SYS_Cn, unde n reprezint numrul constrngerii. Constrngerile pot fi terse, pot fi adugate, pot fi activate sau dezactivate, dar nu pot fi modificate. Prin comanda CREATE TABLE pot fi specificate anumite restricii (constrngeri) prin care se exprim o condiie care trebuie respectat de toate tuplurile uneia sau mai multor relaii. Acestea pot fi definite cu ajutorul comenzii ALTER TABLE

59

Constrngerile declarative pot fi: - constrngeri de domeniu, care definesc valorile luate de un atribut: DEFAULT NOT NULL UNIQUE CHECK - constrngeri de integritate a entitii care precizeaz cheia primar PRIMARY KEY - constrngeri de integritate referenial care asigur corespondena ntre cheile primare i cheile externe corespunztoare FOREIGN KEY Fiecrei restricii i se poate da un nume, lucru util atunci cnd, la un moment dat (salvri, restaurri, ncrcarea BD) se dorete dezactivarea uneia sau mai multora dintre acestea. Astfel se prefigureaz numele fiecrei restricii cu tipul su: pk_(PRIMARY KEY) pentru cheile primare un_(UNIQUE) pentru cheile alternative nn_(NOT NULL) pentru atributele obligatorii ck_(CHECK) pentru reguli de validare la nivel de atribut fk_(FOREIGN KEY) pentru cheile strine. Exemplu: S se realizeze constrngerea de cheie primar, de cheie extern i constrngerea de domeniu pentru relaia DESCRIERE_IMOBIL. CREATE TABLE DESCRIERE_IMOBIL (id_co SMALLINT (7) NOT NULL, CONSTRAINT FOREIGN KEY fk_co(id_co) REFERENCES CERERI_OFERTE(id_co), CONSTRAINT pk_co PRIMARY KEY (id_co), tip_imobil VARCHAR(10), etaj VARCHAR(10), nr_camere SMALLINT (6), suprafata DECIMAL (12,4), garaj TINYINT (4), centrala_termica TINYINT (4), termopane TINYINT (4)); Observaia 1: Liniile ce nu respect constrngerea sunt depuse automat ntr-un tabel special. Observaia 2: Constrngerile previn tergerea unui tabel dac exist dependene. (vezi cursul tergerea datelor) Observaia 3: Constrngerile pot fi activate sau dezactivate n funcie de necesiti. Observaia 4: Constrngerile pot fi create o dat cu tabelul sau dup ce acesta a fost creat. Modificarea unei restricii de integritate

60

Comanda de modificare a unei restricii este ALTER TABLE nume_tabela TIP_CONSTRNGERE);

MODIFY

(nume_atribut

Exemplu: S se modifice una din constrngerile din exemplul de mai sus. ALTER TABLE DESCRIERE_IMOBIL MODIFY tip_imobil VARCHAR (10) NOT NULL ; Activarea i/sau dezactivarea unei constrngeri Activarea sau dezactivarea unei constrngeri se realizeaz cu ajutorul opiunilor ENABLE sau DISABLE. Exemplu: S se dezactiveze, apoi s se activeze constrngerea de cheie primar din relaia DESCRIERE_OFERTA. ALTER TABLE DESCRIERE_IMOBIL ADD (CONSTRAINT id_co PRIMARY KEY (id_co) DISABLE); ALTER TABLE DESCRIERE_IMOBIL ENABLE (CONSTRAINT id_co); Suprimarea unei constrngeri cu ajutorul opiunii DROP Comanda pentru suprimarea unei restricii este ALTER TABLE nume_tabela DROP PRIMARY KEY; Exemplu: S se suprime restricia de cheie primar pentru atributul nr_factura din tabela FACTURI. ALTER TABLE FACTURI DROP PRIMARY KEY; Adugarea unei constrngeri cu ajutorul opiunii ADD Comanda pentru adugarea unei restricii este ALTER TABLE nume_tabela ADD CONSTRAINT ...; Exemplu: S se adauge restricia de cheie primar nr_factura pentru relaia FACTURI. ALTER TABLE FACTURI ADD CONSTRAINT pk_nr_factura PRIMARY KEY (nr_factura); Observaia 1: Astfel, comanda ALTER TABLE realizeaz modificarea structurii tabelului (la nivel de coloan sau la nivel de tabel), dar nu modificarea coninutului acestuia.

61

Observaia 2: Constrngerile pot fi adugate (ADD CONSTRAINT), terse (DROP CONSTRAINT), activate (ENABLE) sau dezactivate (DISABLE), dar nu pot fi modificate. Observaia 3: Dac exist o cheie extern care refer o cheie primar i dac se ncearc tergerea cheii primare, aceast tergere nu se poate realiza (tabelele sunt legate prin declaraia de cheie extern). tergerea este totui permis dac n comanda ALTER apare opiunea CASCADE, care determin i tergerea cheilor externe ce refer cheia primar urmrind sintaxa ALTER TABLE Nume_tabela DROP PRIMARY KEY CASACDE; Ex Comenzi pentru acordarea drepturilor de acces la baza de date La nivel logic, limbajele relaionale ofer comenzi pentru acordarea drepturilor de acces la baza de date. Accesul unor persoane la BD se poate realiza doar n condiiile recunoaterii acestora de ctre sistem drept utilizatori autorizai. Creatorul unei relaii primete n mod automat toate privilegiile de operare asupra acestei relaii: - cutri de date n relaie - actualizri ale datelor n relaie - actualizri ale schemei relaiei - ataarea unor restricii de integritate - suprimarea relaiei. Poate acorda, la rndul su, privilegii asupra relaiei i altor utilizatori n funcie de sistem: - sistem centralizat (INGRES) n cadrul cruia singurul care poate acorda drepturi de acces la BD este administratorul bazei de date, funcia de administrator neputnd fi delegat altor persoane; - sistem descentralizat (DBz, SABRINA, ORACLE) n cadrul cruia administratorul poate da drepturi de acces la BD, dar, n acelai timp, putnd delega i alte persoane s fie administratori. Comanda n SQL de acordare a drepturilor utilizatorilor este GRANT SELECT, UPDATE ,... ON nume_tabela TO nume_utilizator; Exemplu: S se confere utilizatorului cu numele Zita i cu parola BDZ dreptul de conectare la BD, precum i unele drepturi de acces la una dintre tabelele bazei de date. GRANT SELECT, UPDATE ON DESCRIERE_IMOBIL TO Zita IDENTIFIED BY 'BDZ'; Comenzi pentru retragerea drepturilor de acces la baza de date Comanda SQL pentru retragerea drepturilor de acces la BD este 62

REVOKE UPDATE nume_utilizator;

ON

nume_tabela

FROM

Exemplu: S se retrag drepturile utilizatorului Zita de actualizare a datelor. REVOKE UPDATE ON DESCRIERE_IMOBIL FROM Zita;

63

CURS 11. Limbaje relaionale de manipulare a datelor (LMD) Interogarea datelor


Limbajele de manipulare a datelor trebuie s ofere o serie de faciliti pentru prelucrarea datelor din relaiile bazei de date i anume: - interogri - inserri - modificri - tergere. 1. Interogarea datelor Interogarea bazei de date reprezint principala funcie a unui limbaj relaional de manipulare a datelor. Comanda fundamental a standardului SQL este SELECT, aceasta permind interogarea unei baze de date. Interogarea reprezint o ntrebare care i extrage rspunsul din baza de date. Componentele interogrii se numesc clause. Sintaxa general a comenzii SELECT este urmtoarea: SELECT [ALL/DISTINCT/UNIQUE] list de selecie FROM list de relaii (tabele) WHERE condiie de cutare asupra liniilor GROUP BY list de atribute care permit partiionarea HAVING condiie asupra partiiilor ORDER BY list de atribute; Clauzele SELECT i FROM sunt obligatorii. SELECT specific datele care se selecteaz, iar clauza FROM specific relaiile din care se selecteaz. Restul clauzelor sunt opionale. Exemplul 1: S se selecteze toate persoanele mpreun cu toate datele personale ale acestora existente n baza de date. SELECT * FROM DATE_PERSOANA; Exemplul 2: S se selecteze toate ofertele/cererile nregistrate n data de 200607-03. SELECT * FROM CERERI_OFERTE WHERE data_inreg=2006-07-03; Interogarea datelor folosind operatorii IS i IS NOT Exemplu: S se selecteze numele tuturor persoanelor care nu au completat adresa de email, apoi s se afieze numele tuturor persoanelor care au numrul de telefon completat. SELECT numele FROM DATE_PERSOANA WHERE email IS NULL; SELECT numele FROM DATE_PERSOANA 64

WHERE nr_telefon IS NOT NULL; Interogarea datelor folosind operatorii logici AND, OR, NOT Sintaxa pentru interogarea care utilizeaz un operator logic este condiie 1 AND condiie 2; condiie1 OR condiie 2; NOT condiie; Exemplu: S se determine numrul facturii i codul numeric personal pentru ofertele soluionate dup date de 2006-05-01 i cu un pre final mai mare sau egal ca 100.000. SELECT cnp,nr_factura FROM FACTURI WHERE data_factura=2006-08-01 AND total>=100000; Interogarea datelor folosind operatorul IN Sintaxa este SELECT valoare_cmp IN (valoare1, valoare2,...); Aceast sintax a operatorului IN este similar cu urmtoarea list de disjuncii: Valoare_cmp=valoare1 OR valoare_cmp=valoare2 OR ...; Exemplu: S se selecteze numrul facturii, id-ul cererii/ofertei, data facturii, valoarea total a facturii, valoarea TVA i codul numeric personal pentru cererile/ofertele soluionate cu valoarea total de 70.000,80.000, 90.000. SELECT * FROM FACTURI WHERE total IN (119000.00,178500.00,90000); Interogarea datelor folosind sintaxa DISTINCT Pentru a selecta seturi de valori distincte, adic eliminarea valorilor duplicat, n SQL se folosete sintaxa DISTINCT, micornd astfel setul de date. Sintaxa acestei comenzi este SELECT DISTINCT nume_cmp1, nume_cmp2,... FROM nume_tabela WHERE comenzi; sau SELECT DISTINCT * FROM nume_tabela; Sintaxa DISTINCT se refer la o nregistrare care poate cuprinde unul sau mai multe cmpuri. Exemplu: S se afieze toate datele distincte n care s-au nregistrat cereri sau oferte. SELECT DISTINCT data_inreg FROM CERERI_OFERTE;

65

Interogarea datelor folosind operatorul LIKE Se cunosc mai multe modaliti de utilizare a expresiei LIKE, i anume: pentru o expresie care ncepe cu o anumit liter, de exemplu litera A: LIKE A%; pentru o expresie care se termin cu o anumit liter, de exemplu litera A: LIKE %A; pentru o expresie care include o anumit liter, de exemplu litera A: LIKE %A%;

Exemplu: S se selecteze numele, adresa i emailul tuturor persoanelor feminine care au adres de email pe yahoo sau personal. SELECT numele, adresa, email FROM DATE_PERSOANA WHERE adresa LIKE %BAIA MARE% AND (email LIKE %yahoo% OR email LIKE %personal%); Interogarea datelor folosind operatorul BETWEEN Operatorul se utilizeaz n combinaie cu dou valori ntre care se afl valoarea la care se refer operatorul. Sintaxa este val BETWEEN minim AND maxim; sau val>=min AND val<=max; Cele trei expresii val, min, max pot fi de tip numeric (numeric, decimal, int, smalint etc.) sau de tip dat calendaristic. Exemplu: S se selecteze codurile tuturor cererilor/ofertelor nregistrate n perioada 1 ianuarie 2006 i 1 mai 20006. SELECT id_co FROM CERERI_OFERTE WHERE data_inreg BETWEEN 2006-01-01 AND 2006-0501; Interogarea datelor folosind funciile calendaristice YEAR, DAY, MONTH Funciile YEAR, DAY, MONTH rein dintr-un cmp de tip dat calendaristic anul, ziua, respectiv luna. Exemplu: S se vizualizeze codurile tuturor cererilor/ofertelor nregistrate n luna mai. SELECT id_co FROM CERERI_OFERTE WHERE MONTH(data_inreg)=05; Interogarea datelor folosind ordonarea Datele se pot ordona dup orice cmp. Ordonarea se poate face att cresctor ct i descresctor. Sintaxa pentru interogarea 66

ordonat cresctor este ORDER BY nume_cmp (ASC); - ordonat descresctor este ORDER BY nume_cmp (DESC); Dac ORDER BY nu este urmat de ASC sau DESC, ordonarea se face implicit cresctor. Exemplu: S se vizualizeze lista persoanelor n ordine alfabetic. SELECT numele FROM DATE_PERSOANA ORDER BY numele; Interogarea datelor din mai multe tabele Interogarea datelor din mai multe relaii este strns legat de noiunea de cheie primar, cheie secundar, restricii de integritate, asocieri ntre relaii. Exemplu: S se afieze ofertele i denumirile oraelor corespunztoare ofertelor. SELECT id_co, nume_loc FROM CERERI_OFERTE, LOCALITATI WHERE CERERI_OFERTE.tipul=oferta AND CERERI_OFERTE.cod_loc=LOCALITATI.cod_loc; Observaii: Clauza FROM specific dou relaii. Clauza SELECT cuprinde valori din relaia CERERI_OFERTE i din relaia LOCALITATI, prin urmare trebuie definite cmpurile n funcie de tabela din care face parte. Se utilizeaz sintaxa nume_tabel.nume_cmp Clauza WHERE include condiii care exprim o egalitate ntre valorile identificatorului nume_cmp a relaiei nume_tabel i a celei ale referinei la acest identificator n tabela referit.

67

CURS 12. Limbaje relaionale de manipulare a datelor (LMD) Interogarea datelor din mai multe relaii
Atunci cnd n clauza FROM a unei comenzi SELECT apar mai multe tabele se realizeaz produsul cartezian al acestora. De aceea numrul de linii rezultat crete considerabil, fiind necesar restricionarea acestora cu o clauza WHERE. Atunci cnd este necesar obinerea de informaii din mai multe tabele se utilizeaz condiii de join. n acest fel liniile dintr-un tabel pot fi puse n legtura cu cele din alt tabel conform valorilor comune ale unor coloane. Condiiile de corelare utilizeaz de obicei coloanele cheie primar i cheie extern. Tipuri de asocieri pentru relaii Rolul unei relaii fiind acela de a modela entiti, ntre relaii exist aceleai tipuri de asocieri ca i ntre entiti, prezentate la nceputul cursului, i anume asocieri unu la unu, unu la mai muli, muli la mai muli. Asocieri de la unu la unu Dou relaii stocheaz informaii n asocierea unu la unu dac unei nregistrri din relaia A i corespunde (sau nu) o singur nregistrare din B. Acest tip de asociere este utilizat mai rar. Exist, totui, cazuri n care este necesar i util stabilirea unei astfel de relaii. Exemplu:
CERERI_OFERTE id_co # tip cnp data_inreg tip_solutionare cod_loc id_strada nr_imobil pret_min pret_max 1:1 DESCRIERE_IMOB IL id_co# tip_imobil etaj nr_camere suprafata garaj centrala_termica termopane

Fig. 12.1. Asociere de tip 1:1 Asocieri de la unu la mai muli O relaie A se afl ntr-o asociere de unu la mai muli cu o relaie B dac fiecrei nregistrri din A i corespund una sau mai multe nregistrri din relaia B. Unei nregistrri din relaia B nu i corespunde dect maxim o nregistrare din relaia A. Sunt utilizate urmtoarele denumiri: B este relaia copil sau relaia care refer la A sau relaia cheie strin; A este relaia printe (master) sau relaia referit sau relaia cheie primar. 68

Exemplu: A
JUDETE simbol_judet# nume_judet 1:n

B
LOCALITATI cod_loc# simbol_judet nume_judet

Fig. 12.2. Asociere de tip 1:n Observaie: Relaia A are cheia primar simbol_judet, iar relaia B are atributul simbol_judet cheie extern. Asocieri de la mai muli la mai muli O relaie A se afl n asociere de tipul muli la mai muli cu o relaie B dac unei nregistrri din relaia A i pot corespunde mai multe nregistrri din relaia B i unei nregistrri din relaia B i pot corespunde mai multe nregistrri din relaia A. O asociere n la n nu se definete direct, asocierea construindu-se cu ajutorul unei relaii de jonciune. n aceast relaie se pstreaz legtura ntre cele dou relaii, precum i informaiile necesare. Exemplu: A
JUDETE simbol_judet# nume_judet 1:n

B
LOCALITATI cod_loc# simbol_judet nume_judet 1:n

C
STRAZI id_strada# cod_loc# nume_str

Fig. 12.3. Asociere de tip n:n Observaie: n exemplul de mai sus, relaia LOCALITATI realizeaz jonciunea ntre relaiile JUDETE i STRAZI, stocnd informaiile privind numele judeului nume_judet, simbolul judeului simbol_judet i identificatorul localitii cod_loc. Astfel, asocierea n la n este vizualizat sub forma a dou relaii de unu la n. Interogarea datelor din mai multe relaii folosind aliasuri Un alias este o redenumire fie a unui cmp, fie a unei relaii. Aliasurile sunt utilizate la eliminarea rescrierii complete a denumirii unei relaii sau a unui cmp, redenumindu-le ntr-un mod simplificat. Sintaxa utilizat este: nume_relaie/camp AS nume_nou; sau nume_relaie/camp nume_nou; Exist posibilitatea de a utiliza aliasuri pentru tabelele din clauza FROM i utilizarea lor n cadrul comenzii SELECT respective (alias.coloana). Aceast 69

identificare (prin 'tabel.coloana' sau 'alias.coloana') este obligatorie atunci cnd se face referin la o coloana ce apare n mai mult de un tabel din clauza FROM. Exemplul 1: S se determine toate ofertele de apartamente din oraul Baia Mare, de pe strada Victoriei. SELECT CO.id_co, L.nume_loc, S.nume_str, CO.nr_imobil, DI.etaj, DI.nr_camere, DI.garaj, DI.suprafata, DI.centrala_termica, DI.termopane, DI.tip_imobil, CO.pret_min, CO.pret_max FROM CERERI_OFERTE AS CO, LOCALITATI AS L, STRAZI AS S, DESCRIERE_IMOBIL AS DI WHERE CO.tipul=oferta AND CO.id_co=DI.id_co AND CO.cod_loc=L.cod_loc AND CO.id_strada=S.id_strada AND CO.cod_loc=S.cod_loc AND L.cod_loc='MM430' AND S.id_strada='152' AND DI.tip_imobil='apartament'; Lista afiat n urma acestei interogri poate fi de genul:

Fig. 12.4. Lista apartamentelor din Baia Mare, de pe strada Victoriei Exemplul 2: S se afieze toate cererile nesoluionate de terenuri din localitatea Bora, data nregistrrii, precum i datele personale ale clienilor. SELECT CO.id_co, CO.tipul, CO.cnp, CO.data_inreg, CO.tip_solutionare, CO.cod_loc, DP.numele, DP.adresa, DP.nr_telefon, DP.email, DI.tip_imobil FROM CERERI_OFERTE CO, DATE_PERSOANA DP, DESCRIERE_IMOBIL DI WHERE CO.tipul='cerere' AND CO.cnp=DP.cnp AND cod_loc='MM435' AND CO.tip_solutionare='0' AND CO.id_co = DI.id_co AND DI.tip_imobil LIKE 'teren'; Observaie: n cazul n care un atribut apare doar ntr-o relaie dintre cele menionate n list, nu este obligatorie precizarea relaiei (adic a aliasului) din care face parte atributul respectiv, dup cum este cod_loc='MM435'. Interogarea datelor din mai multe relaii folosind tipuri de asocieri Tipurile de asocieri utilizate n interogarea mai multor relaii sunt: INNER JOIN (jonciunea intern) LEFT OUTER JOIN (semijonciunea la stnga) RIGHT OUTER JOIN (semijonciunea la dreapta)

a) Sintaxa SELECT ...FROM tabel_A INNER JOIN tabel_B (condiii de join) selecteaz toate informaiile din relaiile A i B care corespund condiiilor de asociere. 70

Exemplul 1: Selectai codul ofertei/cererilor i codul localitilor fiecrei oferte folosind operaia de join, apoi utiliznd clauza WHERE. SELECT CO.id_co, CO.cod_loc FROM CERERI_OFERTE CO INNER JOIN LOCALITATI L ON (CO.cod_loc=L.cod_loc); SELECT CO.id_co, CO.cod_loc FROM CERERI_OFERTE CO, LOCALITATI L WHERE CO. cod_loc=L.cod_loc; Observaie: Rezultatul este acelai. Valorile NULL vor fi ignorate. Exemplul 2: Selectai numele persoanelor care ofer imobile, codul ofertelor, precum i denumirile localitilor, ordonnd alfabetic localitile. SELECT DP.numele, CO.id_co, L.nume_loc FROM DATE_PERSOANA DP INNER JOIN CERERI_OFERTE CO ON (DP.cnp=CO.cnp) INNER JOIN LOCALITATI L ON (CO.cod_loc=L.cod_loc) WHERE CO.tipul LIKE oferta ORDER BY L.nume_loc; SELECT DP.numele, CO.id_co, L.nume_loc FROM DATE_PERSOANA DP, CERERi_OFERTE LOCALITATI L WHERE CO.tipul LIKE oferta AND DP.cnp=CO.cnp AND CO.cod_loc=L.cod_loc ORDER BY L.nume_loc; CO,

Observaie: Sintaxei SELECT-FROM-INNER JOIN i se pot aduga i alte condiii, neincluse n condiiile de join, dac acestea se refer la alte cmpuri dect cele care particip la join. Exemplul 3: Selectai numele persoanelor care ofer imobile n judeul Maramure, codul ofertelor, tipul acestora, precum i denumirile localitilor i a strzilor, ordonnd alfabetic localitile i strzile. 1) Folosind INNER JOIN SELECT DP.numele, CO.id_co, S.nume_str, DI.tip_imobil, L.nume_loc FROM DATE_PERSOANA DP INNER JOIN CERERI_OFERTE CO ON (DP.cnp=CO.cnp) INNER JOIN STRAZI S ON (CO.id_strada=S.id_strada ) INNER JOIN LOCALITATI L ON (CO.cod_loc=L.cod_loc AND L.cod_loc LIKE 'MM%') INNER JOIN DESCRIERE_IMOBIL DI ON (CO.id_co=DI.id_co AND CO.tipul='oferta') ORDER BY L.nume_loc, S.nume_str; Observaie: Toate condiiile ce se refer la cmpurile din join se vor prezenta n cadrul condiiilor de join. 71

2) Folosind WHERE SELECT DP.numele, CO.id_co, S.nume_str, DI.tip_imobil, L.nume_loc FROM DATE_PERSOANA DP, CERERI_OFERTE CO, STRAZI S, LOCALITATI L, DESCRIERE_IMOBIL DI WHERE CO.tipul='oferta' AND DP.cnp=CO.cnp AND CO.id_strada=S.id_strada AND CO.cod_loc=L.cod_loc AND CO.id_co=DI.id_co AND L.cod_loc LIKE 'MM%' ORDER BY L.nume_loc, S.nume_str; 3) Folosind INNER JOIN i WHERE SELECT DP.numele, CO.id_co, S.nume_str, DI.tip_imobil, L.nume_loc FROM DATE_PERSOANA DP INNER JOIN CERERI_OFERTE CO ON (DP.cnp=CO.cnp) INNER JOIN STRAZI S ON (CO.id_strada=S.id_strada ) INNER JOIN LOCALITATI L ON (CO.cod_loc=L.cod_loc ) INNER JOIN DESCRIERE_IMOBIL DI ON (CO.id_co=DI.id_oferta) WHERE L.cod_loc LIKE 'MM%' AND CO.tipul='oferta' ORDER BY L.nume_loc, S.nume_str; b) Sintaxa SELECT ...FROM tabel_A LEFT OUTER JOIN tabel_B ON (condiii de join) selecteaz toate informaiile din A, pe care le completeaz cu informaii din B, n msura n care satisfac condiiile de join; acolo unde nu vor exista informaii din B, acestea vor fi completate cu NULL. Exemplul1: Selectai toate ofertele. Dac exist informaii despre aceste oferte, afiai i aceste informaii. SELECT * FROM CERERI_OFERTE CO LEFT OUTER JOIN DESCRIERE_IMOBIL DI ON (CO.id_co=DI.id_co ) WHERE CO.tipul='oferta'; Observaie: Ordinea n care se scrie denumirea relaiei n sintaxa LEFT OUTER JOIN este foarte important. Astfel, relaia din stnga este relaia primar, adic relaia pentru care se dorete returnarea tuturor informaiilor; relaia din dreapta este relaia secundar, adic informaiile din ea sunt necesare doar n msura n care se potrivesc condiiilor de asociere. Astfel se explic i denumirea de asociere de la stnga spre exterior. Exemplul2: Selectai toate ofertele, preciznd i numele judeelor, localitilor precum i a strzilor. Dac exist informaii despre aceste oferte, afiai i aceste informaii. 72

SELECT L.nume_loc, CO.*, S.nume_str, DI.tip_imobil, DI.nr_camere, DI.suprafata, DI.garaj, DI.centrala_termica, DI.termopane FROM CERERI_OFERTE CO LEFT OUTER JOIN DESCRIERE_IMOBIL DI ON(DI.id_co=CO.id_co) INNER JOIN STRAZI S ON S.id_strada = CO.id_strada AND CO.cod_loc=S.cod_loc INNER JOIN LOCALITATI L ON CO.cod_loc = L.cod_loc WHERE CO.tipul LIKE 'oferta'; c) Sintaxa SELECT ...FROM tabel_A RIGHT OUTER JOIN tabel_B ON (condiii de join) selecteaz toate informaiile din B, pe care le completeaz cu informaii din A, n msura n care satisfac condiiile de join; acolo unde nu vor exista informaii din A, acestea vor fi completate cu NULL. Exemplu: Selectai toate localitile i, n localitile n care exist cereri nesoluionate, afiai numele clienilor i tipul de cerere de imobil respectiv. SELECT L.nume_loc, DP.numele, CO.tip_solutionare, DI.tip_imobil FROM LOCALITATI L RIGHT OUTER JOIN CERERI_OFERTE CO ON (L.cod_loc=CO.cod_loc) INNER JOIN DATE_PERSOANA DP ON (DP.cnp=CO.cnp) INNER JOIN DESCRIERE_IMOBIL DI ON (CO.id_co=DI.id_co AND CO.tipul = cerere) WHERE CO.tip_solutionare=0; Observaie: Sintaxa RIGHT OUTER JOIN este utilizat mai rar; de obicei se utilizeaz sintaxa LEFT OUTER JOIN.

73

CURS 13. Limbaje relaionale de manipulare a datelor (LMD) Interogarea datelor din mai multe relaii (continuare)
este SELECT Cmp 1, Cmp 2, ..., Cmp n FROM Tabel 1 UNION (ALL) SELECT Cmp 1A, Cmp 2A,..., Cmp nA FROM Tabel 2 i returneaz nregistrri distincte, dac este folosit instruciunea UNION i toate nregistrrile, dac se folosete UNION ALL. Astfel operatorul UNION elimin duplicatele, iar UNION ALL vizualizeaz toate nregistrrile, inclusiv duplicatele. Pentru a utiliza aceast interogare, trebuie s se in seama de dou cerine: domeniile Cmp 1A, Cmp 2A,..., Cmp nA i Cmap 1, Cmp 2, ..., Cmp n trebuie s fie respectiv aceleai i, numrul de cmpuri din fiecare interogare trebuie s coincid. Operatorul UNION se folosete atunci cnd ntre relaii nu exist o asociere direct. Exemplul 1: Pentru exemplificare se vor considera relaiile: PROFESORI (prof_id, nume, prenume), respectiv STUDENTI (stud_id, nume, prenume). Selectai lista numelor tuturor profesorilor i a studenilor. SELECT nume, prenume FROM PROFESORI UNION ALL SELECT nume, prenume FROM STUDENTI; Rezultatul generat de interogare va fi numeprenumePOPVAS ILEIONANA Fig. 13.1. Interogarea mai multor relaii folosind operatorul UNION ALL Observai: Problema mai poate fi soluionat utiliznd alte interogri, dar acestea rmn ca exerciii individuale. Exemplul 2: S se determine care sunt ofertele i cererile soluionate prin facturi, afind ntr-o list id_ul cererii/ofertei i cnp-ul cleintului, att din tabela CERERI_OFERTE ct i din tabela FACTURI. SELECT cnp, id_co FROM FACTURI UNION ALL SELECT cnp, id_co FROM CERERI_OFERTE; Rezultatul generat de interogare va fi o lista greu de urmrit, dup cum este i cea din figura 13.1, deoarece nu se specific clar care inregistrare corespunde facturilor, i care tabelei CERERI_OFERTE (acest neajuns va fi nlturat utiliznd concatenarea): 74 Interogarea datelor din mai multe relaii folosind instruciunea UNION Sintaxa interogrii datelor din mai multe relaii folosind instruciunea UNION

Fig. 13.2. Interogarea mai multor relaii folosind operatorul UNION ALL (cazul neclar) Interogarea datelor mai multor relaii folosind operatorul de concatenare a dou iruri de caractere Rolul operatorului de concatenare a dou iruri de caractere este de a uni dou iruri de caractere ntr-unul singur. Este utilizat n toate SGBD-urile, cu mici modificri ale simbolului: n Tranzact SQL se folosete simbolul +, n Oracle simbolul || etc. Se pot concatena o constant cu un cmp, sau dou cmpuri. Cmpurile trebuie s fie de tip text. Sintaxa pentru concatenarea a dou cmpuri este CONCAT(Cmp1, Cmp2) sau insernd virgula, spaiu sau oricare marcaj de delimitare CONCAT(Cmp1,,, Cmp2) sau CONCAT (Cmp1, , Cmp2). Sintaxa CONCAT(Ceva, Cmp) concateneaz cmpul i valoarea returnnd o singur valoare. Sintaxa CONCAT(Ceva1, Ceva1) concateneaz cele dou constante ntr-una singur Ceva1Ceva2. Exemplu: S se determine care sunt ofertele i cererile soluionate prin facturi, afind ntr-o list id_ul cererii/ofertei i cnp-ul cleintului, att din tabela 75

CERERI_OFERTE ct i din tabela FACTURI. De aceast dat, s se precizeze cnd este vorba de facturi, respectiv cnd este vorba de cerere sau ofert. SELECT CONCAT('F:', ' ', 'cnp;',cnp,' ', 'id_co:',id_co,' ','data:', data_factura) AS feacturi_si_oferte_cereri FROM FACTURI UNION SELECT CONCAT('C_O:',' ', 'cnp;',cnp,' ', 'id_co:',id_co,' ','data:', data_inreg) FROM CERERI_OFERTE; Rezultatul generat de interogare va fi

Fig. 13.3. Interogarea mai multor relaii folosind concatenarea (cazul mai clar) Observaie: Concatenarea prezint dezavantajul afirii cmpurilor null. a) Interogarea datelor folosind funciile totalizatoare MAX MIN COUNT SUM AVG

Interogarea datelor folosind funcia MAX 76

Sintaxa MAX(Nume_cmp) FROM Tabela returneaz un numr egal cu valoarea maxim a cmpului Nume_cmp din relaia Tabela, valorile null fiind ignorate. Exemplu: Selectai cea mai recent nregistrare din tabela CERERI_OFERTE, fr a da un nume rezultatului, apoi cu nume pentru cmpul rezultat. SELECT MAX(data_inreg) FROM CERERI_OFERTE; SELECT MAX(data_inreg) AS data_ultimei_nregistrari FROM CERERI_OFERTE; b) Interogarea datelor folosind funcia MIN Funcia MIN este o funcie similar cu funcia MAX, cu ajutorul creia se poate determina valoarea cea mai mic dintr-un cmp. Att funcia MIN ct i funcia MAX se poate aplica doar pentru tipurile de date numeric sau dat calendaristic. c) Interogarea datelor folosind funcia COUNT Sintaxa COUNT (*) FROM Nume_tabela returneaz un numr egal cu numrul de nregistrri ale tabelei Nume_tabela. Exemplu: Precizai numrul de oferte nregistrare. SELECT COUNT(*) AS numar_de_oferte FROM CERERI_OFERTE WHERE tipul LIKE oferta; Sintaxa COUNT (Nume_cmp) FROM Tabela returneaz un numr egal cu numrul de valori nenule ale cmpului Nume_cmp din tabela Nume_tabela. Sunt ignorate valorile null. Exemplu: Precizai numrul de cereri nesoluionate. SELECT COUNT(tip_solutionare) AS cereri_solutionate FROM CERERI_OFERTE WHERE tip_solutionare=1 AND tipul=cerere; Sintaxa COUNT(DISTINCT Nume_cmp) FROM Tabela returneaz un numr egal cu numrul de valori distincte nenule ale cmpului Nume_cmp din tabela Nume_tabela. Sunt ignorate valorile null. Exemplu: Precizai numrul de localiti din care provin ofertele. SELECT COUNT(DISTINCT cod_loc) FROM CERERI_OFERTE WHERE tipul=oferta; 77

d)

Interogarea datelor folosind funcia SUM Sintaxa SUM (Nume_cmp) FROM Tabela returneaz un numr egal cu suma tuturor valorilor cmpului Nume_cmp din relaia Nume_Tabela. Sunt ignorate valorile null. Exemplu: Precizai suma tuturor ncasrilor existente pe facturile emise. SELECT SUM(DISTINCT total) FROM FACTURI; Sintaxa SUM (DISTINCT Nume_cmp) FROM Tabela returneaz un numr egal cu suma valorilor distincte ale cmpului Nume_cmp din relaia Nume_Tabela. Funcia SUM se aplic acelor cmpuri care au domeniul de valori de tipul FLOAT, DECIMAL, NUMERIC, INT etc. i nu are sene pentru cmpuri de tip text.

e)

Interogarea datelor folosind funcia AVG Sintaxa AVG (nume_cmp) FROM Nume_tabela returneaz un numr egal cu media aritmetic a tuturor valorilor cmpului Nume_cmp din relaia Nume_tabela. Valorile null sunt ignorate. Funcia AVG se utilizeaz doar pentru date de tip numeric: INT, FLOAT, NUMERIC. Exemplu: Selectai media valorilor vnzrilor din agenia imobiliar. SELECT AVG (total) FROM FACTURI; parte. Exemplu: Selectai fiecare tip de imobil n parte grupndu-le alfabetic i precizai numrul de imobile vndute din fiecare tip. SELECT DI.tip_imobil, COUNT(F.id_co) AS suma FROM DESCRIERE_IMOBIL DI, FACTURI F WHERE F.id_co=DI.id_co GROUP BY DI.tip_imobil; Interogarea returneaz urmtoarele informaii: Interogarea datelor folosind instruciunea GROUP BY Prin instruciunea GROUP BY se grupeaz datele dup fiecare produs n

Fig. 13.4 Rezultatul interogrii folosind instruciunea GROUP BY i funcia SUM Menionarea clauzelor SELECT, FROM, WHERE, GROUP BY, ORDER BY n aceast ordine este obligatorie. Greeala frecvent care duce la apariia unor mesaje 78

de eroare este aceea a introducerii unor cmpuri dup care se grupeaz n clauza SELECT i neintroducerea lor n clauza GROUP BY. Pentru a evita pierderea de informaii, este indicat ca atributul dup care se grupeaz s fie cheie primar. SELECT CO.id_co, J.nume_judet, L.nume_loc, S.nume_str, CO.pret_min, CO.pret_max FROM JUDETE J, CERERI_OFERTE CO, LOCALITATI L, STRAZI S WHERE CO.cod_loc=L.cod_loc AND CO.id_strada=S.id_strada AND L.simbol_judet=J.simbol_judet GROUP BY J.nume_judet;

Fig.13.5. Rezultatul interogrii folosind instruciunea GROUP BY cu pierderi de informaii Acest inconvenient este nlturat dac se grupeaz dup numele judeului, localitii i a strzii, caz n care vor aprea tupluri duplicat. SELECT CO.id_co,J.nume_judet, L.nume_loc, S.nume_str, CO.pret_min, CO.pret_max FROM JUDETE J, CERERI_OFERTE CO, LOCALITATI L, STRAZI S WHERE CO.cod_loc=L.cod_loc AND CO.id_strada=S.id_strada AND L.simbol_judet=J.simbol_judet GROUP BY L.cod_loc;

Fig.13.6. Rezultatul interogrii folosind instruciunea GROUP BY fr pierderi de informaii Interogarea datelor folosind instruciunea HAVING 79

Instruciunea HAVING se utilizeaz numai n combinaie cu instruciunea GROUP BY. Dac gruparea de date trebuie s satisfac vreo condiie, aceast condiie se exprim cu ajutorul sintaxei HAVING. Clauza HAVING este utilizat cnd se dorete filtrarea datelor grupate conform unor criterii. Aceste criterii presupun compararea unor valori obinute prin apelarea unor funcii totalizatoare. Aceste tipuri de comparri presupun gruparea datelor. Din aceast cauz, HAVING cere obligatoriu clauza GROUP BY. Exemplu: Selectai adresele ofertelor grupate dup judee, localiti i strzi care au preul minim cuprins ntre 50000 i 300000. SELECT CO.id_co,J.nume_judet, L.nume_loc, S.nume_str, CO.pret_min, CO.pret_max FROM JUDETE J, CERERI_OFERTE CO, LOCALITATI L, STRAZI S WHERE CO.cod_loc=L.cod_loc AND CO.id_strada=S.id_strada AND L.simbol_judet=J.simbol_judet GROUP BY CO.id_co HAVING CO.pret_min BETWEEN 50000 AND 300000; Ordinea obligatorie a unei fraze SELECT complete este: SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY.

80

Curs 14. Funcii utilizate n interogri


Cele mai des ntlnite funcii n interogri sunt: funcii pentru iruri de caractere funcii pentru valori numerice funcii pentru date calendaristice funcii de conversie dintr-un tip n altul.

a) b) c) d)

a) Funcii pentru iruri de caractere CONCAT: concateneaz dou iruri de caractere SELECT CONCAT('My', 'S', 'QL'); -> 'MySQL' SELECT CONCAT('My', NULL, 'QL'); -> NULL SELECT CONCAT(14.3); -> '14.3' - REPLACE: nlocuirea unui ir de caractere cu un altul ntr-o expresie de acest tip; SELECT REPLACE('www.mysql.com', 'w', 'Ww'); -> WwWwWw.mysql.com - CHAR_LENGTH: returneaz numrul de caractere dintr-un ir; - FIELD(str,str1,str2,str3,): returneaz poziia irului de caractere str n lista irurilor de caractere str1,str2,str3; dac irul str nu este gsit, returneaz valoarea 0. SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo'); -> 2 SELECT FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo'); -> 0 - LEFT(str,n): returneaz subirul fromat dintr-un numr de n caractere; SELECT LEFT('paralelipiped', 5); -> 'paral' - LOWER(str): toate literele din str vor fi convertite n minuscule; SELECT LOWER('LITERE MARI'); -> 'litere mari' - UPPER(str): toate literele din str vor fi convertite n majuscule; SELECT LOWER('LITERE mari'); -> 'LITERE MARI' - LPAD(str,n,caracter): completeaz la stnga cu un caracter pn la atingerea unei lungimi specificate SELECT LPAD('buna',6,'?'); ->??buna SELECT LPAD('buna',1,'??'); ->b - RPAD(str,n,caracter): completeaz la dreapta cu un caracter pn la atingerea unei lungimi specificate SELECT RPAD('buna',5,'?'); 81

->buna? LTRIM(str): elimin spaiile de la stnga valorii str; SELECT LTRIM(' barbar'); ->barbar RTRIM(str): elimin spaiile de la dreapta valorii str; SELECT RTRIM('barbar '); ->barbar TRIM: eliminarea simultan a spaiillor la stnga i la dreapta; SELECT TRIM(' bar '); ->bar SUBSTR(sir,n): extragerea unei poriuni dintr-un ir ncepnd cu a n-a liter; SELECT SUBSTRING('Paralelipiped',5); ->lelipiped

b) Funcii pentru valori numerice CEIL(p): ntoarce cel mai mic ntreg mai mare sau egal cu argumentul p; SELECT CEIL(1.23); ->2 SELECT CEIL(-1.23); ->-1 FLOOR(p): ntoarce cel mai mare ntreg mai mic sau egal cu argumentul p; SELECT FLOOR(-1.23); ->-2 SELECT FLOOR(1.23); ->1 ROUND(p,n): rotunjete rezultatul unei expresii (p) la un numr de poziii funcionare dac n este pozitiv, sau, dac n este negativ, se face la ordinul zecilor, sutelor, miilor etc. SELECT ROUND(-1.23); ->-1 SELECT ROUND(-1.58); ->-2 SELECT ROUND(1.58); ->2 SELECT ROUND(1.298, 1); ->1.3 SELECT ROUND(1.298, 0); ->1 SELECT ROUND(23.298, -1); ->20 TRUNC(p,n): are efect similar funciei ROUND, numai c n loc de rotunjire se face trunchiere. SELECT TRUNCATE(1.223,1); ->1.2 SELECT TRUNCATE(1.999,1); ->1.9 SELECT TRUNCATE(1.999,0); ->1 SELECT TRUNCATE(-1.999,1); 82

->-1.9 SELECT TRUNCATE(122,-2); ->100 c) Funcii pentru date calendaristice CURRENT_DATE(): furnizeaz data curent sub forma YYYY-MM-DD; SELECT current_date(); -> 2006-08-15 - SYSDATE(): furnizeaz data curent i ora exact sub forma YYYY-MM-DD HH-MM-SS; SELECT SYSDATE(); -> 2006-08-15 15:06:44 - CURRENT_TIMESTAMP(), NOW(), SYSTIMESTAMP: sunt sinonime cu SYSDATE; - DATE_ADD (data,INETRVAL nr.): adun un numr de ani, luni sau zile la data argument; SELECT DATE_ADD('2006-08-15', INTERVAL 1 MONTH); -> 2006-09-15 - LAST_DAY(data): furnizeaz ultima zi din luna n care se afl data argument; SELECT LAST_DAY('2008-02-15'); -> 2008-02-29 - DATEDIFF(data1,data2): calculeaz numrul de zile dintre cele dou date calendaristice; SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30'); ->1 SELECT DATEDIFF('1997-11-30 23:59:59','1997-12-31'); ->-31 - DAYNAME(data): afieaz denumirea zilei corespunztoare datei argument; SELECT DAYNAME(2006-08-19); -> 'Saturday' DAYOFMONTH(data), DAYOFYEAR(data): (ziua din lun, ziua din an) furnizeaz numrul de ordine n cadrul lunii, respective a anului pentru o dat calendaristic. SELECT DAYOFYEAR('2006-08-19'); ->231 d) Funcii de conversie dintr-un tip n altul Funcia de conversie cel mai des utilizat este funcia CAST. - CAST: realizeaz diferite conversii, de exemplu SELECT CONCAT('Data: ', CAST(NOW() AS DATE)); -> Data: 2006-08-18 concateneaz irul de caractere data: cu data calendaristic actual, convertit la ir de caractere. Exemple Exemplul 1: Modificai toate numerele de telefon din judeul Maramure, astfel ca prefixul s nu mai fie 0262 ci 0362, din baza de date AGENTIE_IMOBILIARA. 83

UPDATE DATE_PERSOANA SET nr_telefon=CONCAT('0362', SUBSTR(nr_telefon, 5)) WHERE SUBSTR(nr_telefon,1,4)='0262'; Pentru modificarea datelor s-a folosit comanda UPDATE nume_tabel SET instructiuni WHERE conditii, iar funcia SUBSTR(sir,nr) extrage ciferele din ntregul numr de telefon, ncepnd cu a cincea poziie, cifre ce vor fi concatenate cu prefixul 0362. De asemenea, prin funcia SUBSTR(nr_telefon,1,4) se realizeaz extragerea primelor patru numere din ntregul numr de telefon. Exemplul 2: Afiai numele i data naterii clienilor din baza de date AGENTIE_IMOBILIARA, cunoscnd codul numeric personal al acsotra. SELECT CONCAT('Numele: ',numele) AS numele, CONCAT('Anul: ', '19',SUBSTR(cnp,2,2),' , ','Luna:', SUBSTR(cnp,4,2), ', ','Ziua: ', SUBSTR(cnp,6,2)) AS data_nasterii FROM DATE_PERSOANA; Observaie: n interogarea de mai sus se concateneaz irul Numele cu numele clientului, apoi se concateneaz irul Anul cu irul 19 (deoarece se consider c nu sunt clieni nscui dup anul 1999) i cu cele dou cifre ale codului numeric personal care desemneaz anul naterii unei persoane (SUBSTR(cnp,2,2)). n mod analog se efectueaz i celelalte concatenri.

Fig. 14.1. Utilizarea funciilor CONCAT i SUSTR Exemplul 3: Afiai preurile ofertelor (preul minim i preul maxim) folosind alinierea la dreapta i la stnga. SELECT LPAD(pret_min,30,' ') AS 'pret minim', RPAD(pret_max,30,' ') AS 'pret maxim' FROM CERERI_OFERTE WHERE tipul LIKE oferta ORDER BY pret_min,pret_max;

84

Fig. 14.2. Utilizarea funciilor LPAD i RPAD Exemplul 4: S se afieze numrul de cereri de imobile primite n prima jumtate a oricrei luni fa de cele primite n cea de a doua jumtate. SELECT LTRIM(COUNT(id_co)) AS 'nr de cereri in prima jumatate a lunii' FROM CERERI_OFERTE WHERE DAYOFMONTH(data_inreg)<16 AND tipul =cerere; (a) SELECT COUNT(id_co) AS 'nr de cereri in a doua jumatate a lunii' FROM CERERI_OFERTE WHERE DAYOFMONTH(data_inreg)>15 AND tipul =cerere; (b) Fig. 14.3. Utilizarea funciei DAYOFMONTH (a), (b)

85

SINTEZ I EXERCIII
1. Cei opt operatori iniiali
a b c Restricia Proiecia x y a a b b c c x y x y x y

Reuninuea

Intersecia

Produs

Diferena

a1 a2 a3

b1 b1 b2

b1 b2 b3

c1 c2 c3

a1 a2 a3

b1 b1 b2

c1 c1 c3

a b c

a a a b c

x y z x y

x z

Uniune(natural) mprirea

Fig. 1. Reprezentarea operatorilor relaional

86

2. Teste Curs 1 - Exerciii 1. Prin tipul unei date nelegem: a) mulimea valorilor pe care le poate lua data; b) structura, mulimea valorilor, operaiile admise i modul de tratare a erorilor; c) structura, mulimea valorilor, operaiile admise, regulile de protecie i securitatea datelor. Prin valoarea atomica, nelegem: a) o valoare reprezentat printr-un singur simbol; b) o valoare din care nu putem elimina nici o component fr s denaturm semnificaia datei; c) o valoare cu format rigid Atributul reprezint: a) mulimea valorilor posibile ale unei date; b) o caracteristic a unei entiti; c) formatul de reprezentare a unei date Prin baza de date, nelegem: a) orice colecie de date; b) o colecie de date conectate logic, exhaustiv i neredundant; c) orice colecie de date materializat sub forma unor fiiere de disc magnetic Prin sistem de gestiune a bazelor de date, nelegem: a) modul de organizare al unui sistem informatic, care manipuleaz date din baze de date; b) un program sau pachet de programe, care permite crearea, pstrarea i eliminarea bazelor de date; c) un sistem de programe, care permite utilizatorului definirea, crearea i ntreinerea bazei de date, precum i accesul controlat la aceasta. Definii urmtorii termeni: - baz de date - sistem de gestiune de baz de date - entitate - diagram E-R - atribut - asociere Care sunt etapele de realizare a unei baze de date?

2.

3.

4.

5.

6.

7.

87

Curs 2- Exerciii 8. O relaie este: a) orice tabel bidimensional cu valori atomice; b) orice tabel; c) orice tabel bidimensional Se numete grad al unei relaii: a) numrul domeniilor distincte ale relaiei; b) numrul de tupluri distincte ale relaiei; c) numrul de atribute ale relaiei Cardinalitatea unei relaii reprezint: a) numrul de atribute ale relaiei; b) numrul de tupluri ale relaiei; c) numrul de atribute identificator, ale relatiei. Care sunt componentele unei diagrame E-R? Ce se nelege prin cardinalitate? Numii trei tipuri de asocieri ntre entiti. 14. Pentru baza de date FURNIZORI_COMPONENTE descris mai jos, n figura 2, precizai tipurile de relaionri ntre relaiile F,C, respectiv FC, apoi realizai diagrama E-R. Dai exemple de: - o relaie de tip muli la muli - o relaie de tip unu la unu - o relaie de tip unu la muli. Relaiile de tip mai multe la mai multe sunt dificil de implementat ntr-un proiect eficient de baze de date. Ce este de fcut, n acest caz? 17. Desenai diagrama entitate-relaie (preciznd i tipul asocierilor) pentru urmtoarea baz de date COLECTIE_MUZICA: presupunei c avei o colecie muzical rock, format din CD-uri i DVD-uri i casete audio i dorii s construii o baz de date care s permit s gsii nregistrrile pe care le avei pentru un anumit interpret (de exemplu, Joe Cocker), pentru un anumit chitarist (de exemplu, Joe Satriani), pentru un anumit baterist (de exemplu, Lars Ulrich), pentru un anumit album (de exemplu, Master of Puppets), o anumit formaie (de exemplu, Metallica).

9.

10.

11. 12. 13.

15.

16.

88

Curs 3- Exerciii 18. Se numete domeniu al unui atribut: a) mulimea valorilor posibile ale unui atribut; b) tipul datelor de atribut; c) mulimea valorilor actuale ale unui atribut Se numete baz de date relaional: a) un set de tabele; b) un set de tabele normalizate; c) un set de tabele bidimensionale Definii urmtorii termeni: - cheie primar -cheie extern - BDR - domeniu - entitate - atribut - relaie Care sunt conceptele utilizate pentru a descrie elementele de baz ale organizrii unei BDR?

19.

20.

21.

89

Curs 4- Exerciii 22. Dou relaii R1 i R2 sunt compatibile cu reuniunea, dac: a) au acelai numr de atribute; b) au acelai numr de atribute, iar atributele care ocup aceeai poziie au acelai nume; c) au acelai numr de atribute, iar atributele care ocup aceeai poziie au acelai domeniu. Pentru a putea determina intersecia relaiilor R1 i R2 este necesar ca: a) relaiile s fie compatibile cu intersecia; b) relaiile s fie compatibile cu reuniunea; c) relaiile s aib cel puin un tuplu comun. Dac R1 are n1 tupluri, R2 are n2 tupluri, atunci R1 U R2 are: a) cel puin n1 + n2 tupluri; b) n1 + n2 tupluri; c) cel mult n1 + n2 tupluri. Operatorul de proiecie aplicat unei relaii, permite: a) eliminarea unor coloane; b) modificarea poziiei coloanelor; c) eliminarea unor coloane i modificarea poziiei lor Pentru a putea realiza jonciunea natural ntre relaiile R1 i R2 este necesar ca: a) relaiile R1 i R2 s fie compatibile cu reuniunea; b) relaiile R1 i R2 s aib cte un atribut cu acelai domeniu; c) relaiile R1 i R2 s aib cel puin cte un atribut cu acelai nume i acelai domeniu. Se consider relaiile: STUDENT (NR_LEG, NUME, PRENUME, GRUPA) i TELEFON (NR_LEG, PREFIX, TELEFON, TIP_TELEFON). Se presupune c fiecare student are cel mult un telefon mobil. Pentru a rezolva cererea s se afieze toi studenii unei grupe precizate, iar acolo unde este cazul s se afieze i telefonul mobil, este necesar s utilizam: a) o jonciune natural; b) o jonciune de egalitate; c) o jonciune extern. Rezultatul aplicrii unui operator relaional, este ntotdeauna: a) o relaie; b) o relaie sau o valoare; c) o relaie sau un set de relaii. Definii urmtorii operatori: - reuniunea - diferena - produsul cartezian - proiecia - selecia - intersecia - diviziunea Enumerai cele trei tipuri de jonciune. Care dintre operatorii relaionali definii n cursul 4 au o definiie care nu se bazeaz pe aceeai structur? 90

23.

24.

25.

26.

27.

28.

29.

30. 31.

32. Fie baza de date FURNIZORI_COMPONENTE modelat de urmtoarele valori eantion: F FC F F#numeFStareorasF1Pop20BucurestiF2Achim F 1 10PloiestiF3Ardelean30PloiestiF4Popescu20B F u ucurestiF5Ionescu30Vaslui F F F#C#cantF1C1300F F 1 1C2200F1C3400F1 F C C4200F1C5100F1C F C 6 F 6100F2C1300F2C24 0F 00F3C2200F4C2200 F C C#numeCCuloareMasaorasC1piulitaRosu12.0Bucuresti C F F4C4300F4C5400 F C C2BoltVerde17.0PloiestiC3Surubalbastru17.0AradC4Su C r rubRosu14.0BucurestiC5CamaAlbastru12.0PloiestiC6R C o oata dintatarosu19.0Bucuresti Fig. 2. Baza de date FURNIZORI_COMPONENTE (valori eantion) Furnizorii i componentele sunt identificate n mod unic prin numrul furnizorului F, respectiv prin numrul componentei C. Fiecare furnizor are un numr F, un nume numeF, care nu este neaprat unic, o valoare de cotare sau a strii stare i o localizare oras. Se presupune c fiecare furnizor este localizat n exact un singur ora. Fiecare component are un numr C care este unic, un nume numeC, o culoare culoare, o mas mas i localitate n care sunt stocate componentele. Relaia FC reprezint livrrile i se exprim astfel: Furnizorul F livreaz componenta C n cantitatea cant. Care este valaorea expresiei F JOIN FC JOIN C? Fie R o relaie de gardul n. Cte proiecii diferite ale relaiei R exist? 34. Reuniunea, intersecia, produsul i jonciunea sunt att comutative, ct i asociative. Verificai aceste proprieti pe baza unor exemple construite de dumneavoastr. 35. Fie expresia a JOIN b. Dac relaiile a i b au anteturi disjuncte, atunci aceast expresie este echivalent cu a TIMES b; dac au acelai antet, atunci este echivalent cu a INTERSECT b. Verificai aceste afirmaii pe baza unor exemple construite de dumneavoastr. 36. n aritmetic, nmulirea i mprirea sunt operaii inverse. TIMES i DIVIDEDBY sunt operaii inverse n algebra relaional?

33.

91

Curs 5- Exerciii 37. Fie A si B dou atribute (simple sau compuse) ale relaiei R. Se spune c atributul B este dependent funcional de A, dac: a) fiecrei valori a lui A i este asociat exact o valoare a atributului B; b) fiecrei valori a lui A i este asociat cel puin o valoare nenul a atributului B; c) fiecare valoare a lui B este asociat unei valori a lui A. 38. Explicai urmtoarele noiuni: - restricii de integritate - cheia primar a unei relaii - cheia extern a unei relatii - relaie care refer - relaie referit. 39. n baza de date FURNIZORI_COMPONENTE, dai exemple de a) chei primare i secundare b) chei simple i chei compuse c) relaie care refer i relaie referit. 40. Precizai care sunt restriciile de integritate minimal ale modelului relaional, apoi enunai aceste restricii. 41. Ce nseamn dependen funcional? Dai dou exemple de DF. 42. Se definete o relaie ORAR, cu urmtoarele atribute: Z ziua din sptmn (de la 1 la 5) T perioada din zi (de la 1 la 6) C numrul slii de clas P numele profesorului L numele leciei. Tuplul (z,t,c,p,l) apare n aceast relaie dac i numai dac la momentul (z,t) lecia l este predat de profesorul p n sala de clas c. Se presupune c leciile au durata de o perioad i c ficare lecie are un nume, care este unic pentru toate leciile predate ntr-o sptmn. Ce dependene funcionale conine aceast relaie? Care sunt cheile candidat? 43. Fie relaia F_O_C din figura urmtoare:
F_O_C

F F#orasC#cantF1BrasovC11 0F 00F1BrasovC2100F2IasiC 1 F 1200F2IasiC2200F3IasiC2 3 F 300F4BrasovC2400F4Bras o ovC4400F4BrasovC5400 F Fig. 3. Relaia F_O_C (valori eantion) Determinai dependnele funcionale.

92

Curs 7- Curs 8- Exerciii 44. Se spune c o relaie este n forma normal 1, dac: a) nu conine atribute compuse; b) fiecare atribut are numai valori atomice; c) conine cel puin o cheie candidat. 45. Se spune c o relaie se afl n a doua form normal, dac: a) se afl n prima form normal i fiecare atribut care nu este cheie primar este total dependent de cheia primara; b) se afl n prima form normal i orice atribut care nu este cheie candidat este total dependent de cheia primar; c) se afl n prima form normal i orice atribut care nu este determinat este total dependent de cheia primar. 46. Se consider relaia EXAMEN (NR_LEG, DATA_EXAMEN, ID_MATERIE, SALA, NOTA). Aceast relaie se afl n: a) a II-a form normal; b) a III-a form normal; c) prima form normal. 47. Exist numai trei forme normale? Enumerai formele normale. 48. Definii urmtoerele noiuni: - atribut simplu (atomic) - atribut compus. 49. S se normalizeze bazele de date prezente pe parcursul acestui capitol: COLECTIE_MUZICALA, FURNIZORI_COMPONENTE.

93

Curs 9- Exerciii 50. Limbajul SQL reprezint: a) un limbaj procedural de descriere i manipulare a datelor ntr-o baz de date; b) un limbaj neprocedural de descriere i manipulare a datelor ntr-o baza de date; c) un limbaj neprocedural de descriere i manipulare a datelor ntr-o baza de date relaional, sau obiect relational. 51. Ce este SQL? 52. Care sunt limbajele SQL? 53. Explicai care este rezultatul returnat de fiecare dintre urmtoarele funcii: MAX, MIN, COUNT, SUM, AVG. 54. Care sunt domeniile celor mai utilizate tipuri de variabile numerice? Dar pentru tipul ir de caractere?

94

Curs 10- Exerciii 55. Precizai care sunt rezultatele generate de comanda ALTER TABLE...ADD. 56. Care este comanda prin care o cheie primar, o cheie extern sau o constrngere este exprimat? 57. Creai tabelul salariat avnd urmtoarea structur: Nume cod_angajat nume prenume functia sef data_angajarii varsta email salariu Caracteristici NOT NULL Tipul INTEGER(4) VARCHAR(25) VARCHAR(25) VARCHAR(20) INTEGER(4) DATE NUMBER CHAR(10) DECIMAL(9,2)

Valoare implicit 0

Fig. 4. Structura tabelului SALARIAT (prima form) 58. Pentru baza de date COLECTIE_MUZICA (vezi problema 9), s se execute toate comenzile din cursul 10, i anume - crearea bazei de date - crearea tabelelor indicnd cheile - modificarea numelui unei tabele - adugarea unui atribut - modificarea unui atribut - adugarea/ suprimarea unor restricii de integritate - modificarea unei constrngeri - acordarea/ retragerea drepturilor de acces la baza de date. 59. Exersai aceleai comenzi pentru baza de date FURNIZORI_COMPONENTE. 60. S se defineasc o constrngere la nivel de coloan prin care s se specifice cheia primar i cheia extern prin construirea tabelei F din baza de date FURNIZORI_COMPONENTE descris n problema 15. 61. S se defineasc o constrngere la nivel de tabel prin care s se specifice cheia primar i cheia extern prin construirea tabelei FC din baza de date FURNIZORI_COMPONENTE descris n problema 15. 62. Dup ce tabela F a fost creat n problema 33, suprimai cheia primar a tabelei F din baza de date FURNIZORI_COMPONENTE apoi recreai cheia primar a tabelei. 63. Aceeai cerin ca n problema precedent, pentru cheia strin. 64. tergei i apoi creai din nou tabelul salariat cu urmtoarea structur. NUME TIP CONSTRNGERE

95

cod_ang nume prenume data_nasterii functia sef data_angajarii email salariu cod_dept

INTEGER(4) VARCHAR(25) VARCHAR(25) DATE VARCHAR(9) INTEGER(4) DATE VARCHAR(20) DECIMAL(12,3) INTEGER(4)

Cheie primar NOT NULL data_nasterii<data_angajarii NOT NULL Refer ca i cheie extern cod_ang din acelai tabel unic >0 NOT NULL Combinaia NUME + PRENUME s fie unic

Fig. 5. Structura tabelului SALARIAT (a doua form) 65. tergei tabelul salariat, iar constrngerile la nivel de tabel. apoi recreai-l implementnd toate

Observaie: Constrngerea de tip NOT NULL se poate declara doar la nivel de coloan.

96

Curs 11- Exerciii 66. Se consider comanda SQL SELECT * FROM (STUDENT INNER JOIN ADRESA ON NR_LEG = NR_LEG) INNER JOIN TELEFON ON NR_LEG = NR_LEG Care dintre urmtoarele afirmaii este corect: a) comanda este corect; b) comanda va genera un mesaj de eroare; c) comanda se execut dar nu se afieaz nimic. Se consider comanda SQL SELECT * FROM STUDENT LEFT OUTER JOIN TELEFON ON STUDENT. NR_LEG = TELEFON.NR_LEG WHERE GRUPA = 7710; Se presupune c n grupa selectat sunt 30 de studeni, 5 studeni au un telefon i 4 studeni au cte dou telefoane. Atunci, n urma execuiei se va afia: a) o list cu 30 linii; b) o list cu 34 de linii; c) o list cu 13 linii. 68. S se afieze numele clienilor care au achiziionate ntre 3 i 10 imobile, din baza de date AGENTIE_IMOBILIARA. 69. Pentru baza de date FURNIZORI_COMPONENTE realizai urmtoarele interogri: A) afiarea tuturor furnizorilor i a oraelor unde sunt situate, ordonnd descresctor dup numele furnizorilor; B) afiarea tuturor furnizorilor din Ploieti; C) afiarea componentelor care au masa sub 14 u.m, inclusiv; D) afiarea componentelor de culoare roie i albastr care nu sunt produse n oraul Ploieti; E) afiarea acelor furnizori care au livrat componenta C2, ordonnd dup furnizori; F) afiarea mediei cantitii livrate de furnizorul F1; (utilizai dicionarul pentru a afla detalii despre funcia MIN, MAX, SUM, COUNT, AVG); G) afiarea furnizorilor care au livrat cel mai mare numr de componente de un anumit tip; H) afiarea furnizorilor care au livrat cea mai mic cantitate de componente, afind numele acestora oraul de provenien al furnizorilor i componenta livrat; I) afiarea tuturor culorilor folosite pentru componentele livrate de furnizori; J) afiarea tuturor informaiilor furnizorilor a cror nume ncepe cu A; K) afiarea numelui furnizorilor care au starea cuprins ntre 10 si 20; 70. S se vizualizeze toate denumirile albumelor existente n baza de date COLECTIE_MUZICA, ordonate alfabetic. 71. S se realizeze interogri asemntoare cu cele de la exerciiul 39 pentru baza de date COLECTIE_MUZICA.

67.

97

Currs 12- Exerciii 72. n cazul bazei de date FURNIZORI_COMPONENTE, s se realizeze urmtoarele interogri: a) Care sunt numele furnizorilor ce au livrat componenta C2 i care sunt oraele din care provin aceti furnizori? b) Care component roie s-a livrat n cea mai mare cantate? c) Din ce ora provine furnizorul cu cele mai puine componente vndute, i care sunt aceste componente? d) S se vizualizeze toate informaiile legate de furnizorii care au livrat componente, precum i toate informaiile despre aceste componente. 73. Afiai lista cu toi interpreii i cu albumele lor existente n baza de date COLECTIE_MUZICA, ordonnd dup interprei. 74. Vizualizai aceeai list de mai sus existent pe casete audio. 75. Care dintre interprei figureaz i pe CD i pe casete audio? 76. Descriei tipurile de JOIN utilizate n procesul de interogare a relaiilor unei baze de date. 77. Pentru toate interogrile de mai sus, s se formuleze fraze SELECT att cu ajutorul clauzei WHERE ct i cu ajutorul operaiilor de JOIN. 78. Fie baza de date H-R cu diagrama reprezentat n figura 6.
DEPARTMENTS 79. Department_id Department_name Manager_id Location_id

manages belongs to
EMPLOYEES employee_id first_name last_name salary Manager_id Department_id Job_id Location_id JOB_HISTORY employee_id start_date end_date job_id department_id

Located in

LOCATIONS location_id country_id street_address city

is manager of

has job

Located in (2)

JOBS job_id job_title min_salary max_salary JOB_GRADES Grade_level Lowest_sal Highest_sal

COUNTRIES country_id country_name region_id

Located in (3)

REGIONS region_id region_name

98

Fig. 6. Diagrama bazei de date H-R n ipoteza n care tabelele au fost poulate cu date, s se afieze numele salariailor i numele departamentelor n care lucreaz. Se vor afia i salariaii care nu lucreaz ntr-un departament. (right outher join). 80. S se afieze numele departamentelor i numele salariailor care lucreaz n ele. Se vor afia i departamentele care nu au salariai. (left outher join).

99

Curs 13- Exerciii 81. Din cte localiti provin furnizorii? (BD utilizat este FURNIZORI_COMPONENTE). 82. Pentru baza de date AGENTIE_IMOBILIARA, precizai: A) care sunt localitile cu cele mai multe solicitri (cereri) de imobil? Dar cu cele mai multe oferte? B) n ce lun a anului s-au nregistrat cele mai multe oferte? Dar cele mai puine cereri? C) Care este clientul ce a achiziionat cele mai multe imobile? 83. n ce interogri este necesar utilizarea cuvntului HAVING? a) cnd este necesar s eliminm linii duble din rezultat; b) cnd este necesar s ordonm mulimea rezultat; c) cnd este necesar s efectum un calcul pe grup; d) cnd este necesar s restricionm grupurile de linii returnate. 84. Cu care clauz se utilizeaz n permanen clauz HAVING? Precizai deosebirea dintre clauzele ORDER BY i GROUP BY.

85.

100

Curs 14- Exerciii 86. Care sunt funciile pentru adugarea i eliminarea caracterelor suplimentare (inclusiv a spaiilor albe) din irurile de caractere? 87. Se pot folosi mai multe funcii ntr-o singur instruciune? Afiai ultima zi a lunii curente. S se afieze data curent i data peste trei luni. Afiai data peste un an, 2 luni i 3 zile de la data curent. 91. S se afieze lista clienilor din baza de date AGENTIE_IMOBILIARA ce trebuie felicitai de Sfnta Maria. 92.Extragei din fiecare nume a clientului patru caractere, ncepnd cu al cincilea, apoi s se afieze numrul de caractere care intr n componena numelui fiecrui client (se va utiliza baza de date AGENTIE_IMOBILIARA). 93. Scriei cu majuscule numele furnizorilor din baza de date FURNIZORI_COMOPNENTE. 94. nlocuii literele F i C cu furniz, respecitv cu compon n baza de date FURNIZORI_COMOPNENTE. 95. S se afieze lista furnizorilor i componentelor din baza de date FURNIZORI_COMOPNENTE sub forma Furnizorul ... a livrat componenta ... n cantitatea de .... 96. Folosii toate cele patru funcii numerice (CEIL, FLOOR, ROUND, TRUNC) pentru suma de achitat lunar n decursul unui an, sum ce se obine mprind preul total (de pe factur) al unei tranzacii imobiliare la numrul de luni dintun an (din baza de date AGENTIE_IMOBILIARA). 97. Calculai numrul de zile cuprins ntre data de nregistrare a ofertelor i data de soluionare a acestora, adic data de pe factur (n cazul n care ofertele au fost soluionate) utiliznd BD AGENTIE_IMOBILIARA. 98. Cte oferte au fost primite n timpul primelor trei zile ale sptmnii (de-a lungul tuturor lunilor) din baza de date AGENTIE_IMOBILIARA? Dar n restul zilelor sptmnii? 99.Afiai n ce zile ale sptmnii s-au nregistrat oferte n baza de date AGENTIE_IMOBILIARA. Aceeai cerin pentru numele lunilor (folosii funcia MONTHNAME).

88. 89. 90.

101

BAZE DE DATE.............................................................................................................................1 CAPITOLUL I. PROIECTARE (DESIGN) DE DATE (9 sapt.)...................................................1 CURS 1. Preliminarii...................................................................................................................1 Noiuni folosite n teoria bazelor de date................................................................................1 Funcionarea unei baze de date ..............................................................................................2 Realizarea unei baze de date...................................................................................................3 CURS 2. Construirea de diagrame entitate-relaie......................................................................6 CURS 3. Proiectarea modelului relaional................................................................................15 3.1 Structura relaional a datelor.......................................................................................15 CURS 4. Operatorii modelului relaional..................................................................................19 3.2 Operatorii modelului relaional......................................................................................19 CURS 5. Restricii de integritate ale modelului relaional.......................................................33 3.3 Restricii de integritate ale modelului relaional.............................................................33 CURS 6. Prelucrarea/evaluarea i optimizarea cerinelor........................................................39 CURS 7. Tehnica normalizrii relaiilor...................................................................................44 7.1 Prima form normal (FN1)............................................................................................45 7.2. A doua form normal (FN2).........................................................................................48 CURS 8. A treia form normal................................................................................................50 7.3. A treia form normal (FN3).........................................................................................50 CAPITOLUL II. SQL (9 sapt.).....................................................................................................52 CURS 9. Limbajul SQL.............................................................................................................52 CURS 10. Limbaje relaionale de definire a datelor (LDD).....................................................57 CURS 11. Limbaje relaionale de manipulare a datelor (LMD) - Interogarea datelor............64 CURS 12. Limbaje relaionale de manipulare a datelor (LMD) - Interogarea datelor din mai multe relaii................................................................................................................................68 CURS 13. Limbaje relaionale de manipulare a datelor (LMD) - Interogarea datelor din mai multe relaii (continuare)...........................................................................................................74 Curs 14. Funcii utilizate n interogri .....................................................................................81 SINTEZ I EXERCIII.............................................................................................................86 DEPARTMENTS..........................................................................................................................98 EMPLOYEES................................................................................................................................98 LOCATIONS.................................................................................................................................98 JOBS..............................................................................................................................................98 COUNTRIES.................................................................................................................................98 JOB_HISTORY.............................................................................................................................98 JOB_GRADES..............................................................................................................................98 REGIONS......................................................................................................................................98

102

Bibliografie
1. Baze de date-Organizare, proiectare i implementare- Ion Lungu, Constanta Bodea, Georgeta Bdescu, Crsitian Ioni, Ed. ALL Educational, Bucureti, 1995. 2. Proiectarea bazelor de date. Normalizare i postonormalizare. Implementri SQL i Oracle- Marin Fotache, Ed. Polirom. 3. Baze de date relaionale - proiectare i implementare- Ileana Popescu, Editura Universitii din Bucureti, 1996. 4. Transact SQL- tefan Ardeleanu, Ed. Niculescu. 5. SQL. Dialecte DB2, Oracle i Visual FoxPro- Marin Fotache, Polirom, 2001. 6. Oracle 9i2. Ghidul dezvoltrii aplicaiilor profesionale- Marin Fotache, Ctlin Strmbei, Liviu Creu, Polirom, 2003.

103

S-ar putea să vă placă și