Documente Academic
Documente Profesional
Documente Cultură
Facultatea de Economie
BAZE DE DATE
Suport de curs
STUDIUL BD I AL SGBD
Organizarea datelor n fiiere, dei este destul de utilizat, are o serie de neajunsuri care
limiteaz eficiena i eficacitatea aplicaiilor utilizator. Dintre acestea amintim redundana
ridicat a datelor, lipsa integrrii datelor, dependena datelor fa de programele de aplicaii,
costul ridicat de ntreinere etc.
Redundana ridicat a datelor. Fiiere de date independente conin o mulime de date
care se repet. Aceleai date (exemplu: nume furnizor, adresa furnizor, cont la banca, etc.) sunt
nregistrate i stocate n mai multe fiiere ceea ce reclam programe distincte pentru actualizarea
fiecrui fiier. n plus duplicarea datelor conduce la un consum mare de memorie i incoeren la
trecerea datelor stocate dintr-un fiier n altul.
Sintetic efectele imediate ale acestui neajuns sunt:
1. gestionarea complex a datelor;
2. actualizarea greoaie a datelor;
3. monopolizarea inutil a spaiului de memorie.
Neintegrarea datelor. Dispersia datelor n diverse fiiere independente complic accesul
utilizatorilor la informaiile cerute ad-hoc, necesitnd crearea de programe particulare pentru
extragerea datelor solicitate. n lipsa acestor programe, pentru obinerea informaiilor dorite
utilizatorul procedeaz la extragerea manual.
Dependena datelor de programe. Organizarea fiierelor, adresarea fizic n memorie i
programele de aplicaii folosite pentru accesarea fiierelor sunt interdependente. Astfel,
schimbrile legate de dispunerea pe suportul de memorie, structura datelor i modificarea
nregistrrilor unui fiier presupun modificri n toate programele n care este referit fiierul
respectiv. ntreinerea acestor programe este dificil putnd genera incoerene n fiierele de date.
Incoerena i lipsa de integritate sunt extrem de dificil de corectat deoarece nu exist un
dicionar central pentru urmrirea definirii datelor.
Costul de ntreinere. Exploatarea fiierelor independente presupune un cost ridicat att n
ceea ce privete resursele informatice (hardware i software) ct i cele legate de personalul
utilizat.
Toate aceste probleme care apar n sistemul ce prelucreaz fiiere i gsesc rezolvarea prin
folosirea bazelor de date i a sistemelor de gestiune a bazelor de date. Datele stocate n baze de
date sunt independente att fa de programele de aplicaii care le folosesc, ct i fa de tipul de
memorie utilizat.
Sintetiznd cele de mai sus rezult c principalele beneficii ale bazelor de date constau
1
n :
1. integrarea n aceeai structur a tuturor datelor pertinente ale unui sistem;
2. gestionarea acestor date printr-un soft specializat (SGBD);
3. oferirea unei vederi pariale asupra ansamblului de date, necesar fiecrui
utilizator;
4. asigurarea partajrii datelor ntre diferii utilizatori.
Baza de date reprezint un ansamblu integrat de nregistrri sau de fiiere reunite i
structurate n mod logic. n felul acesta datele stocate anterior n fiiere independente /distincte
sunt concentrate ntr-un fond comun de nregistrri cu posibilitatea utilizrii lor n numeroase
aplicaii.
Conceptul de baz de date a aprut n 1964 n cadrul primului raport CODASYL prezentat
la lucrrile unei Conferine pe probleme de limbaje de gestiune a datelor Development and
Management of Computer centered data-base. La aceast conferin a fost lansat ideea
organizrii datelor prin intermediul unui fiier de descriere global numit dicionar de date care
are menirea de a asigura independena programelor fa de date i a datelor fa de programe2.
Accesul utilizatorului la informaiile despre structura unei anumite baze de date se realizeaz
prin intermediul unui software de aplicaii care ofer un ajutor apreciabil gestiunii datelor, n
general, i bazelor comune de date, n special, numit dicionar de date.
Prin intermediul dicionarului de date, dup caz, sistemul stocheaz informaii referitoare la:
1. relaiile bazei de date (denumire, descriere etc.);
2. atributele relaiei (denumire, domenii, tip, chei primare i secundare);
3. utilizatorii care au drepturi de acces la o anumit relaie;
4. optimizarea bazei de date (prin fiiere index, tehnica clustering etc.).
n principal, un dicionar ndeplinete urmtoarele funcii:
1. definirea i gestionarea datelor elementare ale ntreprinderii (cod, denumire,
atribute, reprezentare etc.);
2. definirea i gestionarea ansamblurilor de date;
3. definirea i gestionarea relaiilor, de dependen sau ierarhice, dintre date;
4. descrierea utilizrii datelor din trei puncte de vedere:
1. administrativ: care sunt posturile de lucru ce vor apela datele i care va fi
utilizarea acestor date?
2. logic: care sunt fiierele sau bazele de date n care intr elementele descrise ?;
3. organic: n care uniti de prelucrare vor fi utilizate elementele descrise?
1
2
Saleh, I., Les bases de donnes relationnelles, Edition Hermes, Paris, 1995, p. 303
Lungu, I. .a., Baze de date Organizare, proiectare i implementare, Editura All, Bucureti, 1995, p.13
Entitate
PRODUS
Realizri (valori)
Caracteristici (atribute)
Cod produs
Denumire produs
Unitate de masura
Pret unitar
Cantitate
Valoare
Nr. Factur
Data receptie
11112
Pantofi
Per
350000
100
35000000
2452
1-12-1999
11116
Ghete
Per
550000
100
55000000
2147
18-12-1999
Aceste elemente sunt numite diferit n literatura de specialitate - vezi Roca, I., .a., Baze de date i SGBD,
Bucureti, 1986; Lungu, I., .a., Baze de date Organizare, proiectare i implementare, Editura All, Bucureti,
1995; Fotache, M., Baze de date relaionale, Editura Junimea, Iai, 1997
4
Morjon, J., Principes et conception dun base de donnes relationnelle, Les Editions dorganisation, Paris, 1992,
p. 20
1.
2.
3.
4.
5.
n cazul depozitelor de date, prelucrrile /exploatrile (data mining) sunt bazate pe modele
performante de selectare i agregare a datelor coninute.
Practica ofer trei soluii de organizare a depozitelor de date5:
5. la nivelul entitii social-economice (data warehouse);
6. la nivelul unei structuri funcionale: filial, departament, serviciu, birou (data
marts);
7. la nivelul evenimentelor elementare (tranzacionale).
n implementarea unui depozit de date pot fi folosite mai multe variante:
8. implementarea unui sistem descentralizat n care datele sunt pstrate n uniti
independente (data marts); aceste uniti conin date relevante pentru un anumit
aspect al operaiunilor derulate n entitatea social-economic;
9. implementarea unei surse de date unice la care au acces utilizatorii din toate
structurile funcionale;
10. implementarea unei surse de date centralizate la nivelul entitii social-economice
cu existena unor uniti dependente (dependent data marts) care prezint subseturi
ale datelor (din depozitul central de date) ce au fost selectate i organizate pe
domenii de aplicaii.
Baze de date
operaionale
Achiziie /Extragere
STOCARE
5
n depozitul de date
tergere
Prelucrare
Arhivare
(data mining)
Agregare
Utilizarea depozitelor se concretizeaz n obinerea unor rapoarte (la cerere sau pe baza
unui abonament cu o anumit periodicitate), extragerea unor date pentru a fi utilizate n aplicaii
de birotic (programe de calcul tabelar, procesare de texte etc.), dar mai ales pentru realizarea
unor aplicaii specializate de analiz a datelor.
Principalul inconvenient al depozitului de date este dimensiunea sa enorm, de ordinul
giga sau teraocteilor, datorat nmagazinrii datelor detaliate la cel mai analitic nivel.
Segmentul de pia legat de depozitele de date are o rat anual de cretere de circa 35%.
Pentru a putea fi exploatat de ctre utilizatori, o baz de date trebuie s aib asociat un set
de programe care s permit exploatarea raional a datelor coninute. Este vorba despre sistemul
de gestiune a bazelor de date, denumit generic SGBD.
SGBD-ul este definit ca un ansamblu coordonat de programe care permite descrierea,
memorarea, manipularea, interogarea i tratarea datelor coninute ntr-o baz de date. El trebuie,
de asemenea, s asigure securitatea i confidenialitatea datelor ntr-un mediu multi-utilizator6.
Pentru a-i ndeplini aceste funcii SGBD-ul interacioneaz cu structura bazei de date,
sistemul de calcul, sistemul de operare, programele de aplicaii i utilizatorii constituindu-se
banca de date. Se pot organiza bnci de date n toate sferele de activitate: baze de date
bibliografice, de documentare statistic, evidene finanfiar-contabile i bancare, diagnosticare i
informare medical, rezervarea tichetelor de cltorie i a locurilor n staiunile turistice etc.
X1
X2
Yn
Xn
Domeniu
Codomeniu
n relaiile 1-n (una-la-mai-multe) unei realizri din domeniu i corespund 0, una sau mai
multe realizri din codomeniu (figura nr. 4.5).
Y1
Y2
.Y3.
Y4
Y5
X1
X2
Domeniu
Codomeniu
n relaiile n-1 (mai-multe-la-una) mai multe nregistrri din domeniu corespund unei
realizri din codomeniu. (figura nr. 4.6).
X1
X2
X3
Domeniu
Codomeniu
Fig. nr. 4.6 Relaia n-1
Y1
Y2
.Y3.
Y4
X2
Domeniu
Codomeniu
Relaiile n-are presupun existena unei interdependene logice ntre realizrile mai multor
entiti.
Mecanismul de selecie i de identificare a componentelor unei baze de date presupune
existena unei structuri de date. Concret o structur de date reprezint o colecie de date ntre
care s-au stabilit anumite relaii. Structurile de date care au aceeai organizare i sunt supuse
prelucrrilor cu un grup de operatori de baz cu o semantic predefinit formeaz un anumit tip
de structur.
Schema
conceptual
Vederi
externe
Schema logic
Baza de
date
Apl. 2
Apl. n
Vederi logice ale utilizatorului
Sub-scheme
Model 1
Model 2
Model de ansamblu
SGBD
Schema
Interfaa logic
Fig. nr. 4.9 Legturile dintre vederile logice, fizice i interfaa sistem
Modelul ierarhic
Modelul ierarhic este primul model utilizat pentru organizarea datelor n baze de date. El
se bazeaz pe structura arborescent i pe relaiile 1-1 i 1-n, prezentndu-se sub forma unui
arbore, n care se regsesc pe un prim nivel rdcina (nod-printe), iar pe nivelurile urmtoare
diferite elemente subordonate (noduri-copil).
Nodul-printe poate avea subordonate mai multe noduri-copil n timp ce un nod-copil nu
poate avea dect un singur printe. Rezult c relaia printe-copil poate fi de tip 1-n, iar relaia
copil printe poate fi doar de tip 1-1. Acest model asigur organizarea datelor pe orice tip de
suport magnetic i reducerea timpului de acces la nregistrri.
Modelul ierarhic are o serie de limite, n special n operaiile de actualizare cnd adugarea
de noi nregistrri - cu excepia celor din colecia de date rdcin - se poate efectua numai cu
specificarea coleciilor de date superioare, iar tergerea unei nregistrri duce la eliminarea fizic
a tuturor nregistrrilor subordonate. n figura nr. 4.10 este prezentat modelul ierarhic.
Departament
CONTABILITATE
Gestiune
MATERIALE
PL 1
PL 2
Gestiune
MARFURI
PL 3
PL 4
SALARII
PL 5
PL 6
Departament
CONTABILITATE
PL 1
Departament
INFORMATIC
PL 2
Gestiune
MATERIALE
PL 3
Gestiune
MARFURI
Dup cum se observ din figura nr. 4.11 modelul admite relaii de tip n-m, ceea ce are ca
efect reducerea redundanei datelor. Modelele ierarhic i reea nu permit realizarea unei
independene logice satisfctoare ntre date i programe, deoarece relaiile dintre date exist i
sunt referite n programele de aplicaii.
Modelul relaional
Modelul relaional a fost fundamentat n 1970, de E.F. Codd i se bazeaz pe teoria
matematic a relaiilor i pe calculul relaional. Ideea unui model ansamblist a datelor a fost
lansat nc din 1968 de ctre Childs D.F. care arta c orice structur de date poate fi
reprezentat sub form de tabele (una sau mai multe) n interiorul crora trebuie s existe i
informaie de legtur8. Acest model va fi dezvoltat n capitolul 5.
Modelul Entitate-Asociaie (E-A)
Acest model a fost introdus n 1976 de ctre cercettorul american Chen care a avut ca
obiectiv crearea unui model care s permit o viziune unificat, global asupra datelor 9. Este
un model semantic de date, simplu i atractiv datorit reprezentrii sale grafice, fiind utilizat n
mai multe metode de analiz i proiectare (MERISE, AXIAL etc.) i dispunnd de mai multe
extensii. Modelul opereaz cu urmtoarele concepte de baz: atribut, entitate /proprietate,
entitate-tip, asociaie.
Atributul reprezint o informaie elementar definit pe un domeniu.
Entitatea este considerat un obiect concret sau abstract din lumea observat avnd o
existen proprie, care poate fi identificat i descris printr-un ansamblu de atribute, independent
de alte obiecte.
8
9
Identificarea unic a unei clase de entiti se realizeaz cu ajutorul unuia sau a mai multor
atribute permindu-se distingerea ntr-o manier unic a fiecreia dintre realizrile clasei. n
exemplul de mai sus identificarea unic a fiecrui angajat poate fi realizat prin Numr marc
sau prin Nume.
Asociaia (relaia) reprezint o legtur semantic definit ntre dou sau mai multe
entiti. Asociaiile de acelai tip formeaz o clas de asociaii. O asociaie se caracterizeaz prin
dimensiune i cardinalitate.
Dimensiunea unei asociaii reprezint numrul de clase de entiti implicate ntr-o clas de
asociaii. Clasele de asociaii pot fi:
1.
unare - relaiile se stabilesc ntre entitile aceleiai clase;
2.
binare - relaiile se stabilesc ntre entitile aflate n dou clase diferite;
3.
n-are - relaiile se stabilesc ntre n clase de entiti.
Cardinalitatea reprezint un cuplu de valori (M:N) desemnnd numrul (minim i maxim)
de entiti din fiecare clas ce pot fi implicate ntr-o asociaie. Cuplul de valori (M:N) specific
pe de o parte dac asociaia este parial (M=0) sau total (M=1) i, pe de alt parte, dac relaia
10
Saleh, J., Les bases de donnees relationnelles, Edition Hermes, Paris, 1995, p. 22
reprezint o funcie monovaloare (N=1) sau multivaloare (N>1). Pot exista 4 tipuri de
cardinaliti (tabelul nr. 3.2).
Tabelul nr. 3.2 Tipuri de cardinaliti
Cardinalitate minimal
Cardinalitate maximal
0
1
0
1
1
1
N
N
Utilizarea acestui model este n mare parte intuitiv. El nu este un model teoretic de
reprezentare, ci mai curnd o interfa prietenoas de schiare a structurii datelor. Adesea este
utilizat pentru ilustrarea grafic a modelului relaional.
Absena limbajului de manipulare a datelor bine formalizat i adaptat a antrenat numeroase
propuneri, preferina mergnd spre limbajele relaionale. Raiunea principal este relativa
uurin de transformare a modelului E-A n model relaional. Practic se construiete o schem
E-A care se transform n schem relaional. n felul acesta se combin simplitatea de descriere
a primului model cu puterea limbajului celui de al doilea model.
n cadrul modelului E-A, descrierea textual a entitilor i a relaiilor lor este uneori
greoaie. n practic se apeleaz la o reprezentare mai comod sub forma unor scheme de sintez
ce faciliteaz comunicarea, cunoscute sub denumirea de formalisme. Principalele formalisme
sunt Merise, Chen, Ross, Case*Methode, Perkinson etc. Prezentm n continuare doar
formalismele Merise i Chen.
Formalismul Merise
Aa cum rezult din figura nr. 4.12 simbolurile grafice pentru formalismul Merise sunt:
1. dreptunghiul pentru reprezentarea claselor de entiti. n interior se specific un
nume (pentru identificarea entitilor), sub care sunt enumerate atributele;
2. elipsa pentru reprezentarea claselor de asociaii. n interiorul elipsei se nscrie
numele clasei, sub care pot aprea eventualele atribute;
3. liniile pentru unirea simbolurilor precedente; pe aceste linii se nscriu cifre care
exprim cardinalitile claselor de asociaii.
PRODUS
1,N
0,N
Cod produs
Denumire produs
Pre unitar
STOC
COMANDA
Data comanda
1,N
1,N
DEPOZIT
Cod depozit
Denumire depozit
Adresa depozit
CLIENT
Cod client
Nume client
Localitate
Matricol
Titlu
Nume
STUDENT
NSCRIERE
STUDENT
Departament
Adres
Secie
An studiu
NSCRIERE
PROFESOR
Nume profesor
Catedra
. Modelul obiectual
Apariia acestui model este efectul orientrii spre multimedia i spre aplicaii de proiectare
asistate de calculator care solicit prelucrarea tipurilor neconvenionale de date.
La baza modelului orientat pe obiecte st noiunea de entitate conceptual definit ca un
obiect descris printr-o colecie de proprieti. Principalele concepte care stau la baza unui model
orientat pe obiecte sunt: obiectul, ncapsularea, persistena, clasa, tipul, motenirea,
polimorfismul, identitatea, domeniul.
Un obiect poate fi definit ca o abstractizare a unei entiti particulare sau ca un ansamblu
de date, mpreun cu procedurile de prelucrare a acestora. Privite din acest punct de vedere
procedurile poart denumirea de metode, iar datele obiectului se numesc proprieti.
Un obiect este caracterizat prin atribute i comportament. Atributele reprezint starea sa i
legturile care-l unesc cu alte obiecte, iar comportamentul se constituie din metodele i operaiile
care pot fi aplicate atributelor.
Avnd n vedere cele de mai sus, putem concluziona c un obiect corespunde unei entiti
care are un nume, stocheaz o stare (atribute) i rspunde unui ansamblu definit de mesaje.
Pot fi identificate trei tipuri de obiecte:
1. elementare: 20 (ntreg), an I (ir de caractere), N (boolean);
2. compuse: nume, secie, adres;
3. complexe: student.
Un obiect este format din structura de date, specificarea operaiilor i implementarea
operaiilor.
Interfaa obiectului cu mediul o reprezint mesajele care, de fapt sunt cereri adresate
obiectului pentru a returna o valoare, sau pentru a-i schimba starea. Mesajele sunt implementate
prin intermediul metodelor, care generic reprezint programe de manipulare a obiectelor sau de
indicare a strii acesteia.
ncapsularea reprezint o caracteristic ce ofer utilizatorului o imagine funcional
simplificat a obiectului, ascunznd complexitatea acestuia. Practic are loc divizarea obiectului
n dou pri: interfaa reprezentat de mesajele adresate obiectului i coninutul obiectului
reprezentat de starea intern i de metodele acestuia. Interfaa permite unui utilizator din exterior
s solicite obiectului realizarea unei aciuni prin emiterea unui mesaj specific metodei asociate
aciunii respective. Structura unei date obiect poate fi prezentat ca n fig. nr. 4.14.
ncapsularea urmrete ca datele unui obiect s poat fi modificate doar prin intermediul
metodelor proprii obiectului respectiv. n acest fel se realizeaz un control strict asupra
obiectului, eliminndu-se eventualele surse de erori provenite din nefolosirea necorespunztoare
a proprietilor11.
CONINUT
INTERFAA
Date i metode
Operaii posibile
Fig. nr.4.14 Structura unei date obiect
Persistena este proprietatea prin care datele i obiectele, ca existen i stare, depesc
procesul care le-a creat, putnd fi refolosite ulterior n alte procese.
Tipurile i clasele de obiecte sunt concepte care reunesc obiectele cu acelai fel de
atribute i comportament. Din aceast perspectiv practica prezint dou categorii de sisteme
orientate pe obiecte:
1. sisteme bazate pe conceptul de tip (C++, Simula, vBase);
2. sisteme bazate pe conceptul de clas (Smalltalk, Gemstone, Vision, Orion, GBase).
Tipul sintetizeaz elementele comune ale obiectelor care au aceleai caracteristici i
dispune de dou componente: interfaa i implementarea. Interfaa se constituie dintr-o list de
operaii, iar implementarea asigur descrierea structurii interne a datelor, obiectului i realizarea
procedurilor relative la operaiile interfeei.
Clasa are aceeai semnificaie cu cea de tip, fiind asociat mai mult fazei de execuie,
presupunnd generarea de obiecte i stocarea setului de obiecte. Rezult c o clas descrie o
colecie de obiecte ce au aceleai atribute i acelai comportament. Pentru a comunica ntre ele i
11
Dima, G., Dima, M., Bazele Visual FoxPro 5.0, Editura Teora, Bucureti, 1999, p. 182
pentru a accede la informaiile unei alte entiti, obiectele i trimit mesaje. Acestea reprezint
numele metodelor i argumentele lor. Realizarea aciunii asociate unui mesaj depinde de obiectul
receptor care i administreaz propriile atribute folosind metode proprii12.
Descrierea unei clase const dintr-un set de structuri de date comune (variabile de instan,
care au propria identitate, identificatorii lor nefiind accesibili utilizatorilor), un protocol comun
(set de mesaje la care vor rspunde instanele clasei) i un set de metode pentru implementarea
operaiilor comune. n felul acesta descrierea clasei servete ca ablon pentru crearea noilor
obiecte. Ca urmare, obiectele din aceeai clas rspund la acelai mesaj, au aceleai atribute i
folosesc aceleai metode.
O problem aparte este legat de accesul utilizatorului la membrii unei clase printr-un
mecanism de control care s asigure protecia membrilor. Din acest punct de vedere membrii
unei clase pot fi:
1.
publici accesibili att din interiorul ct i din exteriorul clasei respective (dar din
domeniul n care clasa a fost definit);
2.
protejai accesibili din interiorul clasei respective i a subclaselor construite pe
baza acesteia (prin motenire);
3.
ascuni accesibili doar din interiorul clasei respective.
Clasele sunt organizate ierarhic, fiecare nou clas fiind subordonat unei clase existente.
Orice subclas motenete structurile i metodele superclasei din care face parte.
Motenirea reprezint mecanismul de definire a unei clase prin preluarea variabilelor de
instan i a metodelor din una sau mai multe clase existente deja. n primul caz este vorba de o
motenire simpl, iar n cel de-al doilea de o motenire multipl. Clasa de la care sunt motenite
(preluate) instanele (structurile de date) i metodele reprezint o supraclas. Clasa ce se creeaz
motenete toate datele i metodele supraclasei, la care se vor aduga unele noi, definite pentru
noua clas. Astfel, pe baza principiului motenirii pot fi create ierarhii de clase, ncepnd cu cele
mai generale i ajungnd la cele particulare, specializate n rezolvarea unei anumite sarcini de
prelucrare.
Polimorfismul are n vedere comportamentul obiectelor care, la primirea unui mesaj,
determin alegerea dinamic a metodei de aplicat, n funcie de clasa corespunztoare. Dei
noiunea exist de mai mult timp (polimorfism ad-hoc, polimorfism parametric) ea a fost
popularizat n special prin limbajele obiect. Polimorfismul asigur manipularea simpl i
coerent a seturilor eterogene de obiecte.
Utilizarea polimorfismului n cazul motenirii multiple permite definirea unor forme
complexe de comportament asigurnd combinarea metodelor proprii mai multor clase de obiecte.
12
Gaudel, M-C., .a., Prcis de gnie logiciel, Edition Masson, Paris, Milan, Barcelon, 1996, p. 35
13
14
Lungu, I. .a., Baze de date Organizare, proiectare i implementare, Editura ALL, Bucureti, 1995, p. 96
Morjon, J., Principes et conception dune base de donnes relationnelle, Les Editions dorganisation, Paris, 1992,
p. 32
15
atribut
Obiecte-inventar
311
291
321
312
357
345
314
291
391
Etajere
Scaune
Cuiere
Dulapuri
Salopete
Manusi
Ochelari
Birouri
buc
buc
buc
buc
buc
buc
buc
buc
PU
Cantitate
235000
95000
47000
450000
85000
18000
15000
150000
12
10
5
4
14
12
10
3
schema
relatiei
tuplu
n-tupluri
domeniu
valoarea
din domeniu
18
2. compoziia minimal atunci cnd cheia primar este compus, nici un atribut din
cheie nu poate fi eliminat fr distrugerea unicitii tuplului n cadrul relaiei (n
cazuri limit o cheie poate fi alctuit din toate atributele relaiei);
3. valorile non-nule valorile atributului sau ale ansamblului de atribute ce
desemneaz cheia primar sunt ntotdeauna specificate, deci ne-nule; nici un atribut
din compoziia cheii primare nu poate avea valori nule.
Dac ntr-o relaie exist mai multe combinaii de atribute care confer unicitate tuplului,
acestea sunt denumite chei candidate. Atunci cnd o cheie candidat nu este cheie primar este
considerat cheie alternativ (secundar).
Legtura ntre tuplurile din relaii diferite se realizeaz prin atribute sau combinaii de
atribute numite chei strine (externe). Cheile strine (coloanele de referin) sunt, aadar,
atribute sau combinaii de atribute care pun n legtur linii (tupluri) din relaii diferite.
n figura nr. 5.2 sunt prezentate cteva tabele i cheile asociate acestora pentru stabilirea
relaiilor dintre ele i pentru identificarea tuplurilor din coninutul lor.
FURNIZORI
COD-FURN NUME-FURNIZOR LOCALITATE CONT-BANCA
FACTURI
NR-FACTURA DATA-FACTURA COD-FURN
CONT-BANCA VALOARE
NOMEN-OBINV
COD-OBINV
DEN-OBINV UM
OBINV-RECEPT
NR-FACTURA
COD-OBINV
CANT
PRET-UNIT
n relaia FURNIZORI:
1. COD-FURN cheie primar
2. NUME-FURNIZOR cheie alternativ
n relaia FACTURI:
3. NR-FACTURA cheie primar
4. COD-FURN cheie strin ctre relaia FURNIZORI
n relaia NOMEN-OBINV:
19
20
atributul cheie21. Respectnd aceast regul ntr-o relaie R1, care refer o relaie R2, valorile
cheii externe trebuie s figureze printre valorile cheii primare din relaia R2, sau s fie valori
nedefinite null.
Considerm pentru exemplificare urmtoarele trei relaii: STUDENT, SIT.SC i
EXAMEN. Restriciile refereniale sunt ilustrate n figura 5.3.
n relaia STUDENT NR_MATRICOL este cheie; iar cheia relaiei SIT.SC este format
din ansamblul atributelor NRMATRICOL, CODEXAMEN I DATAEX. Orice valoare pentru
NRMATRICOL din relaia SIT.SC trebuie s existe n NRMATRICOL din STUDENT (idem
pentru CODEXAMEN).
STUDENT NR. MATRICOL NUME STUDENT DATA NAST SECTIE
SIT. SC
EXAMEN
COD EXAMEN
DATA EX NOTA
DISCIPLINA
Atributul NRMATRICOL (CODEX) n relaia STUDENT este numit cheie primar, iar n
relaia EXAMEN este numit cheie strin. Relaia SIT.SC poate fi numit i refereniat sau
desemnat, n timp ce relaiile STUDENT i EXAMEN pot fi numite refereniale sau
desemnante.
Restricia de entitate. Valorile oricrui atribut care face parte dintr-o cheie primar
trebuie s fie nenule. Unicitatea cheii impune ca la ncrcarea unui tuplu, valoarea cheii s fie
cunoscut. n felul acesta se elimin duplicarea tuplurilor. Restricia de integritate a entitii nu
se aplic cheilor externe dintr-o relaie, dac acestea nu aparin cheii primare.
Plecnd de la restricia de entitate, rezult c restricia de referin poate fi: forte i slab. O
restricie de referin este forte dac atributul cheii strine nu poate lua o valoare nul. O
restricie de referin este slab dac atributul cheii strine poate lua o valoare nul.
Pe lng restriciile minimale, modelul relaional poate oferi i restricii referitoare la
dependena datelor i de comportament.
Restriciile referitoare la dependena datelor privesc datele ce depind unele de altele i
pot fi: funcionale, multivaloare i de jonciune.
21
Dependenele funcionale permit identificarea unui atribut sau grup de atribute prin
intermediul altui atribut sau grup de atribute.
Dependenele multivaloare se stabilesc ntre datele n care un atribut sau grup de atribute
poate prezenta mai multe valori pentru o singur valoare a unui alt atribut sau grup de atribute.
Dependenele de jonciune apar atunci cnd nu se pot manifesta dependene funcionale
sau multivaloare, exprimnd o relaie mai general.
Restriciile de comportament, la rndul lor pot fi, cel mai adesea, de domeniu i
temporale. Cele de domeniu impun ca valorile unui atribut s se ncadreze ntre anumite limite.
Cele temporale impun ca valorile rezultate n urma actualizrii s fie altele dect cele anterioare
actualizrii.
Avnd n vedere aspectele teoretice de mai sus prezentm n continuare cele 1 3 r e g u l i
(numerotate de la 0 la 12) prin care E.F. Codd definete i caracterizeaz modelul relaional22:
R0 regula de fundamentare (regula de baz): un sistem relaional de administrare a
bazelor de date trebuie s poat administra bazele de date n ntregime prin funciile sale
relaionale; aceasta nseamn c un SGBD relaional nu trebuie s mixeze caracteristicile
relaionale cu cele nerelaionale, el cuprinznd o parte de definire a datelor (DDL), o parte de
manipulare a datelor (DML) i o parte de integritate i control a datelor (DCL); totui, n practic
se constat c nici o implementare curent de SGBD nu respect aceast regul, deoarece conin
att caracteristici relaionale ct i nerelaionale;
R1 regula reprezentrii informaiei (The Information Rule): toate informaiile dintr-o
baz de date relaionale sunt reprezentate la nivel logic, explicit ca valori n tabele; datele sunt
stocate sub forma unor structuri tabelare, numite relaii, formate din rnduri (tupluri) i coloane
(atribute) ; o astfel de structur ofer o serie de avantaje precum: claritate, generalitate
(majoritatea tipurilor de date pot fi reprezentate sub aceast form), flexibilitate (structura poate
fi modificat att pe rnduri ct i pe coloane); folosind o astfel de structur, asupra datelor pot fi
aplicate operaii din teoria mulimilor ca: selecia, proiecia, produsul cartezian, reuniunea,
intersecia etc.; Codd apreciaz c un SGBD care nu respect aceast regul nu poate fi
considerat relaional;
R2 regula accesului garantat la date (Guaranteed Access): ntr-o baz de date relaional
orice valoare are accesul garantat dac se folosete o combinaie ntre numele tabelului (relaiei),
valoarea cheii primare i numele atributului; fiecare relaie trebuie s conin o cheie primar,
adic un atribut sau o combinaie de atribute, care s identifice n mod unic un tuplu (este de
remarcat, totui, faptul c n majoritatea implementrilor de SQL este permis duplicarea);
22
Perkins, J., Morgan, B., SQL fr profesor, n 14 zile, Editura Teora, Bucureti, 1997, p. 23
23
24
msura n care acesta este relaional, deci, numrul regulilor respectate. De exemplu produsul
DB2 respect doar apte reguli din cele 13 prezentate mai sus.
Filip, M., Grama, A., Medii de programare. Abordri teoretice, Editura Fides, Iai, 1998, p.204
Codd, E.F., Further normalization of the database relational model, DataBase Systems, Courant Computer
Science Symposia Series, Vol.6, Englewood Cliffs, N.J.,Prentice-Hall, 1972
26
Cod
Furnizor
1003
1001
1004
1003
1008
1008
1006
1003
Nume
Furnizor
Adresa
OCCO SRL
TEXTILA SA
FILATURA SA
OCCO SRL
ALFA SRL
ALFA SRL
EPSILON SRL
OCCO SRL
Pcurari, 155
B-dul Copou, 87
B-dul Unirii, 105
Pcurari, 155
Prosperitii, 15
Prosperitii, 15
Corupiei, nr.12
Pcurari, 155
Cod
Potal
Localitate
6600
6600
5300
6600
5725
5725
6750
6600
Iai
Iai
Focani
Iai
Pacani
Pacani
Iai
Iai
Jude
Data
Valoare
Iai
Iai
Vrancea
Iai
Iai
Iai
Iai
Iai
17.06.99
17.06.99
18.06.99
18.06.99
18.06.99
19.06.99
20.06.99
24.06.99
17000000
2850000
5850000
28500000
35700000
8700000
11000000
3000000
Fig. nr.
5.13. Structura tabelei FP n 1FN
Prin urmare, n unele cazuri, declararea unui atribut ca fiind atomic sau nu ine de intenia
celui care proiecteaz BD sau de flexibilitatea SGBD-ului. Spre exemplu, "pe vremuri",
atributele de tip dat calendaristic erau supuse unei nemiloase descompuneri n trei atribute
vdit atomice, Zi, Lun, An. Astzi, ns, orice SGBD "lucreaz" cu atribute, variabile i
constante de tip dat calendaristic, astfel nct suntem scutii de atomizarea de mai sus.
Ali autori adaug la definiia anterioar, legat de atributele atomice, i restricia: toate
atributele ce compun relaia s fie n dependen funcional fa de cheia relaiei, dei este,
oarecum, o tautologie, ntruct una din "poruncile" ce trebuie ndeplinite de orice tabel care vrea
s fie relaional este cea cunoscut sub numele restricia de entitate, potrivit creia ntr-o relaie
nu pot exista dou tupluri identice sau, altfel spus, ntr-o relaie trebuie s existe un atribut sau
combinaie de atribute ale cror valori s deosebeasc orice tuplu de toate celelalte sau orice
relaie posed o cheie primar.
n figura nr. 5.14, tabela LINII_ARTICOLE_CONTABILE2, conine, pe primele dou
linii, grupuri repetitive, pentru atributele ContDebitor, respectiv ContCreditor, datorit faptului
c operaiunile (nregistrrile) contabile din nota 150 sunt compuse.
LINII_ARTICOLE_CONTABILE2
NotaContabil
150
150
151
Data
30.11.99
30.11.99
01.12.99
Operaiune
1
2
1
ContDebitor
300, 4426
401
5121
ContCreditor
401
5311, 5121
700
Suma
1 180 000
1 180 000
525 000
Fig. nr.
Data
Operaiune
30.11.99
30.11.99
01.12.99
1
2
1
Cont
Debitor1
300
401
5121
Cont
Debitor2
4426
Cont
Creditor1
401
5311
700
Cont
Creditor2
5121
Suma
1 180 000
1 180 000
525 000
Fig. nr.
Soluia e ct se poate de nefericit. Dei tabela se afl n prima form normalizat, preul
pltit este mult prea mare. Deoarece, n practic, o nregistrare (operaiune) contabil poate avea
10-15 conturi pe debit sau pe credit, modificarea structurii tabelei ar deveni de-a dreptul hilar.
n concluzie, tabela LINII_ARTICOLE_CONTABILE din figura nr. 5.14 este n prima
form normalizat (1FN).
Observaii
1. Atomicitatea atributelor ntr-o baz de date relaional constituie o limit serioas a modelului,
datorit imposibilitii adaptrii BDR la specificul unor domenii ca multimedia, CAD etc.
2. Nu orice tabel este n 1FN, chiar dac toate valorile atributelor sunt atomice. n conformitate cu
restricia de entitate, tuplurile relaiei trebuie s fie distincte. n plus, atributele care alctuiesc
cheia primar nu pot avea valori nule.
Tabela FP, a crei schem este prezentat n figura nr. 5.13, se afl n 1FN, cheia sa
primar fiind desemnat prin perechea (NumrFactur, CodFurnizor).
Implicit, deci, exist dependenele funcionale:
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(NumrFactur, CodFurnizor)
(NumrFactur, CodFurnizor)
(NumrFactur, CodFurnizor)
(NumrFactur, CodFurnizor)
(NumrFactur, CodFurnizor)
(NumrFactur, CodFurnizor)
(NumrFactur, CodFurnizor)
NumeFurnizor
Adresa
CodPotal
Localitate
Jude
Data
Valoare
Structura tabelei FP prezint cteva neajunsuri, legate, n primul rnd, de faptul c nici un
atribut ce face parte din cheia primar nu poate avea valori nule.
Din aceast cauz apar probleme la adugarea unui tuplu n relaia FP. Spre exemplu, la
magazia ntreprinderii au fost recepionate cteva materiale care au sosit cu un Aviz de expediie
trimis de un nou furnizor. Fiind vorba de un furnizor nou, se pune problema de a-l introduce n
baza de date. I se atribuie codul 1010, i se cunoate denumirea i sediul (adresa, localitatea).
Deoarece materialele au sosit numai cu avizul de expediie, pn la primirea facturii ne este
imposibil s introducem datele despre furnizor n tabela FP. De ce oare? Deoarece cheia primar
a relaiei este compus (NumrFactur, CodFurnizor), i nu cunoatem valoarea atributului
NumrFactur, care prezint, deocamdat, valoarea NULL (necunoscut). Astfel, pentru a
introduce date despre un nou furnizor, trebuie s ateptm s soseasc prima factur de la acesta,
chiar dac produsele descrise n factur pot sosi cu zile sau chiar sptmni nainte.
Probleme serioase apar i la modificarea unor linii. Astfel, furnizorul ALFA SRL i mut
sediul de la adresa "Prosperitii, 15", noua adres fiind "Iacobov se ntoarce, nr. 13 bis", n
cadrul aceleai localiti (Pacani).
Un client nu poate avea, la un moment dat, dect o singur adres. Am definit n capitolul
anterior, n cadrul tabelei FP dependena funcional
CodFurnizor Adresa.
Or, dac n tabel ar co-exista i adresa veche a furnizorului, i cea nou, la o aceeai
valoare a atributului CodFurnizor ar exista dou valori distincte ale atributului Adresa.
Ce facem n acest caz ? Fie renunm la DF de mai sus, fie modificm toate vechile valori
ale atributului Adresa, actualizndu-le.
Prima variant prezint marele dezavantaj c altereaz partea de analiz a BDR, i, n unele
cazuri, atrage revizuirea ntregii scheme a BDR, deoarece vizeaz aspectul constant al relaiei,
structura sa.
A doua variant ridic, la rndul su, nite probleme deloc nltoare. Astfel, va trebui s
modificm valoarea atributului Adresa pentru toate facturile primite de la furnizorul respectiv,
ceea ce nu e chiar simplu. i ce-ai zice dac modificarea adresei se produce n luna mai 1997 i
avem, arhivate, facturi primite de la acest furnizor nc din anul 1993 ?
Nici operaiunea de tergere a unei linii din tabela FP nu este scutit de discuii. S
presupunem c trebuie s tergem linia aferent facturii 17320, primit de la furnizorul
EPSILON SRL. Dup cum se observ n figura nr. 5.12, aceasta este singura factur primit n
acest an de la furnizorul EPSILON SRL, iar facturile anului precedent au fost deja arhivate
pentru a descongestiona baza de date. tergerea singurei facturi aferente acestui furnizor atrage,
inevitabil, pierderea oricrei date despre EPSILON SRL. Ulterior tergerii, la o eventual
consultare prin care s-ar dori extragerea tuturor furnizorilor firmei, EPSILON SRL nu ar mai fi
"prezent", dei, de fapt, EPSILON reprezint un furnizor important pentru care, ntmpltor, n
primele dou luni ale anului curent nu exist nici o factur primit.
27
Heath, I. J., Unacceptable File Operations in a Relational Database, Proc.1971 ACM SIGFIDET Workshop on Data
Description, Access and Control, nov. 1971
CodFurnizor
CodFurnizor
CodFurnizor
CodFurnizor
CodFurnizor
NumeFurnizor
Adresa
CodPotal
Localitate
Jude
CodFurnizor
1003
1001
1004
1003
1008
1008
1006
1003
Data
17.06.95
17.06.95
18.06.95
18.06.95
18.06.95
19.06.95
20.06.95
24.06.95
Valoare
1700000
285000
585000
2850000
3570000
870000
1100000
300000
FP2
CodFurnizor
1003
1001
1004
1008
1006
NumeFurnizor
OCCO SRL
TEXTILA SA
FILATURA SA
ALFA SRL
EPSILON SRL
Adresa
Pcurari, 155
B-dul Copou, 87
B-dul Unirii, 10
Prosperitii, 15
Corupiei, nr.14
CodPotal
6600
6600
5300
5725
6750
Localitate
Iai
Iai
Focani
Pacani
Iai
Jude
Iai
Iai
Vrancea
Iai
Iai
Fig. nr.
5.16. Tabelele FP1 i FP2 n 2FN
deoarece singura tabel implicat este FP2 a crei cheie primar este constituit din atributul
CodFurnizor.
Modificarea adresei unui furnizor afecteaz o singur linie din tabela FP2, deci au fost
eliminate multe dintre anomaliile care apreau la actualizarea valorii unor atribute.
De asemenea, tergerea unei facturi primite - care presupune eliminarea unei linii din
tabela FP1 - nu mai prezint riscul eliminrii definitive a datelor generale depre un furnizor,
deoarece acestea se gsesc n tabela FP2.
Problemele care persist sunt legate de tabela FP2, n sensul repetrii valorilor atributelor
Localitate i Jude pentru toi furnizorii ce provin dintr-o aceeai localitate.
n paragraful anterior, pornind de la tabela FP, aflat n 1FN (structura sa este prezentat n
figura nr. 5.13), au fost obinute dou tabele, FP1 i FP2, ambele aflate n 2FN.
S analizm structura tabelei FP2. Dependenele
CodFurnizor Localitate
CodFurnizor Jude
Prin urmare, relaia FP2 nu este n a treia form normalizat. Aplicm algoritmul descris
mai sus:
a) atributul CodPotal nu face parte din cheie i constituie surs ntr-o serie de dependene
funcionale;
b) tabela FP2 se sparge n tabelele FP21 i FP22, ale cror structuri sunt prezentate n
figura nr. 5.17.
FP21
CodFurnizor
1003
1001
1004
1008
1006
NumeFurnizor
OCCO SRL
TEXTILA SA
FILATURA SA
ALFA SRL
EPSILON SRL
Adresa
Pcurari, 155
B-dul Copou, 87
B-dul Unirii, 10
Prosperitii, 15
Corupiei, nr.14
CodPotal
6600
6600
5300
5725
6750
FP22
Cod-Potal
6600
5300
5725
6750
Jude
Iai
Vrancea
Iai
Iai
Localitate
Iai
Focani
Pacani
Tg. Frumos
n concluzie, tabela FP, adus n 3FN, se prezint sub forma a trei tabele, FP1, FP21 i
FP22, cu structurile descrise n figura nr. 5.18.
FP1
NumrFactur
CodFurnizor
Data
Valoare
FP21
CodFurnizor
NumeFurnizor
Adresa
CodPotal
FP22
CodPotal
Localitate
Jude
temporare sau chiar a unei variabile-tablou (matrice). n unele SGBD-uri, cum ar fi FoxPro,
formatul general al frazei SELECT conine i clauza INTO.
SELECT
FROM
INTO destinaie
WHERE
Destinaie specific dac se va obine o tabel "normal", o tabel temporar (tabel care
se terge automat la nchiderea sa) sau o variabil-tablou. Dac clauza INTO nu este utilizat,
atunci n urma interogrii se obine o tabel temporar cu numele predeterminat (Query).
Uneori, tabela rezultat ("normal" sau temporar) "ncalc" poruncile modelului relaional.
Conform restriciei de entitate, ntr-o relaie nu pot exista dou linii identice. Or, n SQL, tabela
obinut dintr-o consultare poate conine dou sau mai multe tupluri identice.
Spre deosebire de algebra relaional, n SQL nu se elimin automat tuplurile identice
(dublurile) din tabela-rezultat. Pentru aceasta este necesar utilizarea opiunii DISTINCT:
SELECT DISTINCT C1, C2, ..., Cn
FROM R1, R2, ..., Rm
WHERE P
LOCALITI
CodPostal
Jude
Localitate
6600
Iai
Iai
5300
Focani
Vrancea
5725
Pacani
Iai
6750
Tg. Frumos
Iai
CLIENI
CodClient
1001
NumeClient
TEXTILA SA
Adresa
Bld. Copou, 87
CodPostal
6600
1002
MODERN SRL
Bld. Grii, 22
5300
1003
OCCO SRL
NULL
6600
1004
FILATURA SA
5300
1005
INTEGRATA SA
I.V.Viteazu, 115
5725
1006
AMI SRL
Galaiului, 72
6750
1007
AXON SRL
Silvestru, 2
6600
1008
ALFA SRL
Prosperitii, 15
5725
FACTURIEMISE
NrFactur
CodClient
Data
ValoareTotal
TVAColectat
111111
1003
17.06.2000
17000000
2714286
111112
1001
17.06.2000
2850000
455042
111113
1004
18.06.2000
5850000
934034
111114
1003
18.06.2000
28500000
4550420
111115
1008
18.06.2000
35700000
5700000
111116
1008
19.06.2000
8700000
1389076
111117
1006
20.06.2000
11000000
1756303
111118
1007
23.06.2000
15000000
2394958
111119
1005
24.06.2000
47250000
7544118
111120
1003
24.06.2000
3000000
478992
111121
1001
24.06.2000
4250000
678571
111122
1007
24.06.2000
8750000
1397059
111123
1006
25.06.2000
6600000
1053782
111124
1004
25.06.2000
38650000
6171008
111125
1003
30.06.2000
12850500
2051761
111126
1002
01.07.2000
54250000
8661765
Tabela rezultat din figura 6.2 conine dou atribute: NrFactur i ValFaraTVA. Ultimul
este un cmp calculat.
Operatorul pentru reuniune este deci UNION. De remarcat c, la reuniune, SQL elimin
automat dublurile, deci nu este necesar utilizarea clauzei DISTINCT. Operatorul UNION este
prezent n toate SGBD-urile importante.
Intersecia
Pentru realizarea interseciei a dou tabele, R1 i R2 se utilizeaz operatorul INTERSECT:
SELECT *
FROM R1
INTERSECT
SELECT *
FROM R2
Dac n produsele profesionale, precum DB2 (IBM) sau Oracle operatorul este prezent, n
schimb multe din cele din categoria uoar, precum Visual Fox Pro, INTERSECT rmne un
deziderat, funcionalitatea sa realizndu-se prin subconsultri (operatorii IN i EXISTS) sau,
uneori, prin jonciune.
Diferena
Diferena dintre tabelele R1 i R2 se realizeaz utiliznd operatorul MINUS sau EXCEPT.
Fraza SELECT urmtoare funcioneaz n Oracle.
SELECT *
FROM R1
MINUS
SELECT *
FROM R2
n DB2 MINUS trebuie nlocuit cu EXCEPT, iar n Visual FoxPro exist nici MINUS i
nici EXCEPT, astfel nct, ca i n cazul interseciei, este necesar a se recurgere la ali operatori,
precum IN sau EXISTS.
Produsul cartezian
n SQL nu exist operator explicit pentru efectuarea produsului cartezian. Dac n clauza
FROM apar dou relaii, R1 i R2, atunci, n lipsa unei condiii de jonciune formulat n clauza
WHERE, tabela rezultat va conine liniile obinute din produsul cartezian R1 R2.
SELECT *
FROM R1, R2
CodPostal
6600
5725
6750
Jude
Localitate
Iai
Pacani
Tg. Frumos
Iai
Iai
Iai
Exemplu 2
Care dintre facturile emise dup 23.06.98 prezint valoarea mai mare sau egal cu
3 000 000 lei ?
SELECT *
FROM FACTURIEMISE
WHERE Data > {23.06.2000} AND ValoareTotala >= 3000000
Rezultat:
NrFactur
CodClient
111119
1005
Data
24.06.2000
ValoareTotal
4 725 000
TVAColectat
850 500
111124
111126
1004
1002
25.06.2000
01.07.2000
3 850 000
5 425 000
693 000
976 500
Dup cum se observ, operatorul AND a fost utilizat pentru a introduce un "I" logic, dup
cum OR se utilizeaz pentru SAU logic. n SQL, pentru comparare, n afara operatorilor
"clasici" specificai mai sus, pot fi utilizai i ali operatori, dintre care n acest paragraf ne vom
opri la:
BETWEEN (ntre, cuprins ntre),
LIKE (ca i, la fel ca),
IN (n) i
IS NULL.
Operatorul BETWEEN
Acest operator permite specificarea unui interval de valori n care trebuie s se ncadreze
cmpul/expresia testat. Acest interval se refer la valori numerice sau la date calendaristice.
Exemplu 3
Se reformuleaz ultima interogare:
Care sunt facturile emise dup 23.06.2000 i care au valoarea cuprins ntre 3 000 000 i
4 000 000 lei ?
Fr operatorul BETWEEN fraza SELECT se scrie:
SELECT *
FROM FACTURIEMISE
WHERE Data > {23.06.2000} AND
ValoareTotala >= 3000000 AND ValoareTotala <= 4000000
Utiliznd operatorul BETWEEN se poate scrie:
SELECT *
FROM FACTURIEMISE
WHERE Data > {23.06.2000} AND ValoareTotala BETWEEN 3000000 AND
4000000
Operatorul LIKE
Acest operator se folosete pentru a compara un atribut de tip ir de caractere (ex.
NumeClient, Adresa, Localitate) cu un literal (constant de tip ir de caractere). Astfel, dac se
dorete obinerea unei tabele-rezultat care s conin numai clienii ai cror nume ncepe cu litera
M, putem scrie predicatul din clauza WHERE sub forma: NumeClient LIKE "M%". Deoarece
dup litera M apare semnul "%", se vor extrage din tabela CLIENI toate tuplurile pentru care
valoarea atributului NumeClient ncepe cu litera M, indiferent de lungimea acestuia (ex.
MELCRET, MIGAS, MITA, MATSUSHITA etc.). Despre semnul "%" se spune c este un
specificator multiplu, joker sau masc.
Un alt specificator multiplu utilizat n multe versiuni SQL este liniua de subliniere ("_").
Spre deosebire de "%", "_" substituie un singur caracter. Diferena dintre cei doi specificatori
multipli este pus n eviden n exemplele urmtoare.
Exemplu 4
Care sunt clienii ai cror nume este format din apte caractere, ncepe cu litera A i sunt
societi cu rspundere limitat (SRL-uri) ?
SELECT *
FROM CLIENI
WHERE NumeClient LIKE "A__ SRL"
Rezultatul va fi cel din figura 6.3.
Rezultatul evalurii unui predicat ce conine acest operator va fi "adevrat" dac valoarea
expresiei1 este egal cu (cel puin) una din valorile: expresie2, expresie3, ... Este util atunci cnd
condiiile de selecie sunt mai complexe.
Exemplu 6
Care sunt localitile din judeele Iai i Vaslui?
Fr utilizarea operatorului IN interogarea se scrie:
SELECT *
FROM LOCALITI
WHERE Jude = "Iai" OR Jude = "Vaslui"
Utiliznd operatorul IN:
SELECT *
FROM LOCALITI
WHERE Jude IN ("Iai", "Vaslui")
Operatorul IS NULL
O valoare nul este o valoare nedefinit. Este posibil ca la adugarea unei linii ntr-o
tabel, valorile unor atribute s fie necunoscute. n aceste cazuri valoarea atributului pentru
tuplul respectiv este nul. Reamintim c, prin definiie, nu se admit valori nule pentru grupul
atributelor care constituie cheia primar a relaiei.
Exemplu 7
Dac se dorete aflarea clienilor pentru care nu s-a introdus adresa, interogarea se poate scrie:
SELECT *
FROM CLIENTI
WHERE Adresa IS NULL
Cum n baza noastr de date, numai clientului OCCO SRL nu-i cunoatem adresa, rezultatul
interogrii este cel din figura 6.5.
Observaii
1. Valoarea NULL nu se confund cu valoarea zero (pentru atributele numerice) sau cu valoarea
"spaiu" (pentru atributele de tip ir de caractere)
2. Operatorul NULL se utilizeaz cu IS i nu cu semnul "=". Dac s-ar utiliza forma expresie =
NULL i nu expresie IS NULL, rezultatul evalurii va fi ntotdeauna fals, chiar dac
expresia nu este nul !
Prezentarea localitilor n ordinea alfabetic a numelui acestora este posibil prin apelnd
la clauza ORDER BY:
SELECT Localitate, Jude
FROM LOCALITI
ORDER BY Localitate
onciunea
SQL nu prezint clauze sau operatori speciali pentru realizarea theta-jonciunii, echijonciunii sau jonciunii naturale. Dar, aa cum am vzut, o jonciune este o combinaie de
produs cartezian i selecie.
Exemplu 1
Revenind la exemplele din algebra relaional, echi-jonciunea tabelelor FURNIZOR1 i
FURNIZOR2 n SQL se realizeaz prin fraza SELECT:
SELECT *
FROM FURNIZOR1, FURNIZOR2
WHERE FURNIZOR1.CodF = FURNIZOR2.CodF
Observaie:
n SQL2, echijonciunea poate fi realizat prin clauza INNER JOIN plasat n clauza FROM.
Astfel, ultima fraz SELECT se poate redacta, n SQL2, fr clauza WHERE:
SELECT *
FROM FURNIZOR1 INNER JOIN FURNIZOR2 ON
FURNIZOR1.CodF = FURNIZOR2.CodF
Exemplu 2
Care sunt clienii din municipiul Focani ?
SELECT *
FROM CLIENI INNER JOIN LOCALITI
ON CLIENI.CodPostal = LOCALITI.CodPostal
WHERE Localitate=Focsani
Din cele 32 de linii sunt selectate cele care ndeplinesc condiia de jonciune, CLIENI.CodPostal = LOCALITI.CodPostal, i pe cea suplimentar - Localitate=Focsani.
n final, rezultatul este cel din figura 6.8.
Exemplu 3
Care sunt facturile emise clienilor din judeul Iai ?
SELECT NrFactura
FROM FACTURIEMISE, CLIENI, LOCALITI
WHERE FACTURIEMISE.CodClient = CLIENI.CodClient
AND CLIENI.CodPostal = LOCALITI.CodPostal
AND Jude=Iai
Jonciunea celor dou instane, FE1 i FE2, ale tabelei FACTURIEMISE dup condiia
FE1.Data = FE2.Data:
SELECT *
FROM FACTURIEMISE FE1 INNER JOIN FACTURIEMISE FE2
ON FE1.Data= FE2.Data
Din cele 38 de linii, prin predicatul FE2.NrFactura=111113 rmn numai 3, cele din
figura 6.9.
Exemplu 5
Care sunt clienii crora NU le-am ntocmit facturi pe 18/06/2000 ?
La aceast problem se pot formula mai multe soluii. Una ar fi bazat pe diferena dintre
toi clienii (extrai din tabela CLIENI) i cei crora le-am trimis facturi pe 18 iunie. innd
seama c numele clientului este cheie alternativ, deci unic, se poate scrie:
SELECT NumeClient
FROM CLIENTI
MINUS
SELECT NumeClient
FROM CLIENTI INNER JOIN FACTURIEMISE
ON CLIENTI.CodClient=FACTURIEMISE.CodClient AND Data={^2000/06/18}
Prima observaie: n rezultat sunt incluse toi clienii, adic, toate nregistrrile din tabela
CLIENI. A doua observaie: jonciunea nu mai este de tip INNER i LEFT OUTER, adic
extern la stnga. Cum dintre CLIENI i FACTURIEMISE, cea de la stnga este prima, rezult
c n rezultat sunt extrase toate liniile din aceasta, chiar dac nu au linii corespondente n tabela
din dreapta. n cazul nostru, TEXTILA SA, MODERN SRL, INTEGRATA SA, AMI SRL
AXON SRL nu au fcut cumprturi de la firma noastr pe 18 iunie 2000. Ne dm seama de
acest lucru observnd c pe liniile coresponde acestora, valorile atributelor preluate din FACTURIEMISE sunt NULL.
Astfel nct, pentru a rspunde punctual la problema pus, ar trebui extrase liniile n care,
n urma jonciunii externe, FE.NrFactur (sau oricare alt atribut din FE) este NULL. Paradoxal
sau nu, fraza urmtoare nu obine rezultatul scontat n VFP:
SELECT *
FROM CLIENTI C LEFT OUTER JOIN FACTURIEMISE FE
ON C.CodClient=FE.CodClient AND Data={^2000/06/18}
WHERE FE.NrFactura IS NULL
Funcia NVL convertete valorile nule ale atributului NrFactura n 0. Principial, soluia
bazat pe NVL are acelai mecanism ca i precedenta interogare. Cu singura diferen c
funcioneaz, dup reiese din figura 6.12.
Firete, pentru a obine numai numele clienilor, este necesar nlocuirea asteriscului din
clauza SELECT cu atributul NumeClient.
Ar mai fi de adugat c exist trei tipuri de jonciune extern: la stnga (LEFT OUTER
JOIN), la dreapta (RIGHT OUTER JOIN) i total (FULL OUTER JOIN). La jonciunea
extern la dreapta sunt extrase liniile echi-jonciunii plus liniile tabelei din dreapta ce nu
ndeplinesc condiia formulat prin predicatul de jonciune. Jonciunea extern total reprezint,
n fapt, reuniunea (cu eliminarea dublurilor) jonciunilor la stnga i la dreapta.
Sub-consultri. Operatorul IN
O alt facilitate deosebit de important a limbajului SQL o constituie posibilitatea
includerii (imbricrii) a dou sau mai multe fraze SELECT, astfel nct pot fi formulate
interogri cu mare grad de complexitate.
Operatorul IN poate fi utilizat i pentru includerea unei fraze SELECT ntr-o alt fraz
SELECT.
Exemplu 1
Care sunt facturile emise n aceeai zi n care a fost ntocmit factura 111113 ?
SELECT *
FROM FACTURIEMISE
WHERE Data IN
(SELECT Data
FROM FACTURIEMISE
WHERE NrFactur=111113)
Sub-consultarea
SELECT Data
FROM FACTURIEMISE
WHERE NrFactur=111114
are ca rezultat o tabel alctuit dintr-o singur coloan (Data) i o singur linie ce conine
valoarea atributului Data pentru factura 111113, ca n figura 6.13:
Exemplu 2
Care sunt facturile emise n alte zile dect cea n care a fost ntocmit factura 111113?
SELECT *
FROM FACTURIEMISE
WHERE Data NOT IN
(SELECT Data
FROM FACTURIEMISE
WHERE NrFactur=111113)
Figura nr. 6.15. Facturile emise n alte zile dect factura 111113
Exemplu 3
Care sunt clienii crora li s-au trimis facturi ntocmite n aceeai zi cu factura 111113?
SELECT DISTINCT NumeClient
FROM CLIENI
WHERE CodClient IN
(SELECT CodClient
FROM FACTURIEMISE
WHERE Data IN
(SELECT Data
FROM FACTURIEMISE
WHERE NrFactur=111113))
Am ilustrat modul n care pot fi imbricate (nlnuite, incluse) trei fraze SELECT. Soluia
este valabil n SGBD-urile profesionale (DB2, Oracle), nu ns i n VFP, n care orice
interogare poate fi desfutata pe maximum dou nivele (SELECT-ul principal, plus un nivel de
sub-consultri). Pentru a reduce numrul straturilor de corelare, se poate folosi, n acest caz,
jonciunea:
SELECT DISTINCT NumeClient
FROM CLIENI, FACTURIEMISE
WHERE CLIENI.CodClient=FACTURIEMISE.CodClient
AND Data IN
(SELECT Data
FROM FACTURIEMISE
WHERE NrFactura=111113)
Se poate reine, ca regul general, c aproape orice consultare poate fi redactat n mai
multe moduri, n funcie de experiena i imaginaia celui care o formuleaz.
Rezultatul oricrei fraze SELECT este o nou relaie (tabel). n lipsa opiunii GROUP
BY, dac n clauza SELECT este prezent o funcie predefinit, tabela rezultat va conine o
singur linie.
Funcia COUNT contorizeaz valorile unei coloane, altfel spus, numr, ntr-o relaie,
cte valori diferite de NULL are coloana specificat.
Exemplu 1
Ci clieni are firma ?
SELECT COUNT (CodClient) AS Nr_Clienti
FROM CLIENTI
n funcia COUNT se poate utiliza ca argument, n locul numelui unei coloane, semnul *;
n acest caz se va determina cte linii are tabela la care se aplic funcia respectiv.
Exemplu 2
La ci clieni s-au trimis facturi ?
SELECT COUNT ()
FROM CLIENTI
WHERE CodClient IN
(SELECT CodClient
FROM FACTURIEMISE)
Exemplu 3
Care este valoarea total a facturilor emise ?
SELECT SUM (ValoareTotala) AS Total_FP
FROM FACTURIEMISE
Exemplu 4
Care este totalul valorii facturilor trimise clientului AXON SRL ?
SELECT SUM (ValoareTotala) AS Total_FE_AXON
FROM FACTURIEMISE, CLIENTI
WHERE FACTURIEMISE.CodClient = CLIENTI.CodClient
AND NumeClient = "AXON SRL"
Funciile MAX i MIN. Determin valorile maxime, respectiv minime ale unei coloane n
cadrul unei tabele.
Exemplu 5
Care este cea mai mic valoare a unei facturi emise ?
SELECT MIN(ValoareTotala)
FROM FACTURIEMISE
Exemplu 6
Care este factura emis ce are cea mai mare valoare ?
SELECT NrFactura, ValoareTotala
FROM FACTURIEMISE
WHERE ValoareTotala =
(SELECT MAX (ValoareTotala)
FROM FACTURIEMISE)
Dac n Oracle sau DB2 la execuia acestei interogri se afieaz un mesaj de eroare, n
Visual FoxPro nu, aa c unii utilizatori s-ar putea baza pe rezultatul afiat.
n acest caz tabela-rezultat va avea un numr de linii egal cu numrul de date calendaristice
distincte din tabela FACTURIEMISE. Pentru toate facturile aferente unei zile se va calcula suma
valorilor, datorit utilizrii funciei SUM(ValoareTotala).
Succesiunea pailor este urmtoarea:
1. Se ordoneaz liniile tabelei FACTURIEMISE n funcie de valoarea atributului Data figura 6.19.
2. Se formeaz cte un grup pentru fiecare valoare distinct a atributului Data - vezi figura
6.20.
3. Pentru fiecare din cele nou grupuri se calculeaz suma valorilor atributului
ValoareTotala. Tabela rezultat va avea nou linii, ca n figura 6.21.
Exemplu 2
Care este numrul facturilor emise pentru fiecare client ?
SELECT NumeClient, COUNT(NrFactura)
FROM FACTURIEMISE INNER JOIN CLIENTI
ON FACTURIEMISE.CodClient = CLIENTI.CodClient
GROUP BY FACTURIEMISE.CodClient
Exemplu 3
Pentru facturile emise intereseaz valoarea zilnic a acestora (n funcie de data la care au fost
ntocmite, dar numai dac aceasta (valoarea zilnic) este de mai mare de cinci milioane lei.
SELECT Data, SUM(ValoareTotala)
FROM FACTURIEMISE
GROUP BY Data
HAVING SUM(ValoareTotala) > 15000000
La execuia acestei fraze, se parcurg cei trei pai prezentai la exemplul 1, apoi, din cele nou
tupluri obinute prin grupare, sunt extrase numai cele care ndeplinesc condiia
SUM(ValoareTotala)>15000000. Rezultatul final este cel din figura 6.22.
Exemplu 4
S se afieze ziua n care s-au ntocmit cele mai multe facturi.
SELECT Data
FROM FACTURIEMISE
GROUP BY Data
HAVING COUNT(*) >= ALL
(SELECT COUNT(*)
FROM FACTURIEMISE
GROUP BY Data)
Din pcate, nici acest tip de interogare (prezena subconsultrilor n clauza HAVING) nu
este agreat de Visual FoxPro, astfel nct este necesar utilizarea mai multor fraze SELECT i
salvarea rezultatelor intermediare fie n tabele derivate (view-uri), fie n cursoare
(NR_PE_ZILE) care, n VFP sunt tabele temporare a cror via este limitat de nchiderea lor,
explicit sau implicit:
SELECT Data, Nr ;
FROM NR_PE_ZILE ;
WHERE Nr >= ;
(SELECT MAX(Nr) ;
FROM NR_PE_ZILE)
Coninutul cursorului NR_PE_ZILE, precum i rezultatul final sunt cele din figura 6.23.
Adugarea de nregistrri
Exemplu 1
S presupunem c, la un moment dat, ntreprinderea vinde produse i firmei RODEX SRL care
are sediul pe strada Sapienei, nr.44 bis, n localitatea Iai.
Acest nou client trebuie "introdus" n baza de date, operaiune care n SQL, se realizeaz
prin comanda:
INSERT
INTO CLIENI
VALUES (1009, RODEX SRL, Sapienei, 44 bis, 6600)
Dup cum se observ, dup numele tabelei (CLIENI) au fost enumerate toate atributele
pentru care se introduc valori prin clauza VALUES. Dac nu s-ar fi cunoscut adresa clientului
RODEX, atunci fraza INSERT ar fi avut una din formele:
INSERT
INTO CLIENI (CodClient, NumeClient, Adresa, CodPostal)
VALUES (5009, "RODEX SRL", NULL, 6600)
sau
INSERT
INTO CLIENI (CodClient, NumeClient, CodPostal)
VALUES (5009, RODEX SRL, 6600)
tergerea de nregistrri
Operaiunea de eliminarea a una sau mai multe linii dintr-o tabel, pe baza unui predicat,
se realizeaz n SQL prin comanda DELETE care are sintaxa:
DELETE
FROM nume-tabel
WHERE predicat
Exemplu 2
S se elimine din tabela CLIENI linia aferent clientului MODERN SRL (cod 1002).
DELETE
FROM CLIENI
WHERE CodClient = 1002
Exemplu 3
S se tearg datele referitoare la fiecare vnzare de produs pentru clienii din oraul Focani.
DELETE
FROM FACTURIEMISE
WHERE CodClient IN
(SELECT CodClient
FROM CLIENI, LOCALITI
WHERE CLIENI.CodPostal=LOCALITI.CodPostal AND
Localitate = "Focani"))
Nici aceast form nu funcioneaz n VFP. n general, tergerea unor linii trebuie privit
cu mult circumspecie, deoarece atunci cnd linia de ters conine valori ale unor atribute ce
apar n alte tabele ca i chei strine, exist riscul pierderii integritii refereniale.
Standardul SQL92 (nu i dialectul SQL din VFP) permite la crearea unei tabele descrierea
aciunii care se va derula la tergerea unei linii printe n cazul n care exist linii-copil. Spre
exemplu, se poate refuza tergerea de linii din tabela CLIENI, dac la crearea tabelei
FACTURIEMISE se specific:
CREATE TABLE FACTURIEMISE
(NrFactura
DataFactura
DATE,
CodClient
Ca rezultat, vor fi modificate valorile atributului specificat, noile valori ale acestuia fiind
cele care rezult n urma evalurii expresiei; modificarea se va produce pe toate liniile tabelei
care ndeplinesc condiia specificat n predicat.
Exemplu 4
n tabela CLIENI, fiecrui client i-a fost atribuit un cod unic, ncepnd cu 1001. Dac din
diferite motive, se dorete ca "numerotarea" clienilor s nceap de la 3001, pstrndu-se
ordinea, se poate articula fraza UPDATE urmtoare:
UPDATE CLIENI
SET CodClient = CodClient + 2000