Sunteți pe pagina 1din 112

UNIVERSITATEA TITU MAIORESCU

Facultatea de INFORMATIC
Conf. univ. dr.
MIHAI POPESCU

Curs pentru nvmntul la distan

BUCURETI 2014/2015

BAZE DE DATE
(Curs Facultatea de Informatic, anul II ID, Semestrul II)

Obiective:

1. nsuirea noiunilor fundamentale din domeniul bazelor de date.


2. Formarea deprinderilor de proiectare a bazelor de date relaionale
folosind diagrama entitate-relaie i normalizarea.
3. Prezentarea modelului relaional.
4. Utilizarea operatorilor algebrei relaionale pentru manipularea
datelor din baza de date.
5. nsuirea limbajului SQL de definire (DDL) i manipulare a datelor
din baza de date (DML).
6. Utilizarea bazelor de date relaionale folosind cunotinele nsuite.

Stabilirea Notei Finale (procentaje) :


1) Procentul de 70% constituit din:
- activiti aplicative atestate/ seminarii/ lucrri practice/, examen etc;
- teste pe parcursul semestrului.
2) Procentul de 20% constituit din:
- rezolvarea temelor de cas.
3) Procentul de 10% constituit din:
- prezena la activitile tutoriale.

CAPITOLUL I. PROIECTAREA BAZELOR DE DATE RELAIONALE


Se prezint definiia bazelor de date i a conceptelor cu care opereaz acestea; se
descriu paii parcuri n realizarea unei baze de date, exemplificndu-se la nivelul unei
agenii imobiliare naionale care faciliteaz tranzacii de vnzare/cumprare ntre vnztori
i cumprtori; fiecare punct al capitolului se ncheie cu propunerea unor exerciii de fixare
a noiunilor.

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 Microsoft SQL Server i MySQL.
1.1. Noiuni folosite n teoria bazelor de date
a) O baz de date :
reprezint un ansamblu structurat de fiiere care grupeaz datele prelucrate n
aplicaii informatice ale unei persoane, grup de persoane, instituii etc.
este definit ca o colecie de date aflate n interdependen, mpreun cu
descrierea datelor i a relaiilor dintre ele.
b) Organizarea bazei de date se refer la structura bazei de date i reprezint un
ansamblu de instrumente pentru descrierea datelor, relaiilor, restriciilor la care sunt
supuse.
c) Sistemul de gestiune a bazei de date (SGBD):
este un sistem complex de programe care asigur interfaa ntre o baz de date i
utilizatorii acesteia (exemple de programe: ACCESS, Fox Pro, PARADOX,
ORACLE, MySQL, SQL Server)
este software-ul bazei de date care asigur:
1)
definirea structurii bazei de date;
2)
ncrcarea datelor n baza de date;
3)
accesul la baza de date (interogare, actualizare);
3

4)
5)
6)

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.

d) Cele trei concepte 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.
e) Data este un model de reprezentare a informaiei, accesibil unui anumit procesor
(om, program, calculator) i se definete prin:
Identificator;
Tip;
Valoare.
1.2. Funcionarea unei baze de date
Exploatarea unei baze de date aflate pe un suport specific (magnetic), de ctre un
utilizator, prin intermediul unui sistem de calcul, avnd la dispoziie un SGBD, parcurge uzual
urmtoarele etape:
1.
Utilizatorul, aflat la un terminal electronic, pune o "ntrebare" sau lanseaz o cerere
de date, referitoare la informaiile din baza de date. ntrebarea se poate pune ntr-un limbaj de
cereri specific SGBD-ului cu care se lucreaz (dac utilizatorul este familiarizat cu acest limbaj de exemplu, SQL, FoxPro, dBase, Oracle) sau utilizatorul poate fi asistat n adresarea cererii de
date de ctre SGBD (produsul soft pe care l folosete) printr-un sistem de meniuri, butoane sau
ferestre de dialog (obiecte de control).
2.
ntrebarea este analizat de ctre calculator, de fapt de SGBD, iar dac este corect, se
ncearc (SGBD) s i se dea rspuns prin accesarea informaiilor din baza de date. Rspunsul
va fi constituit din mulimea datelor cerute de utilizator, care verific criteriile specificate
de acesta.
Acest proces de lansare a unei cereri de date care va fi satisfcut prin furnizarea datelor
care ndeplinesc proprietile cerute se numete interogarea bazei de date.
3.
Rspunsul la cererea de date se va afia pe ecran, se va tipri la
imprimant sau se va memora ntr-un fiier.
n realizarea unei baze de date se urmrete:
micorarea timpului de rspuns la o interogare;
asigurarea costurilor minime de prelucrare i ntreinere ;
adaptabilitatea la cerine noi (flexibilitate);

sincronizarea n exploatarea simultan a datelor de ctre mai muli


utilizatori(accesul concurent);
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#
2
3
22
50

vin
Cab.
Sauvignon
Pinot Noir
Pinot Noir
Merlot

producator
Windsor

an
1995

sticle
12

lansat
2004

Fetzer
Dehlinger
Clos du
Bois

1997
1999
1998

3
2
9

2004
2002
2004

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:
vin
raft
producator
Cab. Sauvignon
2
Windsor
Pinot Noir
3
Fetzer
Merlot
50
Clos du Bois
Fig. 1.2 Exemplu de consultare
Observaii: n limbajul SQL, fiierul VINOTECA din figura 1.1 este numit
tabel, rndurile unei astfel de tabele pot fi considerate ca nregistrri din
fiier, iar coloanele pot fi considerate drept cmpuri.

1.3

Realizarea unei baze de date

1.
2.
3.
4.

Realizarea unei baze de date presupune parcurgerea etapelor:


analiza domeniului (sistemului) pentru care se realizeaz baza de date;
proiectarea structurii bazei de date;
ncrcarea datelor n baza de date;
exploatarea i ntreinerea bazei de date.
1. Analiza

3. ncrcarea
datelor

2. Proiectarea

LMD

4. ntreinerea

LMD, LDD

LDD
Baza
de
date

LMD

4. Exploatarea

Fig. 1.3 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 parcursul
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 vnzare-cumprare.
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.
6

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.
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.

1.4

Exerciii de fixare a noiunilor

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 atomic 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 baz 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.

2.

3.

4.

5.

6.

7.

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. Construirea de diagrame entitate-relaie


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

FACTURI

LOCALITATI
JUDETE

DESCRIERE_
IMOBIL

STRAZI

Fig. 2.1. Diagrama E-R pentru domeniul imobiliar (prima form)


b) Identificarea asocierilor dintre entiti i calificarea lor
ntre majoritatea componentelor (adic a entitilor) unui sistem economic se
stabilesc legturi (asocieri).
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.
9

(1,1)

(0,1)

sunt finalizate
prin

CERERI_OFERTE

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 ale 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_
OFERTE
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
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
10

o asocieri totale de tip muli la muli.


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 lor.

ii.

Asocieri n funcie de cardinalitatea legturii

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

E1

(...,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)
A

E1

(...,n)
E2

(...,1)
A

E1

E2

Fig. 2.5. Asociere de tipul unu la mai muli


Exemplu:
A

B
CERERI_OFERTE

LOCALITATI
L1
L2
L3
LOCALITATI

(1,1)

(0,n)
i corespunde

1
2
3
CERERI_OFERTE

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.
E1

(...,n)

(...,n)

Fig. 2.7. Asociere de tipul muli la muli


11

E2

Exemplu:
DEPOZIT

PRODUS

D1
D2
D3

(0,n)

P1
P2
P3

(0,n)

DEPOZIT

nmagazi
neaz

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:
(...,n)

Din

(...,n)
A

E1

(...,1)

E2

E1

(...,n)
A1

(...,n)

a)

(...,1)
A2

E2

b)

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
D1
D2
D3
D4
....

(1,1)

asociaz

(0,n)

DEPOZIT_
PRODUS
D1-P1
D1-P3
D2-P2
D3-P2
....

(0,n)

asociaz

(1,1)

PRODUS
P1
P2
P3
P4
...

Fig. 2.10. Transformarea asocierii de tipul muli la muli n asocieri de tipul unu la muli
Asocieri pariale i totale
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)
12

minima cardinalitii zero, are drept rezultat lipsa obligativitii participrii


partenerului la aceast asociere;
minima cardinalitii mai mare dect zero, are drept rezultat obligativitatea
participrii.
(0,)

(,)

E1

(,)

E2

(0,)

E1

a)

E2

b)

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 FACTURI fiind 0.
O asociere este total dac toate entitile au obligativitatea s participe la asociere,
adic minima cardinalitii este mai mare dect zero.
(1,)

(1,)

E1

E2

a)
(1,)

(n,)

E1

(n,)

E2

E1

b)
(n,)

E1

(1,)

E2

c)
(n,)

E2

d)

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_
OFERTE
1
2
3

FACTURI
F1
F2

13

Exemplu: Asocieri totale de tip unu la unu


DESCRIERE_IMOBIL

CERERI_
OFERTE
1
2
3

I1
I2
I3

Exemplu: Asocieri pariale de tip unu la muli


CERERI_OFERTE

LOCALITATI
L1
L2
L3

1
2
3

Exemplu: Asocieri totale de tip unu la muli


CLASE
C1
C2
C3

ELEVI
E1
E2
E3
E4

Exemplu: Asocieri pariale de tip muli la muli


DEPOZIT

PRODUS

D1
D2
D3
D4

P1
P2
P3

Exemplu: Asocieri totale de tip muli la muli


CURSURI

STUDENTI

C1
C2
C3

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 corespund mai multe
localiti;
14

LOCALITATI-STRAZI 1:n - deoarece unei localiti i corespund mai multe


strzi;
STRAZI-CERERI_OFERTE 1:n deoarece unei strzi i pot corespunde mai
multe oferte/cereri;
FACTURI-CERERI_OFERTE 1:1 deoarece fiecare factur conine doar cte
o ofert/cerere;
CERERI_OFERTE-DESCRIERE_IMOBIL 1:1 fiecrui imobil i se face o
singur descriere;
FACTURI- DATE_PERSOANA 1:1 o factur este ncheiat de o singur
persoan;
DATE_PERSOANA - CERERI_OFERTE 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)

E
(b)

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 acela cu
valori mai scurte i mai puin volatile.
Exemplu: n urma analizrii celor 4 etape necesare construirii diagramei entitate-asociere:
identificarea entitilor domeniului sau a sistemului economic;
identificarea asocierilor dintre entiti;
identificarea atributelor aferente entitilor i a asocierilor dintre acestea;
stabilirea atributelor de identificare a entitilor,
15

se poate prezenta forma complet a diagramei asociate domeniului ales n exemplu.


(0,n)

STRAZI

are asociat

(0,n)

(1,1)

LOCALITATI

are asociat

(1,1)

JUDETE

(1,1)
se regsete
(1,n)

CERERI_
OFERTE

(1,n) conin

(1,1)

DATE_PERSOANA
(1,1)
incheie

(1,1)

(0,1)

(1,1)
finisate

(0,1)

FACTURI

conin
(1,1)

DESCRIERE
_IMOBIL

Fig. 2.15. Diagrama E-R pentru domeniul imobiliar (a doua form)


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

CERERI_OFERTE

id_strada
nr_imobil
pret_min
pret_max
tip_solutionare

Fig. 2.16. Reprezentarea atributelor aferente entitii CERERI_OFERTE (detaliu dintr-o


diagram E-R)
16

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 persoan, 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 urmeaz
cteva date legate de imobil: codul localitii cod loc, 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.15.
DATE_PERSOANA
cnp#
numele
adresa
nr_telefon
email
banca_client
nr_cont_client

FACTURI
id_oferta#
data_factura
cnp
pret
TVA
total

STRZI
id_strada#
cod_loc#
nume_str

LOCALITATI
cod_loc#
simbol_judet#
nume_loc

JUDETE
simbol_judet#
nume_judet

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

DESCRIERE_IMOB IL
id_co#
tip_imobil
etaj
nr_camere
suprafata
garaj
centrala_termica
termopane

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

2.1

Exerciii de fixare a noiunilor

1. O relaie este:
a. orice tabel bidimensional cu valori atomice;
b. orice tabel;
c. orice tabel bidimensional
2. 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
3. Cardinalitatea unei relaii reprezint:
a. numrul de atribute ale relaiei;
b. numrul de tupluri ale relaiei;
c. numrul de atribute identificator, ale relatiei.
4. Care sunt componentele unei diagrame E-R?
5. Ce se nelege prin cardinalitate?
6. Numii trei tipuri de asocieri ntre entiti.
17

