Documente Academic
Documente Profesional
Documente Cultură
Facultatea de INFORMATIC
Conf. univ. dr.
MIHAI POPESCU
BUCURETI 2014/2015
BAZE DE DATE
(Curs Facultatea de Informatic, anul II ID, Semestrul II)
Obiective:
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)
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
1.3
1.
2.
3.
4.
3. ncrcarea
datelor
2. Proiectarea
LMD
4. ntreinerea
LMD, LDD
LDD
Baza
de
date
LMD
4. Exploatarea
1.4
1.
2.
3.
4.
5.
6.
7.
FACTURI
LOCALITATI
JUDETE
DESCRIERE_
IMOBIL
STRAZI
(1,1)
(0,1)
sunt finalizate
prin
CERERI_OFERTE
FACTURI
CERERI_
OFERTE
1
2
3
FACTURI
F1
F2
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
ii.
1.
Asocieri de tip unu la unu sunt asocieri n care maximele cardinalitii au
valoarea 1.
(...,1)
E1
(...,1)
E2
(...,n)
A
E1
(...,n)
E2
(...,1)
A
E1
E2
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)
E2
Exemplu:
DEPOZIT
PRODUS
D1
D2
D3
(0,n)
P1
P2
P3
(0,n)
DEPOZIT
nmagazi
neaz
PRODUS
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
(,)
E1
(,)
E2
(0,)
E1
a)
E2
b)
(1,)
E1
E2
a)
(1,)
(n,)
E1
(n,)
E2
E1
b)
(n,)
E1
(1,)
E2
c)
(n,)
E2
d)
FACTURI
F1
F2
13
CERERI_
OFERTE
1
2
3
I1
I2
I3
LOCALITATI
L1
L2
L3
1
2
3
ELEVI
E1
E2
E3
E4
PRODUS
D1
D2
D3
D4
P1
P2
P3
STUDENTI
C1
C2
C3
S1
S2
S3
S4
a#
E
(a)
E
(b)
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
CERERI_OFERTE
id_strada
nr_imobil
pret_min
pret_max
tip_solutionare
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
2.1
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
18
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
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
sau
R:
D1
D2
2661805270023
1701205230023
D3
2006-05-27
2006-07-03
Da
Nu
Atributul
2661805270023
1701205230023
2006-05-27
2006-07-03
soluionare:D3
Da
Nu
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
Reuniunea
22
Reprezentarea grafic
R3
R1
R2
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
Diferena
23
Reprezentarea grafic:
R3
R1
R2
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
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
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
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
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
Jonciunea
atribut
din R2
Operator de
comparaie
R1
R2
operator de comparaie
atribut din R2
atribut din R2
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
2560405570053
nr_
telefon
0744304505
nr_
id_co cnp
factura#
22
43
1551212245038
0721435622
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
cnp
numele
adresa
nr_telefon
nr_
factura
id_co
1551212245038
Pop
Radu
0744304505
22
43
cnp
cnp
=
DATE_PERSOANA:
FACTURI:
cnp#
numele
adresa
1551212245038
Pop
Radu
Chis
Alina
2560405570053
nr_
telefon
0744304505
nr_
id_co cnp
factura#
22
43
1551212245038
0721435622
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
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
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
Semijonciunea
R1
R2
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
Intersecia
R1
R2
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
Diviziunea
Complementarea
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
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
(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)
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
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
DATE_PERSOANA
are
reedina
(1,1)
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 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
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:
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
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)
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
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
43
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
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
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
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.
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
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
52
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
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
54
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
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
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
61
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:
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).
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
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
Operatori SQL
SQL are urmtorii operatori:
68
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
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 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.
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.
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.
`
71
72
73
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
MODIFY
75
(nume_atribut
76
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)
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
80
81
82
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;
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 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
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
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
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
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:
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
CO,
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.
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
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)
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)
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)
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:
a)
b)
c)
d)
95
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
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;
(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
100
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
101
JOB_GRADES
Grade_level
Lowest_sal
Highest_sal
102
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)
103
Tabelul dept
NULL
NULL
varchar(14)
varchar(13)
Semnificaie coloan
Numrul departamentului (cheie
primar)
Numele departamentului
Locaia departamentului
I.
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.
105
III.
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.
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
II.
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