Documente Academic
Documente Profesional
Documente Cultură
P
R
Exemplu.
( ) R P
C , A
=
R
A B C
x u x
z x y
x z x
z y y
x t x
P A C
x x
z y
x x
z y
x x
P
A C
x x
z y
Sintaxa:
PROJECT (R; lista atribute) - rezultatul este o relaie.
lista atribute
22
Observaii.
1. Dac n lista atributelor de proiecie exist o cheie a relaiei operand R, atunci
relaia rezultat are toate tuplurile distincte, adic relaiile R i P vor avea acelai
cardinal.
2. Dac n lista atributelor de proiecie nu exist o cheie a relaiei operand R, atunci
n relaia rezultat P pot apare tupluri duplicate care vor fi eliminate. n exemplul
prezentat dup eliminarea tuplurilor duplicate din relaia intermediar P , s-a
obinut relaia P care conine dou tupluri distincte.
3. Relaia rezultat P are gradul k, dat de numrul atributelor din list.
4. n termenii limbajului de interogare SQL, operaia de proiecie realizeaz o
decupare pe vertical a tabelei operand R.
7. JOIN este o operaie definit pe dou relaii R
1
i R
2
. Relaia rezultat R
3
va fi
construit prin concatenarea unor tupluri din R
1
cu tupluri din R
2
care satisfac o
anumit condiie (condiia de jonciune - ) specificat explicit n cadrul relaiei.
Condiia de jonciune - este o expresie logic (predicat) specificat asupra
atributelor relaiilor R
1
i R
2
. Condiia de jonciune - poate cuprinde nume de
atribute, constante, operatori logici (and, or, not), operatori aritmetici de comparare
(<, >, =, , , ).
Signatura: latie Re resie exp latie Re latie Re
Fie relaiile ] B , A [ R
1 1
= i ] C , B [ R
2 2
= , unde B
1
i B
2
sunt atribute definite pe
acelai domeniu. Atunci:
( ) ( ) { }
2 1 2 1 2 1 3
B t B t si R R t | t R R R
= =
Observaie. Jonciunea se poate exprima n funcie de operaiile de baz: produs
cartezian i selecie astfel:
( )
2 1 2 1
R R R R =
R
1
R
2
R
3
23
Exemplu.
2 1 3
R R R
= unde : R
1
.A > R
2
.A
R
1
A B C
a x c
b y c
d z g
R
2
D E A
0 11 a
1 13 a
3 11 a
4 11 d
6 12 d
7 13 c
R
3
R
1
. A B C D E R
2
. A
b y c 0 11 a
b y c 1 13 a
b y c 3 11 a
d z g 0 11 a
d z g 1 13 a
d z g 3 11 a
d z g 7 13 c
Sintaxa:
THETA - JOIN (R
1
, R
2
; - expresie) - rezultatul este o relaie.
n continuare se prezint patru forme ale operaiei de jonciune.
7.1. EQUI JOIN este un caz particular al lui THETA JOIN , cnd este egalitate.
Exemplu.
2 1 3
R R R
= unde : R
1
.A = R
2
.A
R
1
A B C
a x c
b y c
d z a
R
2
D E A
0 11 a
1 13 a
3 11 a
4 11 d
6 12 d
7 13 c
R
3
R
1
. A B C D E R
2
. A
a x c 0 11 a
a x c 1 13 a
a x c 3 11 a
d z a 4 11 d
d z a 6 12 d
Sintaxa:
EQUI - JOIN (R
1
, R
2
; - expresie) - rezultatul este o relaie.
7.2. NATURAL JOIN este o jonciune pe egalitate (EQUI JOIN) pentru toate
atributele cu acelai nume din cele dou relaii, urmat de o proiecie pe reuniunea
atributelor celor dou relaii.
n cazul EQUI JOIN schema relaiei rezultat conine toate atributele celor doi
operanzi i rezult c n fiecare tuplu al relaiei rezultat vor exista cel puin dou
valori egale. Introducerea jonciunii naturale va elimina aceast redundan.
Schema relaiei rezultat R
3
se obine prin reuniunea atributelor celor dou relaii R
1
i
R
2
(atributele cu acelai nume se iau o singur dat), iar extensia relaiei R
3
va conine
24
tuplurile obinute prin concatenarea tuplurilor din R
1
cu tupluri din R
2
, care au
aceleai valori pentru atributele cu acelai nume.
Jonciunea natural este jonciunea cea mai utilizat n practic i poate fi definit cu
ajutorul operaiilor de baz: proiecie, selecie i produs cartezian.
Dac se noteaz cu:
- condiia de egalitate ntre valorile atributelor din intersecia schemelor relaiilor
R
1
i R
2
(coloanele comune),
atr - reuniunea atributelor celor dou scheme (atributele cu acelai nume se iau o
singur dat),
atunci:
( ) ( )
2 1 atr 2 1 3
R R R R R = =
Exemple.
A. Se dau relaiile: R
1
[A, B, C] i R
2
[B, C, D]
( ) ( ) C . R C . R and B . R B . R
2 1 2 1
= = =
atr = A, B, C, D
R
1
A B C
a b c
d b c
b b f
c a d
R
2
B C D
b c d
b c e
a d b
R
3
A B C D
a b c d
a b c e
d b c d
d b c e
c a d b
B. Se dau relaiile: R
1
[A, B, C] i R
2
[D, E, A]
A . R A . R
2 1
= =
atr = A, B, C, D, E
R
1
A B C
a x c
b y c
d z a
R
2
D E A
0 11 a
1 13 a
3 11 a
4 11 d
6 12 d
7 13 c
R
3
A B C D E
a x c 0 11
a x c 1 13
a x c 3 11
d z a 4 11
d z a 6 12
Sintaxa:
NATURAL - JOIN (R
1
, R
2
; atribut(e) jonciune
*
) - rezultatul este o relaie.
* pentru mrirea claritii va apare atributul / atributele de jonciune.
25
Observaie.
Selecia este un caz particular de jonciune natural a unei relaii cu o relaie constant.
nelegem prin relaie constant o relaie care are un singur tuplu, eventual redus la o
singur valoare.
7.3. SEMI JOIN - este jonciunea dintre dou relaii R
1
i R
2
, urmat de o proiecie pe
atributele relaiei R
1
. Semi jonciunea conserv atributele unei relaii participante la
jonciune (R
1
). Semi jonciunea mai poate fi privit ca o generalizare a operaiei de
selecie, rezultatul fiind o selecie asupra relaiei R
1
, realizat pe baza valorilor din R
2
ale atributului de jonciune.
Exemplu.
2 1 3
R R R
= unde : R
1
.A = R
2
.A
R
1
A B C
a x c
b y c
d z a
R
2
D E A
0 11 a
1 13 a
3 11 a
4 11 d
6 12 d
7 13 c
R
3
A B C
a x c
a x c
a x c
d z a
d z a
Sintaxa:
SEMI - JOIN (R
1
, R
2
; - expresie) - rezultatul este o relaie.
Observaie.
Considerm jonciunea natural dintre ] B , A [ R
1 1
= i ] C , B [ R
2 2
= , unde B
1
i
B
2
sunt atributele de jonciune.
Dac B
1
= B
2
= , atunci jonciunea corespunde produsului cartezian.
Dac A = C = , atunci jonciunea corespunde interseciei.
Dac A = sau C = (dar nu amndou), atunci operaia este o semi-
jonciune.
R
1
R
2
R
3
26
7.4. OUTER JOIN. Jonciunea dintre dou relaii R
1
i R
2
poate conduce la pierdere de
tupluri, dac relaiile participante la jonciune nu au proiecii identice pe atributul de
jonciune, adic nu au aceleai valori n relaiile care se joncioneaz. Relaia rezultat
R
3
conine jonciunea natural dintre R
1
i R
2
, la care se adaug tuplurile din R
1
i R
2
,
care nu au participat la jonciune. n aceste tupluri se va atribui valorea null pentru
atributele relaiei corespondente.
Exemplu.
2 ext 1 3
R R R =
R
1
A B C
a x c
b y c
d z a
R
2
D E A
0 11 a
1 13 a
3 11 a
4 11 d
6 12 d
7 13 c
R
3
A B C D E
a x c 0 11
a x c 1 13
a x c 3 11
d z a 4 11
d z a 6 12
b y c null null
c null null 7 13
Observaii. n urma jonciunii naturale se pierd informaiile din tuplurile < b, y, c > din
R
1
i < 7, 13, c > din R
2
. Aceste tupluri se adaug n cazul jonciunii externe i se
completeaz cu null pe atributele relaiei corespondente.
Sintaxa:
OUTER - JOIN (R
1
, R
2
; atribut(e) jonciune) - rezultatul este o relaie.
8. DIVISION - este o operaie definit pe dou relaii care au schema R
1
[A
1
,
A
2
,..., A
n
] i R
2
[A
p+1
, A
p+2
,..., A
n
]. Relaia rezultat
2 1 3
R R R = are schema R
3
[A
1
,
A
2
,..., A
p
] i este format din toate tuplurile care, concatenate cu fiecare tuplu din R
2
,
dau ntotdeauna un tuplu din R
1
.
Notm: ATR
1
= {A
1
, A
2
,..., A
p+1
, A
p+2
,..., A
n
}
ATR
2
= {A
p+1
, A
p+2
,..., A
n
}
R
1
R
2
R
3
ext
27
Definiia 1.
2 1
R R t dac
1 1 2 2
R t R t , astfel nct ( ) t t
1 ATR ATR
2 1
=
i ( )
2 1 ATR
t t
2
= .
Definiia 2. Diviziunea se poate exprima n funcie de operaiile de baz: produs
cartezian, diferen i proiecie astfel:
( ) ( ) ( ) ( )
1 2 1 ATR ATR ATR ATR 1 ATR ATR 2 1
R R R R R R
2 1 2 1 2 1
=
Signatura: latie Re latie Re latie Re
R
3
R
1
R
2
Problem (Exemplu de diviziune).
Fie relaia R
1
[K, P] unde atributul K are ca valori codurile angajailor unui institut de
cercetare, iar atributul P conine codurile proiectelor n derulare. Un cercettor poate
lucra la unul sau mai multe proiecte. S se determine codurile angajailor angrenai
simultan n proiectele P3 i P4.
Rezolvare.
Construim relaia R
2
[P] care va conine dou tupluri: <P3> i <P4>.
Codurile angajailor care lucreaz la proiectele P3 i P4 sunt date de rezultatul diviziunii
2 1
R R .
R
1
K P
17 P1
17 P2
17 P3
17 P4
29 P1
29 P3
53 P3
53 P4
80 P3
R
2
P
P3
P4
28
Calculm diviziunea conform definiiei 2:
2 1 2 1
Q Q R R =
Pasul 1. Calculm ( )
1 ATR ATR 1
R Q
2 1
= Pasul 2. Calculm
2 1
R Q S =
Q
1
K
17
29
53
80
S
K P
17 P3
29 P3
53 P3
80 P3
17 P4
29 P4
53 P4
80 P4
Pasul 3. Calculm
1
R S T = Pasul 4. Calculm ( ) T Q
2 1
ATR ATR 2
=
T
K P
29 P4
80 P4
T
K
29
80
Pasul 5. Calculm
2 1 2 1
Q Q R R =
R
1
:R
2
K
17
53
Rezultatul interogrii: angajaii cu codul <17> i <53> lucreaz simultan n proiectele
<P3> i <P4>.
Sintaxa:
DIVISION (R
1
, R
2
) - rezultatul este o relaie.
29
2.2 OPERAII DE CALCUL
La operaiile descrise anterior se pot aduga operaii de calcul pe relaii. Aceste operaii
sunt justificate de numeroasele interogri (cereri) care necesit operaii de calcul.
Operaiile de calcul sunt implementate n toate limbajele de interogare. Aceti operatori
de calcul formeaz deci o extensie a operatorilor de baz i nu pot fi exprimai cu ajutorul
acestora.
1. COUNT - este o operaie care permite numrarea tuplurilor dintr-o relaie (liniilor
dintr-o tabel) care au aceeai valoare pe atributul considerat (sau aceleai valori pe
atributele considerate). Relaia rezultant va conine numai atributul (atributele) de
regrupare X
i
, iar tuplurile vor fi formate din valorile distincte i numrul de apariii.
Notm:
) R ( COUNT T
n 1
X ,..., X
= , unde X
1
,...,X
n
sunt atributele de regrupare.
T
R
Operatorul COUNT
Exemplu.
R A B C
a n 17
b o 14
c n 17
d p 13
e m 20
f m 10
Count
B
(R) B Count
n 2
m 2
o 1
p 1
Count
B,C
(R) B C Count
n 17 2
m 20 1
m 10 1
o 14 1
p 13 1
Dac nu este precizat niciun atribut de regrupare, operaia COUNT va determina numrul
de tupluri din relaie:
Count(R) Count
6
Sintaxa:
COUNT (R; X
1
, X
2
, ..., X
n
) - rezultatul este o relaie;
Count...
30
COUNT (R) - rezultatul este un numr (poate fi interpretat i ca o relaie cu un
singur atribut i un singur tuplu, care are ca valoare numrul de linii din tabel).
2. SUM este o operaie care permite efectuarea sumei valorilor atributului Y pentru
fiecare din valorile diferite ale atributelor de regrupare X
1
,...,X
n
. Atributul Y trebuie s fie
numeric.
Notm:
) Y , R ( SUM T
n 1
X ,..., X
= , unde X
1
,...,X
n
sunt atributele de regrupare.
Dac nu este precizat niciun atribut de regrupare, operaia SUM va determina suma
valorilor atributului Y.
T
R
Operatorul SUM
Exemplu.
R A B C
a n 17
b o 14
c n 17
d p 13
e m 20
f m 10
Sum
B
(R,C) B Sum
n 34
m 30
o 14
p 13
Sum(R,C) Sum
91
Sintaxa:
SUM (R, Y; X
1
, X
2
, ..., X
n
) - rezultatul este o relaie;
SUM (R, Y) - rezultatul este un numr (poate fi interpretat i ca o relaie cu un
singur atribut i un singur tuplu, care are ca valoare suma valorilor atributului Y
din toate liniile tabelei).
Sum...
31
3. MEAN este o operaie care permite efectuarea mediei aritmetice a valorilor
atributului Y pentru fiecare din valorile diferite ale atributelor de regrupare X
1
,...,X
n
.
Atributul Y trebuie s fie numeric.
Notm:
) Y , R ( MEAN T
n 1
X ,..., X
= , unde X
1
,...,X
n
sunt atributele de regrupare.
Dac nu este precizat niciun atribut de regrupare, operaia MEAN va determina media
aritmetic a valorilor atributului Y din toat relaia.
T
R
Operatorul MEAN
Exemplu.
R A B C
a n 17
b o 9
c p 21
d n 13
e p 20
f p 10
Mean
B
(R,C) B Sum
n 15
o 9
p 17
Mean(R,C) Sum
15
Sintaxa:
MEAN (R, Y; X
1
, X
2
, ..., X
n
) - rezultatul este o relaie;
MEAN (R, Y) - rezultatul este un numr (poate fi interpretat i ca o relaie
cu un singur atribut i un singur tuplu, care are ca valoare media aritmetic a
valorilor atributului Y din toate liniile tabelei).
4. MAX i MIN - este o operaie care permite determinarea valorii maxime / minime a
atributului Y pentru fiecare din valorile diferite ale atributelor de regrupare X
1
,...,X
n
.
Atributul Y trebuie s fie numeric.
Mean..
..m...
32
Notm:
) Y , R ( MAX T
n 1
X ,..., X
= , unde X
1
,...,X
n
sunt atributele de regrupare.
) Y , R ( MIN T
n 1
X ,..., X
= , unde X
1
,...,X
n
sunt atributele de regrupare.
Dac nu este precizat niciun atribut de regrupare, operaia MAX (MIN) va determina
maximul (minimul) valorilor atributului Y din toat relaia.
T
R
Operatorul MAX (MIN)
Exemplu.
R A B C
a n 17
b o 9
c p 21
d n 13
e p 20
f p 10
Min
B
(R,C) B Min
n 13
o 9
p 10
Max(R,C) Max
21
Sintaxa:
MAX (R, Y; X
1
, X
2
, ..., X
n
) - rezultatul este o relaie;
MAX (R, Y) - rezultatul este un numr (poate fi interpretat i ca o relaie cu un
singur atribut i un singur tuplu, care are ca valoare maximul valorilor atributului
Y din toate liniile tabelei).
Observaie. Pentru operaia MIN sintaxa este analoag.
Max...
33
CAP. 3. LIMBAJUL SQL
SQL (Structured Query Language - Limbaj Structurat de Interogare) este un limbaj de
programare neprocedural specific bazelor de date.
Limbajul SQL este standardizat ANSI-ISO (fiind cel mai popular limbaj de manipulare a
bazelor de date relaionale) i poate fi utilizat n: MySQL, SQL Server, MS Access,
Oracle, DB2, etc.
Pe lng versiunile standardizate ale limbajului SQL, exist i o mulime de dialecte i
variante caracteristice diferitelor SGBD-uri.
Limbajul SQL permite:
manipularea structurii bazelor de date
manipularea datelor coninute
Principalele instuciuni de definire a datelor sunt:
CREATE TABLE
ALTER TABLE
DROP TABLE
3.1. Instruciunea CREATE TABLE
Instruciunea CREATE TABLE este utilizat pentru a crea o nou tabel. Aceast opiune
este utilizat cu precdere dac mediul de lucru nu posed instrumente pentru crearea i
modificarea tabelelor ntr-o manier mai facil, aa cum are spre exemplu Microsoft
Access.
Sintaxa general a instruciunii CREATE TABLE este:
CREATE TABLE nume_tabela (c1 d1 [constrngeri_coloan],
c2 d2 [constrngeri_coloan],
...
cn dn [constrngeri_coloan],
[constrngeri_coloan])
unde: c1, c2, ... , cn - reprezint coloanele tabelei
d1, d2, ... , dn - reprezint domeniile fiecrui cmp
Exemplul 1. Dac dorim crearea unei tabele cu numele angajati1, cu urmtoarele
cmpuri:
34
vom avea:
CREATE TABLE angajati1 (cod_sal int, nume varchar(250), adresa varchar (250),
localitate varchar(250), sal_brut int, cod_dep varchar (10),
data_angajarii date)
Rezultatul afiat pentru exemplul 1
3.2. Instruciunea ALTER TABLE
Pentru modificarea strcturii unei tabele se utilizeaz instruciunea ALTER TABLE.
Aceast instruciune permite adugarea sau tergerea unor cmpuri, modificarea
domeniilor unor cmpuri, precum i adugarea sau tergerea unor constrngeri ale tabelei.
Instruciunea ALTER TABLE are urmtoarele sintaxe:
- pentru adugarea unui nou cmp:
ALTER TABLE nume_tabela ADD nume_coloan domeniu
- pentru tergerea unui cmp
ALTER TABLE nume_tabela DROP nume_coloan
- pentru modificarea constrngerilor unu cmp
ALTER TABLE nume_tabela
ALTER COLUMN nume_coloan domeniu
Exemplul 2. Dac dorim adugarea n tabela angajati1 a unui nou cmp numit bonus de
tip integer vom avea:
ALTER TABLE angajati1 ADD bonus int
35
Rezultatul afiat pentru exemplul 2
Exemplul 3. Dac dorim, n tabela angajati1, modificarea cmpului numit bonus din
integer n tip de caractere cu lungimea maxima de 10 caractere vom avea:
ALTER TABLE angajati1 ALTER COLUMN bonus varchar(10)
Rezultatul afiat pentru exemplul 3
Exemplul 4. Dac dorim tergerea din tabela angajati1 a cmpului numit bonus vom
avea:
ALTER TABLE angajati1
DROP bonus
36
Rezultatul afiat pentru exemplul 4
3.3. Instruciunea DROP TABLE
Pentru tergerea unei tabele se utilizeaz instruciunea DROP TABLE. Aceast
instruciune va face tergerea efectiv a ntregii tabele cu toate datele coninute. Sintaxa
general a instruciunii DROP TABLE este:
DROP TABLE nume_tabela
Exemplul 5. Dac dorim tergerea tabelei angajati1 vom avea:
DROP TABLE angajati1
Principalele instruciuni de manipulare a datelor sunt:
SELECT
INSERT
UPDATE
DELETE
3.4. Instruciunea SELECT
Instruciunea SELECT este instruciunea de interogare a datelor din limbajul SQL.
Utilizarea acestei instruciuni genereaz o tabel virtual, numit vedere (query). n query
se regsesc toate informaiile dorite din unul sau mai multe tabele ale bazei de date.
Sintaxa general a instruciunii SELECT este:
SELECT [DISTINCT] c1, c2, ... , cn
[FROM t1, t2, ... , tm] [WHERE condiie] [clauze secundare]
unde: c1, c2, ... , cn - sunt coloanele dorite din tabelele specficate n clauza FROM
t1, t2, ... , tm - sunt tabelele din care se face selecia
37
Rezultatul seleciei este format din coloanele c1, c2, ... , cn cu datele rezultate din
produsul cartezian al tabelelor t1, t2, ... , tm pentru care se respect eventuala condiie
specificat n clauza WHERE.
Clauza SELECT definete coloanele tabelei rezultat.
Clauza FROM indic unu sau mai multe tabele ce conin datele dorite.
Clauza WHERE definte condiia sau condiiile ce trebuie ndepline de datele din
clauza SELECT.
ntre clauzele secundare amintim: ORDER BY, GROUP BY, HAVING.
Exemplele urmtoare vor fi construite pentru tabela ANGAJATI:
Tabela ANGAJATI
Exemplul 6. Dac dorim afiarea tuturor datelor din tabel vom avea:
SELECT cod_sal, nume, adresa, localitate, sal_brut, cod_dep, data_angajarii
FROM angajati
sau
SELECT * FROM salariati
Observaie. n acest al doilea caz, simblul * nlocuiete toate cmpurile din tabel.
Exemplul 7. Dac dorim afiarea tuturor angajailor din localitatea Brasov ce au salariul
mai mare de 1200 vom avea:
SELECT cod_sal, nume, localitate, sal_brut
FROM angajati
WHERE localitate="brasov" AND salariu_brut>1200
38
Rezultatul afiat pentru exemplul 7
Exemplul 8. Dac dorim afiarea tuturor persoanelor angajate dup data de 01.01.2009
vom avea:
SELECT cod_sal, nume, data_angajarii
FROM angajati
WHERE data_angajarii>=#01-01-2009#
Rezultatul afiat pentru exemplul 8
n clauza SELECT se pot utiliza urmtoarele funcii agregat:
COUNT (numr liniile din tabela rezultat)
SUM (calculeaz suma valorilor dintr-o coloan)
MAX (returneaz valoarea maxim dintr-o coloan)
MIN (returneaz valoarea minim dintr-o coloan)
AVG (returneaz media aritmetic a valorilor dintr-o coloan)
Exemplul 9. Dac dorim afiarea numrului de angajai vom avea:
SELECT count(*)
FROM angajati
Rezultatul afiat pentru exemplul 9
39
Exemplul 10. Dac dorim afiarea mediei aritmetice a salariului brut vom avea:
SELECT AVG(sal_brut)
FROM angajati
Rezultatul afiat pentru exemplul 10
Instruciunea SELECT poate s nu conin nici clauza FROM, dac datele nu sunt
coninute de nicio tabel. n acest caz, instruciunea SELECT conine o list de expresii
pe care le calculeaz.
Exemplul 11. Dac dorim afiarea rezultatului produsului 50x25 vom avea:
SELECT 50*25
Rezultatul afiat pentru exemplul 11
Dac se dorete, n tabela rezultat se pot redenumi coloanele, sau se pot denumi anumite
expresii, utiliznd clauza AS.
Exemplul 12. Dac dorim afiarea rezultatului produsului 50x25, iar numele tabelei s fie
REZULTAT vom avea:
SELECT 50*25 AS rezultat
Rezultatul afiat pentru exemplul 12
Clauza FROM este obligatorie, dac n clauza SELECT se dorete afiarea unor coloane
din tabele. Dac se dorete selectarea unor coloane din tabele diferite, acestea vor fi toate
enumerate n clauza FROM, desprite prin virgul. n cazul n care un cmp apare n mai
mult de o tabel, atunci pentru a se cunoate din ce tabel se dorete respectivul cmp, la
clauza FROM se va specifica i numele tabelei de forma:
nume_tabel.nume_cmp
40
n clauza WHERE se impun toate condiiile necesare pentru datele din tabela rezultat. n
clauza WHERE se pot utiliza i operatorii logici (AND, OR, NOT) i paranteze.
Exemplul 13. Dac dorim afiarea angajailor din Brasov sau Predeal vom avea:
SELECT nume, localitate
FROM angajati
WHERE localitate="brasov" or localitate="predeal"
Rezultatul afiat pentru exemplul 13
Clauza ORDER BY face ordonarea liniilor din tabela rezultat dup coloana ce urmeaz
clauzei. Implicit, ordonarea se face n ordine cresctoare sau alfabetic dac tipul
cmpului dup care se face ordonarea este de tip text. n cazul n care se dorete ordonare
invers lexicografic (descresctoare), atunci numele coloanei trebuie urmat de cuvntul
DESC.
Exemplul 14. Dac dorim afiarea angajailor n ordine descresctoare vom avea:
SELECT nume
FROM angajati
ORDER BY nume DESC
Rezultatul afiat pentru exemplul 14
41
Clauza GROUP BY se utilizeaz pentru gruparea rezultatelor funciilor agregat, n
funcie de valoarea unei sau mai multor coloane. Clauza GROUP BY se utilizeaz la
sfritul instruciunii, fiind urmat de cmpul pentru care se face gruparea rezultatelor
funciei agregat.
Exemplul 15. Dac dorim numrul de angajai din fiecare localitate vom avea:
SELECT COUNT(*) AS numar, localitate
FROM angajati
GROUP BY localitate
Rezultatul afiat pentru exemplul 15
Clauza HAVING se utilizeaz n loc de clauza WHERE, atunci cnd n instruciune se
utilizeaz funcii agregat. Clauza HAVING este asemntoare clauzei WHERE, adic
introduce o condiie pe care trebuie s o respecte liniile din rezultat i n plus permite
utilizarea funciilor agregat n expresia condiional.
Exemplul 16. Dac dorim numrul de angajai din Brasov si Predeal vom avea:
SELECT COUNT(*) AS numar, localitate
FROM angajati
GROUP BY localitate
HAVING localitate="brasov" OR localitate="predeal"
Rezultatul afiat pentru exemplul 16
Subinterogrile reprezint instruciuni SELECT n alte interogri de tip SELECT.
Numim aceast tehnic imbricare. Astfel, instruciunile SELECT se pot imbrica pe mai
multe niveluri, o instruciune avnd ca argument rezultatul unei alte instruciuni, numit
i subinterogare.
42
Exemplul 17. Dac dorim numele angajatului care are salariul egal cu salariul maxim
vom avea:
SELECT nume, sal_brut
FROM angajati
WHERE sal_brut IN
(SELECT MAX(sal_brut) FROM angajati)
Rezultatul afiat pentru exemplul 17
Clauza IN i NOT IN specific dac valorile unui cmp aparin unei mulimi precizate.
Aceast mulime poate fi format prin enumerarea elementelor sau printr-o subinterogare.
Exemplul 18. Dac dorim numele angajailor din Brasov, Bucuresti i Predeal vom avea:
SELECT nume, localitate
FROM angajati
WHERE localitate IN ("brasov", "bucuresti", "predeal")
Rezultatul afiat pentru exemplul 18
3.5. Instruciunea INSERT
Instruciunea INSERT este utilizat pentru introducerea datelor n tabel. Instruciunea
INSERT are urmtoarea sintax:
INSERT INTO nume_tabela (c1,c2,..., cn) VALUES (v1,v2,..., vn)
unde: c1, c2, ... ,cn - reprezint coloanele din tabel n care se vor introduce datele
v1, v2, ... ,vn - reprezint valorile corespunztoare coloanelor c1, c2, ... ,cn
Observaie. ntre valori i numele coloanelor trebuie s existe o coresponden direct.
43
Exemplul 19. Dac dorim introducerea n tabela ANGAJAI a unui nou angajat cu
datele: 18, EMILIA, str. O.Goga nr. 3, bucuresti, 1300, prod, 05.05.2009 vom avea:
INSERT INTO TABLE angajati
VALUES (18, "EMILIA", "str. O.Goga nr. 3", "bucuresti", 1300, " prod", #5/5/2009#);
Rezultatul afiat pentru exemplul 19
Dac se dorete introducerea datelor n alt ordine dect cea implicit a coloanelor din
tabel, sau nu se cunoate aceast ordine, trebuie specificat ordinea cmpurilor dup
numele tabelei.
Exemplul 20. Dac dorim introducerea n tabela ANGAJAI a unui nou angajat cu
datele: 19, str. Agriselor, constanta, raluca, 1300, prod, 10.08..2009 vom avea:
INSERT INTO angajati ( cod_sal, adresa, localitate, nume, sal_brut, cod_dep,
data_angajarii )
VALUES (19, "str. Agriselor nr. 3", "constanta", "RALUCA", 1300, " prod",
#10/8/2009#);
Rezultatul afiat pentru exemplul 20
44
3.6. Instruciunea UPDATE
Instruciunea UPDATE permite modificarea valorilor din coloanele unei tabele pentru
anumite condiii. Sintaxa general este:
UPDATE nume_tabel SET c1=e1 [c2=e2 , ... ,n] [WHERE condiie]
Clauza WHERE impune ca actualizarea valorilor s se fac doar asupra liniilor care
ndeplinesc o serie de condiii. Dac lipsete, se vor modifica toate liniile din tabel.
Exemplul 21. Dac dorim modificarea tuturor salariilor angajailor din departamentul
"prod" la valoarea de 1000 lei vom avea:
UPDATE angajati
SET sal_brut=1000 WHERE cod_dep="prod"
Rezultatul afiat pentru exemplul 21
Valoarea poate fi schimbat i cu valoarea unei expresii calculate. De exemplu:
Exemplul 22. Dac dorim modificarea tuturor salariilor angajailor din departamentul
"conta" n sensul creterii cu 15% vom avea:
UPDATE angajati
SET sal_brut=sal_brut*115/100 WHERE cod_dep="conta"
45
Rezultatul afiat pentru exemplul 22
3.7. Instruciunea DELETE
Instruciunea DELETE este utilizat pentru tergerea uneia sau mai multor linii dintr-o
tabel.
Sintaxa instruciunii DELETE este:
DELETE FROM nume_tabela [WHERE condiie]
Utiliznd aceast instruciune se vor terge toate liniile care ndeplinesc condiia
specificat n clauza WHERE. Dac este omis clauza WHERE se vor terge toate liniile
din tabel.
Exemplul 23. Dac dorim tergerea tuturor angajailor din departamentul "conta" vom
avea:
DELETE FROM angajati
WHERE cod_dep="conta"
46
Rezultatul afiat pentru exemplul 23
47
CAP. 4. NORMALIZAREA RELAIILOR
1. INTRODUCERE
n activitatea de modelare a bazelor de date problema care se pune este de a stabili
mulimea de relaii care realizeaz o reprezentare fidel a schemei conceptuale, evitnd
incoerena, redundana i pierderile de informaii. Relaiile (tabelele) unei baze de date
se pot stabili n mai multe moduri i de aceea este necesar s existe criterii de evaluare a
calitii relaiilor, pentru ca acestea s asigure integritatea datelor i posibiliti de
interogare performante.
Teoria normalizrii se bazeaz pe observaia c anumite relaii au posibiliti mai bune de
actualizare i interogare dect alte relaii echivalente (care conin aceleai informaii).
Normalizarea relaiilor permite obinerea unei baze de date n care s nu se manifeste
anomalii de actualizare sau stocare.
Pentru a nelege nevoia de normalizare s considerm relaia R care conine informaii
legate de furnizori (cod_funizor, nume_furnizor, localitate, cod_loc) i de produsele care
le ofer (cod_produs, denumire, um, cantitate). Un furnizor poate oferi mai multe
produse, iar un produs poate fi oferit de mai muli furnizori.
R [cod_funizor, cod_produs, nume_furnizor, localitate, cod_loc, denumire, um, cantitate]
Cheia relaiei R este (cod_funizor, cod_produs).
cod_furnizor cod_produs nume_furnizor localit cod_loc denumire um cant
F1 P13 Alfa SRL Brasov 5000 xyz kg 200
F2 P17 Beta SRL Cluj 3000 abc mp 600
F3 P13 Gama SRL Sinaia 2555 xyz kg 800
F1 P17 Alfa SRL Brasov 5000 abc mp 400
F2 P29 Beta SRL Cluj 3000 efg litru 600
Observm c datele despre fiecare furnizor (nume_furnizor, localitate, cod_loc) apar n
fiecare tuplu n care se prezint un produs oferit de un anumit furnizor. Analog, datele
generale despre fiecare produs ( denumire, um) apar n fiecare tuplu n care un furnizor
ofer respectivul produs. Aceste redundane conduc la creterea spaiului de memorare i
la anomalii de actualizare a relaiei.
Anomalii de inserare nu se pot introduce datele generale despre un furnizor
(nume_furnizor, localitate, cod_loc), dac nu exist cel puin un produs pe care acesta
s-l ofere. O alt anomalie de inserare nu putem introduce informaiile generale despre
un produs ( denumire, um), dac nu exist un furnizor care s-l ofere. Aceste anomalii
apar datorit restriciei de integritate care impun ca ntr-o relaie atributele cheie nu pot
s aib valoarea null.
48
Anomalii de tergere dac se terg toate informaiile legate de un furnizor, de exemplu
firma nu mai lucreaz cu furnizorul F2, atunci tuplurile cu cheile <F2, P17> i <F2,
P29> vor fi terse. Se pierd astfel informaiile generale legate de produsul P29,
(denumire, um).
Anomalii de actualizare orice modificare a unei informaii generale legate de un
furnizor trebuie s se propage n toate tuplurile n care apare acel furnizor. Aceasta
mrete timpul de actualizare i crete riscul de incoeren al datelor. Acelai tip de
anomalie apare i n cazul modificrii unei informaii generale despre un produs.
Teoria normalizrii are la baz analiza dependenelor dintre atributele care sunt la
originea fenomenelor de redundan i propune dou scheme de modelare a bazelor de
date relaionale fr anomalii sau pierderi de informaii [Popescu, 1996]:
schema descompunerii schema relaiei universale (relaia universal este
relaia care conine toate atributele care modeleaz sistemul real cercetat) se
descompune prin proiecii succesive n subrelaii; descompunerea se oprete
cnd continuarea ar conduce la pierderi de informaii; procesul de descompunere
este reversibil, ceea ce garanteaz c relaia de plecare (universal) poate fi
regsit prin utilizarea operatorului de jonciune i astfel nicio informaie nu a
fost pierdut;
schema sintezei pornete de la o mulime de atribute independente; pe baza
proprietilor de semantic i legturi ntre atribute se compun relaii care s
evite eventualele anomalii.
Procesul de ameliorare a schemei conceptuale trebuie s satisfac urmtoarele cerine:
s asigure conservarea datelor, adic n schema conceptual final trebuie s
regsim toate datele din cadrul schemei iniiale;
s asigure conservarea dependenelor dintre date, adic n schema conceptual
final fiecare dependen trebuie s aib determinantul i determinatul n
schema aceleiai relaii;
s reprezinte o descompunere minimal a relaiilor iniiale, adic niciuna din
relaiile care compun schema final nu trebuie coninut ntr-o alt relaie din
aceast schem.
Pentru ca informaiile dintr-o baz de date s fie prelucrate ct mai simplu este necesar ca
relaiile s verifice anumite condiii, altfel spus s aib un anumit grad de normalizare.
Forma normal (Normal Form) a unei relaii presupune anumite condiii pe care trebuie
s le ndeplineasc valorile atributelor i dependenele funcionale definite pe aceea
relaie.
E.F.Codd a definit primele trei forme normale (1NF, 2NF, 3NF). Ulterior a fost definit
mai complet 3NF i a primit numele de forma normal Boyce-Codd (BCNF). Formele
normale superioare, definite de R. Fagin, se refer la dependenele multivaloare (4NF) i
dependenele de jonciune (5NF). De remarcat c BCNF, 4NF i 5NF corespund definiiei
unice: orice determinant al unei dependene este o cheie. Diferena este dat de faptul c
49
n cazul BCNF este vorba de dependena funcional, n cazul 4NF de dependena
multivaloare, iar n cazul 5NF de dependena de jonciune [Fotache, 2005].
n continuare ne limitm prezentarea la primele trei forme normale definite de Codd,
considerate n multe lucrri de specialitate a fi suficiente pentru proiectarea corect a
bazelor de date.
2. DEPENDENE FUNCIONALE
Dependena funcional reprezint dependena dintre date prin care se poate identifica un
atribut sau grup de atribute prin intermediul altui atribut sau grup de atribute.
Definiia 4.1. Dependena funcional. Dat o relaie R, spunem c un atribut sau un grup
de atribute Y depinde funcional de un atribut sau grup de atribute X, dac pentru fiecare
valoare a lui X se asociaz o singur valoare a lui Y n orice tuplu din R.
Formal:
( ) ( ) ( ) ( )
2 Y 1 Y 2 X 1 X 2 1
t t t t : avem R t , t = =
sau echivalent: pentru orice tupluri <x, y>, <x, y> din R, x = x y = y.
Vom spune c X determin pe Y sau Y depinde funcional de X i vom nota
X Y .
Atributul (grupul de atribute) X se numete determinant, iar atributul (grupul de atribute)
Y se numete determinat, adic:
determinant determinat.
n cazul exemplului prezentat n introducere identificm urmtoarele dependene
funcionale:
(1) (cod_furnizor, cod_produs) nume_furnizor
(2) (cod_furnizor, cod_produs) localitate
(3) (cod_furnizor, cod_produs) cod_loc
(4) (cod_furnizor, cod_produs) denumire
(5) (cod_furnizor, cod_produs) um
(6) (cod_furnizor, cod_produs) cantitate
(7) cod_furnizor nume_furnizor
(8) cod_furnizor localitate
(9) cod_furnizor cod_loc
(10) cod_produs denumire
(11) cod_produs um
(12) cod_loc localitate
50
Tipuri de dependene funcionale
Definiia 4.2. Dependena funcional trivial.
O dependen funcional X Y este trivial dac X Y .
Definiia 4.3. Dependena funcional parial (dfp).
O dependen funcional X Y este parial dac Y 1 X . i . a X 1 X
Vom numi dependena funcional X1 Y, dependen argument dfp.
Exemplu.
Dependena funcional: (cod_furnizor, cod_produs) nume_furnizor
este parial deoarece se manifest i dependena argument dfp:
cod_furnizor nume_furnizor
Definiia 4.4. Dependena funcional complet (total) (dfc).
O dependen funcional X Y este complet (total) dac nu exist
Y 1 X . i . a X 1 X
Definiia 4.5. Dependena funcional tranzitiv (dft).
O dependen funcional X Y este tranzitiv dac se manifest concomitent
dependenele funcionale: Z X i Z Y.
Exemplu.
Dependena funcional: cod_loc localitate
este tranzitiv deoarece se manifest concomitent i dependenele:
cod_furnizor localitate
cod_furnizor cod_loc
Observaie.
Cheia unei relaii poate fi definit cu ajutorul dependenelor funcionale astfel:
X este o cheie pentru relaia R [X, Y] dac Y depinde funcional de X adic: X Y.
Cheia X este minimal dac dependena funcional X Y este complet.
3. PRIMA FORM NORMAL (1NF)
Definiia 4.6. O relaie este n prima form normal notat (1NF), dac fiecare din
atributele sale are un domeniu atomic (monovaloare). O relaie n 1NF nu conine grupuri
repetitive.
Observaie.
Noiunea de grup repetitiv (mulime de valori) nu exist n modelul relaional.
O relaie nenormalizat poate fi transformat ntr-o relaie 1NF, nlocuind atributul
compus prin atributele simple corespunztoare (spargerea relaiei) sau duplicnd tuplele
de attea ori cte valori exist pentru un atribut dat (spargerea grupului repetitiv).
Exemple de relaii nenormalizate:
51
a) relaie n care un atribut este o relaie
ZBOR [NR_ZBOR, AVION] cu AVION [tip_nava, capacitate]
ZBOR NR_ZBOR AVION
102 (B707, 150)
107 (B737, 180)
108 (AIRB320, 250)
109 (B707, 150)
110 (B747, 300)
Observm c atributul compus AVION din relaia ZBOR este de fapt o relaie cu dou
atribute tip_nava i capacitate (numr de locuri).
Rezultatul trecerii n 1NF prin spargerea relaiei AVION este:
ZBOR 1 NR_ZBOR TIP NAVA CAPCITATE
102 B707 150
107 B737 180
108 AIRB320 250
109 B707 150
110 B747 300
b) relaie n care un atribut este un ansamblu de valori
CATALOG [Nume, Note]
CATALOG NUME NOTE
Einstein 8, 6
Freud 7, 9, 5
Rezultatul trecerii n 1NF, n situaia c numrul maxim de note este cunoscut, prin
spargerea relaiei NOTE este:
CATALOG 1 NUME NOTA 1 NOTA 2 NOTA 3
Einstein 8 6 null
Freud 7 9 5
n cazul spargerii grupului repetitiv NOTE se obine relaia:
CATALOG 2 NUME NOTA
Einstein 8
Einstein 6
Freud 7
Freud 9
Freud 5
52
Teorema 1 (de eliminare a grupurilor repetitive)
Dac R [A
1
, A
2
, ..., A
n
] este o relaie n care A
m+1
, A
m+2
, ..., A
n
formeaz un grup repetitiv,
i {A
1
, A
2
, ..., A
p
} cu p < m este o cheie primar, atunci relaia R se poate descompune n
dou relaii fr grupuri repetitive i pierdere de informaii, astfel:
R1 [A
1
, A
2
, ..., A
m
] = ( ) R
m 2 1
A ,..., A , A
R2 [A
1
, A
2
, ..., A
p
, A
m+1
,..., A
n
] = ( ) R
n 1 m p 2 1
A ,..., A , A ,..., A , A
+
Algoritmul 1NF - de aducere a unei relaii nenormalizate n 1NF
(eliminarea atributelor compuse i repetitive)
Pasul 1. Se trec n relaie n locul atributelor compuse componentele acestora ca atribute
simple.
Pasul 2. Se trec grupurile de atribute repetitive, fiecare ntr-o nou relaie.
Pasul 3. Se introduce n schema fiecrei noi relaii create la Pasul 2 cheia primar a
relaiei din care a fost extras grupul repetitiv.
Pasul 4. Se stabilete cheia primar a fiecrei noi relaii create la Pasul 2. Aceasta va fi
compus din cheia introdus la Pasul 3 (cheia primar iniial) precum i din
unul sau mai multe atribute proprii relaiei.
Exemplu.
Pentru gestionarea crilor dintr-o bibliotec se consider relaia:
CARTE [ cota, nume_autori, titlul, editura, an_apariie, ISBN, cuvinte_cheie]
Cota Nume autori Titlul Editura An
apar.
ISBN Cuvinte-cheie
C104 Ionescu M
Popescu F
Georgescu L
Baze de
date
Economica 2009 978-973-
8204-41-
7
proiectarea bazelor
de date,
SQL Server 2008,
Oracle
C289 Marinescu A Sisteme
informatice
Polirom 2007 978-973-
1978-89-
5
analiza SI,
proiectarea SI,
implementarea SI,
auditul SI
n relaia CARTE (nenormalizat) exist dou grupuri de atribute repetitive: nume_autori
i cuvinte_cheie care creaz mari greuti n stocarea informaiilor i realizarea
interogrilor. Alegem drept cheie primar atributul COTA. Aplicarea Algoritmului 1NF
conduce la urmtoarele relaii:
CARTE 1 [ cota, titlul, editura, an_apariie, ISBN]
AUTORI [ cota, nume autori]
CUVINTE CHEIE [ cota, cuvinte cheie]
53
CARTE 1
Cota Titlul Editura An
aparitie
ISBN
C104 Baze de date Economica 2009 978-973-8204-41-7
C289 Sisteme informatice Polirom 2007 978-973-1978-89-5
AUTORI
Cota Nume autori
C104 Ionescu M
C104 Popescu F
C104 Georgescu L
C289 Marinescu A
CUVINTE CHEIE
Cota Cuvinte cheie
C104 proiectarea bazelor de date
C104 SQL Server 2008
C104 Oracle
C289 analiza SI
C289 proiectarea SI
C289 implementarea SI
C289 auditul SI
4. A DOUA FORM NORMAL (2NF)
Definiia 4.7. O relaie este n a doua form normal notat (2NF), dac relaia este n
(1NF) i oricare dintre atributele care nu aparin cheii primare este complet dependent
funcional de cheie.
Observaie. O relaie n 2NF nu conine dependene funcionale pariale ntre atributele
cheie i celelate atribute.
Exemplu. Redundane care apar n cazul unei relaii 1NF, care nu este 2NF.
Fie R [A, B, C, D] n care cheia primar este (A, B) i se manifest dependenele:
(A, B) C (A, B) D B C
A B C D
a1 b1 c1 d1
a2 b1 c1 d2
a3 b2 c3 d2
a4 b2 c3 d3
54
Teorema 2 ( de descompunere fr pierdere de informaie)
Fie R [A
1
, A
2
, ..., A
n
] o relaie n 1NF i K = {A
1
, A
2
, ..., A
p
} cu p < n este o cheie
primar. Presupunem c exist { } = = K , A ,..., A , A A
n 2 1
, adic este un
atribut noncheie i cu K ( este complet dependent funcional de o
submulime strict de atribute din cheie). Atunci dependena se poate elimina
descompunnd relaia R n urmtoarele dou relaii:
[ ] ( ) R R
1
=
[ ] ( ) R A R
A 2
=
Observaie. Conform teoremei de mai sus, relaia R [A, B, C, D] din exemplul precedent,
n care se manifest dependena parial (A, B) C se descompune fr pierdere de
informaie n:
R
1
[ B, C] i R
2
[A, B, D]
Algoritmul 2NF - de aducere a unei relaii 1NF n 2NF
(eliminarea dependenelor funcionale pariale)
Pasul 1. Pentru fiecare dependen funcional argument dfp se creaz o nou relaie, cu
schema constituit din determinantul i determinatul acestei dependene. Dac
exist mai multe dependene funcionale argument dfp cu acelai determinant se
va crea o singur relaie format din determinant luat o singur dat i
determinaii dependenelor considerate.
Pasul 2. Din relaia iniial se elimin atributul / atributele care formeaz determinatul
dependenelor funcionale argument dfp.
Pasul 3. Se stabilete cheia primar a fiecrei noi relaii create la Pasul 1. Aceasta va fi
format din determinantul dependenei funcionale argument dfp.
Aplicaie.
Pentru evidena autoturismelor nchiriate de o firm clienilor se consider relaia:
AUTO [ nr_client, nume_client, adresa, nr_auto, marca, data ]
Nr client Nume client Adresa Nr auto Marca Data
C234 Smith A Castelului 12, Brasov BV 21 XXI Logan 1.4 22.05.2009
C145 Lungu M Libertatii 14, Predeal BV 19 XIX Ford Focus 17.04.2009
C679 Tudor A Armoniei 23, Iasi CJ 12 XII Audi A6 23.05.2009
C089 Stan D Sadoveanu 45, Cluj CT 07 VII Opel Astra 07.04.2009
C445 Bondescu I Caragiale 66, Arad BV 61 LXI VW Golf 26.04.2009
55
Cheia relaiei este (nr_client, nr_auto), iar dependeele funcionale care se manifest sunt:
(1) (nr_client, nr_auto) nume_client
(2) (nr_client, nr_auto) adresa
(3) (nr_client, nr_auto) marca
(4) (nr_client, nr_auto) data
(5) nr_client nume_client
(6) nr_client adresa
(7) nr_auto marca
Observaie.
- relaia AUTO este n forma normal 1;
- dependena funcional (1) este parial deoarece se manifest i d.f.argument dfp (5);
- dependena funcional (2) este parial deoarece se manifest i d.f.argument dfp (6);
- dependena funcional (3) este parial deoarece se manifest i d.f.argument dfp (7).
Aplicarea Algoritmului 2NF - de aducere a unei relaii 1NF n 2NF bazat pe Teorema 2,
conduce la spargerea relaiei AUTO, n trei relaii n 2NF:
EVIDENTA [ nr_client, nr_auto, data ]
CLIENT [ nr_client, nume_client, adresa ]
AUTO [ nr_auto, marca ]
EVIDENA
Nr client Nr auto Data
C234 BV 21 XXI 22.05.2009
C145 BV 19 XIX 17.04.2009
C679 CJ 12 XII 23.05.2009
C089 CT 07 VII 07.04.2009
C445 BV 61 LXI 26.04.2009
CLIENT
Nr client Nume client Adresa
C234 Smith A Castelului 12, Brasov
C145 Lungu M Libertatii 14, Predeal
C679 Tudor A Armoniei 23, Iasi
C089 Stan D Sadoveanu 45, Cluj
C445 Bondescu I Caragiale 66, Arad
AUTO
Nr auto Marca
BV 21 XXI Logan 1.4
BV 19 XIX Ford Focus
CJ 12 XII Audi A6
CT 07 VII Opel Astra
BV 61 LXI VW Golf
56
5. A TREIA FORM NORMAL (3NF)
Definiia 4.8. O relaie este n a treia form normal notat (3NF), dac relaia este n
(2NF) i oricare dintre atributele care nu aparin cheii primare nu depinde tranzitiv de
cheie.
Observaie. O alt exprimare: orice atribut ce nu aparine cheii primare depinde direct de
cheie.
Fie R o relaie, K cheia primar i presupunem c este un atribut ce depinde tranzitiv de
cheie. Aceasta nseamn c exist un atribut , astfel nct exist dependenele
funcionale:
K i
Deoarece relaia R este n 2NF rezult c este complet dependent funcional de cheia
relaiei i deci = K , adic este un atribut noncheie.
Exemplu. Redundane care apar n cazul unei relaii 2NF, care nu este 3NF.
Fie R [A, B, C] n care cheia primar este A i se manifest dependenele:
A B A C B C
A B C
a1 b1 c1
a2 b1 c1
a3 b2 c2
a4 b2 c2
Teorema 3 - Casey Delobel (de descompunere fr pierdere de informaie)
Fie R [A
1
, A
2
, ..., A
n
] o relaie n 2NF i K este o cheie primar. Dac exist atributul
{ } = = K , A ,..., A , A A
n 2 1
, i cu K ( depinde tranzitiv de cheie),
atunci dependena se poate elimina descompunnd relaia R n urmtoarele dou
relaii:
[ ] ( ) R R
1
=
[ ] ( ) R A R
A 2
=
Observaie. Conform teoremei de mai sus, relaia R [A, B, C] din exemplul precedent, n
care se manifest dependena tranzitiv B C se descompune fr pierdere de
informaie n:
R
1
[B, C] i R
2
[ A, B]
57
Algoritmul 3NF - de aducere a unei relaii 2NF n 3NF
(eliminarea dependenelor funcionale tranzitive)
Pasul 1. Pentru fiecare dependen funcional tranzitiv din cadrul relaiei considerate,
se creaz o nou relaie, format din atributele implicate n aceast dependen.
Pasul 2. Se stabilete cheia primar a fiecrei noi relaii create la Pasul 1.
Pasul 3. Se introduc n relaia iniial n locul atributelor transferate la Pasul 1, cheile
primare detrminate la Pasul 2.
Aplicaie.
Pentru evidena rezultatelor examenului de licen, se consider relaia:
EXAMEN [nr_matricol, nume_student, program_studiu, nota, prof_coordonator, catedra]
Nr matricol Nume student Program Nota Prof coord Catedra
2345 Ionescu M ECTS 9.45 Zamfir R MKTS
5678 Popescu V MK 9.30 Teodorescu N MKTS
7890 Georgescu D CIG 9.70 Oancea C FBC
4567 Constantinescu FB 9.60 Cristea D FBC
3456 Marinescu H CIG 9.20 Andreescu M MNIE
Cheia relaiei este nr_matricol, iar dependeele funcionale care se manifest sunt:
(1) nr_matricol nume_student
(2) nr_matricol program_studii
(3) nr_matricol nota
(4) nr_matricol prof_coordonator
(5) nr_matricol catedra
(6) prof_coordonator catedra
Observaie.
- relaia EXAMEN este n 2NF, deoarece toate valorile atributelor sunt atomice, nu avem
atribute repetitive (1NF) i nu exist dependene funcionale pariale (2NF).
- dependenele (4) i (6) arat ca atributul catedra depinde tranzitiv de cheia primar a
relaiei.
Aplicarea Algoritmului 3NF - de aducere a unei relaii 2NF n 3NF bazat pe Teorema 3,
conduce la spargerea relaiei EXAMEN, n dou relaii n 3NF:
REZULTAT [nr_matricol, nume_student, program_studiu, nota, prof_coordonator]
PROFESOR [prof_coordonator, catedra]
58
REZULTAT
Nr matricol Nume student Program Nota Prof coord
2345 Ionescu M ECTS 9.45 Zamfir R
5678 Popescu V MK 9.30 Teodorescu N
7890 Georgescu D CIG 9.70 Oancea C
4567 Constantinescu FB 9.60 Cristea D
3456 Marinescu H CIG 9.20 Andreescu M
PROFESOR
Prof coord Catedra
Zamfir R MKTS
Teodorescu N MKTS
Oancea C FBC
Cristea D FBC
Andreescu M MNIE
Rezumat.
1NF toate atributele sunt atomice i nu exist atribute repetitive
2NF 1NF + orice atribut noncheie este complet dependent funcional de cheie
(nu exist dependene funcionale pariale)
3NF 2NF + atributele care nu aparin cheii nu depind tranzitiv de cheie
(nu exist dependene funcionale tranzitive /
nu exist dependene funcionale ntre atributele noncheie)
59
CAP. 5. APLICAII
FIRMA DE COMERCIALIZARE PRODUSE ELECTRONICE
FURNIZORI [cod_furnizor, nume_furnizor, CIF, adresa, localitate, cont, tel, email]
(FURNIZ)
FACTURI_PRIMITE [nr_factura, cod_furnizor, data_factura, valoare, tva_deductibil]
(FACTP)
CLIENTI [cod_client, tip_client, nume_client, adresa, localitate]
(CLI)
PRODUSE [ cod_produs, denumire, um, grupa]
(PROD)
FACTURI_EMISE [nr_factura, data_factura, cod_client, valoare, tva_colectat]
(FACTE)
DETALII_FACTURA [nr_factura, cod_produs, cantitate, pret_unitar]
(FACTD)
P1. Cum se numesc furnizorii din Braov ?
Lista: |cod_furnizor | nume_furnizor | CIF |
AR
R1 = SELECT (FURNIZ; localitate = Brasov)
R2 = PROJECT (R1; cod_furnizor, nume_furnizor, CIF)
MS ACCESS
SELECT cod_furnizor, nume_furnizor, CIF
FROM furniz
WHERE localitate="Brasov";
P2. Lista cu numerele i valorile facturilor primite, ce au fost ntocmite dup 1.03.2009
i au o valoare mai mare de 500 lei?
AR
R1 = SELECT (FACTP; (data_factura > 1.03.2009) and (valoare>500))
R2 = PROJECT (R1; nr_factura, valoare)
MS ACCESS
SELECT nr_factura, valoare
FROM factp
WHERE data_factura>#3/1/2009# AND valoare>500;
60
P3. Care sunt localitile n care firma i are partenerii de afaceri?
Ci clieni exist n fiecare localitate?
AR
R1 = PROJECT (FURNIZ; localitate)
R2 = PROJECT (CLI; localitate)
R3 = UNION (R1, R2)
Q1 = COUNT (CLI; localitate)
Q2 = PROJECT (Q1; localitate, count)
MS ACCESS
SELECT distinct localitate
FROM furniz
UNION (SELECT localitate FROM cli);
SELECT count(*), localitate
FROM cli
GROUP BY localitate;
Dac dorim s vedem ci parteneri comerciali avem in fiecare localitate vom avea:
SELECT Count(*) AS nr, total.localitate
FROM [SELECT cod_furnizor AS cod_partener, localitate FROM furniz
UNION (SELECT cod_client AS cod_partener, localitate FROM cli)]. AS total
GROUP BY total.localitate;
P4. Lista facturilor primite n acest an.
Lista: |nr_factura | data_factura | cod_furnizor | nume_furnizor |
AR
R1 = SELECT (FACTP; data_factura > 1.01.2009)
R2 = NATURAL JOIN (R1, FURNIZ; cod_furnizor)
R3 = PROJECT (R2; nr_factura, data_factura, cod_furnizor, nume_furnizor)
MS ACCESS
SELECT nr_factura, data_factura, factp.cod_furnizor, nume_furnizor
FROM furniz, factp
WHERE factp.cod_furnizor=furniz.cod_furnizor AND data_factura>#1/1/2009#;
Sau:
SELECT nr_factura, data_factura, factp.cod_furnizor, nume_furnizor
FROM furniz, factp
61
WHERE factp.cod_furnizor=furniz.cod_furnizor AND
YEAR(data_factura)=YEAR(DATE());
P5. De la care furnizori s-au primit facturi ntocmite n data de 4.03.2009?
Lista: |nr_factura | cod_furnizor | nume_furnizor |
AR
R1 = SELECT (FACTP; data_factura = 4.03.2009)
R2 = NATURAL JOIN (R1, FURNIZ; cod_furnizor)
R3 = PROJECT (R2; nr_factura, cod_furnizor, nume_furnizor)
Sau:
Q1 = NATURAL JOIN (FACTP, FURNIZ; cod_furnizor)
Q2 = SELECT (Q1; data_factura = 4.03.2009)
Q3 = PROJECT (Q2; nr_factura, cod_furnizor, nume_furnizor)
MS ACCESS
SELECT nr_factura, factp.cod_furnizor, nume_furnizor
FROM factp, furniz
WHERE furniz.cod_furnizor=factp.cod_furnizor AND data_factura=#3/4/2009#;
Sau:
SELECT nr_factura, factp.cod_furnizor, nume_furnizor
FROM factp
INNER JOIN furniz ON furniz.cod_furnizor=factp.cod_furnizor
WHERE data_factura=#3/4/2009#;
P6. n ce localiti se gsesc clienii care au cumprat produsul XYZ?
AR
R1 = SELECT (PROD; denumire = XYZ)
R2 = NATURAL JOIN (R1, FACTD; cod_produs)
R3 = NATURAL JOIN (R2, FACTE; nr_factura)
R4 = NATURAL JOIN (R3, CLI; cod_client)
R5 = PROJECT (R4; localitate)
MS ACCESS
SELECT DISTINCT localitate
FROM cli, prod, facte, pdfe
WHERE facte.cod_client=cli.cod_client
AND facte.nr_factura=pdfe.nr_factura
AND pdfe.cod_produs=prod.cod_produs
AND prod.denumire="xyz";
62
P7. n ce localiti s-a vndut produsul XYZ n perioada 15.04.2009 30.04.2009 ?
AR
R1 = SELECT (PROD; denumire = XYZ)
R2 = NATURAL JOIN (R1, FACTD; cod_produs)
R3 = SELECT (FACTE; (data_factura>14.04.2009) and (data_factura<1.05.2009))
R4 = NATURAL JOIN (R2, R3; nr_factura)
R5 = NATURAL JOIN (R4, CLI; cod_client)
R6 = PROJECT (R5; localitate)
MS ACCESS
SELECT DISTINCT localitate
FROM cli, prod, facte, pdfe
WHERE facte.cod_client=cli.cod_client
AND facte.nr_factura=pdfe.nr_factura
AND pdfe.cod_produs=prod.cod_produs
AND prod.denumire="xyz"
AND data_factura BETWEEN #4/15/2009# AND #4/30/2009#;
Sau:
SELECT DISTINCT localitate
FROM cli, prod, facte, pdfe
WHERE facte.cod_client=cli.cod_client
AND facte.nr_factura=pdfe.nr_factura
AND pdfe.cod_produs=prod.cod_produs
AND prod.denumire="xyz"
AND (data_factura>=#4/15/2009# AND data_factura<=#4/30/2009#);
P8. n care din facturile emise se nregistreaz vnzarea concomitent a tuturor
produselor firmei ?
AR
R1 = PROJECT (FACD; nr_factura, cod_produs)
R2 = PROJECT (PROD; cod_produs)
R3 = DIVISION (R1, R2)
MS ACCESS
SELECT count(*) AS nr_produse, nr_factura
FROM pdfe
GROUP BY nr_factura
HAVING count(*)=(SELECT count(*) FROM prod);
63
P9. n care din facturile emise dup 1 ianuarie 2009 se nregistreaz vnzarea
concomitent a tuturor produselor firmei ?
AR
R1 = NATURAL JOIN (FACTE, FACTD; nr_factura)
R2 = SELECT (R1; data_factura>1.01.2009)
R3 = PROJECT (R2; nr_factura, cod_produs)
R4 = PROJECT (PROD; cod_produs)
R5 = DIVISION (R3, R4)
MS ACCESS
SELECT nr_factura, data_factura
FROM facte
WHERE data_factura>=#01-01-2009# AND nr_factura IN
(SELECT pdfe.nr_factura FROM pdfe, facte GROUP BY pdfe.nr_factura
HAVING count(*)=(SELECT COUNT(*) FROM prod));
P10. Care sunt numerele facturilor emise, n care s-a consemnat vnzarea simultan a
produselor XYZ i ABC ?
AR
R1 = SELECT (PROD; denumire = XYZ)
R2 = NATURAL JOIN (R1, FACTD; cod_produs)
R3 = PROJECT (R2; nr_factura)
R4 = SELECT (PROD; denumire = ABC)
R5 = NATURAL JOIN (R4, FACTD; cod_produs)
R6 = PROJECT (R5; nr_factura)
R7 = INTERSECT (R3, R6)
Varianta 2
R1 = PROJECT (FACTD; nr_factura, cod_produs)
R2 = SELECT (PROD; (denumire = XYZ) or (denumire = ABC))
R3 = PROJECT (R2; cod_produs)
R4 = DIVISION (R1, R3)
MS ACCESS
SELECT DISTINCT facte.nr_factura
FROM cli, prod, facte, pdfe
WHERE facte.cod_client=cli.cod_client
AND facte.nr_factura=pdfe.nr_factura
AND pdfe.cod_produs=prod.cod_produs
AND (prod.denumire="xyz" OR prod.denumire="abc");
64
Sau:
SELECT DISTINCT facte.nr_factura
FROM cli, prod, facte, pdfe
WHERE facte.cod_client=cli.cod_client
AND facte.nr_factura=pdfe.nr_factura
AND pdfe.cod_produs=prod.cod_produs
AND prod.denumire IN ("xyz","abc");
Sau:
SELECT DISTINCT facte.nr_factura
FROM cli, facte, pdfe,
[SELECT * FROM prod WHERE prod.denumire IN ("xyz","abc")]. AS tmp
WHERE facte.cod_client=cli.cod_client
AND facte.nr_factura=pdfe.nr_factura
AND pdfe.cod_produs=prod.cod_produs;
P11. Care este valoarea total a facturilor emise n luna mai 2009 pentru fiecare
client?
Lista: |cod_client | nume_client | valoare totala |
AR
R1 = SELECT (FACTE; (data_factura 01.05.2009) and (data_factura 31.05.2009))
R2 = SUM (R1, valoare; cod_client)
R3 = NATURAL JOIN (R2, CLI; cod_client)
R4 = PROJECT (R3; cod_client, nume_client, sum)
MS ACCESS
SELECT tmp.total, tmp.cod_client, nume_client
FROM cli,
[SELECT sum(valoare) AS total, facte.cod_client FROM facte
WHERE year(data_factura)=2009 AND month(data_factura)=5
GROUP BY facte.cod_client]. AS tmp
WHERE tmp.cod_client=cli.cod_client;
P12. Care este valoarea total a facturilor emise n luna mai 2009 pentru fiecare client
persoan fizic?
Lista: |cod_client | nume_client | valoare totala |
AR
R1 = SELECT (FACTE; (data_factura 01.05.2009) and (data_factura 31.05.2009))
65
R2 = SUM (R1, valoare; cod_client)
R3 = SELECT (CLI; tip_client = F)
R4 = NATURAL JOIN (R2, R3; cod_client)
R5 = PROJECT (R4; cod_client, nume_client, sum)
MS ACCESS
SELECT tmp.total, tmp.cod_client, nume_client
FROM cli,
[SELECT sum(valoare) AS total, cod_client FROM facte
WHERE year(data_factura)=2009 and month(data_factura)=5 and cod_client
IN (SELECT cod_client FROM cli WHERE tip_client="f")
GROUP BY cod_client]. AS tmp
WHERE tmp.cod_client=cli.cod_client;
P13. Care sunt valorile totale TVA colectat i TVA deductibil n luna mai 2009?
AR
R1 = SELECT (FACTE; (data_factura 01.05.2009) and (data_factura 31.05.2009))
R2 = SUM (R1, tva_colectat)
Q1 = SELECT (FACTP; (data_factura 01.05.2009) and (data_factura 31.05.2009))
Q2 = SUM (Q1, tva_deductibil)
MS ACCESS
(SELECT sum(factp.valoare*19/100) AS tva FROM factp)
UNION (SELECT sum(facte.valoare*19/100) AS tva FROM facte);
P14. Care este valoarea maxim a facturilor emise n luna mai 2009 pentru fiecare
client persoan juridic?
Lista: |cod_client | nume_client | valoare maxim factur |
AR
R1 = SELECT (FACTE; (data_factura 01.05.2009) and (data_factura 31.05.2009))
R2 = MAX (R1, valoare; cod_client)
R3 = SELECT (CLI; tip_client = J)
R4 = NATURAL JOIN (R2, R3; cod_client)
R5 = PROJECT (R4; cod_client, nume_client, max)
MS ACCESS
SELECT tmp.total, tmp.cod_client, nume_client
FROM cli,
[SELECT MAX(valoare) AS total, cod_client FROM facte WHERE cod_client
IN (SELECT cod_client FROM cli WHERE tip_client="j")
AND YEAR(data_factura)=2009
AND MONTH(data_factura)=5 GROUP BY cod_client]. AS tmp
WHERE tmp.cod_client=cli.cod_client;
66
BIBLIOGRAFIE
1. AIRINEI D., Depozite de date, Editura Polirom, Iai, 2002.
2. BSC O., Baze de date, Editura ALL, Bucureti, 1997.
3. CONNOLLY Th., .a., Baze de date. Proiectare, Implementare, Gestionare,
Editura Teora, Bucureti, 2001.
4. CONNOLLY Th., .a., Database Systems, Addison-Wesley, 2002.
5. DATE C.J., Baze de date, Editura Plus, Bucureti, 2005.
6. DOLLINGER R., Baze de date i gestiunea tranzaciilor, Editura Albastr,
Cluj Napoca, 1998.
7. DOLLINGER R., Utilizarea sistemului SQL Server, Editura Albastr,
Cluj Napoca, 2001.
8. EAGLESTONE B., .a., Web Database Systems, Mc Graw Hill Book Company,
Londra, 2001.
9. FLORESCU V., .a., Baze de date, Editura Economic, Bucureti, 1999.
10. FOTACHE M., Baze de date relaionale, Editura Junimea, Iai, 1997.
11. FOTACHE M., SQL, Editura Polirom, Iai, 2001.
12. FOTACHE M., Proiectarea bazelor de date, Editura Polirom, 2005.
13. Grupul BDASEIG, Baze de date. Fundamente teoretice i practice,
Editura Infomega, Bucureti, 2002.
14. HERNANDEZ M., Proiectarea bazelor de date, Ed. Teora, 2003.
15. HORGA M., .a., Limbajul SQL n Oracle i Visual FoxPro,
Editura Bibliotheca, Trgovite, 2007.
16. IONESCU F., Baze de date relaionale i aplicaii, Editura Tehnic,
Bucureti, 2004.
17. LUNGU I., .a., Baze de date. Organizare, proiectare i implementare,
Editura ALL Educational, Bucureti, 1995.
18. LUNGU I., .a., Baze de date. Sistemul ORACLE, Ed. Economic,
Bucureti, 2002.
19. LUNGU I., Baze de date ORACLE. Limbajul SQL, Editura ASE,
Bucureti, 2005.
20. MEIER A., Introduction pratique aux bases de donnes relationnelles,
Ed. Springer France, 2006
21. MIRANDA S.M., BUSTA J.M., Lart des bases de donnes, Ed. Eyrolles,
Paris, 1988.
22. PASCU C., .a., Totul despre SQL, Editura Tehnic, Bucureti, 1994.
23. POPA GHE., .a., Sisteme de gestiune a bazelor de date, Editura Cison,
Bucureti, 1996.
24. POPESCU I., Baze de date relaionale, Editura. Universitii din Bucureti,
Bucureti, 1996.
25. POPESCU I., ORACLE 8. Prelucrarea avansat a informaiei, Ed. Tehnic,
Bucureti,1999.
26. POPESCU I., Modelarea bazelor de date, Editura Tehnic, Bucureti, 2001.
27. POPESCU I., .a., Programare avansat n ORACLE 9i, Editura Tehnic,
Bucureti, 2004.
67
28. REBOUL G., Informatique de gestion. Analyse et modle relationnel,
Ed. Dunod, Paris, 1997.
29. STANCIU A., .a., Baze de date. Introducere n SQL SERVER 2008,
Editura Infomega, Bucureti, 2008.
30. STANCIU A., .a., Baze de date Access 2007, Editura Infomega, Bucureti, 2009.
31. TEFAN V., Tehnologii orientate obiect pentru baze de date relaionale,
Editura Infomega, Bucureti, 2006.
32. MBULEA L., Structuri de date i baze de date, Universitatea Babe-Bolyai
Cluj Napoca, 1992.
33. VELICANU M., .a., Sisteme de gestiune a bazelor de date, Editura Petrion,
Bucureti, 2000.
34. VELICANU M., .a., Sisteme de baze de date. Teorie i practic, Editura Petrion,
Bucureti, 2003.