7. Dai exemple de:


a. o relaie de tip muli la muli
b. o relaie de tip unu la unu
c. o relaie de tip unu la muli.
8. 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?
9. 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).

18

CAPITOLUL II. PREZENTAREA BAZELOR DE DATE


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

una dintre relaiile implicate n asociere. n cazul legturilor de tip muli la muli, atributele
sunt situate ntr-o relaie distinct, construit special pentru explicarea legturilor ntre relaii.
Prezentarea structurii relaionale a datelor impune definirea noiunilor de:
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:
Formal
Relaie
Tuplu
Atribut
Domeniu

Uzual
Tablou
Linie
Coloan
Tip de dat

Fizic
Fiier
nregistrare
Camp
Tip 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 conine valori care exprim cnp-ul persoanei.
D2 cuprinde valori ale datei calendaristice;
20

D3 cuprinde valori referitoare la tipul soluionrii tranzaciei: Da, dac tranzacia a


fost soluionat, Nu, n caz contrar.
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:
D1

D2

2661805270023
1701205230023

D3

2006-05-27
2006-07-03

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_
1

2661805270023
1701205230023

2006-05-27
2006-07-03

soluionare:D3

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;
21

- ordinea liniilor i a coloanelor este arbitrar;


- articolele unui domeniu sunt omogene;
- fiecare coloan definete un domeniu distinct i nu se poate repeta n cadrul aceleiai relaii.
3.2 Operatorii modelului relaional
Limbajele de interogare sunt procedurale sau ne-procedurale. n limbajele procedurale utilizatorul
indic sistemului succesiunea de operaii asupra BD pentru a determina rezultatul dorit. n
limbajele ne-procedurale, utilizatorul descrie rezultatul dorit, fr a indica procedura prin care
acesta este obinut
Modelul relaional ofer dou colecii de operatori pe relaii:
algebra relaional;
calcul relaional:
calcul relaional orientat pe tuplu;
calcul relaional orientat pe domeniu.
Algebra relaional este un limbaj procedural, pe cnd calculul relaional pe tupluri i calculul
relaional pe domenii sunt limbaje ne-procedurale
n acest curs va fi tratat doar cazul algebrei relaionale.
Algebra relaional este o colecie de operaii pe relaii, fiecare operaie avnd drept
operanzi una sau mai multe relaii, rezultatul fiind o alt relaie.
Exist mai multe criterii de grupare a operaiilor:
operaii de baz:
reuniunea;
diferena;
produsul cartezian etc.
operaii derivate:
intersecia;
diviziunea etc.
sau
operaii tradiionale pe mulimi (reuniune, intersecie, diviziune, produs cartezian)
operaii relaionale speciale (selecia, proiecia, jonciunea, etc.)

Reuniunea

Reuniunea reprezint o operaie a algebrei relaionale definit pe dou relaii: R1 i R2,


ambele cu aceeai schem, n urma creia se construiete o nou relaie R3, cu aceeai schem
ca i R1 i R2 i avnd drept extensie tuplurile din R1 i R2, luate mpreun o singur dat.
Notaii: R1U R2
OR (R1, R2)
APPEND (R1, R2)
UNION (R1, R2)

22

Reprezentarea grafic
R3

R1

R2

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


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 patru atribute: id-ul ofertei sau
a cererii, tipul operaiei(ofert sau cerere), cnp-ul clientului, tipul soluionrii). Pentru a afla
care sunt toate ofertele i cererile soluionate, se realizeaz operaia de reuniune.
REZ:

id
1066
1210
220
1316

tipul
oferta
oferta
cerere
cerere

cnp
2660805270023
1881106300897
2820506300898
1881106300897

tip_solutionare
Da
Da
Da
Da

ARHIVA_OFERTE:

id
1066
1210

tipul
oferta
oferta

cnp
2660805270023
1881106300897

ARHIVA_CERERI:

tip_solutionare
Da
Da

id
220
1316

tipul
cerere
cerere

cnp
2820506300898
1881106300897

tip_solutionare
Da
Da

Fig. 3.6. 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)

23

Reprezentarea grafic:
R3

R1

R2

Fig. 3.7. 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.
REZ:

id
2066

tipul
oferta

cnp
2660805270023

tip_solutionare
Da

ARHIVA_OFERTE:

id
1210
2066

tipul
oferta
oferta

ARHIVA_CERERI:

cnp
1881106300897
2660805270023

tip_solutionare
Da
Da

id
0221
1210
3161

tipul
cerere
cerere
cerere

cnp
2820506300898
1881106300897
2690125270032

tip_solutionare
Da
Da
Da

Fig. 3.8. 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. 3.9. Reprezentarea grafic a produsului cartezian


24

Exemplu: Operaia de produs cartezian va fi exemplificat pe un exemplu independent de


aplicaia AGENIA IMOBILIAR considerat. Astfel:
TRANSPORT:

Localit:D1
Baia Mare
Braov
Baia Mare
Braov

Jude:D1
Maramure
Braov
Maramure
Braov

Transport:D3
autobuz
autobuz
troleibuz
troleibuz

LOCALIT:

Localit:D1
Baia Mare
Braov

Tarif: D4
11 000
11 000
10 000
10 000

TARIFE:

Transport: D3
autobuz
troleibuz

Jude:D1
Maramure
Braov

Tarif: D4
11 000
10 000

Fig. 3.10. 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[ Ai , A j ,..., Am ]

PROJECT ( R, Ai , A j ,..., Am )
Reprezentarea grafic:
P
Ai,Aj,...,Am

R
Fig. 3.11. 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

25

REZ: numele
Pop Ana
Sas Ioan

nr_telefon
0362/409209

numele,
nr_telefon
DATE_PERSOANA:
cnp
1701205230032

numele
Pop Ana

2660805270023

Sas Ioan

adresa
Str. Viilor,
nr.55/4,
Oradea,
Bihor
Str.
Victoriei,
nr.22/12,
Baia Mare,
Maramures

nr_telefon
-

email
pa@yahoo.it

0362/409209

Fig. 3.12. Proiecia relaiei DATE_PERSOANA pe atributele numele, nr_telefon

Selecia

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 sau filtru).
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. 3.13. Reprezentarea grafic a operaiei de selecie
Exemplu: n cazul n care se dorete afiarea ofertelor/cererilor anterioare datei de 2006-0703, se poate aplica operaia de selecie asupra relaiei CERERI_OFERTE, dup cum se va
vedea n figura 3.14.
26

OFERTE VECHI:
id_
co#
12

tipul

cnp

oferta

2660805270023

data_
inreg
2006-05-27

Cod_loc
CJ147

Id_
strada
120

Nr_
imobil
22

etaj

Nr_
imobil
22
52

etaj

Pret_
min
45

Pret_ max

Id_confort

47

0012

Pret_
min
45
30

Pret_ max

Id_confo

47
35

0013
0012

data_nreg<2006-07-03
OFERTE:
id_
co#
12
13

tipul

cnp

oferta
oferta

2660805270023
1701205230023

data_
inreg
2006-05-27
2006-07-03

Cod_loc
CJ147
BV230

Id_
strada
120
120

P
2

Fig. 3.14. 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 unor tupluri din R1
cu tupluri din R2 care ndeplinesc o anumit condiie specificat explicit n cadrul operaiei.
Notaie: R1 R2;
JOIN(R1,R2,condiie)
Reprezentarea grafic:
R3
atribut
din R1

atribut
din R2
Operator de
comparaie

R1

R2

Fig. 3.15. 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.
27

cnp

REZ
:

1551212245038

numele

adresa

nr_telefon

nr_
factura

id_co

cnp

Pop
Radu

Str. Al.
Cuza,
nr.4/34,
Ploiesti

0744304505

22

43

1551212245038

cnp

cnp

=
DATE_PERSOANA:

FACTURI:

cnp#

numele

adresa

1551212245038

Pop
Radu
Chis
Alina

Str. Al. Cuza,


nr.4/34, Ploiesti
Str. Luminii, 76,
Buzau

2560405570053

nr_
telefon
0744304505

nr_
id_co cnp
factura#
22
43
1551212245038

0721435622

Fig. 3.16. 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:
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:
28

R3

R1

R2

Fig. 3.17. Reprezentarea grafic a operaiei de jonciune natural


Exemplul 1: Relund exemplul anterior, prin jonciunea natural se elimin atributul repetitiv
cnp.
REZ
:

cnp

numele

adresa

nr_telefon

nr_
factura

id_co

1551212245038

Pop
Radu

Str. Al. I. Cuza,


nr.4/34, Ploiesti

0744304505

22

43

cnp

cnp

=
DATE_PERSOANA:

FACTURI:

cnp#

numele

adresa

1551212245038

Pop
Radu
Chis
Alina

Str. Al. Cuza,


nr.4/34, Ploiesti
Str. Luminii, 76,
Buzau

2560405570053

nr_
telefon
0744304505

nr_
id_co cnp
factura#
22
43
1551212245038

0721435622

Fig. 3.18. 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 3.19.

29

REZ:
id_
co#
12

tipul

cnp

oferta

1701205230023

234

cerere

2760805270024

data_
inreg
200607-03
200605-27

cod_
loc
BV230

id_
strada
120

nr_
imobil
52

pret_
min
30

pret_
max
35

tip_
solutionare
da

nume
_loc
Brasov

simbol_
judet
BV

CJ400

120

22

45

47

da

ClujNapoca

CJ

cod_loc

LOCALITATI:

cod_loc

cod_loc#

nume_loc

CJ400

ClujNapoca
Brasov

BV230

simbol
_judet
CJ
BV

CERERI_OFERTE:
id_
co#
12
234
44

tipul

cnp

oferta
cerere
oferta

1701205230023
2760805270024
2661111246642

data_
inreg
2006-07-03
2006-09-21
2006-09-17

cod_loc
BV230
CJ400
MM430

id_
strada
120
120
133

nr_
imobil
52
22
4

pret_
min
30
45
50

pret_
max
35
47

tip_
solutionare
da
da
nu

Fig. 3.19. Jonciunea natural a relaiilor CERERI_OFERTE i LOCALITATI

Jonciunea extern

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
valoarea NULL.
Jonciunea extern elimin inconvenientul cauzat de jonciunea intern i anume
pierderea de tupluri (vezi figura 3.19; tuplul <44,oferta, 2661111246642, 2006-09-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. 3.20. 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.
30

REZ:

cod_loc#
430
435
400
710
-

nume_loc
Baia Mare
Borsa
Cluj-Napoca
Botosani
-

simbol_judet
MM
MM
CJ
BT
BV

simbol_judet

nume_judet
Maramures
Maramures
Cluj
Brasov

simbol_judet

LOCALITATI:

JUDETE:

cod_loc#
430
435
400
710

nume_loc
Baia Mare
Borsa
Cluj-Napoca
Botosani

simbol_judet
MM
MM
CJ
BT

simbol_judet#
MM
CJ
BV

nume_judet
Maramures
Cluj
Brasov

Fig. 3.21. Operaia de jonciune extern a relaiilor LOCALITI i JUDEE

Semijonciunea

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. 3.22. Reprezentarea grafic a operaiei de semijonciune


Exemplu: Semijonciunea urmtoare realizeaz lista localitilor care au referin n relaia
JUDETE.

31

REZ:

cod_loc#
430
435
400

nume_loc
Baia Mare
Borsa
Cluj-Napoca

simbol_judet
MM
MM
CJ

simbol_judet

LOCALITATI:

JUDETE:

cod_loc#
430
435
400
710

nume_loc
Baia Mare
Borsa
Cluj-Napoca
Botosani

simbol_judet
MM
MM
CJ
BT

simbol_judet#
MM
CJ
BV

nume_judet
Maramures
Cluj
Brasov

Fig. 3.23. 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 a algebrei relaionale definit pe dou relaii, R1 i R2,


ambele cu aceeai schem, n urma creia se construiete o nou relaie R3, cu schema
identic cu a operanzilor i cu extensia format din tuplurile comune lui R1 i R2.
Notaie: R1R2
INTERSECT (R1, R2)
AND (R1, R2)
Reprezentarea grafic:
R3

R1

R2

Fig. 3.24. Reprezentarea grafic a operaiei de intersecie

32

Exemplu:
REZ:
localitate

judete

populatie

Brasov

Brasov

350 000

ORASE:

MUNICIPII:

localitate

judete

populatie

localitate

judete

populatie

Borsa
Brasov

Maramures
Brasov

27 000
350 000

Baia Mare
Brasov

Maramures
Brasov

148 270
350 000

Fig. 3.25. 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 (Ap+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:
Q

Fig. 3.26. Reprezentarea grafic a operaiei de diviziune


Exemplul se lasa ca exerciiu suplimentar.

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.
33

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
A2.D2
Rou
1
Rou
2
Galben
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
Albastru
2
Albastru
3
b) relaia not R
Fig. 3.27. 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 R2 conine
tuplurile din R care nu verific aceast condiie.
Exemplu: Considernd relaia R din figura 3.27 (a) i condiia A2>2, operaia de splitare a
relaiei R produce relaiile R1 i R2 reprezentate prin tabelele:
R1
A1:D1
A
2:D2
Galben
3

34

R2
A1:D1
A2:D2
Rou
1
Rou
2
Figura 3.28. Rezultatul operaiei de splitare a relaiei R din figura 3.27 (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:

(R) :

R:
Persoana:
D

Urma: D

Ana
Ana
Ion
Ion
Maria

Maria
Ion
Vasile
Nicoleta
Oana
a)

Persoana:
D

Urma: D

Ana
Ana
Ion
Ion
Maria
Ana
Ana
Ana

Maria
Ion
Vasile
Nicoleta
Oana
Oana
Vasile
Nicoleta

b)

