Documente Academic
Documente Profesional
Documente Cultură
)
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.
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.
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.
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.
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
(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
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
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
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
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)
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
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
14
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
R1 R2
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:
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
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
LOCALIT:
TARIFE:
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
cnpnumeleadresanr_telefonemail1701205230032Pop AnaStr. Viilor, nr.55/4, n Oradea, Bihorpa@yahoo.it p 2660805270023Sas IoanStr. Victoriei, nr.22/12, Baia Mare, Maramures0362/409209M
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
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
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
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 :
cnp
cnp
=
DATE_PERSOANA:
FACTURI:
cnp#numeleadresanr_ telefon1551212245038Pop RaduStr. Al. Cuza, nr.4/34, t Ploiesti07443045052560405570053Chis AlinaStr. Luminii, 76, P Buzau0721435622 B
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:
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
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
ORASE:
MUNICIPII:
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)
32
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:
CJ
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:
01 01 01 01
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
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
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.
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.
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.
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.
Chiar dac au fost eliminate o parte din redundane, mai rmn i alte redundane ce se vor elimina aplicnd alte forme normale.
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.
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
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
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
ON
nume_tabela
FROM
Exemplu: S se retrag drepturile utilizatorului Zita de actualizare a datelor. REVOKE UPDATE ON DESCRIERE_IMOBIL FROM Zita;
63
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
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
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
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.
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
is manager of
has job
Located in (2)
Located in (3)
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).
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