Fig. 3.29. nchiderea tranzitiv a relaiei R


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

35

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.
Exemplul 1:
R2:
R1:

A:DA

B:DB

a1

b1

a2

b3

a3

b2

a) cheie simpl

ADA

B:DB

a1

b1

a1

b2

a2

b3

a3

b2

b) cheie compus

Fig. 3.30. 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_jud
MM
Maramures
AB
Alba

simbol_jude
BV
BV
CJ

cod_loc#
BV230
BV230
CJ147

id_strad#
120
078
120

nume_str
Independenei
Grii
Cireilor

Fig. 3.31. Chei simple i chei compuse n cadrul relaiilor JUDEE, respectiv STRZI

36

Observaie: Cheia relaiei JUDEE este simbol_jude, deoarece fiecare jude are o
codificare unic a denumirii sale, deci fiecrui jude i corespunde 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, id-ul 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 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:

cnp

numele

1701205230023
2660805270023

Sas Ioan
Pop Ana

simbol_judet
BV
CJ
MM

simbol_
judet
BV
CJ

descriere
Brasov
Cluj
Maramures

Fig. 3.32. 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)

DATE_PERSOANA

are
reedina

(1,1)

JUDETE

Fig. 3.33. Asocierea dintre entitile DATE_PERSOANA i JUDETE

37

Exemplul 2:
JUDETE:
simbol_judet#
BV
CJ

LOCALITATI:
simbol_jude
BV
CJ

nume_jud
Braov
Cluj

STRZI: simbol_judet
BV
BV
CJ

cod_loc#
BV230
BV230
CJ147

id_strada#
001
002
003

cod_loc#
BV230
CJ147

nume_loc
Braov
Dej

nume_str
Independenei
Grii
Cireilor

Fig. 3.34. 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.

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;
b) restricii de comportament:
restricii de domeniu;
restricii temporale.
38

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);

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_facturii
cnp
1
2006-07-05 1701205230023
2
2006-06-28 2581023457723
Fig. 3.35. 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.
39

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:

id_tip_oferte
01
01
02
01
01
02

cnp
simbol_judet
1701205230023
MM
2581023457723
MM
1701205230023
SM
2581023457723
SM
2581023457723
SM
2581023457723
CJ

deoarece
01

1701205230023 MM

(x, y,z)

01

2581023457723 SM

(x, y,z)

01
01

1701205230023 SM
2581023457723 MM

(x, y,z)
(x, y,z)

Fig. 3.36. Relaia OFERTE n care exist dependen multivaloare


3.4 Exerciii de fixare a noiunilor
1. 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
2. Se numete baz de date relaional:
a) un set de tabele;
b) un set de tabele normalizate;
c) un set de tabele bidimensionale
3. Definii urmtorii termeni:
- cheie primar
-cheie extern
- BDR
- domeniu
- entitate
- atribut
- relaie
4. Care sunt conceptele utilizate pentru a descrie elementele de baz ale
organizrii unei BDR?
40

5. 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.
6. 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.
7. 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.
8. Operatorul de proiecie aplicat unei relaii, permite:
a) eliminarea unor coloane;
b) modificarea poziiei coloanelor;
c) eliminarea unor coloane i modificarea poziiei lor
9. 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.
10. 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.
11. Rezultatul aplicrii unui operator relaional, este ntotdeauna:
a) o relaie;
b) o relaie sau o valoare;
c) o relaie sau un set de relaii.
12. Definii urmtorii operatori:
- reuniunea
- diferena
- produsul cartezian
- proiecia
- selecia
- intersecia
- diviziunea
13. Enumerai cele trei tipuri de jonciune.
14. Care dintre operatorii relaionali definii n cursul 4 au o definiie care nu se
bazeaz pe aceeai structur?
15. Fie baza de date FURNIZORI_COMPONENTE modelat de urmtoarele valori
eantion:
41

F F#

numeF
Pop
Achim
Ardelean
Popescu
Ionescu

F1
F2
F3
F4
F5

C C#
C1
C2
C3
C4
C5
C6

numeC
piulita
Bolt
Surub
Surub
Cama
Roata
dintata

Stare
20
10
30
20
30
Culoare
Rosu
Verde
albastru
Rosu
Albastru
rosu

oras
Bucuresti
Ploiesti
Ploiesti
Bucuresti
Vaslui
Masa
12.0
17.0
17.0
14.0
12.0
19.0

FC

oras
Bucuresti
Ploiesti
Arad
Bucuresti
Ploiesti
Bucuresti

F#
F1
F1
F1
F1
F1
F1
F2
F2
F3
F4
F4
F4

C#
C1
C2
C3
C4
C5
C6
C1
C2
C2
C2
C4
C5

cant
300
200
400
200
100
100
300
400
200
200
300
400

Fig. 1. 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?
16. 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.
17. Explicai urmtoarele noiuni:
- restricii de integritate
- cheia primar a unei relaii
- cheia extern a unei relatii
- relaie care refer
- relaie referit.
18. 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.
19. Precizai care sunt restriciile de integritate minimal ale modelului relaional, apoi
enunai aceste restricii.
20. Ce nseamn dependen funcional? Dai dou exemple de DF.
21. 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.
42

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 ntro sptmn. Ce dependene funcionale conine aceast relaie? Care sunt cheile
candidat?
22. Fie relaia F_O_C din figura urmtoare:
F_O_C

F#
F1
F1
F2
F2
F3
F4
F4
F4

oras
Brasov
Brasov
Iasi
Iasi
Iasi
Brasov
Brasov
Brasov

C#
C1
C2
C1
C2
C2
C2
C4
C5

cant
100
100
200
200
300
400
400
400

Fig. 2. Relaia F_O_C (valori eantion)


Determinai dependenele funcionale.

43

CAPITOLUL III. OPTIMIZAREA STRUCTURII BAZELOR DE DATE


RELAIONALE
Se expun regulile formulate de dr.Codd, care definesc un sistem de gestiune a bazelor
de date relaional; se prezint apoi tehnicile de normalizare a bazelor de date relaionale,
care au ca efect obinerea unei structuri optime, acre s elimine anomaliile de inserare,
modificare i tergere a datelor, precum i redundanele la nivelul datelor.
4. Prelucrarea/evaluarea i optimizarea cerinelor
Regulile lui Codd
Prin sistem de gestiune a bazelor de date relaionale (SGBDR) se nelege un SGBD
care utilizeaz drept concepie de organizare a datelor modelul relaional.
Definirea unui SGBDR impune o detaliere a caracteristicilor pe care trebuie s le
prezinte un SGBD pentru a putea fi considerat relaional. n acest sens, Codd a formulat (n
1985) 13 reguli, care exprim cerinele pe care trebuie s le satisfac un SGBD. Aceste reguli
sunt deosebit de utile n evaluarea unui SGBDR.
R0: Regula privind gestionarea datelor la nivel de relaie.
- sistemul trebuie s gestioneze BD numai prin mecanisme relaionale.
R1: Regula privind reprezentarea logic a datelor.
- ntr-o baz de date relaionat, informaia este reprezentat la nivel logic sub
forma unor tabele (relaii);
- acest lucru nseamn c toate datele trebuie s fie memorate i prelucrate n
acelai mod.
R2: Regula privind reprezentarea logic a datelor
- orice data din baza de date relaionat trebuie s poat fi accesat prin
specificarea:
numelui relaiei;
valorii cheii primare;
numele atributului.
R3: Regula privind valorile nule
- sistemul trebuie s permit declararea i manipularea sistematic a valorilor
NULL (semnific lipsa unor date);
- valorile NULL difer de irurile de caractere spaiu, irurile vide de
caractere.
- valorile NULL sunt deosebit de importante n implementarea restriciilor de
integritate:
integritatea entitilor;
integritatea referenial.
R4: Regula privind metadatele
- utilizatorii autorizai trebuie s poat aplica asupra descrierii bazei de date
aceleai operaii ca i asupra datelor obinuite.
R5: Regula privind facilitile limbajelor de utilizare:
- trebuie s existe cel puin un limbaj care s exprime oricare din urmtoarele
operaii:
definirea relaiilor;
sa vizualizeze datele;
44

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

45

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. Reguli structurale: R1 i R6;
3. Reguli privind integritatea datelor: R3 i R10;
4. Reguli privind manipularea datelor: R2, R4, R5, R7;
5. 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. Ordonarea 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).
Strategiile generale de optimizare a cererilor de date sunt:
46

Regula de optimizare 1. Seleciile se execut ct mai devreme posibil. Motivaia acestei


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

cnp#

numele

adresa_
client

nr_
telefon

Cnp1

N1

Nr1

Cnp1

N1

Nr1

hala

A_imobil2

Cnp2

N2

Nr2

casa

A_imobil3

Cnp3

N3

Str. Victoriei,
nr.22/12, Baia
Mare,
Maramures
Str. Victoriei,
nr.22/12, Baia
Mare,
Maramures
Str. Viilor,
nr.55/4,
Oradea, Bihor
Str. Grii, nr.
14, Bucuresti

oferta adresa_
imobil
casa
A_imobil1

Nr3

teren

A_imobil4

Fig. 5.1. Relaia OFERTANTI


47

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 FN1, FN2 i FN3. ntruct ntr-o
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 FN4 i FN5.
O relaie este ntr-o form normal dac satisface o mulime de constrngeri
specificat n figura 5.2. De exemplu, se spune c o relaie se afl n a doua form normal
FN2 dac i numai dac se afl n FN1.
Relaia universal
FN1
FN2
FN3
BCFN
FN4

FN5

Fig. 5.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.
5.1 Prima form normal (FN1)
FN1 este strns legat de noiunea de atomicitate a atributelor unei relaii. Astfel,
aducerea unei relaii n FN1 presupune introducerea noiunilor de:
atribut simplu;
48

atribut compus;
grupuri repetitive de atribute.
Atributul simplu- Atribut compus

Prin atribut simplu (atribut atomic) se nelege un atribut care nu mai poate fi
descompus n alte atribute, n caz contrar, atributul este compus (atribut neatomic).
Exemplu: Urmtoarele exemple de atribute pot fi considerate simple sau compuse n funcie
de circumstane i de obiectivele bazei de date.
Data calendaristic este un atribut n care apar cmpurile: zi, lun, an;
Adresa este un atribut n care apar cmpurile: strada, nr, bloc, scara, etaj,
apartament, localitate, jude;
Data operaiunii bancare este un atribut n care apar cmpurile data, ora;
Buletin/carte identitate este un atribut n care apar cmpurile: seria, nr.
Aceste atribute pot fi atomice sau neatomice. Astfel adresa clienilor ageniei
imobiliare intereseaz la nivel global, pe cnd pentru adresa ofertei sau a cererii de imobile
este vital prelucrarea separat a fiecrui cmp considerat.
Analog, atributul nume reprezint 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 clieni, pe anumite perioade
de timp.

49

FACTURI
nr_factura#
data_factura
nume_client
adresa_client
banca_client
nr_cont_client
delegat
cod_produs
denumire_produs
unitate_de_masura
cantitate
pret_unitar
valoare
valoare_tva
total_valoare_factura
total_valoare_tva
Fig. 5.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;
-

50

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:
FACTURI

LINII_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
cantitate
pret_unitar
valoare
valoare_tva

Fig. 5.4. Relaia FACTURI adus n forma normal FN1


Observaia1: Cmpul adresa_client cuprinde 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.
5.2. A doua form normal (FN2)
FN2 este strns legat de noiunea de dependen funcional. Noiunea de dependen
funcional a fost prezentat n cursul 5: Restricii de integritate ale modelului relaional.
O relaie se afl n a doua form normal FN2 dac:
1. se afl n forma normal FN1 i
2. fiecare atribut care nu este cheie este dependent de ntreaga cheie primar.
Etapele de aducere a unei relaii de la FN1 la FN2 sunt:
I. Se identific posibila cheie primar a relaiei aflate n FN1;
II. Se identific toate dependenele dintre atributele relaiei, cu excepia acelora n care
sursa este un atribut component al cheii primare;
III. Se identific toate dependenele care au ca surs un atribut sau subansamblu de
atribute din cheia primar;

51

IV. Pentru fiecare atribut (sau subansamblu) al cheii de la pasul III se creeaz o relaie
care va avea cheia primar atributul (subansamblul) respectiv, iar celelalte atribute vor
fi cele care apar ca destinaie n dependenele de la etapa III.
Exemplu: Relaia care conine date redundante (de exemplu, modificarea denumirii unui
produs atrage dup sine modificarea n fiecare tuplu n care apare acest produs) este relaia
LINII_FACTURI. Se observ ca nu exist nici o dependen funcional ntre atributele
necomponente ale cheii. n schimb, toate atributele care nu intr n alctuirea cheii compuse
sunt dependente de aceasta, iar DF dintre atributul component al cheii primare sunt:
cod_produs --> denumire_produs, cod_produs --> unitate_de_masura. Ca urmare se formeaz
nc dou relaii.
FACTURI

LINII_FACTURI

PRODUSE

nr_factura#
data_factura
nume_client
adresa_client
banca_client
nr_cont_client
delegat
toal_valoare_factura
toal_valoare_tva

nr_factura#
cod_produs#
cantitate
pret_unitar
valoare
valoare_tva

cod_produs#
denumire_produs
unitate_de_masura

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


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

52

5.3. A treia form normal (FN3)


O relaie este n forma normal trei FN3 dac:
1. se gsete n FN2 i
2. fiecare atribut care nu este cheie (nu particip la o cheie) depinde direct de cheia primar.
A treia regul de normalizare cere ca toate cmpurile din tabele s fie independente
ntre ele.
Etapele de aducere a unei relaii de la FN2 la FN3 sunt:
I. Se identific toate atributele ce nu fac parte din cheia primara i sunt surse ale unor
dependene funcionale;
II. Pentru aceste atribute, se construiete cte o relaie n care cheia primar va fi atributul
respectiv, iar celelalte atribute, destinaiile din DF considerate;
III. Din relaia de la care s-a pornit se elimin atributele destinaie din DF identificat la
pasul I, pstrndu-se atributele surse.
Exemplu: n relaia FACTURI se observ c atributul nume_client determin n mod unic
atributele adresa_client, banca_client i nr_cont_client. Deci pentru atributul
nume_client se construiete o relaie CLIENTI n care cheia primar va fi acest atribut, iar
celelalte atribute vor fi adresa_client, banca_client i nr_cont_client. Cmpurile
valoare i valoare_tva depind de cmpurile cantitate, pret_unitar, i de un procent fix
de TVA. Fiind cmpuri ce se pot calcula n orice moment, ele vor fi eliminate din tabel
LINII FACTURI, deoarece constituie informaie memorat redundant.
FACTURI

LINII_FACTURI

PRODUSE

CLIENTI

nr_factura#
data_factura
nume_client
delegat
toal_valoare_factura
toal_valoare_tva

nr_factura#
cod_produs#
cantitate
pret_unitar

cod_produs#
denumire_produs
unitate_de_masura

nume_client#
adresa_client
banca_client
nr_cont_client

Fig. 5.6. Relaia FACTURI n a treia forma normal FN3


Observaia 1: Aceast a treia form normal mai poate suferi o serie de rafinri pentru a putea
obine o structur performant de tabele ale bazei de date. De exemplu se observ c
nume_client este un cmp n care este nscris un text destul de lung format dintr-o
succesiune de litere, semne speciale (punct, virgul, cratim), spaii, numere. Ordonarea i
regsirea informaiilor dup astfel de cmpuri este lent i mai greoaie dect dup cmpuri
numerice. Din acest motiv se poate introduce un nou atribut cod_client care s fie numeric
i care s fie cheia primar de identificare 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 i s nu fie
memorate n tabelele bazei de date.
53

FACTURI

LINII_FACTURI

PRODUSE

CLIENTI

nr_factura#
data_factura
cod_client
delegat

nr_factura#
cod_produs#
cantitate
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 acestor relaii 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.
5.4. Exerciii de fixare a noiunilor
1. 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.
2. 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.
3. 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.
4. Exist numai trei forme normale? Enumerai formele normale.
5. Definii urmtoarele noiuni:
- atribut simplu (atomic)
- atribut compus.
6. S se normalizeze bazele de date prezente pe parcursul capitolelor anterioare:
COLECTIE_MUZICALA, FURNIZORI_COMPONENTE.

54

CAPITOLUL IV. MANIPULAREA BAZELOR DE DATE


RELAIONALE
Capitolul prezinta, pe scurt, posibilitile de interogare a bazelor de date
relaionale, utiliznd algebra relaional i limbajul SQL.

Pentru interogarea bazelor de date, deci pentru cererea de date, poate exista un
limbaj specializat numit limbaj al interogrilor, ca o parte a unui limbaj de manipulare a
bazelor de date.
In afara regsirii datelor, un limbaj de manipulare mai trebuie s conin comenzi pentru
tergerea de nregistrri dintr-o relaie, adugarea de noi nregistrri ntr-o relaie i
modificarea nregistrrilor.
Dintre limbajele de interogare a bazelor de date relaionale se pot aminti:
. Limbaj bazat pe algebra relaiilor. Acest limbaj este bazat pe o mulime de operatori ce
acioneaz asupra uneia sau a dou relaii, iar rezultatul este tot o relaie. In paragraful
urmtor sunt precizai operatorii acestui limbaj.
Limbajul SQL (Structured Query Language). Diferite versiuni ale acestui limbaj au
fost incluse n majoritatea SGBD-urilor comerciale. Unele comenzi din acest limbaj sunt
descrise ntr-un paragraf urmtor.
6.1 Limbaj de interogare bazat pe algebra relaiilor
Pentru a explica limbajul de interogare bazat pe algebra relaiilor vom preciza la nceput
tipurile de condiii ce pot aprea n cadrul diferiilor operatori relaionali:
1. Pentru a verifica dac un atribut ndeplinete o condiie simpl, se face compararea
acestuia cu o anumit valoare, sub forma:

nume_atribut

valoare

2. Urmtoarea condiie testeaz dac o anumit valoare aparine sau nu unei mulimi:
nume_atribut

relaie

55

3. Dou relaii se pot compara prin operaiile de egalitate, diferit, incluziune,


neincluziune. Intre dou relaii cu acelai numr de coloane i cu aceleai tipuri de date
pentru coloane (deci ntre dou mulimi comparabile) putem avea condiii de
tipul urmtor:

4. O condiie poate fi oricare din construciile urmtoare:


(condiie)
NOT condiie
condiie1 AND condiie2
condiie1 OR condiie2
, unde condiie, condiie1, condiie2 sunt condiii de tipurile 1-4.
Pentru fiecare construcie se ia n consideraie o anumit relaie curent, care rezult din
contextul n care apare aceasta:
nume_atribut - care precizeaz valoarea atributului dintr-o anumit nregistrare. Dac
precizarea numai a numelui atributului creaz ambiguitate (exist mai multe relaii
curente care conin cte un atribut cu acest nume), atunci se va face o calificare a
atributului cu numele relaiei sub forma: relaie.atribut;
expresie - dac la evaluarea expresiei apar i denumiri de atribute, atunci acestea se iau
din nregistrarea curent;
COUNT(*) FROM relaie - precizeaz numrul de nregistrri din relaia precizat.

, care determin o valoare plecnd de la toate nregistrrile din relaia curent. La


determinarea acestui numr se consider toate valorile atributului precizat (din toate
nregistrrile), sau numai valorile distincte, dup cum lipsete sau apare clauza
DISTINCT. Valorile astfel determinate sunt: numrul de valori (pentru COUNT),
suma acestor valori (pentru SUM valorile trebuie s fie numerice), valoarea medie
(pentru AVG valorile trebuie s fie numerice), valoarea maxim (apare MAX), respectiv
valoarea minim (apare MIN).
In continuare se vor preciza operatorii care se pot folosi pentru interogarea bazelor de
date relaionale:
Selecia (sau proiecia orizontal) - determin o nou relaie care are aceeai schem cu
a unei relaii R. Din relaia R se iau numai nregistrrile care ndeplinesc o condiie c.
Notaia pentru acest operator este: c (R) .

56

Proiecia (sau proiecia vertical) - determin o relaie nou care are atributele precizate
printr-o mulime de atribute. Din fiecare nregistrare a unei relaii R se determin numai
valorile atributelor incluse n mulimea . Mulimea se poate extinde la o mulime de
expresii (n loc de o mulime de atribute), care precizeaz coloanele relaiei care se
construiete. Notaia pentru acest operator este: (R) .
Produsul cartezian al dou relaii: R1R2 - determin o relaie nou care are ca
atribute concatenarea atributelor din cele dou relaii, iar fiecare nregistrare din R1 se
concateneaz cu fiecare nregistrare din R2.
Reuniunea, diferena i intersecia a dou relaii: R1R2, R1 - R2, R1R2. Cele
dou relaii trebuie s aib aceeai schem.
Exist mai muli operatori join:
Joinul condiional, notat prin R1
c R2 - care determin acele nregistrri din produsul
cartezian al celor dou relaii care ndeplinesc o anumit condiie. Din definiie se
observ c avem: R1
c R2= c (R1 R2 ) .
Joinul natural, notat prin R1 R2, care determin o relaie nou ce are ca atribute
reuniunea atributelor din cele dou relaii, iar nregistrrile se obin din toate perechile de
nregistrri ale celor dou relaii care au aceleai valori pentru atributele comune. Dac
cele dou relaii au schemele R1[], R2[ ], i = {A1, A2 ,..., Am}, atunci joinul
natural se poate calcula prin construcia urmtoare:

Atribuirea: unei variabile (care va desemna o relaie) i vom atribui o relaie dat
printr-o expresie construit cu operatorii de mai sus.
Parcurgerea unei relaii, care nseamn luarea pe rnd a fiecrei nregistrri din relaie.
Inregistrrile din relaie se pot furniza sortate n raport cu anumite atribute din relaie:
scan relaie [sorted by list_de_atribute]
comenzi pentru o nregistrare curent
endscan
Stergerea unei relaii: erase nume.
Apelul unei proceduri scrie pentru extragerea de informaii.
Instruciuni (dintr-un limbaj pseudocod) pentru a descrie anumii algoritmi (de ex. if ...
then ...endif, instruciuni de atribuire pentru variabile numerice sau iruri de caractere).
In continuare se vor da cteva exemple de folosire a operatorilor amintii mai sus. Pentru
unele explicaii se vor folosi comentariile date ntre acolade. Pentru aceste exemple se va
folosi o baz de date ce conine urmtoarele relaii cu informaii dintr-o
universitate(coal):
STUDENTI [nume, prenume, nrmatricol, grupa, datan, sexul, adresa, media];
SALI [cod_grupa, cod_sala, profil, indrumator];
PROFILE [denumire, cod_grupa].
Exemple:
1. Se cer studentii (numele i prenumele) grupei E-211.
S:={nume,prenume}( grupa=E-211(studenti)); {mulimea cerut de studenti}
n:=0; {numrul curent pentru un student}
scan S sorted by nume, prenume {studentii se iau alfabetic}

57

n:=n+1;
scrie(n,nume, prenume);
endscan;
erase S;
2. Se cer ndrumtorii tiinifici ai grupelor de la profilul MEC.
I:={indrumator}(profil=MEC(SALI));
scan I sorted by indrumator
scrie(indrumator);
endscan;
erase I;
3. Se cer studenii grupelor de la profilul ELE.
S:= studenti
grupa=cod_grupa and profil=ELE (sali); {join condiional}
{n S sunt atributele din cele dou relaii folosite}
scan S sorted by nume,prenume
scrie(nume, prenume);
endscan;
erase S;
4. Se cer numele, prenumele, grupa i profilul grupei pentru toi studenii.
C:= sali * profile ; {join natural, atributul comun este cod_grupa}
S:= studenti
grupa=cod_grupaC; {join condiional}
scan S sorted by nume,prenume
scrie(nume, prenume);
endscan;
erase C;
erase S;
5. Pentru fiecare grup se cere numrul de studenti, media minim i media maxim.
g:=; {grupa curent}
n:=0; {numrul de studenti}
medmin:=10; {media minim}
medmax:=0; {media maxim}
scan studenti sorted by grupa
if g<>grupa then {se schimb grupa precedent}
if g <> then {nu este la prima grup}
scrie(g, n, medmin, medmax);
n:=0; {o noua grupa}
end if;
medmin:=media; {primul student din noua grup}
medmax:=media;
end if;
n:=n+1; {apare un nou student}
if medmin > media then

58

medmin:=media;
end if;
if medmax < media then
medmax:=media;
end if;
g:=studenti.grupa; {grupa curenta}
endscan;
scrie(g, n, medmin, medmax); {valori pentru ultima clas}
6. Se cer studenii de la grupele cu profil electric(ELE) sau mecanic(MEC), care au media
mai mare dect media general a studenilor de la aceste grupe.
C:={cod_grupa}(profil=ELE or profil=MEC(sali)); {codurile grupelor de la profilele cerute}
{C este o relaie cu o coloan, deci poate fi considerat ca o mulime}
S:= grupa in C(studenti); {studentii din grupele cu codurile n C}
F:= media >= avg(media)(S);
{studentii cu media mai mare sau egal dect media general a studentilor din S}
scan F sorted by nume, prenume, grupa
scrie(nume, prenume, grupa);
endscan;
erase C; erase S; erase F;
6.2 Limbajul SQL
Pentru gestiunea bazelor de date relaionale s-a construit limbajul SOL (Structured Query
Language), ce permite gestiunea tabelelor de date ntr-o form foarte simpl i
performant. Acest limbaj se folosete i pentru formularea cererilor de date la un server
de date folosind tehnologia client/server.
Dintre instruciunile limbajului SQL amintim n continuare numai comenzile Create
Table, Insert, Update, Delete, Select.
Pentru crearea unui tabel se folosete comanda:
CREATE TABLE nume_tabel
(definire_coloana [,definire_coloana] ...[, restricii_tabel])
Pentru definirea unei coloane din tabel se precizeaz:
un nume pentru coloan;
un tip al valorilor din aceast coloan, cu eventuale precizri ale dimensiunii
coloanelor;
restricii asociate coloanei (valorile pentru coloana respectiv trebuie s
ndeplineasc aceste restricii).
Pentru adugarea de nregistri ntr-un tabel se folosete comanda INSERT cu una din
formatele:
INSERT INTO nume_tabel [(lista_coloane)] VALUES (lista_valori)
INSERT INTO nume_tabel [(lista_coloane)] subinterogare
unde prin "subinterogare" se precizeaz o mulime de nregistrri (cu ajutorul comenzii
SELECT).
Modificarea datelor dintr-un tabel se poate realiza prin comanda:

59

UPDATE nume_tabel SET coloana=expresie [,coloana=expresie] ... [WHERE


condiie]
Se modific nregistrrile din tabel pentru care condiia din clauza WHERE are valoarea
true. n lipsa clauzei WHERE se consider toate nregistrrile din tabel. Valorile
coloanelor precizate n SET se schimb la valoarea expresiilor asociate.
Pentru tergerea de nregistrri dintr-un tabel se folosete comanda:
DELETE FROM nume_tabel [WHERE condiie]
Inregistrrile pentru care condiia din WHERE este adevrat se vor elimina din tabel.
Dac aceast clauz lipsete, se terg toate nregistrrile tabelului.
Comanda SELECT este folosit pentru interogarea bazelor de date relaionale, fiind
cea mai complex din cadrul SGBDR -urilor . Comanda permite obinerea de date din
mai multe surse de date. Ea poate realiza, printre altele, funciile de selecie, proiecie,
produs cartezian i reuniune din limbajul de interogare a bazelor de date relaionale bazat
pe algebra relaiilor. Sintaxa comenzii este dat n continuare.

Aceast comand selecteaz datele din relaiile surs precizate n clauza FROM. Pentru
precizarea (calificarea) cmpurilor (dac folosirea numai a numelui cmpului produce
ambiguitate, pt. c exist mai multe cmpuri cu acelai nume n sursele de date) se poate
folosi numele relaiei sau un nume sinonim (alias local) stabilit n clauza FROM dup
numele relaiei.
Dac n clauza FROM apar mai multe relaii, atunci ntre prima relaie - pe care o vom
numi relaie principal, i celelalte relaii este indicat s existe anumite legturi
(stabilite prin condiii). Plecnd de la fiecare nregistrare a relaiei principale se
determin nregistrrile din celelalte relaii asociate prin astfel de legturi (deci
nregistrrile care verific o condiie). Dac legtura (condiia) nu exist, atunci se
consider c ea asociaz toate nregistrrile din celelalte relaii pentru fiecare nregistrare
a relaiei principale (se consider c valoarea condiiei este true atunci cnd ea lipsete).
Pentru exemplificarea unor clauze din comanda SELECT vom considera urmtoarele trei
relaii:
SCOALA[Cod_Scoala, Nume, Adresa, Cod_Director],
PROFESOR[Cod_Prof, Nume, Disciplina, DataN, Telefon],
LEGATURA[Cod_Scoala, Cod_Profesor, Obs]
Semnificaia celor trei relaii simple este urmtoarea:
SCOALA - memoreaz unele informaii despre coli: un cod, numele, adresa, codul
directorului;

60

PROFESOR - pstreaz codul, numele, disciplina de baz, data naterii i telefonul


pentru diferii profesori;
LEGATURA - este o relaie de jonciune construit pentru a memora legturi de tipul
m:n (la o scoal lucreaz mai muli profesori, un profesor lucreaz la mai multe coli).
S presupunem c avem urmtoarea construcie ntr-o comand SELECT:
SELECT * FROM scoala, profesor, legatura
Dac nu stabilim nici o legtur ntre relaia scoala (relaie principal deoarece apare
prima) i celelalte relaii, atunci fiecare scoala va fi pus n corespondent cu fiecare
profesor i cu fiecare nregistrare din relaia legatura. Daca ns este numrul de coli
(numrul de nregistrri din relaie), np este numrul de profesori i nl este numrul de
nregistrri din relaia legatur, atunci vom obine ns*np*nl triplete de forma (scoala,
profesor, legatura), cu cte o nregistrare din fiecare relaie.
Fr condiii formulate se obine, aadar, produsul cartezian al celor trei relaii:
scoala profesor legatura
Pentru a elimina anumite triplete fr sens, sunt necesare legturi, stabilite prin anumite
condiii.
Fr astfel de legturi putem avea situaia n care o scoala se pune n coresponden cu un
profesor ce nu lucreaz la coala respectiv, iar la aceast pereche de nregistrri se
adaug o nregistrare din tabelul legtur fr nici o legtur cu coala i profesorul de
care se leag.
Avem nevoie de urmtoarele legturi:
plecnd de la o scoal vom lua numai acele nregistrri din tabelul legturi ce au
valoarea cmpului cod_scoala egal cu codul colii de la care se pleac;
plecnd de la o pereche de nregistrri scoala i legatura fixate la punctul precedent (n
nregistrarea din legtura exist i un cod de profesor), vom lua acele nregistrri din
relaia profesor ce corespund la profesorul precizat n legtur.
Aceste legturi se stabilesc prin dou condiii elementare legate cu operatorul AND:
scoala.cod_scoala = legatura.cod_scoala AND legatura.cod_profesor =
profesor.cod_prof
Dup cum se vede din aceast condiie, cmpurile din tabele se vor califica prin numele
tabelului din care fac parte. Dac numele este unic n lista surselor de date, atunci aceast
calificare se poate elimina.
Condiiile elementare de legtur dintre dou fiiere sunt de forma:
cmp1 operator cmp2 , unde operator poate fi: =, <>, >, >=, <, <=.
Cei doi termeni ai comparaiei trebuie s aparin la tabele diferite.
Plecnd de la tabelele din clauza FROM va rezulta o succesiune de nregistrri ce
ndeplinesc (sunt evaluate cu adevrat) condiia de legtur. Din aceast succesiune de
valori se pot setecta toate cmpurile din toate tabelele (apare clauza "*" dup numele
comenzii), sau se pot construi cmpuri ce au ca valoare rezultatul unor expresii
(expresiile se precizeaz cu ajutorul cmpurilor).
Numele cmpului din tabelul rezultat este stabilit automat de sistem (n functie de
expresia ce-l genereaz) sau se poate preciza prin clauza AS ce urmeaz expresiei (sau
cmpului). In acest fel putem construi valori pentru o nou nregistrare n "tabel nou".
In continuare vom da cteva exemple de construcii ce pot aprea ntr-o comand
SELECT.

61

1. SELECT nume, disciplina, datan FROM profesor


Aici apare un singur tabel, din care se selecteaz numai cele trei cmpuri precizate.
2. SELECT scoala.nume, profesor.nume
FROM scoala, profesor
WHERE scoala.cod_director = profesor.cod_prof
Din cele dou tabele (coala i profesor) se pune n coresponden cte o coal cu
directorul acesteia (un profesor), iar din aceast pereche se ia numele colii i numele
directorului.
3. SELECT nume, year(now()) - year(datan)) as varsta FROM profesor
Plecnd de la datele aflate n tabelul profesor, se afieaz numele fiecrui profesor i
vrsta acestuia. Aici se presupune c exist funciile now() care furnizeaz data curent i
year care extrage anul dintr-o dat calendaristic.
In "tabelul nou" se pot pstra toate nregistrrile rezultate din tabelele surs (apare ALL,
care este i valoarea implicit) sau numai nregistrrile distincte (apare DISTINCT).
Inregistrrile obinute n felul descris mai sus n "tabelul nou" pot fi restrnse (filtrate)
la cele care ndeplinesc o anumit condiie de filtrare, ce va fi trecut n clauza WHERE.
Condiia de filtrare din clauza WHERE poate fi compus prin operatorii logici AND i
OR.
Condiiile elementare de filtrare pot fi de una din formele urmtoare:
expresie operator_relational expresie
expresie [NOT] BETWEEN valmin AND valmax
pentru a verifica dac valoarea unei expresii este cuprins ntre dou valori (valmin i
valmax) sau nu este cuprins ntre aceste valori (apare NOT)
cmp (NOT) LIKE ablon
Dup LIKE apare un ablon (ca un ir de caractere) ce precizeaz o mulime de valori. n
funcie de sistemul de gestiune utilizat, exist un simbol special ce desemneaz locul unui
singur caracter necunoscut, sau un simbol ce exprim un ir neprecizat de caractere.

Se verific dac valoarea expresiei apare (sau nu - cu NOT) ntr-o list de valori sau ntro subselecie. O subselecie(subinterogare) este un "tabel nou" generat cu comanda
SELECT i care are numai un singur cmp - cu valori de acelai tip cu valorile expresiei.
Aceast condiie corespunde testului de "apartenen" a unui element la o mulime.
Exemple:
scoala.cod_scoala IN (L01, L02, L03)
profesor.cod_prof IN (SELECT cod_director FROM scoala)
In subselecia dintre paranteze se includ codurile directorilor tuturor colilor.

62

Valorile cmpului din stnga operatorului relaional i valorile singurului cmp din
subselecie trebuie s fie de acelai tip. Se obine valoarea adevrat pentru condiie dac
valoarea din partea stng este n relaia dat de operator pentru:

Exemple:
/* profesorii mai tineri dect orice director */
SELECT nume, datan FROM profesor
WHERE datan >= ALL
(SELECT datan FROM scoala, profesor
WHERE cod_director=profesor.cod_prof)
i
/* profesorii care au cel putin un director mai tnr dect ei */
SELECT nume, datan FROM profesor
WHERE datan <= ANY
(SELECT datan FROM scoala, profesor
WHERE cod_director=profesor.cod_prof)
Subselecia folosit precizeaz datele de natere pentru toi directorii colilor.
[NOT] EXISTS (subselectie)
Cu EXISTS se obine valoarea adevrat dac n subselecie exist cel puin o nregistrare
i fals dac subselecia este vid. Prezena lui NOT inverseaz valorile de adevr.
(condiie)
Inregistrrile din "tabelul nou" se pot ordona cresctor (ASC) sau descresctor (DESC)
dup valorile unor cmpuri, precizate n clauza ORDER BY. Cmpurile se pot preciza
prin nume sau prin poziia lor (numrul cmpului) n lista de cmpuri din comanda
SELECT (precizarea prin poziie este obligatorie atunci cnd se dorete sortarea dup
valorile unei expresii). Ordinea cmpurilor din aceast clauz precizeaz prioritatea
cheilor de sortare.
Mai multe nregistrri consecutive din surs pot fi grupate ntr-o singur nregistrare,
deci un grup de nregistrri se nlocuiete cu o singur nregistrare. Un astfel de grup este
precizat de valorile comune ale cmpurilor ce apar n clauza GROUP BY. "Tabelul
nou" se sorteaz (automat de ctre sistem) cresctor dup valorile cmpurilor din
GROUP BY.
Inregistrrile consecutive din fiierul astfel sortat, care au aceeai valoare pentru toate
cmpurile din GROUP BY, se nlocuiesc cu o singur nregistrare. Prezena unei astfel
de nregistrri poate fi condiionat de valoarea adevrat pentru o condiie ce se trece n
clauza HAVING.
63

Pentru grupul de nregistrri astfel precizat (deci pentru o mulime de valori) se pot folosi
urmtoarele cinci funcii:

Sau AVG([ALL] expresie)


Pentru grupul de nregistrri se iau toate valorile (cu ALL, care este i valoarea implicit)
sau numai valorile distincte (apare DISTINCT) ale cmpului sau expresiei numerice
precizate i din aceste valori se determin valoarea medie.

Aceast funcie determin numrul de nregistrri din grup (apare *), numrul de valori
ale unui cmp (apare ALL, identic cu *), sau numrul de nregistrri distincte din grup
(cu DISTINCT).

Sau SUM([ALL] expresie)


Pentru nregistrrile din grup se face suma valorilor unui cmp sau ale unei expresii
numerice (deci numrul de termeni este dat de numrul de nregistrri din grup sau suma
valorilor distincte ale cmpului).

Sau MAX([ALL] expresie) ori MIN([ALL] expresie)


Pentru fiecare grup se determin valoarea maxim sau minim.
Cele cinci funcii amintite mai sus (AVG, COUNT, SUM, MIN, MAX) pot aprea att
n expresiile ce descriu cmpurile din fiierul rezultat, ct i n clauza HAVING.
Deoarece aceste funcii se aplic unui grup de nregistrri din comada SELECT, acest
grup trebuie generat de clauza GROUP BY. Dac aceast clauz lipsete, atunci ntregul
"tabel nou" constituie un grup, deci tabelul rezultat va avea o singur nregistrare.
Exemplu (se folosete funcia month ce determin luna pentru o dat
calendaristic):
SELECT month (datan) AS luna, count(*) AS nr
FROM profesor GROUP BY luna
64

Se determin numrul de profesori ce s-au nscut n aceeai lun, pentru lunile n care
exist profesori nscui.
Dou tabele cu acelai numr de cmpuri i cu acelai tip pentru valorile
cmpurilor aflate pe aceleai pozitii se pot reuni ntr-un singur tabel obinut cu ajutorul
clauzei UNION. Din tabelul rezultat obinut se pot pstra toate nregistrrile (apare ALL)
sau numai cele distincte (nu apare ALL). Clauza ORDER BY poate apare numai pentru
ultima selecie. Nu se pot combina subselecii prin clauza UNION.
In continuare sunt date cteva exemple de folosire a comenzii SELECT:
1. Se cere un tabel cu numele i adresele colilor.
SELECT nume, adresa FROM scoala
2. Se cer profesorii (toate datele despre ei) ce aparin colii cu codul S308.
SELECT * FROM profesor, legatura
WHERE cod_prof=cod_profesor and cod_scoala=S308
3. Se cer profesorii (numele i vrsta) care au cel puin 40 de ani.
SELECT nume, year(now ()) - year(datan) AS varsta
FROM profesor WHERE year(now ()) - year (datan) >=40
4. Se cer directorii colilor.
SELECT scoala.nume AS scoala, profesor.nume AS director
FROM scoala, profesor
WHERE cod_director=profesor.cod_prof
5. Pentru fiecare coal se cere numrul de profesori.
SELECT nume, COUNT(*) AS Nr_Profesori FROM scoala AS s ,legatura AS l
WHERE s.cod_scoala = l.cod_scoala
GROUP BY nume
6. Se cer profesorii cu vrsta de 25 sau 35 de ani.
SELECT nume, year (now()) -year (datan) AS varsta
FROM profesor
WHERE year(now()) - year(datan) IN (25, 35)
7. Se cere numrul de profesori nscui n acelai an.
SELECT anul, COUNT(*) AS nr_prof
FROM (SELECT YEAR (datan) AS anul FROM profesor) AS tab_nou
GROUP BY tab_nou.anul
8. Pentru fiecare disciplin, se cere numrul de profesori cu aceeai disciplin de baz.
SELECT disciplina, COUNT(*) AS nr_prof
FROM profesor
GROUP BY disciplina

65

9. Se cer toate datele despre profesorii de la coala cu codul S308, cu vrsta mai mic
dect vrsta medie a profesorilor(din toate colile).
SELECT * FROM profesor AS P, legatura AS L
WHERE P.cod_prof = L.cod_profesor AND year (now( )) -year (datan) <
(SELECT AVG(year(now())-year(datan)) FROM profesor)
AND L.cod_scoala=S308
10. Se cer profesorii care sunt nscui n numr de 2 n acelai an.
SELECT nume, year (datan) AS Data_Nasterii
FROM profesor AS P
WHERE EXISTS
(SELECT count(P1.datan) from profesor P1
WHERE year(P.datan) = year(P1.datan)
GROUP BY year(P1.datan) HAVING count(P1.datan) =2)
11. Se cer profesorii al cror nume ncepe cu litera POP.
SELECT nume FROM profesor WHERE nume LIKE POP%

66

CAPITOLUL V. LIMBAJUL DE INTEROGARE A BAZELOR DE


DATE RELAIONALE
Se prezint, n detaliu, limbajul SQL(Structured Query Language) de interogare
a bazelor de date relaionale; la nceputul capitolului se definesc noiunile comune
limbajelor de interogare a datelor,indiferent de platforma de dezvoltare, pentru
componentele specifice unui SGBDR: limbajul de descriere a datelor LDD, limbajul de
manipulare a datelor LMD, limbajul de control al tranzaciilor LCT i cel de control
al securitii -LCS .Se expune apoi LDD(CREATE, ALTER, DROP, RENAME) i
LCS(GRANT, REVOKE) cu exemplificri n MySQL.

7. Limbajul SQL
Noiuni introductive
Limbajul SQL (Structured Query Language) este limbajul utilizat de majoritatea
sistemelor de baze de date relaionale (SGBDR) pentru definirea i manipularea datelor.
Din punct de vedere istoric ar trebui menionat faptul c limbajul SQL a fost
dezvoltat ntr-un prototip de sistem de gestiune a bazelor de date relaionale la IBM, n
1970. n 1979 corporaia Oracle a introdus prima implementare a limbajului SQL n
varianta comercial. n 1987 Institutul Naional de Standarde (ANSI) a elaborat
standardul limbajului SQL. Ulterior au avut loc mai multe revizii ale acestui standard.
Majoritatea limbajelor posed un set de instruciuni comun unanim acceptat de
toate marile companii productoare de soft, precum MICROSOFT sau ORACLE.
Termenii utilizai de limbajul SQL sunt :
- tabel (Table) utilizat pentru a desemna o relaie;
- linie (row) utilizat pentru a desemna un tuplu;
- coloan (column) utilizat pentru a desemna un atribut.
Componentele pe care le cuprinde limbajul SQL sunt urmtoarele:
1.
componenta de descriere a datelor relaionale (limbajul de descriere a datelor LDD),
2.
componenta de manipulare a datelor relaionale (limbajul de manipulare a datelor
- LMD),ambele fiind absolut necesare n gestiunea BD.
Pe lng aceste componente principale, standardul SQL2 mai prevede i alte
componente ale limbajului:
3.
controlul tranzaciilor;
4.
controlul securitii i refacerea datelor.

67

Controlul tranzaciilor conine comenzi pentru specificarea tranzaciilor. Unele


implementri adaug comenzilor prevzute n standard i alte comenzi suplimentare de
control al concurenei i refacerea datelor.
Controlul securitii i refacerea datelor conine comenzi de administrare a bazei
de date pentru definirea utilizatorilor i a drepturilor acestora de acces la tabele. Aceast
component este dependent de SGBD, iar pentru sisteme performante, administratorul
BD este obiectul activitii unei categorii speciale de utilizatori ai BD administratori ai
BD.

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 casesensitive; 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

68

operatori binari de comparaie


<
>
<=
>=
=
<> sau != diferit

operatori aritmetici mari


@ 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);

69

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
- 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

70

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;
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.

71

7.1. Limbaje relaionale de definire a datelor (LDD)

Limbajul de definire a datelor (a schemei unei BD) include instruciuni ce permit:


crearea schemei bazei de date;
adugarea relaiilor la schema bazei;
tergerea unor relaii existente;
adugarea de noi atribute relaiilor existente;
optimizarea bazei de date (index, grup, declanator);
definirea structurii fizice i logice a unei BD;
restricii cu privire la utilizarea structurii de mai sus.
Comenzi pentru crearea unei baze de date
Comanda pentru crearea unei baze de date este
CREATE DATABASE nume_baza;

Exemplu: S se creeze baza de date AGENTIA_IMOBILIARA.


CREATE DATABASE AGENTIA_IMOBILIARA;
Aceast comand creeaz o BD cu numele nume_baza. Nu toate SGBDR suport
noiunea explicit de BD, dei utilizarea unei asemenea noiuni poate facilita controlul
drepturilor de acces la relaiile BD. Sisteme precum DB2 nu posed noiunea explicit de
BD, n timp ce sistemul dBASE o suport.
Creatorul bazei de date devine automat administratorul BD.

Comenzi pentru suprimarea unei baze de date


Comanda pentru suprimarea unei baze de date este
DROP DATABASE nume_baza;
Aceast comand distruge BD cu numele nume_baza.

Comenzi pentru crearea relaiilor de baz

n cadrul acestor comenzi se precizeaz numele relaiei precum i numele i tipul


atributelor.
n SQL, cele mai frecvente tipuri de date sunt:
CHAR pentru ir de caractere de lungime fix;
VARCHAR2 pentru ir de caractere de lungime variabil;
NUMBER pentru numere ntregi sau reale de lungime variabil;
DATE pentru date calendaristice;
LONG pentru texte de lungime variabil
RAW pentru informaie binar de lungime variabil.
Comanda de creare a unei relaii este
CREATE TABLE nume_tabela (atribute);

72

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;

Exemplu: S se modifice numele relaiei LOCALITATI_CLUJ n LOC_CJ, apoi s se


suprime relaia LOC_CJ.

73

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
Constrngerile declarative pot fi:
- constrngeri de domeniu, care definesc valorile luate de un atribut:
DEFAULT
NOT NULL
UNIQUE
CHECK
74

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


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

MODIFY

Exemplu: S se modifice una din constrngerile din exemplul de mai sus.


ALTER TABLE DESCRIERE_IMOBIL MODIFY

75

(nume_atribut

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.
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;

76

7.2 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 (DB2, 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
REVOKE UPDATE ON nume_tabela FROM nume_utilizator;

Exemplu: S se retrag drepturile utilizatorului Zita de actualizare a datelor.


REVOKE UPDATE ON DESCRIERE_IMOBIL FROM Zita;
7.3. Exerciii de fixare a noiunilor
1. 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.
2. Ce este SQL?
3. Care sunt limbajele SQL?

77

4. Explicai care este rezultatul returnat de fiecare dintre urmtoarele funcii: MAX,
MIN, COUNT, SUM, AVG.
5. Precizai care sunt rezultatele generate de comanda ALTER TABLE...ADD.
6. Creai tabelul salariat avnd urmtoarea structur:
Nume
cod_angajat
nume
prenume
functia
sef
data_angajarii
varsta
email
salariu

Caracteristici
NOT NULL

Valoare implicit 0

Tipul
INTEGER(4)
VARCHAR(25)
VARCHAR(25)
VARCHAR(20)
INTEGER(4)
DATE
NUMBER
CHAR(10)
DECIMAL(9,2)

Fig. 3. Structura tabelului SALARIAT (prima form)


7. Pentru baza de date COLECTIE_MUZICA, definit anterior, s se execute toate
comenzile pentru:
- 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.
8. Exersai aceleai comenzi pentru baza de date
FURNIZORI_COMPONENTE.
9. tergei i apoi creai din nou tabelul salariat cu urmtoarea structur:
NUME
TIP
CONSTRNGERE
cod_ang
INTEGER(4)
Cheie primar
nume
VARCHAR(25)
NOT NULL
prenume
VARCHAR(25)
data_nasterii
DATE
data_nasterii<data_angajarii
functia
VARCHAR(9)
NOT NULL
Refer ca i cheie extern
sef
INTEGER(4)
cod_ang din acelai tabel
data_angajarii
DATE
email
VARCHAR(20)
unic
salariu
DECIMAL(12,3)
>0
cod_dept
INTEGER(4)
NOT NULL
Combinaia NUME +
PRENUME s fie unic
Fig. 4. Structura tabelului SALARIAT (a doua form)
78

10.
tergei tabelul salariat, iar apoi recreai-l implementnd toate constrngerile la
nivel de tabel.
Observaie: Constrngerea de tip NOT NULL se poate declara doar la nivel de coloan.

79

CAPITOLUL VI. LIMBAJE RELAIONALE DE MANIPULARE A


DATELOR (LMD) - INTEROGAREA DATELOR
Se prezint, n detaliu, sintaxa instruciunii SELECT de extragere a datelor din
unul sau mai multe tabele ale unei baze de date, cu utilizarea diferitelor clauze;
expunerea se ncheie cu preyentarea celor mai cunoscute tipuri de funcii.
Limbajele de manipulare a datelor trebuie s ofere o serie de faciliti pentru
prelucrarea datelor din relaiile bazei de date i anume:
- interogri
- inserri
- modificri
- tergere.
8.1. Interogarea datelor
Interogarea bazei de date reprezint principala funcie a unui limbaj relaional de
manipulare a datelor.
Comanda fundamental a standardului SQL este SELECT, aceasta permind
interogarea unei baze de date.
Interogarea reprezint o ntrebare care i extrage rspunsul din baza de date.
Componentele interogrii se numesc clause.
Sintaxa general a comenzii SELECT este urmtoarea:
SELECT [ALL/DISTINCT/UNIQUE] list de selecie
FROM list de relaii (tabele)
WHERE condiie de cutare asupra liniilor
GROUP BY list de atribute care permit partiionarea
HAVING condiie asupra partiiilor
ORDER BY list de atribute;
Clauzele SELECT i FROM sunt obligatorii. SELECT specific datele care se
selecteaz, iar clauza FROM specific relaiile din care se selecteaz. Restul clauzelor
sunt opionale.
Exemplul 1: S se selecteze toate persoanele mpreun cu toate datele personale ale
acestora existente n baza de date.
SELECT * FROM DATE_PERSOANA;
Exemplul 2: S se selecteze toate ofertele/cererile nregistrate n data de 2006-07-03.
SELECT * FROM CERERI_OFERTE
WHERE data_inreg=2006-07-03;

80

Interogarea datelor folosind operatorii IS i IS NOT


Exemplu: S se selecteze numele tuturor persoanelor care nu au completat adresa de
email, apoi s se afieze numele tuturor persoanelor care au numrul de telefon
completat.
SELECT numele FROM DATE_PERSOANA
WHERE email IS NULL;
SELECT numele FROM DATE_PERSOANA
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 (70000.00,80000.00,90000.00);

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:

81

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;

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;

82

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
- 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.

83

8.2. 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. 8.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.

84

Exemplu:
A

B
1:n

JUDETE
simbol_judet#
nume_judet

LOCALITATI
cod_loc#
simbol_judet
nume_judet

Fig. 8.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

B
1:n

LOCALITATI
cod_loc#
simbol_judet#
nume_judet

1:n

STRAZI
id_strada#
cod_loc#
nume_str

Fig. 8.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 identificare (prin

85

'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. 8.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.

86

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.

87

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.
SELECT L.nume_loc, CO.*, S.nume_str, DI.tip_imobil,
DI.nr_camere, DI.suprafata, DI.garaj,
88

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.

Interogarea datelor din mai multe relaii folosind instruciunea UNION

Sintaxa interogrii datelor din mai multe relaii folosind instruciunea UNION 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
89

UNION ALL
SELECT nume, prenume FROM STUDENTI;
Rezultatul generat de interogare va fi
nume
POP
ION

prenume
VASILE
ANA

Fig. 8.5. 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 ntro list id_ul cererii/ofertei i cnp-ul cleintului, att din tabela CERERI_OFERTE ct i din
tabela FACTURI.
SELECT cnp, id_co,data_factura FROM FACTURI
UNION ALL
SELECT cnp, id_co,data_inreg FROM CERERI_OFERTE;
Rezultatul generat de interogare va fi o lista greu de urmrit, dup cum este i cea din figura
8.5, deoarece nu se specific clar care inregistrare corespunde facturilor, i care tabelei
CERERI_OFERTE (acest neajuns va fi nlturat utiliznd concatenarea):

Fig. 8.6. Interogarea mai multor relaii folosind operatorul UNION ALL (cazul neclar)

90

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 clientului, att din tabela 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 facturi_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:

91

Fig. 8.7. Interogarea mai multor relaii folosind concatenarea (cazul mai clar)
Observaie: Concatenarea prezint dezavantajul afirii cmpurilor null.

a)

Interogarea datelor folosind funciile totalizatoare


MAX
MIN
COUNT
SUM
AVG
Interogarea datelor folosind funcia MAX
Sintaxa:

SELECT 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


92

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

SELECT 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
SELECT 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
SELECT 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;
d)

Interogarea datelor folosind funcia SUM


Sintaxa

SELECT 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
93

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;

Interogarea datelor folosind instruciunea GROUP BY


Prin instruciunea GROUP BY se grupeaz datele dup fiecare produs n 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:

Fig. 8.8 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 de eroare
este aceea a introducerii unor cmpuri dup care se grupeaz n clauza SELECT i
neintroducerea lor n clauza GROUP BY.

Interogarea datelor folosind instruciunea HAVING

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.
94

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.
8.3. Funcii utilizate n interogri

a)
b)
c)
d)

Cele mai des ntlnite funcii n interogri sunt:


funcii pentru iruri de caractere
funcii pentru valori numerice
funcii pentru date calendaristice
funcii de conversie dintr-un tip n altul.

a) 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 UPPER('LITERE mari');
-

95

-> '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,'?');
->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 SUBSTR('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 fracionare
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);
96

->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);
->-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 HHMM-SS;
SELECT SYSDATE();
-> 2006-08-15 15:06:44
- CURRENT_TIMESTAMP(), NOW(), SYSTIMESTAMP: sunt sinonime cu
SYSDATE;
- DATE_ADD (data,INTERVAL 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
97

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.
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 acestora.
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. 8.9. Utilizarea funciilor CONCAT i SUSTR

98

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;

Fig. 8.10. 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. 8.11. Utilizarea funciei DAYOFMONTH (a), (b)

99

8.4. Exerciii de fixare a noiunilor


1. 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.
2. S se afieze numele clienilor care au achiziionate ntre 3 i 10 imobile, din baza
de date AGENTIE_IMOBILIARA.
3. 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;
4. 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.
5. Afiai lista cu toi interpreii i cu albumele lor existente n baza de date
COLECTIE_MUZICA, ordonnd dup interprei.
6. Vizualizai aceeai list de mai sus existent pe casete audio.
7. Care dintre interprei figureaz i pe CD i pe casete audio?
8. Descriei tipurile de JOIN utilizate n procesul de interogare a relaiilor unei baze
de date.

100

9. Pentru toate interogrile de mai sus, s se formuleze fraze SELECT att cu


ajutorul clauzei WHERE ct i cu ajutorul operaiilor de JOIN.
10. Fie baza de date H-R cu diagrama reprezentat n figura 6.
manage
s

11.
DEPARTMENTS
Department_id
Department_name
Manager_id
Location_id

EMPLOYEES
employee_id
first_name
last_name
salary
Manager_id
Department_id
Job_id
Location_id

belongs
to

Located
in
LOCATIONS
location_id
country_id
street_address
city

is manager of
has job

JOBS
job_id
job_title
min_salary
max_salary

Located in
(2)
COUNTRIES
country_id
country_name
region_id

Located in
(3)

JOB_HISTORY
employee_id
start_date
end_date
job_id
department_id

REGIONS
region_id
region_name

Fig. 5. Diagrama bazei de date H-R

101

JOB_GRADES
Grade_level
Lowest_sal
Highest_sal

n ipoteza n care tabelele au fost populate 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).
11. S se afieze numele departamentelor i numele salariailor care lucreaz n ele. Se vor
afia i departamentele care nu au salariai. (left outher join).

102

CAPITOLUL VII. UTILIZAREA LIMBAJULUI TRANSACT SQL


(T-SQL) DE INTEROGARE A BAZELOR DE DATE
MICROSOFT SQL SERVER
Se presupune c ntr-o instan Microsoft SQL Server 2005/2008 avem creat baza de date
angajat, cu tabelele emp care conine angajaii unei firme i dept---care descrie
departamentele din care fac parte angajaii (cu diagrama de relaii i structura date mai jos),
populate cu date care s respecte structura propus:
emp
empno
ename
job
mgr
hiredate
sal
comm
deptno

dept
deptno
dname
loc

Structura tabelelor:
Tabelul emp
Semnificaie coloan
Codul angajatului (cheie
primar)
NULL
varchar(50)
Numele angajatului
NULL
varchar(9)
Job-ul angajatului
NULL
numeric(4,0) Codul managerului
NULL
datetime
Data angajrii
NULL
numeric(7, 2) Salariul angajatului
NULL
numeric(7, 2) Comisionul angajatului
NOT NULL numeric(2,0) Nr. departamentului
angajatului(cheie strin)

Coloan Allow Nulls Data Type


NOT NULL numeric(4,0)
empno
ename
job
mgr
hiredate
sal
comm
deptno

103

Tabelul dept

Coloan Allow Nulls Data Type


NOT NULL numeric(2,0)
deptno
dname
loc

NULL
NULL

varchar(14)
varchar(13)

Semnificaie coloan
Numrul departamentului (cheie
primar)
Numele departamentului
Locaia departamentului

9. 1. Exerciii propuse pentru rezolvare de ctre studeni - Utiliznd limbajul de


interogare a datelor Microsoft Transact SQL
S se scrie instruciunile Microsoft Transact-SQL care s afieze urmtoarele informaii:

I.

Utilizarea instruciunii SELECT i a diferitelor clauze ale acesteia:

1. S se afieze coninutul tabelelor emp i dept, apoi s se afieze numrul de


nregistrri ale fiecreia.
2. Afiai job-urile unice din tabela emp.
3. Afiai numele i salariul angajailor care ctig mai mult de 2850$.
4. Afiai numele i departamentul pt. angajatul cu codul 7566.
5. Afiai numele, job-ul i data angajrii pentru salariaii care au venit ntre 20.02.1981
i 1.05.1981.
6. Afiai numele i salariul pt. toi angajaii ale cror salarii nu aparin intervalului
[1500; 2850].
7. Afiai numele i departamentul angajailor din departamentele 10 i 30, n ordinea
alfabetic a numelor.
8. Afiai numele i salariul angajailor din departamentele 10 i 30, n ordinea
cresctoare a salariilor, pt. angajaii care ctig mai mult de 1500$. Etichetai
coloanele Nume angajat i Salariu lunar.
9. Afiai numele i data angajrii pt. salariaii din 1982(angajai n acest an).
10. Afiai numele i job-ul angajailor care nu au un manager.
11. Afiai numele, salariul i comisionul angajailor care primesc comision; sortai datele
n ordinea descendent a salariului i comisionului.
104

12. Afiai numele angajailor care conin litera C sau c pe a treia poziie a numelui lor.
13. Afiai numele tuturor angajailor care au doi de L n nume i sunt n departamentul 30
sau al cror cod de manager este 7782.
14. Afiai numele, job-ul i salariul angajailor cu job-ul CLERK sau ANALYST i
salariul diferit de 1000, 3000 sau 5000.
15. Afiai numele, job-ul , salariul i comisionul angajailor cu comisionul mai mare
dect salariul crescut cu 10 %.
II.

Utilizarea instruciunii SELECT i a funciilor:

1. Afiai data curent.


2. Afiai codul angajatului, numele, salariul i salariul crescut cu 15% exprimat ca
numr ntreg, precum i creterea salarial.
3. Afiai numele, data angajrii i data de revizuire a salariului (dup 6 luni de
serviciu).
4. Afiai numele angajailor cu prima liter upper i celelalte lowercase, apoi lungimea
numelor, pentru toi angajaii ale cror nume ncep cu litera J, A sau M.
5. S se afieze datele despre angajaii care au jobul CLERK sau ANALYST i ctig
mai mult de 1000$.
6. S se afieze datele despre angajaii care au jobul MANAGER i ctig mai mult de
1500$.
7. S se afieze datele despre angajaii care au jobul CLERK sau ANALYST, angajai
dup 1981 i care lucreaz n departamentul 20.
8. S se afieze numele, jobul, salariul i comisionul angajailor care au salariul mai mare
dect comisionul; sortai datele n ordinea descendent a diferenei dintre salariu i
comision.
9. Afiai numele angajailor a cror a treia liter a numelor este A(cutare case
senzitiv).
(Indicaie: vezi clauza COLLATE)
10. Afiai Afiai numele i salariul pt. toi angajaii ale cror salarii aparin intervalului
(1500; 2850] sau (500,1200).

105

III.

Utilizarea instruciunii SELECT n subinterogri

1. S se afieze angajaii cu salariul mai mare dect salariul angajatului cu codul 7566.
2. S se afieze angajaii care au acelai job cu cel al angajatului cu codul 7369.
3. S se afieze angajaii cu acelai job ca i angajatul cu codul 7369 i cu salariul mai
mare dect al angajatului cu codul 7876.
4. Utilizare funcii de grup ntr-o interogare: S se afieze numele, jobul i salariul
angajailor cu salariul minim.
5. Utilizare clauz HAVING n subinterogare: S se afieze toate departamentele cu
salariul minim mai mare dect salariul minim din departamentul 20.
6. Afiai jobul cu cel mai mic salariu mediu.
7. S se afieze numele, salariul i numrul departamentului pentru angajaii cu salariul
egal cu salariul minim din departamente.
8. S se afieze angajaii cu salariul egal cu 800, 950 sau 1300.
9. S se afieze codul, numele i jobul angajailor cu salariul mai mic dect cel al oricrui
funcionar i care un sunt funcionari.
10. S se afieze angajaii cu salariul mai mare dect media salariilor din toate
departamentele.
11. S se afieze angajaii care au subordonai (sunt efi).
12. Folosire subinterogare n clauza FROM: S se afieze angajaii cu salariul mai mare
dect salariul mediu al departamentului din care fac parte.
13. S se afieze angajaii (nume, nr. departament, salariu i comision) ale cror salariu i
comision sunt identice cu cele ale oricrui angajat din departamentul 30.

IV.

Utilizarea instruciunii SELECT n gruparea datelor(funcii de grup)

1. S se afieze media, maximum, minimum i suma salariilor lunare pentru toi angajaii
cu jobul SALESMAN.
2. S se afieze numele angajatului cu cea mai mare vechime n munc i cel mai nou n
firm.
3. S se afieze primul i ultimul angajat din punct de vedere alfabetic.
4. S se afieze numrul de angajai din departamentul 30.
106

5. S se afieze numrul distinct de departamente din tabela emp.


6. S se afieze valoarea medie a comisioanelor angajailor din firm.
7. Utilizare clauz GROUP BY: S se afieze numrul departamentului i salariul mediu
pe departament.
8. Utilizare clauz GROUP BY: S se afieze salariul total pltit pe fiecare job n cadrul
fiecrui departament.
9. S se afieze salariul mediu maxim din firm.
10. S se afieze numrul departamentului i salariul mediu al acestuia, pentru fiecare
departament din firm.
11. S se afieze numrul de persoane care au acelai job.
12. S se afieze numrul de manageri(efi) existeni n tabela de angajai.
9.2. Exerciii rezolvate - Utiliznd limbajul de interogare a datelor Microsoft Transact
SQL
S se scrie instruciunile Microsoft Transact-SQL care s afieze urmtoarele informaii:
I.

Utilizarea instruciunii SELECT i a diferitelor clauze ale acesteia:

1. S se afieze numele angajailor, concatenat cu jobul, separat de o virgul i un spaiu,


sub aliasul Angajat si titlu.
SELECT ename+, +job AS [Angajat si titlu] FROM emp
2. S se afieze coninutul tabelei emp i apoi numrul de nregistrri.
SELECT * FROM emp
SELECT Tabela emp: , COUNT(*) AS [Nr. De inregistrari]
FROM emp
3. S se afieze numele angajailor a cror a treia liter a numelor este A.
SELECT ename FROM emp WHERE ename COLLATE
Latin1_General_Cs_As
LIKE __A
4. S se afieze angajaii din departamentul 30, folosind alias-uri adecvate.
SELECT In departamentul +STR(deptno)+ sunt ,
STR(COUNT(*))+ angajati! FROM emp
WHERE deptno = 30
GROUP BY deptno
5. Afiai numrul de manageri existeni n tabela de angajai.
SELECT COUNT(DISTINCT(mgr)) [Nr. de manageri]
FROM emp
107

II.

Utilizarea instruciunii SELECT n subinterogri:


1. S se afieze numele i data angajrii pentru toi angajaii din acelai
departament cu Blake (excludei Blake)
SELECT ename, hiredate
FROM emp
WHERE deptno IN
(SELECT deptno FROM emp
WHERE ename = Blake)
AND ename < > Blake
2. S se afieze codul i numele angajailor care ctig mai mult dect media
salariilor din firm; sortai rezultatul n ordinea descendent a salariilor.
SELECT empno [Codul angajat], ename [Numele]
FROM emp
WHERE sal > (SELECT AVG(sal) FROM emp)
ORDER BY sal DESC
3. Afiai codul i numele tuturor angajailor care lucreaz ntr-un departament
care are i angajai al cror nume conine pe T sau t.
SELECT empno [Codul angajat], ename [Numele]
FROM emp
WHERE deptno IN (SELECT deptno FROM emp WHERE ename LIKE
%T%)
4. Afiai numele, numrul departamentului i jobul tuturor angajailor a cror
locaie de departament este Dallas:
SELECT ename, deptno, job
FROM emp
WHERE deptno IN
(SELECT deptno FROM emp
WHERE loc = Dallas)
5. Afiai numele i salariul angajailor subordonai lui King.
SELECT ename, sal
FROM emp
WHERE mgr IN
(SELECT empno FROM emp WHERE ename=King)
6. Afiai numrul departamentului, numele i jobul angajailor din departamentul
Sales.
SELECT dept, ename, job
FROM emp
WHERE deptno IN
(SELECT deptno FROM dept WHERE dname=Sales)
7. Afiai codul, numele i salariul angajailor care ctig mai mult dect
salariul mediu din firm i care lucreaz n departamentele care au cel puin un
angajat care are litera T n nume.
108

SELECT empno, ename, sal


FROM emp
WHERE sa l>
(SELECT AVG(sal) FROM emp )
AND deptno IN
(SELECT deptno FROM emp WHERE ename LIKE %T%)
III.

Utilizarea instruciunii SELECT n gruparea datelor(funcii de grup)


1. Salariul maxim, minim, suma i media acestuia pentru toi angajaii; rotunjii
rezultatul la prima poziie zecimal .
SELECT ROUND(MAX(sal), 0) Maxim,
ROUND(MIN(sal), 0) Minim,
ROUND(SUM(sal), 0) Suma,
ROUND(AVG(sal), 0) Media,
FROM emp
2. Afiai maximul, minimul i suma salariilor pentru fiecare tip de job.
SELECT job, ROUND(MAX(sal),0) [Maximul],
MIN(sal) Minimul,
SUM(sal) Suma,
AVG(sal) [Media salariului]
FROM emp
GROUP BY job
3. Afiai numrul de persoane cu acelai job.
SELECT job, COUNT(*) [Nr. de persoane]
FROM emp
GROUP BY job
4. Afiai codul managerului i cel mai mic salariu al angajailor care-l au ca
manager ; excludei angajaii care nu au manager i grupurile de angajai care
au salariul minim mai mic dect 1000; sortai rezultatul n ordinea
descresctoare a salariului.
SELECT mgr, MIN(sal)
FROM emp
WHERE mgr IS NOT NULL
GROUP BY mgr
HAVING MIN(sal) > 1000
ORDER BY MIN(sal) DESC
Verificare (pentru un manager):
SELECT MIN(sal) FROM emp
WHERE mgr = 7566
5. Afiai numele i locaia departamentului, nr. de angajai i salariul mediu
pentru toi angajaii din acel departament.
SELECT d.dname, d.loc,
COUNT(*) [Nr. de angajati],
ROUND(AVG(sal), 2) [Salariul mediu]
FROM emp e, dept d
WHERE d.deptno = e.deptno
GROUP BY d.dname, d.loc
109

6. S se afieze numrul de angajai din fiecare an calendaristic.


SELECT YEAR(hiredate) [Anul angajarii],
COUNT(hiredate) [Nr. de angajati]
FROM emp
GROUP BY YEAR(hiredate)
Verificare:
SELECT YEAR(hiredate) [Anul angajarii],
COUNT(hiredate) [Nr. de angajati]
FROM emp
WHERE YEAR(hiredate) = 1981
GROUP BY YEAR(hiredate)
7. S se afieze numrul departamentului, joburile din departament (tipurile) i
suma salariilor pentru joburile respective.
SELECT deptno, job, SUM(sal) [Suma salariilor pe job]
FROM emp
GROUP BY job, deptno --(executie de la dreapta la stanga)
Verificare:
SELECT deptno, ename, job,sal
FROM emp
ORDER BY deptno, job
--faceti suma pe joburi in fiecare departament si comparati

110

BAZE DE DATE.......................................................................................................................2
CAP. I. PROIECTAREA BAZELOR DE DATE RELAIONALE.3
1. Preliminarii.3
2. Construirea de diagrame entitate-relaie
9
CAP. II. PREZENTAREA BAZELOR DE DATE RELAIONALE.19
3. Proiectarea modelului relaional..19
3.1 Structura relaional a datelor.19
3.2 Operatorii modelului relaional...22
3.3 Restricii de integritate ale modelului relaional. 35
3.4 Exerciii de fixare a noiunilor 40
CAP. III. OPTIMIZAREA STRUCTURII BAZELOR DE DATE RELAIONALE.44
4. Prelucrarea/evaluarea i optimizarea cerinelor44
5. Tehnica normalizrii relaiilor. 47
5.1 Prima form normal (FN1)48
5.2. A doua form normal (FN2).. 51
5.3. A treia form normal (FN3). 53
5.4. Exerciii de fixare a noiunilor.. 54
CAP. IV. MANIPULAREA BAZELOR DE DATE RELAIONALE. 55
6.1 Limbaj de interogare bazat pe algebra relaiilor......................................................... 55
6.2 Limbajul SQL............................................................................................................. 59
CAP. V. LIMBAJUL DE INTEROGARE A BAZELOR DE DATE RELAIONALE 67
7. Limbajul SQL... 67
7.1. Limbaje relaionale de definire a datelor (LDD)..72
7.2. Comenzi pentru acordarea drepturilor de acces la baza de date..77
7.3. Exerciii de fixare a noiunilor.77
CAP.VI. LIMBAJE RELAIONALE DE MANIPULARE A DATELOR (LMD) INTEROGAREA DATELOR.. 80
8.1. Interogarea datelor.. 80
8.2. LMD - Interogarea datelor din mai multe relaii.. 84
8.3. Funcii utilizate n interogri 95
8.4. Exerciii de fixare a noiunilor
100
CAP. VII. UTILIZAREA LIMBAJULUI TRANSACT SQL (T-SQL) DE INTEROGARE A
BAZELOR DE DATE MICROSOFT SQL SERVER...... 103
9. 1. Exerciii propuse -Interogri baz de date utiliznd Microsoft Transact.................104
9.2. Exerciii rezolvate - Interogri baz de date utiliznd Microsoft Transact SQL...107

111

Bibliografie
1. Ardeleanu tefan, Transact SQL, Ed. Niculescu, Bucureti, 2004.
2. Fotache Marin, SQL. Dialecte DB2, Oracle i Visual FoxPro, Polirom, 2001.
3. Lungu Ion, Constanta Bodea, Georgeta Bdescu, Cristian Ioni, Baze de dateOrganizare, proiectare i implementare, Ed. ALL Educational, Bucureti, 1995.
4. Popescu Ileana, Baze de date relaionale-proiectare i implementare, Editura
Universitii din Bucureti, 1996.
5. Popescu Mihai, Baze de date relaionale, Ed. Academiei Tehnice Militare,
Bucureti, 2001.
6. Tilca Magnolia, Boriga Radu, Baze de date, Ed. Univ. Titu Maiorescu,
Bucureti, 2007.

112

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