Sunteți pe pagina 1din 239

Florin Radulescu - Baze de date (note de curs)

BAZE DE DATE NOTARE


1. 60% în timpul semestrului, astfel
Curs: Florin RĂDULESCU (3CB)
 Prezenţa la curs: 10%
Email: florin.radulescu@cs.pub.ro
 Prezenţa, activitatea şi rezultatul
testului de final laborator: 30%
Lab: Cf. orar
 Lucrare la mijlocul semestrului, fără
degrevare: 20%
2. 40% Verificarea finală (examen)
F. Rădulescu. Curs: Baze de date I 1 F. Rădulescu. Curs: Baze de date I 2

Verificarea finală Cursul 1


 Test grilă din materia de la curs, fără
documentaţie la dispozitie.
 Include si intrebari din partea de SQL.
Concepte şi
problematică

F. Rădulescu. Curs: Baze de date I 3 F. Rădulescu. Curs: Baze de date I 4

Sumar - curs 1 si curs 2 1. DEFINITII


1. Bază de date (BD) şi Sistem de
gestiune a bazelor de date (SGBD) Bază de date
2. Problematica domeniului.
Sistem de gestiune a
3. Funcţiile unui SGBD
4. Categorii de utilizatori pentru un SGBD.
bazelor de date
5. Nivele de descriere şi independenţa
date-program.

F. Rădulescu. Curs: Baze de date I 5 F. Rădulescu. Curs: Baze de date I 6

1
Florin Radulescu - Baze de date (note de curs)

Definiţie: O bază de date (BD, eng. Definiţie: Un sistem de gestiune a


DB) este: bazelor de date (SGBD/DBMS) este
 Un ansamblu de programe
 un ansamblu structurat de date
 Permite utilizatorului sa interacţioneze cu o
 înregistrat pe suporturi accesibile bază de date
calculatorului Este cel care actioneaza pentru a
 pentru a satisface simultan cerintele mai  satisface simultan cerintele mai multori
multori utilizatori utilizatori
 intr-un mod selectiv şi  într-un mod selectiv şi
 în timp util.
 în timp util.
SGBD-ul are şi funcţii pentru:
 Asigurarea siguranţei în funcţionare
 Salvarea şi restaurarea datelor

F. Rădulescu. Curs: Baze de date I 7 F. Rădulescu. Curs: Baze de date I 8

Sumar 2. Problematica domeniului


1. Bază de date (BD) şi Sistem de O bază de date (BD, eng. DB) este:
gestiune a bazelor de date (SGBD)  un ansamblu structurat de date
 înregistrat pe suporturi accesibile
2. Problematica domeniului. calculatorului
3. Funcţiile unui SGBD  pentru a satisface simultan cerintele mai
multori utilizatori
4. Categorii de utilizatori pentru un SGBD.
 intr-un mod selectiv şi
5. Nivele de descriere şi independenţa  în timp util.
date-program.

F. Rădulescu. Curs: Baze de date I 9 F. Rădulescu. Curs: Baze de date I 10

… un ansamblu structurat de Modelul ierarhic


date … 1. Modelul ierarhic:
 datele sunt organizate sub forma arborescenta
 Modelul datelor: Regulile şi conceptele
 nodurile constau în înregistrari
care permit descrierea structurii unei BD  arcele sunt referinţe către alte noduri.
(model de tip matematic).  fiecare nod are un singur părinte şi poate avea mai mulţi
 Au existat succesiv trei modele 'clasice': descendenţi

1. Modelul ierarhic
2. Modelul retea
3. Modelul relaţional

Sursa: www.wikipedia.org

F. Rădulescu. Curs: Baze de date I 11 F. Rădulescu. Curs: Baze de date I 12

2
Florin Radulescu - Baze de date (note de curs)

Modelul retea Modelul relaţional


2. Modelul retea : 3. Modelul relaţional :
 datele sunt organizate sub forma unui graf orientat.  datele sunt organizate sub formă de tabele.
 nodurile constau în înregistrari  fiecare înregistrare este o linie într-o tabelă
 arcele sunt referinţe către alte noduri.  nu există pointeri dar tabelele sunt legate prin coloane
 fiecare nod poate avea mai multi părinţi şi mai mulţi comune sau corelate
descendenţi

Sursa: www.wikipedia.org Sursa: www.wikipedia.org

F. Rădulescu. Curs: Baze de date I 13 F. Rădulescu. Curs: Baze de date I 14

RELAŢIE CONSTRÂNGERI DE
Relaţie: termen provenit din matematică INTEGRITATE
Reprezentarea intuitivă: o tabelă. De asemenea descrierea poate include
Schema unei baze de date relaţionale = informaţii despre elementele de identificare
descrierea structurii acesteia: ale înregistrarilor dintr-o tabela (cheie
 Numele relaţiilor (numele tabelelor), primara), a coloanelor comune cu alte tabele
 Numele atributelor fiecărei relaţii (coloanele (chei straine) şi a altor restricţii şi verificari de
tabelelor) corectitudine pentru datele stocate.
 Tipul de date asociat acestor atribute (coloane). Aceste informaţii sunt cunoscute sub numele
generic de constrangeri de integritate.

F. Rădulescu. Curs: Baze de date I 15 F. Rădulescu. Curs: Baze de date I 16

EXEMPLU
MODELUL ENTITATE-ASOCIERE (EA)
Acesta este un model generic de descriere a
structurii datelor sub forma grafica - Sotie
A_Absolvit

diagrame entitate asociere - din care se


Casatorit
poate trece pe baza unor reguli de STUDENT FACULT
transformare în alte modele de date. An

Si operaţiile de proiectare a structurii unei Sot

baze de date sunt facute în general cu IS Nume IF Nume


Apartine_de
ajutorul modelului entitate-asociere.

F. Rădulescu. Curs: Baze de date I 17 F. Rădulescu. Curs: Baze de date I 18

3
Florin Radulescu - Baze de date (note de curs)

Problematica domeniului Suporturi accesibile…


În limbajul curent se intalnesc expresii ca:
O bază de date (BD, eng. DB) este: "avem aceasta informaţie în baza noastra de
date" şi în cazurile în care datele respective
 un ansamblu structurat de date sunt de exemplu stocate sub forma unor fise
 înregistrat pe suporturi accesibile (pe hartie) sortate alfabetic sau dupa alte
calculatorului criterii.
În acest caz este vorba despre o extensie a
 pentru a satisface simultan cerintele mai termenului de bază de date.
multori utilizatori
În cazul sistemelor de gestiune a bazelor de
 intr-un mod selectiv şi date suporturile pe care sunt cele folosite de
 în timp util. un sistem de calcul (magnetice, optice, etc).

F. Rădulescu. Curs: Baze de date I 19 F. Rădulescu. Curs: Baze de date I 20

Problematica domeniului ... pentru a satisface simultan


O bază de date (BD, eng. DB) este:
cerintele mai multor utilizatori ...
 un ansamblu structurat de date 1. Gestiunea utilizatorilor. Un SGBD
 înregistrat pe suporturi accesibile trebuie sa permita crearea, modificarea şi
calculatorului stergerea utilizatorilor. Operaţia este
 pentru a satisface simultan cerintele efectuata de obicei de administratorul bazei
mai multori utilizatori de date.
 intr-un mod selectiv şi 2. Concurenta la date. În cazul accesului
 în timp util. simultan al mai multor utilizatori la aceleasi
date un SGBD trebuie sa aiba mecanisme
pentru a preintampina inconsistenta datelor.
F. Rădulescu. Curs: Baze de date I 21 F. Rădulescu. Curs: Baze de date I 22

CONCURENTA - EXEMPLU PLANIFICARE POSIBILA


Fie o portiune a bazei de date, notata A, în care MOMENT AG. 1 AG. 2 A IN BD
se tine numarul de locuri disponibile la o T1 READ A 10
cursa aeriana şi doua executii ale unui
program de rezervare rulat de doua agentii T2 READ A 10
de bilete diferite. Ele contin secventa: T3 A=A–1 10
READ A /* se citeste numarul de locuri disponibile din BD */ T4 A=A–1 10
A = A – 1 /* se decrementează cu o unitate */
T5 WRITE A 9
WRITE A /* se scrie noul numar de locuri disponibile în BD */
T6 WRITE A 9 ! Gresit
F. Rădulescu. Curs: Baze de date I 23 F. Rădulescu. Curs: Baze de date I 24

4
Florin Radulescu - Baze de date (note de curs)

Se observa ca desi s-au rezervat 2 locuri, A a


scazut cu doar o unitate. O astfel de situaţie Problematica domeniului
trebuie preintampinata. O bază de date (BD, eng. DB) este:
In curs vom prezenta problemele legate de:  un ansamblu structurat de date
 blocarea (acapararea) unor portiuni ale BD de catre  înregistrat pe suporturi accesibile
o executie a unui program, calculatorului
 rezolvarea problemelor pe care le poate ridica
asteptarea circulara pentru deblocarea acestor portiuni  pentru a satisface simultan cerintele mai
(deadlock), multori utilizatori
 executia pasilor programelor de actualizare a BD
echivalenta cu o executie secventiala a programelor  intr-un mod selectiv şi
(serializabilitate) şi  în timp util.
 reguli de scriere a programelor de aplicaţie pentru
rezolvarea problemelor de acces concurent
(protocoale).
F. Rădulescu. Curs: Baze de date I 25 F. Rădulescu. Curs: Baze de date I 26

... intr-un mod selectiv ... MOTIV


Blocarea accesului unor categorii de utilizatori
Orice SGBD are mecanisme prin care diversilor la date pe care nu trebuie sa le acceseze. În
utilizatori sau categorii de utilizatori li se acest fel este asigurata una dintre funcţiunile
asociaza drepturi de acces specifice la de baza ale unui SGBD şi anume
obiectele bazei de date. confidentialitatea datelor.
În acest mod fiecarui utilizator i se da dreptul Blocarea accesului unor categorii de utilizatori
de a efectua doar operaţiile specifice la date de care nu au nevoie în activitatea
activitaţii sale şi doar pe acea portiune a lor, minimizându-se astfel riscul distrugerii
accidentale a datelor prin operaţii
bazei de date care este necesara pentru
necorespunzatoare.
acestea.
F. Rădulescu. Curs: Baze de date I 27 F. Rădulescu. Curs: Baze de date I 28

Problematica domeniului ... şi în timp util (1)...


O bază de date (BD, eng. DB) este:
 un ansamblu structurat de date În cazul bazelor de date de dimensiuni mari
este evident ca orice cautare care s-ar baza
 înregistrat pe suporturi accesibile pe o parcurgere secventiala a înregistrarilor
calculatorului din tabele ar duce la timpi de raspuns
 pentru a satisface simultan cerintele mai inadecvat de mari.
multori utilizatori De asemenea, operaţii mai complicate prin
 intr-un mod selectiv şi care se regasesc date stocate în mai multe
 în timp util. tabele legate intre ele prin coloane comune
pot duce în lipsa unor algoritmi specifici la
timpi de executie inacceptabili.

F. Rădulescu. Curs: Baze de date I 29 F. Rădulescu. Curs: Baze de date I 30

5
Florin Radulescu - Baze de date (note de curs)

... şi în timp util (2)... Sumar


1. Bază de date (BD) şi Sistem de
De aceea orice SGBD are mecanisme prin gestiune a bazelor de date (SGBD)
care minimizează timpul de raspuns,
2. Problematica domeniului.
mecanisme bazate în special pe indecşi
şi modalităţi specifice de organizare 3. Funcţiile unui SGBD
fizica a datelor. 4. Categorii de utilizatori pentru un SGBD.
5. Nivele de descriere şi independenţa
date-program.

F. Rădulescu. Curs: Baze de date I 31 F. Rădulescu. Curs: Baze de date I 32

3. Funcţiile unui SGBD Descrierea datelor (1)


 Un SGBD trebuie sa includă posibilitatea descrierii
stucturii obiectelor care formează baza de date. În
cazul bazelor de date relaţionale aceasta consta în
1. Descrierea datelor principal în posibilitatea creării şi modificării structurii
2. Utilizarea datelor tabelelor şi constrangerilor de integritate asociate
acestora.
3. Integritatea datelor  Limbajul prin care se realizează aceste operaţii se
numeste Limbaj de Descriere a Datelor (LDD) şi în
4. Confidentialitatea datelor cazul primelor sisteme de gestiune el era
implementat sub forma unor module separate. În
5. Accesul concurent la date sistemele relaţionale bazate pe SQL aceste operaţii
6. Siguranta în funcţionare au fost incluse în limbaj sub forma comenzilor de tip
CREATE (pentru creare) sau ALTER (modificare).

F. Rădulescu. Curs: Baze de date I 33 F. Rădulescu. Curs: Baze de date I 34

Descrierea datelor (2) Descrierea datelor (3)


Aceste tabele sunt accesate de sistem pentru
O caracteristica importanta a sistemelor a regasi informaţiile necesare executiei
relaţionale este aceea ca descrierea structurii cererilor dar pot fi accesate şi de utilizatori
pentru a obtine informaţii privind structura
bazei de date este stocata în acelasi mod ca bazei de date.
şi baza de date în sine. Astfel toate informaţiile de sistem necesare
Exista pentru aceasta o serie de tabele unui SGBD relaţional sunt stocate în acelasi
gestionate direct de sistemul de gestiune mod, inclusiv descrierea utilizatorilor şi a
drepturilor de acces ale acestora.
numite (Dictionarul de date sau
Aceasta abordare a fost necesara pentru a nu
Cataloage) care contin descrierea obiectelor avea mecanisme diferite de acces la datele de
care formează baza de date. sistem şi la datele stocate în baza de date.

F. Rădulescu. Curs: Baze de date I 35 F. Rădulescu. Curs: Baze de date I 36

6
Florin Radulescu - Baze de date (note de curs)

Funcţiile unui SGBD Utilizarea datelor (2)


Aceasta funcţie include operaţiile de lucru cu
datele înregistrate intr-o bază de date.
1. Descrierea datelor
Exista patru categorii de operaţii principale:
2. Utilizarea datelor  Inserarea de noi date. Aceasta se concretizează
prin adaugarea de noi linii în tabelele care
3. Integritatea datelor formează baza de date.
4. Confidentialitatea datelor  Stergerea de linii din tabele.
 Actualizarea datelor, insemnând modificarea
5. Accesul concurent la date
continutului unor linii existente în tabele.
6. Siguranta în funcţionare  Regasirea datelor dupa anumite criterii de
cautare
F. Rădulescu. Curs: Baze de date I 37 F. Rădulescu. Curs: Baze de date I 38

Utilizarea datelor (3) Utilizarea datelor (4)


Pentru implementarea acestei funcţii Operaţia de regasire este esentiala, ea fiind
fiecare SGBD are un Limbaj de necesara şi în cazul celorlalte trei operaţii:
Manipulare a Datelor (LMD) care 1. În cazul inserarii, dacă aceeaşi informaţie nu
poate fi un modul separat sau inclus în poate fi prezenta de mai multe ori în baza
de date, este necesara o cautare prealabila
limbajul sistemului cum este în cazul
pentru a verifica acest lucru.
SQL.
2. În cazul stergerii şi actualizarii este necesara
localizarea datelor care vor fi eliminate sau
modificate.
F. Rădulescu. Curs: Baze de date I 39 F. Rădulescu. Curs: Baze de date I 40

Executia unei cereri - etape Funcţiile unui SGBD


1. Consultarea cataloagelor de sistem pentru a verifica
existenta obiectelor implicate şi a afla structura şi
proprietaţile acestora precum şi pentru a verifica
daca utilizatorul care a lansat comanda are dreptul 1. Descrierea datelor
de a efectua operaţia respectiva
2. Crearea unui plan de executie optim pentru
2. Utilizarea datelor
operaţia respectiva, luând în consideraţie existenta
unor eventuale structuri de cautare rapida 3. Integritatea datelor
(indecsi).
3. Executia operaţiei şi verificarea faptului ca
4. Confidentialitatea datelor
rezultatul nu violează constrangerile de integritate 5. Accesul concurent la date
existente
4. Executarea altor operaţii care pot fi declansate 6. Siguranta în funcţionare
automat de operaţia de baza (în cazul în care
sistemul suporta astfel de operaţii).
F. Rădulescu. Curs: Baze de date I 41 F. Rădulescu. Curs: Baze de date I 42

7
Florin Radulescu - Baze de date (note de curs)

Integritatea datelor (1) Integritatea datelor (2)


Majoritatea sistemelor de gestiune permit Sa consideram o bază de date
definirea unor reguli pe care datele stocate
trebuie sa le verifice numite constrangeri continând informaţii despre
de integritate.  facultaţi,
În cazul în care o operaţie are ca rezultat
violarea acestor restricţii aceasta este  studentii inscrisi şi
automat rejectata şi nu are efect în baza de  notele obtinute de acestia.
date.
În felul acesta este asigurata o mai mare
siguranta în ceea ce priveste corectitudinea
datelor.
F. Rădulescu. Curs: Baze de date I 43 F. Rădulescu. Curs: Baze de date I 44

Integritatea datelor (3) Integritatea datelor (4)


Introducerea accidentala de valori incorecte
în baza de date. Exemplu: restricţie privind
intervalul de valori admisibil pentru note: 0- Definirea de constrangeri de integritate
10.
Lasarea necompletata a unor informaţii nu previne insa total erorile accidentale
necesare. Exemplu: numele studentului. de operare: de exemplu introducerea
Alocarea accidentala a aceluiasi numar din greseala a unei note de 4 în loc de 5
matricol pentru mai multi studenti
(constrangere de cheie primara sau de nu va fi semnalata, ambele valori fiind
unicitate a valorilor). în intervalul admisibil.
Introducerea accidentala a unui student cu
un cod incorect al facultaţii la care acesta
este inscris (constragnere referentiala)
F. Rădulescu. Curs: Baze de date I 45 F. Rădulescu. Curs: Baze de date I 46

Confidentialitatea datelor (1)


Funcţiile unui SGBD  Accesul la date este permis doar utilizatorilor
înregistraţi şi doar în masura drepturilor de acces
alocate.
1. Descrierea datelor  Un utilizator este identificat printr-un nume-
2. Utilizarea datelor utilizator şi o parola.
 Fiecarui utilizator i se permite accesul doar la o
3. Integritatea datelor portiune a bazei de date şi doar pentru a efectua
anumite tipuri de operaţii.
4. Confidentialitatea datelor  Toate aceste informaţii relative la ce, cum şi de unde
5. Accesul concurent la date poate accesa datele un utilizator reprezinta
drepturile de acces asociate acestuia
6. Siguranta în funcţionare  Drepturile de acces sunt stocate în cataloagele
sistemului (dictionarul de date).

F. Rădulescu. Curs: Baze de date I 47 F. Rădulescu. Curs: Baze de date I 48

8
Florin Radulescu - Baze de date (note de curs)

Confidentialitatea datelor (1)


Funcţiile unui SGBD
Prin mecanismul de drepturi de acces
este asigurata funcţia de 1. Descrierea datelor
confidentialitate a datelor.
2. Utilizarea datelor
Este prevenita posibilitatea de acces la
date a persoanelor care nu au acest 3. Integritatea datelor
drept. 4. Confidentialitatea datelor
Exemplu: în cazul sistemului informatic al 5. Accesul concurent la date
unei organizaţii, acces selectiv la salariile
angajaţilor, detalii ale proceselor 6. Siguranta în funcţionare
tehnologice, datele contabile etc.
F. Rădulescu. Curs: Baze de date I 49 F. Rădulescu. Curs: Baze de date I 50

Accesul concurent la date (1) Accesul concurent la date (2)


Facilităţi de blocare a unor portiuni ale
bazei de date. Aceasta inseamna ca o  LOCK A /* se blochează articolul A */
executie a unui program poate capata un  READ A /* se citeste A din BD */
acces exclusiv la o portiune a bazei de date,  A= A–1 /* se decrementează A*/
denumita şi articol, moment în care orice  WRITE A /* se scrie A în BD */
alta executie trebuie sa astepte deblocarea  UNLOCK A /* se deblochează A */
acesteia pentru a continua.
Daca notam operaţiile de blocare şi deblocare
cu LOCK şi UNLOCK, programul de
rezervare de locuri poate fi rescris
F. Rădulescu. Curs: Baze de date I 51 F. Rădulescu. Curs: Baze de date I 52

Accesul concurent la date (3) Accesul concurent la date (4)


Program P1 Program P2
Blocarea articolelor rezolva o serie de ---------- ----------
probleme dar crează premisele aparitiei LOCK A LOCK B
interblocajului, situaţie în care doua LOCK B LOCK A
executii de programe asteapta . . . . . . . . . .
deblocarea unui articol blocat de UNLOCK B UNLOCK A
cealaltă (deadlock) UNLOCK A UNLOCK B

F. Rădulescu. Curs: Baze de date I 53 F. Rădulescu. Curs: Baze de date I 54

9
Florin Radulescu - Baze de date (note de curs)

Accesul concurent la date (5) Funcţiile unui SGBD


Executia serializabila. În cazul mai multor
executii simultane care accesează baza de 1. Descrierea datelor
date se considera ca efectul lor este corect
daca rezultatul final este identic cu executia
2. Utilizarea datelor
lor succesiva. 3. Integritatea datelor
Aceasta proprietate se numeste 4. Confidentialitatea datelor
serializabilitate şi un SGBD trebuie sa puna
5. Accesul concurent la date
la dispozitie mecanisme de asigurare a
serializabilităţii executiilor programelor de 6. Siguranta în funcţionare
acces.
F. Rădulescu. Curs: Baze de date I 55 F. Rădulescu. Curs: Baze de date I 56

Siguranta în funcţionare (1) Siguranta în funcţionare (2)

Desi nu este legata direct de cele Salvarea datelor. Implementarea


prezentate pana acum, siguranta în operaţiilor de salvare este mult mai
funcţionare este o caracteristica sofisticata
esentiala pentru un SGBD Este dificila efectuarea unei de còpii de
Contine acele elemente care exclud sau siguranta consistente ale bazei de date
minimizează posibilitatea de pierdere a în conditiile în care aplicaţia rulează
datelor datorata incidentelor software non-stop şi operarea nu poate fi oprita
sau hardware. pentru efectuarea salvarii.
F. Rădulescu. Curs: Baze de date I 57 F. Rădulescu. Curs: Baze de date I 58

Siguranta în funcţionare (3)


Restaurarea dupa incident. La distrugerea
bazei de date este necesara efectuarea
operaţiei de restaurare din copie.
Multe tipuri de SGBD au posibilitatea de a
Continuarea acestui capitol:
înregistra toate schimbarile aparute în baza
de date sub forma unor fişiere jurnal. Saptamana viitoare
În acest fel operaţia de restaurare dupa
incident se face restaurând ultima copie de
siguranta şi reefectuând toare prelucrarile
consistente înregistrate în jurnal dupa
momentul în care a fost efectuata copia.
F. Rădulescu. Curs: Baze de date I 59 F. Rădulescu. Curs: Baze de date I 60

10
Florin Radulescu - Baze de date (note de curs)

Cursul 2 Sumar - curs 1 si curs 2


1. √ Bază de date (BD) şi Sistem de
gestiune a bazelor de date (SGBD)
Concepte şi 2. √ Problematica domeniului.
3. √ Funcţiile unui SGBD
problematică 4. Categorii de utilizatori pentru un SGBD
- partea a 2-a - 5. Nivele de descriere şi independenţa
date-program

F. Rădulescu. Curs: Baze de date I 1 F. Rădulescu. Curs: Baze de date I 2

Categorii de utilizatori Utilizatori privilegiaţi


 Acestia sunt utilizatori care au dreptul de a afectua
toate tipurile de operaţii puse la dispozitie de
În paragrafele precedente a fost folosit sistem. Termenul generic pentru acest tip de
frecvent termenul de utilizator. În cele ce utilizatori este cel de administrator al bazei de
urmează sunt prezentate categoriile de date (ABD)
utilizatori care interacţionează cu o bază de  În general este vorba de una sau mai multe
date. persoane care raspund de buna funcţionare a
Din punct de vedere al drepturilor de SGBD-ului. Principalele funcţii indeplinite de
administrator sunt:
acces, ca şi în cazul sistemelor de operare,
un SGBD are doua tipuri principale de 1. Crearea şi modificarea structurii bazei de date.
Aici sunt incluse operaţiile de creare şi modificare
utilizatori: a tabelelor şi a celorlalte obiecte ale bazei de date
Utilizatori privilegiaţi necesare aplicaţiilor folosite în organizaţia
Utilizatori neprivilegiaţi respectiva.
F. Rădulescu. Curs: Baze de date I 3 F. Rădulescu. Curs: Baze de date I 4

Utilizatori privilegiaţi Utilizatori privilegiaţi


2. Gestiunea utilizatorilor. Administratorul este cel care 4. Salvarea periodica a bazei de date (crearea de
crează noi utilizatori pentru SGBD, le confera drepturile
de acces la date şi poate schimba acest tip de informaţii copii de siguranta) şi restaurarea sa în caz de
pentru orice utilizator. incident software sau hardware.
 El raspunde deci şi de securitatea datelor şi prevenirea
accesului neautorizat la baza de date în intregime sau la 5. Poate transfera unele dintre drepturile sale de
portiunile sale care nu sunt publice. acces şi altor utilizatori care nu sunt
3. Modificarea parametrilor SGBD. În cazul sistemelor de administratori ai bazei de date în cazurile în
gestiune complexe performantele diferitelor tipuri de care acest lucru este necesar
operaţii sunt influentate de o serie de parametri la
care un utilizator obisnuit nu are acces.  El raspunde de eventualele brese de
 Administratorul este cel care monitorizează securitate care pot apare fiind cel mai în
performantele sistemului şi poate schimba parametrii masura sa evalueze problemele ridicate de un
acestuia pentru optimizarea anumitor operaţii.
astfel de transfer.

F. Rădulescu. Curs: Baze de date I 5 F. Rădulescu. Curs: Baze de date I 6

1
Florin Radulescu - Baze de date (note de curs)

Utilizatori neprivilegiaţi Utilizatori neprivilegiaţi


Acestia sunt utilizatorii obisnuiti ai SGBD-ului şi  Exista doua tipuri de utilizatori neprivilegiaţi:
dispun de drepturile de acces care le-au fost 1. Utilizatorul este o persoana fizica lucrând direct cu
SGBD-ul prin intermediul interfetelor pe care acesta le
alocate de administratorul bazei de date. pune la dispozitie.
Majoritatea sistemelor de gestiune permit  De exemplu în Oracle o astfel de interfata este
programul sqlplus prin care se pot executa cereri SQL
definirea de categorii generice de utilizatori asupra bazei de date.
(numite roluri) iar fiecare utilizator individual 2. Utilizatorul este o entitate generica având asociat un
are asociat unul sau mai multe roluri, nume-utilizator şi o parola prin intermediul careia o
multime de programe de aplicaţie se conectează la SGBD
mostenind drepturile de acces ale acestora. pentru a efectua diverse operaţii.
Este usurata astfel operaţia de creare a unui  Persoanele care utilizează aceste aplicaţii nu cunosc
nou utilizator. numele-utilizator sau parola folosite pentru accesul la
date, existând eventual mecanisme paralele de
autentificare a utilizatorilor autorizaţi ai aplicaţiei.

F. Rădulescu. Curs: Baze de date I 7 F. Rădulescu. Curs: Baze de date I 8

Utilizatori neprivilegiaţi Utilizatori neprivilegiaţi


Din punct de vedere al relaţiei cu una a. Analiza de sistem şi proiectarea bazei de
dintre bazele de date gestionate de un date şi a modulelor de program ale
SGBD persoanele care accesează datele se aplicaţiei.
impart în doua categorii: b. Dezvoltarea programele conform
1. Utilizatori care proiectează, proiectului rezultat din analiza de sistem
realizează şi intretin aplicaţia. c. Asigura suportul pentru utilizarea
 În aceasta categorie intra toti cei implicaţi aplicaţiei. În multe sisteme de gesiune
în crearea unei aplicaţii şi în activitatea de depanarea incidentelor şi intretinerea
mentenanta şi adaptare la nevoile bazei de date se pot face de la distanta
beneficiarilor. de personalul companiei care a livrat sau
 Activitaţile efectuate de acestia sunt: distribuit aplicaţia.

F. Rădulescu. Curs: Baze de date I 9 F. Rădulescu. Curs: Baze de date I 10

Utilizatori neprivilegiaţi Utilizatori neprivilegiaţi


Acesti utilizatori pot primi de la 2. Utilizatori obisnuiti. Sunt cei care au
administratorul bazei de date o serie de acces la baza de date prin intermediul
drepturi specifice acestuia: interfetelor pentru care sunt autorizaţi.
crearea de noi tabele,  Acesti utilizatori în general nu au dreptul
de a modifica structura bazei de date a
modificarea structurii celor existente, aplicaţiei dar în anumite cazuri pot crea
gestiunea constrangerilor de obiecte suplimentare pentru care dispun
integritate şi a altor obiecte din baza de drepturi nelimitate: creare, modificare,
de date stergere şi transfer al drepturilor de acces
etc. la acestea catre alti utilizatori.

F. Rădulescu. Curs: Baze de date I 11 F. Rădulescu. Curs: Baze de date I 12

2
Florin Radulescu - Baze de date (note de curs)

Nivele de descriere a unei baze de date


Sumar - curs 1 si curs 2
O aceeasi bază de date poate fi privita din
1. √ Bază de date (BD) şi Sistem de diverse perspective rezultând descrieri diferite.
gestiune a bazelor de date (SGBD) Termenul consacrat pentru descrierea structurii
unei baze de date este acela de schema.
2. √ Problematica domeniului. În literatura de specialitate exista o clasificare
3. √ Funcţiile unui SGBD pe trei nivele a acestor descrieri:
1. fizic,
4. Categorii de utilizatori pentru un SGBD 2. conceptual şi
5. Nivele de descriere şi independenţa 3. extern.
date-program Gestionarea schemelor bazei de date pentru
fiecare nivel este una dintre atributiile
administratorului bazei de date.
F. Rădulescu. Curs: Baze de date I 13 F. Rădulescu. Curs: Baze de date I 14

Cele 3 nivele de descriere Nivelul fizic


Grup
Schema La acest nivel baza de date este
externă
Utilizatori 1 1 descrisa din perspectiva stocarii sale pe
dispozitivele fizice:
Grup Schema Schema Schema
Utilizatori 2 externă
2
conceptuală fizică
identificarea discurilor şi a cailor unde
.........
este stocata,
Schema
numele fişierelor care formează baza
Grup Baza de date
Utilizatori n externă
n
de date, structura fizica a acestora,
etc.
Nivelul extern Nivelul conceptual Nivelul fizic

F. Rădulescu. Curs: Baze de date I 15 F. Rădulescu. Curs: Baze de date I 16

Nivelul fizic Nivelul conceptual


Descrierea bazei de date la acest nivel Descrierea bazei de date la acest nivel
poarta numele de schema conceptuala
poarta numele de schema fizica. (numita uneori şi schema logica) a bazei
Sistemul de gestiune a bazelor de date de date.
pune la dispozitie facilităţile pentru Ea consta intr-o descriere abstracta dar
exacta a structurii acesteia, lasând la o
înregistrarea şi modificarea acesteia. parte detaliile fizice de implementare.
Fiecare SGBD are în general asociat un Schema conceptuala este facuta în
model specific de descriere la nivel fizic termenii modelului de date utilizat.
a bazei de date. Astfel, în cazul adoptarii modelului
relaţional, aceasta consta în:
F. Rădulescu. Curs: Baze de date I 17 F. Rădulescu. Curs: Baze de date I 18

3
Florin Radulescu - Baze de date (note de curs)

Nivelul conceptual Nivelul conceptual


Tabelele care formează baza de date Constrangeri de integritate
Structura (coloanele) fiecarei tabele Operaţii declansate automat la
Tipul de date asociat coloanelor modificarea unor elemente ale bazei de
Elementele pe baza carora se realizează date
interconectarea tabelelor (coloane Implementarea schemei conceptuale se
comune) face cu ajutorul limbajului pentru
descrierea datelor (LDD) asociat
sistemului de gestiune utilizat.

F. Rădulescu. Curs: Baze de date I 19 F. Rădulescu. Curs: Baze de date I 20

Nivelul extern Nivelul extern


Diferitele categorii de utilizatori ai unei Schemele externe sunt descrise de obicei cu
baze de date au nevoie în activitatea lor ajutorul modelului de date folosit pentru
schema conceptuala.
doar de portiuni specifice ale acesteia.
În plus se specifica modul în care se face
Descrierea acestor portiuni poarta corespondenta intre obiectele celor doua
numele de scheme externe. descrieri.
O bază de date are deci asociată o Pentru administratorului bazei de date schema
singură schemă fizică şi o singură externa coincide cu schema conceptuala.
schemă conceptuală dar mai multe Celelalte categorii de utilizatori accesează baza
de date prin intermediul schemelor externe
scheme externe. specifice acestora.

F. Rădulescu. Curs: Baze de date I 21 F. Rădulescu. Curs: Baze de date I 22

Nivelul extern Nivelul extern


Din aceasta cauza, orice prelucrare lansata 1. În cazul multor pachete de programe pentru
calculatoare personale descrierea schemei fizice
de un utilizator este translatata de catre se face cu ajutorul LDD, o data cu schema
SGBD mai intai la nivel conceptual şi apoi conceptuala.
 Facilităţile pentru definirea schemelor externe
la nivel fizic. sunt reduse sau inexistente.
 Aceste operaţii pot fi consumatoare de 2. În cazul sistemelor de gestiune a bazelor de date
complexe, descrierea schemelor externe se face
timp. prin definirea de vederi utilizator.
De aceea nu toate sistemele de gestiune  O astfel de vedere este în cazul modelului
relaţional o tabela virtuala care nu exista la nivel
dispun de mecanisme de descriere pentru fizic şi conceptual în baza de date dar se poate
fiecare dintre cele trei nivele: calcula pe baza tabelelor din ea ori de cate ori
este folosita de operaţiile lansate de utilizator.
F. Rădulescu. Curs: Baze de date I 23 F. Rădulescu. Curs: Baze de date I 24

4
Florin Radulescu - Baze de date (note de curs)

Independenţa date - program Independenţa date - program


Existenta celor trei nivele de descriere În lumea reala orice operaţie de
permite definirea conceptului de
independenţă între datele stocate în baza modificare a bazei de date a unei
de date şi aplicaţiile care utilizează aceste aplicaţii se masoara şi prin prisma
date. costurilor materiale necesare modificarii
Conceptul de independenţă a datelor a programelor care o folosesc.
aparut o dată cu dezvoltarea sistemelor
complexe de aplicaţii pentru care cablarea Minimizarea acestora a facut necesara
informaţiilor structurale în program implementarea facilităţilor de
constituie o bariera în calea dezvoltarii şi
modificarii acestora. independenta a datelor în sistemele de
gestiune a bazelor de date comerciale.
F. Rădulescu. Curs: Baze de date I 25 F. Rădulescu. Curs: Baze de date I 26

Independenţa date - program Independenţa logică


Exista doua tipuri de independenta: Independenţa logică reprezinta
1. Independenţa logică posibilitatea de schimbare a schemei
conceptuale a bazei de date fara
2. Independenţa fizică modificarea schemelor externe.
 În continuare le vom prezenta pe Condiţia este ca modificarea sa nu
fiecare dintre acestea elimine nici unul dintre elementele
necesare translaţiei de la schema
externa la schema conceptuala.
Operaţii ca:

F. Rădulescu. Curs: Baze de date I 27 F. Rădulescu. Curs: Baze de date I 28

Independenţa logică Independenţa logică


 Adaugarea de noi tabele în baza de date Aceste operaţii pot fi realizate doar prin
 Adaugarea de noi coloane în tabelele existente modificarea definiţiei schemelor
 Modificarea numelor tabelelor şi coloanelor externe, fara ca acestea sa sufere
existente modificari structurale.
 Adaugarea de noi constrangeri de integritate
În acest caz deoarece programele de
 Modificarea în anumite limite a tipului datelor aplicaţie şi utilizatorii accesează baza de
stocate în baza de date
date doar prin intermediul schemelor
 Restructurarea bazei de date prin mutarea unor
coloane în alte tabele, fragmentarea unei externe modificarile schemei
tabele sau reunirea mai multor tabele. conceptuale nu vor fi sesizate de catre
acestia.
F. Rădulescu. Curs: Baze de date I 29 F. Rădulescu. Curs: Baze de date I 30

5
Florin Radulescu - Baze de date (note de curs)

Independenţa logică Independenţa logică


Exemplu: Sa consideram o bază de date Dacă modificăm baza de date:
continând la nivel conceptual o tabela cu date
despre studenti cu urmatoarea structura: 1. Adaugăm o nouă tabelă cuprinzând lista
Student(CodStud, Nume, CodFacult, Medie) specializarilor din cadrul universitaţii (cod
şi n scheme externe continând tabelele virtuale şi nume)
Student-1, Student-2, …, Student-n 2. Adăugăm o nouă coloană în tabela
definite astfel:
Student pentru a specifica la ce
Student-i(CodStud, Nume, CodFacult, Medie)
specializare este inscris fiecare student
= În acest caz tabelele cu datele studentilor
liniile din tabela Student care pe coloana din schemele externe vor ramane aceleasi
CodFacultate contin valoarea i. dacă doar le schimbăm definiţia:
F. Rădulescu. Curs: Baze de date I 31 F. Rădulescu. Curs: Baze de date I 32

Independenţa logică Independenţa logică


Baza de date conceptuală: Independenţa logică implică folosirea
Student(CodStudent, Nume, CodFacultate, de către SGBD a informaţiilor de
Medie, CodSpecializare)
Specilizare(CodSpecializare,
definiţie a schemelor externe stocate în
NumeSpecializare) cataloagele sistemului:
Schemele externe: Se face conversia oricărei operaţii din
Student-i(CodStudent, Nume, CodFacultate, termenii schemei externe a aplicaţiei
Medie) = valorile de pe coloanele CodStudent,
Nume, CodFacultate şi Medie din liniile din sau utilizatorului care a lansat-o în
tabela Student care pe coloana CodFacultate termenii schemei conceptuale a bazei
contin valoarea i. de date.
F. Rădulescu. Curs: Baze de date I 33 F. Rădulescu. Curs: Baze de date I 34

Independenţa fizică Independenţa fizică


 Operaţii permise:
Independenţa fizică reprezinta
posibilitatea de schimbare a schemei  Schimbarea dispozitivelor fizice pe care este stocată baza
de date
fizice a bazei de date fără modificarea  Schimbarea numelor fişierelor fizice în care este stocată
schemei conceptuale şi implicit a baza de date sau a directoarelor unde acestea sunt
plasate
schemelor externe.  Adaugarea de noi structuri de căutare rapidă (indecsi)
pentru cresterea vitezei de execuţie a anumitor operaţii
Aceasta dă posibilitatea reorganizării  Schimbarea în anumite condiţii a structurii fizice a
fişierelor bazei de date
fizice a bazei de date fără afectarea  Schimbarea unor parametri ai sistemului de gestiune care
aplicaţiilor care o folosesc. afectează modul în care datele sunt stocate la nivel fizic
pe dispozitivele care găzduiesc baza de date.

F. Rădulescu. Curs: Baze de date I 35 F. Rădulescu. Curs: Baze de date I 36

6
Florin Radulescu - Baze de date (note de curs)

Independenţa fizică Independenţa fizică


Aceste operaţii pot fi realizate doar prin Cum nu toate sistemele de gestiune a
bazelor de date implementează total cele
modificarea cataloagelor sau a fişierelor trei nivele de descriere, posibilitatea de a
de configuraţie pe care SGBD-ul le asigura cele doua tipuri de independenta
foloseste pentru a face translaţia de la este conditionata de facilităţile oferite de
sistem.
schema conceptuală la schema fizică.
În cazul posibilităţii asigurarii
independentei datelor avantajul constă în
existenţa premiselor scrierii de aplicaţii
care pot fi uşor dezvoltate, intreţinute şi
actualizate.

F. Rădulescu. Curs: Baze de date I 37 F. Rădulescu. Curs: Baze de date I 38

Sfarşitul capitolului 1

F. Rădulescu. Curs: Baze de date I 39

7
Florin Radulescu - Baze de date (note de curs)

Cursul 3 Sumar
1. Obiectivele proiectarii sistematice.
Anomalii
Modelarea 2. Etapele proiectarii unei aplicatii
3. Modelul entitate-asociere
datelor 4. Caracteristicile modelului

- Partea 1 - 5. Criterii de modelare


6. Modelul EA folosit in instrumentele
CASE
F. Rădulescu. Curs: Baze de date I 1 F. Rădulescu. Curs: Baze de date I 2

OBIECTIV EXEMPLU: Proiectare greşită


IDP NUMEP QTY IDF NUMEF ADRESAF
Proiectarea corectă a structurii
unei baze de date relaţionale este o
premisă fundamentală în: 101 Imprimantă 30 20 X SRL Str. X,
laser Bucureşti
scrierea programelor de aplicaţie
105 Calculator PC 20 23 W SRL Bd. W,
functionarea lor fara anomalile Iaşi
care pot apare in cazul unei
124 Copiator 10 20 X SRL Str. X,
structuri defectuoase. Bucureşti

F. Radulescu. Curs: Baze de date 3 F. Radulescu. Curs: Baze de date 4

ANOMALII (1) ANOMALII (2)


 Redundanta: Redundanta reprezinta  Anomalia de stergere: La stergerea
stocarea in mod nejustificat a aceleiasi din relatie a ultimului produs al unui
informatii de mai multe ori in baza de furnizor se pierd automat si datele
date. despre acesta.
 Observam ca pentru fiecare produs
este stocat numele si adresa
furnizorului, desi ele sunt unic
determinate de codul acestuia.
F. Radulescu. Curs: Baze de date 5 F. Radulescu. Curs: Baze de date 6

1
Florin Radulescu - Baze de date (note de curs)

ANOMALII (3) ANOMALII (4)


 Anomalia de actualizare: In cazul  Anomalia de inserare: Nu putem
actualizarii unei informatii redundante, insera date despre un furnizor
se poate intampla ca operatia sa (numele si adresa sa) decat daca
modifice unele aparitii ale acesteia iar exista in stoc un produs furnizat de
altele sa ramana cu vechea valoare. acesta.

F. Radulescu. Curs: Baze de date 7 F. Radulescu. Curs: Baze de date 8

SOLUŢIE MODELUL ENTITATE-ASOCIERE


Modelulul entitate-asociere (EA) a dus la
gasirea unor cai algoritmizabile de proiectare
Acest capitol prezinta modelul entitate optima a bazelor de date.
asociere (EA) in varianta clasica (cu unele Modelul entitate-asociere este in acest
extensii). Acesta este un model folosit in moment cel mai popular model de
proiectarea conceptuala de nivel inalt a comunicare a structurii bazelor de date
schemei unei baze de date. datorita intuitivitatii şi simplitatii elementelor
sale.
Intr-un capitolul urmator vor fi prezentate Imbunatatiri sale ulterioare au dus la crearea
regulile de transformare din modelul de variante ale modelului, doua dintre
entitate-asociere in modelul relational. acestea fiind descrise in acest capitol.

F. Radulescu. Curs: Baze de date 9 F. Radulescu. Curs: Baze de date 10

EXTENSII ALE MODELULUI EA ETAPELE PROIECTARII (1)


Pentru baza de date:
Modelarea cerintelor de secretizare a
datelor, 1. Analiza de sistem → Cerinţe privind
baza de date
Documentarea programelor de aplicatie
şi usurarea comunicarii proiectant - 2. Proiectarea conceptuală → Diagrama
utilizator, EA
Proiectarea bazelor de date complexe 3. Transformare în model relaţional →
pe portiuni (integrarea vederilor). Schema candidat a bazei de date

F. Radulescu. Curs: Baze de date 11 F. Radulescu. Curs: Baze de date 12

2
Florin Radulescu - Baze de date (note de curs)

ETAPELE PROIECTARII (2) ETAPELE PROIECTARII (3)


4. Normalizare → Schema conceptuala a Pentru programele de aplicatie:
bazei de date 1. Analiza de sistem → Cerinţe
5. Implementare specifică SGBD-ului funcţionale ale aplicaţiei
folosit → Schema bazei de date a 2. Proiectarea funcţională → Diagrame
aplicaţiei de specificare funcţională
Urmeaza apoi realizarea, testarea,
implementarea si instruirea
personalului → Programele aplicaţiei
F. Radulescu. Curs: Baze de date 13 F. Radulescu. Curs: Baze de date 14

ETAPELE PROIECTARII (1) ANALIZA DE SISTEM


 Se realizeaza analiza segmentului din lumea reala
Pentru baza de date: care va fi gestionat de aplicatia respectiva.
 Rezulta o specificatie neformalizata a cerintelor
1. Analiza de sistem → Cerinţe constand din doua componente:
 Cerinte privind continutul bazei de date:
privind baza de date categoriile de date care vor fi stocate şi
2. Proiectarea conceptuală → Diagrama interdependentele dintre acestea.
 Cerinte privind prelucrarile efectuate de
EA aplicatie: prelucrarile efectuate asupra datelor,
3. Transformare în model relaţional → arborele de meniuri al aplicatiei, machetele
formatelor de introducere şi prezentare a datelor
Schema candidat a bazei de date şi ale rapoartelor tiparite de aceasta.

F. Radulescu. Curs: Baze de date 15 F. Radulescu. Curs: Baze de date 16

ANALIZA DE SISTEM: ACTIVITATI(1) ANALIZA DE SISTEM: ACTIVITATI(2)


Analiza activitatii desfasurate la momentul Identificarea interdependentelor dintre datele
respectiv de beneficiarul aplicatiei sau de o stocate in baza de date şi a restrictiilor privind
valorile lor
multime reprezentativa de beneficiari Identificarea prelucrarilor care se declanseaza
Analiza continutului de date şi a automat atat in cazul modificarii bazei de
functionalitatii aplicatiilor software - daca date cat şi la momente prestabilite de timp
exista - care vor fi inlocuite de noua aplicatie (de exemplu sfarsit de luna, de an, etc.)
(meniuri, machete ecran, machete rapoarte) Identificarea operatiilor care sunt necesare
beneficiarului in activitatea curenta dar care
Analiza formularelor tipizate şi a altor in acest moment nu sunt realizate prin
documente utilizate de beneficiar pentru intermediul aplicatiilor software folosite
realizarea activitatii respective. precum si a operatiilor care pot fi incluse in
mod natural in noua aplicatie.
F. Radulescu. Curs: Baze de date 17 F. Radulescu. Curs: Baze de date 18

3
Florin Radulescu - Baze de date (note de curs)

ANALIZA DE SISTEM: ACTIVITATI(3) ETAPELE PROIECTARII (1)


Identificarea bazelor de date existente care
pot fi folosite de noua aplicatie - direct sau
printr-un import initial de date - evitandu-se Pentru baza de date:
reintroducerea manuala a acestora. 1. Analiza de sistem → Cerinţe privind
Identificarea modalitatilor de transfer de date
intre noua aplicatie şi alte aplicatii care baza de date
ruleaza deja la beneficiar şi care vor fi folosite
şi in viitor de catre acesta. 2. Proiectarea conceptuală →
Identificarea necesitatilor privind datele şi Diagrama EA
prelucrarile care pot fi in viitor necesare
beneficiarului, deci a posibilelor dezvoltari in 3. Transformare în model relaţional →
timp ale aplicatiei. Schema candidat a bazei de date

F. Radulescu. Curs: Baze de date 19 F. Radulescu. Curs: Baze de date 20

PROIECTAREA CONCEPTUALA AVANTAJELE EA (1)


In aceasta etapa, pornind de la rezultatele
analizei de sistem, se realizeaza modelarea Nu este legat direct de nici unul dintre
cerintelor privind datele folosind un model de modelele folosite de sistemele de gestiune a
nivel inalt. bazelor de date (relational sau orientat
Cel mai popular model folosit pentru aceasta obiect) dar exista algoritmi de transformare
este modelul entitate-asociere (EA). din model EA in celelalte modele de date.
Actualmente exista pe piata numeroase Este intuitiv, rezultatul modelarii fiind o
instrumente CASE (Computer Aided Software diagrama care defineste atat datele stocate in
Engineering) care folosesc diverse variante baza de date cat şi interdependentele dintre
ale modelului. acestea.
F. Radulescu. Curs: Baze de date 21 F. Radulescu. Curs: Baze de date 22

EXEMPLU
AVANTAJELE EA (2)
Sotie
A_Absolvit
Poate fi usor de inteles de nespecialisti si
faciliteaza punerea de acord cu beneficiarul
Casatorit
STUDENT FACULT asupra structurii bazei de date a aplicatiei,
An evitandu-se in acest fel o proiectare
Sot neconforma cu realitatea sau cu cerintele
IS Nume IF Nume Proiectarea se poate face pe portiuni,
Apartine_de
diagramele partiale rezultate putand fi apoi
integrate pe baza unor algoritmi şi metode
bine puse la punct.
F. Rădulescu. Curs: Baze de date I 23 F. Radulescu. Curs: Baze de date 24

4
Florin Radulescu - Baze de date (note de curs)

ETAPELE PROIECTARII (1) TRANSFORMAREA


 In aceasta etapa entitatile şi asocierile care formeaza
Pentru baza de date: diagrama EA se transforma pe baza unor reguli clare
in structura relationala a bazei de date.
1. Analiza de sistem → Cerinţe privind
 Rezulta schema preliminara a acesteia formata din:
baza de date  tabele (relatii in terminologia relationala),
2. Proiectarea conceptuală → Diagrama  coloanele acestora (atribute ale relatiilor) şi
EA  constrangerile de integritate care pot fi
deduse automat din diagrama incluzand unele
3. Transformare în model interdependente intre date numite şi “dependenţe
functionale”.
relaţional → Schema candidat a  In cazul variantei specifice uneltelor CASE
bazei de date transformarea se face automat de catre acestea.

F. Radulescu. Curs: Baze de date 25 F. Radulescu. Curs: Baze de date 26

Exemplu ETAPELE PROIECTARII (2)


A_Absolvit
Sotie

Casatorit
STUDENT FACULT 4. Normalizare → Schema
Sot
An
conceptuala a bazei de date
IS Nume
Apartine_de
IF Nume 5. Implementare specifică SGBD-ului
folosit → Schema bazei de date a
 Student(IS, Nume, Sot_IS, Apartine_de_IF) aplicaţiei
 Facult(IF, Nume)
 A_Absolvit(IS, IF, An)

F. Radulescu. Curs: Baze de date 27 F. Radulescu. Curs: Baze de date 28

NORMALIZAREA ETAPELE PROIECTARII (2)


Exista o serie de reguli care descriu ce
inseamna o structura corecta. Ele definesc 4. Normalizare → Schema conceptuala a
asa numitele forme normale.
bazei de date
Pe baza structurii bazei de date şi a
dependentelor rezultate atat din transformare 5. Implementare specifică SGBD-
şi a altor dependente identificate de
proiectant in analiza de sistem se poate face ului folosit → Schema bazei de date
o operatie numita normalizare: se modifica a aplicaţiei
structura bazei de date astfel incat toate
tabelele din aceasta sa fie in forma normala
dorita.

F. Radulescu. Curs: Baze de date 29 F. Radulescu. Curs: Baze de date 30

5
Florin Radulescu - Baze de date (note de curs)

IMPLEMENTARE CU UN SGBD EXEMPLU


Schema conceptala:
In aceasta etapa se realizeaza crearea Student(IS, Nume, Sot_IS, Apartine_de_IF)
structurii bazei de date obtinuta in Program de creare (SQL-Oracle):
etapa precedenta pe baza facilitatilor CREATE TABLE STUDENT(
oferite de sistemul de gestiune a IS NUMBER(5) PRIMARY KEY,
bazelor de date ales. NUME VARCHAR2(40),
SOT_IS NUMBER(5) REFERENCES
Rezultatul ei este programul de creare
STUDENT(IS),
scris in limbajul de definitie a datelor
APARTINE_DE_IF NUMBER(2)
acceptat de SGBD-ul utilizat.
REFERENCES FACULT(IF));
F. Radulescu. Curs: Baze de date 31 F. Radulescu. Curs: Baze de date 32

IMPLEMENTARE CU UN SGBD - MODELUL ENTITATE ASOCIERE


continuare Modelul entitate-asociere clasic
Programul contine atat definirea tabelelor cat
şi definirea celorlalte obiecte ale bazei de
Acest model a fost introdus de P. P.
date (de exemplu constrangerile de Chen in 1976 ([Ch 76]).
integritate intra-tabela şi inter-tabele): NOT O abordare de tip grafic a proiectarii
NULL, PRIMARY KEY. bazelor de date
De asemenea aici se fac şi toate operatiile A fost adoptat de comunitatea stiintifica
privind proiectarea la nivel fizic a bazei de
date.
precum si de producatorii de software
in domeniu datorita simplitatii si
In cazul folosirii de unor unelte CASE
programul de creare poate fi generat şi expresivitatii sale.
executat automat.
F. Radulescu. Curs: Baze de date 33 F. Radulescu. Curs: Baze de date 34

MODELUL ENTITATE ASOCIERE ELEMENTELE MODELULUI


Modelul entitate-asociere permite
reprezentarea informatiilor despre
structura bazelor de date folosind trei
elemente de constructie:
Entitati
Atribute
Asocieri intre entitati

F. Radulescu. Curs: Baze de date 35 F. Radulescu. Curs: Baze de date 36

6
Florin Radulescu - Baze de date (note de curs)

ENTITĂŢI (1) ENTITĂŢI (2)


Entitatile modeleaza clase de obiecte Membrii unei clase care formeaza o astfel de
concrete sau abstracte despre care se entitate poarta numele de instante ale acelei
colecteaza informatii, au existenta entitati.
independenta şi pot fi identificate in mod
unic. De remarcat ca in literatura de specialitate se
Exemple de entitati: defineste intii conceptul de multime de
 Studenti, entitati – entity set (sau tip de entitati) pentru
ca apoi sa adopte pentru usurinta exprimarii
 Orase, prescurtarea de entitate pentru acest
 Angajati, etc. concept.
Ele definesc de obicei persoane, Deci entitatea este un obiect generic care
amplasamente, obiecte sau evenimente cu
importanta informationala. reprezinta multimea tuturor instantelor sale.

F. Radulescu. Curs: Baze de date 37 F. Radulescu. Curs: Baze de date 38

CATEGORII DE ENTITATI Exemplu


 Entitati independente (sau tari, eng. Intr-o baza de date de personal avem
entitatile:
strong) sunt cele care au existenta
 ANGAJATI si
independenta de alte entitati,
 COPII (ultima contine copii angajatilor
 Entitati dependente (sau slabe, eng. companiei)
weak) sunt formate din instante care  Fiecare instanta a entitatii COPII depinde
isi justifica incadrarea in clasa de o instanta a entitatii ANGAJATI
respectiva doar atita timp cit intr-o  Rezulta:
alta entitate (tata) exista o anumita  ANGAJATI: entitate independenta,
instanta de care sunt dependente.  COPII: entitate dependenta

F. Radulescu. Curs: Baze de date 39 F. Radulescu. Curs: Baze de date 40

REPREZENTARE GRAFICA ATRIBUTE


Atributele modeleaza proprietati atomice
Entitatile se reprezinta grafic prin distincte ale entitatilor.
Exemplu: entitatea STUDENTI poate avea
dreptunghiuri in care e inscris numele atributele
entitatii.  Matricola,
 Nume,
Exemple:  Prenume,
 Varsta,
 Anul,
ANGAJATI COPII  Grupa,
 Domiciliu – e atomic sau nu?

F. Radulescu. Curs: Baze de date 41 F. Radulescu. Curs: Baze de date 42

7
Florin Radulescu - Baze de date (note de curs)

ATRIBUTE (2) CLASIFICARE ATRIBUTE


In procesul de modelare vor fi luate in atributele de identificare (formand impreuna
considerare doar acele proprietati ale identificatorul entitatii) reprezinta acea
entitatilor care sunt semnificative pentru multime de atribute care permit distinctia
aplicatia respectiva. intre instantele aceleiasi entitati .
Exemplu: la entitatea STUDENTI nu vom atributele de descriere (sau descriptori) sunt
avea atribute ca: folositi pentru memorarea caracteristicilor
 Talia sau suplimentare ale instantelor.
 Culoarea_parului Exemplu: Pentru entitatea STUDENTI
acestea nefiind necesare pentru baza de date  Matricola este atribut de identificare
a universitatii (dar pot exista intr-o baza de  celelalte atribute sunt descriptori
date privind personalul militar).
F. Radulescu. Curs: Baze de date 43 F. Radulescu. Curs: Baze de date 44

REPREZENTARE GRAFICA ASOCIERI


Asocierile modeleaza interdependentele
(sau legaturile) dintre clasele de obiecte
Atributele se reprezinta prin ovale sau reprezentate prin entitati.
cercuri in care e inscris numele  Exemplu: intre STUDENTI şi FACULTATI se poate
atributului. Ele sunt conectate la figura o asociere INSCRIS_LA care descrie
impartirea studentilor pe facultati.
entitatea pe care o caracterizeaza.
NUME
In crearea diagramei nu vor fi luate in
Exemplu: MATR PREN consideratie decit interdependentele care
DATAN sunt necesare aplicatiei respective (pot exista
şi alte asocieri care nu sunt semnificative
STUD pentru aplicatia proiectata)

F. Radulescu. Curs: Baze de date 45 F. Radulescu. Curs: Baze de date 46

REPREZENTARE GRAFICA (1) REPREZENTARE GRAFICA (2)


Cand sunt asociate 1-2 entitati: romb Cand sunt asociate >3 entitati: poligon

STUDENT
Cas_cu Inscris_la
STUD FACULT Ore
Alocare

PROIECT CALCULATOR

F. Radulescu. Curs: Baze de date 47 F. Radulescu. Curs: Baze de date 48

8
Florin Radulescu - Baze de date (note de curs)

EXTENSII ALE MODELULUI IERARHIA DE INCLUZIUNE(1)


Modelul clasic are unele lipsuri in ceea ce
priveste posibilitatea modelarii caracteristicilor Definitie : O entitate E1 este inclusa in
asociate unor subclase modelate prin entitati.
entitatea E daca fiecare instanta a lui E1 este
Pentru aceasta, la modelul original au fost de asemenea o instanta a lui E.
adaugate doua noi concepte:
 ierarhia de generalizare şi Exemplu: in cadrul entitatii ANGAJATI avem
 ierarhia de incluziune. subclase modelate prin entitatile:
Prima defineste partitionarea instantelor unei  INGINERI,
entitati in n subclase diferite iar a doua  ECONOMISTI si
permite clasarea unora dintre instantele unei  COLABORATORI.
entitati in m subclase care nu reprezinta o
partitie in sens matematic.

F. Radulescu. Curs: Baze de date 49 F. Radulescu. Curs: Baze de date 50

IERARHIA DE INCLUZIUNE(2) REPREZENTARE GRAFICA


In cazul ierarhiei de incluziune entitatile fiu
pot sa nu fie disjuncte doua cite doua: pentru Sageti duble
exemplul dat, exista angajati ingineri si care ANGAJAT
sunt incadrati cu contract de colaborare.
De asemenea reuniunea lor poate sa nu
acopera in intregime entitatea tata: exista
angajati care nu sunt nici ingineri, nici
economisti si nici colaboratori. ECONOMIST INGINER COLAB.

F. Radulescu. Curs: Baze de date 51 F. Radulescu. Curs: Baze de date 52

IERARHIA DE GENERALIZARE(1) IERARHIA DE GENERALIZARE(2)


Definitie (ierarhia de generalizare): O
entitate E este generalizarea entitatilor E1, Caracteristica ierarhiei de generalizare este ca
E2, ..., En daca orice instanta a lui E este de din punct de vedere matematic entitatile fiu
asemenea instanta in una şi numai una din reprezinta o partitie a entitatii tata:
entitatile E1, E2, ..., En.  a. E1 ∪ E2 ∪ ... ∪ En = E şi
Un exemplu de generalizare este clasarea  b. Ei ∩ Ej = ∅ pentru orice i ≠ j din
instantelor entitatii ANGAJATI in subclasele intervalul 1..n
BARBATI şi FEMEI.
Entitatile fiu reprezinta o clasificare a
instantelor entitatii tata

F. Radulescu. Curs: Baze de date 53 F. Radulescu. Curs: Baze de date 54

9
Florin Radulescu - Baze de date (note de curs)

REPREZENTARE GRAFICA CAND FOLOSIM IERARHII


Ierarhiile de incluziune şi generalizare se folosesc
doar in cazul in care pentru subclasele unor clase
ANGAJAT modelate prin entitati este nevoie de stocarea
unor informatii suplimentare specifice.
 Exemplu: Intr-o baze de date de studenti este
Criteriul de clasificare nevoie de caminul si camera ocupata, dar doar
sex pentru caministi.
Acest fapt se poate modela printr-o entitate
suplimentare CAMINIST aflata intr-o relatie de
incluziune cu entitatea STUDENT. Ea va avea
BARBAT FEMEIE ca atribute de identificare pe cele ale tatalui iar
ca atribute descriptive Caminul si Camera.

F. Radulescu. Curs: Baze de date 55 F. Radulescu. Curs: Baze de date 56

DIAGRAMA PT. EXEMPLU CARACTERISTICI ELEMENTE


NUME ....
MATR
Gradul unei asocieri
STUDENT
Conectivitatea unei ramuri de asociere
Obligativitatea unei ramuri de asociere
MATR CAMERA
Atribute asocieri
CAMINIST
CAMIN Roluri pentru ramurile asocierilor

F. Radulescu. Curs: Baze de date 57 F. Radulescu. Curs: Baze de date 58

GRADUL ASOCIERII (1) GRADUL ASOCIERII (2)


Este o valoare numerica intreaga si este Pentru exemplificare vom considera o baza de
date continand informatii despre
dat de numarul de entitati care participa
 studenti,
la acea asociere.
 proiectele realizate de acestia,
Poate avea deci valorile 1, 2, 3, 4, 5, …  calculatoarele pe care au alocate ore de
Asocierile de grad 1, 2 şi 3 se mai lucru si
numesc si asocieri unare, binare si  facultatile la care sunt inscrisi.
respectiv ternare. De asemenea vom considera ca unii dintre
studenti au un tutor care ii indruma, acesta
fiind un student dintr-un an mai mare.

F. Radulescu. Curs: Baze de date 59 F. Radulescu. Curs: Baze de date 60

10
Florin Radulescu - Baze de date (note de curs)

GRADUL ASOCIERII (3) GRADUL ASOCIERII (4)


 Un exemplu de asociere de grad mai mare
ca trei este orarul unui an de studiu al unei
Tutor
(gr=1) Inscris_la (gr=2)
facultati.
Acesta este o asociere intre urmatoarele
FACULTATE
STUDENT entitati:
 GRUPE. Fiecare grupa are un cod unic.
Alocare (gr=3)  SALI. Salile sunt etichetate printr-un indicativ
alfanumeric.
 INTERVALE ORARE. Un interval orar este un triplet
(Zi a saptamanii, De la ora, La ora)
 ACTIVITATE. Este o activitate prezenta in orar
PROIECT CALCULATOR (curs, laborator, seminar, proiect, la o disciplina).
 PROFESOR. Este cadrul didactic titular pentru o
Obs: Nu sunt figurate atributele entitatilor activitate
F. Radulescu. Curs: Baze de date 61 F. Radulescu. Curs: Baze de date 62

GRADUL ASOCIERII (5) CARACTERISTICI ELEMENTE


GRUPA ACTIVITATE
Gradul unei asocieri
Orar (gr=5) Conectivitatea unei ramuri de asociere
Obligativitatea unei ramuri de asociere
Atribute asocieri
SALA INTERVAL
Roluri pentru ramurile asocierilor

PROFESOR

F. Radulescu. Curs: Baze de date 63 F. Radulescu. Curs: Baze de date 64

CONECTIVITATE (1) CONECTIVITATE (2)


Este specifica fiecarei ramuri a unei asocieri şi Pentru exemplul STUDENT, FACULTATE,
poate avea una din urmatoarele doua valori: PROIECT, CALCULATOR:
unu sau multi (eng.: one / many).
Asocierea TUTOR este unu-unu sau multi-
Determinarea ei pentru ramura spre o uni dupa cum un student poate fi tutor
entitate E se face astfel: fixand arbitrar cite o
instanta pentru celelalte entitati care participa pentru un singur alt student sau pentru mai
la asociere se pune intrebarea: cate instante multi studenti de an inferior.
ale lui E pot fi conectate cu acestea? Asocierea INSCRIS_LA este multi-unu (multi
Daca poate fi cel mult una, conectivitatea spre STUDENT) sau multi-multi dupa cum
ramurii este unu, altfel conectivitatea este un student poate fi inscris la una sau mai
multi. multe facultati.
F. Radulescu. Curs: Baze de date 65 F. Radulescu. Curs: Baze de date 66

11
Florin Radulescu - Baze de date (note de curs)

CONECTIVITATE (3) CONECTIVITATE (4)


Asocierea ternara ALOCARE: Deci asocierea ALOCARE este multi-unu-unu.
 Spre STUDENT: fiind dat un proiect si un calculator, Observam ca raspunsul la fiecare din cele trei
citi studenti au ore alocate pe acel calculator pentru intrebari se da in functie de realitatea
respectivul proiect? Presupunand ca mai multi
studenti lucreaza pentru acelasi proiect pe acelasi modelata.
calculator ramura va fi multi. Aceeasi asociere poate avea conectivitati
 Spre PROIECT: fiind dat un student şi un calculator, diferite in cazuri diferite: daca exista chiar si
la cite proiecte are acesta alocate ore pe acel un singur proiect la care un student are ore
calculator? Presupunand ca pentru fiecare proiect alocate pe mai mult de un calculator, ramura
exista un calculator dedicat, ramura va fi unu.
spre CALCULATOR va fi multi iar asocierea
 Spre CALCULATOR: fiind dat un student şi un proiect, va fi multi-unu-multi.
pe cate calculatoare are alocate acesta ore pentru
realizarea proiectului? Presupunand ca la un proiect
se lucreaza pe un singur calculator, ramura va fi
unu.
F. Radulescu. Curs: Baze de date 67 F. Radulescu. Curs: Baze de date 68

REPREZENTARE GRAFICA EXEMPLU


SALARIAT SECTIE
SALARIAT Tutor Inscris_la
STUDENT FACULTATE

SALARIAT SECTIE
Alocare

SALARIAT SECTIE
SECTIE
PROIECT CALCULATOR

F. Radulescu. Curs: Baze de date 69 F. Radulescu. Curs: Baze de date 70

Sfârşitul
cursului 3
Continuarea - saptamana
viitoare!

F. Radulescu. Curs: Baze de date 71

12
Florin Radulescu - Baze de date (note de curs)

Cursul 4 Sumar
1. Obiectivele proiectarii sistematice.
Anomalii
Modelarea 2. Etapele proiectarii unei aplicatii
3. Modelul entitate-asociere
datelor 4. Caracteristicile modelului

- Partea 2 - 5. Criterii de modelare


6. Modelul EA folosit in instrumentele
CASE
F. Rădulescu. Curs: Baze de date I 1 F. Rădulescu. Curs: Baze de date I 2

CARACTERISTICI ELEMENTE Obligativitate (1)


Ca şi conectivitatea, aceasta se determina
pentru fiecare ramura şi poate avea doar una
Gradul unei asocieri din urmatoarele valori: obligatorie sau
optionala.
Conectivitatea unei ramuri de asociere Determinarea ei pentru ramura spre o
Obligativitatea unei ramuri de asociere entitate E se face astfel: fixand arbitrar cite o
instanta pentru celelalte entitati care participa
Atribute asocieri la asociere se pune intrebarea: este
obligatoriu sa existe o instanta a lui E
Roluri pentru ramurile asocierilor asociata cu acestea?
Daca raspunsul este 'Da' ramura este
obligatorie altfel este optionala.

F. Radulescu. Curs: Baze de date 3 F. Radulescu. Curs: Baze de date 4

Obligativitate (2) Obligativitate (3)


In exemplul anterior ramurile asocierilor
Pentru asocierea ALOCARE:
TUTOR si ALOCARE sunt optionale iar cele ale
asocierii INSCRIS_LA sunt obligatorii - Un student la un proiect poate sa nu aiba
deoarece: alocate ore pe nici calculator (de exemplu in
cazul unui proiect la o materie umanista)
Pentru asocierea INSCRIS_LA: nu exista
studenti care nu sunt inscrisi la nici o - Un student si un calculator respectiv un
facultate si nici facultati fara studenti inscrisi. calculator si un proiect pot sa nu fie asociati
prin alocare de ore de lucru (de exemplu
Pentru asocierea TUTOR: exista studenti care
pentru calculatoarele din birourile cadrelor
 nici nu au un tutor
didactice)
 nici nu sunt tutori pentru alti studenti
F. Radulescu. Curs: Baze de date 5 F. Radulescu. Curs: Baze de date 6

1
Florin Radulescu - Baze de date (note de curs)

Obligativitate (4) REPREZENTARE GRAFICA


Obligativitatea se modeleaza pentru definirea
unui criteriu de integritate specificand
posibilitatea de aparitie a valorilor nule.
La transformarea diagramei EA in model
relational atributele tabelelor care modeleaza
informatia reprezentata de asocieri pot avea
sau nu valori nule dupa cum ramurile Ramura obligatorie Ramura optionala
acestora sunt optionale sau obligatorii.

F. Radulescu. Curs: Baze de date 7 F. Radulescu. Curs: Baze de date 8

CARACTERISTICI ELEMENTE ATRIBUTE ASOCIERI (1)


In unele cazuri o anumita informatie
Gradul unei asocieri descriptiva nu este asociata cu o clasa de
obiecte ci cu un ansamblu de clase diferite
Conectivitatea unei ramuri de asociere modelate fiecare prin entitati.
Obligativitatea unei ramuri de asociere Informatia va fi modelata ca un atribut al
Atributele asocierilor asocierii dintre entitatile respective.
Roluri pentru ramurile asocierilor Exemplu: cazul unei asocieri multi-multi
A_ABSOLVIT intre entitatile STUDENT şi
FACULTATE care contine informatii privind
facultatile absolvite anterior de unii studenti.
F. Radulescu. Curs: Baze de date 9 F. Radulescu. Curs: Baze de date 10

ATRIBUTE ASOCIERI (2) ATRIBUTE ASOCIERI (3)


In acest caz informatii ca anul absolvirii,
media, specializarea nu pot fi conectate nici la
STUDENT (pentru ca un student poate fi A_absolvit
absolventul mai multor facultati in ani diferiti, FACULTATE
cu medii diferite, etc.) si din motive similare STUDENT
nici la FACULTATE.
Ele descriu asocierea unui student cu o
facultate si de aceea vor fi atasate asocierii
A_ABSOLVIT.
Toate atributele unei asocieri sunt atribute AnAbs Medie Spec
descriptive, neexistand in acest caz un
identificator al asocierii.
F. Radulescu. Curs: Baze de date 11 F. Radulescu. Curs: Baze de date 12

2
Florin Radulescu - Baze de date (note de curs)

CARACTERISTICI ELEMENTE ROLUL RAMURII (1)


In cazul in care de la o asociere pornesc mai
Gradul unei asocieri multe ramuri catre aceeasi entitate, fiecareia
Conectivitatea unei ramuri de asociere dintre acestea i se poate asocia un rol.
Acesta arata semnificatiile diferite pe care le
Obligativitatea unei ramuri de asociere are aceeasi entitate in cadrul asocierii
Atribute asocieri respective.
In cazul asocierii TUTOR cele doua ramuri pot
Roluri pentru ramurile asocierilor fi etichetate de exemplu cu tutor si discipol
aratand ca instante diferite ale aceleiasi
entitati au rolurile respective

F. Radulescu. Curs: Baze de date 13 F. Radulescu. Curs: Baze de date 14

ROLUL RAMURII (2) CRITERII DE MODELARE

Clasificarea in entitati şi atribute


tutor
Tutor Inscris_la Identificarea ierarhiilor de generalizare
FACULTATE
STUDENT
şi incluziune
discipol
Identificarea asocierilor
Integrarea vederilor.

PROIECT CALCULATOR

F. Radulescu. Curs: Baze de date 15 F. Radulescu. Curs: Baze de date 16

ENTITATI SI ATRIBUTE (1) ENTITATI SI ATRIBUTE (2)


Desi definitia notiunilor de entitate, Pentru a putea clasifica corect
atribut, asociere este destul de simpla, informatiile, exista citeva reguli care
in practica modelarii apar dificultati in trebuie respectate şi pe care le
clasificarea diverselor informatii intr-una prezentam in continuare.
din aceste categorii. Prima regula da un criteriu general de
impartire in entitati şi atribute,
De exemplu in cazul sediilor unei banci
Urmatoarele doua semnaleaza exceptii
localizate in diverse orase: obiectul iar ultimele doua reguli au un caracter
ORAS este entitate distincta sau atribut mai putin normativ ci mai degraba
descriptiv al entitatii SEDIU? orientativ.
F. Radulescu. Curs: Baze de date 17 F. Radulescu. Curs: Baze de date 18

3
Florin Radulescu - Baze de date (note de curs)

Regula 1 Exemplu
Regula 1. Entitatile au informatii descriptive,
pe cand atributele nu poseda astfel de Despre un ORAS este necesara
informatii.
stocarea in baza de date unor informatii
Daca exista informatii descriptive despre o
ca JUDET, POPULATIE, etc. atunci
anumita clasa de obiecte, aceasta va fi
modelata ca o entitate. ORAS va fi o entitate.
In cazul in care pentru pentru acea clasa de Daca singura informatie necesara este
obiecte nu este nevoie decit de un numele sau atunci NUME_ORAS va fi un
identificator (codul, denumirea, etc), ea va fi atribut al altei entitati.
modelata ca un atribut.
F. Radulescu. Curs: Baze de date 19 F. Radulescu. Curs: Baze de date 20

Regula 2 Exemplu
Regula 2. Atributele multivalorice vor fi
reclasificate ca entitati. Localitate Bucuresti

Daca la o valoare a unui identificator


corespund mai multe valori ale unui BANCA
descriptor, acesta va fi clasat ca entitate. Bucuresti, Cluj, Iasi, Timisoara
Craiova, Constanta
De exemplu, in cazul unei baze de date Localitate
privind localizarea in teritoriu a unor banci,
daca se memoreaza informatii doar despre BANCA

banci care au un singur sediu, LOCALITATE


este atribut al entitatii BANCA.
F. Radulescu. Curs: Baze de date 21 F. Radulescu. Curs: Baze de date 22

Exemplu - continuare Exemplu - continuare


Daca insa se memoreaza informatii despre banci
care au sucursale şi filiale in diverse localitati, Are_sediu_in
Nume
deci pentru o singura banca (o valoare a BANCA M M LOCALITATE
identificatorului entitatii BANCA) avem mai multe
localitati in care aceasta are sedii (mai multe
valori ale descriptorului LOCALITATE), atunci
LOCALITATE va fi entitate distincta desi nu are
decat un singur atribut.
Pentru a modela localizarea sediilor in diverse
localitati intre cele doua entitati va exista o
asociere binara multi-multi numita de exemplu
ARE_SEDIU_IN.
F. Radulescu. Curs: Baze de date 23 F. Radulescu. Curs: Baze de date 24

4
Florin Radulescu - Baze de date (note de curs)

Regula 3 Exemplu
Regula 3. Atributele unei entitati care Daca avem entitatile BANCA avand ca atribut
au o asociere multi-unu cu o alta descriptiv monovaloric LOCALITATE şi JUDET,
entitate vor fi reclasificate ca entitati. daca se doreste modelarea apartenentei la
judete a localitatilor va exista o asociere
Asa cum am vazut asocierile pot lega multi-unu intre atributul LOCALITATE şi
doar entitati. Daca un descriptor al unei entitatea JUDET.
entitati este intr-o relatie multi-unu cu o Locali-
tate
alta entitate acel descriptor va fi trecut Apartine_de
in categoria entitatilor. BANCA JUDET

F. Radulescu. Curs: Baze de date 25 F. Radulescu. Curs: Baze de date 26

Exemplu - continuare Regula 4


In acest caz LOCALITATE va fi reclasificata ca
entitate desi nu sunt necesare alte informatii Regula 4. Atributele vor fi atasate la
in afara numelui localitatii.
entitatile pe care le descriu in mod
Num nemijlocit.
e
De exemplu, UNIVERSITATE va fi
atasat ca atribut al entitatii FACULTATE
BANCA LOCALITA- JUDET şi nu al entitatilor STUDENT sau
TE
PROFESOR.

F. Radulescu. Curs: Baze de date 27 F. Radulescu. Curs: Baze de date 28

Regula 5 Regula 5 - continuare


Regula 5. Folosirea identificatorilor compusi Daca identificatorul unei entitati este compus din
va fi evitata. mai multe atribute care sunt toate identificatori
in alte entitati, acea entitate se elimina
Identificatorul unei entitati este acea (informatia va fi modelata sub forma unei
submultime de atribute ale acesteia care asocieri intre acele entitati).
identifica in mod unic fiecare instanta a sa. Daca identificatorul unei entitati este compus din
In model relational pentru atributele de acest mai multe atribute care nu sunt toate
identificatori in alte entitati, exista doua solutii:
fel se construiesc de regula structuri de
Entitatea respectiva se elimina şi este inlocuita
cautare rapida (indecşi) care functioneaza cu prin alte entitati si asocieri (cu pastrarea
atat mai lent cu cat complexitatea indexului informatiei modelate).
creste. Entitatea respectiva ramine (dar scade viteza).
F. Radulescu. Curs: Baze de date 29 F. Radulescu. Curs: Baze de date 30

5
Florin Radulescu - Baze de date (note de curs)

Entitati si atribute - CONCLUZII CRITERII DE MODELARE


Se vede ca procedura clasificarii obiectelor
in entitati şi atribute este iterativa: Clasificarea in entitati şi atribute
se face o prima impartire conform primei Identificarea ierarhiilor de generalizare
reguli şi incluziune
parte din atributele astfel obtinute se Identificarea asocierilor
reclasifica in entitati conform regulilor 2 si Integrarea vederilor.
3
se face o rafinare finala conform regulilor
4 si 5.
F. Radulescu. Curs: Baze de date 31 F. Radulescu. Curs: Baze de date 32

IDENTIFICARE IERARHII (1) IDENTIFICARE IERARHII (2)


In cazul in care despre anumite
subclase ale unei clase de obiecte exista Rearanjare atribute:
informatii specifice, clasa şi subclasele La entitatea tata vor fi atasate atributele care
(care la pasul anterior au fost formeaza identificatorul şi descriptorii care
catalogate ca entitati) sunt modeleaza informatii specifice intregii clase.
interconectate intr-o ierarhie de La entitatile fiu vor fi atasate atributele de
incluziune sau generalizare, dupa cum identificare (aceleasi ca ale tatalui) şi
este cazul. atributele care modeleaza informatii
La acest pas se face şi o reatasare a specifice doar acelei subclase de obiecte.
atributelor pentru evitarea redundantei
F. Radulescu. Curs: Baze de date 33 F. Radulescu. Curs: Baze de date 34

Exemplu IERARHII - CONCLUZII


Matricola Nume
 Rezulta urmatoarele reguli:
STUDENT 1. Tatal şi fii unei ierarhii au acelasi
identificator.
Rezidenta

2. Descriptorii care apar şi la tata şi la fii


se elimina de la fii.
CAMINIST NECAMINIST 3. Descriptorii care apar la toti fii unei
ierarhii de generalizare şi nu apar la
Matricola Camera Matricola Adresa
tata se muta la tata.
Camin
F. Radulescu. Curs: Baze de date 35 F. Radulescu. Curs: Baze de date 36

6
Florin Radulescu - Baze de date (note de curs)

CRITERII DE MODELARE IDENTIFICARE ASOCIERI (1)


In aceasta etapa se trateaza
informatiile care nu au fost clasificate ca
Clasificarea in entitati şi atribute
entitati sau atribute ci reprezinta
Identificarea ierarhiilor de generalizare interdependente intre clase de obiecte.
şi incluziune Ele sunt modelate ca asocieri intre
Identificarea asocierilor entitati.
Integrarea vederilor. Pentru fiecare asociere se specifica
gradul, conectivitatea, obligativitatea si
daca este cazul si atributele asocierii
precum si rolurile ramurilor sale.
F. Radulescu. Curs: Baze de date 37 F. Radulescu. Curs: Baze de date 38

IDENTIFICARE ASOCIERI (2) ASOCIERI REDUNDANTE


 Ca şi in cazul clasificarii in entitati şi Urmează_profilul – redundantă !

atribute, existe citeva reguli de urmat STUDENT

in operatia de definire a asocierilor:


Înscris_la
1. Eliminarea asocierilor redundante PROFIL

2. Evitarea Asocierilor de grad mai mare


Are_profilul
ca 2 FACULTATE

F. Radulescu. Curs: Baze de date 39 F. Radulescu. Curs: Baze de date 40

ASOCIERI REDUNDANTE-cont. ASOCIERI DE GRAD > 2


In acest exemplu, asocierea INSCRIS_LA Asocierile de grad > 2 se folosesc doar
modeleaza apartenenta fiecarui student la o
facultate a unui institut de invatamint superior. atunci cand sunt strict necesare.
Fiecare facultate are un profil unic descris de Este de multe ori posibil ca o aceeasi
asocierea ARE_PROFILUL. Ambele asocieri sunt
multi-unu in sensul
informatie sa fie modelata ca o asociere
STUDENTFACULTATEPROFIL. ternara sau ca un ansamblu de asocieri
Deoarece asocierile multi-unu sunt asemanatoare binare si unare.
unor functii, din compunerea lor putem afla
profilul la care este inscris fiecare student. In cazul acesta, este de preferat ca sa
Rezulta ca asocierea URMEAZA_PROFILUL este se opteze pentru a doua varianta.
redundanta şi trebuie eliminata.
F. Radulescu. Curs: Baze de date 41 F. Radulescu. Curs: Baze de date 42

7
Florin Radulescu - Baze de date (note de curs)

ASOCIERI DE GRAD > 2 – cont. Exemplu – modelare gresita


Doar cand asocierile binare nu pot modela
intreaga semnificatie dorita se va opta pentru
STUDENT
asocieri de grad mai mare ca doi.
Aceasta cerinta deriva din faptul ca la Înscriere_şi_cazare
trecerea in modelul relational asocierile de CAMIN
grad superior devin scheme de relatii (tabele)
de sine statatoare, marind numarul de tabele
din baza de date pe cand cele de grad unu şi FACULTATE
doi (cu exceptia celor multi-multi) nu au acest
efect.
F. Radulescu. Curs: Baze de date 43 F. Radulescu. Curs: Baze de date 44

Exemplu – modelare corecta CRITERII DE MODELARE

STUDENT Locuieşte_în Clasificarea in entitati şi atribute


Identificarea ierarhiilor de generalizare
Înscris_la
CĂMIN
şi incluziune
Identificarea asocierilor
Are_cămine Integrarea vederilor
FACULTATE

F. Radulescu. Curs: Baze de date 45 F. Radulescu. Curs: Baze de date 46

INTEGRAREA VEDERILOR INTEGRAREA VEDERILOR – cont.


In cazul proiectarii bazelor de date complexe, Probleme:
activitatea se desfasoara uneori de catre mai
1. Obiecte cu aceeasi semnificatie au
multe colective simultan, fiecare modeland o
portiune distincta a bazei de date. nume diferite in diagramele de detaliu
Deoarece in final trebuie sa se obtina o 2. Obiecte cu semnificatii diferite au
singura diagrama a bazei de date, dupa acelasi nume in diagramele de detaliu
terminatea modelarii pe portiuni diagramele  Rezolvare: redenumire si “lipirea”
rezultate sunt integrate eliminandu-se
diagramelor intr-una singura pe baza
redundantele si inconsistentele.
elementelor comune

F. Radulescu. Curs: Baze de date 47 F. Radulescu. Curs: Baze de date 48

8
Florin Radulescu - Baze de date (note de curs)

Modelul EA utilizat de
Atribute
instrumente CASE
 Atributele unei entitati sunt inscrise in
 Modelul clasic are o serie de caseta acesteia
dezavantaje, mai ales in ceea ce  Atributele sunt marcate:
priveste lizibilitatea diagramelor  # Identificare
complexe.  * NOT NULL
 Pantru uneltele CASE care utilizeaza  o Poate fi NULL
EA s-a ales o varianta modificata

F. Radulescu. Curs: Baze de date 49 F. Radulescu. Curs: Baze de date 50

Asocieri Entitati
 Nu exista decat asocieri de grad 1 sau  Identificatorul unei entitati poate fi
2 cu conectivitate 1-1 sau 1-M format din atribute si/sau capete de
 Toate asocierile de grad mai mare ca asocieri.
2 sau cele de grad 1 sau 2 cu  Pot exista entitati (de exemplu entitati
conectivitate M-M sunt modelate ca intersectie) care au identificatorul
“entitati intersectie”. format numai din capete de asociere.
 Etichetarea nu este per asociere ci per  Marcajul este bararea capatului
capat de asociere (deci 2 etichete respectiv de asociere.
pentru fiecare asociere)
F. Radulescu. Curs: Baze de date 51 F. Radulescu. Curs: Baze de date 52

Ierarhiile Exemplificare
 Ierarhiile se numesc aici Subtipuri-
Supertipuri.
 Entitatile fiu sunt figurate ca incluse in
caseta entitatii tata.
 Exista in anumite variante doar
ierarhiile de generalizare (fara cele de
incluziune).

F. Radulescu. Curs: Baze de date 53 F. Radulescu. Curs: Baze de date 54

9
Florin Radulescu - Baze de date (note de curs)

Sfârşitul
cursului 4

F. Radulescu. Curs: Baze de date 55

10
Florin Radulescu - Baze de date (note de curs)

Sumar
Cursul 5
1. Modele de date. Modelul relational
2. Elementele modelului
Modelul 3.
4.
Transformarea EA-Relational
Algebra relationala
relational 5. Multiseturi
6. Operatori extinsi
- Partea 1 - 7. Calcul relational pe tupluri si domenii

F. Rădulescu. Curs: Baze de date I 1 F. Rădulescu. Curs: Baze de date I 2

MODELE DE DATE MODELUL IERARHIC


O problema fundamentala a unui SGBD este Modelul ierarhic, folosit de IBM in
modul in care datele sunt organizate in sistemul IMS (care inca este unul dintre
vederea stocarii si exploatarii lor de catre produsele furnizate de aceasta firma),
aplicatii. Din punct de vedere istoric, in anii
’60 au existat doua modele de organizare a
in care organizarea este sub forma
datelor care au fost apoi abandonate din arborescenta: nodurile contin date si
cauza problemelor pe care le generau: legaturi (‘pointeri’) catre nodurile fiu
Modelul ierarhic, Vezi:
Modelul retea. http://www-01.ibm.com/software/data/ims/

F. Rădulescu. Curs: Baze de date I 3 F. Rădulescu. Curs: Baze de date I 4

MODELUL RETEA DEZAVANTAJE


Dezavantajul principal al acestor doua
Modelul retea. In cadrul acestuia modele este ca accesul la o inregistrare
inregistrarile sunt structurate sub forma necesita navigarea prin arbore sau graf
unui graf orientat, fiecare nod putand pentru a o localiza.
avea mai multe inregistrari ‘tata’ si mai Din acest motiv apar o serie de
multi fii. Au existat mai multe sisteme probleme mai ales legate timpul
de gestiune si limbaje de programare necesar scrierii de noi programme si a
dezvoltate pe baza acestui model (de detectarii anomaliilor care pot sa apara
exemplu limbajul COBOL). in proiectarea bazei de date.
F. Rădulescu. Curs: Baze de date I 5 F. Rădulescu. Curs: Baze de date I 6

1
Florin Radulescu - Baze de date (note de curs)

MODELUL RELATIONAL
Modelul relational al datelor, folosit in
acest moment de majoritatea
covarsitoare a sistemelor de gestiune
aflate pe piata a fost introdus in anul
1970 prin articolul lui Edgar Frank Codd
”A relational model for large
shared databanks”.
(http://www.seas.upenn.edu/~zives/03f/cis550/codd.pdf)

F. Rădulescu. Curs: Baze de date I 7 F. Rădulescu. Curs: Baze de date I 8

AVANTAJE (1) AVANTAJE (2)


Datele sunt stocate doar ca valori; nu Furnizeaza o baza solida pentru
exista pointeri sau navigare prin date; problemele de corectitudine a datelor
(redundanta, anomalii, etc).
Face posibila dezvoltarea de limbaje de
cereri de nivel inalt in care utilizatorul Permite tratarea problemelor de
independenta a datelor (discutate in
specifica ce date doreste si nu cum se capitolul 1).
ajunge la rezultat, modul in care este
Este extensibil, putand fi utilizat si
calculat acesta fiind in sarcina pentru modelarea si manipularea de
sistemului de gestiune (exemplu de date complexe.
astfel de limbaj: SQL)
F. Rădulescu. Curs: Baze de date I 9 F. Rădulescu. Curs: Baze de date I 10

Sumar ELEMENTELE MODELULUI


1. Modele de date. Modelul relational Domeniu
2. Elementele modelului Relatie
3. Transformarea EA-Relational
Atribut
4. Algebra relationala
Schema unei relatii
5. Multiseturi
Cheia unei relatii
6. Operatori extinsi
7. Calcul relational pe tupluri si domenii Valori nule
Corectitudinea datelor

F. Rădulescu. Curs: Baze de date I 11 F. Rădulescu. Curs: Baze de date I 12

2
Florin Radulescu - Baze de date (note de curs)

DOMENIU Produs cartezian de domenii


 Definitie: Domeniu (eng. Domain) = o multime de Din teoria multimilor se cunoaste notiunea de
valori avand asociat un nume. produs cartezian al unor multimi: fiind date
 Un domeniu se poate defini fie prin enumerarea n domenii D1, D2, …, Dn produsul lor
elementelor sale fie prin specificarea unor cartezian este:
caracteristici definitorii ale acestora.
 Exemple: D1 × D2 × … × Dn = { (v1, v2, …, vn) | vi ∈ Di , i
 Culori = {rosu, galben, albastru, violet, verde}
= 1, …, n}
 Nota = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} sau Nota = Trebuie mentionat ca in sirul de domenii care
{n ∈ N* | n ≥ 1 si n ≤ 10} participa la un produs cartezian unele se
 Sir40 = {Multimea sirurilor de maxim 40 de poate gasi in mod repetat:
caractere} PC = Numar × Sir40 × Numar × Numar × Sir40 ×
 Numar = {Multimea numerelor intregi pozitive din Sir40
intervalul [0, 100000]}
F. Rădulescu. Curs: Baze de date I 13 F. Rădulescu. Curs: Baze de date I 14

ELEMENTELE MODELULUI RELATIE (1)


 Definitie: Relatie (eng. Relation) = o submultime a unui
Domeniu produs cartezian avand asociat un nume.
 Termenul de relatie provide de asemenea din matematica.
Relatie Un exemplu de relatie apartinand produsului cartezian PC
Atribut din paragraful anterior este:
Produse = {
Schema unei relatii (101, ‘Imprimanta laser’, 30, 20, ‘XY SRL’, ‘Str. X, Bucureşti’),
Cheia unei relatii (105, ‘Calculator PC’, 20, 23, ‘Z SRL’, ‘Bd. Z, Bucureşti’),
(124, ‘Copiator’, 10, 20, ‘XY SRL’, ‘Str. X, Bucureşti’)
Valori nule }
Corectitudinea datelor

F. Rădulescu. Curs: Baze de date I 15 F. Rădulescu. Curs: Baze de date I 16

REPREZENTAREA RELATIEI
RELATIE (2)
Produse
Elementele unei relatii sunt denumite in
literatura de specialitate tupluri (engl. tuple).
Relatia de mai sus contine doar 3 dintre 101 Imprimantă 30 20 XY SRL Str. X,
elementele produsului cartezian din care laser Bucureşti
provine (3 tupluri).
O reprezentare intuitiva pentru o relatie este o 105 Calculator PC 20 23 Z SRL Bd. Z,
tabela, fiecare coloana avand asociat un Bucureşti
anumit tip de date, dat de domeniul din care
provine.
124 Copiator 10 20 XY SRL Str. X,
Fiecare element al relatiei devine o linie a unei
tabele si fiecare coloana corespunde unui Bucureşti
domeniu din produsul cartezian de baza.
F. Rădulescu. Curs: Baze de date I 17 F. Rădulescu. Curs: Baze de date I 18

3
Florin Radulescu - Baze de date (note de curs)

ELEMENTELE MODELULUI ATRIBUT (1)


Domeniu
Deoarece o relatie are o reprezentare
Relatie tabelara putem vorbi de ‘coloană a unei
Atribut relatii’. In mod obisnuit, intr-o tabela
Schema unei relatii coloanele au un nume.
Cheia unei relatii Definitie: Atribut (eng. Attribute) =
Valori nule coloană a unei relatii avand asociat un
Corectitudinea datelor nume.

F. Rădulescu. Curs: Baze de date I 19 F. Rădulescu. Curs: Baze de date I 20

ATRIBUT (2) ATRIBUT (3)


Pentru relatia Produse putem fixa de IDP NUMEP QTY IDF NUMEF ADRESAF
exemplu urmatoarele nume de atribute:
 IdP – Codul produsului (nu exista doua 101 Imprimantă 30 20 XY SRL Str. X,
produse avand acelasi cod) laser Bucureşti
 NumeP – numele produsului
 Qty – Cantitate 105 Calculator PC 20 23 Z SRL Bd. Z,
 IdF – Codul furnizorului (nu exista doi Bucureşti
furnizori avand acelasi cod)
124 Copiator 10 20 XY SRL Str. X,
 NumeF – Numele furnizorului
Bucureşti
 AdresaF – Adresa furnizorului
F. Rădulescu. Curs: Baze de date I 21 F. Rădulescu. Curs: Baze de date I 22

ELEMENTELE MODELULUI SCHEMA RELATIEI (1)


Continutul unei relatii (vazuta ca o tabela)
Domeniu poate varia in timp: se pot adauga sau sterge
Relatie linii sau se pot modifica unele dintre valorile
Atribut din liniile existente.
Ceea ce ramane constanta este structura
Schema unei relatii relatiei: numele relatiei, numarul si tipul
Cheia unei relatii atributelor sale.
Valori nule In terminologia relationala structura unei
relatiei este denumita si schema relatiei.
Corectitudinea datelor

F. Rădulescu. Curs: Baze de date I 23 F. Rădulescu. Curs: Baze de date I 24

4
Florin Radulescu - Baze de date (note de curs)

SCHEMA RELATIEI (2) Schema relatiei Produse


Definitie: Schema unei relatii (eng.
Relation scheme) = numele relatiei
urmat de lista atributelor sale si  Produse(IdP, NumeP, Qty, IdF, NumeF, AdresaF)
(eventual) de domeniul din care acestea
provin.  Produse(IdP: Numar, NumeP: Sir40, Qty: Numar, IdF:
Numar, NumeF: Sir40, AdresaF: Sir40)
Exista mai multe modalitati prin care se
poate specifica schema unei relatii. In
exemplele urmatoare prezentam cateva  Produse = IdP, NumeP, Qty, IdF, NumeF, AdresaF
dintre acestea cu referire la relatia
Produse:
F. Rădulescu. Curs: Baze de date I 25 F. Rădulescu. Curs: Baze de date I 26

SCHEMA RELATIEI (3) ELEMENTELE MODELULUI


In cazul prezentarii unora dintre
Domeniu
elementele de teorie a bazelor de date
relationale se folosesc si notatii de Relatie
forma: Atribut
R = ABCDE Schema unei relatii
Semnificatie: schema relatiei R contine Cheia unei relatii
5 atribute notate cu A, B, C, D si Valori nule
respectiv E. Corectitudinea datelor

F. Rădulescu. Curs: Baze de date I 27 F. Rădulescu. Curs: Baze de date I 28

CHEIA RELATIEI (1) CHEIA RELATIEI (2)


O relatie fiind o multime (de tupluri) nu poate Cheia unei relatii este o caracteristica a
contine elemente (linii) duplicat – spre schemei acesteia si nu este determinata prin
deosebire de exemplu de un tabel Excel unde inspectarea valorilor aflate la un moment dat
putem avea dubluri. in relatie.
Rezulta ca tuplurile pot fi deosebite intre ele In tabela Produse cele trei linii existente pot fi
prin valorile aflate pe una sau mai multe identificate unic de valorile de pe 3 atribute
coloane din relatie. (IdP, NumeP si Qty) dar numai IdP este
cheie:
Definitie: Cheia unei relatii = multime
minimala de atribute ale caror valori identifica IdP identifica (prin definitie) in mod unic un
in mod unic un tuplu al relatiei respective produs; rezulta ca multimea de atribute {IdP}
este cheie (fiind si minimala prin natura sa}.
F. Rădulescu. Curs: Baze de date I 29 F. Rădulescu. Curs: Baze de date I 30

5
Florin Radulescu - Baze de date (note de curs)

CHEIA RELATIEI (3) CHEIA RELATIEI (4)


Multimea de atribute {IdP, IdF} identifica de Din acelasi motiv nici una dintre celelalte
asemenea unic fiecare tuplu al relatiei dar nu multimi de atribute ale relatiei Produse nu
este cheie nefiind minimala: prin inlaturarea este cheie:
lui IdF multimea ramane in continuare cheie.  fie nu este minimala (in cazul in care il include pe
Multimea de atribute {NumeP} nu este cheie: IdP)
este posibil ca in viitor in tabela Produse sa  fie nu identifica unic tuplurile relatiei (pot exista
avem mai multe linii cu NumeP = ‘Imprimanta valori duble)
laser’, ‘Copiator’ sau ‘Calculator PC’. In termeni de tabele rezulta ca nu pot exista
Asa cum am mentionat cheia se determina doua linii avand aceeasi combinatie de valori
din semnificatia atributelor relatiei si nu din pe coloanele care formeaza cheia tabelei
valorile la un moment dat. respective (proprietate denumita in literatura
de specialitate si unicitatea cheii)

F. Rădulescu. Curs: Baze de date I 31 F. Rădulescu. Curs: Baze de date I 32

CHEI MULTIPLE (1) CHEI MULTIPLE (2)


O relatie poate avea mai multe chei. Studenti (IdStud, NrMatricol, Nume, CNP,
SerieCI, NumarCI)
Sa ne imaginam o relatie Studenti continand { NrMatricol } – pentru ca nu pot exista doi
date despre studentii romani ai unei facultati: studenti ai unei facultati cu acelasi numar
Studenti (IdStud, NrMatricol, Nume, CNP, matricol
SerieCI, NumarCI) { CNP } – pentru ca nu pot exista doi cetateni
romani (deci nici doi studenti romani) cu
In acest caz avem mai multe chei: acelasi cod numeric personal
{ IdStud } – pentru ca IdStud este un numar { SerieCI, NumarCI } – pentru ca nu pot
asignat de sistem fiecarei inregistrari, fara exista doi cetateni romani (deci nici doi
repetitii studenti romani) cu aceeasi combinatie
serie/numar carte de identitate.
F. Rădulescu. Curs: Baze de date I 33 F. Rădulescu. Curs: Baze de date I 34

CHEI MULTIPLE (3) ELEMENTELE MODELULUI


 Observatie: Orice relatie are cel putin o cheie:
deoarece intr-o relatie nu pot exista doua elemente Domeniu
(tupluri, linii) identice, rezulta ca multimea tuturor Relatie
atributelor relatiei este cheie sau contine cel putin o
cheie. Atribut
 In literatura de specialitate si in sistemele de Schema unei relatii
gestiune a bazelor de date exista trei alte concepte
continand cuvaantul cheie si care vor fi prezentate in Cheia unei relatii
paragrafele urmatoare ale acestui capitol:
 Cheie primara - eng. Primary key,
Valori nule
 Cheie straina (sau externa) - eng. Foreign key, Corectitudinea datelor
 Supercheie - eng. Superkey.
F. Rădulescu. Curs: Baze de date I 35 F. Rădulescu. Curs: Baze de date I 36

6
Florin Radulescu - Baze de date (note de curs)

VALORI NULE VALORI NULE - Exemplu


Uneori, unele valori componente ale unei
relatii (celule ale tabelei) nu au nici o valoare
concreta. Se spune ca in acel loc exista o IdS NumeStud Codfacultate IdTutor Medie
valoare nula. 1001 Ionescu Ion 03 <NULL> 9,10
Definitie: Valoare nula (eng. Null value) = 1002 Popescu 03 1001 <NULL>
o valoare diferita de oricare alta si care
modeleaza o informatie necunoscuta sau o Vasile
informatie inaplicabila. 1003 Georgescu <NULL> 1001 8,40
Exemplul urmator prezinta o relatie Studenti Ion
in care exista astfel de valori nule si care au
fost simbolizate (pentru a iesi in evidenta)
prin <NULL>
F. Rădulescu. Curs: Baze de date I 37 F. Rădulescu. Curs: Baze de date I 38

VALORI NECUNOSCUTE VALORI INAPLICABILE


Modelarea unei informatii necunoscute: Modelarea unei informatii inaplicabile:
Sa presupunem ca unii dintre studenti sunt
Codul facultatii studentului Georgescu si consiliati in activitatea lor de un student de
media lui Popescu sunt nule pentru ca in an mai mare, numit si tutor.
momentul incarcarii cu date informatia Codul tutorului unui student este inscris pe
respectiva, desi existenta in lumea reala, nu coloana IdTutor (de exemplu Popescu si
era cunoscuta celui care a incarcat datele. Georgescu il au ca tutor pe studentul Ionescu
avand codul 1001).
La un moment ulterior aceste valori nule vor In cazul studentului Ionescu insa valoarea lui
fi inlocuite cu valori nenule care specifica IdTutor este nula pentru ca acest student nu
informatia respectiva. are la randul sau un tutor, valoarea nula fiind
cea corecta in contextul respectiv.
F. Rădulescu. Curs: Baze de date I 39 F. Rădulescu. Curs: Baze de date I 40

ELEMENTELE MODELULUI CORECTITUDINEA DATELOR(1)


 Schema unei relatii contine descrierea structurii
Domeniu acesteia dar nu da informatii privind corectitudinea
datelor continute in ea.
Relatie  Exemplul urmator prezinta o incarcare cu date
Atribut incorecte pentru tabela Produse, erorile fiind
urmatoarele:
Schema unei relatii  Exista doua produse diferite avand acelasi IdP (101)
 Ultimul produs din tabela nu are asignata o valoare
Cheia unei relatii pe coloana IdP
Valori nule  Aceeasi firma are doua coduri numerice diferite (20 si
22)
Corectitudinea datelor  Exista doua firme diferite cu acelasi cod (20)

F. Rădulescu. Curs: Baze de date I 41 F. Rădulescu. Curs: Baze de date I 42

7
Florin Radulescu - Baze de date (note de curs)

ATRIBUT (3) CORECTITUDINEA DATELOR(2)


IDP NUMEP QTY IDF NUMEF ADRESAF  Specificarea conditiilor de corectitudine pe care
trebuie sa le verifice datele se face astfel:
 In cadrul teoriei bazelor de date relationale, o relatie
contine date corecte daca acestea verifica setul de
101 Imprimantă 30 20 XY SRL Str. X, dependente functionale (sau de alt tip) atasat
relatiei respective (cap. 4)
laser Bucureşti  In cazul sistemelor de gestiune a bazelor de date
existente pe piata, acestea pun la dispozitie
101 Calculator PC 20 20 Z SRL Bd. Z, mecanisme de verificare numite constrangeri de
Bucureşti integritate. Constrangerile de integritate se definesc
fie la crearea tabelei fie ulterior si sunt de obicei de
cinci tipuri, descrise in continuare. SGBD-ul va rejecta
Copiator 10 22 XY SRL Str. Ygrec, orice operatie care violeaza vreuna dintre
Bucureşti constrangerile definite pe tabela respectiva.

F. Rădulescu. Curs: Baze de date I 43 F. Rădulescu. Curs: Baze de date I 44

CONSTRANGERI NOT NULL


Este o constrangere la nivelul unei coloane
dintr-o tabela
NOT NULL
Specifica faptul ca pe coloana respectiva nu
PRIMARY KEY pot sa apara valori nule.
UNIQUE Ex.: In cazul tabelei Produse o astfel de
constrangere se poate asocia pentru toate
FOREIGN KEY coloanele sau doar o parte din acestea.
CHECK Orice incercare de a adauga o linie care
contine valori nule pe acea coloana sau de a
modifica o valoare nenula intr-una nula va fi
respinsa de sistem.
F. Rădulescu. Curs: Baze de date I 45 F. Rădulescu. Curs: Baze de date I 46

CONSTRANGERI PRIMARY KEY (1)


O relatie poate avea mai multe chei (vezi chei
multiple).
NOT NULL
In momentul creerii tabelei corespunzatoare
PRIMARY KEY relatiei intr-un sistem de gestiune a bazelor
UNIQUE de date, una dintre ele poate fi aleasa ca si
cheie primara (principala) a tabelei
FOREIGN KEY
respective.
CHECK O tabela nu poate avea decat o singura cheie
primara, formata din una sau mai multe
atribute (coloane) ale acesteia.
F. Rădulescu. Curs: Baze de date I 47 F. Rădulescu. Curs: Baze de date I 48

8
Florin Radulescu - Baze de date (note de curs)

PRIMARY KEY (2) PRIMARY KEY (3)


SGBD-ul creaza automat structuri de Alegerea cheii care devine cheie primara va fi
cautare rapida (index) pentru cheia facuta in concordanta cu tipul de aplicatie in
primara a tabelei. care este folosita acea tabela.
Pentru exemplul tabelei de la paragraful
O caracteristica a cheii primare a unei 3.1.5:
tabele este (in majoritatea SGBD-urilor) Studenti (IdStud, NrMatricol, Nume, CNP,
cerinta ca pe coloanele componente nu SerieCI, NumarCI)
pot sa apara valori nule. avand cheile { IdStud }, { NrMatricol }, { CNP }
si { SerieCI, NumarCI } alegerea cheii
primare se poate face astfel:

F. Rădulescu. Curs: Baze de date I 49 F. Rădulescu. Curs: Baze de date I 50

PRIMARY KEY (4) PRIMARY KEY (5)


Studenti (IdStud, NrMatricol, Nume, CNP, Studenti (IdStud, NrMatricol, Nume, CNP,
SerieCI, NumarCI) SerieCI, NumarCI)
In cazul in care tabela este folosita intr- In cazul in care tabela este folosita intr-o
aplicatie a Biroului de politie Regie, alegerea
o aplicatie de gestiune a datelor privind se va face probabil intre CNP si (SerieCI,
scolaritatea, se poate alege cheia NumarCI), legatura cu bazele de date de la
primara NrMatricol, avand in vedere ca nivelurile superioare facandu-se dupa aceste
o serie de date privind rezultatele unui informatii.
student sunt legate de matricola sa In ambele cazuri se poate alege cheia
(informatie de legatura cu alte tabele) primara IdStud, continand numere unice
generate automat de SGBD.
F. Rădulescu. Curs: Baze de date I 51 F. Rădulescu. Curs: Baze de date I 52

CONSTRANGERI UNIQUE

NOT NULL Prin acest tip de constrangere se modeleaza


celelalte chei ale tabelei.
PRIMARY KEY
Pe coloanele unei chei definita cu UNIQUE
UNIQUE pot insa sa apara valori nule, unicitatea fiind
FOREIGN KEY verificata doar pentru valorile nenule de pe
CHECK coloanele cheii respective.
In exemplul anterior, daca s-a ales cheia
primara IdStud, pentru celelalte trei chei se
pot defini trei constrangeri de acest tip.
F. Rădulescu. Curs: Baze de date I 53 F. Rădulescu. Curs: Baze de date I 54

9
Florin Radulescu - Baze de date (note de curs)

CONSTRANGERI FOREIGN KEY – Cheie straina(1)


Sunt cazuri in care o multime de coloane ale
NOT NULL unei tabele contin valori care exista o cheie
PRIMARY KEY (primara/unica) a unei alte tabele. Sa
consideram o baza de date in care exista
UNIQUE urmatoarele doua tabele (cheile lor primare
FOREIGN KEY sunt cele subliniate):
CHECK Studenti(IdS, NumeStud, CodFacultate, IdTutor,
Medie)
Facultati(CodFacult, NumeFacultate, Adresa)

F. Rădulescu. Curs: Baze de date I 55 F. Rădulescu. Curs: Baze de date I 56

FOREIGN KEY – Cheie straina(2) FOREIGN KEY – Cheie straina(3)


Coloana CodFacultate din tabela Studenti nu este  Rezulta implicit ca in momentul incarcarii cu date este
cheie in aceasta tabela (pot exista mai multi necesar sa fie completata intai tabela Facultati si apoi
studenti cu aceeasi valoare pe aceasta coloana, tabela Studenti, altfel operatia de incarcare cu date
fiind studenti ai aceleiasi facultati) dar in mod va esua din cauza violarii acestei constrangeri.
normal contine valori care pot fi doar dintre cele  In cazul multor SGBD-uri se poate specifica in
existente pe cheia primara CodFacult din tabela constrangere si stergerea automata a inregistrarilor
Facultati. ‘fiu’ in cazul stergerii inregistrarii ‘tata’: la stergerea
liniei corespunzatoare unei facultati se vor sterge
O constrangere activa de acest tip (numita si automat si liniile din tabela Studenti continand
constrangere referentiala) va avea ca efect studentii acelei facultati.
respingerea inserarilor/modificarilor in tabela  Constrangerile referentiale provin de obicei din
Studenti care ar face ca pe coloana CodFacultate transformarea asocierilor unare si binare unu-unu si
sa apara o valoare care nu este deja in tabela multi-unu (descrise in capitolul precedent).
Facultati.
F. Rădulescu. Curs: Baze de date I 57 F. Rădulescu. Curs: Baze de date I 58

CONSTRANGERI CHECK (1)


Acest tip de constrangere specifica
NOT NULL faptul ca valorile unei linii din tabela
PRIMARY KEY trebuie sa verifice o conditie (expresie
logica).
UNIQUE
Exemplu: Fie tabela
FOREIGN KEY
Studenti(IdS, NumeStud, CodFacultate,
CHECK
IdTutor, Medie)

F. Rădulescu. Curs: Baze de date I 59 F. Rădulescu. Curs: Baze de date I 60

10
Florin Radulescu - Baze de date (note de curs)

CHECK (1) Sumar


Studenti(IdS, NumeStud, CodFacultate, 1. Modele de date. Modelul relational
IdTutor, Medie)
2. Elementele modelului
pe coloana Medie putem defini o
constrangere de acest tip specificand ca 3. Transformarea EA-Relational
valoarea (daca exista o valoare nenula) 4. Algebra relationala
trebuie sa fie din intervalul [0, 10]. 5. Multiseturi
Pe coloana NumeStud putem defini o 6. Operatori extinsi
verificare a lungimii numelui (ex.: 7. Calcul relational pe tupluri si domenii
Lunginea >= 3).

F. Rădulescu. Curs: Baze de date I 61 F. Rădulescu. Curs: Baze de date I 62

TRANSFORMARE EA- TRANSFORMARE EA-


RELATIONAL RELATIONAL
 In procesul de transformare vom pleca de la o c. Relatii provenite din asocieri. Este
diagrama EA si vom obtine trei tipuri de scheme de
relatie: cazul celor care apar din transformarea
 a. Relatii provenite din entitati. Ele contin aceleasi asocierilor binare multi-multi si a
informatii ca si entitatile din care au rezultat.
 b. Relatii provenite din entitati si care contin chei
asocierilor de grad mai mare ca doi.
straine. Ele contin pe linga informatiile provenite din Ele contin ca atribute reuniunea
entitatile din care au rezultat si atribute care in identificatorilor entitatilor asociate plus
alte entitati sunt identificatori. Este cazul acelor
entitati care au asocieri multi-unu si partial din atributele proprii ale asocierilor.
cele care au asocieri unu-unu cu alte entitati.

F. Rădulescu. Curs: Baze de date I 63 F. Rădulescu. Curs: Baze de date I 64

ENTITATI EXEMPLU
Transformarea entitatilor
Marca Nume Prenume Varsta
Fiecare entitate a diagramei se
transforma intr-o schema de relatie
avand:
 Numele relatiei = Numele entitatii
ANGAJATI
 Atributele relatiei = Atributele entitatii
 Cheia relatiei = Identificatorul Rezulta:
entitatii
Angajati(Marca, Nume, Prenume, Varsta)

F. Rădulescu. Curs: Baze de date I 65 F. Rădulescu. Curs: Baze de date I 66

11
Florin Radulescu - Baze de date (note de curs)

ASOCIERI M-1 SI 1-1 ASOCIERI M-1 SI 1-1 (cont.)


Fiecare asociere (UNARA SAU a. In cazul asocierilor multi-unu, se
BINARA) din aceasta categorie va adauga identificatorul entitatii unu in
avea ca rezultat adaugarea de atribute schema rezultata din entitatea multi
descriptive in unele dintre schemele
b. In cazul asocierilor unu-unu, se
rezultate din entitati.
adauga identificatorul unei entitati in
Aceste atribute care se adauga sunt schema rezultata din transformarea
chei straine: sunt cheie in alta schema celeilalte.
de relatie.

F. Rădulescu. Curs: Baze de date I 67 F. Rădulescu. Curs: Baze de date I 68

ASOCIERI M-1 SI 1-1 (cont.) EXEMPLU


In cazul 1-1: Alegerea schemei in care ANGAJATI Marca, Nume, Prenume, Varsta
se face adaugarea se poate face dupa
doua criterii:
Lucreaza_in Sef
 fie in acea schema care defineste relatia cu
cele mai putine tupluri din cele doua,
 fie pastrandu-se, daca exista, filiatia
naturala intre cele doua entitati: SECTII
identificatorul tatalui se adauga la fiu. Cod_Sectie, Profil

F. Rădulescu. Curs: Baze de date I 69 F. Rădulescu. Curs: Baze de date I 70

EXEMPLU (cont.) EXEMPLU (cont.)


ANGAJATI (Marca, Nume, Prenume, Varsta, Pe atributul Cod_Sectie din relatia
..., Cod_Sectie) ANGAJATI se va inregistra, pentru fiecare
angajat, codul sectiei in care acesta lucreaza
SECTII(Cod_Sectie, Profil, ..., Marca_Sef) Re atributul Marca_sef din relatia SECTII
se va inregistra pentru fiecare sectie marca
sefului de sectie.
Din asociere LUCREAZA_IN Pentru asociere SEF s-a aplicat primul
Din asociere SEF criteriu (relatia SECTII va avea mult mai
putine inregistrari decit ANGAJATI), dar si al
doilea criteriu este indeplinit.
F. Rădulescu. Curs: Baze de date I 71 F. Rădulescu. Curs: Baze de date I 72

12
Florin Radulescu - Baze de date (note de curs)

ASOCIERI M-M ASOCIERI DE GRAD > 2


Fiecare asociere binara multi-multi si fiecare Fiecare asociere binara multi-multi si fiecare
asociere cu grad mai mare ca doi se asociere cu grad mai mare ca doi se
transforma intr-o schema de relatie astfel:
 Nume relatie = Nume asociere transforma intr-o schema de relatie astfel:
 Atribute relatie = Reuniunea  Nume relatie = Nume asociere
identificatorilor entitatilor  Atribute relatie = Reuniunea
asociate la care se adauga identificatorilor entitatilor
atributele proprii ale asocierii asociate la care se adauga
 Cheia relatiei = Reuniunea
identificatorilor entitatilor atributele proprii ale asocierii
asociate (cf. tabel ->)  Cheia relatiei = Conform tabel (->)
F. Rădulescu. Curs: Baze de date I 73 F. Rădulescu. Curs: Baze de date I 74

Grad Conectivitate Cheia relatiei provenite din asociere


Unare multi (E) - multi (E) Cheie(E) + Cheie(E)
Binare multi (E1) - multi (E2) Cheie(E1) + Cheie(E2)
Ternare unu (E1) - unu (E2) - unu Cheie(E1)+Cheie(E2) sau
(E3) Cheie(E1)+Cheie(E3) sau
Cheie(E2)+Cheie(E3) sau

unu (E1) - unu (E2) - multi


(E3)
Cheie(E1)+Cheie(E3) sau
Cheie(E2)+Cheie(E3) sau Sfârşitul
unu (E1) - multi (E2) - multi Cheie(E2)+Cheie(E3)
(E3)
multi (E1) - multi (E2) - multi Cheie(E2)+Cheie(E3)+Cheie(E1) cursului 5
(E3)

Cheile schemelor de relatie rezultate din asocieri


Legenda:
X + Y: Multimea de atribute X impreuna cu multimea de atribute Y

F. Rădulescu. Curs: Baze de date I 75 F. Rădulescu. Curs: Baze de date I 76

13
Florin Radulescu - Baze de date (note de curs)

Sumar
Cursul 6
1. Modele de date. Modelul relational
2. Elementele modelului
Modelul 3.
4.
Transformarea EA-Relational
Algebra relationala
relational 5. Multiseturi
6. Operatori extinsi
- Partea 2 - 7. Calcul relational pe tupluri si domenii

F. Rădulescu. Curs: Baze de date I 1 F. Rădulescu. Curs: Baze de date I 2

ALGEBRA RELATIONALA
Inca din primul sau articol in care introduce
modelul relational, E.F. Codd propune si un
set de operatori pentru lucrul cu relatii.
O relatie este o multime de tupluri => o
parte dintre acesti operatori provin direct din
teoria multimilor.
Ceilalti operatori, introdusi in aceasta algebra
pentru relatii (numita in literature de
specialitate algebra relationala) sunt
specifici acesteia si au la baza operatii uzuale
cu tabele – acestea fiind reprezentarea
intuitiva pentru relatii.
F. Rădulescu. Curs: Baze de date I 3 F. Rădulescu. Curs: Baze de date I 4

ALGEBRA RELATIONALA (2) ALGEBRA RELATIONALA (3)


In acest subcapitol: variante de operatori:
Dupa aparitia primelor sisteme de gestiune a
bazelor de date relationale s-a constatat insa A. Operatori ai algebrei relationale clasice:
pornind de la una sau mai multe relatii
ca aceasta algebra nu inglobeaza o serie de obtinem o relatie.
situatii care apar in practica: B. Operatori ai algebrei pe multiseturi -
In cazul executiei unei cereri SQL pot sa lucreaza pe asa numitele multiseturi (in
apara tabele rezultat in care exista linii engleza bags) care sunt asemanatoare
duplicat. relatiilor dar in care putem avea elemente
duplicat.
In plus, daca pe o tabela nu a fost definita o
cheie primara, putem sa avem in aceasta mai C. Operatori care lucreaza atat pe relatii cat si
pe multiseturi. Ei sunt o extensie a algebrei
multe linii identice. relationale si pe multiseturi si provin din
Problema liniilor duplicat intra in contradictie necesitatea de a putea rescrie orice cerere
cu definitia unei relatii in care nu putem avea SQL in termeni al algebrei extinse.
doua tupluri identice.
F. Rădulescu. Curs: Baze de date I 5 F. Rădulescu. Curs: Baze de date I 6

1
Florin Radulescu - Baze de date (note de curs)

ALGEBRA RELATIONALA CLASICA REUNIUNEA


Reuniunea: Fiind date doua relatii R si S,
Exista mai multi operatori in cadrul reuniunea lor, notata R ∪ S este o relatie
care contine tuplurile care sunt fie in R, fie in
acestei algebre, unii dintre ei fiind S fie in ambele relatii. In rezultatul reuniunii
derivati (se pot rescrie in functie de alti nu apar tupluri duplicat.
Pentru ca aceasta operatie sa poata fi
operatori). Putem imparti acesti executata cele doua relatii care se reunesc
operatori in doua categorii: trebuie sa aiba scheme compatibile (acelasi
numar de coloane provenind din aceleasi
 Operatori derivati din teoria domenii (deci cu acelasi tip de date).
multimilor. Echivalent SQL: operatorul UNION prin care
se pot reuni rezultatele a doua cereri SQL de
 Operatori specifici algebrei relationale tip SELECT.
F. Rădulescu. Curs: Baze de date I 7 F. Rădulescu. Curs: Baze de date I 8

EXEMPLU REUNIUNEA (2)


SELECT NUME, CODS, LOC, PUNCTAJ
FROM STUD
WHERE CODS = 11 AND PUNCTAJ > 2000
UNION A B C A B C A B C
SELECT NUME, CODS, LOC, PUNCTAJ 1 1 2 4 1 2 1 1 2
FROM STUD 2 1 3 2 1 3 2 1 3
WHERE CODS = 21 AND LOC = 'BUCURESTI' 1 3 2 1 3 2 1 3 2
UNION 5 1 7 4 1 2
SELECT NUME, CODS, LOC, PUNCTAJ 5 1 7
FROM STUD Relatia R Relatia S Relatia R ∪ S
WHERE CODS = 24 AND PUNCTAJ >1500
ORDER BY LOC DESC, 4;

F. Radulescu. Curs: Baze de date - 9 F. Rădulescu. Curs: Baze de date I 10


Limbajul SQL

DIFERENTA EXEMPLU
Diferenta: Fiind date doua relatii R si S, SELECT NUME, CODS, LOC, PUNCTAJ
diferenta lor, notata R - S este o relatie care FROM STUD
WHERE CODS = 11 AND PUNCTAJ > 2000
contine tuplurile care sunt in R si nu sunt in
UNION
S. SELECT NUME, CODS, LOC, PUNCTAJ
Si in cazul diferentei cele doua relatii care se FROM STUD
reunesc trebuie sa aiba scheme compatibile. WHERE CODS = 21 AND LOC = 'BUCURESTI'
MINUS
Echivalent SQL: operatorul MINUS prin care SELECT NUME, CODS, LOC, PUNCTAJ
se poate face diferenta intre rezultatele a FROM STUD
doua cereri SQL de tip SELECT. WHERE PUNCTAJ >1500
ORDER BY LOC DESC, 4;

F. Rădulescu. Curs: Baze de date I 11 F. Radulescu. Curs: Baze de date - 12


Limbajul SQL

2
Florin Radulescu - Baze de date (note de curs)

DIFERENTA (2) INTERSECTIA


Intersectia: Fiind date doua relatii R
si S, intersectia lor, notata R ∩ S este o
A B C A B C A B C relatie care contine tuplurile care sunt si
1 1 2 4 1 2 1 1 2 in R si in S. De asemenea cele doua
2 1 3 2 1 3 relatii care se reunesc trebuie sa aiba
1 3 2 1 3 2 scheme compatibile.
5 1 7
Relatia R Relatia S Relatia R - S Echivalent SQL: operatorul INTERSECT
prin care se poate calcula intersectia
rezultatelor a doua cereri SQL de tip
SELECT.
F. Rădulescu. Curs: Baze de date I 13 F. Rădulescu. Curs: Baze de date I 14

EXEMPLU INTERSECTIA (2)


SELECT NUME, CODS, LOC, PUNCTAJ
FROM STUD
WHERE CODS = 11 AND PUNCTAJ > 2000
A B C A B C A B C
INTERSECT
1 1 2 4 1 2 2 1 3
SELECT NUME, CODS, LOC, PUNCTAJ
FROM STUD 2 1 3 2 1 3 1 3 2
WHERE LOC = 'BUCURESTI' 1 3 2 1 3 2
MINUS 5 1 7
SELECT NUME, CODS, LOC, PUNCTAJ Relatia R Relatia S Relatia R ∩ S
FROM STUD
WHERE PUNCTAJ >1500
ORDER BY LOC DESC, 4;

F. Radulescu. Curs: Baze de date - 15 F. Rădulescu. Curs: Baze de date I 16


Limbajul SQL

INTERSECTIA (3) PRODUS CARTEZIAN


Observatie: Intersectia este un Produsul cartezian: Fiind date doua relatii
operator derivat. Putem rescrie orice R si S, produsul lor cartezian, notata R × S
intersectie astfel: este o relatie ale carei tupluri sunt formate
prin concatenarea fiecarei linii a relatiei R cu
fiecare linie a relatiei S.
R ∩ S = R – (R – S) Rezulta de aici urmatoarele:
 Numarul de atribute (coloane) ale lui R × S este
egal cu suma numerelor de atribute ale lui R si S
 Numarul de tupluri (linii) ale lui R × S este egal cu
produsul numerelor de tupluri ale lui R si S

F. Rădulescu. Curs: Baze de date I 17 F. Rădulescu. Curs: Baze de date I 18

3
Florin Radulescu - Baze de date (note de curs)

PRODUS CARTEZIAN (2) PRODUS CARTEZIAN (3)


Echivalent SQL:
• Daca in R si S avem atribute (coloane)
In clauza FROM a unei cereri SELECT
cu acelasi nume, in produsul cartezian R
× S vom avea atribute care au acelasi apar doua (sau mai multe) tabele
nume. In cazul standardului SQL-3, se poate
folosi clauza CROSS JOIN a unei cereri
• Pentru a le deosebi se prefixeaza
de regasire de date de tip SELECT prin
numele atributului cu cel al relatiei din
care se poate efectua produsul
care provine (ex.: R.A si S.A, ca in
cartezian a doua tabele.
exemplul urmator)

F. Rădulescu. Curs: Baze de date I 19 F. Rădulescu. Curs: Baze de date I 20

PRODUS CARTEZIAN PRODUS CARTEZIAN (4)


Varianta 1: produs cartezian STUD cu SPEC:
SELECT * Exemplu: Fie
FROM STUD, SPEC; relatiile:
va returna un rezultat având 12 coloane şi 36 A B C A C D E
de linii formate din concatenarea fiecărei linii 1 1 2 4 1 2 5
din STUD cu fiecare linie din SPEC. 2 1 3 2 1 3 1
Varianta 2: acelasi produs cartezian: 1 3 2
SELECT *
Relatia R Relatia S
FROM STUD
CROSS JOIN SPEC;
F. Radulescu. Curs: Baze de date - 21 F. Rădulescu. Curs: Baze de date I 22
Limbajul SQL

PRODUS CARTEZIAN (4) ALGEBRA RELATIONALA CLASICA


Rezultat:
Exista mai multi operatori in cadrul
acestei algebre, unii dintre ei fiind
R.A R.B R.C S.A S.C S.D S.E
1 1 2 4 1 2 5 derivati (se pot rescrie in functie de alti
1 1 2 2 1 3 1 operatori). Putem imparti acesti
2 1 3 4 1 2 5 operatori in doua categorii:
2 1 3 2 1 3 1
1 3 2 4 1 2 5  Operatori derivati din teoria
1 3 2 2 1 3 1 multimilor.
 Operatori specifici algebrei relationale
F. Rădulescu. Curs: Baze de date I 23 F. Rădulescu. Curs: Baze de date I 24

4
Florin Radulescu - Baze de date (note de curs)

PROIECTIA PROIECTIA (2)


Proiectia: Fiind data o relatie R si o Echivalent SQL: Clauza SELECT a unei
multime de atribute ale acesteia X=A1, cereri de regasire de date in care este
A2, … An, proiectia lui R pe multimea specificata lista de expresii care da
de atribute X este o relatie care se structura de coloane a rezultatului.
obtine din R luand doar coloanele din X
(in aceasta ordine) si eliminand Exemplu: din relatia R de mai jos dorim
eventualele tupluri duplicat. sa calculam π B, C, E (R)
Notatia pentru selectie este
urmatoarea:
πX(R) sau π A1, A2, … An (R)
F. Rădulescu. Curs: Baze de date I 25 F. Rădulescu. Curs: Baze de date I 26

PROIECTIA (3) PROIECTIA (4)


A B C D E B C E Nota: in multimea de atribute pentru o
1 1 2 1 3 1 2 3 proiectie poate sa apara toate atributele
2 1 2 1 3 7 4 1
2 7 4 4 1 3 9 1 relatiei. In acest caz se obtine o relatie
2 3 9 2 1 3 7 1 cu acelasi continut cu cea initiala dar in
1 3 7 4 1
1 3 9 2 1 Rezultatul proiectiei π B, C, E (R)
care coloanele sunt permutate:
Observam ca s-au eliminat doua linii
Relatia R duplicat din rezultat (cele provenite din
liniile 2 si 6). π B, C, A, E, D (R)

F. Rădulescu. Curs: Baze de date I 27 F. Rădulescu. Curs: Baze de date I 28

PROIECTIA (5) SELECTIA


Selectia (numita uneori restrictia):
A B C D E B C A E D
1 1 2 1 3 1 2 1 3 1 Fiind data o relatie R si o expresie
2
2
1
7
2
4
1
4
3
1
1
7
2
4
2
2
3
1
1
4
logica F (o conditie), selectia lui R in
2 3 9 2 1 3 9 2 1 2 raport cu F este o relatie care se obtine
1 3 7 4 1 3 7 1 1 4
1 3 9 2 1 3 9 1 1 2 din R luand doar liniile care verifica
expresia logica F.
Relatia R Rezultatul proiectiei π B, C, A, E, D (R)
Notatia pentru selectie este
urmatoarea:
σF(R)
F. Rădulescu. Curs: Baze de date I 29 F. Rădulescu. Curs: Baze de date I 30

5
Florin Radulescu - Baze de date (note de curs)

SELECTIA (2) SELECTIA (3)


Echivalent SQL: Clauza WHERE a unei
A B C D E A B C D E
cereri de regasire de date de tip 1 1 2 1 3 2 7 4 4 1
SELECT pe care se scrie conditia pe 2 1 2 1 3
care trebuie sa o indeplineasca liniile 2 7 4 4 1
2 3 9 2 1
pentru a trece mai departe spre 1 3 7 4 1
rezultat. 1 3 9 2 1
Exemplu: din relatia R de mai jos dorim Relatia R Rezultatul selectiei σB+1 > A+C(R)
sa calculam σB+1 > A+C(R):

F. Rădulescu. Curs: Baze de date I 31 F. Rădulescu. Curs: Baze de date I 32

JOIN JOIN (2)


Joinul general (numit si theta-join sau θ- Sa luam un exemplu concret pentru
join): fiind date doua relatii R si S, joinul lor exemplificarea acestui operator: Sa
(notat R⋈FS) se obtine din produsul cartezian
consideram ca avem doua relatii, STUD
al relatiilor R si S urmat de o selectie dupa
conditia F (numita si conditie de join).
si SPEC avand schemele:
Denumirea de theta-join este folosita din  STUD(Matr, Nume, CodSpec, Media)
motive istorice, simbolul θ fiind folosit initial  SPEC(CodS, NumeS)
pentru a desemna o conditie.
Rezulta ca:
R⋈FS = σF(R × S)
F. Rădulescu. Curs: Baze de date I 33 F. Rădulescu. Curs: Baze de date I 34

JOIN (3) JOIN (4)


Sa consideram urmatoarele joinuri:
Matr Nume CodSpec Media CodS NumeS
101 Ionescu 10 8 10 Calculatoare si Tehnologia STUD⋈STUD.CodSpec=SPEC.CodSSPEC
Ion Informatiei
102 Popescu 11 9 11 Automatica si Informatica STUD⋈STUD.CodSpec>SPEC.CodSSPEC
Maria Industriala
302 Georgescu 10 9,50
Vasile
Relatia SPEC
Relatia STUD Rezultatul celor doua joinuri este
urmatorul:

F. Rădulescu. Curs: Baze de date I 35 F. Rădulescu. Curs: Baze de date I 36

6
Florin Radulescu - Baze de date (note de curs)

JOIN (5) JOIN (6)


Echivalent SQL: Cererile SQL echivalente sunt:
A. In clauza FROM a unei cereri de SELECT *
regasire de tip SELECT apar tabelele FROM STUD, SPEC
care participa la join + WHERE STUD.CodSpec=SPEC.CodS
B. In clauza WHERE se pune conditia de Si:
join, conectata cu AND de celelalte SELECT *
conditii care eventual sunt necesare in FROM STUD, SPEC
cererea respectiva. WHERE STUD.CodSpec>SPEC.CodS
Rezultate obtinute:
F. Rădulescu. Curs: Baze de date I 37 F. Rădulescu. Curs: Baze de date I 38

STUD⋈STUD.CodSpec=SPEC.CodSSPEC JOIN (7)


In cazul in care conditia de join este
Matr Nume CodSpec Media CodS NumeS una de egalitate, joinul se mai numeste
101 Ionescu Ion 10 8 10 Calculatoare si si echijoin (ca in cazul joinului
Tehnologia Informatiei
102 Popescu Maria 11 9 11 Automatica si precedent).
Informatica Industriala In restul cazurilor se foloseste sintagma
302 Georgescu Vasile 10 9,50 10 Calculatoare si
Tehnologia Informatiei
non-echijoin (joinul urmator).

F. Rădulescu. Curs: Baze de date I 39 F. Rădulescu. Curs: Baze de date I 40

STUD⋈STUD.CodSpec>SPEC.CodSSPEC
JOIN NATURAL
Join natural: Joinul natural pentru
doua relatii R si S (notat R⋈S )se
Matr Nume CodSpec Media CodS NumeS obtine:
102 Popescu Maria 11 9 10 Calculatoare si facand joinul celor doua relatii dupa
Tehnologia Informatiei
conditia: “coloanele cu aceeasi
semnificatie au valori egale” +
 eliminand prin proiectie coloanele
duplicat (cele dupa care s-a facut
joinul).
F. Rădulescu. Curs: Baze de date I 41 F. Rădulescu. Curs: Baze de date I 42

7
Florin Radulescu - Baze de date (note de curs)

JOIN NATURAL (2) JOIN NATURAL (3)


Echivalent SQL: Clauza NATURAL JOIN Exemplu: In cazul celor doua tabele de
din sintaxa SQL-3. mai sus, STUD si SPEC, joinul lor
Observatie: deoarece SGBD-ul nu natural va fi asemanator cu echijoinul
cunoaste semnificatia coloanelor, anterior, lipsind insa coloana duplicat
conditia de join implicita in acest caz SPEC.CodS (care are aceleasi valori ca
este “coloanele cu acelasi nume au si coloana STUD.CodSpec)
valori egale” Obs: In cazul folosirii clauzei NATURAL
JOIN cele doua coloane trebuie sa aiba
acelasi nume
F. Rădulescu. Curs: Baze de date I 43 F. Rădulescu. Curs: Baze de date I 44

JOIN NATURAL (4) JOIN EXTERN


Join extern: Asa cum s-a vazut din
Matr Nume CodSpec Media NumeS nonechijoinul anterior, in cazul in care o
101 Ionescu Ion 10 8 Calculatoare si linie a unei tabele, oricare ar fi
Tehnologia Informatiei concatenarea ei cu o alta linie din
102 Popescu Maria 11 9 Automatica si Informatica
Industriala
cealalta tabela, nu indeplineste conditia
302 Georgescu Vasile 10 9,50 Calculatoare si de join, linia respectiva nu are
Tehnologia Informatiei corespondent in rezultat.
Este cazul liniilor studentilor de la
specializarea 10 si al liniei specializarii
11.
F. Rădulescu. Curs: Baze de date I 45 F. Rădulescu. Curs: Baze de date I 46

JOIN EXTERN (2) JOIN EXTERN (3)


In unele cazuri se doreste insa ca  Join extern stanga (left outer join), in care in rezultat
apar toate liniile tabelei din stanga operatorului.
aceste linii sa apara in rezultat, cu valori Notatia este: R LS.
nule pe coloanele din cealalta tabela.  Join extern dreapta (right outer join), in care in
rezultat apar toate liniile tabelei din dreapta
Aceasta operatie poarta numele de join operatorului. Notatia este: R RS.
extern (in engleza outer join).  Join extern complet (full outer join), in care in
rezultat apar toate liniile tabelelor din stanga si din
Cum la un join participa doua tabele, dreapta operatorului. Notatia este: R S.
pot exista trei tipuri de join extern:  De notat ca in rezultatul joinului extern sunt
intotdeauna continute tuplurile (liniile) din rezultatul
joinului general dupa aceeasi conditie.

F. Rădulescu. Curs: Baze de date I 47 F. Rădulescu. Curs: Baze de date I 48

8
Florin Radulescu - Baze de date (note de curs)

STUD L (STUD.CodSpec>SPEC.CodS) SPEC STUD R(STUD.CodSpec>SPEC.CodS) SPEC

Matr Nume CodSpec Media CodS NumeS Matr Nume CodSpec Media CodS NumeS
102 Popescu Maria 11 9 10 Calculatoare si 102 Popescu Maria 11 9 10 Calculatoare si
Tehnologia Informatiei Tehnologia Informatiei
NULL NULL NULL NULL 11 Automatica si
101 Ionescu Ion 10 8 NULL NULL Informatica Industriala
302 Georgescu Vasile 10 9,50 NULL NULL

F. Rădulescu. Curs: Baze de date I 49 F. Rădulescu. Curs: Baze de date I 50

STUD (STUD.CodSpec>SPEC.CodS) SPEC Exemplu SQL


 Exemplu de FULL OUTER JOIN
SELECT S.NUME "NUME STUD",
Matr Nume CodSpec Media CodS NumeS
102 Popescu Maria 11 9 10 Calculatoare si S.AN "AN STUD",
Tehnologia Informatiei
101 Ionescu Ion 10 8 NULL NULL
T.NUME "NUME TUTOR",
302 Georgescu 10 9,50 NULL NULL T.AN "AN TUTOR"
Vasile
NULL NULL NULL NULL 11 Automatica si FROM STUD S
Informatica Industriala
FULL OUTER JOIN STUD T
ON (S.TUTOR=T.MATR);
(Intrebare: cate linii are rezultatul?)

F. Rădulescu. Curs: Baze de date I 51 F. Radulescu. Curs: Baze de date - 52


Limbajul SQL

SEMIJOIN Sumar
Semijoin: Fie doua relatii R si S. Atunci
semijoinul lui R in raport cu S ( notat R S)
1. Modele de date. Modelul relational
este o relatie care contine multimea tuplurilor 2. Elementele modelului
lui R care participa la joinul natural cu S. 3. Transformarea EA-Relational
Semijoinul este un operator derivat. Putem 4. Algebra relationala
scrie ca: 5. Multiseturi
R S = πR (R⋈S)
6. Operatori extinsi
Semijoinurile pot fi folosite in optimizarea
7. Calcul relational pe tupluri si domenii
cererilor de regasire in baze de date
distribuite.
F. Rădulescu. Curs: Baze de date I 53 F. Rădulescu. Curs: Baze de date I 54

9
Florin Radulescu - Baze de date (note de curs)

MULTISETURI REUNIUNE MULTISETURI


Asa cum am spus anterior, in practica Reuniunea: Efectul este asemanator
bazelor de date intr-o tabela sau un cu al reuniunii din algebra relationala
rezultat al unei cereri de regasire de dar din rezultatul final nu se elimina
date pot sa apara linii duplicat. duplicatele.
In acest caz nu mai putem vorbi de
relatii (care nu permit tupluri duplicat)
ci de multiseturi (eng. bags).
Prezentam pe scurt efectul unora dintre
operatorii de mai sus aplicati
multiseturilor.
F. Rădulescu. Curs: Baze de date I 55 F. Rădulescu. Curs: Baze de date I 56

EXEMPLU ALTE OPERATII


Intersectia, diferenta, produsul
A B C A B C A B C
cartezian, selectia, joinul, joinul natural,
1 1 2 1 3 2 1 1 2 joinul extern: acelasi mod de calcul ca si in
1 1 2 2 1 3 1 1 2 cazul relatiilor dar:
1 3 2 1 3 2
Multiset S 1 3 2 Multiseturile operand pot sa contina linii
2 1 3 duplicat
Multiset R Multiset R ∪ S
Din rezultat nu se elimina liniile duplicat
Observatie: in cazul acestor operatii nu pot
aparea linii duplicat decat daca operanzii
contin linii duplicat.
F. Rădulescu. Curs: Baze de date I 57 F. Rădulescu. Curs: Baze de date I 58

PROIECTIE MULTISETURI EXEMPLU


Proiectia: Acelasi mod de calcul ca si A B C D E B C E
1 1 2 1 3 1 2 3
in cazul relatiilor dar la final nu 2 1 2 1 3 1 2 3
eliminam liniile duplicat. 2 7 4 4 1 7 4 1
2 3 9 2 1 3 9 1
1 3 7 4 1 3 7 1
1 3 9 2 1 3 9 1

Multiset R Rezultatul proiectiei π B, C, E (R)


pentru multisetul R
Observam ca nu s-au eliminat liniile
duplicat

F. Rădulescu. Curs: Baze de date I 59 F. Rădulescu. Curs: Baze de date I 60

10
Florin Radulescu - Baze de date (note de curs)

Sumar OPERATORI EXTINSI


1. Modele de date. Modelul relational Redenumirea
2. Elementele modelului
Eliminare duplicate
3. Transformarea EA-Relational
Grupare
4. Algebra relationala
5. Multiseturi Sortare
6. Operatori extinsi Proiectie extinsa
7. Calcul relational pe tupluri si domenii

F. Rădulescu. Curs: Baze de date I 61 F. Rădulescu. Curs: Baze de date I 62

REDENUMIREA REDENUMIREA (2)


 Redenumirea: Exista doua modalitati de a Echivalent SQL pentru operatorul ρ :
face redenumirea tabelelor si/sau
Aliasurile de coloana si de tabela folosite
coloanelor:
in clauzele SELECT, respectiv FROM
1. Operatorul de redenumire ρ permite atat
redenumirea relatiilor/multiseturilor cat si a
dintr-o cerere de regasire de tip SELECT
atributelor acestora:
 Fiind data o relatie R, putem obtine o alta
relatie S = ρS(A1, A2, …, An)(R) care are acelasi
continut ca si R dar atributele se numesc
A1, A2, … , An.
F. Rădulescu. Curs: Baze de date I 63 F. Rădulescu. Curs: Baze de date I 64

REDENUMIREA (3) REDENUMIREA (4)


 Constructorul → care permite  Exemplu: Fie o relatie R=ABCDE.
redenumirea atributelor in rezultatul  In rezultatul proiectiei:
unei expresii relationale sau pe π B→Nume, C→Prenume, E→DataN (R)
multiseturi:
atributele nu sunt B, C si E ci Nume,
 Putem redenumi intr-un rezultat un Prenume si DataN
atribut prin constructia:
 Echivalent SQL: aliasul de coloana
 Nume_vechi → Nume_nou folosit in clauza SELECT a unei cereri
de regasire.

F. Rădulescu. Curs: Baze de date I 65 F. Rădulescu. Curs: Baze de date I 66

11
Florin Radulescu - Baze de date (note de curs)

ELIMINARE DUPLICATE ELIMINARE DUPLICATE (2)


Eliminare duplicate: Acest operator
se poate aplica doar pe multiseturi A B C A B C
(relatiile nu contin tupluri duplicat). 1 2 3 1 2 3
Efectul este eliminarea duplicatelor din 1 2 3 7 4 1
multiset. Notatia operatorului este 7 4 1 3 9 1
3 9 1 3 7 1
urmatoarea: 3 7 1
Fiind dat un multiset R, δ(R) este un 3 9 1
multiset fara duplicate (deci o relatie) Multisetul R Multisetul (relatia) δ(R)

Echivalent SQL: SELECT DISTINCT


dintr-o cerere de regasire de tip SELECT
F. Rădulescu. Curs: Baze de date I 67 F. Rădulescu. Curs: Baze de date I 68

GRUPARE GRUPARE (2)


Grupare: Forma operatorului de grupare Acest operator se poate aplica atat relatiilor
este urmatoarea: cat si multiseturilor.
γLista_atribute_si_functii_statistice(R) Echivalent SQL: Functii statistice si grupare
cu GROUP BY
Atributele din lista sunt criterii de grupare. Ele
apar in rezultatul returnat de operator Un exemplu in acest sens este edificator: In
cazul relatiei STUD anterioare:
Functiile statistice din lista (ex.: MIN, MAX,
SUM, AVG, COUNT) se calculeaza la nivelul γCodSpec, Count(*)→NrStud, AVG(Medie)→Medie(STUD)
fiecarui grup si de asemenea apar in
rezultatul operatorului va returna o relatie avand urmatorul continut:

F. Rădulescu. Curs: Baze de date I 69 F. Rădulescu. Curs: Baze de date I 70

GRUPARE (3) SORTARE (ORDONARE)


Sortare: Forma operatorului de sortare
este urmatoarea:
CodSpec NrStud Medie τLista_atribute(R)
10 2 8,75
Efectul este sortarea relatiei sau
11 1 9,00
multisetului R in functie de atributele
din lista.

F. Rădulescu. Curs: Baze de date I 71 F. Rădulescu. Curs: Baze de date I 72

12
Florin Radulescu - Baze de date (note de curs)

SORTARE (ORDONARE) - cont PROIECTIE EXTINSA


Cum atat in cazul relatiilor cat si a Proiectie extinsa: Acest operator este
multiseturilor nu este presupusa o analog proiectiei obisnuite dar permite
relatie de ordine, acest operator practic atribute (coloane) calculate pentru rezultatul
unei expresii pe relatii sau multiseturi. Forma
nu modifica argumentul (doar sa este urmatoarea:
rearanjeaza elementele).
π Expresie1, Expresie2, … Expresie-n (R)
Deci el are sens doar atunci cand este
Observatie: in functie de rezultatul dorit
ultimul aplicat unei expresii. (relatie sau multiset) dupa ce se calculeaza
Echivalent SQL: Clauza ORDER BY rezultatele duplicatele se elimina sau nu se
dintr-o cerere de regasire de tip SELECT elimina.

F. Rădulescu. Curs: Baze de date I 73 F. Rădulescu. Curs: Baze de date I 74

PROIECTIE EXTINSA (2) PROIECTIE EXTINSA


Echivalent SQL: Ca si in cazul proiectiei
obisnuite, acest operator este Nume Dublu
implementat prin clauza SELECT a unei Ionescu Ion 16
cereri de regasire a informatiei Popescu Maria 18

Exemplu: Pentru expresia: Georgescu Vasile 19


π Nume, Medie*2→Dublu (STUD)
Rezultatul este:

F. Rădulescu. Curs: Baze de date I 75 F. Rădulescu. Curs: Baze de date I 76

Sumar CALCUL RELATIONAL


1. Modele de date. Modelul relational Pe langa algebra relationala, cererile de
2. Elementele modelului regasire a informatiei intr-o baza de
3. Transformarea EA-Relational date relationala pot fi exprimate si prin:
4. Algebra relationala  calcul relational pe tupluri (CRT)
5. Multiseturi  calcul relational pe domenii (CRD).
6. Operatori extinsi
7. Calcul relational pe tupluri si domenii

F. Rădulescu. Curs: Baze de date I 77 F. Rădulescu. Curs: Baze de date I 78

13
Florin Radulescu - Baze de date (note de curs)

CALCUL RELATIONAL PE
ATOMI
TUPLURI - CRT
Formula este compusa din elemente (numite
In calcului relational pe tupluri o cerere si atomi) care pot fi de trei tipuri:
se exprima printr-o expresie de forma: Elemente de tip R(s) unde R este un nume de
relatie iar s o variabila tuplu. Semnificatia
{ t | ψ(t) } este “s este un tuplu din R”
t este o variabila tuplu iar ψ o Elemente de tip s[i] θ v[j] unde s si v sunt
variabile tuplu iar θ un operator prin care se
formula. poate compara componenta i a variabilei
Semnificatia expresiei este “multimea tuplu s cu componenta j a variabilei tuplu v
s[i] θ a sau a θ s[i] prin care componenta i a
tuturor tuplurilor t care verifica formula variabilei tuplu s se compara cu constanta a.
ψ”.
F. Rădulescu. Curs: Baze de date I 79 F. Rădulescu. Curs: Baze de date I 80

APARITII APARITII (2)


 Pe baza acestor atomi se poate defini 2. Daca ψ si φ sunt doua formule, atunci
recursiv ce este o formula si ce sunt ψ ∨ φ, ψ ∧ φ si ¬ψ sunt formule cu
aparitii libere sau legate ale semnificatia ψ sau-logic φ, ψ si-logic
variabilelor tuplu: φ” si respectiv “not ψ”.
Aparitiile de variabile tuplu sunt libere sau
1. Orice atom este in acelasi timp legate in aceste formule dupa cum ele
formula. Toate aparitiile unei variabile sunt libere sau legate in componentele
tuplu intr-un atom sunt aparitii libere acestora. Este permis ca o aceeasi
variabila tuplu sa aiba o aparitie libera
in ψ si o alta legata in φ
F. Rădulescu. Curs: Baze de date I 81 F. Rădulescu. Curs: Baze de date I 82

APARITII (3) APARITII (4)


3. Daca ψ este o formula atunci si (∃s)( ψ) este 4. Daca ψ este o formula atunci si (∀s)( ψ)
formula. Aparitiile variabilei tuplu s care sunt este formula. Aparitiile variabilei tuplu s care
libere in ψ sunt legate in (∃s)( ψ). Celelalte sunt libere in ψ sunt legate in (∀s)( ψ).
aparitii de variabile tuplu din ψ raman la fel Celelalte aparitii de variabile tuplu din ψ
(libere sau legate) in (∃s)( ψ). raman la fel (libere sau legate) in (∀s)( ψ).
Semnificatia acestei formule este urmatoarea: Semnificatia acestei formule este urmatoarea:
exista o valoare concreta a lui s care orice valoare concreta a lui s pusa in locul
inlocuita in toate aparitiile libere din ψ face aparitiilor libere ale acestuia din ψ face ca ψ
ca aceasta sa fie adevarata. sa fie adevarata.

F. Rădulescu. Curs: Baze de date I 83 F. Rădulescu. Curs: Baze de date I 84

14
Florin Radulescu - Baze de date (note de curs)

APARITII (5) EXEMPLE (EXPRESII, FORMULE)


5. Parantezele pot fi folosite in formule  Exemple de expresii si formule:
1. Expresia {t | R(t) ∨ S(t) } este echivalenta
dupa necesitati. reuniunii a doua relatii din algebra
relationala.
2. Analog {t | R(t) ∧ S(t) } reprezinta
Precedenta este: intai comparatiile, apoi ∃ intersectia a doua relatii.
si ∀ si in final ¬, ∧, ∨ (in aceasta 3. Expresia pentru proiectia lui R pe atributele
ordine) i1, i2, …, ik se poate scrie astfel:
{ t(k) | (∃u)(R(u) ∧ t[1] = u[i1] ∧ t[2] = u[i2] ∧ … ∧
t[k] = u[ik]) }
4. Formula (∃s)(R(s)) spune ca relatia R este
nevida
F. Rădulescu. Curs: Baze de date I 85 F. Rădulescu. Curs: Baze de date I 86

EXPRESII SIGURE DOM(ψ)


Din pacate unele din expresiile scrise in calcul
relational pe tupluri duc la rezultate infinite. Definitie: Daca ψ este o formula
 Exemplu: daca R este o relatie finita atunci atunci domeniul sau, notat cu DOM(ψ)
expresia {t | R(t) } este de asemenea finita este multimea tuturor valorilor care fie
dar expresia {t | ¬ R(t) } este infinita
(exista o infinitate de tupluri care nu apar explicit in ψ sau sunt componente
apartin lui R). ale tuplurilor relatiilor prezente in ψ.
Pentru a evita astfel de rezultate s-au
introdus asa numitele expresii sigure. Cum orice relatie este finita rezulta ca
Pentru definirea lor este necesara definirea si domeniul oricarei formule este finit.
unui alt concept si anume domeniul unei
formule

F. Rădulescu. Curs: Baze de date I 87 F. Rădulescu. Curs: Baze de date I 88

EXEMPLU EXPRESIE SIGURA


Fie formula ψ = R(t) ∧ t[1] > 100 care Definitie: O expresie ψ se zice ca este
reprezinta conditia pentru o selectie din sigura daca rezultatul sau este compus
R dupa conditia “valoarea pe prima doar din valori apartinand lui DOM(ψ).
coloana este mai mare decat 100”.
Atunci:

DOM(ψ) = { 100 } ∪ {multimea


valorilor care apar in tuplurile lui R }

F. Rădulescu. Curs: Baze de date I 89 F. Rădulescu. Curs: Baze de date I 90

15
Florin Radulescu - Baze de date (note de curs)

EXEMPLE EXEMPLE – cont.


Expresiile: Expresiile:
{t | R(t) }, {t | ¬ R(t) }
{t | R(t) ∧ t[1] > 100 }, {t | ¬R(t) ∧ ¬S(t) }
{t | R(t) ∨ S(t) }, {t | R(t) ∧ S(t) } sau nu sunt sigure.
{ t(k) | (∃u)(R(u) ∧ t[1] = u[i1] ∧ t[2]
= u[i2] ∧ … ∧ t[k] = u[ik]) }
sunt sigure

F. Rădulescu. Curs: Baze de date I 91 F. Rădulescu. Curs: Baze de date I 92

CALCUL RELATIONAL PE
ECHIVALENTA CRT CU AR
DOMENII - CRD
Se poate demonstra ca expresiile sigure
din CRT sunt echivalente cu expresii din In calculul relational pe domenii nu
algebra relationala si reciproc. avem variabile tuplu ci variabile de
domeniu, ele constituind elementele
care formeaza tuplurile.
In acest caz trebuiesc rescrise regulile
de formare pentru o formula in CRD
dupa cum urmeaza:

F. Rădulescu. Curs: Baze de date I 93 F. Rădulescu. Curs: Baze de date I 94

ATOM FORMULE SI EXPRESII


Un atom poate fi: Formulele din CRD sunt construite
R(x1, x2, …, xn) unde R este o relatie analog cu cele din CRT utilizand de
asemenea ¬, ∧, ∨ precum si ∃, ∀.
iar xi sunt variabile de domeniu sau
constante Notiunile de aparitie libera sau legata a
unei variabile de domeniu sunt analoge
x θ y unde x si y sunt variabile de cu cele din CRT
domeniu sau constante iar θ este in Analog cu CRT se definesc: domeniul
continuare un operator de comparatie. unei variabile de domeniu DOM(x) si
expresii sigure in CRD.

F. Rădulescu. Curs: Baze de date I 95 F. Rădulescu. Curs: Baze de date I 96

16
Florin Radulescu - Baze de date (note de curs)

EXEMPLE: EXPRESII CARE NU


EXEMPLE – EXPRESII SIGURE
SUNT SIGURE
Reuniunea a doua relatii R si S:
{x1x2…xn | R(x1x2…xn) ∨ S(x1x2…xn) } {x1x2…xn | ¬R(x1x2…xn) }
Intersectia a doua relatii R si S {x1x2…xn | ¬R(x1x2…xn) ∧ ¬S(x1x2…xn) }
{x1x2…xn | R(x1x2…xn) ∧ S(x1x2…xn) }
Selectia dupa conditia “valoarea pe
prima coloana este mai mare decat
100:
{x1x2…xn | R(x1x2…xn) ∧ x1 > 100 }
F. Rădulescu. Curs: Baze de date I 97 F. Rădulescu. Curs: Baze de date I 98

Exercitii
ECHIVALENTA CRD CU AR Exercitiul 1. Fie diagrama entitate asociere de mai jos.
a. Sa se corecteze erorile de sintaxa
In literatura de specialitate se arata ca b. Sa se transforme in model relational
expresiile sigure din CRD sunt A_stat_in: M-M, Cas_cu: 1-1, Acum_locuieste: M-1
echivalente cu expresii din algebra IS: IdStudent, IC: IdCamin, ambele identificatori

relationala si reciproc (deci implicit cele Sotie


A_stat_in

doua formalisme – CRD si AR – sunt


echivalente). STUDENT CAMIN

An
Cas_Cu

NumeS IS IC NumeC
Acum_locuieste

F. Rădulescu. Curs: Baze de date I 99 Lucrare la mijlocul semestrului, 100


28.4.2009

Exercitii
Exercitiul 2. Fie R=ABC, S=CDE, ambele cu cate 3
tupluri cu:
R[i, j] = i + j, S[i, j]=i+2*j+1 (i=indice de
linie, j=indice de coloana)
1. Sa se scrie explicit relatiile R si S.
2. Sa se calculeze joinul natural intre relatiile R
Sfârşitul
si S.
3. Sa se calculeze joinul extern complet intre
relatiile R si S dupa conditia R.C=S.C.
cursului 6
4. Considerand operatorii extinsi scrieti
rezultatul expresiei
γA → Crt, COUNT(*) → Cati(R × S)

F. Rădulescu. Curs: Baze de date I 101 F. Rădulescu. Curs: Baze de date I 102

17
Florin Radulescu - Baze de date (note de curs)

Cursul 7 Sumar
1. Problematica. Anomalii.
2. Dependente functionale
Proiectarea bazelor 3.
4.
Forme normale: FN1, FN2, FN3, FNBC
Descompunerea schemelor de relatii
de date 5. Dependente multivalorice. Forma
normala 5.
- Partea 1 -
F. Radulescu. Curs: Baze de date 1 F. Rădulescu. Curs: Baze de date I 2

PROBLEMATICA PROBLEMATICA – CONT.


O categorie de probleme care pot sa apara in DF modeleaza corelatii care exista intre
dezvoltarea unei aplicatii continand o baza de datele din lumea reala stocate in baza de
date este cea a proiectarii incorecte a date si reprezinta criterii de corectitudine ale
schemelor de relatie. datelor incarcate in baza de date.
In acest caz pot sa apara o serie de
anomalii care pot complica procesul de In cazul in care o relatie nu are o schema
programare. corespunzatoare ea trebuie inlocuita cu doua
Testarea corectitudinii unei scheme de relatie sau mai multe relatii (operatia este numita si
poate fi facuta cu ajutorul dependentelor descompunerea unei scheme de relatie),
functionale - DF (sau de alt tip) atasate fiecare relatie rezultata avand o schema
acelei scheme. corecta – aflata in forma normala dorita.
F. Radulescu. Curs: Baze de date 3 F. Radulescu. Curs: Baze de date 4

ANOMALII (Cap 2) ANOMALII (1)


IDP NUMEP QTY IDF NUMEF ADRESAF
 Redundanta: Redundanta reprezinta
101 Imprimantă 30 20 XY SRL Str. X, stocarea in mod nejustificata a unei
laser Bucureşti aceleiasi informatii de mai multe ori in
baza de date.
105 Calculator PC 20 23 Z SRL Bd. Z,
Bucureşti  Observam ca pentru fiecare produs
este stocat numele si adresa
124 Copiator 10 20 XY SRL Str. X, furnizorului, desi ele sunt unic
Bucureşti
determinate de codul acestuia.
F. Radulescu. Curs: Baze de date 5 F. Radulescu. Curs: Baze de date 6

1
Florin Radulescu - Baze de date (note de curs)

ANOMALII (2) ANOMALII (3)


 Anomalia de stergere: La stergerea  Anomalia de actualizare: In cazul
din relatie a ultimului produs al unui actualizarii unei informatii redundante,
furnizor se pierd automat si datele se poate intampla ca operatia sa
despre acesta. modifice unele aparitii ale acesteia iar
altele sa ramana cu vechea valoare.

F. Radulescu. Curs: Baze de date 7 F. Radulescu. Curs: Baze de date 8

SURSA ANOMALIILOR DIN


ANOMALII (4) EXEMPLU
 Anomalia de inserare: Nu putem Aceste anomalii apar in relatia
insera date despre un furnizor PRODUSE deoarece intr-o aceeasi
(numele si adresa sa) decat daca tabela au fost stocate date despre doua
exista in stoc un produs furnizat de clase diferite de obiecte.
acesta. In cazul proiectarii cu ajutorul
modelului entitate-asociere diagrama
corecta este urmatoarea:

F. Radulescu. Curs: Baze de date 9 F. Radulescu. Curs: Baze de date 10

DIAGRAMA EA REZULTAT TRANSFORMARE

Prin transformarea acestei diagrame se


IdF NumeF AdresaF IdP NumeP Qty
obtin urmatoarele scheme de relatie:
Furnizor(IdF, NumeF, AdresaF)
Produse(IdP, NumeP, Qty, IdF)
FURNIZOR PRODUSE

F. Radulescu. Curs: Baze de date 11 F. Radulescu. Curs: Baze de date 12

2
Florin Radulescu - Baze de date (note de curs)

Tabelele FIRMA si PRODUS OBIECTIVE DESCOMPUNERE


IdF NumeF AdresaF Procesul de ‘spargere’ a unei tabele care are
20 XY SRL Str. X Bucureşti o structura incorecta in doua sau mai multe
23 Z SRL Bd. Z, Bucuresti tabele se numeste descompunerea
schemei de relatie.
Pentru detectarea relatiilor care trebuiesc
IdP NumeP Qty IdF descompuse exista o serie de reguli de
101 Imprimanta laser 30 20 corectitudine, numite si forme normale.
105 Calculator PC 20 23 Definirea acestor forme normale se bazeaza
124 Copiator 10 20 pe notiunea de dependenta (functionala
sau multivalorica) prezentata in
continuare.
F. Radulescu. Curs: Baze de date 13 F. Radulescu. Curs: Baze de date 14

NOTAŢII (1) NOTAŢII (2)


In paragrafele urmatoare vom folosi A, B, C, D, … (litere mari de la
urmatoarea conventie de notare, inceputul alfabetului): atribute ale unei
intalnita in multe lucrari din literatura de relatii,
specialitate a domeniului: X, Y, Z, W, U, … (litere mari de la
sfarsitul alfabetului): multimi de atribute
R, S, T, …: scheme de relatii, dintr-o schema de relatie,
r, s, …: instante ale relatiilor R X ⊆ R: Multimea de atribute X este
respectiv S, inclusa in multimea atributelor relatiei
R.

F. Radulescu. Curs: Baze de date 15 F. Radulescu. Curs: Baze de date 16

NOTAŢII (3) NOTAŢII (4)


Y ⊆ X: Multimea de atribute Y este F, G, …: multimi de dependente
inclusa in multimea de atribute X functionale atasate unei scheme de
relatie
A ∈ X: Atributul A apartine multimii de
atribute X In paragrafele urmatoare termenul
generic de relatie semnifica atat
t, t1, t2, … tupluri ale unei relatii, schema relatiei (descrierea structurii
t[X]: valorile atributelor din X aflate in acesteia) cat si o instanta a acesteia
tuplul t, (continutul de date de la un moment
dat al relatiei).

F. Radulescu. Curs: Baze de date 17 F. Radulescu. Curs: Baze de date 18

3
Florin Radulescu - Baze de date (note de curs)

DEPENDENŢE FUNCŢIONALE DEPENDENŢE FUNCŢIONALE (2)


Definitie: Fie:
Altfel spus, daca doua tupluri au
R o schema de relatie
aceleasi valori pe atributele X
X, Y ⊆R doua multimi de atribute ale
acesteia. atunci ele au aceleasi valori si pe
Spunem ca X determina functional pe Y atributele Y.
(sau Y este determinata functional de X) daca Notatia pentru dependente functionale
si numai daca oricare ar fi doua tupluri t1 si este o sageata de la stanga spre
t2 din orice instanta a lui R atunci: dreapta:
t1[X] = t2[X] ⇒ t1[Y] = t2[Y].
X→Y
F. Radulescu. Curs: Baze de date 19 F. Radulescu. Curs: Baze de date 20

EXEMPLU OBSERVATIE IMPORTANTA


Exemplu: In relatia Produse din paragraful Dependentele functionale nu se
anterior putem scrie urmatoarele dependente
functionale: determina din inspectarea continutului
IdP → NumeP, Qty, IdF, NumeF, AdresaF, de la un moment dat al relatiei ci din
IdF → NumeF, AdresaF semnificatia atributelor acesteia.
Aceste dependente arata ca In exemplul prezentat, a doua DF
daca doua produse au acelasi IdP, este vorba arata ca daca la doua produse apare
de fapt de acelasi produs acelasi Id furnizor atunci numele si
daca doua produse au acelasi IdF (Id adresa furnizorului sunt de asemenea
furnizor) atunci si valorile pentru numele si
adresa acestuia trebuie sa fie aceleasi. aceleasi (deoarece nu pot sa existe doi
furnizori diferiti cu acelasi Id).
F. Radulescu. Curs: Baze de date 21 F. Radulescu. Curs: Baze de date 22

AXIOME SI REGULI A1 - REFLEXIVITATEA


Pornind de la o multime de dependente A1. Reflexivitate: Fie R o schema de
functionale atasate unei scheme de relatie se
pot deduce alte dependente functionale relatie si X ⊆ R. Atunci:
valide. Daca Y ⊆ X atunci X → Y
Exista o multitudine de reguli de inferenta. Toate dependentele functionale care
Pentru a se putea face o prezentare formala a
acestora, trei dintre ele au fost alese ca rezulta din aceast axioma sunt numite si
axiome iar restul se pot deduce pornind de la dependente triviale. Ele nu spun
ele. nimic in plus fata de setul de
Cele trei axiome (numite in literatura si dependente initial dar sunt dependente
Axiomele lui Armstrong) sunt
urmatoarele: functionale valide.

F. Radulescu. Curs: Baze de date 23 F. Radulescu. Curs: Baze de date 24

4
Florin Radulescu - Baze de date (note de curs)

A2 - AUGMENTARE A3 - TRANZITIVITATE
A2. Augmentare: Fie R o schema de A3. Tranzitivitate: Fie R o schema de
relatie si X, Y, Z ⊆ R. Atunci: relatie si X, Y, Z ⊆ R.
Daca X → Y atunci si XZ → YZ Daca X → Y si Y → Z atunci si X → Z
Aceasta axioma arata ca se poate reuni
o aceeasi multime Z in stanga si in
dreapta unei dependente functionale
valide obtinand de asemenea o
dependenta functionala valida.

F. Radulescu. Curs: Baze de date 25 F. Radulescu. Curs: Baze de date 26

REGULI R1 - DESCOMPUNERE
Pe baza acestor axiome se pot R1. Descompunere: Fie R o schema
demonstra o serie de reguli de inferenta de relatie si X, Y, Z ⊆ R.
pentru dependente functionale dintre Daca X → Y si Z ⊆ Y atunci si X → Z
care cele mai importante sunt Regula descompunerii ne permite sa
urmatoarele: rescriem un set de dependente
functionale astfel incat sa obtinem doar
dependente care au in partea dreapta
doar un singur atribut.

F. Radulescu. Curs: Baze de date 27 F. Radulescu. Curs: Baze de date 28

R1 - DESCOMPUNERE – cont. R2 - REUNIUNE


Sa presupunem ca avem o dependenta R2. Reuniune: Fie R o schema de
functionala de forma:
relatie si X, Y, Z ⊆ R.
X → A1A2A3…An
Atunci ea poate fi inlocuita cu urmatoarele n Daca X → Y si X → Z atunci si X → YZ
dependente functionale: Rezulta si faptul ca din cele n reguli
X → A1 obtinute prin descompunere se poate
X → A2 obtine dependenta initiala, deci
X → A3 inlocuirea acesteia nu duce la pierderea
... vreunei corelatii existente.
X → An
F. Radulescu. Curs: Baze de date 29 F. Radulescu. Curs: Baze de date 30

5
Florin Radulescu - Baze de date (note de curs)

R3 - PSEUDOTRANZITIVITATEA DEMONSTRATII
R3. Pseudotranzitivitate: Fie R o Exercitiu: Demonstrati cele trei reguli
schema de relatie si X, Y, Z, W ⊆ R. folosind axiomele lui Armstrong.
Exemplu de demonstratie R3:
Daca X → Y si YZ → W atunci si XZ → W Augmentam prima dependenta cu Z.
Obtinem XZ → YZ.
Din aceasta dependenta si din YZ → W
obtinem prin tranzitivitate XZ → W,
qed.
F. Radulescu. Curs: Baze de date 31 F. Radulescu. Curs: Baze de date 32

INCHIDEREA UNEI MULTIMI DE DF DEFINITIE FORMALA


Pornind de la un set de dependente Definitia formala a acestei inchideri este
functionale F si utilizand axiomele si urmatoarea:
regulile obtinem o multitudine de alte F+ = {X → Y | F ⇒ X → Y }
dependente, triviale sau nu. Prin ⇒ am notat faptul ca dependenta
Multimea tuturor dependentelor respectiva de poate deduce din F
functionale care se pot deduce din F se folosind axiomele si regulile.
numeste inchiderea multimii de
dependente F, notata cu F+.

F. Radulescu. Curs: Baze de date 33 F. Radulescu. Curs: Baze de date 34

OBSERVATIE NU SE CALCULEAZA!
Multimea F+contine foarte multe Inchiderea unei multimi de dependente
dependente, inclusiv dependente triviale ca: functionale nu se calculeaza, algoritmii
 ABC → A, care au nevoie de ea ocolind intr-un fel
 ABC → B, sau altul calculul acesteia.
 ABC → C, Introducerea acestei notiuni s-a facut
 ABC → AB,
pentru:
 in cazul descompunerii unei scheme de
 ABC → AC, relatie, aflarea dependentelor mostenite de
 ABC → BC sau la relatia initiala
 ABC → ABC  pentru a putea defini formal alte notiuni
F. Radulescu. Curs: Baze de date 35 F. Radulescu. Curs: Baze de date 36

6
Florin Radulescu - Baze de date (note de curs)

ACOPERIREA ECHIVALENTA
Echivalenta a doua multimi de
Acoperirea unei multimi de DF: Fie dependente:
R o schema de relatie si F, G doua Fie R o schema de relatie si F, G doua
multimi de dependente pentru R. Se multimi de dependente pentru R.
spune ca F acopera pe G daca si Se spune ca F e echivalenta cu G
numai daca G ⊆ F+. daca si numai daca F acopera pe G si G
acopera pe F (deci G ⊆ F+ si F ⊆ G+ ,
deci F+ = G+)

F. Radulescu. Curs: Baze de date 37 F. Radulescu. Curs: Baze de date 38

FORMA CANONICA FORMA CANONICA – cont.


Forma canonica a unei multimi de Orice dependenta are in partea dreapta un
DF: singur atribut. Acest lucru se poate obtine
aplicand regula descompunerii prezentata
Din definitiile de mai sus rezulta ca o anterior.
multime de dependente poate fi Multimea de dependente este minimala, nici
inlocuita cu alta echivalenta continand una dintre dependente neputand sa fie
alte dependente. dedusa din celelalte (nu exista dependente
In cazul in care aceasta multime redundante).
indeplineste conditiile urmatoare se Partea stanga a oricarei dependente este
spune ca este in forma canonica: minimala (nici un atribut nu poate fi inlaturat
fara ca asta sa duca la schimbarea lui F+)
F. Radulescu. Curs: Baze de date 39 F. Radulescu. Curs: Baze de date 40

EXEMPLUL 1 EXEMPLUL 2
Fie R = ABCDE o schema de relatie si F Pentru relatia
multimea de dependente functionale asociata,
cu F = { AB → CDE, C → DE }: Produse(IdP, NumeP, Qty, IdF, NumeF,
Aplicam regula de descompunere. Obtinem: AdresaF, IdF)
F = { AB → C, AB → D, AB → E, C → D, C →
E} din paragraful 4.1. avand multimea de
Noua F nu e minimala deoarece AB → D si AB dependente functionale:
→ E se pot deduce prin tranzitivitate din AB
→ C impreuna cu C → D, C → E. F = { IdP → NumeP, Qty, IdF, NumeF,
Rezulta ca forma canonica a lui F este: AdresaF;
F = { AB → C, C → D, C → E } IdF → NumeF, AdresaF}
F. Radulescu. Curs: Baze de date 41 F. Radulescu. Curs: Baze de date 42

7
Florin Radulescu - Baze de date (note de curs)

EXEMPLUL 2 – cont. EXEMPLUL 2 – cont.


Forma canonica a lui F este: Si in acest caz au fost eliminate doua
F = { IdP → NumeP, dependente redundante:
IdP → Qty,
IdP → IdF, IdP → NumeF
IdF → NumeF, IdP → AdresaF
IdF → AdresaF }

F. Radulescu. Curs: Baze de date 43 F. Radulescu. Curs: Baze de date 44

CHEIE CHEIE– cont.


Definitie: Fie R o schema de relatie, F Deci:
multimea de dependente functionale asociata  o cheie determina functional toate atributele
relatiei si
si X ⊆ R. Atunci X este cheie pentru R daca si
 este minimala: nici o submultime stricta a sa nu
numai daca: determina functional pe R.
 F ⇒ X → R (deci X → R se poate deduce din F)
Se observa faptul ca aceasta definitie este
si echivalenta cu cea din capitolul 3:
 X este minimala: oricare ar fi Y ⊂ X, Y ≠ X atunci cunoscandu-se valorile pe atributele X sunt
¬(F ⇒ Y → R) (deci orice submultime stricta a lui unic determinate valorile pentru toate
X nu mai indeplineste conditia anterioara). atributele relatiei, deci este unic determinat
tuplul din relatie.

F. Radulescu. Curs: Baze de date 45 F. Radulescu. Curs: Baze de date 46

SUPERCHEIE EXEMPLU
In cazul in care doar prima conditie este Fie R = ABCDE si F = { AB → C, C → D, C →
indeplinita multimea X se numeste E }. Atunci AB este cheie pentru R:
 Din AB → C, C → D si C → E obtinem prin
supercheie. tranzitivitate AB → D si AB → E
Observatie: Faptul ca o supercheie nu este  Din AB → C, AB → D si AB → E obtinem prin
reuniune AB → CDE
constransa de minimalitate nu inseamna insa  Din AB → CDE obtinem (augmentare cu AB) AB →
ca ea nu poate fi minimala. ABCDE, deci AB → R
Rezulta ca orice cheie este in acelasi timp si Rezulta ca AB este supercheie pentru R. In
supercheie, reciproca nefiind insa adevarata. paragraful urmator vom vedea cum se poate
demonstra si faptul ca AB este minimala, deci
este nu numai supercheie ci chiar cheie
pentru R.
F. Radulescu. Curs: Baze de date 47 F. Radulescu. Curs: Baze de date 48

8
Florin Radulescu - Baze de date (note de curs)

PROIECTIA UNEI MULTIMI DE


PROIECTIA … DF (2)
DEPENDENTE FUNCTIONALE
Sa luam cazul relatiei anterioare
Asa cum s-a mentionat anterior continand produsele dintr-un depozit:
inchiderea unei multimi de dependente Produse = IdP, NumeP, Qty, IdF,
functionale F+ a fost introdusa si pentru NumeF, AdresaF
a putea defini setul de dependente Multimea de dependente asociata este:
functionale mostenite de o schema de F = { IdP→NumeP, IdP→Qty, IdP→ IdF,
relatie obtinuta prin descompunerea IdF→NumeF, IdF→AdresaF }
unei scheme incorecte.

F. Radulescu. Curs: Baze de date 49 F. Radulescu. Curs: Baze de date 50

PROIECTIA … DF (3) PROIECTIA … DF (3)


Prin descompunerea acestei relatii in Solutia este de a defini proiectia unei multimi
doua obtinem relatiile: de dependente pe o multime de atribute.
Definitie. Fie o relatie R, o multime asociata
Produse = IdP, NumeP, Qty, IdF
de dependente functionale F si o submultime
Furnizori= IdF, NumeF, AdresaF de atribute S ⊆ R . Proiectia multimii de
Atributele relatiei initiale se regasesc fie dependente F pe S, notata cu πS(F) este
doar intr-una dintre schemele rezultate multimea dependentelor din F+ care au si
fie in amandoua. partea stanga si pe cea dreapta incluse in S.
Problema: ce dependente mostenesc Formal putem scrie:
cele doua relatii de la relatia initiala? πS(F) = {X → Y ∈ F+ | X, Y ⊆ S }
F. Radulescu. Curs: Baze de date 51 F. Radulescu. Curs: Baze de date 52

EXEMPLU OBSERVATIE
 Observatie: Atunci cand descompunem o schema se
Pentru exemplul de mai sus proiectiile poate intampla ca unele dintre dependentele schemei
sunt urmatoarele: initiale sa se piarda.
 Exemplu: Fie R = ABCD si F = { A→B, B→C, C→D,
FPRODUSE = πPRODUSE (F) = D→A }. In cazul in care descompunem R in R1 = AB
si R2 = CD atunci:
{ IdP→NumeP, IdP→Qty, IdP→ IdF} FR1 = πR1(F) ={ A→B, B→A }
FFURNIZORI = πFURNIZORI (F) = FR2 = πR2(F) = { C→D, D→C }
 A doua dependenta din fiecare multime nu este in F
{ IdF→NumeF, IdF→AdresaF } dar este in F+ (obtinuta prin tranzitivitate).
 Observam insa ca dependentele B→C si D→A nu mai
pot fi obtinute nici din FR1 nici din FR2 nici din
reuniunea lor.

F. Radulescu. Curs: Baze de date 53 F. Radulescu. Curs: Baze de date 54

9
Florin Radulescu - Baze de date (note de curs)

INCHIDEREA UNEI MULTIMI DE


ALGORITM DE CALCUL X+
ATRIBUTE
Intrare: R o schema de relatie, F multimea de
Fie R o schema de relatie, F multimea de dependente asociata si X ⊆ R
dependente asociata si X ⊆ R. Se poate defini Iesire: X+
inchiderea multimii de atribute X in
Metoda: se procedeaza iterativ astfel:
raport cu F (notata X+ ) astfel:
 Se porneste cu X( 0 ) = X
X+ = { A | X → A ∈ F+ }
 Pentru i ≥ 1, X( i ) = X( i – 1) ∪
X+ contine deci toate atributele care apar in
partea dreapta a unei dependente din F sau { A | (∃) Y → A ∈ F cu Y ⊆ X( i – 1) }
care se poate deduce din F folosind regulile si  Oprirea se face atunci cand X( i ) = X( i – 1)
axiomele si care il are in partea stanga pe X.  Rezultat: X+ = X(i)
F. Radulescu. Curs: Baze de date 55 F. Radulescu. Curs: Baze de date 56

EXEMPLU EXEMPLU – cont.


 Fie R = ABCDE si F = { A → B, A → C, D → E }. Calcul AD+ :
Pentru a calcula A+ si AD+ procedam astfel:
Calcul A+ :  X( 0 ) = {A, D}
 X( 0 ) = {A}  Din A → B, A → C si D → E rezulta ca X( 1 ) = X( 0 ) ∪
 Din A → B si A → C rezulta ca X( 1 ) = X( 0 ) ∪ { B, C } { B, C, E } =
= { A } ∪ { B, C } = ABC { A, D } ∪ { B, C , E} = ABCDE
 Singurele dependente care au partea dreapta in X( 1 )  Cum X( 1 ) = R rezulta si ca X( 2 ) = X( 1 ) , deci oprire
sunt tot primele doua deci (oricate iteratii am face nu mai pot sa apara noi
X( 2 ) = X( 1 ) ∪ { B, C } = { A, B, C } ∪ { B, C } = ABC atribute).
 Oprire deoarece X( 2 ) = X( 1 )  (AD)+ = X( 2 ) = ABCDE
 Rezulta ca (A)+ = ABC

F. Radulescu. Curs: Baze de date 57 F. Radulescu. Curs: Baze de date 58

INCHIDEREA … ATR. –cont. ALTA DEFINITIE A CHEII


Scopul introducerii acestei notiuni este si (X+) Pe baza propozitiei din paragraful
cel de a putea ocoli in alti algoritmi si definitii anterior se poate da o alta definitie
calculul lui F+ . Avem urmatorul rezultat pentru cheia sau supercheia unei relatii,
teoretic:
bazata nu pe dependente functionale ca
Propozitie: Fie R o schema de relatie, F
in paragraful anterior ci pe inchiderea
multimea de dependente asociata si X, Y ⊆ R.
Atunci X → Y se poare deduce din F daca si unei multimi de atribute.
numai daca Y ∈ X+
Demonstratia acestei propozitii se gaseste in
literatura de specialitate.
F. Radulescu. Curs: Baze de date 59 F. Radulescu. Curs: Baze de date 60

10
Florin Radulescu - Baze de date (note de curs)

CHEIE - REAMINTIRE ALTA DEFINITIE A CHEII (2)


Definitie: Fie R o schema de relatie si Definitie: Fie R o schema de relatie, F
multimea de dependente functionale asociata
X ⊆ R. Atunci X este cheie pentru R si X ⊆ R. Atunci X este cheie pentru R daca si
daca si numai daca: numai daca:
 F ⇒ X → R (deci X → R se poate deduce  X+ = R
din F) si
si  X este minimala: oricare ar fi Y ⊂ X, Y ≠ X
 X este minimala: oricare ar fi Y ⊂ X, Y ≠ X atunci Y+ ≠ R (deci orice submultime stricta a
atunci ¬(F ⇒ Y → R) (deci orice lui X nu mai indeplineste conditia anterioara).
submultime stricta a lui X nu mai Daca numai prima conditie este indeplinita
indeplineste conditia anterioara). atunci X este supercheie pentru R

F. Radulescu. Curs: Baze de date 61 F. Radulescu. Curs: Baze de date 62

ECHIVALENTA DEFINITII GASIREA CHEILOR


Echivalenta acestei definitii cu cea anterioara Folosind aceasta definitie se poate
este evidenta: defini o euristica de gasire a cheilor
X+ = R inseamna cf. propozitiei ca unei relatii.
X→R Se cauta multimi minimale X care
minimalitatea este de asemenea definita indeplinesc conditia X+ = R
echivalent: ¬(F ⇒ Y → R) este echivalenta
cu ¬( Y+ = R) adica Y+ ≠ R Prezentam o euristica de gasire a
cheilor:

F. Radulescu. Curs: Baze de date 63 F. Radulescu. Curs: Baze de date 64

NOTA IMPORTANTA EURISTICA


 Observatie: Atributele care nu apar in  Intrare: R o schema de relatie si F
partea dreapta a nici unei dependente multimea de dependente functionale
trebuie sa existe in orice cheie, ele asociata (F in forma canonica).
neputand sa apara in procesul de  Iesire: Cheia unica sau cheile
calcul al inchiderii unei multimi de alternative ale lui R
atribute.  Metoda:
1. Se porneste de la multimea de
atribute X ⊆ R care nu apar in partea
dreapta a nici unei dependente
F. Radulescu. Curs: Baze de date 65 F. Radulescu. Curs: Baze de date 66

11
Florin Radulescu - Baze de date (note de curs)

EURISTICA (2) EURISTICA (3)


2. Se calculeaza X+. Daca X+ = R atunci X este 5. Se repeta pasii 3 si 4 pornind de la
cheia unica minimala a relatiei R si calculul acele multimi candidat X care nu sunt
se opreste aici. Pasii urmatori se efectueaza gasite ca si chei la pasul anterior.
doar daca X+ ≠ R Intre multimile candidat nu luam
3. Se adauga la X cate un atribut din R - X+ niciodata in considerare pe cele care
obtinandu-se o multime de chei candidat.
contin o cheie gasita anterior.
4. Se calculeaza X+ pentru fiecare dintre
candidate. Daca se obtin toate atributele lui 6. Procesul se opreste cand nu se mai
R atunci acel X este o cheie a lui R. pot face augmentari.

F. Radulescu. Curs: Baze de date 67 F. Radulescu. Curs: Baze de date 68

EXEMPLUL 1 EXEMPLUL 2
R = ABCDE si R = ABCDE si
F = { A → B, A → C, D → E }. F = { A → B, B → A , A → C, D → E }.
 Multimea atributelor care nu apar in partea  Multimea atributelor care nu apar in partea
dreapta a nici unei dependente este X = dreapta a nici unei dependente este X = D.
AD.  Calculam (D)+. Obtinem (D)+ = DE ≠ R.
 Calculam (AD)+. Obtinem (AD)+ = ABCDE Rezulta ca D nu este cheie unica pentru R
= R.
 Procesul se opreste. Rezulta ca AD este
cheie unica pentru R
F. Radulescu. Curs: Baze de date 69 F. Radulescu. Curs: Baze de date 70

EXEMPLUL 2 - cont EXEMPLUL 2 – cont.


D+ = DE  Calculam o noua multime de candidate
 Calculam multimea de candidate: pornind de ca CD. Putem augmenta CD cu
augmentam D cu atribute din R – D+ = atribute din R – (CD)+ = ABCDE – CDE =
ABCDE – DE = ABC. Obtinem AD, BD si CD AB. Nici una dintre augmentari nu este insa
posibila pentru ca atat ACD cat si BCD
 Calculam inchiderile lor. Obtinem (AD)+ =
contin o cheie gasita anterior (AD respectiv
R, (BD)+ = R si (CD)+ = CDE ≠ R. Rezulta
BD).
ca AD si BD sunt chei ale lui R dar CD nu e
cheie.  Procesul se opreste. Singurele chei ale lui R
raman AD si BD.

F. Radulescu. Curs: Baze de date 71 F. Radulescu. Curs: Baze de date 72

12
Florin Radulescu - Baze de date (note de curs)

FORME NORMALE FNBC - DEFINITIE


Exista cateva seturi de conditii care ne arata Definitie. Fie R o schema de relatie si F
ca o schema de relatie este corect proiectata multimea de dependente functionale asociata.
in sensul ca ea nu permite aparitia anomaliilor
prezentate la inceputul capitolului. Se spune ca R este in forma normala Boyce-
Daca schema indeplineste cerintele unui Codd (FNBC) daca si numai daca oricare ar fi
anumit set de conditii se spune ca este in o dependenta netriviala X → Y din F atunci X
forma normala asociata acelui set. este supercheie pentru R
In continuare sunt prezentate formele
normale Boyce-Codd si forma normala 3. In
finalul acestul capitol va fi prezentata si forma
normala 4 care se defineste in functie de alt
tip de dependente, si anume dependentele
multivalorice.
F. Radulescu. Curs: Baze de date 73 F. Radulescu. Curs: Baze de date 74

FNBC – cont. EXEMPLUL 1


Rezulta ca o schema de relatie este in FNBC Relatia R = ABCDE avand
daca si numai daca fiecare dependenta F = { A → B, B → A , A → C, D → E }
netriviala din F are in partea stanga o
supercheie.
Nu este in forma normala Boyce-Codd
Nu este necesar ca F sa fie in forma canonica deoarece are cheile AD si BD dar nici o
dar nu se iau in considerare dependentele dependenta nu are in partea stanga o
triviale (obtinute din prima axioma - de supercheie a lui R
reflexivitate, de tipul AB → A sau AB → AB).
Observatie importanta: o schema fara nici o
dependenta netriviala este in FNBC!
F. Radulescu. Curs: Baze de date 75 F. Radulescu. Curs: Baze de date 76

EXEMPLUL 2 EXEMPLUL 3
Relatia Produse = IdP, NumeP, Qty, IdF Relatia Produse = IdP, NumeP, Qty, IdF,
avand asociata multimea de dependente NumeF, AdresaF avand dependentele:
functionale
F = { IdP→NumeP, IdP→Qty, IdP→ IdF,
FPRODUSE = πPRODUSE(F) = IdF→NumeF, IdF→AdresaF }
{ IdP→NumeP, IdP→Qty, IdP→ IdF}
Nu este in forma normala Boyce-Codd: cheia
Este in forma normala Boyce-Codd: cheia unica este IdP dar exista dependente care nu
unica a relatiei este IdP si toate dependentele
au in partea stanga o supercheie (asa cum s- au in partea stanga o dupercheie:
a mentionat orice cheie este in acelasi timp si IdF→NumeF, IdF→AdresaF
supercheie)

F. Radulescu. Curs: Baze de date 77 F. Radulescu. Curs: Baze de date 78

13
Florin Radulescu - Baze de date (note de curs)

FN3 – ATRIBUT PRIM FN3 - DEFINITIE


Pentru definitia formei normale 3 este Definitie. R o schema de relatie si F
necesara definirea notiunii de atribut prim: multimea de dependente functionale asociata.
Definitie. R o schema de relatie si F Se spune ca R este in forma normala 3 (FN3)
multimea de dependente functionale asociata. daca si numai daca oricare ar fi o dependenta
Un atribut A ∈ R se numeste atribut prim netriviala X → A din F atunci
daca el apartine unei chei a lui R.
X este supercheie pentru R
Exemplu: R = ABCDE avand
F = { A → B, B → A , A → C, D → E }. sau
Cum cheile relatiei sunt AD si BD rezulta ca in A este atribut prim
R sunt trei atribute prime: A, B si D.

F. Radulescu. Curs: Baze de date 79 F. Radulescu. Curs: Baze de date 80

FN3 – cont. FN3 INCLUDE FNBC


Daca in F avem dependente care contin mai
multe atribute in partea dreapta putem aplica
regula de descompunere pentru a obtine
FN3
dependente care in partea dreapta au cate un
singur atribut. FNBC
Conditia de FNBC este inclusa in definitia
FN3. Din acest motiv orice relatie care este in
FNBC este implicit si in FN3. Reciproca nu
este adevarata.
De asemenea daca o schema de relatie nu
este in FN3 ea nu poate fi nici in FNBC.
F. Radulescu. Curs: Baze de date 81 F. Radulescu. Curs: Baze de date 82

EXEMPLUL 1 EXEMPLUL 2
Relatia R = ABCD avand Relatia R = ABCDE avand
F = { AB → C, AB → D, D → A } are cheia
unica AB. F = { A → B, B → A , A → C, D → E }
Relatia este in FN3 deoarece primele doua are cheile AD si BD.
dependente au in partea stanga o supercheie
(AB) iar a treia dependenta are in partea R nu este in FN3 deoarece
dreapta atributul prim A. dependentele 3 si 4 nu au nici
Relatia nu este in FNBC deoarece a treia supercheie in partea stanga nici atribut
dependenta violeaza definitia pentru aceasta
forma normala (nu are in partea stanga o prim in partea dreapta
supercheie. R nu e in FNBC deoarece nu e in FN3
F. Radulescu. Curs: Baze de date 83 F. Radulescu. Curs: Baze de date 84

14
Florin Radulescu - Baze de date (note de curs)

EXEMPLUL 3 FN1 si FN2


Relatia R = ABCD avand Aceste forme normale nu garanteaza
F = { A → B, B → C, C → D, D → A } eliminarea anomaliilor deci ele nu sunt
are cheile A, B, C si D. Rezulta ca: de dorit pentru schemele de relatie ale
R este in FNBC deoarece in partea unei baze de date a unei aplicatii.
stanga a dependentelor sunt numai Prezentam pe scurt definitia lor.
superchei
R este in FN3 deoarece este in FNBC

F. Radulescu. Curs: Baze de date 85 F. Radulescu. Curs: Baze de date 86

FN1 FN1 – cont.


Definitie: O relatie R este in forma De exemplu, daca intr-o relatie continand
normala 1 (FN1) daca pe toate atributele date despre persoane avem atributul Adresa
sale exista doar valori atomice ale datelor. acesta este atomic daca niciodata nu este
Semnificatia termenului ‘atomic’ este similara nevoie sa fie folosite doar anumite portiuni
cu cea de la modelul entitate asociere: ale sale (strada, numar, etc).
valoarea respectiva este intotdeauna folosita
ca un intreg si nu se utilizeaza niciodata doar
portiuni din aceasta.

F. Radulescu. Curs: Baze de date 87 F. Radulescu. Curs: Baze de date 88

DEP. PARTIALE SI TRANZITIVE FN2 - DEFINITIE


Fiind data o relatie R si multimea de Definitie:
dependente functionale asociata F putem Fie R o schema de relatie si F multimea de
defini inca doua concepte. Fie A un atribut dependente functionale asociata.
neprim si X o multime de atribute din R.
Se spune ca R este in forma normala 2 (FN2)
Atunci:
daca si numai daca nu are dependente partiale
Definitie: O dependenta functionala X → A (dar poate contine dependente tranzitive).
se numeste dependenta partiala daca X
este strict inclusa intr-o cheie a relatiei R. Detaliere: O astfel de dependenta partiala nu
exista in F si nici nu se poate deduce din F.
Definitie: O dependenta functionala X → A
se numeste dependenta tranzitiva daca X Observatie: Daca R are chei formate dintr-un
nu este inclusa in nici o cheie a relatiei R. singur atribut, R e in FN2!

F. Radulescu. Curs: Baze de date 89 F. Radulescu. Curs: Baze de date 90

15
Florin Radulescu - Baze de date (note de curs)

EXEMPLU EXEMPLU - cont


Produse = IdP, NumeP, Qty, IdF, NumeF, Fie relatia:
AdresaF Sala Activitate NrLocuri
EC 105 Curs SO 120
Multimea de dependente asociata este: EC 104 Curs BD 90
F = { IdP→NumeP, IdP→Qty, IdP→ IdF, EC 104 Curs POO 90
IdF→NumeF, IdF→AdresaF }
EC 105 Curs EA 120
Este in FN2 pentru ca ultimele doua Cheia relatiei: {Sala, Activitate}. Relatia nu este in FN2
dependente sunt tranzitive dar nu sunt deoarece exista dependenta Sala → NrLocuri care
partiale (IdF nu apartine cheii unice IdP). este partiala (Sala apartine unei chei dar nu e cheie)

F. Radulescu. Curs: Baze de date 91 F. Radulescu. Curs: Baze de date 92

Exercitiu
ATENTIE!
Asa cum s-a specificat anterior FN2 nu este o P1. Fie R = ABCDE si F = {AB→ →C,
forma normala ‘buna’, ea trebuie evitata. C→→D, D→ →B, D→ →E}.
Relatia din exemplul anterior prezinta toate 1. Sa se calculeze (A)+
anomaliile enumerate la inceputul acestui 2. Dependenta D→ →A se poate deduce
capitol. din F?
3. Gasiti toate cheile lui R.

F. Radulescu. Curs: Baze de date 93 F. Radulescu. Curs: Baze de date 94

Sfarsitul cursului 7
Proiectarea bazelor de date
relationale - partea 1

F. Radulescu. Curs: Baze de date 95

16
Florin Radulescu - Baze de date (note de curs)

Cursul 8 Sumar
1. Problematica. Anomalii.
2. Dependente functionale
Proiectarea bazelor 3.
4.
Forme normale: FN1, FN2, FN3, FNBC
Descompunerea schemelor de relatii
de date 5. Dependente multivalorice. Forma
normala 5.
- Partea 2 -
F. Radulescu. Curs: Baze de date 1 F. Rădulescu. Curs: Baze de date I 2

DESCOMPUNEREA SCHEMELOR
DEFINITIE
DE RELATIE
Asa cum s-a mentionat anterior, in cazul in Procesul prin care se ‘sparge’ o relatie in mai
care o relatie din baza de date nu este intr-o multe relatii se numeste descompunerea
forma normala buna (FNBC, FN3) pot sa unei scheme de relatie.
apara diverse anomalii. Formal putem defini acest concept astfel:
Solutia este inlocuirea relatiei respective cu Definitie: Fie R o schema de relatie, R = A1
doua sau mai multe relatii care sa contina A2 … Am .
aceleasi informatii dar care, fiecare in parte, Se spune ca ρ = (R1, R2, …, Rn) este o
este in forma normala dorita de proiectant. descompunere a lui R daca si numai daca
R = R1 ∪ R2 ∪ …∪ Rn

F. Radulescu. Curs: Baze de date 3 F. Radulescu. Curs: Baze de date 4

OBSERVATII EXEMPLUL 1
Schemele R1, R2, …, Rn contin deci atribute Fie relatia R = ABCDE avand
din R, fiecare atribut Ai al schemei initiale
trebuind sa se regaseasca in cel putin una F = { A → B, B → A , A → C, D → E }.
dintre ele.
Nu este necesar ca schemele sa fie disjuncte Putem avea descompuneri ca:
(in practica ele au aproape intotdeauna  ρ1 = (ABC, DE),
atribute comune).
In exemplele de mai jos sunt prezentate  ρ2 = (ABCD, DE),
cateva descompuneri valide ale unor scheme  ρ3 = (AB, CD, DE)
de relatii (unele insa incorecte din punct de
vedere al pastrarii datelor si/sau
dependentelor initiale)
F. Radulescu. Curs: Baze de date 5 F. Radulescu. Curs: Baze de date 6

1
Florin Radulescu - Baze de date (note de curs)

EXEMPLUL 2 SCHEMA si CONTINUT


Fie relatia Produse = IdP, NumeP, Qty, IdF, Descompunerea actioneaza deci la nivelul
NumeF, AdresaF avand dependentele schemei relatiei. Ce se intampla insa cu
functionale: continutul acesteia in cazul unei
F = { IdP→NumeP, IdP→Qty, IdP→ IdF, descompuneri?
IdF→NumeF, IdF→AdresaF } Fiecare relatie rezultata va mosteni o parte
Putem avea o multitudine de descompuneri printre dintre datele relatiei descompuse si anume
care: proiectia acesteia pe multimea de atribute a
 ρ1 = ( (IdP, NumeP, Qty, IdF); (NumeF, AdresaF) ) relatiei rezultata din descompunere.
 ρ2 = ( (IdP, NumeP, Qty, IdF); (IdF, NumeF,
AdresaF) )
 ρ3 = ( (IdP, NumeP); (Qty, IdF); (NumeF, AdresaF) )
F. Radulescu. Curs: Baze de date 7 F. Radulescu. Curs: Baze de date 8

Reamintire: PROIECTIA SCHEMA si CONTINUT


A B C D E B C E Sa consideram o instanta r a relatiei de
1 1 2 1 3 1 2 3
2 1 2 1 3 7 4 1
schema R (instanta unei relatii este o
2 7 4 4 1 3 9 1 incarcare cu date corecte a acesteia).
2 3 9 2 1 3 7 1
1 3 7 4 1
Atunci instantele pentru relatiile din
1 3 9 2 1 Rezultatul proiectiei π B, C, E (R) descompunerea ρ sunt:
Relatia R
Observam ca s-au eliminat doua linii ri = π Ri (r)
duplicat din rezultat (cele provenite din
liniile 2 si 6).

F. Radulescu. Curs: Baze de date 9 F. Radulescu. Curs: Baze de date 10

ρ1 = ( (IdP, NumeP, Qty, IdF);


EXEMPLU
(NumeF, AdresaF) )
IdP NumeP Qty IdF
IdP NumeP Qty IdF NumeF AdresaF
101 Imprimanta laser 30 20
101 Imprimanta 30 20 ABC Strada A nr. 105 Calculator PC 20 23
laser B
124 Copiator 10 20
105 Calculator 20 23 XYZ Strada C nr.
PC D
124 Copiator 10 20 ABC Strada A nr.
B NumeF AdresaF
ABC Strada A nr. B
XYZ Strada C nr. D

F. Radulescu. Curs: Baze de date 11 F. Radulescu. Curs: Baze de date 12

2
Florin Radulescu - Baze de date (note de curs)

ρ2 = ( (IdP, NumeP, Qty, IdF); ρ3 = ( (IdP, NumeP); (Qty, IdF);


(IdF, NumeF, AdresaF) ) (NumeF, AdresaF) )
IdP NumeP Qty IdF IdP NumeP Qty IdF
101 Imprimanta laser 30 20 101 Imprimanta 30 20
105 Calculator PC 20 23 laser 20 23
124 Copiator 10 20 105 Calculator PC 10 20
124 Copiator

IdF NumeF AdresaF NumeF AdresaF


20 ABC Strada A nr. ABC Strada A nr. B
B
XYZ Strada C nr. D
23 XYZ Strada C nr.
D

F. Radulescu. Curs: Baze de date 13 F. Radulescu. Curs: Baze de date 14

REZULTAT JOIN FARA PIERDERI


Observam din aceste exemple ca in cazul Conditia pentru a nu se pierde date prin
primei si ultimei descompuneri nu putem
reconstrui prin join sau alti operatori descompunere este ca relatia initiala sa
relationali relatia initiala. poata fi reconstruita exact prin joinul
In cazul in care descompunerea nu s-a facut natural al relatiilor rezultate, fara tupluri
corect putem pierde:
 Datele relatiei initiale in minus sau in plus.
 Dependentele functionale ale relatiei Formal, definitia este urmatoarea:
initiale.
In paragrafele urmatoare sunt prezentati
algoritmi prin care putem detecta daca prin
descompunere se pierd date sau dependente.
F. Radulescu. Curs: Baze de date 15 F. Radulescu. Curs: Baze de date 16

JOIN FARA PIERDERI (2) JOIN FARA PIERDERI (3)


Definitie: In exemplul anterior doar
Fie R o schema de relatie,
descompunerea
F multimea de dependente functionale asociata si
o descompunere ρ = (R1, R2, …, Rn) a lui R. ρ2 = ( (IdP, NumeP, Qty, IdF); (IdF,
Se spune ca ρ este o descompunere cu join fara NumeF, AdresaF) )
pierderi in raport cu F (prescurtat j.f.p.) daca are aceasta proprietate, in cazul
si numai daca pentru orice instanta r a lui R care
satisface dependentele F avem ca: celorlalte, din cauza inexistentei
r1 ⋈ r2 ⋈ … ⋈ rn = r unde coloanelor comune, joinul natural nu se
ri = π Ri (r) poate efectua.

F. Radulescu. Curs: Baze de date 17 F. Radulescu. Curs: Baze de date 18

3
Florin Radulescu - Baze de date (note de curs)

JOIN FARA PIERDERI (4) ALGORITM TESTARE JFP


Faptul ca o descompunere are sau nu  Intrare: Schema de relatie R = A1 A2 … Am ,
multimea de dependente functionale F si o
aceasta proprietate se poate testa descompunere ρ = (R1, R2, …, Rn)
pornind doar de la  Iesire: Verdictul daca ρ are sau nu proprietatea
 lista atributelor relatiei initiale, j.f.p.
 lista atributelor relatiilor din descompunere  Metoda:
si Se construieste o tabela avand n linii si m coloane.
Liniile sunt etichetate cu elementele lui ρ iar
 multimea de dependente functionale coloanele cu atributele lui R.
asociata Elementul (i,j) al tabelei va fi egal cu
Este deci o proprietate a schemei  aj daca Aj ∈ Ri sau
relatiei si nu a instantelor sale  bij altfel.
F. Radulescu. Curs: Baze de date 19 F. Radulescu. Curs: Baze de date 20

ALGORITM – cont. ALGORITM – cont.


Se parcurg dependentele X → Y din F. Daca Procesul se opreste:
doua (sau mai multe) linii din tabela au Fie cand s-a obtinut o linie in tabela care
aceleasi simboluri pe coloanele X aceste linii
se egaleaza si pe coloanele din Y astfel: contine doar a-uri, caz in care
 Daca pe o coloana din Y apare un aj atunci toate
descompunerea ρ are proprietatea j.f.p.
elementele de pe acea coloana din liniile Fie cand la o parcurgere a dependentelor nu
respective devin aj mai apar schimbari in tabela si nu s-a obtinut
 Daca pe o coloana din Y nu apare nici un aj atunci o linie doar cu a-uri. In acest caz
se alege unul dintre elementele de tip bij si toate
elementele de pe acea coloana din liniile descompunerea ρ nu are proprietatea j.f.p.
respective devin egale cu acel bij

F. Radulescu. Curs: Baze de date 21 F. Radulescu. Curs: Baze de date 22

ALGORITM – cont. EXEMPLUL 1


In literatura de specialitate se poate Exemplul 1: Fie R = ABCDE, F = { A →
gasi demonstratia faptului ca acest B, A → C, A → D, D → E } si o
algoritm determina corect daca o descompunere a lui R ρ = (ABCD, DE)
descompunere are proprietatea j.f.p. Construim tabelul din algoritm:
sau nu.
A B C D E

ABCD a1 a2 a3 a4 b15 a5
DE b21 b22 b23 a4 a5

F. Radulescu. Curs: Baze de date 23 F. Radulescu. Curs: Baze de date 24

4
Florin Radulescu - Baze de date (note de curs)

EXEMPLUL 1 – cont. EXEMPLUL 2


 La prima parcurgere, pentru dependentele A → B , A → C , A → D nu Fie relatia R = ABCDE, ρ = (AB, BC, CDE).
gasim doua linii cu aceleasi valori pe coloana A
 Pentru dependenta D → E cele doua linii sunt egale pe coloana D F = { A → B, AC → D, D → E }
(simbolul a4).
La prima trecere nu apar modificari in tabel.
 Le egalam si pe coloana E: cum pe aceasta coloana exista a5 rezulta
ca b15 devine egal cu a5. Procesul se opreste si ρ nu are proprietatea
 S-a obtinut o linie numai cu a-uri, deci descompunerea are j.f.p.
proprietatea de join fara pierderi.
A B C D E
A B C D E
AB a1 a2 b13 b14 b15
ABCD a1 a2 a3 a4 b15 a5 BC b21 a2 a3 b24 b25
DE b21 b22 b23 a4 a5 CDE b31 b32 a3 a4 a5

F. Radulescu. Curs: Baze de date 25 F. Radulescu. Curs: Baze de date 26

EXEMPLUL 3 EXEMPLUL 3 – cont.


Fie R = ABCDE, ρ = (BCE, AB, ACD) Prima trecere:
F = { C → E (1), A → C (2), B → D (3), D → Din C → E b35 devine a5
E (4), E → B (5) } (dep. numerotate intre Din A → C b23 devine a3
paranteze)
A B C D E A B C D E

BCE b11 a2 a3 b14 a5 BCE b11 a2 a3 b14 a5


AB a1 a2 b23 a3 (2) b24 b14 (3) b25 a5 (4) AB a1 a2 b23 a3 (2) b24 b14 (3) b25 a5 (4)
ACD a1 b32 a2 (5) a3 a4 b35 a5 (1) ACD a1 b32 a2 (5) a3 a4 b35 a5 (1)

F. Radulescu. Curs: Baze de date 27 F. Radulescu. Curs: Baze de date 28

EXEMPLUL 3 – cont. OBSERVATII


Din B → D b24 devine b14 In exemplele de mai sus a fost suficienta o
Din D → E b25 devine a5 singura trecere prin dependente.
Din E → B b32 devine a2 Exista insa situatii cand sunt necesare mai
linie doar cu a-uri => j.f.p. multe treceri pana procesul se opreste.
A B C D E In cazul in care descompunerea are doar
BCE b11 a2 a3 b14 a5
doua elemente se poate testa daca are
proprietatea de join fara pierderi si altfel
AB a1 a2 b23 a3 (2) b24 b14 (3) b25 a5 (4)
ACD a1 b32 a2 (5) a3 a4 b35 a5 (1)

F. Radulescu. Curs: Baze de date 29 F. Radulescu. Curs: Baze de date 30

5
Florin Radulescu - Baze de date (note de curs)

TEST JFP TEST JFP – cont.


Fie R o schema de relatie, Pentru a testa daca dependenta se
F multimea de dependente functionale poate deduce din F este suficient sa
asociata si calculam inchiderea lui (R1 ∩ R2).
ρ = (R1, R2) o descompunere a sa. Daca ea contine fie pe (R1 – R2) fie pe
Atunci ρ are proprietatea de join fara (R2 – R1) atunci descompunerea este cu
pierderi daca una din dependentele join fara pierderi.
urmatoare se poate deduce din F:
 (R1 ∩ R2) → (R1 – R2) sau
 (R1 ∩ R2) → (R2 – R1)
F. Radulescu. Curs: Baze de date 31 F. Radulescu. Curs: Baze de date 32

EXEMPLU EXEMPLU – cont.


Fie R= ABCDE, Cele doua dependente sunt:
F = { A → B, A → C, A → D, D → E } (R1 ∩ R2) → (R1 – R2) devine
ρ = (ABCD, DE). D → ABC
(R1 ∩ R2) → (R2 – R1) devine
Avem R1 = ABCD, R2 = DE. Rezulta ca:
D→E
(R1 – R2) = ABCD – DE = ABC
Ultima este chiar o dependenta din F deci
(R2 – R1) = DE – ABCD = E
se poate deduce din F deci ρ are
(R1 ∩ R2) = D proprietatea de join fara pierderi.
F. Radulescu. Curs: Baze de date 33 F. Radulescu. Curs: Baze de date 34

PASTRARE DEPENDENTE EXEMPLU


O a doua problema in cazul descompunerii  Fie relatia Produse = IdP, NumeP, Qty, IdF, NumeF,
AdresaF avand dependentele functionale:
unei scheme R avand dependentele F in mai
 F = { IdP→NumeP, IdP→Qty, IdP→ IdF,
multe relatii R1, R2, …, Rn este aceea a IdF→NumeF, IdF→AdresaF }
pastrarii corelatiilor intre date, corelatii date  In cazul descompunerii ρ2 = (R1, R2) unde:
de dependentele functionale din F.  R1 = (IdP, NumeP, Qty, IdF)
Fiecare relatie Ri va mosteni o multime de  R2 = (IdF, NumeF, AdresaF)
dependente data de proiectia multimii de cele doua relatii mostenesc urmatoarele dependente:
dependente functionale F pe Ri FR1 = πR1(F) = { IdP→NumeP, IdP→Qty, IdP→ IdF}
FR2 = πR2 (F) = { IdF→NumeF, IdF→AdresaF }
Fi = πRi(F)

F. Radulescu. Curs: Baze de date 35 F. Radulescu. Curs: Baze de date 36

6
Florin Radulescu - Baze de date (note de curs)

PASTRARE DEPENDENTE (2) DEFINITIE


Dupa cum se observa toate dependentele Fie R o schema de relatie, F multimea de
relatiei initiale sunt pastrate fie in FR1 fie in dependente functionale asociata, o
FR2. descompunere ρ = (R1, R2, …, Rn) a lui R si
Exista insa si cazuri in care unele dependente Fi = πRi(F) multimile de dependente
din F nu mai pot fi regasite in multimile de
dependente asociate schemelor din functionale ale elementelor descompunerii.
descompunere si nu se pot deduce din Se spune ca ρ pastreaza dependentele din
acestea. F daca si numai daca orice dependenta din F
In primul caz se spune ca descompunerea poate fi dedusa din:
pastreaza dependentele iar in al doilea ca ∪i=1..n (Fi ).
descompunerea nu pastreaza dependentele.
F. Radulescu. Curs: Baze de date 37 F. Radulescu. Curs: Baze de date 38

ALGORITM DE TESTARE A
DEFINITIE – cont.
PASTRARII DEPENDENTELOR
Rezulta ca o descompunere pastreaza
dependentele daca si numai daca: Intrare: o schema de relatie R, multimea de
F ⊆ ( ∪i=1..n (Fi ) )+ dependente functionale asociata F si o
Din pacate atat proiectia unei multimi de descompunere ρ = (R1, R2, …, Rn)
dependente cat si incluziunea de mai sus Iesire: verdictul daca ρ pastreaza sau nu
implica un calcul de inchidere a unei multimi dependentele
de dependente (F si respectiv reuniunea
multimilor Fi). Metoda: Pentru fiecare dependenta
Exista si in acest caz un algoritm pentru a X → Y din F
testa daca o dependenta este sau nu pastrata
dupa descompunere fara a fi necesar efectiv se procedeaza astfel:
calculul multimilor Fi
F. Radulescu. Curs: Baze de date 39 F. Radulescu. Curs: Baze de date 40

ALGORITM – cont. ALGORITM – cont.


Se porneste cu o multime de atribute Z Procesul se opreste in momentul in
Z=X care Z ramane neschimbat la o
parcurgere a elementelor Ri.
Se parcurg repetat elementele Daca Y ⊆ Z atunci dependenta X → Y
descompunerii ρ. este pastrata, altfel nu e pastrata
Pentru fiecare Ri se calculeaza o noua
valoare a lui Z astfel: Daca toate dependentele din F sunt
Z = Z ∪ ((Z ∩ Ri)+ ∩ Ri ) pastrate inseamna ca ρ pastreaza
dependentele din F.
F. Radulescu. Curs: Baze de date 41 F. Radulescu. Curs: Baze de date 42

7
Florin Radulescu - Baze de date (note de curs)

EXEMPLUL 1 EXEMPLUL 1 – cont.


Fie R = ABCDE, Initial Z = B
ρ = (BCE, AB, ACD) Trecerea 1 prin elementele lui ρ:
F = { C → E , A → C , B → D , D → E , E → Pentru R1 = BCE:
B} Z = B ∪ ((B ∩ BCE)+ ∩ BCE ) =
B ∪ (BDE ∩ BCE) = BE
Se observa ca dependentele C → E, A → C si Pentru R2 = AB:
E → B sunt pastrate: ele apartin proiectiei lui Z = BE ∪ ((BE ∩ AB)+ ∩ AB) =
F pe BCE (prima si ultima) si ACD (a doua). BE ∪ (BDE ∩ AB) = BE
Raman de testat dependentele B → D si D → Pentru R3 = ACD:
E. Sa aplicam algoritmul pentru B → D:
Z = BE ∪ ((BE ∩ ACD)+ ∩ AB) = BE ∪ ∅ = BE

F. Radulescu. Curs: Baze de date 43 F. Radulescu. Curs: Baze de date 44

EXEMPLUL 1 – cont. EXEMPLUL 2


La urmatoarea trecere Z ramane Fie schema de relatie R = ABCD,
neschimbat si procesul se opreste. F = { A → B, A → C, C → D, D → A}
Cum {D} ⊄ BE rezulta ca dependenta ρ = (ABC, CD).
B → D nu este pastrata deci ρ nu
pastreaza dependentele Trebuie sa testam daca D → A este
pastrata (celelalte dependente se
regasesc direct in proiectiile lui F pe
elementele descompunerii).
F. Radulescu. Curs: Baze de date 45 F. Radulescu. Curs: Baze de date 46

EXEMPLUL 2 – cont. EXEMPLUL 2 – cont.


Initial Z = D A doua trecere prin elementele lui ρ:
Prima trecere prin elementele lui ρ: Pentru R1 = ABC:
Z = CD ∪ ((CD ∩ ABC)+ ∩ ABC ) =
Pentru R1 = ABC:
Z = D ∪ ((D ∩ ABC)+ ∩ ABC ) = CD ∪ (ABCD ∩ ABC ) = ABCD.
D∪ ∅=D Stop. Am obtinut ca A ⊆ Z, deci
Pentru R2 = CD: dependenta D → A este pastrata, deci ρ
Z = D ∪ ((D ∩ CD)+ ∩ CD ) = pastreaza dependentele.
D ∪ (ABCD ∩ CD) = CD

F. Radulescu. Curs: Baze de date 47 F. Radulescu. Curs: Baze de date 48

8
Florin Radulescu - Baze de date (note de curs)

Lucrarea de la mijlocul Modelare


semestrului S-a facut la curs exemplul cu
Materie: supa portugheza de crutoane
Cursurile 1-7
NU este o lucrare cu degrevare.
Timpul de lucru: 50 minute.
Planificarea pe grupe va fi afisata pe
cs.curs.pub.ro

Exercitii 49 Exercitii 50

Model EA Model EA
a. Sa se corecteze erorile de sintaxa a. Sa se corecteze erorile de sintaxa
b. Sa se transforme in model relational b. Sa se transforme in model relational
A_absolvit
Doctorat_la
Tutor Matr,Nume CodF, Denumire
Tutor Inscris_la IdS,Matricola, Nume CodF, Denumire
FACULT Cas_cu Inscris_la
STUD
STUD FACULT
Discipol
Sotie
Alocare
Alocare
Ore

Rezidenta PROIECT CALCULATOR


CodP, Denumire Tip
PROIECT CALCULATOR
Denumire NrInventar, Tip

CAMINIST NECAMINIST
CAMINIST ANGAJAT
Camin, Camera IdNecaminist, Adresa
Camin, Camera Firma, DinAnul

Exercitii 51 Exercitii 52

Algebra relationala Algebra relationala


 Fie R=ABC cu 4 tupluri (linii) si S=ADE cu 3 tupluri, unde:
 R[i,j] = i+j si S[i, j] = i+j (i-indice de linie, j-coloana, incep Fie R=ABC cu 4 tupluri (linii) si S=BDE cu 3 tupluri, unde:
cu 1). R[i,j] = i+j si S[i, j] = (j*2)+(i-1)
 a. Sa se scrie explicit relatiile R si S.  Sa se scrie explicit relatiile R si S.
 Sa se calculeze joinul R⋈ ⋈FS unde F=(R.A=S.B). [Scrieti si cererea
 b. Sa se calculeze joinul R⋈ ⋈FS unde F=(R.A=S.E). Scrieti si SQL care face acelasi lucru – examen]
cererea SQL care face acelasi lucru.  Sa se calculeze joinul natural intre R si S. [Scrieti si cererea SQL
 Sa se calculeze joinul natural intre R si S. [Scrieti si cererea care face acelasi lucru (joinuri SQL3) – examen]
SQL care face acelasi lucru - examen]  Sa se calculeze joinul extern complet intre R si S dupa conditia
 Sa se calculeze joinul extern complet intre R si S dupa R.B=S.B. [Scrieti si cererea SQL care face acelasi lucru (SQL3) –
conditia R.A=S.A. [Scrieti si cererea SQL care face acelasi examen]
lucru (SQL3) – examen]  Considerand operatorii extinsi scrieti rezultatul expresiei
 Considerand operatorii extinsi scrieti rezultatul expresiei τCod(πA →Cod, B(R ⋈ S)).
τCod, B(πA – B*2→
→ Cod, B(R ⋈ S)).

Exercitii 53 Exercitii 54

9
Florin Radulescu - Baze de date (note de curs)

Dependente functionale, chei Dependente functionale, chei


Fie R = ABCDE si F = {A→ →B, A→
→C,
→D, D → E}.
E→ Fie R = ABCDE si F = {A→ →B, A→
→C, E→
→A,
1. Sa se calculeze (AE)+ BC→→D, AD →E}.
1. Sa se calculeze (BC)+
2. Dependenta A→ →D se poate deduce din 2. Dependenta E →D se poate deduce din F?
F? 3. Gasiti toate cheile lui R
3. Gasiti toate cheile lui R 4. R e in FNBC?
4. R e in FNBC? 5. E e in FN3 sau FN2?
5. E e in FN3? Dar in FN2?
Exercitii 55 Exercitii 56

Sfarsitul cursului 8:
Proiectarea bazelor de date
relationale - partea 2

F. Radulescu. Curs: Baze de date 57

10
Florin Radulescu - Baze de date (note de curs)

Cursul 9 Sumar
1. Problematica. Anomalii.
2. Dependente functionale
Proiectarea bazelor 3.
4.
Forme normale: FN1, FN2, FN3, FNBC
Descompunerea schemelor de relatii
de date 5. Dependente multivalorice. Forma
normala 5.
- Partea 3 -
F. Radulescu. Curs: Baze de date 1 F. Rădulescu. Curs: Baze de date I 2

ALGORITMI DE DESCOMPUNERE FN3 + PASTRARE DEP.


 Algoritmii de testare al pastrarii dependentelor si a Fie R o schema de relatie si F multimea
joinului fara pierderi pot fi aplicati atunci cand
descompunerea unei scheme de relatie se face ‘de de dependente functionale asociata:
mana’, pe baza experientei pe care o are proiectantul
bazei de date. F = { X1 → Y1, X2 → Y2, … Xn → Yn }
 Exista insa algoritmi simpli care, pornind de la o Atunci descompunerea
schema de relatie si multimea de dependente
functionale asociata ne duc direct la o descompunere ρ = (X1Y1, X2Y2, … XnYn)
care este in FN3 sau FNBC si in plus au proprietatea
de join fara pierderi (deci nu se pierd date prin este o descompunere in FN3 cu pastrarea
descompunere) si/sau de pastrare a dependentelor. dependentelor.
(cu XiYi am notat Xi ∪ Yi)
F. Radulescu. Curs: Baze de date 3 F. Radulescu. Curs: Baze de date 4

OBSERVATII EXEMPLUL 1
 Toate dependentele sunt pastrate: dependenta Xi → R = ABCDE,
Yi este in proiectia lui F pe XiYi
 Pentru a minimiza numarul de elemente din F = { A → B, A → C, A → D, D → E }.
descompunere se aplica regula reuniunii: daca avem
mai multe dependente care au aceeasi parte stanga Rescriem prin reuniune multimea de
le reunim intr-una singura. dependente functionale:
 Daca in descompunere exista doua elemente XiYi si
XjYj astfel incat XiYi ⊆ XjYj atunci XiYi se elimina. F = { A → BCD, D → E }.
 In literatura de specialitate exista demonstratia Rezulta din algoritm descompunerea
faptului ca fiecare schema din descompunere este in
FN3. ρ = (ABCD, DE)

F. Radulescu. Curs: Baze de date 5 F. Radulescu. Curs: Baze de date 6

1
Florin Radulescu - Baze de date (note de curs)

EXEMPLUL 2 FN3 + PASTRARE DEP. +JFP


 Produse = IdP, NumeP, Qty, IdF, NumeF, AdresaF Daca la descompunerea obtinuta prin
avand dependentele functionale:
F = { IdP→NumeP, IdP→Qty, IdP→ IdF, IdF→NumeF, algoritmul anterior adaugam o cheie a
IdF→AdresaF } relatiei (ca element al descompunerii)
 Rescriem multimea de dependente. Raman doar vom obtine o descompunere care are
doua dependente:
F = { IdP→NumeP, Qty, IdF; IdF→NumeF, AdresaF } atat proprietatea de join fara pierderi
 Descompunerea in FN3 cu pastrarea dependentelor cat si pe cea a pastrarii dependentelor.
va fi:
ρ = ((IdP, NumeP, Qty, IdF), (IdF, NumeF, AdresaF))
Formal putem scrie algoritmul astfel:

F. Radulescu. Curs: Baze de date 7 F. Radulescu. Curs: Baze de date 8

FN3+PASTRARE DEP. +JFP(2) FN3+PASTRARE DEP. +JFP(3)


Fie R o schema re relatie si F multimea Pastrarea dependentelor este evidenta, ca
de dependente functionale asociata, cu mai sus.
Demonstratia faptului ca descompunerea are
F = { X1 → Y1, X2 → Y2, … Xn → Yn }
si proprietatea de join fara pierderi se gaseste
si X o cheie pentru R in literatura de specialitate.
Atunci descompunerea Observatie: Daca vreunul dintre elementele
ρ = (X, X1Y1, X2Y2, … XnYn) de forma XiYi contin deja o cheie a lui R
atunci nu este necesara adaugarea unui
este o descompunere in FN3 cu pastrarea element suplimentar in descompunere.
dependentelor si join fara pierderi.
F. Radulescu. Curs: Baze de date 9 F. Radulescu. Curs: Baze de date 10

EXEMPLUL 1 EXEMPLUL 2
 Fie R = ABCDE,
Pentru relatiile din exemplele anterioare  F = { A → B, B → A, A → C, D → E }.
descompunerea ramane aceeasi deoarece: Cheile relatiei sunt AD si BD.
In cazul relatiei R = ABCDE cheia este A, deja
 Rescriem multimea de dependente:
inclusa in ABCD, deci descompunerea ramane
F = { A → BC, B → A, D → E }.
ρ = (ABCD, DE).
 Rezulta descompunerea cu pastrarea dependentelor:
In cazul relatiei PRODUSE de asemenea cheia ρ = (ABC, AB, DE). Cum AB e inclus in ABC rezulta in
este IdP, inclusa deja intr-unul din elementele final ρ = (ABC, DE).
descompunerii.  Cum elementele descompunerii nu contin vreo cheie
a lui R, o adaugam. Obtinem in final descompunerea
ρ = (AD, ABC, DE) (sau pt. cealalta cheie BD in loc
de AD)
F. Radulescu. Curs: Baze de date 11 F. Radulescu. Curs: Baze de date 12

2
Florin Radulescu - Baze de date (note de curs)

FNBC + JFP FNBC + JFP (2)


Fie R o schema de relatie si F multimea Initial ρ = (R)
de dependente functionale asociata, F La fiecare pas se alege o schema T care
contine o dependenta de forma X → A care
in forma canonica: violeaza conditiile de FNBC.
F = { X1 → A1, X2 → A2, … Xn → An }. Schema respectiva este inlocuita in ρ prin T1
Putem calcula descompunerea in FNBC si T2 unde
 T1 = XA
cu join fara pierderi iterativ.  T2 = T – {A}
Procesul se opreste cand in ρ nu mai exista
elemente care nu sunt in FNBC

F. Radulescu. Curs: Baze de date 13 F. Radulescu. Curs: Baze de date 14

EXEMPLU EXEMPLU – cont.


Fie relatia R = ABCD Initial: ρ = (R) = (ABCD)
Alegem dependenta D → A care violeaza
F = { AB → C, AB → D, D → A }. conditia de FNBC.
Cheile relatiei sunt AB si BD. Inlocuim T = ABCD cu T1 = DA si T2 = ABCD
– A = BCD.
T1 mosteneste de la T dependenta D → A,
Relatia este in FN3 dar nu este in FNBC cheia va fi D si T1 e in FNBC
T2 mosteneste de la T dependenta BD → C.
din cauza dependentei D → A care nu Cheia va fi BD si T2 e in FNBC.
are in partea stanga o supercheie a lui Rezulta ca descompunerea in FNBC cu join
R. fara pierderi este ρ = (AD, BCD).

F. Radulescu. Curs: Baze de date 15 F. Radulescu. Curs: Baze de date 16

OBSERVATII DEPENDENTE MULTIVALORICE


 Dependenta mostenita de T2 este din F+ . Exista situatii in care, desi o relatie este
 Ea este acolo deoarece BD este cheie in forma normala Boyce Codd,
pentru R, deci toate celelalte atribute sunt instantele sale contin date redundante.
determinate functional de BD.
Acest fapt se datoreaza unei proiectari
 In multe cazuri este nevoie de mai multe
defectuoase in care in aceeasi relatie
iteratii, relatiile de tip T2 (egale in algoritm
cu T – A) nefiind uneori in FNBC. Ele se sunt stocate date care apartin mai
descompun din nou in acelasi fel. multor entitati si a cel putin doua
asocieri multi-multi.

F. Radulescu. Curs: Baze de date 17 F. Radulescu. Curs: Baze de date 18

3
Florin Radulescu - Baze de date (note de curs)

EXEMPLU - Diagrama EXEMPLU – cont.


Ambele asocieri sunt multi-multi: un
angajat poate sa fie absolvent al mai
Atribute: Nume Are_adresa Atribute: Strada, Localitate multor facultati si in acelasi timp poate
ANGAJAT ADRESA
avea mai multe adrese (de exemplu una
A_absolvit pentru domiciliul stabil si alta pentru
rezidenta temporara la un moment dat).
In cazul in care toate datele din aceasta
STUDII
Atribute: Facultate, AnAbsolvire diagrama sunt stocate intr-o singura
tabela putem avea urmatoarea
incarcare cu date corecte:
F. Radulescu. Curs: Baze de date 19 F. Radulescu. Curs: Baze de date 20

EXEMPLU - Date EXEMPLU – cont.


Putem observa ca nu exista nici o dependenta
Nume Strada Localitate Facultate AnAbsolvire functionala netriviala valida pentru aceasta
Vasile Viitorului Ploiesti Automatica 2000
Vasile Viitorului Ploiesti Comert 2004
relatie, deci nu exista dependente care sa
Vasile Dreapta Bucuresti Automatica 2000 violeze conditiile FNBC.
Vasile Dreapta Bucuresti Comert 2004 Ca urmare relatia este in FNBC avand ca
Mariana Revolutiei Timisoara Constructii 1998
Mariana Revolutiei Timisoara Drept 2003 singura cheie posibila multimea tuturor
Mariana Revolutiei Timisoara Master ASE 2006 atributelor relatiei: din axioma de reflexivitate
Mariana Calea Vitan Bucuresti Constructii 1998 (A1) putem obtine dependenta:
Mariana Calea Vitan Bucuresti Drept 2003
Mariana Calea Vitan Bucuresti Master ASE 2006 Nume,Strada,Localitate,Facultate,AnAbsolvire →
Nume,Strada,Localitate,Facultate,AnAbsolvire
F. Radulescu. Curs: Baze de date 21 F. Radulescu. Curs: Baze de date 22

OBSERVAM CA: DEFINITIE DMV


Desi relatia este in FNBC adresa si facultatea Definitie: Fie o relatie R si doua multimi de
absolvita de un angajat sunt prezente repetat in atribute X si Y incluse in R.
relatie: adresa pentru fiecare facultate absolvita
iar facultatea pentru fiecare adresa a angajatului. Se spune ca X multidetermina Y sau ca exista
Exemplul de mai sus sugereaza faptul ca seturile dependenta multivalorica X →→ Y daca si
de atribute {Strada, Localitate} si {Facultate, numai daca ori de cate ori avem doua tupluri
AnAbsolvire} sunt independente unele de altele, ale relatiei t1 si t2 cu t1[X] = t2[X] atunci
in sensul ca fiecare adresa apare cu fiecare exista in relatie un tuplu t3 pentru care:
facultate absolvita de un angajat si reciproc.
 t3[X] = t1[X] = t2[X]
Astfel de situatii sunt modelate cu un nou tip de
dependente numite dependente multivalorice  t3[Y] = t1[Y] si t3[R-X-Y] = t2[R-X-Y]
(DMV).
F. Radulescu. Curs: Baze de date 23 F. Radulescu. Curs: Baze de date 24

4
Florin Radulescu - Baze de date (note de curs)

VIZUALIZARE CONSECINTA
O consecinta interesanta a acestei
definitii este ca, daca inversam tuplurile
X Y R–X–Y
t1 si t2, rezulta ca exista si un tuplu t4
t1 AAA BBB CCC
t2 AAA DDD EEE pentru care
t3 AAA BBB EEE  t4[X] = t1[X] = t2[X]
 t4[Y] = t2[Y] si t4[R-X-Y] = t1[R-X-Y]

F. Radulescu. Curs: Baze de date 25 F. Radulescu. Curs: Baze de date 26

ALTA CONSECINTA EXEMPLU


Tot din aceasta definitie rezulta ca daca Intorcandu-ne la exemplul anterior rezulta ca
in R exista dependenta multivalorica in relatia continand date despre angajati,
studii si adrese avem urmatoarele
X →→ Y dependentele multivalorice (a doua fiind
atunci exista si dependenta obtinuta din prima prin complementare):
X →→ R – X – Y  Nume →→ Strada, Localitate
Acest fapt va fi prezentat in paragraful  Nume →→ Facultate, AnAbsolvire
urmator ca axioma de complementare a Intradevar, daca luam in considerare pentru
t1 si t2 tuplurile 2 si 3 din relatie:
dependentelor multivalorice.
F. Radulescu. Curs: Baze de date 27 F. Radulescu. Curs: Baze de date 28

EXEMPLU – cont. ALTA ALEGERE t3 SI t4


Nume Strada Localitate Facultate AnAbsolvire Nume Strada Localitate Facultate AnAbsolvire
Vasile Viitorului Ploiesti Comert 2004
Vasile Viitorului Ploiesti Automatica 2000
Vasile Dreapta Bucuresti Automatica 2000
Vasile Viitorului Ploiesti Comert 2004
gasim in relatie pe prima pozitie si tuplul t3 de forma:
t3:
Nume Strada Localitate Facultate AnAbsolvire Nume Strada Localitate Facultate AnAbsolvire
Vasile Viitorului Ploiesti Automatica 2000 Vasile Viitorului Ploiesti Comert 2004

In acelasi timp gasim pe pozitia 4 si tuplul t4: t4:


Nume Strada Localitate Facultate AnAbsolvire Nume Strada Localitate Facultate AnAbsolvire
Vasile Dreapta Bucuresti Comert 2004
Vasile Viitorului Ploiesti Automatica 2000

F. Radulescu. Curs: Baze de date 29 F. Radulescu. Curs: Baze de date 30

5
Florin Radulescu - Baze de date (note de curs)

CE REMARCAM? X→Y
 Observam ca t3 = t2 si t4 = t1 ceea ce este corect
pentru ca in definitia dependentelor multivalorice nu
se cere ca t3 sa fie diferit de t1 si t2.
 Consecinta importanta: orice dependenta X Y R–X–Y
functionala este in acelasi timp si o dependenta
multivalorica: t1 AAA BBB CCC
 Fie relatia R si o dependenta functionala X → Y t2 AAA BBB DDD
pentru R. t3 este t2 AAA BBB DDD
 Atunci daca doua tupluri t1 si t2 au aceleasi valori pe
atributele X vor avea aceleasi valori si pe atributele Y.
Rezulta ca t2 indeplineste conditiile pentru t3 din
definitia dependentelor multivalorice:

F. Radulescu. Curs: Baze de date 31 F. Radulescu. Curs: Baze de date 32

EXEMPLU EXEMPLU – cont.


Exemplu: Fie relatia Produse
anterioara.
In aceasta avem dependenta IdP NumeP Qty IdF NumeF AdresaF
t1 101 Imprimanta 30 20 Xerox Str. Daniel Danielopolu 4-6,
functionala:
laser Sector 1, Bucureşti
IdF → NumeF, AdresaF t2 124 Copiator 10 20 Xerox Str. Daniel Danielopolu 4-6,
Avem doua tupluri cu aceleasi valori pe Sector 1, Bucureşti
IdF:

F. Radulescu. Curs: Baze de date 33 F. Radulescu. Curs: Baze de date 34

EXEMPLU – cont. EXEMPLU – cont.


In acest caz putem forma tuplul t3
astfel:
 Pe IdF valoarea 20 IdP NumeP Qty IdF NumeF AdresaF
 Pe NumeF si adresaF valorile din primul t3 124 Copiator 10 20 Xerox Str. Daniel Danielopolu 4-6,
Sector 1, Bucureşti
tuplu
 Pe restul atributelor valorile din al doilea
tuplu.
Obtinem t3 identin cu t2:

F. Radulescu. Curs: Baze de date 35 F. Radulescu. Curs: Baze de date 36

6
Florin Radulescu - Baze de date (note de curs)

AXIOME – A4. COMPLEMENTARE A5 – AUGMENTARE DMV


Urmatoarele axiome sunt specifice DMV. Le Augmentare pentru DMV: Fie R o
numerotam incepand cu A4 deoarece intr-o schema de relatie si X, Y, Z, W ⊆ R.
schema de relatie pot fi atat dependente
functionale (carora li se aplica axiomele A1- Daca X →→ Y si Z ⊆ W atunci
A3 descrire anterior) cat si dependente XW →→ YZ
multivalorice.
A4. Complementare: Fie R o schema de
relatie si X, Y ⊆ R.
Daca X →→ Y atunci si X →→ (R – X – Y)

F. Radulescu. Curs: Baze de date 37 F. Radulescu. Curs: Baze de date 38

A6 – TRANZITIVITATE DMV A7
A6. Tranzitivitate pentru DMV: Fie Ultimele doua axiome leaga dependentele
R o schema de relatie si X, Y, Z ⊆ R. multivalorice cu cele functionale:
Daca X →→ Y si Y →→ Z atunci
X →→ (Z – Y) A7. Fie R o schema de relatie si
X, Y ⊆ R.
Daca X → Y atunci si X →→ Y

F. Radulescu. Curs: Baze de date 39 F. Radulescu. Curs: Baze de date 40

A8 OBSERVATIE
A8. Fie R o schema de relatie si X, Y, Z, Orice dependenta functionala este in acelasi
W ⊆ R. cu W ∩Y = ∅ timp si o dependenta multivalorica insa
reciproca nu este adevarata: exista
Daca X →→ Y, Z ⊆ Y, W → Z atunci dependente multivalorice pentru care in
X→ Z schema relatiei nu avem o dependenta
functionala corespunzatoare.
Exemplu pentru acest fapt este dependenta
multivalorica existenta in tabela de angajati
din paragraful anterior:

F. Radulescu. Curs: Baze de date 41 F. Radulescu. Curs: Baze de date 42

7
Florin Radulescu - Baze de date (note de curs)

OBSERVATIE – cont. REGULI PENTRU DMV


Nume →→ Strada, Localitate Exista de asemenea o serie de reguli
In relatie nu exista insa si o dependenta care se pot deduce din axiome. Toate
functionala echivalenta de tipul:
considera existenta unei scheme de
Nume → Strada, Localitate
relatie R iar X, Y, Z, W sunt submultimi
Rezulta ca:
ale lui R:
Putem folosi si axiomele A1-A3 dar doar
pentru dependente multivalorice care sunt in R1. Reuniune:
acelasi timp si dependente functionale.
Daca X →→ Y si X →→ Z atunci
Pentru restul dependentelor multivalorice
putem folosi doar A4-A6. X →→ YZ
F. Radulescu. Curs: Baze de date 43 F. Radulescu. Curs: Baze de date 44

R2, R3 R4, R5
R2. Pseudotranzitivitate: R4. Diferenta:
Daca X →→ Y si WY →→ Z atunci Daca X →→ Y si X →→ Z atunci:
WX →→ Z – WY X →→ Y – Z
R3. Pseudotranzitivitate mixta: X →→ Z – Y
Daca X →→ Y si XY →→ Z atunci R5. Intersectie:
X →→ Z – Y Daca X →→ Y si X →→ Z atunci:
X →→ Y ∩ Z

F. Radulescu. Curs: Baze de date 45 F. Radulescu. Curs: Baze de date 46

R6, R7 SI R8 INCHIDERE
R6. Eliminare atribute comune: Aceste axiome si reguli se pot folosi pentru
Daca X →→ Y atunci: calculul inchiderii unei multimi de dependente
functionale si multivalorice.
X →→ Y – X Definitia inchiderii este aceeasi ca la
R7. Toate atributele (dependente dependentele functionale:
triviale): Definitie: Fie R o schema de relatie si G
Daca X ∪ Y = R atunci multimea de dependente functionale si
X →→ Y si Y →→ X multivalorice asociata. Atunci inchiderea
multimii de dependente G, notata G+, este
R8. Reflexivitate (dependente o multime de dependente (DF si DMV) care
triviale): sunt in G sau se pot deduce din G folosind
Daca Y ⊆ X atunci X →→ Y axiomele si regulile.
F. Radulescu. Curs: Baze de date 47 F. Radulescu. Curs: Baze de date 48

8
Florin Radulescu - Baze de date (note de curs)

PROIECTIE DEPENDENTE MOSTENITE


Analog cu cazul dependentelor functionale se In momentul in care o schema de
poate defini si proiectia unei multimi de
dependente functionale si multivalorice pe o
relatie se descompune in doua sau mai
multime de atribute: multe subscheme, fiecare subschema
Definitie. Fie o relatie R, o multime asociata va mosteni o multime de dependente
de dependente functionale si multivalorice G functionale si multivalorice obtinuta prin
si o submultime de atribute S ⊆ R . Proiectia proiectia multimii initiale G pe atributele
multimii de dependente G pe S, notata cu
πS(G) este multimea dependentelor din G+ din subschema respectiva.
care au si partea stanga si pe cea dreapta
incluse in S.
F. Radulescu. Curs: Baze de date 49 F. Radulescu. Curs: Baze de date 50

FORMA NORMALA 4 FN4 - DEFINITIE


Pentru a preintampina redundantele Definitie: O schema de relatie R este
prezentate la inceputul paragrafului 4.5. este in forma normala 4 daca orice
bine ca schemele de relatie sa fie intr-o forma dependenta multivalorica netriviala
normala superioara FNBC.
Aceasta forma care considera si dependentele
X →→ Y are in partea stanga o
multivalorice se numeste forma normala 4 supercheie
(FN4).
Definitia ei este similara cu cea pentru FNBC
dar conditia se pune pentru dependentele
multivalorice ale relatiei respective:
F. Radulescu. Curs: Baze de date 51 F. Radulescu. Curs: Baze de date 52

DMV TRIVIALE EXEMPLU


Dependentele multivalorice triviale sunt de Relatia angajati-studii-adrese are
doua feluri:
dependenta netriviala
Dependente provenite din R8, deci cele in
care partea dreapta este inclusa in partea Nume →→ Strada, Localitate
stanga: X →→ Y unde Y ⊆ X Cum cheia relatiei e multimea tuturor
Dependente provenite din regula R7: atributelor acesteia, rezulta ca relatia nu
X →→ Y pentru X ∪ Y = R este in FN4 deoarece {Nume} nu e
Conditia de FN4 spune deci ca orice DMV care
nu intra in una din categoriile de mai sus are
supercheie.
in partea stanga o supercheie.

F. Radulescu. Curs: Baze de date 53 F. Radulescu. Curs: Baze de date 54

9
Florin Radulescu - Baze de date (note de curs)

RELATIA DINTRE FN DESCOMPUNERE IN FN4


Relatia dintre formele normal2 FN3, Acest algoritm este similar cu cel de
FNBC si FN4 este una de includere, in descompunere in FNBC dar ia in
aceasta ordine. considerare dependentele multivalorice
care violeaza FN4.
Orice relatie in FN4 este in acelasi timp
Atentie: dependentele multivalorice ale
si in FNBC si FN3: unei relatii sunt atat cele care provin
FN3
FNBC
prin axioma A7 din dependente
FN4 functionale cat si dependente
multivalorice care nu au corespondent
in multimea celor functionale.
F. Radulescu. Curs: Baze de date 55 F. Radulescu. Curs: Baze de date 56

ALGORITM EXEMPLU
 Fie R o schema de relatie si G multimea de Pentru relatia Angajati care nu era in FN4
dependente multivalorice asociata (consideram ca din
G au fost eliminate dependentele triviale). Putem Initial
calcula descompunerea in FN4 iterativ: ρ = ( (Nume,Strada,Localitate,Facultate,AnAbsolvire) )
 Initial ρ = (R)
Alegem dependenta
 La fiecare pas se alege o schema T care contine o
dependenta de forma X →→ Y care violeaza conditia Nume →→ Strada, Localitate
pentru FN4. Schema respectiva este inlocuita in ρ care violeaza conditia pentru FN4. Obtinem
prin T1 si T2 unde T1 = XY si T2 = T – Y
 T1 = Nume, Strada, Localitate si
 Procesul se opreste cand in ρ nu mai exista elemente
care nu sunt in FN4  T2 = Nume, Facultate, AnAbsolvire

F. Radulescu. Curs: Baze de date 57 F. Radulescu. Curs: Baze de date 58

EXEMPLU – cont. OBSERVATIE


Obtinem ρ = ( (Nume, Strada, Localitate), Fiecare subschema Ti obtinuta la
(Nume, Facultate, AnAbsolvire) ). Fiecare
subschema mosteneste cate o dependenta
descompunere mosteneste de la relatia
multivalorica: originala T proiectia multimii de
 T1: Nume →→ Strada, Localitate dependente a lui T (DF si DMV) pe Ti.
 T2: Nume →→ Facultate, AnAbsolvire
Cum relatia initiala avea doar doua
Cum cele doua dependente mostenite de T1
si T2 sunt triviale (contin toate atributele
DMV si nici o DF, multimile de
relatiei) rezulta ca cele doua relatii sunt in dependente pentru T1 si T2 sunt cele
FN4 deoarece nu exista dependente netriviale din slide-ul anterior.
care violeaza FN4. Procesul s-a incheiat.
F. Radulescu. Curs: Baze de date 59 F. Radulescu. Curs: Baze de date 60

10
Florin Radulescu - Baze de date (note de curs)

Sfarsitul cursului 9:
Proiectarea bazelor de date
relationale - partea 3

F. Radulescu. Curs: Baze de date 61

11
Cursul 10 PROBLEMATICA
Asa cum s-a exemplificat in primul capitol,
atunci cand mai multe programe opereaza
simultan pe aceleasi date pot sa apara situatii
in care continutul bazei de date devine
inconsistent
TRANZACŢII ŞI ACCES Daca pasii aceluiasi program de rezervare de
CONCURENT locuri rulat de la doua agentii de voiaj diferite
sunt ca in tabelul de mai jos, desi se rezerva
doua locuri numarul de locuri disponibile
scade cu doar o unitate
F. Radulescu. Curs: Baze de date 1 F. Radulescu. Curs: Baze de date 2

EXEMPLU PROBLEMATICA – cont.


In cazul accesului la aceleasi date se
Moment de timp Agentia 1 Agentia 2 A în BD spune ca executiile celor doua
t1 READ A 10 programe sunt concurente sau ca
t2 READ A 10 exista un acces concurent la date.
t3 A=A–1 10
t4 A=A-1 10
Scopul acestui capitol este de a studia
t5 WRITE A 9 modalitatile de evitare a
t6 WRITE A 9 inconsistentelor precum si a
problemelor ridicate de mecanismele
folosite pentru aceasta.

F. Radulescu. Curs: Baze de date 3 F. Radulescu. Curs: Baze de date 4

TERMENI FOLOSITI TRANZACTIE


In acest prim paragraf sunt definiti Notiunea de tranzactie va fi rafinata in
principalii termeni folositi ca punct de paragrafele urmatoare.
plecare in studierea tranzactiilor si a Definitia urmatoare este doar una de
accesului concurent la date. lucru pentru intelegerea celorlalti
Pe parcurs vor fi introduse si alte termeni din acest paragraf.
notiuni care deriva din acestea. Definitie: O tranzactie este o singura
executie a unui program.

F. Radulescu. Curs: Baze de date 5 F. Radulescu. Curs: Baze de date 6

1
TRANZACTIE EXEMPLU
In exemplul anterior exista doua tranzactii,
T1 si T2 care erau doua executii ale aceluiasi Moment de timp Tranzactia 1 Tranzactia 2 lansata A în
program: lansata de Agentia de Agentia 2: BD
1: rezervare loc anulare rezervare
 T1 executia programului de rezervare t1 READ A 10
lansata de Agentia 1 t2 READ A 10
 T2 este cea de la Agentia 2. t3 A=A–1 10
t4 A = A +1 10
Nu inseamna insa ca un set de tranzactii care t5 WRITE A 9
opereaza simultan pe o baza de date trebuie t6 WRITE A 11
sa contina doar executii ale aceluiasi
program.
Putem avea de exemplu o tranzactie care
rezerva un loc si o alta care anuleaza o
rezervare de loc, ca in exemplul urmator:
F. Radulescu. Curs: Baze de date 7 F. Radulescu. Curs: Baze de date 8

TRANZACTIE – cont. TRANZACTIE – cont.


Si in acest caz rezultatul este o inconsistenta Operatiile efectuate de tranzactii care nu sunt
a bazei de date deoarece numarul de locuri de scriere sau de citire de date din baza de
disponibile trebuia sa ramana acelasi. date nu duc la inconsistente
Pe o aceeasi baza de date pot rula simultan Exemplu: incrementarea sau decrementarea
mai multe tranzactii care lucreaza fiecare nu
cu un singur element din baza de date (A din lui A din exemplul anterior nu sunt cauza
exemplul anterior) ci cu mai multe: fiecare inconsistentelor ci ordinea in care s-au facut
tranzactie scrierile rezultatelor in baza de date.
 poate citi mai multe date si De aceea in unele dintre exemplele din acest
 poate sa si scrie mai multe date in baza de capitol nu vom mai figura acest tip de
date (nu neaparat cele citite ci si altele). operatii. Iata o executie concurenta pentru
patru tranzactii:
F. Radulescu. Curs: Baze de date 9 F. Radulescu. Curs: Baze de date 10

EXEMPLU OBSERVATII
Se observa ca putem avea:
Timp T1 T2 T3 T4 tranzactii scriu date care anterior au fost citite
t1
t2
READ A
READ B
(ca T1 il scrie pe A, citit anterior),
t3
t4
READ A
READ B
tranzactii care scriu date care nu au fost
t5 WRITE B anterior citite, calculate eventual pe baza
t6
t7
WRITE B
READ B
altora citite din baza de date (T2 scrie pe C
t8 READ C pe care nu l-a citit, dar a citit A si B)
T9
t10
WRITE A
WRITE C
tranzactii care doar citesc date fara sa scrie
(T4)
tranzactii care doar scriu date fara sa citeasca
anterior ceva din baza de date (T3)

F. Radulescu. Curs: Baze de date 11 F. Radulescu. Curs: Baze de date 12

2
ARTICOL EXEMPLU
 Definitie: Un articol este o portiune a bazei de date Sistemul Oracle blocheaza automat
care se poate citi, scrie, bloca sau debloca printr-o
singura operatie de READ, WRITE, LOCK respectiv orice linie modificata de o comanda de
UNLOCK. tip UPDATE pana cand tranzactia care a
 In exemplul anterior am folosit articolele simbolice A,
B si C. In cazurile reale un articol poate fi: efectuat operatie fie comite
 O intreaga tabela modificarile (le face permanente in baza
 O linie (sau o multime de linii) dintr-o tabela
 O celula dintr-o tabela (valoarea unei coloane de pe o linie a
de date) fie le revoca.
tabelei)
 Orice alta portiune a bazei de date care indeplineste conditia
In acest caz articolele sunt deci linii ale
din definitie in concordanta cu facilitatile puse la dispozitie tabelei actualizate.
de SGBD-ul respectiv.

F. Radulescu. Curs: Baze de date 13 F. Radulescu. Curs: Baze de date 14

PLANIFICARE PLANIFICARE – cont.


 Definitie: O planificare reprezinta ordinea in care Pentru cazurile in care operatiile de
sunt executati de SGBD pasii elementari ai unui set
de tranzactii. scriere nu devin permanente in baza de
 Planificarea este deci o lista de pasi pentru un set de date decat dupa comitere putem avea si
tranzactii care se executa concurent si arata ca
SGBD-ul executa acesti pasi in exact acea ordine. pasi de tipurile urmatoare:
 In acest capitol vom reprezenta doar pasii care  COMMIT – comiterea modificarilor
semnifica o interactiune a tranzactiei cu datele din efectuate de o tranzactie
baza de date:
 READ – citirea unui articol  ROLLBACK – revocarea modificarilor
 WRITE – scrierea unui articol efectuate de o tranzactie
 LOCK (in diversele sale forme) – blocarea unui articol
 UNLOCK – deblocarea unui articol
F. Radulescu. Curs: Baze de date 15 F. Radulescu. Curs: Baze de date 16

PLANIFICARE - REPREZENTARE REPREZENTARE – cont.


Asa cum s-a mentionat, celelalte Pentru a doua forma sa consideram
urmatoarele notatii:
operatii nu ridica probleme de acces
 Ri(A) - semnifica: Tranzactia Ti citeste
concurent. Exista mai multe moduri de articolul A
a reprezenta o planificare:  Wi(A) - semnifica: Tranzactia Ti scrie
 Sub forma tabelara, ca in exemplele articolul A
anterioare de executie concurenta. Coloana In acest caz ultima planificare (pentru T1, T2
“Timp” poate lipsi, ordinea executiei este si T3) se mai poate scrie si astfel:
de sus in jos. R1(A); R1(B); R2(A); R2(B); W3(B); W2(B);
 Sub forma unei liste. R4(B); R4(C); W1(A); W2(C)

F. Radulescu. Curs: Baze de date 17 F. Radulescu. Curs: Baze de date 18

3
PLANIFICARE SERIALA BLOCARE
 Definitie: O planificare in care pasii fiecarei tranzactii Cum s-a mentionat si in primul capitol, una
sunt succesivi, fara sa fie intercalati pasi ai altor
tranzactii se numeste planificare seriala. dintre metodele de a obtine planificari care sa
Exemplu de planificare seriala pentru doua tranzactii T1 si nu ridice probleme privind consistenta datelor
T2: dupa executia tranzactiilor este aceea a
R1(A); R1(B); R1(C); W1(B); R2(B); R2(C); W2(A); W2(C) blocarii articolelor.
Pasii lui T1 Pasii lui T2 Definitie: Blocarea unui articol de catre o
 Planificarile seriale nu ridica probleme de consistenta tranzactie semnifica faptul ca acea tranzactie
(sunt planificari “bune” din punct de vedere al executiei
concurente). obtine din partea sistemului (SGBD) anumite
 De aceea unul din obiectivele acestui capitol este acela drepturi speciale de acces care impiedica alte
de a gasi planificari care sa se comporte la fel cu o tranzactii sa efectueze anumite operatii
planificare seriala. asupra acelui articol.
F. Radulescu. Curs: Baze de date 19 F. Radulescu. Curs: Baze de date 20

CATEGORII EXEMPLE
Exista doua categorii de blocari:  Pentru a scrie un articol, o tranzactie trebuie sa
obtina anterior un Write Lock asupra acestuia: nici o
 Blocari exclusive: celelalte tranzactii nu pot alta tranzactie nu poate citi sau scrie acel articol pana
sa execute operatii asupra articolului cand el nu este deblocat
blocat. Aceste blocari sunt denumite in  Pentru a citi un articol o tranzactie trebuie sa obtina
literatura de specialitate si Exclusive Locks anterior un Read Lock asupra lui. Mai multe tranzactii
sau Write Locks. pot sa blocheze acelasi articol pentru citire insa nici
o alta tranzactie nu il poate scrie. O tranzactie poate
 Blocari partajate: celelalte tranzactii pot sa sa obtina un Write Lock pe articolul respectiv abia
execute doar anumite tipuri de operatii dupa deblocarea acestuia de catre toate tranzactiile
asupra articolului blocat. Aceste blocari care l-au blocat pentru citire.
sunt denumite in literatura de specialitate
si Shared Locks sau Read Locks
F. Radulescu. Curs: Baze de date 21 F. Radulescu. Curs: Baze de date 22

DEBLOCARE GESTIUNEA TRANZACTIILOR


Articolele pot fi deblocate unul cate  In paragraful anterior tranzactia era definita ca o
executie a unui program.
unul de catre tranzactia care le-a blocat  In fapt un program care interactioneaza cu o baza de
sau pot fi toate deblocate in cazul unui date contine de obicei nu o singura tranzactie ci o
succesiune de tranzactii care nu se intersecteaza.
COMMIT sau unui ROLLBACK, in functie  Fiecare dintre ele este finalizata fie prin comiterea
de modelul de blocare folosit. modificarilor efectuate (ele devin definitive in baza de
date) fie prin revocarea lor (modificarile sunt
anulate).
 Dupa terminarea unei tranzactii celelalte operatii
asupra bazei de date apartin tranzactiilor urmatoare.

F. Radulescu. Curs: Baze de date 23 F. Radulescu. Curs: Baze de date 24

4
GESTIUNE … - cont - ACID
Cum singurele operatii care sunt Pentru ca o tranzactie sa fie bine
importante din punct de vedere al definita ea trebuie sa indeplineasca
interactiunii dintre program si sistemul niste criterii de corectitudine care au
de gestiune sunt cele de citire/scriere si fost sintetizate prin abrevierea ACID.
Aceasta semnifica
cele conexe (blocare, deblocare,
comitere si revocare) putem defini o A – Atomicitate
tranzactie si ca o succesiune de operatii C – Consistenta
de acest tip. I – Izolare
D – Durabilitate.
F. Radulescu. Curs: Baze de date 25 F. Radulescu. Curs: Baze de date 26

ATOMICITATE ATOMICITATE – cont.


Definitie: O tranzactie trebuie sa fie atomica in Aceste modificari trebuie
sensul ca fie toate modificarile efectuate de  Ori comise impreuna
ea in baza de date sunt comise fie sunt toate  Ori revocate impreuna.
revocate. Daca doar inserarea si stergerea sunt comise
si nu si actualizarea atunci este incalcata
Exemplu: Sa luam o succesiune de actualizari atomicitatea.
in SQL care insereaza, actualizeaza si sterg Sistemul de gestiune este cel care trebuie sa
linii din doua tabele STUD si SPEC: puna la dispozitie mecanismele prin care sa
INSERT INTO STUD … se asigura atomicitatea tranzactiilor inclusiv in
UPDATE SPEC …
cazul unor incidente hardware si software
care pot interveni in timpul executiei unei
DELETE FROM STUD … tranzactii.
F. Radulescu. Curs: Baze de date 27 F. Radulescu. Curs: Baze de date 28

CONSISTENTA IZOLARE
Definitie: O tranzactie care incepe sa lucreze pe o baza
de date consistenta trebuie sa o lase la final tot intr-o Definitie: O tranzactie trebuie sa se
stare consistenta. comporte ca si cand operatiile efectuate
 In acest sens o tranzactie nu poate incalca restrictiile
existente la nivelul bazei de date. de ea sunt izolate, independente de
 In cele mai multe cazuri aceste restrictii sunt operatiile efectuate de alta tranzactie.
modelate sub forma constrangerilor de integritate
(NOT NULL, PRIMARY KEY, etc). Nici o alta tranzactie nu trebuie sa
 Daca o tranzactie contine o operatie care violeaza o citeasca date intermediare scrise de
constrangere de integritate atunci toate modificarile
efectuate de tranzactie vor fi revocate. tranzactia respectiva.
 Mecanismele de pastrare a consistentei trebuie
asigurate de SGBD.

F. Radulescu. Curs: Baze de date 29 F. Radulescu. Curs: Baze de date 30

5
EXEMPLU IZOLARE – cont.
De exemplu daca o tranzactie contine  Atunci nici o alta tranzactie nu poate citi pentru A si B
doua valori dintre care una este actualizata si cealalta
succesiunea de operatii: nu (adica 6 pentru A si 10 pentru B).
READ (A) -- citeste valoarea veche a lui A: 5  Inconsistentele prezentate in paragraful anterior erau
A = A + 1 datorate incalcarii acestui criteriu de corectitudine.
WRITE (A) -- scrie valoarea noua a lui A:6  Din punct de vedere al modului de asigurare a izolarii
READ (B) -- citeste valoarea veche a lui B:10 tranzactiilor tot sistemul de gestiune trebuie sa
B = B - 1 asigure mecanismele necesare.
WRITE (B) -- scrie valoarea noua a lui B:9
 Izolarea este obiectul controlului accesului concurent,
prezentat in paragrafele urmatoare.

F. Radulescu. Curs: Baze de date 31 F. Radulescu. Curs: Baze de date 32

DURABILITATE SERIALIZABILITATE
Definitie: O data comise cu succes modificarile Asa cum s-a specificat planificarile seriale nu
efectuate de catre o tranzactie ele vor duc la inconsistente.
persista si nu mai pot fi revocate. In practica insa in cazul unor sisteme
Inclusiv in cazul unui incident hardware si incarcate planificarile contin pasi intercalati ai
diverselor tranzactii.
software efectele tranzactiilor comise sunt
regasite la recuperarea dupa incident. Rezultatul va fi totusi corect daca efectul
executiei planificarii respective este acelasi cu
Din acest punct de vedere fiecare sistem de al uneia dintre planificarile seriale posibile ale
gestiune trebuie sa contina mecanisme prin acelorasi tranzactii.
care efectele tuturor tranzactiilor comise sa O astfel de planificare se numeste planificare
fie inregistrate si in jurnalele sistemului serializabila.
pentru a fi restaurate in caz de incident.
F. Radulescu. Curs: Baze de date 33 F. Radulescu. Curs: Baze de date 34

PL. SERIALIZABILA EXEMPLU


Definitie: O planificare este Planificare serializabila si cea seriala
serializabila daca produce aceleasi echivalenta (cu acelasi efect):
T1 T2 T3 T1 T2 T3
efecte in baza de date cu o planificare Read A Read C
seriala. Read B Read D
Read C Write C
Read D Read A
Write A Read B
Write C Write A
Read A Read A
Write A Write A

F. Radulescu. Curs: Baze de date 35 F. Radulescu. Curs: Baze de date 36

6
ALT EXEMPLU - neserializabila SERIALE
Planificare neserializabila: Planificari seriale posibile (nici una
echivalenta):
T1 T2 A in baza de
T1 T2 A / BD T1 T2 A / BD
date
Read A 10 Read A 10
Read A 10
Read A 10 A=A+1 10 A=A+1 10
A=A+1 10 Write A 11 Write A 11
A=A+1 10 Read A 11 Read A 11
Write A 11 A=A+1 11 A=A+1 11
Write A 11 Write A 12 Write A 12

F. Radulescu. Curs: Baze de date 37 F. Radulescu. Curs: Baze de date 38

CONFLICT ECHIVALENTA
 Exista si o alta abordare a serializabilitatii bazata pe
conflictele care pot sa apara intre pasii a doua Definitie: Doua planificari sunt conflict-
tranzactii dintr-o planificare. echivalente daca:
 Definitie: Intre doua operatii apartinand unei
planificari exista un conflict daca:  Contin aceleasi operatii ale acelorasi
 Apartin unor tranzactii diferite tranzactii
 Sunt pe acelasi obiect  Fiecare pereche de operatii conflictuale
 Una dintre operatii este o scriere apare in aceeasi ordine in cele doua
 Cele doua operatii sunt succesive in sensul ca intre planificari.
ele nu exista o operatie cu care vreuna dintre ele
este in conflict. Aceasta definitie nu spune ca nu pot sa apara
 Rezulta ca exista 3 tipuri de situatii conflictuale: Fiind anomalii in executia celor doua planificari ci
date doua tranzactii T1 si T2 pot exista conflicte de ca apar aceleasi anomalii in ambele.
tipurile R1-W2, W1-W2 si W1-R2.

F. Radulescu. Curs: Baze de date 39 F. Radulescu. Curs: Baze de date 40

CONFLICT-SERIALIZABILA CONFLICT-SERIALIZABILA
Prin trei interschimbari de operatii neconflictuale s-a
Definitie: O planificare este conflict- obtinut o planificare seriala.

serializabila daca este conflict- 1. T1


Read A
T2
3. T1
Read A
T2

echivalenta cu o planificare seriala Write A


Read A
Write A
Read B
Read A
Read B
Alternativ: O planificare este conflict- Write B
Write A
Write B
Write A
Read B
serializabila daca poate fi transformata Read B
Write B
Write B

intr-o planificare seriala prin 2. T1 T2 4. T1 T2

interschimbari ale operatiilor Read A


Write A
Read A
Write A
Read B Read B
consecutive care nu sunt in conflict din Read A
Write A
Write B
Read A
doua tranzactii Write B
Read B
Write A
Read B
Write B Write B

F. Radulescu. Curs: Baze de date 41 F. Radulescu. Curs: Baze de date 42

7
TEST EXEMPLU
Test de conflict-serializabilitate:
Se construieste graful de dependenta astfel:
 Nodurile sunt tranzactii T1 T2
 Pentru orice pereche de operatii aflate in conflict
Read A
Oi si Oj, cu Oi in Ti si Oj in Tj, avem un arc de la
nodul Ti la Tj daca Oi apare in planificare inaintea Write A
lui Oj.
Write A
Daca acest graf nu contine cicluri planificarea
este conflict-serializabila altfel nu este
conflict-serializabila
F. Radulescu. Curs: Baze de date 43 F. Radulescu. Curs: Baze de date 44

EXEMPLU – cont. OBSERVATIE


Avem 2 conflicte:
Exista planificari serializabile care nu
• T1-READ A cu T2-WRITE A sunt conflict-serializabile.
• T2-WRITE A cu T1-WRITE A
De exemplu sa presupunem ca in
Rezulta ca graful are doua noduri si doua arce: planificare de mai sus tranzactia T2
scrie in A exact valoarea citita de T1.
T1 T2
Planificarea nu e conflict-serializabila
dar e serializabila, avand acelasi efect
cu planificarea seriala “T2 urmata de
T1”:

F. Radulescu. Curs: Baze de date 45 F. Radulescu. Curs: Baze de date 46

EXEMPLU DE CE?
Acest fapt se datoreaza insa doar coincidentei
T1 T2 intre valoarea scrisa de T2 si cea citita de T1.
Write A Cum sistemul de gestiune nu face astfel de
judecati pentru el potential planificarea este
Read A periculoasa putand sa duca la inconsistente.
De aceea in judecarea planificarilor se
Write A
considera ca la o scriere o tranzactie poate
scrie orice valoare si nu doar o valoare
particulara.

F. Radulescu. Curs: Baze de date 47 F. Radulescu. Curs: Baze de date 48

8
V-SERIALIZABILA EXEMPLU
 Exista de asemenea o a treia abordare (mai slaba) a
serializabilitatii (numita in eng. view serializability):
Exemplu: O planificare v-serializabila si planificarea seriala v-echivalenta:
 Definitie: Doua planificari S1 si S2 sunt v-echivalente
daca pentru orice articol A: T1 T2 T3 T1 T2 T3
 Daca Ti citeste valoarea initiala a lui A in S1 atunci ea face READ A READ A
acelasi lucru si in S2 WRITE A WRITE A
 Daca Ti citeste o valoare a lui A scrisa de Tj in S1, atunci WRITE A WRITE A
face acelasi lucru si in S2.
WRITE A WRITE A
 Daca Ti scrie valoarea finala a lui A in S1 atunci ea face
acelasi lucru si in S2
 Definitie: O Planificare este v-serializabila daca este
v-echivalenta cu o planificare seriala.

F. Radulescu. Curs: Baze de date 49 F. Radulescu. Curs: Baze de date 50

V-SERIALIZABILA – cont. BLOCARI


Aceasta definitie permite planificarile de Pentru a putea asigura serializabilitatea
tranzactii conflict-serializabile si tranzactiilor sistemele de gestiune pun la
planificari care contin tranzactii care dispozitie posibilitatea de blocare a articolelor.
scriu date fara sa citeasca ceva din baza Daca o tranzactie blocheaza un articol,
celelalte tranzactii care vor si ele sa aiba
de date.
acces la acel articol pot fi puse in asteptare
Planificarea din exemplul anterior nu pana la deblocarea acestuia.
este conflict-serializabila dar este v- Exista mai multe modele de blocare,
serializabila. prezentate in continuare.

F. Radulescu. Curs: Baze de date 51 F. Radulescu. Curs: Baze de date 52

MODEL LOCK / UNLOCK TEST SERIALIZABILITATE


In cadrul acestui model exista o singura  Se construieste graful de precedenta G astfel
 Nodurile sunt tranzactiile planificarii
primitiva de blocare, LOCK, ea ducand la
 Daca pentru vreun articol (notat simbolic A) avem in
obtinerea unui acces exclusiv la articol pentru S secventa
tranzactia care il blocheaza (celelalte Ti: UNLOCK A
Tj: LOCK A (Tj este prima tranzactie care blocheaza A
tranzactii nu pot nici scrie nici citi articolul). dupa deblocarea sa de catre Ti)
Deblocarea se face cu UNLOCK. atunci vom avea un arc in graf de la nodul Ti la
nodul Tj
Vom presupune in continuare ca o tranzactie  Daca graful are cicluri atunci S nu e serializabila.
 nu blocheaza un articol deja blocat de ea  Daca nu are cicluri e serializabila si planificarea
seriala echivalenta se obtine prin sortarea topologica
 nu deblocheaza un articol pe care nu l-a blocat. a grafului G

F. Radulescu. Curs: Baze de date 53 F. Radulescu. Curs: Baze de date 54

9
SORTARE TOPOLOGICA EXEMPLU
Sortarea topologica se face astfel: T1 T2 T3
LOCK A
 Se alege un nod care nu are arce care intra UNLOCK A
(neexistand cicluri exista cel putin un astfel LOCK A
UNLOCK A
de nod) LOCK B
UNLOCK B
 Se listeaza tranzactia asociata nodului dupa LOCK B
care acesta este sters dion graf impreuna UNLOCK B
cu toate arcele care ies din el
 Procesul se reia

F. Radulescu. Curs: Baze de date 55 F. Radulescu. Curs: Baze de date 56

GRAF PROTOCOL IN 2 FAZE


Graful este urmatorul. Cum nu are Definitie: O tranzactie respecta protocolul de
blocare in doua faze daca toate blocarile
cicluri planificarea este serializabila si preced toate deblocarile
planificarea seriala echivalenta (obtinuta Acest protocol ne garanteaza
prin sortare topologica) este T1, T2, T3: serializabilitatea: daca toate tranzactiile
respecta cerintele protocolului se poate
demonstra ca orice planificare a lor e
T1 T2 T3
serializabila.
De asemenea se poate demonstra ca daca o
tranzactie nu respecta protocolul pot exista
executii neserializabile ale acelei tranzactii in
conjunctie cu alte tranzactii.
F. Radulescu. Curs: Baze de date 57 F. Radulescu. Curs: Baze de date 58

EXEMPLU Probleme
 Pentru o tranzactie care contine secventa:  Protocolul de blocare in 2 faze implica insa uneori
UNLOCK A operatii de roll-back in cascada: T1 T2
LOCK B  In momentul Rollback pentru T1 Lock A
 Putem avea o planificare care contine: este necesar Rollback si pentru T2 Lock B
T1 T2 deoarece T2 a citit date scrise de T1, Read A
date care prin Rollback se pierd. Write A
UNLOCK A
 O astfel de planificare se numeste Unlock A
LOCK A
planificare cu rollback in cascada Lock A
LOCK B Read A
UNLOCK A  Exista in acest caz varianta Write A
UNLOCK B protocolului de blocare stricta in 2 faze Unlock A
LOCK B care implica eliberarea toturor Read B
articolelor blocate la sfarsitul Write B
Graful de precedenta contine un ciclu => executie
neserializabila tranzactiei. Rollback
F. Radulescu. Curs: Baze de date 59 F. Radulescu. Curs: Baze de date 60

10
Planificari - incluziuni MODELUL RLOCK/WLOCK
 Incluziunea intre diverse tipuri de planificari este  In cadrul acestui model exista o doua primitive de
urmatoarea: blocare:
 RLOCK (blocare pentru citire). Oricate tranzactii pot
bloca acelasi articol pentru citire dar o tranzactie nu
Planificari
Serializabile
poate bloca pentru scriere un articol blocat cu
v-serializabile
RLOCK
Conflict-
 WLOCK (blocare pentru citire). Duce la obtinerea
serializabile unui acces exclusiv la articol pentru tranzactia care
Fara rollback in cascada
Seriale
il blocheaza. Celelalte tranzactii nu mai pot sa
blocheze cu RLOCK sau WLOCK acel articol.
 Deblocarea pentru ambele tipuri se face cu UNLOCK.
 Vom presupune ca si anterior ca o tranzactie
 nu blocheaza un articol deja blocat de ea
 nu deblocheaza un articol pe care nu l-a blocat.
F. Radulescu. Curs: Baze de date 61 F. Radulescu. Curs: Baze de date 62

OBSERVATII Algoritm
 Intrare: o planificare P a mulţimii de tranzacţii T1, T2, ...., Tk.
Si in acest caz se poate construi (altfel  Ieşirea: raspunsul daca planificarea este serializabilă, si daca da
planificarea serială echivalentă.
decat in paragraful anterior) un graf de  Metoda: construirea grafului de precedenta G, similar cu modelul
precedenta din care se poate deduce anterior: fiecarei tranzactii ii corespunde un nod al grafului iar
arcele se traseaza astfel:
daca planificarea e serializabila sau nu.  1. Fie Ti tranzactia care executa RLOCK A iar Tj urmatoarea
tranzactie (diferita de Ti) care face WLOCK A. Trasam atunci un arc
de la Ti la Tj.
Observatie importanta: Si in acest caz  2. Fie Ti tranzactia care face WLOCK A si Tj urmatoarea tranzactie
(daca exista) care face WLOCK A. Se traseaza un arc de la Ti la Tj.
protocolul de blocare in doua faze este De asemenea, in acest ultim caz fie Tm tranzactia care face RLOCK A
dupa ce Ti elibereaza pe A dar inainte de blocarea acestuia de catre
valabil: Daca toate blocarile (de orice fel, Tj. Se traseaza un arc de la Ti la Tm.
Observatie: Daca in cazul 2 Tj nu exista atunci Tm este urmatoarea
la citire sau la scriere) preced toate tranzactie care face RLOCK A dupa eliberarea lui A de catre Ti.

deblocarile, planificarea este serializabila.


F. Radulescu. Curs: Baze de date 63 F. Radulescu. Curs: Baze de date 64

Exemplu Exemplu
 Graful este urmatorul. Cum are cicluri, planificarea nu e
T1 T2 T3
WLOCK A
serializabila.
T1 T2
RLOCK B
1 UNLOCK A
5 UNLOCK B
WLOCK B T3
RLOCK A 6
UNLOCK B
UNLOCK A 4
 Arcele s-au trasat pe baza regulilor de mai sus :
2 WLOCK A  Prima regula a generat arcele de tip R-W: 4, 5.
WLOCK B  Prima parte a celei de-a doua reguli a generat arcele
3 UNLOCK A de tip W-W: 2, 6.
UNLOCK B
RLOCK B  A doua parte a celei de-a doua reguli a generat arcele
UNLOCK B de tip W-R: 1, 3. Arcul 3 e generat luand in
considerare nota de la a doua regula.
F. Radulescu. Curs: Baze de date 65 F. Radulescu. Curs: Baze de date 66

11
ARTICOLE STRUCTURATE
EXEMPLU
IERARHIC  LOCK B
Exista cazuri in care articolele unei baze de  LOCK C
date se pot reprezenta ca nodurile unui arbore.  LOCK D
A

In acest caz exista un protocol care garanteaza  UNLOCK C


serializabilitatea numit protocol de arbore.  LOCK E B H

Acesta este urmatorul:  LOCK F


 Cu exceptia primului articol blocat, nici un  UNLOCK E
C E

articol nu poate fi blocat decat daca tatal  UNLOCK D


sau este deja blocat  UNLOCK F D F G

 Nici un articol nu este blocat de doua ori de


aceeasi tranzactie.

F. Radulescu. Curs: Baze de date 67 F. Radulescu. Curs: Baze de date 68

ETICHETE-TIMP ETICHETE-TIMP – cont.


Se poate efectua un control al corectitudinii O tranzactie sesizeaza incalcarea ordinii seriale
executiei concurente a mai multor tranzactii (in care caz ea trebuie abortata si relansata
 Fara mecanisme de blocare. ulterior) in urmatoarele doua cazuri:
 Utilizand etichete-timp (timestamps)  O tranzactie incearca sa citeasca un articol scris in
viitor
In acest caz:  O tranzactie vrea sa scrie un articol citit in viitor.
 Fiecare articol are asociate doua etichete-timp: una Urmatoarele operatii sunt insa valide:
de citire iar cealalta de scriere.
 Fiecare tranzactie are asociata o eticheta timp (de  O tranzactie incearca sa citeasca un articol citit in
exemplu: momentul lansarii tranzactiei) viitor
 Cand o tranzactie citeste sau scrie un articol, se  O tranzactie incearca sa scrie un articol scris in
actualizeaza eticheta-timp corespunzatoare a viitor (in acest caz ea nu scrie articolul dar isi
articolului respectiv la valoarea etichetei-timp a continua executia).
tranzactiei.
F. Radulescu. Curs: Baze de date 69 F. Radulescu. Curs: Baze de date 70

Sfarsitul cursului 11

F. Radulescu. Curs: Baze de date 71

12
Cursul 11 Ce este
Limbajul SQL este un limbaj de cereri de nivel
inalt, neprocedural.
Printr-o cerere se specifica ce doreste sa
obtina utilizatorul si nu si cum se ajunge la
rezultat.
OPTIMIZAREA Modalitatea de obtinere a acestuia ramane in
sarcina sistemului de gestiune care trebuie sa
CERERILOR aleaga cea mai putin costisitoare cale.
Costul este masurat de obicei prin timpul de
executie care, asa cum spune si definitia
bazei de date din capitolul introductiv, trebuie
sa fie rezonabil.
F. Radulescu. Curs: Baze de date 1 F. Radulescu. Curs: Baze de date 2

Ce este Ce este
Pentru reducerea timpului de raspuns
Supuse optimizarii sunt in primul rand cererile
sistemul efectueaza o serie de de regasire de date (de tip SELECT in SQL).
modificari ale cererii transformand-o Trebuie avut insa in vedere ca si celelalte
intr-o cerere echivalenta dar care se cereri de tip DML au nevoie de optimizari:
pentru a actualiza sau sterge anumite linii
poate executa mai rapid. dintr-o tabela ele trebuiesc intai localizate iar
Aceasta operatie poarta numele de in cazul inserarilor trebuie verificat daca
informatia nu exista deja in tabela.
optimizarea cererii. In plus o serie de cereri de tip DDL si DCL
includ operatii de regasire de date care
implicit sunt optimizate de SGBD.
F. Radulescu. Curs: Baze de date 3 F. Radulescu. Curs: Baze de date 4

Elemente de cost Elemente de cost


In cazul bazelor de date centralizate (BDC), Sa presupunem ca procesul de calcul
un aspect foarte important in contextul
optimizarii cererilor este minimizarea
se desfasoara astfel:
numarului de accese la disc. citim numarul maxim posibil de
Sa luam exemplul unui produs cartezian blocuri din R (adica b-1 blocuri) si
intre doua relatii de cate doua atribute, fie
ele R si S, avand r respectiv s tupluri. pentru fiecare inregistrare din R citim
Fie nr respectiv ns numarul de tupluri din in intregime, in ultimul bloc disponibil,
fiecare relatie care incap intr-un bloc pe relatia S.
disc, si b numarul de blocuri disponibile
in memoria interna a calculatorului.
F. Radulescu. Curs: Baze de date 5 F. Radulescu. Curs: Baze de date 6

1
Elemente de cost Elemente de cost
Atunci: Deci numarul de accese la disc este in
Numarul de blocuri citite pentru a parcurge total:
relatia R este: Numarul de blocuri din R + Numarul de parcurgeri ale
lui S * Numarul de blocuri din S:
Numarul de parcurgeri al relatiei S este

care se poate rescrie si ca:


Pentru o parcurgere a relat un numar de
blocuri egal cu:

F. Radulescu. Curs: Baze de date 7 F. Radulescu. Curs: Baze de date 8

Elemente de cost Join


In cazul relatiilor cu numar mare de In implementarea joinurilor, se folosesc de
tupluri aceasta expresie denota timpi asemenea diverse metode:
mari pentru executia unei astfel de  sortarea uneia dintre relatii dupa atributele
cereri. implicate in join (in cazul echijoinului)
 folosirea indecsilor (daca exista) pe campurile
In cazul de mai sus, deoarece numarul implicate in join, pentru acces direct la tuplurile
de accese este influentat mai puternic care dau elemente ale rezultatului.
de r/nr decat de s/ns, vom lua ca  micsorarea numarului de tupluri luate in calcul,
relatie R pe cea care are acest raport prin aplicarea mai intai a selectiilor, daca acestea
mai mic. sunt prezente in cerere.

F. Radulescu. Curs: Baze de date 9 F. Radulescu. Curs: Baze de date 10

Strategii Strategii
In general, exista o serie de principii 3. Combinarea secventelor de
(strategii) care duc la micsorarea numarului operatii unare (selectii si proiectii)
de accese la disc. Ele sunt urmatoarele intr-una singura (o selectie sau/si o
(vezi si [Ul 82] - Ullman, J.D. Principles of proiectie)
Database Systems, Second Edition, Computer 4. Cautarea subexpresiilor comune,
Science Press, 1982): pentru a fi evaluate o singura data.
1. Realizarea selectiilor cit mai devreme
5. Folosirea indecsilor sau sortarea
posibil.
relatiilor, daca se obtine o crestere a
2. Combinarea anumitor selectii cu produse performantelor.
carteziene adiacente pentru a forma un join.
F. Radulescu. Curs: Baze de date 11 F. Radulescu. Curs: Baze de date 12

2
Strategii Echivalente
6. Evaluarea diverselor strategii Pentru rescrierea unei expresii in algebra
relationala in vederea optimizarii costurilor de
posibile inainte de a incepe procesul evaluare se pot folosi urmatoarele
de calcul efectiv (in cazul in care sunt echivalente:
posibile mai multe metode de calcul) 1. Comutativitatea joinului si a produsului
pentru a alege pe cea mai eficienta. cartezian:
Pe baza acestor principii, exista o E1 × E2 ≡ E2 × E1
E1 >< E2 ≡ E2 >< E1
serie de algoritmi de optimizare pentru
E1 ><F E2 ≡ E2 ><F E1
evaluarea expresiilor relationale.

F. Radulescu. Curs: Baze de date 13 F. Radulescu. Curs: Baze de date 14

Echivalente Echivalente
2. Asociativitatea produsului cartezian si 3. Cascada de proiectii:
a joinului: πA1...An (πB1...Bm(E)) ≡ πA1...An (E). Se
E1 × (E2 × E3) ≡ (E1 × E2) × E3 presupune bineinteles ca {Ai} ⊆ {Bj}
E1 >< (E2 >< E3) ≡ (E1 >< E2) >< E3 4. Cascada de selectii:
E1 ><F1 (E2 ><F2 E3) ≡ (E1 ><F1 E2) σF1(σF2(E)) ≡ σ F1 ∧ F2 (E)
><F2 E3

F. Radulescu. Curs: Baze de date 15 F. Radulescu. Curs: Baze de date 16

Echivalente Echivalente
5. Comutativitatea selectiilor cu 6. Comutativitatea selectiei cu produsul
proiectiile: cartezian:
Daca F contine doar atribute din Daca toate atributele din F fac parte din E1:
A1...An atunci: σ F (E1 × E2) ≡ σ F (E1) × E2
Daca F = F1 ∧ F2 cu F1 continand doar
πA1...An(σF (E) ) ≡ σF (πA1...An(E) ) atribute din E1 si F2 doar din E2:
Sau, in cazul general – F contine si alte σ F (E1 × E2) ≡ σ F1 (E1) × σ F2 (E2)
atribute, B1...Bm - atunci: Daca F = F1 ∧ F2 cu F1 continand doar
πA1...An(σF (E) ) ≡ πA1...An(σF ( πA1...An, B1 … Bm atribute din E1 dar F2 e o expresie generala:
(E) ) ) σ F (E1 × E2) ≡ σ F2 ( σ F1 (E1) × E2)
F. Radulescu. Curs: Baze de date 17 F. Radulescu. Curs: Baze de date 18

3
Echivalente Echivalente
7. Comutativitatea selectie – reuniune: 9. Comutativitatea proiectie – produs
σ F (E1 ∪ E2) ≡ σ F (E1) ∪ σ F (E2) cartezian:
Daca in lista A1...An atributele B1...Bm
sunt din E1 iar C1...Ck din E2 atunci:
8. Comutativitatea selectie – diferenta: πA1...An(E1 × E2) ≡ πB1...Bm(E1) × πC1...Ck(E2)
σ F (E1 − E2) ≡ σ F (E1) − σ F (E2) 10. Comutativitatea proiectie –
reuniune:
πA1...An(E1 ∪ E2) ≡ π A1...An (E1) ∪ πA1...An
(E2)
F. Radulescu. Curs: Baze de date 19 F. Radulescu. Curs: Baze de date 20

Algoritm de optimizare Algoritm de optimizare


In lucrarea [Ul 82] este prezentat un Metoda:
algoritm de optimizare a expresiilor Pasul 1. Fiecare selectie este
relationale. Acesta este urmatorul: transformata folosind regula 4 intr-o
Intrare: un arbore reprezentand o cascada de selectii:
expresie relationala. σ F1 ∧ F2 ∧ ... Fn (E) ≡
Iesire: program pentru evaluarea σ F1 (σ F2 ( ...(σ Fn (E) ) ...) )
expresiei. Pasul 2. Fiecare selectie este deplasata
in jos folosind regulile 4-8 cât mai
aproape de frunze.
F. Radulescu. Curs: Baze de date 21 F. Radulescu. Curs: Baze de date 22

Algoritm de optimizare Algoritm de optimizare


Pasul 3. Folosind regulile 3, 5, 9 si 10, Pasul 4. Cascadele de selectii si proiectii
fiecare proiectie este deplasata cât mai sunt combinate folosind regulile 3-5
jos posibil in arborele sintactic. intr-o singura selectie, o singura
Regula 3 face ca unele proiectii sa proiectie sau o selectie urmata de o
dispara, regula 5 sparge o proiectie in proiectie.
doua astfel incat una poate migra spre Aceasta abordare tine de eficienta: e
frunze. mai putin costisitor sa se faca o singura
Daca o proiectie ajunge sa fie dupa selectie si apoi o singura proiectie decat
toate atributele ea dispare. daca s-ar alterna de mai multe ori
selectii cu proiectii.
F. Radulescu. Curs: Baze de date 23 F. Radulescu. Curs: Baze de date 24

4
Algoritm de optimizare Algoritm de optimizare
Pasul 5. Nodurile interioare ale arborelui Pasul 6. Se evalueaza fiecare grup astfel
rezultat sunt impartite in grupuri.
Fiecare nod intern care corespunde unei
incat niciunul nu este evaluat inaintea
operatiuni binare devine un grup impreuna cu descendentilor sai.
predecesorii sai imediati cu care sunt asociate
operatiuni unare. Rezulta astfel un program de evaluare
Din bloc fac parte de asemenea orice lant de a expresiei relationale initiale.
noduri succesoare asociate cu operatiuni
unare si terminate cu o frunza cu exceptia
cazului când operatia binara este un produs
cartezian neurmat de o selectie cu care sa
formeze un echijoin.
F. Radulescu. Curs: Baze de date 25 F. Radulescu. Curs: Baze de date 26

Exemplu Exemplu
Exemplu: Fie o baza de date care Fie de asemenea o expresie relationala
implementeaza o diagrama entitate asociere
formata din 2 entitati (Student, Disciplina) si
care afiseaza numele studentului si
o asociere binara multi-multi Nota continand notele sale pentru studentul cu numele
notele studentilor si data obtinerii lor ca „Ionescu” si note obtinute obtinute
atribute proprii. pana la 1 iulie 2009:
Structura simplificata a bazei de date este
urmatoarea: π NumeS, NumeD, Nota (σ Data < 1-Jul-2009 (σ
Stud (IdS, NumeS, ...) Disc.IdD = Nota.IdD ∧ Stud.IdS = Nota.IdS and NumeS =
Disc (IdD, NumeD, ...) ‘Ionescu’ ( (Stud x Nota) x Disc)))
Nota (IdS, IdD, Nota, Data)

F. Radulescu. Curs: Baze de date 27 F. Radulescu. Curs: Baze de date 28

Exemplu – arbore initial Exemplu


Aplicand algoritmul prezentat:
π NumeS, NumeD, Nota  Selectia dupa data va ajunge pe ramura tabelei Nota
 Conditia de join se va sparge in trei:
σ Data < 1-Jul-2009  o conditie pentru echijoinul Stud cu Nota
 alta pentru echijoinul rezultatului primului join cu Disc si
 o conditie dupa numele studentului care coboara pe ramura
σ Disc.IdD = Nota.IdD ∧ Stud.IdS = Nota.IdS and NumeS = ‘Ionescu’
respectiva.
 Regula 5 generalizata va duce la adaugarea unor
× proiectii care lasa sa treaca mai departe de la frunze
× Disc doar atributele necesare operatiilor ulterioare.
 Rezultatul obtinut este urmatorul:
Stud Nota

F. Radulescu. Curs: Baze de date 29 F. Radulescu. Curs: Baze de date 30

5
Exemplu – arbore rezultat Planul rezultat
π NumeS, NumeD, Nota

σ Disc.IdD = Nota.IdD
Se observa formarea a doua grupuri
care se evalueaza in ordinea mentionata
×
in algoritm: intai grupul de jos si apoi
σ Stud.IdS = Nota.IdS π IdD, NumeD
grupul de sus care foloseste rezultatul
× Disc
primului grup.
πIdS, NumeS π IdS, IdD, Nota Pentru fiecare grup produsul cartezian
σ NumeS= ’Ionescu’ σ Data < 1-Jul-2009
si selectia se pot combina intr-un
Stud Nota
echijoin.

F. Radulescu. Curs: Baze de date 31 F. Radulescu. Curs: Baze de date 32

Studiu de caz: MySQL EXPLAIN


In cazul MySQL putem obtine informatii EXPLAIN este folosit pentru a obtine
despre modul in care sistemul va informatii despre modul in care serverul
executa o cerere folosind comanda executa o cerere.
EXPLAIN. Daca EXPLAIN precede o cerere
In urma examinarii rezultatului acesteia SELECT vor fi afisate informatii furnizate
putem decide sa facem schimbari in de optimizatorul de cereri despre planul
organizarea datelor (creare de indecsi) de executie al regasirii respective,
sau sa fortam folosirea sau nefolosirea inclusiv despre modul in care se
unor indecsi. efectueaza eventualele joinuri si in ce
Aceste schimbari au ca scop cresterea ordine.
vitezei de evaluare a cererii.
F. Radulescu. Curs: Baze de date 33 F. Radulescu. Curs: Baze de date 34

Exemplul 1 Exemplul 2
Un prim exemplu: o cerere pe o tabela, Un alt exemplu: cerere cu join continand
fara subcereri: o subcerere. Cererea returneaza numele
studentului si numele specializarii pentru
studentul avand cel mai mare punctaj:

F. Radulescu. Curs: Baze de date 35 F. Radulescu. Curs: Baze de date 36

6
Coloana id Coloana select_type
Coloanele rezultatului comenzii EXPLAIN select_type: Tipul cererii SELECT. In
sunt urmatoarele: MySQL 5.5 avem urmatoarele tipuri:
Id: Identificatorul cererii SELECT.
SIMPLE: SELECT fara UNION ori
In Exemplul 2 sunt 2 cereri SELECT, cea
principala si subcererea care returneaza
subcereri
maximul. PRIMARY: SELECT exterior (cererea
In rezultat sunt 3 linii deparece sunt 3 principala)
parcurgeri de tabela: doua in cererea UNION: Al doilea sau urmatoarele
principala (care e un join) si una in
subcerere.
SELECT dintr-un UNION
F. Radulescu. Curs: Baze de date 37 F. Radulescu. Curs: Baze de date 38

Coloana select_type Coloana select_type


DEPENDENT UNION: Al doilea sau SUBQUERY: Primul SELECT din
urmatoarele SELECT dintr-un UNION, subcerere
dependent de cererea de nivel DEPENDENT SUBQUERY: Primul
superior SELECT din subcerere, dependent de
UNION RESULT: Resultatul unui cererea de nivel superior (se
UNION. evalueaza pentru fiecare set de valori
distinct provenit din aceasta)

F. Radulescu. Curs: Baze de date 39 F. Radulescu. Curs: Baze de date 40

Coloana select_type Coloana table


DERIVED: SELECT in subcerere pe Tabela parcursa. In cazul unui join sunt
clauza FROM mai multe tabele si vom avea in rezultat
cate o linie pentru fiecare parcurgere.
UNCACHEABLE SUBQUERY: O
subcerere al carei rezultat trebuie
reevaluat pentru fiecare linie din
cererea de nivel superior

F. Radulescu. Curs: Baze de date 41 F. Radulescu. Curs: Baze de date 42

7
Coloana partitions Coloana partitions
partitions: Doar cand se foloseste clauza Pentru a vedea eventualele partitii
PARTITIONS: partitia din care vor fi luate pentru o tabela existenta se poate folosi
comanda SHOW CREATE TABLE:
liniile. Aceste partitii se speciifica la
crearea tabelei (daca e cazul).

F. Radulescu. Curs: Baze de date 43 F. Radulescu. Curs: Baze de date 44

Coloana type Coloana type


type: Tipul de join. ALL semnifica 'full const: tabela are o singura linie care
table scan' (parcurgerea tuturor liniilor). corespunde rezultatului cererii, linie care e
Exista mai multe valori pentru aceasta citita la inceput iar valorile respective sunt
coloana: ca niste constante.
system: tabela are o singura linie = e
tabela de sistem Apare cand se compara o cheie unica sau
primara cu o valoare constanta.
SELECT * FROM tbl_name
WHERE primary_key=1;
SELECT * FROM tbl_name
WHERE primary_key_part1=1 AND
primary_key_part2=2;

F. Radulescu. Curs: Baze de date 45 F. Radulescu. Curs: Baze de date 46

Coloana type Coloana type


eq_ref: din tabela se citeste o singura Exemplu caz eq_ref:
linie pentru fiecare combinatie de linii SELECT * FROM ref_table,other_table
din tabelele precedente. WHERE ref_table.key_column =
other_table.colum;
Apare de exemplu atunci cand se
compara pentru egalitate coloane SELECT * FROM ref_table,other_table
indexate. WHERE ref_table.key_column_part1 =
other_table.column AND
Ca si la system si const evaluarea ref_table.key_column_part2 = 1;
joinului e foarte rapida.

F. Radulescu. Curs: Baze de date 47 F. Radulescu. Curs: Baze de date 48

8
Coloana type Coloana type
ref: sunt citite din tabela toate liniile cu Se foloseste un astfel de join pentru
aceeasi valoare de index pentru fiecare comparatii cu = si <=> (NULL safe equal) pe
combinatie de linii din tabelele precedente. coloane indexate.
De exemplu atunci cand se face un join care NULL safe equal - exemple:
foloseste doar partea stanga a unei chei
multiple (care identifica mai multe linii si nu mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
una) sau daca e vorba de un index ne-unic. Returneaza: 1, 1, 0 mysql>
SELECT 1 = 1, NULL = NULL, 1 = NULL;

Returneaza: 1, NULL, NULL

F. Radulescu. Curs: Baze de date 49 F. Radulescu. Curs: Baze de date 50

Coloana type Coloana type


 Exemplu caz ref (key_column e un index ne-unic): fulltext: join folosind un index de tip
SELECT * FROM ref_table WHERE
key_column=expr;
FULLTEXT (la regasire, in loc de LIKE se
SELECT * FROM ref_table,other_table poate folosi MATCH(…)…AGAINST(…).
WHERE ref_or_null: este ca ref dar se face si
ref_table.key_column=other_table.column; o cautare pentru linii care contin NULL.
SELECT * FROM ref_table,other_table
Este folosit pentru optimizarea lui IS
WHERE ref_table.key_column_part1 =
other_table.column NULL sau in subcereri.
AND ref_table.key_column_part2 = 1; SELECT * FROM ref_table
WHERE key_column = expr OR key_column IS
NULL;
F. Radulescu. Curs: Baze de date 51 F. Radulescu. Curs: Baze de date 52

Coloana type Coloana type


index_merge: se foloseste optimizarea de Exemple de cereri de tip index_merge:
tip 'index merge'. SELECT * FROM tbl_name WHERE key1 = 10 OR
Se foloseste cand rezultatul cererii se poate key2 = 20;
obtine prin unirea mai multor rezultate SELECT * FROM tbl_name WHERE (key1 = 10
partiale provenite din parcurgeri de tip range OR key2 = 20) AND non_key=30;
(descrise peste cateva slide-uri). SELECT * FROM t1, t2 WHERE (t1.key1 IN
(1,2) OR t1.key2 LIKE 'value%') AND
In coloana key din rezultatul EXPLAIN se t2.key1=t1.some_col;
spune care sunt indecsii folositi (vezi mai jos). SELECT * FROM t1, t2 WHERE t1.key1=1 AND
(t2.key1=t1.some_col OR
t2.key2=t1.some_col2);
F. Radulescu. Curs: Baze de date 53 F. Radulescu. Curs: Baze de date 54

9
Coloana type Coloana type
unique_subquery: este folosit in loc de ref range: doar liniile care au valori intr-o
pentru cereri cu IN. Subcererea e inlocuita cu anumita plaja sunt regasite, utilizand un
o cautare in index (cheia primara are automat index.
unul):
value IN (SELECT primary_key FROM In coloana key din rezultatul EXPLAIN
single_table WHERE some_expr) se spune care este acesta.
index_subquery: ca si unique_subquery, E folosit la joinuri cu operatii de
dar pentru indecsi non-unici: comparatie, IS NULL, BETWEEN sau IN.
value IN (SELECT key_column FROM
single_table WHERE some_expr)
Coloana ref din rezultatul EXPLAIN este
NULL in acest caz.
F. Radulescu. Curs: Baze de date 55 F. Radulescu. Curs: Baze de date 56

Coloana type Coloana type


SELECT * FROM tbl_name WHERE index: este la fel ca ALL dar se parcurge
key_column = 10; indexul nu datele.
SELECT * FROM tbl_name WHERE ALL: o parcurgere completa a tabelei este
key_column BETWEEN 10 and 20; efectuata pentru fiecare combinatie de linii
SELECT * FROM tbl_name WHERE din tabelele precedente.
key_column IN (10,20,30); O astfel de strategie nu este de dorit in cazul
SELECT * FROM tbl_name WHERE in care tabela are mai multe linii.
key_part1 = 10 AND key_part2 IN Pentru a impiedica acest mod de calcul al
(10,20,30); joinului se pot adauga indecsi care sa creasca
viteza.
F. Radulescu. Curs: Baze de date 57 F. Radulescu. Curs: Baze de date 58

Coloana possible_keys Coloana key


possible_keys: Indecsi posibil de key: Indexul ales. E posibil sa nu fie
utilizat. dintre cele de mai sus ci unul care
Are valoarea NULL daca nu exista contine toate coloanele regasite
indecsi relevanti. (parcurgerea tabelei se face prin index -
Executia se poate imbunatati in acest index scan).
caz prin crearea de indecsi pe coloanele Observatie: Pentru a forta folosirea
folosite in WHERE. unui index sau nefolosirea lui se pot
Indecsii unei tabele se pot vizualiza cu folosi clauzele FORCE INDEX, USE
SHOW INDEX FROM nume_tabela; INDEX sau IGNORE INDEX.
F. Radulescu. Curs: Baze de date 59 F. Radulescu. Curs: Baze de date 60

10
Coloana key_len Coloanele ref si rows
key_len: lungimea cheii alese. Poate ref: aici sunt listate coloanele sau
arata cate parti ale unui index multiplu constantele comparate cu indexul al
sunt folosite; NULL in cazul in care carui nume este pe coloana key.
coloana key e NULL rows: Numarul estimate de linii
examinate. Pentru stocarea de tip
InnoDB acest numar este o estimare si
poate sa nu fie intotdeauna exact.

F. Radulescu. Curs: Baze de date 61 F. Radulescu. Curs: Baze de date 62

Coloanele filtered si extra EXPLAIN EXTENDED


filtered: Procentul de linii indicate de In acest caz rezultatul include si
conditia pe acea tabela. Apare doar la coloana filtered:
EXPLAIN EXTENDED
extra: Informatii aditionale (vezi
documentatia indicata mai jos).
Mai multe informatii despre coloanele
rezultatului pot fi gasite la adresa:
http://dev.mysql.com/doc/refman/5.5/en/explain-output.html

F. Radulescu. Curs: Baze de date 63 F. Radulescu. Curs: Baze de date 64

Exemple prezentare MySQL


Documentatia MySQL
http://dev.mysql.com/doc/refman/5.5/en/using-explain.html
Carte: Baron Schwartz, Peter Zaitsev,
Vadim Tkachenko, High Performance
MySQL, 3rd Edition, O'Reilly Media,
2012 Sfarsitul cursului 13
http://www.it-ebooks.info/book/676/
Se recomanda si parcurgerea
prezentarii:
http://www.percona.com/files/presentations/percona-live/dc-
2012/PLDC2012-mysql-query-optimization.pdf

F. Radulescu. Curs: Baze de date 65 F. Radulescu. Curs: Baze de date 66

11
Cursul 12 NoSQL?
Denumirea de sisteme de tip SQL este
data sistemelor traditionale de gestiune
a bazelor de date, bazate pe modelul
relational al datelor
Acestea sunt foarte bune pentru
Sisteme NoSQL sistemele operationale ale unei
organizatii, companii, etc. dar nu sunt
cea mai buna solutie pentru alte tipuri
de aplicatii, cum ar fi gestionarea unui
volum mare de date.

F. Radulescu. Curs: Baze de date 1 1 F. Radulescu. Curs: Baze de date 1 2

NoSQL? Diferente
Initial, NoSQL desemna folosirea unor Exista o serie de diferente intre un
alte solutii de stocare a datelor, diferite sistem SQL si unul NoSQL.
de cele clasice, si care nu utilizau Se poate face o comparatie intre cele
limbajul SQL. doua tipuri de sisteme prin prisma mai
A aparut apoi o nuantare a acestei multor caracteristici care pot fi (vezi si
acceptiuni: actualmente NoSQL [Widom, 1]):
desemneaza solutii de stocare care pot
sa imbine stocarea clasica, relationala,
cu alte metode de stocare.
Acum NoSQL = Not only SQL
F. Radulescu. Curs: Baze de date 1 3 F. Radulescu. Curs: Baze de date 1 4

Diferente 1. Adaptare …
Caracteristici: In cazul unui sistem clasic (SQL),
1. Adaptare la necesitatile aplicatiilor acesta are:
 Un model simplu de stocare (date sub
2. Multi-user forma de tabele)
3. Acces securizat  Un limbaj de cereri declarativ (cum este
4. Persistenta datelor SQL)
 Mecanisme de garantare a tranzactiilor.
5. Siguranta in functionare
Nu intotdeauna insa toate aceste
6. Lucrul cu masive de date caracteristici sunt utile sau usor de
7. Eficienta folosit.
F. Radulescu. Curs: Baze de date 1 5 F. Radulescu. Curs: Baze de date 1 6

1
Model simplu Limbaj declarativ
In ceea ce priveste simplitatea Limbajul de cereri declarativ – SQL -
modelului: nu intotdeauna datele de este un plus in cazul aplicatiilor de tip
stocat au o forma tabelara in mod întreprindere dar are si dezavantaje.
natural.
Fiind un limbaj complet, care poate
In acest caz este necesara efectua intreaga gama de operatii,
preprocesarea lor pentru a le aduce la aduce cu sine un overhead de sistem
aceasta forma. care poate fi semnificativ

F. Radulescu. Curs: Baze de date 1 7 F. Radulescu. Curs: Baze de date 1 8

Limbaj declarativ Garantarea tranzactiilor


Exista o serie de aplicatii care nu au Uneori aceasta cerinta nu este atat de
nevoie decat de o mica parte a importanta – de exemplu in cazul
facilitatilor unui astfel de limbaj – de stocarii datelor pentru un motor de
exemplu doar cautarea si incarcarea de cautare unde operatiile sunt foarte
perechi cheie valoare. simple.
De aceea sistemele NoSQL pun la Overhead-ul unui sistem SQL reprezinta
dispozitie doar strictul necesar in in acest caz un dezavantaj.
aceasta privinta (eventual nici nu au un Sistemele NoSQL pot avea facilitati mai
limbaj de cereri ci doar un API). reduse in aceasta privinta.

F. Radulescu. Curs: Baze de date 1 9 F. Radulescu. Curs: Baze de date 1 10

2. Multi-user 3. Acces securizat


In cazul unor aplicatii – de exemplu Aceasta caracteristica este utila atat in
stocarea datelor pentru motoarele de cazul sistemelor traditionale (SQL) cat si
cautare, deja mentionata – nu este in cazul sistemelor NoSQL.
cazul de a lua atat de multe masuri Exista insa o serie de aplicatii in care nu
pentru pastrarea consistentei acestora este atat de importanta, iar sistemele
in cazul accesului simultan. NoSQL au mecanisme mai putin
Un sistem clasic (SQL) consuma in complicate pentru accesul utilizatorilor
acest caz multe resurse inutil. Un exemplu: in cazul in care prelucrarile
se fac off-line.

F. Radulescu. Curs: Baze de date 1 11 F. Radulescu. Curs: Baze de date 1 12

2
4. Persistenta datelor 5. Siguranta in functionare
Aceasta caracteristica este importanta Si aceasta caracteristica este
atat pentru sisteme SQL cat si pentru importanta atat pentru sisteme SQL cat
cele NoSQL. si pentru cele NoSQL.
In cazul celor din urma insa nu sunt Exista insa cazuri in care se lucreaza pe
intotdeauna necesare mecanisme date care pot fi restaurate in intregime
complicate de organizare a datelor pe (de exemplu cand se lucreaza pe un
disc, sistemele NoSQL putand utiliza depozit de date pentru a calcula
inclusiv doar fisiere simple. statistici sau pentru extragere de
cunostinte din date – data mining.
Cerintele in acest caz pot fi mai mici
pentru sistemele NoSQL.
F. Radulescu. Curs: Baze de date 1 13 F. Radulescu. Curs: Baze de date 1 14

6. Lucrul cu masive de date 7. Eficienta


In privinta ultimelor doua caracteristici – Din cauza volumelor mari de date care
lucrul cu masive de date si eficienta – trebuie prelucrate in timp util, cerintele
cerintele sunt mai mari in cazul sistemelor privind eficienta (incluzand viteza de
NoSQL decat in cazul celor traditionale. prelucrare) sunt mult mai mari decat la
De exemplu, in cazul retelelor de un sistem clasic.
socializare, volumul de date colectat in De aceea solutiile includ de obicei
unitatea de timp este enorm operarea paralela pe date.
De aceea cerintele privind facilitatile de
lucru cu volume mari de date sunt mai
mari decat in cazul unui sistem traditional.

F. Radulescu. Curs: Baze de date 1 15 F. Radulescu. Curs: Baze de date 1 16

Deci Dezavantaje
Sistemele NoSQL au deci cateva In unele cazuri nu exista un limbaj
caracteristici care le diferentiaza de cele declarativ de operare. Rezulta ca
traditionale: operarea se poate face doar scriind
1. O schema flexibila a datelor programe de acces.
2. Sunt usor si ieftin de instalat Relaxarea consistentei nu le face o
solutie buna pentru aplicatii care au
3. Scalabilitate – lucrul cu volume mari de nevoie de garantarea consistentei, a
date serializabilitatii si a tranzactiilor.
4. Consistenta datelor este relaxata
pentru a creste performantele si
disponibilitatea.
F. Radulescu. Curs: Baze de date 1 17 F. Radulescu. Curs: Baze de date 1 18

3
Tipuri de sisteme NoSQL MapReduce
In [Widom 2] sunt enumerate patru Introdus de cei de la Google.
categorii de sisteme NoSQL: In momentul de fata exista varianta
1. Framework-ul MapReduce open source Hadoop.
2. Stocare cheie-valoare In acest caz nu exista un model de
3. Stocare documente date, acestea fiind stocate in fisiere.
4. Baze de date de grafuri Exista doua sisteme de fisiere folosite,
Google File System (GFS) pentru
MapReduce (Google) si Hadoop
Distributed File System (HDFS) pentru
Hadoop.
F. Radulescu. Curs: Baze de date 1 19 F. Radulescu. Curs: Baze de date 1 20

Functii Functii
Framework-ul - care asigura o Printre functiile care trebuie furnizate
functionare distribuita - furnizeaza toate de utilizator exista doua care dau si
caracteristicile necesare pentru numele de mai sus, si anume functia
functionare, inclusiv toleranta la defecte map() si functia reduce() .
si scalabilitatea. Pe langa acestea sunt si alte functii
Pentru a il folosi utilizatorul trebuie sa care in mod normal trebuie sa existe:
scrie un set de functii necesare  reader() este o functie care citeste datele
prelucrarii. din fisiere si le returneaza ca inregistrari
 writer() ia inregistrarile produse si le scrie
in fisiere

F. Radulescu. Curs: Baze de date 1 21 F. Radulescu. Curs: Baze de date 1 22

Map Map
Functia map() imparte o problema in Aceste instante ale lui map() primesc
subprobleme. date de la mai multe instante ale lui
Ea primeste un articol de date - o reader() care si ele lucreaza in paralel.
inregistrare furnizata de functia reader() Datele sunt citite de reader() din
- si returneaza un numar (>=0) de fisierele de date care reprezinta
perechi (cheie, valoare). adevarata intrare in sistem.
Cum prelucrarea este paralela, exista
mai multe instante ale lui map() care
lucreaza in paralel.

F. Radulescu. Curs: Baze de date 1 23 F. Radulescu. Curs: Baze de date 1 24

4
Reduce Exemplu
Functia reduce() primeste o cheie si o  Numarare aparitii cuvinte (Sursa: [Dean, Ghemawat])
lista de valori asociate si returneaza un map(String input_key, String input_value):
numar de inregistrari (>=0). // input_key: document name
// input_value: document contents
Iesirea lui reduce() este scrisa de for each word w in input_value: EmitIntermediate(w, "1");

writer() in fisierele de date de iesire. reduce(String output_key, Iterator intermediate_values):


// output_key: a word
Intrarea functiei reduce() este data de // output_values: a list of counts
int result = 0;
iesirile din instantele functiei map(). for each v in intermediate_values:
result += ParseInt(v);
Emit(AsString(result));

F. Radulescu. Curs: Baze de date 1 25 F. Radulescu. Curs: Baze de date 1 26

MapReduce Executie
Figurile urmatoare se gasesc in articolul
[Dean, Ghemawat] publicat de Google:
http://research.google.com/archive/mapr
educe-osdi04-slides/index.html

F. Radulescu. Curs: Baze de date 1 27 F. Radulescu. Curs: Baze de date 1 28

Executie paralela Limbaje pentru MapReduce


Pentru cei care nu doresc sa faca
munca de programare necesara in acest
caz au fost dezvoltate si pachete care
se pun peste Hadoop sau MapReduce:
 Apache Hive este o infrastructura de tip
data warehouse construita peste Hadoop
pentru a furniza utilizatorului sumarizarea
datelor, limbaj de cereri (tip SQL) si analiza
datelor.
 Pig - seamana cu algebra relationala
 Dryad, etc
F. Radulescu. Curs: Baze de date 1 29 F. Radulescu. Curs: Baze de date 1 30

5
Tipuri de sisteme NoSQL Stocarea cheie - valoare
1. Framework-ul MapReduce In acest caz se stocheaza perechi de
2. Stocare cheie-valoare forma <cheie, valoare>.
3. Stocare documente Este un model de date foarte simplu
dar care este util in multe cazuri.
4. Baze de date de grafuri
Operatiile principale sunt:
 Insert(cheie, valoare) - inserarea unei noi perechi
 Fetch(cheie) - incarcarea de valori dupa cheie
 Update(cheie) - actualizare dupa cheie
 Delete(cheie) - stergere dupa cheie

F. Radulescu. Curs: Baze de date 1 31 F. Radulescu. Curs: Baze de date 1 32

Implementare Implementare
Inregistrarile continand perechi sunt Fiecare operatie este o tranzactie.
distribuite in noduri pe baza valorii Consistenta intarziata: copiile replicate
cheii. ale unei aceleiasi inregistrari nu sunt
In acest fel cautarea unei anumite chei mereu identice ci doar la sfarsitul
se face doar in nodurile unde este procesarii datelor (dupa 'convergenta').
posibil sa se gaseasca acea valoare Eventual consistency este definita astfel
Replicare: aceeasi pereche se gaseste in articolul De-mystifying “eventual
in mai multe noduri (duplicate). Exista o consistency” in distributed systems
consistenta intarziata - vezi mai jos. publicat de Oracle - vezi si
http://www.oracle.com/technetwork/products/nosqldb/documentation/consistency-explained-1659908.pdf

F. Radulescu. Curs: Baze de date 1 33 F. Radulescu. Curs: Baze de date 1 34

Eventual consistency Valori


 A distributed system maintains copies of its data on multiple machines in order
to provide high availability and scalability. Valorile din perechile <cheie, valoare>
 When an application makes a change to a data item on one machine, that nu sunt uniforme (ca tip) si unele pot fi
change has to be propagated to the other replicas. structurate.
 Since the change propagation is not instantaneous, there’s an interval of time
during which some of the copies will have the most recent change, but others
Operatia FETCH este uneori extinsa, ea
won’t. In other words, the copies will be mutually inconsistent. incarcand inregistrari care au cheia intr-
 However, the change will eventually (RO: in cele din urma) be propagated to all o plaja de valori - deci nu doar pentru o
the copies, and hence the term “eventual consistency”. singura valoare a cheii.
 The term eventual consistency is simply an acknowledgement that there is an
unbounded delay in propagating a change made on one machine to all the other
Exemple de sisteme: GoogleBigTable,
copies. Amazon Dynamo, Hbase, etc.
 Eventual consistency is not meaningful or relevant in centralized (single copy)
systems since there’s no need for propagation.

F. Radulescu. Curs: Baze de date 1 35 F. Radulescu. Curs: Baze de date 1 36

6
Tipuri de sisteme NoSQL Stocare documente
1. Framework-ul MapReduce Sistemele de stocare documente
2. Stocare cheie-valoare (document stores, magazii de
documente) pot fi considerate tot
3. Stocare documente sisteme pentru perechi <cheie,
4. Baze de date de grafuri valoare>, valoarea fiind un document .
Tipurile de documente care pot fi
stocate difera in functie de sistem.
Putem avea diverse formate: JSON
(Java Script Object Notation), XML, alte
formate semistructurate
F. Radulescu. Curs: Baze de date 1 37 F. Radulescu. Curs: Baze de date 1 38

Exemplu de fisier JSON Acelasi fisier in XML


{"menu": {
"id": "file", <menu id="file" value="File">
<popup>
"value": "File",
<menuitem value="New" onclick="CreateNewDoc()" />
"popup": {
<menuitem value="Open" onclick="OpenDoc()" />
"menuitem": [ <menuitem value="Close" onclick="CloseDoc()" />
{"value": "New", "onclick": "CreateNewDoc()"}, </popup>
{"value": "Open", "onclick": "OpenDoc()"}, </menu>
{"value": "Close", "onclick": "CloseDoc()"}
(Sursa: http://json.org/example.html)
]
}
}}
F. Radulescu. Curs: Baze de date 1 39 F. Radulescu. Curs: Baze de date 1 40

Operatii Tipuri de sisteme NoSQL


Operatiile principale sunt ca si inainte 1. Framework-ul MapReduce
Insert, Fetch, Update si Delete, operatii 2. Stocare cheie-valoare
bazate pe cheie.
3. Stocare documente
Exista de asemenea Fetch pe baza
continutului documentului. 4. Baze de date de grafuri
Exemple de sisteme:
 MongoDB
 CouchDB
 SimpleDB, etc

F. Radulescu. Curs: Baze de date 1 41 F. Radulescu. Curs: Baze de date 1 42

7
Baze de date de grafuri Exemplu
In acest caz obiectele sunt noduri si
arce.
Nodurile au proprietati (perechi <cheie,
valoare>, de exemplu <ID, 3451>)
Arcele pot avea etichete sau roluri.
Un exemplu este urmatorul:
http://en.wikipedia.org/wiki/File:GraphDatabase_PropertyGraph.png

F. Radulescu. Curs: Baze de date 1 43 F. Radulescu. Curs: Baze de date 1 44

Bibliografie
 [Widom 1] Jennifer Widom – NoSQL System –
Motivation, 2011
http://www.youtube.com/watch?v=w0lPQZz7qjw
 [Widom 2] Jennifer Widom – NoSQL System –
Overview, 2011 Sfarsitul ultimului capitolul
http://www.youtube.com/watch?v=x-6RsW_fQfE
 [Dean, Ghemawat] Jeff Dean, Sanjay Ghemawat, Bafta la examen!
MapReduce: Simplified Data Processing on Large
Clusters,
http://research.google.com/archive/mapreduce-osdi04-
slides/index.html

F. Radulescu. Curs: Baze de date 1 45 F. Radulescu. Curs: Baze de date 1 46

8
Florin Radulescu - Baze de date (note de curs)

STUD
SQL - 1 MATR NUME AN GRUPA DATAN LOC TUTOR PUNCTAJ CODS
---- ------- -- ------ --------- ---------- ----- ------- ----
1456 GEORGE 4 1141A 12-MAR-82 BUCURESTI 2890 11
1325 VASILE 2 1122A 05-OCT-84 PITESTI 1456 390 11
1645 MARIA 3 1131B 17-JUN-83 PLOIESTI 1400 11
3145 ION 1 2112B 24-JAN-85 PLOIESTI 3251 1670 21
2146 STANCA 4 2141A 15-MAY-82 BUCURESTI 620 21
3251 ALEX 5 2153B 07-NOV-81 BRASOV 1570 21
2215 ELENA 2 2122A 29-AUG-84 BUCURESTI 2146 890 21
CERERI SELECT PE O 4311
3514
ADRIAN
FLOREA
3 2431A 31-JUL-83 BUCURESTI
5 2452B 03-FEB-81 BRASOV
450
3230
24
24
1925 OANA 2 2421A 20-DEC-84 BUCURESTI 4311 760 24
TABELA 2101
4705
MARIUS
VOICU
1 2412B 02-SEP-85 PITESTI
2 2421B 19-APR-84 BRASOV
3514
4311
310
1290
24
24

F. Radulescu. Curs: Baze de date - 1 F. Radulescu. Curs: Baze de date - 2


Limbajul SQL Limbajul SQL

SPEC si BURSA
CODS NUME DOMENIU
SINTAXA
----- ---------- ---------------
11 MATEMATICA STIINTE EXACTE SELECT [DISTINCT] lista_de_expresii
21 GEOGRAFIE UMANIST FROM nume_tabela
24 ISTORIE UMANIST WHERE conditie_linie
-- clauza optionala
TIP PMIN PMAX SUMA ORDER BY criterii_sortare_rezultat;
-------------------- ----- ----- -----
-- clauza optionala
FARA BURSA 0 399
BURSA SOCIALA 400 899 100
BURSA DE STUDIU 900 1799 150
BURSA DE MERIT 1800 2499 200
BURSA DE EXCEPTIE 2500 9999 300

F. Radulescu. Curs: Baze de date - 3 F. Radulescu. Curs: Baze de date - 4


Limbajul SQL Limbajul SQL

EFECT EFECT
Se parcurg rând pe rând liniile tabelei Dacă există cuvântul cheie DISTINCT, din
specificate pe clauza FROM. rezultat se elimină liniile duplicat.
Din fiecare linie conţinând date pentru care Înainte de a trimite rezultatul, serverul îl
condiţia aflată pe clauza WHERE este sortează în funcţie de criteriile specificate de
adevărată va rezulta o linie în rezultatul clauza ORDER BY.
cererii. În cazul în care WHERE lipseşte, toate În cazul în care ORDER BY lipseşte, liniile din
liniile tabelei FROM vor avea o linie rezultat sunt într-o ordine independentă de
corespondentă în rezultatul cererii. conţinutul lor sau de ordinea în care ele au
Linia de rezultat este compusă pe baza listei fost adăugate în tabelă.
de expresii aflată pe clauza SELECT.
F. Radulescu. Curs: Baze de date - 5 F. Radulescu. Curs: Baze de date - 6
Limbajul SQL Limbajul SQL

1
Florin Radulescu - Baze de date (note de curs)

REZULTAT REZULTAT
Numărul coloanelor din rezultat este Evaluarea valorii de adevăr a condiţiei
egal cu numărul expresiilor din lista din WHERE se face doar pe baza
aflată pe clauza SELECT. Aceste expresii datelor aflate pe linia respectivă.
dau şi numele coloanelor din rezultat.
Deoarece parcurgerea liniilor specificată
În lipsa clauzei DISTINCT, numărul de
linii din rezultat este egal cu numărul de o cerere SELECT se face după un
liniilor din tabelă care îndeplinesc plan de execuţie generat de server,
condiţia WHERE sau, când clauza folosirea clauzei ORDER BY este
respectivă lipseşte, cu numărul total de obligatorie în cazul în care se doreşte
linii din tabelă. un rezultat sortat după anumite criterii.
F. Radulescu. Curs: Baze de date - 7 F. Radulescu. Curs: Baze de date - 8
Limbajul SQL Limbajul SQL

LISTA SELECT LISTA SELECT


Nume de coloane sau * Constante:

SELECT NUME, DOMENIU SELECT 'Specializarea ', NUME,


FROM SPEC; ' infiintata in ', 1995
FROM SPEC
SELECT *
FROM STUD;

F. Radulescu. Curs: Baze de date - 9 F. Radulescu. Curs: Baze de date - 10


Limbajul SQL Limbajul SQL

LISTA SELECT LISTA SELECT


Expresii aritmetice: Expresii concatenate:

SELECT 'Specializarea '|| NUME ||


SELECT TIP, SUMA, (SUMA+20)*1.1
' are codul ', CODS
FROM BURSA;
FROM SPEC;
Functia NVL (MySQL: IFNULL) Cu valori nule:
SELECT TIP, SUMA, SELECT TIP, ' are valoarea ' || SUMA ||
NVL((SUMA+20)*1.1, 0) '.Lei'
FROM BURSA; FROM BURSA;
F. Radulescu. Curs: Baze de date - 11 F. Radulescu. Curs: Baze de date - 12
Limbajul SQL Limbajul SQL

2
Florin Radulescu - Baze de date (note de curs)

LISTA SELECT LISTA SELECT


Alias de coloana: Alias de coloana:
Nu poate fi mai lung de 30 de caractere.
SELECT TIP AS "Tip bursa",
Incepe cu o literă, conţine decât litere, cifre,
_, # şi $ sau e pus intre ghilimele (tot max. ' are valoarea ' || SUMA ||
30 caractere intre ghilimele). '.Lei' AS Descriere
Între ghilimele literele mici sunt considerate
diferite de literele mari. FROM BURSA;
Nu poate fi folosit decât în cererea curentă.
Sistemul nu stochează în baza de date sau Tip bursa DESCRIERE
altundeva aceste nume alternative. -------------------- --------------------------
Nu poate fi folosit în alte clauze ale cererii FARA BURSA are valoarea .Lei
(doar in SELECT si ORDER BY). BURSA SOCIALA are valoarea 100.Lei
. . . . . . . . . . . . . . . . . .
F. Radulescu. Curs: Baze de date - 13 F. Radulescu. Curs: Baze de date - 14
Limbajul SQL Limbajul SQL

LISTA SELECT CLAUZA WHERE


DISTINCT: Elimina liniile duplicat din Sintaxa: WHERE expresie_logica
rezultat: Exemplu:
SELECT CODS SELECT NUME, GRUPA, CODS
FROM STUD; FROM STUD
WHERE AN = 4;
SELECT DISTINCT CODS
FROM STUD;
SELECT DISTINCT CODS, AN
FROM STUD;
F. Radulescu. Curs: Baze de date - 15 F. Radulescu. Curs: Baze de date - 16
Limbajul SQL Limbajul SQL

CLAUZA WHERE
CLAUZA WHERE
Conditii compuse (AND, OR, NOT) si
Operatori de Operator Semnificaţie paranteze
= Egal
comparatie:
> Mai mare
AN=2 AND PUNCTAJ>500 OR
>= Mai mare sau egal CODS=11
< Mai mic AN=2 AND (PUNCTAJ>500 OR
<= Mai mic sau egal
<> Diferit
CODS=11)
!= Diferit
^= Diferit

F. Radulescu. Curs: Baze de date - 17 F. Radulescu. Curs: Baze de date - 18


Limbajul SQL Limbajul SQL

3
Florin Radulescu - Baze de date (note de curs)

CLAUZA WHERE CLAUZA WHERE


Operatorul BETWEEN: BETWEEN: Alte exemple

Sintaxa: SELECT NUME, AN, PUNCTAJ


expresie BETWEEN valoare_minima AND FROM STUD
valoare_maxima WHERE PUNCTAJ + 100 BETWEEN TUTOR -
2000 AND TUTOR + 1000;
Exemplu:
SELECT NUME, AN, PUNCTAJ SELECT NUME, LOC, DATAN
FROM STUD
FROM STUD WHERE LOC BETWEEN 'A' AND 'L' AND
WHERE PUNCTAJ BETWEEN 2000 AND DATAN BETWEEN '1-JAN-82' AND '31-DEC-
4000; 82';
F. Radulescu. Curs: Baze de date - 19 F. Radulescu. Curs: Baze de date - 20
Limbajul SQL Limbajul SQL

CLAUZA WHERE CLAUZA WHERE


Operatorul IN: NOT IN intoarce fals daca lista contine
Sintaxa: valori nule:
expresie IN (val_1, val_2, ..., val_n)
SELECT NUME, AN, GRUPA, TUTOR
Exemple:
SELECT NUME, AN, DATAN FROM STUD
FROM STUD WHERE TUTOR NOT IN (NULL, 1456,
WHERE TUTOR IN (1456, 2146); 2146);
IN ignora valorile nule din lista: IN este operator derivat:
SELECT NUME, AN, GRUPA, TUTOR
FROM STUD
SELECT NUME, AN, DATAN
WHERE TUTOR IN (NULL, 1456, 2146); FROM STUD
WHERE TUTOR=1456 OR TUTOR=2146;
F. Radulescu. Curs: Baze de date - 21 F. Radulescu. Curs: Baze de date - 22
Limbajul SQL Limbajul SQL

CLAUZA WHERE CLAUZA WHERE


Operatorul IN. Alte exemple: Operatorul LIKE:
SELECT NUME, PUNCTAJ, CODS
Sintaxa:
FROM STUD
WHERE PUNCTAJ + 10 IN (CODS*30+70, expresie LIKE 'SABLON' [ESCAPE
CODS*200+700); 'caracter']
Caractere de inlocuire in sablon:
SELECT NUME, LOC, DATAN Caracter Semnificaţie
FROM STUD
WHERE LOC IN ('BUCURESTI', 'PLOIESTI') OR
_ Orice caracter
DATAN IN ('02-SEP-85', '19-APR-84', '29- % Orice şir de caractere, inclusiv şirul vid
AUG-84');
F. Radulescu. Curs: Baze de date - 23 F. Radulescu. Curs: Baze de date - 24
Limbajul SQL Limbajul SQL

4
Florin Radulescu - Baze de date (note de curs)

CLAUZA WHERE CLAUZA WHERE


Operatorul LIKE: Exemple Operatorul LIKE: Alte exemple:
SELECT NUME, AN, GRUPA
SELECT NUME, DOMENIU
FROM STUD
WHERE NUME LIKE 'A%'; FROM SPEC
WHERE NUME LIKE '%A%I_';
SELECT NUME, GRUPA
FROM STUD
WHERE NUME LIKE '____';
SELECT NUME||'_'||DOMENIU AS
NUMESIDOMENIU
SELECT NUME, DOMENIU FROM SPEC
FROM SPEC WHERE NUME||'_'||DOMENIU LIKE '%\_U%'
WHERE DOMENIU LIKE '% %'; ESCAPE '\'
F. Radulescu. Curs: Baze de date - 25 F. Radulescu. Curs: Baze de date - 26
Limbajul SQL Limbajul SQL

CLAUZA WHERE CLAUZA WHERE


Operatorul LIKE pentru numere, siruri, date: Operatorul LIKE va considera literele mici
SELECT NUME, DATAN, PUNCTAJ
FROM STUD
si mari diferite in sablon (Oracle):
WHERE DATAN LIKE '%84' AND PUNCTAJ LIKE '%9_‘ SELECT NUME, DATAN
Valorile nule nu sunt considerate sirul vid FROM STUD
SELECT NUME, TUTOR
WHERE DATAN LIKE '%oct%';
FROM STUD
WHERE TUTOR LIKE '%' OR
TUTOR NOT LIKE '%'; SELECT NUME, DATAN
Sablocul se poate obtine dintr-o expresie
SELECT NUME, 'A' || '%' || TUTOR AS SABLON
FROM STUD
FROM STUD WHERE DATAN LIKE '%OCT%';
WHERE NUME LIKE 'A' || '%' || TUTOR;
F. Radulescu. Curs: Baze de date - 27 F. Radulescu. Curs: Baze de date - 28
Limbajul SQL Limbajul SQL

CLAUZA WHERE CLAUZA WHERE


Operatorul IS NULL: Operatorul IS NULL: Exemple:
Sintaxa:
expresie IS NULL -- iar negata este: SELECT NUME, TUTOR
expresie IS NOT NULL FROM STUD
Valorile nule nu se pot compara cu =, <>: WHERE TUTOR IS NULL;
SELECT NUME, TUTOR
FROM STUD
WHERE TUTOR = NULL; -- fals mereu SELECT NUME, TUTOR
SELECT NUME, TUTOR FROM STUD
FROM STUD WHERE TUTOR IS NOT NULL;
WHERE TUTOR <> NULL; -- fals mereu
F. Radulescu. Curs: Baze de date - 29 F. Radulescu. Curs: Baze de date - 30
Limbajul SQL Limbajul SQL

5
Florin Radulescu - Baze de date (note de curs)

CLAUZA ORDER BY EFECT


În cazul în care ORDER BY conţine mai multe
criterii de sortare, ele nu sunt echivalente ci
Sintaxa: se iau în considerare în ordinea specificată:
ORDER BY criteriu1 [DESC] [,criteriu2 Se sortează rezultatul după primul criteriu
[DESC]...]
Pentru valori egale pentru primul criteriu se ia
Cuvântul cheie opţional DESC (de la englezescul în considerare al doilea criteriu
descending) specifică inversarea ordinii de
sortare implicite pentru criteriul respectiv Pentru valori egale pentru primele două
(ordinea ascendentă, crescătoare) astfel încât criterii se ia în considerare al treilea criteriu,
sortarea se face descendent (descrescător). s.a.m.d.

F. Radulescu. Curs: Baze de date - 31 F. Radulescu. Curs: Baze de date - 32


Limbajul SQL Limbajul SQL

ORDER BY – coloane din rezultat ORDER BY – alias de coloana


SELECT NUME, DOMENIU, CODS SELECT NUME, PUNCTAJ,
FROM SPEC (PUNCTAJ+20)*1.1 PMARIT
ORDER BY NUME; FROM STUD
WHERE CODS=11
SELECT NUME, AN, GRUPA, DATAN, ORDER BY PMARIT;
CODS
FROM STUD
ORDER BY AN DESC, NUME
F. Radulescu. Curs: Baze de date - 33 F. Radulescu. Curs: Baze de date - 34
Limbajul SQL Limbajul SQL

ORDER BY – expresii (coloane si ORDER BY – coloane care nu


aliasuri) apar in rezultat
SELECT NUME, PUNCTAJ, (PUNCTAJ+20)*1.1 SELECT NUME, AN, GRUPA
PMARIT
FROM STUD FROM STUD
WHERE CODS=11 WHERE AN=2
ORDER BY (PUNCTAJ+20)*1.1;
ORDER BY LOC DESC, (PUNCTAJ/10);
SELECT NUME, PUNCTAJ, (PUNCTAJ+20)*1.1
PMARIT
FROM STUD
WHERE CODS=11
ORDER BY PUNCTAJ-PMARIT;
F. Radulescu. Curs: Baze de date - 35 F. Radulescu. Curs: Baze de date - 36
Limbajul SQL Limbajul SQL

6
Florin Radulescu - Baze de date (note de curs)

ORDER BY – coloane care nu ORDER BY – coloane care nu


apar in rezultat (1) apar in rezultat (2)
SELECT MATR, NUME, AN Numarul de coloana nu se poate da
FROM STUD printr-o expresie:
ORDER BY 3 DESC, 2;
SELECT MATR, NUME, AN
SELECT MATR, NUME, AN FROM STUD
FROM STUD ORDER BY 2+1 DESC, NUME;
ORDER BY 3 DESC, NUME;

F. Radulescu. Curs: Baze de date - 37 F. Radulescu. Curs: Baze de date - 38


Limbajul SQL Limbajul SQL

ORDER BY – Valori nule (1) ORDER BY – Valori nule (2)


Sunt considerate mai mari decat orice Rezultat:
valoare (Oracle): TIP SUMA
-------------------- -----
BURSA SOCIALA 100
SELECT TIP, SUMA
BURSA DE STUDIU 150
FROM BURSA
BURSA DE MERIT 200
ORDER BY SUMA BURSA DE EXCEPTIE 300
FARA BURSA
F. Radulescu. Curs: Baze de date - 39 F. Radulescu. Curs: Baze de date - 40
Limbajul SQL Limbajul SQL

Sfarsitul capitolului
“Cereri SELECT pe o tabela”

F. Radulescu. Curs: Baze de date - 41


Limbajul SQL

7
Florin Radulescu - Baze de date (note de curs)

STUD
SQL - 2 MATR NUME AN GRUPA DATAN LOC TUTOR PUNCTAJ CODS
---- ------- -- ------ --------- ---------- ----- ------- ----
1456 GEORGE 4 1141A 12-MAR-82 BUCURESTI 2890 11
1325 VASILE 2 1122A 05-OCT-84 PITESTI 1456 390 11
1645 MARIA 3 1131B 17-JUN-83 PLOIESTI 1400 11
3145 ION 1 2112B 24-JAN-85 PLOIESTI 3251 1670 21
2146 STANCA 4 2141A 15-MAY-82 BUCURESTI 620 21
3251 ALEX 5 2153B 07-NOV-81 BRASOV 1570 21
2215 ELENA 2 2122A 29-AUG-84 BUCURESTI 2146 890 21
CERERI SELECT PE MAI 4311
3514
ADRIAN
FLOREA
3 2431A 31-JUL-83 BUCURESTI
5 2452B 03-FEB-81 BRASOV
450
3230
24
24
1925 OANA 2 2421A 20-DEC-84 BUCURESTI 4311 760 24
MULTE TABELE 2101
4705
MARIUS
VOICU
1 2412B 02-SEP-85 PITESTI
2 2421B 19-APR-84 BRASOV
3514
4311
310
1290
24
24

F. Radulescu. Curs: Baze de date - 1 F. Radulescu. Curs: Baze de date - 2


Limbajul SQL Limbajul SQL

SPEC si BURSA OBIECTIV


CODS NUME DOMENIU
----- ---------- ---------------
 În foarte multe cazuri se doreşte ca un acelaşi
11 MATEMATICA STIINTE EXACTE
rezultat să conţină date care sunt stocate în două sau
21 GEOGRAFIE UMANIST
mai multe tabele din baza de date, ca în exemplele
24 ISTORIE UMANIST
următoare:
 Lista cu nume studenţi şi denumiri specializări.
TIP PMIN PMAX SUMA Tabelele care conţin aceste date sunt STUD (numele
-------------------- ----- ----- ----- studentului) şi SPEC (denumirea specializării).
FARA BURSA 0 399  Numele studenţilor (din tabela STUD) şi tipul burselor
BURSA SOCIALA 400 899 100 acestora (din tabela BURSA).
BURSA DE STUDIU 900 1799 150  Numele studentului, denumirea specializării şi
BURSA DE MERIT 1800 2499 200 cuantumul bursei. În acest caz sunt implicate toate
BURSA DE EXCEPTIE 2500 9999 300 cele trei tabele ale bazei de date de test.
F. Radulescu. Curs: Baze de date - 3 F. Radulescu. Curs: Baze de date - 4
Limbajul SQL Limbajul SQL

JOIN SINTAXA
Operaţia care permite astfel de regăsiri se SELECT [DISTINCT] lista_de_expresii
numeşte join (termen preluat din limba FROM lista_de_tabele
WHERE conditie_de_join
engleză) şi este realizată prin intermediul unei
AND conditii_suplimentare
cereri SELECT având următoarele
. . .
caracteristici:
-- alte clauze: GROUP BY, HAVING, ORDER
În clauza FROM este specificată nu doar o BY
singură tabelă ci o listă de tabele.
În clauza WHERE există o condiţie care să
coreleze liniile tabelelor din lista FROM
(condiţie numită şi condiţie de join).
F. Radulescu. Curs: Baze de date - 5 F. Radulescu. Curs: Baze de date - 6
Limbajul SQL Limbajul SQL

1
Florin Radulescu - Baze de date (note de curs)

OBSERVATII OBSERVATII (2)


Atunci când condiţia de join lipseşte, fiecare  În cazul în care o linie a unei tabele nu se corelează
linie a unei tabele din lista FROM este prin condiţia de join cu nici o linie din celelalte tabele
concatenată cu fiecare linie a celorlalte ea nu va participa la formarea rezultatului. Se poate
tabele, obţinându-se de fapt produsul însă cere ca aceasta să fie luată în considerare pentru
cartezian al acestora. rezultat, rezultând aşa numitul join extern (în
Dacă în condiţia de join apar numai egalităţi engleză outer join).
operaţia este numită şi echijoin. În celelalte  În versiunile anterioare sintaxa joinului în Oracle era
cazuri avem un non-echijoin. diferită de standardul ANSI. Începând cu versiunea
Oracle 9i au fost introduse în limbaj şi tipurile de join
În lista de tabele care participă la join o din standardul SQL:1999 (SQL-3) printre care cross-
tabelă poate să apară repetat. O astfel de join, join natural şi mai multe variante de join
operaţie este numită şi joinul unei tabele extern.
cu ea însăşi sau self-join.
F. Radulescu. Curs: Baze de date - 7 F. Radulescu. Curs: Baze de date - 8
Limbajul SQL Limbajul SQL

PRODUS CARTEZIAN ECHIJOIN


Cererea: SELECT MATR, STUD.NUME, STUD.CODS,
SELECT * SPEC.NUME
FROM STUD, SPEC; FROM STUD, SPEC
va returna un rezultat având 12 coloane şi 36
WHERE STUD.CODS = SPEC.CODS AND
de linii formate din concatenarea fiecărei linii
din STUD cu fiecare linie din SPEC. DOMENIU='STIINTE EXACTE‘
De asemenea, cererea: Este marcata conditia de join. Restul conditiei
SELECT DATAN, DOMENIU este suplimentar
FROM STUD, SPEC
WHERE LOC='BUCURESTI';
are un rezultat conţinând 15 linii
F. Radulescu. Curs: Baze de date - 9 F. Radulescu. Curs: Baze de date - 10
Limbajul SQL Limbajul SQL

NON-ECHIJOIN ALIAS DE TABELA


SELECT NUME, AN, TIP, SUMA SELECT S.NUME, S.CODS, "SP
FROM STUD, BURSA STUD".NUME, TIP
WHERE PUNCTAJ BETWEEN PMIN AND PMAX FROM STUD S, SPEC "SP STUD", BURSA
AND CODS=11 WHERE S.CODS = "SP STUD".CODS AND
S.PUNCTAJ BETWEEN PMIN AND PMAX
Este marcata conditia de join
Aliasul trebuie sa indeplineasca anumite
conditii (Oracle):

F. Radulescu. Curs: Baze de date - 11 F. Radulescu. Curs: Baze de date - 12


Limbajul SQL Limbajul SQL

2
Florin Radulescu - Baze de date (note de curs)

ALIAS DE TABELA (2) ALIAS DE TABELA (3)


Nu poate fi mai lung de 30 de caractere. Între ghilimele literele mici sunt considerate
În cazul în care nu începe cu o literă sau când diferite de literele mari.
conţine alte caractere dacât litere, cifre, _, # Nu poate fi folosit decât în cererea curentă.
şi $ trebuie pus între ghilimele (de exemplu Sistemul nu stochează în baza de date sau
atunci când conţine spaţii). altundeva aceste nume alternative.
În cazul unui alias între ghilimele, În cazul în care o tabelă are asociat un alias
dimensiunea maximă de 30 de caractere nu prin clauza FROM acesta poate şi trebuie să
include ghilimelele. fie folosit pentru prefixare în toate celelalte
clauze ale cererii.

F. Radulescu. Curs: Baze de date - 13 F. Radulescu. Curs: Baze de date - 14


Limbajul SQL Limbajul SQL

ALIAS DE TABELA (4) ALIAS DE TABELA (4)


 În cazul unui alias între ghilimele  Dacă pentru o tabelă a fost definit un
literele mici sunt considerate diferite alias numele tabelei nu mai poate fi
de literele mari. Din această cauză folosit pentru prefixare. În cazul cererii
dacă prima linie a cererii anterioare anterioare, prima linie nu mai poate fi
este: rescrisă astfel:
SELECT S.NUME, S.CODS, "Sp Stud".NUME, SELECT S.NUME, STUD.CODS,"Sp Stud".NUME,
TIP TIP
 se obţine eroare

F. Radulescu. Curs: Baze de date - 15 F. Radulescu. Curs: Baze de date - 16


Limbajul SQL Limbajul SQL

JOIN – cont. JOIN – cont.


 În cazul în care condiţia de join nu este completă 1. În cazul general al unui join pe N
rezultatul va conţine un produs cartezian între
joinurile existente şi restul tabelelor. tabele, condiţia de join este compusă
 Exemplu: în cererea următoare lipseşte condiţia de din N - 1 subcondiţii conectate prin
join care leagă tabela BURSA de celelalte tabele.
SELECT S.NUME, S.CODS, "SP STUD".NUME,
AND care relaţionează întreg
TIP ansamblul de tabele. Altfel spus, dacă
FROM STUD S, SPEC "SP STUD", BURSA se construieşte un graf al condiţiei în
WHERE S.CODS = "SP STUD".CODS; care nodurile sunt tabele şi arcele
 În acest caz rezultatul obţinut este produsul
cartezian între BURSA şi joinul lui STUD cu SPEC şi subcondiţii de join care leagă două
va avea 60 de linii (5 linii din BURSA * 12 linii ale tabele atunci acest graf trebuie să fie
joinului STUD cu SPEC).
conex.
F. Radulescu. Curs: Baze de date - 17 F. Radulescu. Curs: Baze de date - 18
Limbajul SQL Limbajul SQL

3
Florin Radulescu - Baze de date (note de curs)

JOINUL UNEI TABELE CU EA


ALT EXEMPLU
INSASI
Studenti care au acelasi tutor:
Este obligatorie folosirea aliasurilor: SELECT S1.NUME "STUDENT 1",
SELECT S.NUME "NUME STUD",
S.AN "AN STUD",
S2.NUME "STUDENT 2",
T.NUME "NUME TUTOR", S2.TUTOR "TUTOR"
T.AN "AN TUTOR" FROM STUD S1, STUD S2
FROM STUD S, STUD T WHERE S1.TUTOR=S2.TUTOR;
WHERE S.TUTOR=T.MATR
INCORECT! Apar si cupluri cu acelasi
student

F. Radulescu. Curs: Baze de date - 19 F. Radulescu. Curs: Baze de date - 20


Limbajul SQL Limbajul SQL

ALT EXEMPLU - cont ALT EXEMPLU - cont


Alta varianta: Varianta corecta:
SELECT S1.NUME "STUDENT 1", SELECT S1.NUME "STUDENT 1",
S2.NUME "STUDENT 2", S2.NUME "STUDENT 2",
S2.TUTOR "TUTOR" S2.TUTOR "TUTOR"
FROM STUD S1, STUD S2 FROM STUD S1, STUD S2
WHERE S1.TUTOR=S2.TUTOR WHERE S1.TUTOR=S2.TUTOR
AND S1.MATR <> S2.MATR AND S1.MATR > S2.MATR
INCORECT! Apar ambele cupluri XY si
YX
F. Radulescu. Curs: Baze de date - 21 F. Radulescu. Curs: Baze de date - 22
Limbajul SQL Limbajul SQL

JOIN EXTERN (Oracle) JOIN EXTERN (Oracle)


Apar si studentii fara tutor: Rezultat:
SELECT S.NUME "NUME STUD", S.AN "AN NUME STUD AN STUD NUME TUTOR AN TUTOR
STUD", T.NUME "NUME TUTOR", ---------- ------- ---------- --------
T.AN "AN TUTOR" VASILE 2 GEORGE 4
FROM STUD S, STUD T GEORGE 4
WHERE S.CODS = 11 AND MARIA 3
S.TUTOR=T.MATR(+)

F. Radulescu. Curs: Baze de date - 23 F. Radulescu. Curs: Baze de date - 24


Limbajul SQL Limbajul SQL

4
Florin Radulescu - Baze de date (note de curs)

JOIN EXTERN (Oracle) JOIN EXTERN FARA =


Daca schimbam plusul apar studentii Joinul extern se poate folosi şi în cazul în care
condiţia nu este de egalitate. Se pot folosi
care nu sunt tutori: operatorii <, <=, >, >= sau <>. Un exemplu
SELECT S.NUME "NUME STUD", S.AN "AN în acest sens este următorul: cererea
STUD", T.NUME "NUME TUTOR",
SELECT S1.NUME "STUDENT 1",
T.AN "AN TUTOR"
S1.PUNCTAJ "PUNCTAJ 1",
FROM STUD S, STUD T
S2.NUME "STUDENT 2",
WHERE S.CODS = 11 AND
S2.PUNCTAJ "PUNCTAJ 2"
S.TUTOR(+)=T.MATR
FROM STUD S1, STUD S2
WHERE S1.PUNCTAJ > S2.PUNCTAJ;

F. Radulescu. Curs: Baze de date - 25 F. Radulescu. Curs: Baze de date - 26


Limbajul SQL Limbajul SQL

JOIN EXTERN FARA = (cont.) OBSERVATIE


Asa apar toate perechile (66) plus inca o linie Marcajul de join extern se poate folosi
cu studentul avand cel mai mare punctaj: şi atunci când condiţia de join este
SELECT S1.NUME "STUDENT 1", compusă, cu excepţia cazului în care se
S1.PUNCTAJ "PUNCTAJ 1",
foloseşte sau logic (OR) sau operatorul
S2.NUME "STUDENT 2", de incluziune IN urmat de o listă care
S2.PUNCTAJ "PUNCTAJ 2" conţine mai mult de o valoare.
FROM STUD S1, STUD S2
Joinul extern se poate folosi şi în
WHERE S1.PUNCTAJ (+) > S2.PUNCTAJ;
conjuncţie cu operatorii specifici SQL

F. Radulescu. Curs: Baze de date - 27 F. Radulescu. Curs: Baze de date - 28


Limbajul SQL Limbajul SQL

JOIN EXTERN CU BETWEEN JOIN EXTERN CU BETWEEN (2)


cereri valide:  cereri valide:
SELECT NUME, AN, TIP, SUMA SELECT NUME, AN, TIP, SUMA
FROM STUD, BURSA
FROM STUD, BURSA
WHERE PUNCTAJ-1000 BETWEEN PMIN(+) AND
WHERE PUNCTAJ(+)-1000 BETWEEN PMIN AND PMAX(+)
PMAX  Rezultat: 12 linii conţinând datele studenţilor şi tipul
Rezultatul conţine şase linii complete pentru bursei corespunzătoare unui punctaj egal cu
studenţii cu un (PUNCTAJ-1000) care se (PUNCTAJ-1000) sau valori nule dacă punctajul
încadrează pentru un tip de bursă din tabela respectiv nu se încadrează în nici un tip de bursă.
BURSA şi două linii pentru cele două tipuri de  Observaţie: în acest caz marcajul (+) trebuie pus
atât la valoarea minimă cât şi la valoarea maximă. În
bursă care nu au nici un student asociat prin cazul în care lipseşte de la una dintre ele nu se
condiţia de join. Aceste 2 linii conţin valori semnalează eroare dar se calculează joinul normal
nule pe primele două coloane. rezultând 6 linii şi nu 12.

F. Radulescu. Curs: Baze de date - 29 F. Radulescu. Curs: Baze de date - 30


Limbajul SQL Limbajul SQL

5
Florin Radulescu - Baze de date (note de curs)

JOIN EXTERN CU LIKE REZULTAT


Cerere valida:  NUME CODS NUME CODS SABLON
SELECT S.NUME, S.CODS, F.NUME, F.CODS,  ---------- ----- ---------- ----- ------
SUBSTR(F.CODS, 2, 1)||'%' SABLON  GEORGE 11 MATEMATICA 11 1%
FROM STUD S, SPEC F  VASILE 11 MATEMATICA 11 1%
 MARIA 11 MATEMATICA 11 1%
WHERE S.CODS(+) LIKE SUBSTR(F.CODS, 2,
1)||'%';  GEORGE 11 GEOGRAFIE 21 1%
 VASILE 11 GEOGRAFIE 21 1%
Funcţia SQL SUBSTR întoarce un subşir al  MARIA 11 GEOGRAFIE 21 1%
primului argument - în cazul nostru subşirul  ISTORIE 24 4%
care începe în poziţia 2 şi are lungime egală
cu 1.
F. Radulescu. Curs: Baze de date - 31 F. Radulescu. Curs: Baze de date - 32
Limbajul SQL Limbajul SQL

JOIN EXTERN CU LIKE – cont. JOINURI SQL - 3


Mutând marcajul obţinem cererea: Exista clauzele:
SELECT S.NUME, S.CODS, F.NUME, F.CODS,
SUBSTR(F.CODS, 2, 1)||'%' SABLON CROSS JOIN – produs cartezian
FROM STUD S, SPEC F
WHERE S.CODS LIKE SUBSTR(F.CODS(+), 2, JOIN … USING – coloane comune
1)||'%' NATURAL JOIN – join natural
Returnează 15 linii: 6 linii pentru cei 3
studenţi pentru care condiţia de join obişnuit JOIN … ON – join general
este îndeplinită plus câte o linie pentru fiecare
dintre ceilalţi 9 studenţi care nu verifică OUTER JOIN … ON – join extern
această condiţie, având valori nule pe Pe o clauza avem o singura tabela (nu se
coloanele 3 şi 4.
mai pun toate in FROM)
F. Radulescu. Curs: Baze de date - 33 F. Radulescu. Curs: Baze de date - 34
Limbajul SQL Limbajul SQL

CROSS JOIN CROSS JOIN – cont.


Implementeaza produsul cartezian: Pentru a face join cu CROSS JOIN
SELECT [DISTINCT] lista_de_expresii adaugam conditia de join in WHERE:
FROM tabela1
CROSS JOIN tabela2;
SELECT S.NUME, DATAN, F.NUME,
Exemplu: DOMENIU
SELECT S.NUME, F.NUME
FROM STUD S
FROM STUD S
CROSS JOIN SPEC F
CROSS JOIN SPEC F; -- 36 de linii
WHERE S.CODS=F.CODS;

F. Radulescu. Curs: Baze de date - 35 F. Radulescu. Curs: Baze de date - 36


Limbajul SQL Limbajul SQL

6
Florin Radulescu - Baze de date (note de curs)

JOIN … USING EXEMPLU


E un echijoin dupa coloane cu acelasi deoarece în STUD si SPEC avem coloane cu
nume specificate in USING (deci nu acelasi nume (NUME si CODS) putem face
toate): echjoinul dupa CODS astfel:
SELECT S.NUME, DATAN, F.NUME, DOMENIU
SELECT [DISTINCT] lista_de_expresii
FROM STUD S
FROM tabela1 JOIN SPEC F USING (CODS);
JOIN tabela2 USING (nume_coloane) După cum se observă în lista USING numele
coloanelor după care se efectuează joinul nu
trebuie prefixat cu numele sau aliasul
vreuneia dintre tabele.
F. Radulescu. Curs: Baze de date - 37 F. Radulescu. Curs: Baze de date - 38
Limbajul SQL Limbajul SQL

EXEMPLU – cont. NATURAL JOIN


Dacă se doreşte afişarea aceloraşi date E un echijoin dupa toate coloane cu
dar doar pentru studenţii născuţi în acelasi nume:
BUCUREŞTI se va adăuga condiţia SELECT [DISTINCT] lista_de_expresii
FROM tabela1
suplimentară pe WHERE: NATURAL JOIN tabela2

Exemplu – fara linii rezultat, nici un student


SELECT S.NUME, DATAN, F.NUME, DOMENIU nu are acelasi nume cu o specializare:
FROM STUD S SELECT NUME, DATAN, DOMENIU
FROM STUD
JOIN SPEC F USING (CODS)
NATURAL JOIN SPEC; -- echijoin dupa NUME si CODS
WHERE LOC='BUCURESTI';

F. Radulescu. Curs: Baze de date - 39 F. Radulescu. Curs: Baze de date - 40


Limbajul SQL Limbajul SQL

JOIN .. ON EXEMPLU
Prin această clauză se implementează Exemplu: cererea următoare efectuează
un join general. Condiţia de join (şi joinul dintre STUD şi SPEC după coloana
eventual şi condiţiile suplimentare) se CODS şi conţine şi o linie suplimentară care
opreşte doar liniile corespunzătoare
pun la ON. Sintaxa este: studenţilor născuţi în PLOIEŞTI.
Această condiţie suplimentară se putea pune
SELECT [DISTINCT] lista_de_expresii
şi pe clauza WHERE.
FROM tabela1 SELECT S.NUME, DATAN, F.NUME, DOMENIU
JOIN tabela2 ON (expresie_logica) FROM STUD S
JOIN SPEC F ON (S.CODS=F.CODS AND
LOC='PLOIESTI');
F. Radulescu. Curs: Baze de date - 41 F. Radulescu. Curs: Baze de date - 42
Limbajul SQL Limbajul SQL

7
Florin Radulescu - Baze de date (note de curs)

EXEMPLU – cont. JOIN .. ON – cont.


Rezultatul este: Cu JOIN ON se pot calcula şi non-
echijoinuri. Dacă se doreşte o listă cu
NUME DATAN NUME DOMENIU date despre studenţi şi bursele
---------- --------- ---------- ---------------
acestora, următoarea cerere va întoarce
MARIA 17-JUN-83 MATEMATICA STIINTE EXACTE
ION 24-JAN-85 GEOGRAFIE UMANIST rezultate corecte:
SELECT NUME, PUNCTAJ, TIP, SUMA
FROM STUD
JOIN BURSA ON (PUNCTAJ BETWEEN PMIN AND
PMAX)

F. Radulescu. Curs: Baze de date - 43 F. Radulescu. Curs: Baze de date - 44


Limbajul SQL Limbajul SQL

OUTER JOIN … ON LEFT …


În cazul joinului extern sintaxa este  În cazul LEFT OUTER JOIN valorile nule provin din
tabela2. De exemplu cererea:
următoarea: SELECT S.NUME "NUME STUD", S.AN "AN STUD",
SELECT [DISTINCT] lista_de_expresii T.NUME "NUME TUTOR", T.AN "AN TUTOR"
FROM STUD S
FROM tabela1 LEFT OUTER JOIN STUD T
LEFT \ ON (S.TUTOR=T.MATR);

RIGHT | OUTER JOIN tabela2 returnează 12 linii şi este echivalentă cu:


SELECT S.NUME "NUME STUD", S.AN "AN STUD",
FULL / T.NUME "NUME TUTOR", T.AN "AN TUTOR"
FROM STUD S, STUD T
ON (tabela1.nume_coloana1 = WHERE S.TUTOR=T.MATR(+) -- conditia de join extern;
tabela2.numecoloana2)
F. Radulescu. Curs: Baze de date - 45 F. Radulescu. Curs: Baze de date - 46
Limbajul SQL Limbajul SQL

RIGHT … FULL …
 În cazul RIGHT OUTER JOIN valorile nule provin  În cazul RIGHT OUTER JOIN valorile nule provin
din tabela1. Cererea: din tabela1. Cererea:
SELECT S.NUME "NUME STUD", S.AN "AN STUD", SELECT S.NUME "NUME STUD", S.AN "AN STUD",
T.NUME "NUME TUTOR", T.AN "AN TUTOR" T.NUME "NUME TUTOR", T.AN "AN TUTOR"
FROM STUD S FROM STUD S
RIGHT OUTER JOIN STUD T RIGHT OUTER JOIN STUD T
ON (S.TUTOR=T.MATR); ON (S.TUTOR=T.MATR);
returnează 13 linii şi este echivalentă cu: returnează 13 linii şi este echivalentă cu:
SELECT S.NUME "NUME STUD", S.AN "AN STUD", SELECT S.NUME "NUME STUD", S.AN "AN STUD",
T.NUME "NUME TUTOR", T.AN "AN TUTOR" T.NUME "NUME TUTOR", T.AN "AN TUTOR"
FROM STUD S, STUD T FROM STUD S, STUD T
WHERE S.TUTOR(+)=T.MATR; WHERE S.TUTOR(+)=T.MATR;

F. Radulescu. Curs: Baze de date - 47 F. Radulescu. Curs: Baze de date - 48


Limbajul SQL Limbajul SQL

8
Florin Radulescu - Baze de date (note de curs)

OBSERVATIE
In Oracle o condiţie de tipul:

WHERE S.TUTOR(+)=T.MATR(+) Sfarsitul capitolului


va produce eroarea: ORA-01468: a CERERI SELECT PE MAI MULTE
predicate may reference only one outer- TABELE
joined table.

F. Radulescu. Curs: Baze de date - 49 F. Radulescu. Curs: Baze de date - 50


Limbajul SQL Limbajul SQL

9
Florin Radulescu - Baze de date (note de curs)

STUD
SQL - 3 MATR NUME AN GRUPA DATAN LOC TUTOR PUNCTAJ CODS
---- ------- -- ------ --------- ---------- ----- ------- ----
1456 GEORGE 4 1141A 12-MAR-82 BUCURESTI 2890 11
1325 VASILE 2 1122A 05-OCT-84 PITESTI 1456 390 11
1645 MARIA 3 1131B 17-JUN-83 PLOIESTI 1400 11
3145 ION 1 2112B 24-JAN-85 PLOIESTI 3251 1670 21
2146 STANCA 4 2141A 15-MAY-82 BUCURESTI 620 21
3251 ALEX 5 2153B 07-NOV-81 BRASOV 1570 21
2215 ELENA 2 2122A 29-AUG-84 BUCURESTI 2146 890 21
FUNCTII STATISTICE SI 4311
3514
ADRIAN
FLOREA
3 2431A 31-JUL-83 BUCURESTI
5 2452B 03-FEB-81 BRASOV
450
3230
24
24
1925 OANA 2 2421A 20-DEC-84 BUCURESTI 4311 760 24
GRUPURI 2101
4705
MARIUS
VOICU
1 2412B 02-SEP-85 PITESTI
2 2421B 19-APR-84 BRASOV
3514
4311
310
1290
24
24

F. Radulescu. Curs: Baze de date - 1 F. Radulescu. Curs: Baze de date - 2


Limbajul SQL Limbajul SQL

SPEC si BURSA OBIECTIV


CODS NUME DOMENIU
----- ---------- --------------- Până acum fiecare linie a rezultatului
11 MATEMATICA STIINTE EXACTE era calculată dintr-o linie a unei tabele
21 GEOGRAFIE UMANIST
24 ISTORIE UMANIST
din baza de date sau a produsului
cartezian al unor tabele.
TIP PMIN PMAX SUMA
-------------------- ----- ----- -----
În unele cazuri este însă necesar
FARA BURSA 0 399 calculul unor valori statistice pornind de
BURSA SOCIALA 400 899 100 la toate liniile parcurgerii curente sau
BURSA DE STUDIU 900 1799 150
BURSA DE MERIT 1800 2499 200
ale unor grupuri de linii care au aceleaşi
BURSA DE EXCEPTIE 2500 9999 300 valori pentru o listă de expresii.
F. Radulescu. Curs: Baze de date - 3 F. Radulescu. Curs: Baze de date - 4
Limbajul SQL Limbajul SQL

OBIECTIV – cont. REZULTAT


Rezultatul contine valori care caracterizează Rezultatul unei cereri SELECT care conţine funcţii
ansamblul din care provine şi poate conţine: statistice are:
Valori ale unor funcţii statistice (MIN, MAX,  O singură linie în cazul în care cererea nu conţine
clauza de grupare GROUP BY
AVG, SUM, COUNT, STDDEV, VARIANCE).  Un număr de linii egal cu numărul de grupuri formate
Constante (numerice, şir de caractere sau pe baza criteriilor de grupare din GROUP BY, dacă
dată calendaristică). În categoria constantelor această clauză există şi nu este însoţită de clauza
sunt incluse şi pseudocoloanele puse la HAVING.
dispoziţie de sistem cum este SYSDATE.  Un număr de linii egal cu numărul de grupuri formate
pe baza criteriilor de grupare din GROUP BY care
Valori ale expresiilor după care s-a făcut îndeplinesc condiţia de grup din HAVING, dacă
gruparea, în cazul în care aceasta este ambele clauze sunt prezente în cerere.
prezentă în cerere. Numărul de coloane al rezultatului este ca şi înainte
egal cu numărul expresiilor aflate pe clauza SELECT.
F. Radulescu. Curs: Baze de date - 5 F. Radulescu. Curs: Baze de date - 6
Limbajul SQL Limbajul SQL

1
Florin Radulescu - Baze de date (note de curs)

FUNCTII STATISTICR MIN si MAX


Sintaxa funcţiilor:
MIN si MAX – valoare minima si  MIN([ ALL | DISTINCT ] expresie)
maxima  MAX([ ALL | DISTINCT ] expresie)
Descriere:
SUM si AVG – suma si medie  MIN(expresie) întoarce valoarea minimă nenula din
lista de valori ale expresiei, fiecare valoare fiind
COUNT – numarare calculată pe baza unei linii din parcurgerea curentă.
 MAX(expresie) întoarce valoarea maximă nenula din
STDDEV si VARIANCE – deviatia aceeaşi listă.
standard si varianta
Folosirea cuvintelor cheie ALL (care este implicit) sau
DISTINCT nu are în acest caz nici un efect, minimul
şi maximul fiind acelaşi dacă din listă se elimină
duplicatele.
F. Radulescu. Curs: Baze de date - 7 F. Radulescu. Curs: Baze de date - 8
Limbajul SQL Limbajul SQL

EXEMPLU SUM
SELECT 'MATEMATICA' FACULTATE, Sintaxa funcţiei:
MIN(SUMA) MINIM, MAX(SUMA) MAXIM
SUM([ ALL | DISTINCT ] expresie)
FROM STUD, SPEC, BURSA
WHERE STUD.PUNCTAJ BETWEEN PMIN AND
Descriere:
PMAX AND SUM(expresie) întoarce suma valorilor
STUD.CODS = SPEC.CODS AND SPEC.NUME = nenule ale expresiei, fiecare valoare
'MATEMATICA' fiind calculată pe baza unei linii din
Rezultatul obţinut va avea o singură parcurgerea curentă.
linie având conţinutul: SUM(DISTINCT expresie) face acelaşi
MATEMATICA 150 300 lucru ignorând însă valorile duplicat.
F. Radulescu. Curs: Baze de date - 9 F. Radulescu. Curs: Baze de date - 10
Limbajul SQL Limbajul SQL

AVG EXEMPLU
Sintaxa funcţiei: Cererea care calculeaza sume si medii
AVG([ ALL | DISTINCT ] expresie) ale burselor studentilor de la ISTORIE:
Descriere: SELECT 'ISTORIE' FACULT,
SUM(SUMA) SUM1, SUM(DISTINCT SUMA) SUM2,
AVG(expresie) întoarce media AVG(SUMA) AVG1, AVG(DISTINCT SUMA) AVG2
aritmetică a valorilor nenule ale FROM STUD, SPEC, BURSA
expresiei. WHERE STUD.PUNCTAJ BETWEEN PMIN AND PMAX AND
STUD.CODS = SPEC.CODS AND SPEC.NUME='ISTORIE'
AVG(DISTINCT expresie) ignora valorile
duplicat.
F. Radulescu. Curs: Baze de date - 11 F. Radulescu. Curs: Baze de date - 12
Limbajul SQL Limbajul SQL

2
Florin Radulescu - Baze de date (note de curs)

REZULTAT COUNT
FACULT SUM1 SUM2 AVG1 AVG2 Sintaxa funcţiei:
------- ----- ----- ----- -----  COUNT(*)
ISTORIE 650 550 162.5 183.3  COUNT([ ALL | DISTINCT] expresie)
Descriere:
După cum se observă, suma şi media sunt
 COUNT(*) întoarce numărul de linii pe baza cărora se
diferite pentru considerarea sau ignorarea calculează rezultatul => nu se poate adăuga
valorilor duplicat: DISTINCT sau nu se poate vorbi de valori nule
 650 = 100 + 100 + 150 + 300  COUNT(expresie) întoarce numărul de valori nenule
ale expresiei.
 550 = 100 + 150 + 300
 COUNT(DISTINCT expresie) întoarce numărul de
 162.5 = 650 / 4 valori nenule şi distincte ale expresiei.
 183.3 = 550 / 3
F. Radulescu. Curs: Baze de date - 13 F. Radulescu. Curs: Baze de date - 14
Limbajul SQL Limbajul SQL

EXEMPLU REZULTAT
Tot pentru ISTORIE se doreste numărului FACULT NRSTUD BURSIERI BURSE
studentilor, numărul de bursieri şi numărul de ------- ------ -------- -----
valori diferite ale sumei primite ca bursă. ISTORIE 5 4 3
Cererea este:
SELECT 'ISTORIE' FACULT,COUNT(*) NRSTUD,
COUNT(SUMA) BURSIERI,
Într-adevăr, sunt 5 studenţi, doar 4 au
COUNT(DISTINCT SUMA) BURSE
FROM STUD, SPEC, BURSA bursa nenulă şi sunt trei valori distincte
WHERE STUD.PUNCTAJ BETWEEN PMIN AND PMAX pentru aceasta: 100, 150 şi 300.
AND STUD.CODS = SPEC.CODS – cond.join
AND SPEC.NUME='ISTORIE';

F. Radulescu. Curs: Baze de date - 15 F. Radulescu. Curs: Baze de date - 16


Limbajul SQL Limbajul SQL

STDDEV si VARIANCE EXEMPLU


Sintaxa funcţiilor: SELECT STDDEV(PUNCTAJ),
 STDDEV([ ALL | DISTINCT ] expresie) VARIANCE(PUNCTAJ)
 VARIANCE([ ALL | DISTINCT ] expresie)
Descriere: FROM STUD;
 Din punct de vedere matematic, deviaţia standard dă
o măsura a abaterii faţă de medie iar varianţa este Rezultat:
pătratul deviaţiei standard. STDDEV(PUNCTAJ) VARIANCE(PUNCTAJ)
 STDDEV(expresie) întoarce deviaţia standard a
valorilor nenule ale expresiei. --------------- -----------------
 VARIANCE(expresie) întoarce varianţa valorilor 949.8465 902208.3
respective.
Cuvântul cheie DISTINCT duce la ignorarea valorilor
duplicat.

F. Radulescu. Curs: Baze de date - 17 F. Radulescu. Curs: Baze de date - 18


Limbajul SQL Limbajul SQL

3
Florin Radulescu - Baze de date (note de curs)

CLAUZA GROUP BY EFECT


În cererile anterioare toate liniile parcurgerii Această clauză trebuie să apară în cerere după cele discutate
anterior (SELECT, FROM şi WHERE) şi are următorul efect:
curente formau un grup din care se calculau
valorile funcţiilor statistice.  Liniile parcurgerii curente (filtrate anterior de WHERE dacă
aceasta este prezentă) sunt împărţite în grupuri.
Dacă se doreşte însă partiţionarea acestora în  Fiecare grup este format din liniile care au aceleaşi valori
grupuri pentru a calcula valori statistice (inclusiv valoarea nulă) pentru expresiile specificate în
pentru fiecare grup în parte este necesară GROUP BY.
folosirea clauzei GROUP BY.  Funcţiile statistice se calculează pentru fiecare grup în
Sintaxa acesteia este: parte, rezultatul având un număr de linii egal cu numărul
de grupuri formate.
 În clauza SELECT, pe lângă constante şi funcţii statistice,
GROUP BY expresie1 [, expresie2, pot apare de asemenea şi expresiile aflate în GROUP BY
expresie 3 ...] deoarece valorile acestora sunt constante la nivelul
fiecărui grup în parte.

F. Radulescu. Curs: Baze de date - 19 F. Radulescu. Curs: Baze de date - 20


Limbajul SQL Limbajul SQL

EXEMPLU EXEMPLU – cont.


Listă conţinând codurile specializărilor şi  Pentru a avea numele specializarii gruparea se face
numărul de studenţi înscrişi la fiecare, cererea pe joinul STUD cu SPEC:
este: SELECT SPEC.NUME, COUNT(*) NRSTUD
SELECT CODS, COUNT(*) NRSTUD FROM STUD, SPEC
FROM STUD WHERE STUD.CODS = SPEC.CODS
GROUP BY CODS; GROUP BY SPEC.NUME;
Rezultatul obţinut este:  obţinându-se rezultatul:
CODS NRSTUD NUME NRSTUD
----- ------ ---------- ------
11 3 GEOGRAFIE 4
21 4 ISTORIE 5
24 5 MATEMATICA 3

F. Radulescu. Curs: Baze de date - 21 F. Radulescu. Curs: Baze de date - 22


Limbajul SQL Limbajul SQL

OBSERVATII ALT EXEMPLU


 Se doreste pentru fiecare tip de bursă valoarea acesteia,
 Dacă în cererea anterioară gruparea s-ar fi făcut valoarea mărită cu 10% şi numărul de studenţi beneficiari:
după STUD.CODS sau SPEC.CODS s-ar fi semnalat SELECT SUMA, SUMA*1.1 BMARITA, COUNT(*)
eroarea: ORA-00979: not a GROUP BY expression din FROM STUD, BURSA
cauza prezenţei lui SPEC.NUME în linia SELECT.
WHERE PUNCTAJ BETWEEN PMIN AND PMAX
 Pentru a include în rezultat şi numele şi codul
specializării clauza GROUP BY trebuie să le conţină pe GROUP BY SUMA;
amândouă. Grupurile vor fi aceleaşi dar cererea va fi  Această cerere va semnala de asemenea eroare: gruparea
validă şi va putea fi executată: se face doar după SUMA, în consecinţă prezenţa în
SELECT SPEC.NUME, SPEC.CODS, COUNT(*) SELECT a expresiei SUMA*1.1 este ilegală, deşi este
NRSTUD evident că doi studenţi care au burse egale au şi burse
FROM STUD, SPEC mărite cu 10% egale.
WHERE STUD.CODS = SPEC.CODS  Sistemul de gestiune nu face astfel de deducţii, pentru
afişarea datelor cerute fiind necesară adăugarea în GROUP
GROUP BY SPEC.NUME, SPEC.CODS; BY a expresiei SUMA*1.1.

F. Radulescu. Curs: Baze de date - 23 F. Radulescu. Curs: Baze de date - 24


Limbajul SQL Limbajul SQL

4
Florin Radulescu - Baze de date (note de curs)

ORDONARE IMPLICITA EXEMPLU


SELECT TUTOR,CODS,COUNT(*)
Ordinea expresiilor din clauza de grupare FROM STUD
are efect asupra prezentării rezultatului: WHERE CODS IN (11,24)
sistemul Oracle face implicit o sortare în GROUP BY TUTOR,CODS;
funcţie de aceste expresii, ascendent, în REZULTAT: ordonare dupa TUTOR si CODS
TUTOR CODS COUNT(*)
ordinea în care ele sunt prezente în ----- ----- --------
cerere, începând însă cu valorile nule. 11 2
24 2
1456 11 1
3514 24 1
4311 24 2
F. Radulescu. Curs: Baze de date - 25 F. Radulescu. Curs: Baze de date - 26
Limbajul SQL Limbajul SQL

EXEMPLU ORDONARE IMPLICITA – cont.


SELECT TUTOR,CODS,COUNT(*) Se poate folosi clauza ORDER BY pentru a
FROM STUD schimba ordinea implicită.
WHERE CODS IN (11,24)
GROUP BY CODS, TUTOR; În ea pot fi prezente doar elementele
constante la nivel de grup (funcţii statistice,
REZULTAT: ordonare dupa CODS si TUTOR
TUTOR CODS COUNT(*)
expresiile de grupare) sau numărul coloanei
----- ----- -------- din rezultat.
11 2 În cererea următoare ordonarea se face după
1456 11 1 coloana a treia din rezultat şi, la valori egale
24 2 pe aceasta, după valoarea minimă a
3514 24 1 punctajului la nivel de grup, deşi acest minim
4311 24 2 nu este prezent în lista SELECT.
F. Radulescu. Curs: Baze de date - 27 F. Radulescu. Curs: Baze de date - 28
Limbajul SQL Limbajul SQL

EXEMPLU IMBRICARE FCT. STATISTICE


SELECT TUTOR,CODS,COUNT(*) Funcţiile statistice se pot imbrica.
FROM STUD
WHERE CODS IN (11,24)
În acest caz valoarea rezultată se calculează
GROUP BY CODS, TUTOR pe baza valorilor întoarse de funcţia imbricată
ORDER BY 3, MIN(PUNCTAJ); pentru fiecare grup în parte.
 Rezultatul este: De exemplu, dacă se doreşte o medie a
TUTOR CODS COUNT(*) burselor medii pe specializări, aceasta poate fi
----- ----- -------- calculată cu cererea:
3514 24 1
1456 11 1 SELECT AVG(AVG(NVL(SUMA, 0))) MEDIE1
24 2 FROM STUD, BURSA
4311 24 2 WHERE PUNCTAJ BETWEEN PMIN AND PMAX
11 2
GROUP BY CODS;
F. Radulescu. Curs: Baze de date - 29 F. Radulescu. Curs: Baze de date - 30
Limbajul SQL Limbajul SQL

5
Florin Radulescu - Baze de date (note de curs)

REZULTAT CLAUZA HAVING


Fiecare grup format de GROUP BY are, în cazul
Rezultatul obţinut este următorul: cererilor precedente, o linie corespondentă în
MEDIE1 rezultat.
-------- Clauzele descrise până acum nu permit o filtrare la
nivel de grup.
135
De exemplu, dacă se doreşte obţinerea de date doar
De remarcat că această valoare este diferită despre specializările care au studenţi cu un punctaj
de media burselor studenţilor care este de mediu mai mare decât 1200, cererea următoare va
semnala eroare:
133.33 şi este calculată de cererea: SELECT CODS, AVG(PUNCTAJ)
SELECT AVG(NVL(SUMA, 0)) MEDIE2 FROM STUD
FROM STUD, BURSA WHERE AVG(PUNCTAJ) > 1500
WHERE PUNCTAJ BETWEEN PMIN AND PMAX; GROUP BY CODS;

F. Radulescu. Curs: Baze de date - 31 F. Radulescu. Curs: Baze de date - 32


Limbajul SQL Limbajul SQL

CLAUZA HAVING – cont. EXEMPLU


Eroarea se datorează faptului că WHERE  Pentru cererea anterioara formularea corectă este:
poate conţine doar condiţii la nivelul unei linii SELECT CODS, AVG(PUNCTAJ)
din parcurgerea curentă şi nu la nivel de FROM STUD
grup. GROUP BY CODS
Pentru filtrarea grupurilor este necesară o HAVING AVG(PUNCTAJ) > 1500
nouă clauză, HAVING, având următoarea
sintaxă:  Rezultatul va conţine doar o linie, celelalte două
grupuri fiind filtrare de condiţia din HAVING:
HAVING conditie_de_grup CODS AVG(PUNCTAJ)
Condiţia poate fi simplă sau compusă. În ea ----- ------------
pot fi folosite doar elemente constante la
nivel de grup (literali, funcţii statistice, etc.). 11 1560

F. Radulescu. Curs: Baze de date - 33 F. Radulescu. Curs: Baze de date - 34


Limbajul SQL Limbajul SQL

HAVING FARA GROUP BY HAVING SI IMBRICARE


 În cazul în care avem funcţii statistice imbricate,
 Această clauză poate fi folosită şi în absenţa lui rezultatul acestora va fi calculat doar pe baza valorilor
GROUP BY. funcţiei imbricate aplicată grupurilor care satisfac
 În acest caz cererea întoarce fie o linie, fie nici o condiţia din HAVING.
linie, în funcţie de satisfacerea sau nu a condiţiei  De exemplu, următoarea cerere va calcula media
HAVING de liniile parcurgerii curente. burselor medii pentru două specializări (cele cu punctaj
 De exemplu, datorită faptului că punctajul mediu mediu peste 1200) şi nu pentru toate. Rezultatul va fi
pentru întreaga tabelă STUD este mai mic decat 140 şi nu 135 ca atunci când nu există HAVING:
1500, cererea: SELECT AVG(AVG(NVL(SUMA, 0))) MEDIE1
SELECT AVG(PUNCTAJ) FROM STUD, BURSA
FROM STUD WHERE PUNCTAJ BETWEEN PMIN AND PMAX
HAVING AVG(PUNCTAJ) > 1500; GROUP BY CODS
nu va întoarce nici o linie de rezultat. HAVING AVG(PUNCTAJ) > 1200;

F. Radulescu. Curs: Baze de date - 35 F. Radulescu. Curs: Baze de date - 36


Limbajul SQL Limbajul SQL

6
Florin Radulescu - Baze de date (note de curs)

Sfarsitul capitolului
FUNCTII STATISTICE SI
GRUPURI

F. Radulescu. Curs: Baze de date - 37


Limbajul SQL

7
Florin Radulescu - Baze de date (note de curs)

STUD
SQL - 4 MATR NUME AN GRUPA DATAN LOC TUTOR PUNCTAJ CODS
---- ------- -- ------ --------- ---------- ----- ------- ----
1456 GEORGE 4 1141A 12-MAR-82 BUCURESTI 2890 11
1325 VASILE 2 1122A 05-OCT-84 PITESTI 1456 390 11
1645 MARIA 3 1131B 17-JUN-83 PLOIESTI 1400 11
3145 ION 1 2112B 24-JAN-85 PLOIESTI 3251 1670 21
2146 STANCA 4 2141A 15-MAY-82 BUCURESTI 620 21
3251 ALEX 5 2153B 07-NOV-81 BRASOV 1570 21
2215 ELENA 2 2122A 29-AUG-84 BUCURESTI 2146 890 21
SUBCERERI 4311
3514
ADRIAN
FLOREA
3 2431A 31-JUL-83 BUCURESTI
5 2452B 03-FEB-81 BRASOV
450
3230
24
24
1925 OANA 2 2421A 20-DEC-84 BUCURESTI 4311 760 24
2101 MARIUS 1 2412B 02-SEP-85 PITESTI 3514 310 24
4705 VOICU 2 2421B 19-APR-84 BRASOV 4311 1290 24

F. Radulescu. Curs: Baze de date - 1 F. Radulescu. Curs: Baze de date - 2


Limbajul SQL Limbajul SQL

SPEC si BURSA OBIECTIV


CODS NUME DOMENIU
----- ---------- ---------------
O subcerere este o cerere SELECT inclusă
într-o altă cerere SQL.
11 MATEMATICA STIINTE EXACTE
21 GEOGRAFIE UMANIST
Astfel de construcţii se folosesc în cazul în
24 ISTORIE UMANIST
care rezultatul dorit nu se poate obţine cu o
singură parcurgere a datelor.
TIP PMIN PMAX SUMA Exemplu: pentru a afla cine este studentul cu
-------------------- ----- ----- -----
cel mai mare punctaj sunt necesare două
FARA BURSA 0 399
parcurgeri ale tabelei STUD:
BURSA SOCIALA 400 899 100  prima calculează punctajul maxim iar
BURSA DE STUDIU 900 1799 150
ulterior
BURSA DE MERIT 1800 2499 200  a doua afişează datele dorite despre
BURSA DE EXCEPTIE 2500 9999 300 studentul sau studenţii cu acel punctaj.
F. Radulescu. Curs: Baze de date - 3 F. Radulescu. Curs: Baze de date - 4
Limbajul SQL Limbajul SQL

PARCURGERI SUBCERERILE APAR:


Cum o cerere SELECT specifică o în expresiile logice din clauzele WHERE şi
HAVING
singură parcurgere a datelor rezultă că
în clauza ORDER BY a unei cereri SELECT;
pentru rezolvarea problemei sunt valoarea returnată de subcerere pentru
necesare două astfel de cereri, prima fiecare linie a rezultatului va determina
(subcererea) furnizând datele necesare ordinea de afişare a acestora.
pentru a doua (cererea principală). în clauza SELECT; valoarea returnată de
subcerere va fi prezentă în rezultatul final.
în clauza FROM; în acest caz ele sunt
asimilate unor tabele temporare din care se
calculează rezultatul cererii care le include.
F. Radulescu. Curs: Baze de date - 5 F. Radulescu. Curs: Baze de date - 6
Limbajul SQL Limbajul SQL

1
Florin Radulescu - Baze de date (note de curs)

SUBCERERI IN EXPRESII LOGICE O VALOARE


 Rezultatul unui SELECT, dacă este nevid,  În acest caz valoarea întoarsă de subcerere poate fi
este întotdeauna o tabelă. Din punct de folosită ca oricare alta în comparaţii care includ
operatorii obişnuiţi: <, <=, >, >=, = şi <>.
vedere al modului de folosire al unei
subcereri există însă diferenţe în funcţie de  Exemplu: studentul cu cel mai mare punctaj:
subcererea întoarce valoarea maximă a punctajului
forma rezultatului acesteia: din tabela STUD iar cererea care o include numele
1. Subcereri care întorc o singură valoare studentului sau studenţilor care au acel punctaj şi
2. Subcereri care întorc o coloană valoarea acestuia:
SELECT NUME, PUNCTAJ
3. Subcereri care întorc o tabelă. FROM STUD
 În continuare este prezentat modul de WHERE PUNCTAJ =
utilizare pentru fiecare tip în parte (SELECT MAX(PUNCTAJ) FROM STUD)

F. Radulescu. Curs: Baze de date - 7 F. Radulescu. Curs: Baze de date - 8


Limbajul SQL Limbajul SQL

REZULTAT REGULI PENTRU SUBCERERI (1)


Rezultatul obţinut este: Subcererea trebuie să fie întotdeauna în
partea dreaptă a comparaţiei, ca în exemplul
de mai sus.
NUME PUNCTAJ
Subcererea se pune obligatoriu între
---------- ------- paranteze.
FLOREA 3230 Deoarece rezultatul este folosit pentru
calculele cererii principale, ordinea valorilor
returnate nu este importantă. De aceea
subcererile nu pot conţine clauza ORDER BY.

F. Radulescu. Curs: Baze de date - 9 F. Radulescu. Curs: Baze de date - 10


Limbajul SQL Limbajul SQL

REGULI PENTRU SUBCERERI (2) ALTI OPERATORI


Dacă subcererea întoarce mai multe linii se În afară de operatorii uzuali de
semnalează eroarea ORA-01427: single-row comparaţie, în cazul acestui tip de
subquery returns more than one row. subcereri se pot folosi şi operatorii
Dacă subcererea nu întoarce nici o linie, BETWEEN, LIKE şi IS NULL.
comparaţia în care e implicată se evaluează la Exemplele următoare reprezintă cereri
FALS. valide conţinând şi BETWEEN sau LIKE.
O cerere poate conţine una sau mai multe Folosirea lui IS NULL pentru o subcerere
subcereri, acestea putând fi pe acelaşi nivel este relevantă doar în cazul subcererilor
sau incluse una în alta. corelate prezentate într-un alt
subcapitol.
F. Radulescu. Curs: Baze de date - 11 F. Radulescu. Curs: Baze de date - 12
Limbajul SQL Limbajul SQL

2
Florin Radulescu - Baze de date (note de curs)

SUBCERERI IN BETWEEN SUBCERERI IN LIKE


Afişarea numelui şi punctajului pentru Afişarea aceloraşi date ca mai sus pentru
studenţii având un punctaj egal cu cel mediu studenţii având un nume care nu începe cu
+/- 30%. Se foloseşte operatorul BETWEEN aceeaşi literă cu a studentului cu punctaj
având ca parametri două subcereri: maxim:
SELECT NUME, PUNCTAJ
FROM STUD
SELECT NUME, PUNCTAJ WHERE NUME NOT LIKE SUBSTR(
FROM STUD (SELECT NUME FROM STUD
WHERE PUNCTAJ BETWEEN WHERE PUNCTAJ = (SELECT MAX(PUNCTAJ)
(SELECT AVG(PUNCTAJ) FROM STUD)*0.7 AND FROM STUD)
(SELECT AVG(PUNCTAJ) FROM STUD)*1.3; ) , 1, 1) || '%';

F. Radulescu. Curs: Baze de date - 13 F. Radulescu. Curs: Baze de date - 14


Limbajul SQL Limbajul SQL

SUBCERERI IN LIKE (2) ERORI (1)


Există două niveluri de imbricare: Subcererea întoarce mai multe valori.
Subcererea de nivel 2 întoarce valoarea În acest caz nu vom obţine un rezultat
maximă a punctajului. ci mesajul de eroare menţionat anterior:
Subcererea de nivel 1 întoarce numele SELECT NUME, PUNCTAJ
studentului cu acel punctaj. FROM STUD
În cererea principală este decupată prima WHERE PUNCTAJ = (SELECT PUNCTAJ FROM
literă a acestui nume, folosind funcţia STUD);
SUBSTR(rezultat, 1, 1) şi este concatenată cu
caracterul % pentru a forma un şablon folosit
apoi de condiţia NOT LIKE.
F. Radulescu. Curs: Baze de date - 15 F. Radulescu. Curs: Baze de date - 16
Limbajul SQL Limbajul SQL

ERORI (2) O COLOANA


Subcererea nu întoarce nici o valoare. În acest caz valorile coloanei întoarse
În acest caz vom obţine un rezultat vid de subcerere sunt asimilate unei
(fără nici o linie), condiţia evaluându-se mulţimi.
la FALS: Condiţia trebuie să folosească
SELECT NUME, PUNCTAJ
operatorul IN sau negatul acestuia NOT
FROM STUD
IN şi nu operatori de comparaţie.
WHERE PUNCTAJ =
(SELECT MAX(PUNCTAJ) FROM STUD WHERE
CODS = 100)

F. Radulescu. Curs: Baze de date - 17 F. Radulescu. Curs: Baze de date - 18


Limbajul SQL Limbajul SQL

3
Florin Radulescu - Baze de date (note de curs)

EXEMPLU REZULTAT
Cererea din exemplul următor afişează lista Rezultatul va conţine datele pentru doi
tuturor studenţilor de la specializarea cu
codul 21 care sunt tutori ai altor studenţi.
studenţi:
NUME CODS
Pentru a fi tutor, matricola studentului trebuie ---------- -----
să aparţină mulţimii valorilor aflate pe STANCA 21
coloana TUTOR din tabela STUD calculată cu ALEX 21
ajutorul subcererii:
SELECT NUME, CODS Observaţie: NOT IN returnează
FROM STUD întotdeauna valoarea fals în cazul în
WHERE MATR IN (SELECT TUTOR FROM STUD) care mulţimea conţine valori nule.
AND CODS = 21;

F. Radulescu. Curs: Baze de date - 19 F. Radulescu. Curs: Baze de date - 20


Limbajul SQL Limbajul SQL

NOT IN NOT IN – cont.


Din această cauză pentru a obţine lista În astfel de cazuri este necesară eliminarea
studenţilor de la această specializare acestor valori din rezultat prin adăugarea unei
care nu sunt tutori nu se poate folosi condiţii suplimentare de tip IS NOT NULL:
cererea: SELECT NUME, CODS
SELECT NUME, CODS FROM STUD
FROM STUD WHERE MATR NOT IN
WHERE MATR NOT IN (SELECT TUTOR FROM (SELECT TUTOR FROM STUD
STUD) AND CODS = 21;
WHERE TUTOR IS NOT NULL)
deoarece subcererea întoarce o coloană AND CODS = 21;
care conţine şi valori nule.
F. Radulescu. Curs: Baze de date - 21 F. Radulescu. Curs: Baze de date - 22
Limbajul SQL Limbajul SQL

SUBCERERI CU GROUP BY SUBCERERI CU GROUP BY (2)


 În exemplul următor subcererea foloseşte o clauză SELECT NUME, PUNCTAJ, CODS
GROUP BY pentru a genera punctajele maxime FROM STUD
pentru fiecare specializare. Cererea principală WHERE PUNCTAJ IN
afişează studenţii care au un punctaj egal cu vreuna (SELECT MAX(PUNCTAJ)
dintre valorile returnate: FROM STUD
SELECT NUME, PUNCTAJ, CODS GROUP BY CODS);
FROM STUD
WHERE PUNCTAJ IN  Întâmplător, rezultatul conţine chiar studenţii cu cel
(SELECT MAX(PUNCTAJ) mai mare punctaj pentru fiecare specializare.
FROM STUD  În cazul general însă rezultatul poate conţine şi
studenţi care nu au punctajul maxim la specializarea
GROUP BY CODS); lor dar egal cu maximul unei alte specializări.

F. Radulescu. Curs: Baze de date - 23 F. Radulescu. Curs: Baze de date - 24


Limbajul SQL Limbajul SQL

4
Florin Radulescu - Baze de date (note de curs)

SOME/ANY SI ALL EXEMPLE (1)


Este posibilă folosirea operatorilor de Lista studenţilor care au un punctaj mai mare
comparaţie uzuali (<, >, =, etc.) în decât al vreunui student de la specializarea
conjuncţie cu o cerere care întoarce o coloană cu cod 11:
dacă aceasta este prefixată cu unul din SELECT NUME, PUNCTAJ
operatorii SOME, ANY şi ALL.
FROM STUD
Semnificaţia lor este următoarea: WHERE PUNCTAJ >
 SOME şi ANY: condiţia este adevărată dacă SOME(SELECT PUNCTAJ FROM STUD
măcar o valoare dintre cele returnate de WHERE CODS = 11);
subcerere verifică comparaţia respectivă.
Înlocuirea lui SOME cu ANY duce la obţinerea
 ALL: condiţia este adevărată dacă toate
valorile returnate de subcerere verifică aceluiaşi rezultat, cei doi operatori efectuând
comparaţia respectivă. aceeaşi operaţie

F. Radulescu. Curs: Baze de date - 25 F. Radulescu. Curs: Baze de date - 26


Limbajul SQL Limbajul SQL

EXEMPLE (2) O TABELA


Lista studenţilor care au un punctaj mai În cazul în care subcererea întoarce un
mare decât al tuturor studenţilor de la rezultat care are mai multe coloane
specializarea 11: acesta este asimilat cu o mulţime de
SELECT NUME, PUNCTAJ linii şi se poate folosi operatorul IN în
FROM STUD următorul mod:
WHERE PUNCTAJ >
ALL(SELECT PUNCTAJ FROM STUD
WHERE (lista_de_expresii) IN (subcerere)
WHERE CODS = 11);

F. Radulescu. Curs: Baze de date - 27 F. Radulescu. Curs: Baze de date - 28


Limbajul SQL Limbajul SQL

REGULI REGULI - cont


1. Lista de expresii trebuie încadrată de 4. Tipurile elementelor corespondente trebuie
paranteze rotunde. să fie aceleaşi sau convertibile automat unul
la celălalt (sistemul Oracle face conversia
2. Numărul de coloane din rezultatul automată între tipurile şir de caractere şi
subcererii trebuie să fie egal cu numere/date calendaristice).
numărul de expresii din listă. 5. Condiţia este adevărată dacă rezultatul
3. Corespondenţa între valorile subcererii conţine măcar o linie formată din
expresiilor din listă şi coloanele valorile expresiilor din listă.
rezultatului este poziţională. 6. Dacă rezultatul subcererii este vid întreaga
condiţie este evaluată la fals.
F. Radulescu. Curs: Baze de date - 29 F. Radulescu. Curs: Baze de date - 30
Limbajul SQL Limbajul SQL

5
Florin Radulescu - Baze de date (note de curs)

EXEMPLU OBSERVATIE
 Pentru a afla care sunt studenţii cu cel mai mare Observaţie: Din cauza faptului că două valori
punctaj de la fiecare specializare, cererea este
următoarea: nule nu sunt egale între ele un cuplu de tipul
SELECT NUME, PUNCTAJ, CODS (NULL, valoare) nu va fi considerat egal cu el
FROM STUD însuşi.
WHERE (CODS, PUNCTAJ) IN
(SELECT CODS, MAX(PUNCTAJ) Din acest motiv, cererea următoare nu va
FROM STUD returna date despre studenţii care nu au un
GROUP BY CODS); tutor asociat (au o valoare nulă pe această
 Codiţia va fi adevărată dacă punctajul studentului coloană) deşi în aparenţă condiţia ar trebui să
este egal cu un punctaj maxim întors de subcerere şi
în acelaşi timp codul specializării este al celei pentru fie adevărată pentru orice student al
care s-a calculat maximul respectiv. specializării având codul 11:
F. Radulescu. Curs: Baze de date - 31 F. Radulescu. Curs: Baze de date - 32
Limbajul SQL Limbajul SQL

EXEMPLU REZULTATE
MATR NUME CODS TUTOR
----- ---------- ----- -----
SELECT MATR, NUME, CODS, TUTOR 1325 VASILE 11 1456
FROM STUD
WHERE (MATR, NUME, CODS, TUTOR) IN deşi rezultatul subcererii (executată separat)
(SELECT MATR, NUME, CODS, TUTOR este următorul:
FROM STUD MATR NUME CODS TUTOR
WHERE CODS = 11); ----- ---------- ----- -----
1456 GEORGE 11
1325 VASILE 11 1456
1645 MARIA 11
F. Radulescu. Curs: Baze de date - 33 F. Radulescu. Curs: Baze de date - 34
Limbajul SQL Limbajul SQL

SUBCERERI PE HAVING EXEMPLE (1)


Expresiile logice conţinând subcereri se pot Afişarea codului numeric şi a punctajulelor
folosi şi pe clauza HAVING în acelaşi mod ca minim şi maxim doar pentru specializările
mai sus. care au un punctaj MEDIU peste media
În acest caz însă condiţiile vor conţine doar calculată la nivelul întregii tabele STUD:
elementele care pot să apară într-o astfel de SELECT CODS, MIN(PUNCTAJ), MAX(PUNCTAJ)
clauză: constante, expresiile după care se FROM STUD
face gruparea şi funcţii statistice. GROUP BY CODS
În continuare sunt prezentate câteva HAVING AVG(PUNCTAJ) >
exemple: (SELECT AVG(PUNCTAJ) FROM STUD);

F. Radulescu. Curs: Baze de date - 35 F. Radulescu. Curs: Baze de date - 36


Limbajul SQL Limbajul SQL

6
Florin Radulescu - Baze de date (note de curs)

EXEMPLE (2) EXEMPLE (3)


 Afişarea codului şi a punctajului maxim pentru toate
Afişarea codului şi a punctajului mediu pentru specializările în afara celei/celor cu cel mai mic punctaj maxim.
specializarea cu cel mai mare punctaj mediu Pentru ca o specializare să apară în rezultat punctajul său
maxim trebuie să fie mai mare decât al vreunei alte specializări.
(functii statistice imbricate in subcerere): Subcererea întoarce lista punctajelor maxime iar comparaţia
dorită se face folosind operatorul ANY:
SELECT CODS, AVG(PUNCTAJ) SELECT CODS, MAX(PUNCTAJ)
FROM STUD FROM STUD
GROUP BY CODS GROUP BY CODS
HAVING AVG(PUNCTAJ) = HAVING AVG(PUNCTAJ) >
ANY (SELECT AVG(PUNCTAJ)
(SELECT MAX(AVG(PUNCTAJ))
FROM STUD
FROM STUD GROUP BY CODS);
GROUP BY CODS);

F. Radulescu. Curs: Baze de date - 37 F. Radulescu. Curs: Baze de date - 38


Limbajul SQL Limbajul SQL

SUBCERERI PE FROM JOIN DE SUBCERERI


În cazul în care o subcerere apare pe clauza În cazul în care subcererea este implicată într-un
FROM ea va fi tratată ca o tabelă temporară. join se pot folsi aliasuri de tabelă pentru a
Cererea următoare afişează numele dezambigua numele coloanelor rezultatului său.
studenţilor bursieri de la specializarea cu Cererea anterioară se poate rescrie şi astfel:
codul 11.
SELECT NUME, SUMA
SELECT NUME, SUMA
FROM (SELECT * FROM (SELECT * FROM STUD WHERE CODS = 11) S11,
FROM STUD, BURSA (SELECT * FROM BURSA WHERE SUMA IS NOT NULL) B
WHERE PUNCTAJ BETWEEN PMIN AND PMAX WHERE S11.PUNCTAJ BETWEEN B.PMIN AND B.PMAX;
AND CODS = 11
AND SUMA IS NOT NULL);

F. Radulescu. Curs: Baze de date - 39 F. Radulescu. Curs: Baze de date - 40


Limbajul SQL Limbajul SQL

JOIN CU SUBCERERI REZULTAT VID


Folosirea aliasurilor de tabelă este obligatorie În cazul în care o subcerere aflată pe clauza
în cazul în care tabelele implicate în join au FROM nu întoarce nici o linie nu se
coloane cu acelaşi nume. În exemplul se semnalează o eroare dar cererea care o
include va returna un rezultat vid, inclusiv în
afişează numele studenţilor şi numele cazul unui produs cartezian.
specializării pentru specializarea cu codul 11: Subcererea din exemplul următor nu
returnează linii deoarece specializarea cu
SELECT ST.NUME, SP.NUME codul 100 nu există:
FROM STUD ST, SELECT ST.NUME, SP.NUME
FROM STUD ST,
(SELECT * FROM SPEC WHERE CODS = 11) SP
(SELECT * FROM SPEC WHERE CODS = 100) SP
WHERE ST.CODS = SP.CODS; WHERE ST.CODS = SP.CODS;

F. Radulescu. Curs: Baze de date - 41 F. Radulescu. Curs: Baze de date - 42


Limbajul SQL Limbajul SQL

7
Florin Radulescu - Baze de date (note de curs)

REZULTAT VID (2) SUBCERERI CORELATE


 O astfel de subcerere poate participa însă la un join În exemplele anterioare subcererea se
extern:
SELECT ST.NUME, SP.NUME execută o singură dată după care rezultatul
FROM STUD ST, (SELECT * FROM SPEC WHERE său este folosit pentru evaluarea care o
CODS = 100) SP include.
WHERE ST.CODS = SP.CODS(+);
 sau: Există însă posibilitatea ca rezultatul
subcererii să fie dependent de valorile de pe
SELECT ST.NUME, SP.NUME linia curentă a parcurgerii definite de cerere.
FROM STUD ST În acest caz se spune că avem o subcerere
FULL OUTER JOIN (SELECT * FROM SPEC
WHERE CODS = 100) SP corelată.
ON (ST.CODS = SP.CODS);
F. Radulescu. Curs: Baze de date - 43 F. Radulescu. Curs: Baze de date - 44
Limbajul SQL Limbajul SQL

SELECT NUME, CODS, PUNCTAJ -- CALCUL REZULTAT

SUBCERERI CORELATE (2) FROM STUD S


WHERE PUNCTAJ > (SELECT AVG(PUNCTAJ) FROM STUD WHERE CODS = S.CODS);

 Descrierea modului de evaluare în astfel de situaţii va  Pentru fiecare linie a tabelei STUD valoarea de pe
fi făcută pe baza următorului exemplu care afişează coloana CODS - codul specializării - va fi transmisă
date despre studenţii care au un punctaj peste media subcererii (S.CODS).
celor din specializarea lor.  Se execută subcererea care calculează punctajul
 Deoarece şi cererea şi subcererea lucrează pe aceeaşi mediu pentru studenţii de la specializarea respectivă
tabelă, se foloseşte aliasul de tabelă S pentru a (AVG şi condiţia CODS = S.CODS).
specifica parcurgerea principală (cea din cerere).  Rezultatul subcererii este folosit în cerere pentru a
SELECT NUME, CODS, PUNCTAJ filtra sau nu linia curentă (condiţia PUNCTAJ >
FROM STUD S rezultat subcerere).
WHERE PUNCTAJ > (SELECT AVG(PUNCTAJ) FROM  Teoretic subcererea nu se mai execută o singură dată
STUD WHERE CODS = S.CODS); ci pentru fiecare linie din parcurgerea specificată de
cererea în care este inclusă.

F. Radulescu. Curs: Baze de date - 45 F. Radulescu. Curs: Baze de date - 46


Limbajul SQL Limbajul SQL

EXEMPLU OBSERVATII
 Numele, codul şi numărul total de studenţi pentru  În cazul în care subcererea corelată se află pe clauza
specializările la care este înmatriculat cel puţin un WHERE ea poate primi valoarea de pe orice coloană
student de anul 1. : a tabelei/produsului cartezian din cererea
SELECT SP.NUME, ST.CODS, COUNT(*) înconjurătoare.
FROM STUD ST, SPEC SP  În cazul în care subcererea corelată este pe clauza
WHERE ST.CODS = SP.CODS HAVING poate primi doar coloanele/expresiile după
care s-a facut gruparea.
GROUP BY SP.NUME, ST.CODS
 Subcererile corelate pot returna o valoare, o coloană
HAVING 1 <= (SELECT COUNT(*) sau o tabelă, ca şi cele necorelate. În cazul în care
FROM STUD returnează o coloană sau o tabelă se poate folosi
WHERE CODS = ST.CODS AND operatorul IN. Sunt permişi de asemenea operatorii
AN = 1); SOME/ANY şi ALL.

F. Radulescu. Curs: Baze de date - 47 F. Radulescu. Curs: Baze de date - 48


Limbajul SQL Limbajul SQL

8
Florin Radulescu - Baze de date (note de curs)

OPERATORUL EXISTS EXEMPLU


Acest operator testează dacă subcererea Lista specializărilor unde există cel
primită ca argument întoarce un rezultat puţin un student de anul 1:
nevid. Sintaxa sa este: SELECT CODS, NUME
EXISTS(subcerere)
FROM SPEC
Returnează valorea logică ADEVARAT dacă WHERE EXISTS (SELECT 1
subcererea are un rezultat nevid şi FALS dacă
rezultatul e vid (nici o linie). FROM STUD
În cazul acestui operator nu este important WHERE SPEC.CODS = CODS
conţinutul rezultatului subcererii ci doar AND AN = 1);
existenţa sau absenţa sa.
F. Radulescu. Curs: Baze de date - 49 F. Radulescu. Curs: Baze de date - 50
Limbajul SQL Limbajul SQL

SUBCERERI IN ORDER BY EXEMPLU


În actualele versiuni ale sistemului Ordonarea se face după numărul de
Oracle clauza ORDER BY poate conţine studenţi îndrumaţi de fiecare tutor:
o subcerere Aceasta trebuie să SELECT NUME, CODS, AN
returneze o singură valoare şi să fie o FROM STUD S
subcerere corelată. WHERE CODS = 24
Prezenţa unei cereri necorelate pe ORDER BY (SELECT COUNT(*) FROM STUD
această clauză nu duce la ordonarea WHERE TUTOR = S.MATR) DESC;
rezultatului deoarece rezultatul fiind o
constantă are aceeaşi valoare pentru
fiecare dintre liniile supuse sortării.
F. Radulescu. Curs: Baze de date - 51 F. Radulescu. Curs: Baze de date - 52
Limbajul SQL Limbajul SQL

SUBCERERI PE SELECT EXEMPLU


SELECT NUME, (SELECT COUNT(*)
Ca şi în cazul celor din ORDER BY
FROM STUD
aceste subcereri trebuie să întoarcă o WHERE TUTOR = S.MATR) NUMAR
singură valoare. FROM STUD S
Subcererea poate fi necorelată (în acest WHERE CODS = 24
AND 1 <= (SELECT COUNT(*)
caz pe coloana respectivă din rezultat
FROM STUD
vom avea aceeaşi valoare) sau corelată. WHERE TUTOR = S.MATR)
ORDER BY (SELECT COUNT(*)
FROM STUD
WHERE TUTOR = S.MATR) DESC

F. Radulescu. Curs: Baze de date - 53 F. Radulescu. Curs: Baze de date - 54


Limbajul SQL Limbajul SQL

9
Florin Radulescu - Baze de date (note de curs)

UNION INTERSET si MINUS REGULI


 Ambele cereri întorc acelaşi număr de coloane.
Sintaxa:  Coloanele corespondente au valori de acelaşi tip sau de tipuri
pentru care sistemul poate face automat conversia.
 Operatorii pot fi folosiţi repetat şi succesiv pentru a forma
expresii. În acest caz, dacă nu se folosesc paranteze pentru a
Subcerere schimba ordinea de evaluare, ei se execută în ordinea în care
UNION | INTERSECT | MINUS apar în expresie.
 Capul de tabel al rezultatului este cel dat de prima cerere din
Subcerere expresie.
 Cererile implicate în aceste operaţii nu pot conţine clauza
ORDER BY. Aceasta poate să fie pusă doar la sfârşitul expresiei
şi poate conţine nume de coloane din rezultat sau numerele de
ordine ale acestora.
 Rezultatul nu conţine linii duplicat. Acestea sunt eliminate chiar
dacă provin din aceeaşi cerere - operand al expresiei.

F. Radulescu. Curs: Baze de date - 55 F. Radulescu. Curs: Baze de date - 56


Limbajul SQL Limbajul SQL

EXEMPLU
SELECT NUME, CODS, LOC, PUNCTAJ
FROM STUD
WHERE CODS = 11 AND PUNCTAJ > 2000
UNION
SELECT NUME, CODS, LOC, PUNCTAJ
FROM STUD Sfarsitul capitolului
WHERE CODS = 21 AND LOC = 'BUCURESTI'
UNION
SELECT NUME, CODS, LOC, PUNCTAJ
FROM STUD
SUBCERERI
WHERE CODS = 24 AND PUNCTAJ >1500
INTERSECT
SELECT NUME, CODS, LOC, PUNCTAJ
FROM STUD
WHERE PUNCTAJ >= 700
ORDER BY LOC DESC, 4;

F. Radulescu. Curs: Baze de date - 57 F. Radulescu. Curs: Baze de date - 58


Limbajul SQL Limbajul SQL

10
Florin Radulescu - Baze de date (note de curs)

STUD
SQL - 5 MATR NUME AN GRUPA DATAN LOC TUTOR PUNCTAJ CODS
---- ------- -- ------ --------- ---------- ----- ------- ----
1456 GEORGE 4 1141A 12-MAR-82 BUCURESTI 2890 11
1325 VASILE 2 1122A 05-OCT-84 PITESTI 1456 390 11
1645 MARIA 3 1131B 17-JUN-83 PLOIESTI 1400 11
3145 ION 1 2112B 24-JAN-85 PLOIESTI 3251 1670 21
2146 STANCA 4 2141A 15-MAY-82 BUCURESTI 620 21
3251 ALEX 5 2153B 07-NOV-81 BRASOV 1570 21
2215 ELENA 2 2122A 29-AUG-84 BUCURESTI 2146 890 21
CREAREA TABELELOR 4311
3514
ADRIAN
FLOREA
3 2431A 31-JUL-83 BUCURESTI
5 2452B 03-FEB-81 BRASOV
450
3230
24
24
1925 OANA 2 2421A 20-DEC-84 BUCURESTI 4311 760 24

- Partea 1 - 2101
4705
MARIUS
VOICU
1 2412B 02-SEP-85 PITESTI
2 2421B 19-APR-84 BRASOV
3514
4311
310
1290
24
24

F. Radulescu. Curs: Baze de date 1 F. Radulescu. Curs: Baze de date 2

SPEC si BURSA OBIECTIV


CODS NUME DOMENIU
----- ---------- ---------------
Scopul acestui capitol este de a prezenta
elementele limbajului pentru descrierea
11 MATEMATICA STIINTE EXACTE
datelor (DDL) referitoare la:
21 GEOGRAFIE UMANIST
24 ISTORIE UMANIST
Tipurile de date permise pentru coloanele
tabelelor,
TIP PMIN PMAX SUMA Crearea de noi tabele,
-------------------- ----- ----- ----- Constrângeri de integritate,
FARA BURSA 0 399 Modificarea structurii unei tabele,
BURSA SOCIALA 400 899 100 Modificarea şi activarea constrângerilor de
BURSA DE STUDIU 900 1799 150 integritate,
BURSA DE MERIT 1800 2499 200 Dicţionarul de date al sistemului.
BURSA DE EXCEPTIE 2500 9999 300

F. Radulescu. Curs: Baze de date 3 F. Radulescu. Curs: Baze de date 4

TIPURI DE DATE TIPURI DE DATE (2)


Sistemul Oracle pune la dispoziţie un set optim Aceste tipuri, cu unele diferenţe în ceea ce
de tipuri de date care pot fi asociate
coloanelor unei tabele, grupate în mai multe priveşte dimensiunea maximă admisă, pot
categorii: fi folosite şi în limbajul procedural PL/SQL.
Tipuri numerice scalare În continuare sunt prezentate tipurile din
Tipuri scalare şir de caractere primele cinci categorii.
Tipuri scalare binare
Tipuri pentru date calendaristice, timp şi Crearea unei tabele cu coloane de tip
interval de timp TABLE şi VARRAY şi manipularea datelor
Tipuri LOB (large object) de acest fel nu este prezentată în acest
Tipuri compuse: TABLE şi VARRAY capitolul.
F. Radulescu. Curs: Baze de date 5 F. Radulescu. Curs: Baze de date 6

1
Florin Radulescu - Baze de date (note de curs)

TIPURI NUMERICE SCALARE TIPURI NUMERICE SCALARE (2)


Tip Descriere Tip Descriere
INTEGER, INT, Subtipuri pentru NUMBER. Numere întregi
NUMBER Număr real de dimensiune variabilă, cu 38 de SMALLINT cu maxim 38 de cifre
cifre semnificative, având valori între 1E-130 BINARY_INTEGER Întregi între -231 şi 231.
şi 10E125. NATURAL, Subtipuri pentru BINARY_INTEGER.
NUMBER(n) Număr întreg cu maxim n cifre POSITIVE Numere întregi non-negative, respectiv
pozitive.
NUMBER(n, z) Număr real cu n cifre dintre care z zecimale NATURALN, Subtipuri pentru BINARY_INTEGER.
DEC, DECIMAL, Subtipuri pentru NUMBER. Numere în POSITIVEN Numere întregi nenule non-negative,
NUMERIC virgulă fixă cu 38 de cifre semnificative. respectiv pozitive.
SIGNTYPE Subtip al BINARY_INTEGER. Poate lua
DOUBLE Subtipuri pentru NUMBER. Numere în doar valorile -1, 0 şi 1.
PRECISION, FLOAT virgulă mobilă cu 38 de cifre semnificative. PLS_INTEGER Întregi între -2
31 31
şi 2 . Similar cu
REAL Subtip pentru NUMBER. Numere în virgulă BINARY_INTEGER dar operaţiile cu astfel
mobilă cu 18 cifre semnificative. de numere sunt mai rapide şi în caz de
depăşire se ridică o excepţie.

F. Radulescu. Curs: Baze de date 7 F. Radulescu. Curs: Baze de date 8

SIRURI SIRURI (2)


Tip Descriere Tip Descriere
CHAR(n), CHAR Şir de caractere de lungime fixă, egală cu n. LONG Şir de caractere de maxim 231 octeţi. Este
Valoarea maximă pentru n este 2000. Dacă n permisă doar o singură coloană de acest tip
lipseşte, şir de caractere de lungime 1. pentru o tabelă.
CHARACTER, Identice cu cele anterioare. Introduse pentru ROWID Poate stoca un identificator pentru o linie
CHARACTER(n) compatibilitatea cu alte sisteme. dintr-o tabelă. Pentru conversia la/de la şir
de caractere (18 caractere) se pot folosi
NCHAR(n) Analog cu CHAR dar poate stoca şiruri scrise funcţiile SQL ROWIDTOCHAR respectiv
în seturi de caractere naţionale (multioctet) CHARTOROWID.
VARCHAR2(n) Şir de caractere de lungime variabilă egală cu UROWID Universal ROWID. Poate stoca un
n. Valoarea maximă pentru n este 4000. identificator logic şi fizic de linie într-o
STRING(n), Identice cu VARCHAR2, introduse pentru tabelă, indexată sau nu precum şi un
VARCHAR(n) compatibilitatea cu alte sisteme identificator de linie extern (non-Oracle). Nu
NVARCHAR(n) Analog cu VARCHAR. Poate stoca şiruri este necesară folosirea funcţiilor de conversie
scrise în seturi de caractere naţionale la/de la şir de caractere (conversie
automată).
(multioctet)

F. Radulescu. Curs: Baze de date 9 F. Radulescu. Curs: Baze de date 10

TIPURI BINARE DATE, TIMP SI INTERVAL


Tip Descriere
DATE Dată calendaristică (secol, an, lună, zi, oră,
minut, secundă).
TIMESTAMP[(n)] Extensie a tipului DATE. Conţine şi fracţiuni
de secundă. Dacă este prezent, n specifică
Tip Descriere numărul de zecimale pentru acestea. Implicit
n=6
RAW(n) Similar cu VARCHAR2 dar conţine date TIMESTAMP [(n)] Extinde tipul TIMESTAMP conţinând şi o
WITH TIME ZONE diferenţă între ora locală şi ora universală
binare. Valoarea maximă pentru n este de TIMESTAMP [(n)]
(GMT)
Similar cu tipul anterior dar la stocarea în
2000. WITH LOCAL TIME
ZONE
baza de date valorile sunt convertite la ora
zonei bazei de date iar la regăsire la ora zonei
LONG RAW Similar cu LONG dar conţine date binare. INTERVAL YEAR
aplicaţiei client.
Se stochează intervale de ani şi luni. Precizia
[(n)] TO MONTH n specifică numărul de cifre pentru an (între 0
şi 4, implicit 2).
INTERVAL DAY Similar cu tipul anterior, dar pentru intervale
[(z)] TO SECOND de zile şi secunde. valorile z şi s sunt
[(s)] preciziile pentru zile, respectiv secunde (0-9,
implicit 2 pentru z şi 6 pentru s).

F. Radulescu. Curs: Baze de date 11 F. Radulescu. Curs: Baze de date 12

2
Florin Radulescu - Baze de date (note de curs)

TIPURI LARGE OBJECT TIPURI LOB – cont.


Aceste tipuri, introduse în ultimele versiuni
ale sistemului, permit stocarea unor cantităţi Tip Descriere
mari de date pe coloanele unei tabele sau a CLOB Şir de caractere de până la 4 GB. Se
recomandă ca în aplicaţiile noi să fie folosit
unei referinţe (numită şi locator) către un în locul lui LONG.
NCLOB Similar cu CLOB dar se pot stoca şiruri
fişier extern bazei de date. utilizând seturi naţionale de caractere.
Dimensiunea maximă este de asemenea de 4
Manipularea valorilor de acest tip se face în GB
BLOB Date binare de dimensiune până la 4 GB
PL/SQL cu ajutorul pachetelor de proceduri şi BFILE Date binare de dimensiune până la 4 GB
funcţii puse la dispoziţie de sistem. stocate în fişiere externe. Nu participă la
tranzacţii, replicare şi pot fi doar citite nu şi
Caracteristicile lor sunt următoarele: modificate.

F. Radulescu. Curs: Baze de date 13 F. Radulescu. Curs: Baze de date 14

OBIECTIV CREATE TABLE


Scopul acestui capitol este de a prezenta  Cea mai simplă formă a cererii SQL de creare a unei noi
elementele limbajului pentru descrierea tabele are următoarea sintaxă:
datelor (DDL) referitoare la: CREATE TABLE [schema.]nume_tabela
Tipurile de date permise pentru coloanele (nume_coloana_1 tip_coloana_1 [DEFAULT
expresie_1],
tabelelor, nume_coloana_2 tip_coloana_2 [DEFAULT
Crearea de noi tabele, expresie_2],
Constrângeri de integritate, . . .
Modificarea structurii unei tabele, nume_coloana_n tip_coloana_n [DEFAULT
expresie_n]);
Modificarea şi activarea constrângerilor de unde:
integritate,
 nume_tabela este numele tabelei care se crează,
Dicţionarul de date al sistemului.  nume_coloana_1, nume_coloana_2, ... sunt numele
coloanelor acesteia
F. Radulescu. Curs: Baze de date 15 F. Radulescu. Curs: Baze de date 16

CREATE TABLE – cont. TREBUIE CA:


 tip_coloana_1, tip_coloana_2, ... reprezintă  Utilizatorul are drepturile necesare (dreptul sau
tipurile de date pentru coloanele respective, alese privilegiul - în terminologia uzuală - de CREATE
dintre cele prezentate în paragraful anterior, cu TABLE).
specificarea, dacă este cazul, a dimensiunii maxime  Există spaţiu de stocare pentru noua tabelă.
sau preciziei,  Numele tabelei şi al coloanelor respectă restricţiile
 clauza opţională DEFAULT expresie_i specifică o uzuale Oracle (maxim 30 de caractere, începe cu o
valoare implicită care este introdusă automat în acea literă, conţine litere, cifre şi caracterele _, $, #, nu
coloană în cazul în care la adăugarea unei noi linii nu este cuvânt rezervat Oracle). Sunt permise şi alte
se specifică o valoare pe coloana respectivă, caractere dacă numele este inclus între ghilimele.
 schema este numele de utilizator Oracle al  Nu există deja un alt obiect cu acelaşi nume în
proprietarului noii tabele. Valoarea implicită pentru aceeaşi schemă (pentru acelaşi utilizator Oracle).
acesta este numele utilizatorului care execută
cererea de creare.
F. Radulescu. Curs: Baze de date 17 F. Radulescu. Curs: Baze de date 18

3
Florin Radulescu - Baze de date (note de curs)

LITERE MARI SI MICI OBSERVATII


Ca şi în cazul cuvintelor cheie, literele Expresia din clauza opţională DEFAULT
trebuie să se evalueze la o valoare de tip
mici şi cele mari sunt considerate egale compatibil cu al coloanei respective. Ea poate
în numele de tabele şi coloane. conţine:
Exemplu: tabela de studenţi din  Constante numerice sau şir de caractere,
 Funcţii SQL, inclusiv SYSDATE sau USER.
exemple este aceeaşi dacă la creare se
 dar nu poate conţine:
foloseşte oricare din numele STUD,  Numele unei coloane,
Stud sau StuD.  Numele unei pseudocoloane. (de exemplu
pseudocoloanele definite de o secvenţă: NEXTVAL
sau CURRVAL).

F. Radulescu. Curs: Baze de date 19 F. Radulescu. Curs: Baze de date 20

EXEMPLU OBSERVAM CA:


CREATE TABLE STUD(  MATR, AN, TUTOR, PUNCTAJ şi CODS care conţin
valori de tip număr întreg au fost definite ca
MATR NUMBER(4), NUMBER(n) unde n este 1, 2 sau 4,
NUME VARCHAR2(10),  NUME, GRUPA şi LOC sunt şiruri de caractere de
AN NUMBER(1) DEFAULT 1, lungime variabilă definite ca VARCHAR2,
GRUPA VARCHAR2(6),  DATAN care conţine data naşterii studentului este de
tipul DATE,
DATAN DATE,  Pentru unele dintre coloane au fost asociate valori
LOC VARCHAR2(10) DEFAULT 'BUCURESTI', implicite care vor fi stocate automat în acestea dacă
la inserarea unei noi linii nu se specifică o valoare,
TUTOR NUMBER(4), nulă sau nenulă.
PUNCTAJ NUMBER(4) DEFAULT 0,  Valorile implicite sunt compatibile cu tipul coloanelor
CODS NUMBER(2) ); respective (întreg sau şir de caractere, după caz).

F. Radulescu. Curs: Baze de date 21 F. Radulescu. Curs: Baze de date 22

OBSERVAM CA:
Crearea unei tabele în care se stochează date  COD: un număr întreg de maxim 10 cifre,
 MOMENT ÎNCEPUT: conţine momentul începutului
despre evenimente: momentul de început, unui eveniment în forma: data, ora, minutul, secunda
durata şi o descriere a acestora. şi miimile de secundă: TIMESTAMP(3) arată că
CREATE TABLE EVENIMENT( fracţiunile de secundă sunt memorate cu 3 zecimale.
Numele coloanei conţine un spaţiu şi a trebuit pus
COD NUMBER(10), între ghilimele.
"MOMENT INCEPUT" TIMESTAMP(3) WITH LOCAL  DURATA: durata evenimentului în zile, ore, minute,
TIME ZONE, secunde şi fracţiuni de secundă. Numărul de zile
poate avea maxim 2 cifre iar numărul de secunde
DURATA INTERVAL DAY(2) TO SECOND(3), maxim 3 zecimale.
"DESCRIERE (PE LARG)" LONG);  DESCRIERE (PE LARG): conţine un text de descriere
a evenimentului care poate avea până la 2 GB
caractere. Se folosesc ghilimelele pentru că numele
coloanei conţine spaţii şi paranteze.
F. Radulescu. Curs: Baze de date 23 F. Radulescu. Curs: Baze de date 24

4
Florin Radulescu - Baze de date (note de curs)

CREATE din SELECT CREATE din SELECT (2)


CREATE TABLE [schema.]nume_tabela  Descrierea coloanelor nu este prezentă
[(descriere_coloana_1, ..., în cerere:
descriere_coloana_n)]  Numele coloanelor tabelei create precum şi tipul
acestora este identic cu al celor din rezultatul
AS cererii SELECT.
cerere_SELECT;  Noua tabelă nu moşteneşte nici una dintre
constrângerile de integritate ale tabelei/tabelelor
din care provine rezultatul.
 Dacă în lista de expresii din clauza SELECT
Se crează o tabelă având numele există unele care nu returnează pentru capul de
specificat şi aceeaşi structură cu a tabel al rezultatului un nume valid de coloană
este obligatorie folosirea unor aliasuri de
rezultatului returnat de SELECT. coloană.

F. Radulescu. Curs: Baze de date 25 F. Radulescu. Curs: Baze de date 26

CREATE din SELECT (3) CREATE din SELECT (4)


CREATE TABLE STUD11  Crearea tabelei se face inclusiv în cazul în care
AS
SELECT MATR, NUME, PUNCTAJ*1.1 "PUNCTAJ MARIT" cererea SELECT nu returnează nici o linie. De
FROM STUD WHERE CODS = 11; exemplu:
 Conţinutul tabelei STUD11 va fi următorul: CREATE TABLE STUD100
MATR NUME PUNCTAJ MARIT
----- ---------- ------------- AS
1456 GEORGE 3179 SELECT MATR, NUME, PUNCTAJ*1.1 "PUNCTAJ
1325 VASILE 429 MARIT"
1645 MARIA 1540
 iar descrierea structurii sale este: FROM STUD
Nume coloana Tip WHERE CODS = 100;
------------- -------------
MATR NUMBER(4)  va avea ca efect crearea tabelei STUD100 având
NUME VARCHAR2(10) aceeaşi structură cu STUD11 dar aceasta nu va
PUNCTAJ MARIT NUMBER conţine nici o linie.

F. Radulescu. Curs: Baze de date 27 F. Radulescu. Curs: Baze de date 28

CREATE din SELECT (5) CREATE din SELECT (6)


 Cererea conţine descrierea coloanelor: CREATE TABLE STUD11
 Descrierea unei coloane are următoarea formă: (NUMAR DEFAULT 0 NOT NULL, NUME, PUNCTE NOT NULL)
nume_coloana [DEFAULT expresie] [constrângeri_integritate] AS
 Numărul de descrieri de coloană trebuie să fie egal cu SELECT MATR, NUME, PUNCTAJ*1.1 "PUNCTAJ MARIT"
numărul de coloane din rezultatul cererii SELECT. FROM STUD
 Numele coloanelor tabelei create este cel din descriere iar WHERE CODS = 11;
tipul lor este identic cu al celor din rezultatul cererii  Conţinutul tabelei este acelaşi, ultima coloană are alt nume,
SELECT. prima are o valoare implicită iar două dintre ele au asociată o
 Dacă descrierea unei coloane conţine clauza DEFAULT constrângere de tip NOT NULL (nu se pot stoca valori nule pe
expresie, se asociază acestei coloane valoarea implicită acele coloane):
respectivă. Nume coloana Null? Tip Implicit
 Noua tabelă nu moşteneşte nici una dintre constrângerile -------------- -------- ------------- ---------
de integritate ale tabelei/tabelelor din care provine NUMAR NOT NULL NUMBER(4) 0
rezultatul dar primeşte constrângerile de integritate din NUME VARCHAR2(10)
descriere, dacă acestea există PUNCTE NOT NULL NUMBER

F. Radulescu. Curs: Baze de date 29 F. Radulescu. Curs: Baze de date 30

5
Florin Radulescu - Baze de date (note de curs)

OBIECTIV CONSTRANGERI
Scopul acestui capitol este de a prezenta  Constrângerile de integritate reprezintă reguli pe care
elementele limbajului pentru descrierea valorile conţinute într-o tabelă trebuie să le respecte.
datelor (DDL) referitoare la:  Ele previn introducerea de date eronate în baza de
Tipurile de date permise pentru coloanele date şi definesc forma corectă a valorilor respective
tabelelor, dar nu iau în consideraţie semnificaţia acestora.
Crearea de noi tabele,  Constrângerile de integritate sunt verificate automat
de sistemul de gestiune atunci când au loc operaţii de
Constrângeri de integritate, modificare a conţinutului tabelelor (adăugare,
Modificarea structurii unei tabele, ştergere şi modificare linii).
Modificarea şi activarea constrângerilor de  În cazul în care noile valori nu sunt valide operaţia de
integritate, modificare este rejectată de sistem şi se generează o
Dicţionarul de date al sistemului. eroare.

F. Radulescu. Curs: Baze de date 31 F. Radulescu. Curs: Baze de date 32

TIPURI DE CONSTRANGERI CONSTRANGERI (2)


NOT NULL: valorile nu pot fi nule Fiecare constrângere de integritate poate
PRIMARY KEY: defineşte cheia primară avea asociat un nume specificat la crearea
a unei tabele tabelei care permite activarea sau
dezactivarea constrângerii şi alte operaţii cu
UNIQUE: defineşte o altă cheie a aceasta.
tabelei
În cazul în care nu se asociază un astfel de
FOREIGN KEY: defineşte o cheie străină nume sistemul generează automat unul.
(externă)
Locul definirii unei constrângeri de integritate
CHECK: introduce o condiţie (expresie în cererea de creare a unei tabele poate fi:
logică).
F. Radulescu. Curs: Baze de date 33 F. Radulescu. Curs: Baze de date 34

CONSTRANGERI (3) DETALIERE CONSTRANGERI


În descrierea unei coloane, dacă acea NOT NULL: valorile nu pot fi nule
constrângere se referă doar la aceasta (uzual
se spune despre o astfel de constrângere că
PRIMARY KEY: defineşte cheia primară
este definită la nivel de coloană), a unei tabele
În continuarea listei de descrieri de coloane UNIQUE: defineşte o altă cheie a
(la nivel de tabelă). tabelei
În funcţie de locul unde se găseşte, sintaxa FOREIGN KEY: defineşte o cheie străină
definirii unei constrângeri poate fi diferită. (externă)
Pentru fiecare tip de constrângere sunt
prezentate ambele sintaxe şi exemple de
CHECK: introduce o condiţie (expresie
folosire a lor. logică).
F. Radulescu. Curs: Baze de date 35 F. Radulescu. Curs: Baze de date 36

6
Florin Radulescu - Baze de date (note de curs)

NOT NULL EXEMPLU


Acest tip de constrângere se aplică unei CREATE TABLE SPEC
coloane a noii tabele şi specifică faptul că (CODS NUMBER(2),
aceasta nu poate conţine valori nule. El NUME VARCHAR2(10) CONSTRAINT
poate fi definit doar la nivel de coloană şi NUMENENUL NOT NULL,
are următoarea sintaxă:
DOMENIU VARCHAR2(15) NOT
coloana [CONSTRAINT nume_constr] NOT NULL
NULL);

F. Radulescu. Curs: Baze de date 37 F. Radulescu. Curs: Baze de date 38

DETALIERE CONSTRANGERI PRIMARY KEY


NOT NULL: valorile nu pot fi nule Sintaxa la nivel de coloană:
PRIMARY KEY: defineşte cheia primară coloana [CONSTRAINT nume_constrangere]
a unei tabele PRIMARY KEY
UNIQUE: defineşte o altă cheie a Sintaxa la nivel de tabelă:
tabelei
[,CONSTRAINT nume_constrangere] PRIMARY
FOREIGN KEY: defineşte o cheie străină KEY(lista_coloane)
(externă)
CHECK: introduce o condiţie (expresie
logică).
F. Radulescu. Curs: Baze de date 39 F. Radulescu. Curs: Baze de date 40

EXEMPLE PK DIN >1 ATRIBUT


CREATE TABLE SPEC( CREATE TABLE BURSA(
CODS NUMBER(2) CONSTRAINT SPEC_PK PRIMARY PMIN NUMBER(4),
KEY,
PMAX NUMBER(4),
NUME VARCHAR2(10),
TIP VARCHAR2(20),
DOMENIU VARCHAR2(15));
SUMA NUMBER(4),
Si la nivel de tabela:
CREATE TABLE SPEC( CONSTRAINT BURSA_PK PRIMARY KEY(PMIN,PMAX));
CODS NUMBER(2),
NUME VARCHAR2(10),
DOMENIU VARCHAR2(15),
CONSTRAINT SPEC_PK PRIMARY KEY(CODS));

F. Radulescu. Curs: Baze de date 41 F. Radulescu. Curs: Baze de date 42

7
Florin Radulescu - Baze de date (note de curs)

DETALIERE CONSTRANGERI UNIQUE


NOT NULL: valorile nu pot fi nule Sintaxa la nivel de coloană:
PRIMARY KEY: defineşte cheia primară coloana [CONSTRAINT nume_constrangere]
a unei tabele UNIQUE
UNIQUE: defineşte o altă cheie a Sintaxa la nivel de tabelă:
tabelei
 [,CONSTRAINT nume_constrangere]
FOREIGN KEY: defineşte o cheie străină UNIQUE(lista_coloane)
(externă)
CHECK: introduce o condiţie (expresie
logică).
F. Radulescu. Curs: Baze de date 43 F. Radulescu. Curs: Baze de date 44

EXEMPLUL 1 EXEMPLUL 1 – cont.


Dacă în tabela de SPEC nu pot exista Aceeasi constrangere, la nivel de
niciodată două specializări cu acelaşi nume, tabela:
definiţia anterioară se completează cu o
constrângere de tip UNIQUE: CREATE TABLE SPEC(
CREATE TABLE SPEC( CODS NUMBER(2) CONSTRAINT SPEC_PK PRIMARY
CODS NUMBER(2) CONSTRAINT SPEC_PK KEY,
PRIMARY KEY, NUME VARCHAR2(10),
NUME VARCHAR2(10) CONSTRAINT NUMES_UNIC DOMENIU VARCHAR2(15),
UNIQUE, CONSTRAINT NUMES_UNIC UNIQUE(NUME));
DOMENIU VARCHAR2(15));
F. Radulescu. Curs: Baze de date 45 F. Radulescu. Curs: Baze de date 46

EXEMPLUL 2 CE E UNIC?
 În tabela BURSA nu pot exista două burse cu aceeaşi
 În cazul în care o cheie definită cu UNIQUE conţine
sumă. Cererea de creare anterioară devine:
mai multe coloane, verificarea se face astfel:
CREATE TABLE BURSA(
 nu există două linii care au aceleaşi valori nenule
PMIN NUMBER(4), pentru toate coloanele cheii.
PMAX NUMBER(4),  nu există două linii care au aceleaşi valori nenule
TIP VARCHAR2(20), pentru unele coloane ale cheii şi valori nule în rest.
SUMA NUMBER(4) CONSTRAINT SUMA_UNICA  Exemplu: În cazul unei tabele NUMERE creată cu
UNIQUE, cererea:
CONSTRAINT BURSA_PK PRIMARY KEY(PMIN, CREATE TABLE NUMERE(
PMAX)); NUMAR1 NUMBER(4),
NUMAR2 NUMBER(4),
 În acest caz în tabelă nu pot exista două linii care conţin
aceeaşi valoare nenulă pe coloana SUMA dar pot exista UNIQUE(NUMAR1, NUMAR2));
oricâte linii cu valori nule pe această coloană.
F. Radulescu. Curs: Baze de date 47 F. Radulescu. Curs: Baze de date 48

8
Florin Radulescu - Baze de date (note de curs)

CONTINUT VALID CONTINUT INVALID


NUMAR1 NUMAR2 NUMAR1 NUMAR2
------ ------ ------ ------
NULL NULL NULL NULL
NULL NULL NULL NULL
1000 2000 1000 2000
1000 3000 1000 3000
NULL 2000 NULL 2000
1000 NULL 1000 NULL
1000 2000
NULL 2000
1000 NULL

F. Radulescu. Curs: Baze de date 49 F. Radulescu. Curs: Baze de date 50

DETALIERE CONSTRANGERI FOREIGN KEY


NOT NULL: valorile nu pot fi nule Prin această constrângere valorile unei
PRIMARY KEY: defineşte cheia primară coloane/unor coloane sunt forţate să fie
a unei tabele doar dintre cele ale cheii unei tabele
UNIQUE: defineşte o altă cheie a (cheie primară sau UNIQUE).
tabelei Coloanele constrânse în acest fel
FOREIGN KEY: defineşte o cheie străină formează ceea ce se numeşte în
(externă) terminologia de specialitate o cheie
straina sau cheie externa iar
CHECK: introduce o condiţie (expresie constrângerea mai este denumită şi de
logică). integritate referentiala.
F. Radulescu. Curs: Baze de date 51 F. Radulescu. Curs: Baze de date 52

SINTAXA
 La nivel de coloană: În cazul tabelei STUD avem două coloane
coloana [CONSTRAINT nume_constrangere] care pot avea asociată o astfel de
REFERENCES tabela(coloana) constrângere:
[ON DELETE CASCADE |  Coloana CODS poate fi constrânsă să conţină doar
ON DELETE SET NULL] valori ale cheii primare a tabelei SPEC (formată
 La nivel de tabelă: dintr-o coloană cu acelaşi nume - CODS).
[,CONSTRAINT nume_constrangere] FOREIGN  Coloana TUTOR poate fi constrânsă să conţină
KEY(lista_coloane) doar valori nenule ale cheii primare a lui STUD -
MATR.
REFERENCES tabela(lista_coloane)
[ON DELETE CASCADE | În acest caz cererea anterioara de creare
ON DELETE SET NULL] pentru STUD devine:

F. Radulescu. Curs: Baze de date 53 F. Radulescu. Curs: Baze de date 54

9
Florin Radulescu - Baze de date (note de curs)

STUD: OBSERVATII
CREATE TABLE STUD( În cazul în care tabela SPEC nu există încă
MATR NUMBER(4) PRIMARY KEY, sistemul va semnala eroarea: ORA-00942: table
NUME VARCHAR2(10), or view does not exist
AN NUMBER(1) DEFAULT 1, În cazul în care tabela SPEC există dar nu are
GRUPA VARCHAR2(6), cheia CODS se semnalează eroarea: ORA-02270:
DATAN DATE, no matching unique or primary key for this
LOC VARCHAR2(10) DEFAULT 'BUCURESTI', column-list
TUTOR NUMBER(4) REFERENCES STUD(MATR),
După crearea lui STUD, dacă se încearcă
PUNCTAJ NUMBER(4) DEFAULT 0,
ştergerea tabelei SPEC se semnalează eroarea:
CODS NUMBER(2), ORA-02449: unique/primary keys în table
CONSTRAINT CODS_FK FOREIGN KEY(CODS) referenced by foreign keys
REFERENCES SPEC(CODS));

F. Radulescu. Curs: Baze de date 55 F. Radulescu. Curs: Baze de date 56

OBSERVATII – cont. CLAUZA ON DELETE


La inserarea de noi linii în tabela STUD, acestea  În cazul în care se doreşte ca o linie dintr-o tabelă
trebuie să conţină pe coloanele CODS şi TUTOR conţinând o valoare de cheie referită într-o altă
fie valori care există deja în SPEC.CODS şi tabelă (sau în aceeaşi tabelă) să poată fi ştearsă fără
STUD.MATR, fie valori nule. a se obţine un mesaj de eroare, la definirea
constrângerii se poate specifica modul în care se
La încercarea de a şterge linii din tabelele SPEC şi tratează această ştergere din perspectiva tabelei care
STUD, dacă acestea au valoari ale chei referite în referă valoarea:
STUD prin constrângerile de mai sus se va  Daca se doreşte ca la ştergerea liniei conţinând o valoare de
semnala de asemenea o eroare. cheie să fie şterse suplimentar şi toate liniile care referă
această valoare, se specifică ON DELETE CASCADE
La încercarea de a modifica valorile cheii în linii
 Dacă se doreşte ca liniile care referă valoarea cheii
din tabelele SPEC şi STUD, dacă acestea sunt respective să nu fie şterse, se specifică ON DELETE SET
referite în STUD se va semnala de asemenea o NULL care are următorul efect: în toate liniile care referă
eroare. acea valoare ea este înlocuită cu valori nule.

F. Radulescu. Curs: Baze de date 57 F. Radulescu. Curs: Baze de date 58

EXEMPLU EXEMPLU – cont.


CREATE TABLE STUD( La ştergerea unei specializări din tabela SPEC
MATR NUMBER(4) PRIMARY KEY, vor fi şterşi automat şi toţi studenţii din
. . . . . . . . . . . . . . . . . . . tabela STUD având pe coloana CODS codul
TUTOR NUMBER(4) REFERENCES STUD(MATR) acesteia.
ON DELETE SET NULL, La ştergerea unui student care este tutorul
. . . . . . . . . . . . . . . . . . . altor studenţi, automat acestora li se va
CONSTRAINT CODS_FK FOREIGN KEY(CODS) modifica valoarea pe coloana TUTOR la una
REFERENCES SPEC(CODS) nulă.
ON DELETE CASCADE); Tabela SPEC poate fi golită - ceea ce va
antrena şi golirea tabelei STUD - dar nu
ştearsă.
F. Radulescu. Curs: Baze de date 59 F. Radulescu. Curs: Baze de date 60

10
Florin Radulescu - Baze de date (note de curs)

FK PENTRU UNIQUE DETALIERE CONSTRANGERI


În cazul în care constrângerea se NOT NULL: valorile nu pot fi nule
defineşte pentru o cheie de tip UNIQUE PRIMARY KEY: defineşte cheia primară
(care poate conţine şi valori nule) ea a unei tabele
este verificată pentru cheile străine UNIQUE: defineşte o altă cheie a
formate doar din valori nenule. tabelei
FOREIGN KEY: defineşte o cheie străină
(externă)
CHECK: introduce o condiţie (expresie
logică).
F. Radulescu. Curs: Baze de date 61 F. Radulescu. Curs: Baze de date 62

CHECK SINTAXA
 Prin acest tip de constrângeri valorile aflate pe o linie a
tabelei sunt forţate să verifice o condiţie (expresie logică). La nivel de coloană:
 Aceasta poate conţine toate elementele prezentate
anterior pentru conditii, inclusiv apeluri de funcţii, cu coloana [CONSTRAINT nume_constrangere]
câteva excepţii: CHECK (expresie_logica)
 apelurile unor funcţii ca SYSDATE, USER, UID
 referinţa la pseudocoloanele NEXTVAL, CURRVAL La nivel de tabelă:
(specifice secvenţelor), LEVEL şi ROWNUM)
 subcereri. [,CONSTRAINT nume_constrangere]
 O aceeaşi coloană poate participa la mai multe CHECK (expresie_logica)
constrângeri de acest tip, având fiecare o altă condiţie
asociată.
 Condiţia se evaluează doar la nivelul liniei respective, fără
a se putea lua în considerare valori aflate pe alte linii ale
tabelei.

F. Radulescu. Curs: Baze de date 63 F. Radulescu. Curs: Baze de date 64

EXEMPLU EXEMPLU – cont.


 Tabela BURSA poate avea asociate mai multe În cazul în care pe coloanele respective se
constrângeri care verifică următoarele condiţii: găsesc valori nule, linia nu este rejectată ci se
 PMIN şi PMAX sunt pozitive consideră că verifică expresia logică.
 PMIN < PMAX Pentru tabela BURSA definită ca mai sus se
 SUMA este între 0 şi 500 pot introduce linii având valori nule pentru
 Cererea de creare va fi: unele din coloanele PMIN, PMAX şi SUMA fără
CREATE TABLE BURSA( a se semnala violarea constrângerilor de
PMIN NUMBER(4) CHECK (PMIN >= 0), integritate de tip CHECK.
PMAX NUMBER(4) CHECK (PMAX >= 0),
TIP VARCHAR2(20),
Expresia logică asociată unei constrângeri
SUMA NUMBER(4) CHECK (SUMA BETWEEN 0 AND 500),
CHECK poate fi compusă: cererea de creare
CONSTRAINT PMINPMAX CHECK (PMIN < PMAX));
de mai sus poate fi rescrisă prin combinarea
tuturor condiţiilor în una singură:

F. Radulescu. Curs: Baze de date 65 F. Radulescu. Curs: Baze de date 66

11
Florin Radulescu - Baze de date (note de curs)

EXEMPLU – cont.
CREATE TABLE BURSA(
PMIN NUMBER(4), PMAX NUMBER(4),
TIP VARCHAR2(20),
SUMA NUMBER(4),
Sfarsitul partii 1 din capitolul
CONSTRAINT BURSA_CK CHECK (PMIN < PMAX
AND PMIN >= 0 AND PMAX >= 0 AND SUMA
BETWEEN 0 AND 500)); CREAREA TABELELOR

F. Radulescu. Curs: Baze de date 67 F. Radulescu. Curs: Baze de date 68

12
Florin Radulescu - Baze de date (note de curs)

STUD
SQL - 6 MATR NUME AN GRUPA DATAN LOC TUTOR PUNCTAJ CODS
---- ------- -- ------ --------- ---------- ----- ------- ----
1456 GEORGE 4 1141A 12-MAR-82 BUCURESTI 2890 11
1325 VASILE 2 1122A 05-OCT-84 PITESTI 1456 390 11
1645 MARIA 3 1131B 17-JUN-83 PLOIESTI 1400 11
3145 ION 1 2112B 24-JAN-85 PLOIESTI 3251 1670 21
2146 STANCA 4 2141A 15-MAY-82 BUCURESTI 620 21
3251 ALEX 5 2153B 07-NOV-81 BRASOV 1570 21
2215 ELENA 2 2122A 29-AUG-84 BUCURESTI 2146 890 21
CREAREA TABELELOR 4311
3514
ADRIAN
FLOREA
3 2431A 31-JUL-83 BUCURESTI
5 2452B 03-FEB-81 BRASOV
450
3230
24
24
1925 OANA 2 2421A 20-DEC-84 BUCURESTI 4311 760 24

- Partea 2 - 2101
4705
MARIUS
VOICU
1 2412B 02-SEP-85 PITESTI
2 2421B 19-APR-84 BRASOV
3514
4311
310
1290
24
24

F. Radulescu. Curs: Baze de date 1 F. Radulescu. Curs: Baze de date 2

SPEC si BURSA OBIECTIV


CODS NUME DOMENIU
----- ---------- ---------------
Scopul acestui capitol este de a prezenta
elementele limbajului pentru descrierea
11 MATEMATICA STIINTE EXACTE
datelor (DDL) referitoare la:
21 GEOGRAFIE UMANIST
24 ISTORIE UMANIST
Tipurile de date permise pentru coloanele
tabelelor,
TIP PMIN PMAX SUMA Crearea de noi tabele,
-------------------- ----- ----- ----- Constrângeri de integritate,
FARA BURSA 0 399 Modificarea structurii unei tabele,
BURSA SOCIALA 400 899 100 Modificarea şi activarea constrângerilor de
BURSA DE STUDIU 900 1799 150 integritate,
BURSA DE MERIT 1800 2499 200 Dicţionarul de date al sistemului.
BURSA DE EXCEPTIE 2500 9999 300

F. Radulescu. Curs: Baze de date 3 F. Radulescu. Curs: Baze de date 4

MODIFICAREA STRUCTURII 1. VIZUALIZARE STRUCTURA


 Vizualizarea structurii tabelei  Clientul SQL*Plus pune la dispoziţie comanda DESCRIBE prin
care se pot afişa numele coloanelor, tipul acestora şi
 Adaugarea unei coloane eventualele constrângeri de tip NOT NULL.
 Stergerea unei coloane  Sintaxa comenzii SQL*Plus este:
DESCRIBE nume_tabela
 Modificarea unei coloane  Observaţie: DESCRIBE nu este o cerere SQL ci o comandă
 Adaugarea unei constrangeri SQL*Plus. Ea nu trebuie terminată cu punct şi virgulă (;).
 Stergerea unei constrangeri  Exemplu. Pentru a obţine descrierea tabelei SPEC folosim
comanda:
 Activare/dezactivare constrangeri DESCRIBE SPEC
 Golirea unei tabele  Rezultat obţinut:
Name Null? Type
 Stergerea unei tabele
--------------- -------- -----------------
 Redenumirea unei tabele CODS NUMBER(2)
 Adaugarea de comentarii NUME VARCHAR2(10)
DOMENIU VARCHAR2(15)
F. Radulescu. Curs: Baze de date 5 F. Radulescu. Curs: Baze de date 6

1
Florin Radulescu - Baze de date (note de curs)

2. ADAUGARE COLOANA ADAUGARE COLOANA – cont.


Sintaxa:
ALTER TABLE nume_tabela ADD Dacă tabela conţine deja cel puţin o linie, pe
(nume_coloana tip_date
noua coloană vor fi prezente doar valori nule.
[DEFAULT expresie] [constrangere]);
Adăugarea unei coloane care are asociată o
Exemplu: Adăugarea unei noi coloane la constrângere de tip NOT NULL (ca în
tabela SPEC în care se memorează anul exemplul anterior) nu se poate face decât în
înfiinţării fiecărei specializări: cazul în care tabela nu conţine nici o linie.
ALTER TABLE SPEC ADD(AN_INFIINTARE
NUMBER(4) Coloana se va adăuga întotdeauna după
CONSTRAINT ANS_NENUL NOT NULL);
celelalte, devenind ultima coloană din tabelă.

F. Radulescu. Curs: Baze de date 7 F. Radulescu. Curs: Baze de date 8

3. STERGERE COLOANA STERGERE COLOANA – cont.


Sintaxa: Cererea se poate executa atât în cazul în care
ALTER TABLE nume_tabela DROP COLUMN tabela este goală cât şi dacă ea conţine deja
nume_coloana [CASCADE CONSTRAINTS]; linii,
sau Dacă tabela are doar o singură coloană,
ALTER TABLE nume_tabela DROP (lista aceasta nu se poate şterge,
coloane) [CASCADE CONSTRAINTS]; Opţiunea CASCADE CONSTRAINTS şterge
suplimentar toate constrângerile de
Exemplu: Ştergerea coloanei adăugată anterior:
integritate în care sunt implicate coloanele
ALTER TABLE SPEC şterse, inclusiv cele de tip FOREIGN KEY care
DROP COLUMN AN_INFIINTARE; referă valorile coloanei sau coloanelor
respective.
F. Radulescu. Curs: Baze de date 9 F. Radulescu. Curs: Baze de date 10

UNUSED UNUSED – cont.


 Ştergerea unei coloane este o operaţie costisitoare
din punct de vedere al resurselor sistemului. Etapa 2: Ştergerea efectivă a
 De aceea, în cazul în care la un moment dat acesta coloanelor marcate ca neutilizate la un
este foarte încărcat ştergerea se poate face în două moment ulterior de timp, când sistemul
etape:
 Etapa 1: Marcarea ca neutilizate a unei coloane sau a nu mai este foarte încărcat. Sintaxa
unei liste de coloane prin opţiunea SET UNUSED. cererii este:
Sintaxa este:
ALTER TABLE nume_tabela SET
ALTER TABLE nume_tabela DROP
UNUSED(lista_coloane); UNUSED COLUMNS;
sau
ALTER TABLE nume_tabela SET UNUSED COLUMN
nume_coloana;

F. Radulescu. Curs: Baze de date 11 F. Radulescu. Curs: Baze de date 12

2
Florin Radulescu - Baze de date (note de curs)

EXEMPLE UNUSED - Observatii


Pentru marcarea coloanelor DATAN, LOC şi Coloanele marcate ca neutilizate:
TUTOR din tabela STUD se pot executa  nu mai apar în structura afişată de
cererile: DESCRIBE,
ALTER TABLE STUD SET UNUSED(DATAN,
LOC);  nu mai pot fi folosite în cererile SQL asupra
ALTER TABLE STUD SET UNUSED COLUMN tabelei respective
TUTOR;  se pot adăuga noi coloane în tabelă având
Ştergerea coloanelor marcate se face prin acelaşi nume.
cererea:
ALTER TABLE SPEC DROP UNUSED COLUMNS;

F. Radulescu. Curs: Baze de date 13 F. Radulescu. Curs: Baze de date 14

4. MODIFICARE COLOANA EXEMPLU


Sintaxa: modificarea caracteristicilor coloanelor NUME
ALTER TABLE nume_tabela şi DOMENIU din tabela SPEC este efectuată
MODIFY(nume_coloana [tip_date]
[DEFAULT expresie] [constrangere]) prin următoarele trei cereri de tip ALTER
Prin această cerere se pot modifica TABLE:
următoarele caracteristici ale unei coloane: ALTER TABLE SPEC MODIFY (DOMENIU
 Se poate schimba tipul de date al coloanei VARCHAR2(20) CONSTRAINT DOM_MENUL NOT
 Se poate asocia o nouă valoare implicită NULL);
 Se poate adăuga o constrângere de tip NOT NULL ALTER TABLE SPEC MODIFY (DOMENIU
pentru acea coloană.
DEFAULT 'NECOMPLETAT');
Printr-o singură cerere se pot efectua toate
operaţiile de mai sus sau doar o parte a lor. ALTER TABLE SPEC MODIFY(NUME
CONSTRAINT NUME_NENUL NOT NULL);
F. Radulescu. Curs: Baze de date 15 F. Radulescu. Curs: Baze de date 16

MODIFICARE COLOANA – cont. MODIFICARE COLOANA – cont.


În ceea ce priveşte modificările tipului Doar în cazul în care tabela este goală sau
de date asociat unei coloane, acestea coloana conţine doar valori nule se mai pot
pot fi: efectua şi operaţiile:
 Scăderea dimensiunii coloanelor de tip şir de
 Creşterea dimensiunii coloanelor de tip şir caractere
de caractere,  Scăderea dimensiunii şi preciziei datelor numerice,
 Creşterea dimensiunii şi preciziei datelor  Orice altă schimbare a tipului coloanei respective.
numerice, În cazul schimbării valorii implicite pentru o
 Schimbarea tipurilor CHAR în VARCHAR2 şi coloană, noua valoare va fi folosită doar
reciproc doar dacă au aceeaşi dimensiune. pentru inserările de linii ulterioare modificării.

F. Radulescu. Curs: Baze de date 17 F. Radulescu. Curs: Baze de date 18

3
Florin Radulescu - Baze de date (note de curs)

5. ADAUGARE CONSTRANGERE EXEMPLU


Sintaxa: ALTER TABLE SPEC
ALTER TABLE nume_tabela ADD CONSTRAINT NUME_NENUL
ADD [CONSTRAINT nume] tip(coloana); CHECK(NUME IS NOT NULL);
Tipul constrângerii nu poate fi NOT NULL. În ALTER TABLE SPEC
schimb se pot defini constrângeri de tip
ADD CONSTRAINT NUME_UNIC
CHECK conţinând condiţii de acest tip.
UNIQUE(NUME);
Exemplu: Se doreşte ca pe coloana NUME a
tabelei SPEC să nu existe valori nule sau ALTER TABLE SPEC
identice şi lungimea minimă să fie de 6 ADD CONSTRAINT NUME_5
caractere: CHECK(LENGTH(NUME)>5);
F. Radulescu. Curs: Baze de date 19 F. Radulescu. Curs: Baze de date 20

6. STERGERE CONSTRANGERE EXEMPLU


 Sintaxa:
ALTER TABLE nume_tabela DROP PRIMARY KEY Stergerea cheii primare a tabelei SPEC
[CASCADE];
ALTER TABLE nume_tabela DROP
şi a constrângerilor dependente de
UNIQUE(lista_coloane)
[CASCADE];
acestea (de exemplu cea de cheie
ALTER TABLE nume_tabela DROP CONSTRAINT nume străină din STUD) se face astfel:
[CASCADE];
 Efectul acestor cereri este: ALTER TABLE SPEC DROP PRIMARY KEY
 DROP PRIMARY KEY şi DROP UNIQUE specifică ştergerea CASCADE;
constrângerii de tip cheie primară/cheie unică pentru tabela
respectivă. Constrângerea poate să nu aibă un nume asociat
la definire.
 DROP CONSTRAINT specifică ştergerea unei constrângeri
având asociat un nume.
 Opţiunea CASCADE se aplică în cazul în care există
constrângeri dependente şi specifică ştergerea suplimentară
a acestora.
F. Radulescu. Curs: Baze de date 21 F. Radulescu. Curs: Baze de date 22

7. ACTIVARE/DEZACTIVARE
EFECT
CONSTRANGERE  DISABLE specifică dezactivarea constrângerii de
integritate respective.
 Sintaxa: Dezactivare:
ALTER TABLE nume_tabela DISABLE PRIMARY KEY  Opţiunea CASCADE duce la dezactivarea
[CASCADE] suplimentară a tuturor constrângerilor dependente.
ALTER TABLE nume_tabela
DISABLE UNIQUE(lista_coloane) [CASCADE]  ENABLE CONSTRAINT specifică reactivarea
ALTER TABLE nume_tabela DISABLE CONSTRAINT constrângerii respective.
nume
[CASCADE]  În momentul reactivării sistemul verifică dacă datele
la care se referă constrângerea sunt conforme cu
 Reactivare: aceasta.
ALTER TABLE nume_tabela ENABLE PRIMARY KEY;
ALTER TABLE nume_tabela ENABLE
 În cazul în care nu se constată respectarea
UNIQUE(lista_coloane); constrângerii, ea nu este activată şi se generează un
ALTER TABLE nume_tabela ENABLE CONSTRAINT mesaj de eroare. În caz de activare cu succes,
nume; constrângerile dependente nu sunt reactivate.
F. Radulescu. Curs: Baze de date 23 F. Radulescu. Curs: Baze de date 24

4
Florin Radulescu - Baze de date (note de curs)

EXEMPLU 8. GOLIRE TABELA


Dezactivarea şi reactivarea  Sintaxa:
TRUNCATE TABLE nume_tabela [REUSE
constrângerii de cheie primară SPEC_PK STORAGE];
pentru tabela SPEC:  Exemplu: golirea tabelei SPEC se poate face prin
ALTER TABLE SPEC DISABLE PRIMARY cererea SQL
TRUNCATE TABLE SPEC;
KEY CASCADE;
 Opţiunea REUSE STORAGE este folosită pentru a
ALTER TABLE SPEC ENABLE specifica faptul că spaţiul ocupat de liniile şterse
CONSTRAINT SPEC_PK; rămâne alocat tabelei şi poate fi folosit la inserările
ulterioare în aceasta.
 În lipsa acestei opţiuni spaţiul respectiv devine
disponibil, putând fi utilizat şi pentru alte tabele.

F. Radulescu. Curs: Baze de date 25 F. Radulescu. Curs: Baze de date 26

9. STERGERE TABELA 10. REDENUMIRE TABELA


Sintaxa: Sintaxa:
DROP TABLE nume_tabela; RENAME nume_vechi TO nume_nou
Exemplu: ştergerea tabelei SPEC se poate Exemplu: redenumirea tabelei SPEC se poate
face prin cererea SQL face prin cererea SQL
DROP TABLE SPEC; RENAME SPEC TO SPECIALIZARI;
Observaţie: ştergerea unei tabele este Observaţie: comanda RENAME nu este
definitivă. specifică tabelelor ci tuturor obiectelor din
O dată ştearsă ea poate fi restaurată doar din baza de date.
salvările bazei de date efectuate de Cu ajutorul ei se pot redenumi de asemenea
administrator. vederi, secvenţe şi sinonime.
F. Radulescu. Curs: Baze de date 27 F. Radulescu. Curs: Baze de date 28

11. COMENTARII OBIECTIV


 Tabelele şi coloanele acestora pot avea asociat un Scopul acestui capitol este de a prezenta
comentariu. Acesta este un text şi se asociază astfel: elementele limbajului pentru descrierea
COMMENT ON TABLE nume_tabela IS 'text‘; datelor (DDL) referitoare la:
COMMENT ON COLUMN nume_tabela.cume_coloana IS
'text‘;
Tipurile de date permise pentru coloanele
tabelelor,
 Acestea sunt stocate în dicţionarul de date în
tabelele: Crearea de noi tabele,
 USER_COL_COMMENTS şi ALL_COL_COMMENTS: Constrângeri de integritate,
 comentariile asociate coloanelor Modificarea structurii unei tabele,
 USER_TAB_COMMENTS şi USER_TAB_COMMENTS Modificarea şi activarea constrângerilor de
 comentariile asociate tabelelor integritate,
Dicţionarul de date al sistemului.

F. Radulescu. Curs: Baze de date 29 F. Radulescu. Curs: Baze de date 30

5
Florin Radulescu - Baze de date (note de curs)

DICTIONARUL DE DATE DICTIONARUL DE DATE – cont.


Una dintre cerinţele fundamentale pentru ca  Există mai multe categorii de vederi prin care uzual
un sistem de gestiune a bazelor de date să fie aceste date sunt accesate, fiecare având ca şi
considerat cu adevărat relaţional este aceea caracteristică un prefix al numelui care defineşte
ca datele interne ale acestuia să fie categoria respectivă.
organizate şi stocate în acelaşi mod cu datele  Cele mai folosite vederi intră în categoriile definite de
utilizatorilor şi aplicaţiilor care îl folosesc. prefixele următoare:
În acest sens, şi sistemul Oracle îşi ţine  Prefixul USER_ este comun vederilor prin care se pot accesa
informaţii despre obiectele deţinute de utilizator.
aceste date, numite uzual dictionarul de date
 Prefixul ALL_ este specific vederilor care conţin informaţii
al sistemului, sub formă de tabele, iar despre toate tabelele la care utilizatorul are acces.
utilizatorii care au drepturile necesare le pot  Prefixul DBA_ este folosit pentru vederile accesibile doar
accesa fie direct fie folosind o serie de vederi utilizatorilor care au drepturi (privilegii) de administrator al
şi sinonime puse la dispoziţie de sistem. bazei de date.

F. Radulescu. Curs: Baze de date 31 F. Radulescu. Curs: Baze de date 32

EXEMPLE USER_CATALOG
Prezentarea tuturor acestor vederi nu face  utilizator. Are doar două coloane, prima conţinând
obiectul lucrării de faţă. numele şi al doilea tipul obiectului. O parte a
conţinutului acestei tabele, obţinut cu cererea SQL:
În continuare sunt prezentate câteva dintre SELECT * FROM USER_CATALOG;
cele mai importante, legate mai ales de  este următorul:
inventarul de tabele şi constrângeri de TABLE_NAME TABLE_TYPE
integritate existent la un moment dat în ---------------- -----------
sistem: BURSA TABLE
 USER_CATALOG EVENIMENT TABLE
NUMERE TABLE
 USER_OBJECTS SPEC TABLE
 USER_CONSTRAINTS STUD TABLE
 USER_CONS_COLUMNS

F. Radulescu. Curs: Baze de date 33 F. Radulescu. Curs: Baze de date 34

USER_OBJECTS USER_CONSTRAINTS
Conţine numele, tipul şi alte informaţii despre Conţine date despre constrângerile definite
obiectele deţinute de utilizator, inclusiv de utilizator. Dintre coloanele sale
indecşi. menţionăm:
Informaţii sumare despre conţinutul vederii  CONSTRAINT_NAME : Numele constrângerii
se pot obţine cu cererea:  CONSTRAINT_TYPE: Tipul acesteia, codificat pe
SELECT OBJECT_NAME, OBJECT_TYPE un caracter: P: cheie primară, U: cheie (UNIQUE),
R pentru integritatea referenţială şi C pentru
FROM USER_OBJECTS;
constrângerile CHECK (aici sunt incluse şi cele de
Rezultatul include rezultatul obţinut în urma tip NOT NULL)
cererii anterioare (USER_CATALOG).  SEARCH_CONDITION: Condiţia asociată
constrângerii
F. Radulescu. Curs: Baze de date 35 F. Radulescu. Curs: Baze de date 36

6
Florin Radulescu - Baze de date (note de curs)

EXEMPLU USER_CONS_COLUMNS
SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE,  Conţine informaţii despre coloanele care sunt implicate în
SEARCH_CONDITION constrângerile de integritate. Cererea următoare afişează
FROM USER_CONSTRAINTS; perechi (nume constrângere, nume coloană implicată) pentru
constrângerea BURSA_CK:
Rezultat: SELECT CONSTRAINT_NAME, COLUMN_NAME
CONSTRAINT_NAME C SEARCH_CONDITION FROM USER_CONS_COLUMNS
------------------------ - ---------------------- WHERE CONSTRAINT_NAME = 'BURSA_CK';
BURSA_CK C PMIN < PMAX AND PMIN >= 0
AND PMAX >= 0 AND SUMA
 Rezultatul este:
BETWEEN 0 AND 500 CONSTRAINT_NAME COLUMN_NAME
DOM_NENUL U ------------------------ --------------------
DOM_5 C LENGTH(NUME)>5 BURSA_CK PMIN
NUME_NENUL C NUME IS NOT NULL BURSA_CK PMAX
BURSA_CK SUMA

F. Radulescu. Curs: Baze de date 37 F. Radulescu. Curs: Baze de date 38

CATE VEDERI SUNT?


Există peste 2000 de vederi puse la
dispoziţie de sistemul Oracle (V9) dintre
care peste 200 în fiecare dintre
categoriile USER_, ALL_ şi DBA_. Sfarsitul capitolului
O descriere completă a lor se găseşte în
documentaţia aferentă sistemului. CREAREA TABELELOR
Lista tuturor vederilor poate fi obţinută
cu cererea:
SELECT VIEW_NAME FROM ALL_VIEWS;

F. Radulescu. Curs: Baze de date 39 F. Radulescu. Curs: Baze de date 40

7
Florin Radulescu - Baze de date (note de curs)

STUD
SQL - 6 MATR NUME AN GRUPA DATAN LOC TUTOR PUNCTAJ CODS
---- ------- -- ------ --------- ---------- ----- ------- ----
1456 GEORGE 4 1141A 12-MAR-82 BUCURESTI 2890 11
1325 VASILE 2 1122A 05-OCT-84 PITESTI 1456 390 11
1645 MARIA 3 1131B 17-JUN-83 PLOIESTI 1400 11
3145 ION 1 2112B 24-JAN-85 PLOIESTI 3251 1670 21
2146 STANCA 4 2141A 15-MAY-82 BUCURESTI 620 21
3251 ALEX 5 2153B 07-NOV-81 BRASOV 1570 21
2215 ELENA 2 2122A 29-AUG-84 BUCURESTI 2146 890 21
ACTUALIZAREA 4311
3514
ADRIAN
FLOREA
3 2431A 31-JUL-83 BUCURESTI
5 2452B 03-FEB-81 BRASOV
450
3230
24
24
1925 OANA 2 2421A 20-DEC-84 BUCURESTI 4311 760 24
DATELOR 2101
4705
MARIUS
VOICU
1 2412B 02-SEP-85 PITESTI
2 2421B 19-APR-84 BRASOV
3514
4311
310
1290
24
24

F. Radulescu. Curs: Baze de date 1 F. Radulescu. Curs: Baze de date 2

SPEC si BURSA OBIECTIV


CODS NUME DOMENIU
----- ---------- --------------- Scopul acestui capitol este descrierea
11 MATEMATICA STIINTE EXACTE operaţiilor care fac parte din limbajul de
21 GEOGRAFIE UMANIST manipulare al datelor: adăugarea de linii într-
24 ISTORIE UMANIST o tabelă, modificarea valorilor unor linii şi
ştergerea acestora.
TIP PMIN PMAX SUMA
-------------------- ----- ----- ----- Este de asemenea prezentat mecanismul
FARA BURSA 0 399 tranzacţiilor şi consistenţa la citire care permit
BURSA SOCIALA 400 899 100 utilizatorilor şi aplicaţiilor care accesează o
BURSA DE STUDIU 900 1799 150 bază de date să utilizeze o versiune
BURSA DE MERIT 1800 2499 200
consistentă a acesteia.
BURSA DE EXCEPTIE 2500 9999 300

F. Radulescu. Curs: Baze de date 3 F. Radulescu. Curs: Baze de date 4

CERERI PREZENTATE INSERT … VALUES (1)


 Principalele cereri SQL prin care sunt efectuate Inserarea unei linii prin specificarea valorilor acesteia
aceste operaţii sunt:  Sintaxa cererii este următoarea:
 INSERT efectuează adăugarea de noi linii, INSERT INTO tabela [(lista_de_coloane)]
VALUES (lista_de_valori)
 UPDATE permite actualizarea (modificarea)
În cazul în care lista de coloane nu este prezentă în cerere
valorilor dintr-o tabelă, efectul va fi următorul:
 DELETE şterge linii dintr-o tabelă,  Se inserează în tabelă o linie completă,
 MERGE efectuează o actualizare sau inserare,  Numărul valorilor din listă trebuie să fie acelaşi cu numărul de
după cum linia îndeplineşte sau nu o condiţie, coloane din tabelă,
 COMMIT, ROLLBACK şi SAVEPOINT permit  Ordinea valorilor din listă trebuie să fie aceeaşi cu ordinea
coloanelor din cererea de creare a tabelei,
controlul explicit al tranzacţiilor.  Tipul valorilor trebuie să fie compatibil cu tipul coloanelor în
 Este prezentată de asemenea clauza WITH CHECK care se stochează,
OPTION care controlează inserarea, ştergerea şi
actualizarea datelor în cazul în care aceste operaţii se
efectuează prin intermediul unei subcereri.
F. Radulescu. Curs: Baze de date 5 F. Radulescu. Curs: Baze de date 6

1
Florin Radulescu - Baze de date (note de curs)

INSERT … VALUES (2) EXEMPLU


 În cazul în care pe o anumită coloană se doreşte inserarea : Inserarea specializărilor în tabela SPEC se
unei valori nule, în lista de valori se foloseşte cuvântul face cu cererile:
cheie NULL,
 Dacă la crearea tabelei unei coloane i-a fost asociată o INSERT INTO SPEC VALUES(11,
valoare implicită, pentru inserarea ei se foloseşte cuvântul 'MATEMATICA', 'STIINTE EXACTE');
cheie DEFAULT. În cazul în care se foloseşte DEFAULT dar INSERT INTO SPEC VALUES(21,
coloana nu are o valoare implicită definită, în coloană se 'GEOGRAFIE', 'UMANIST');
va insera o valoare nulă, INSERT INTO SPEC VALUES(24, 'ISTORIE',
 Valorile pentru coloanele de tip şir de caractere sau dată 'UMANIST');
calendaristică (doar cele în formatul standard) se pun
între apostrofi, Pentru inserarea unei noi specializări având
 În cazul în care o valoare de tip dată calendaristică nu codul 30, nume încă necunoscut şi un
este în format standard se foloseşte funcţia TO_DATE domeniu implicit se poate folosi cererea:
pentru conversia şirului respectiv în dată calendaristică,
INSERT INTO SPEC VALUES(30, NULL,
 Fiecare linie se inserează cu o cerere separată. DEFAULT);

F. Radulescu. Curs: Baze de date 7 F. Radulescu. Curs: Baze de date 8

EFECT INSERT … VALUES (3)


Rezultatul celor patru inserări va fi următorul  În cazul în care cererea conţine şi o listă de
coloane, rezultatul acesteia este inserarea unei linii
(am considerat că la crearea tabelei SPEC, incomplete: pentru coloanele care lipsesc din listă se
pentru coloana DOMENIU s-a asociat vor insera automat valorile implicite - dacă există -
sau valori nule în caz contrar.
valoarea implicită 'UMANIST'):  Observaţii:
CODS NUME DOMENIU  Listele de coloane şi valori trebuie să conţină
----- ---------- --------------- acelaşi număr de elemente,
11 MATEMATICA STIINTE EXACTE  Cele două liste se corespund poziţional: prima
valoare va fi stocată în prima coloană din listă,
21 GEOGRAFIE UMANIST s.a.m.d.
24 ISTORIE UMANIST  Tipul valorilor trebuie să fie compatibil cu tipul
coloanelor în care se stochează.
30 UMANIST

F. Radulescu. Curs: Baze de date 9 F. Radulescu. Curs: Baze de date 10

EXEMPLU CE PUTEM PUNE IN LISTA


Exemplu: inserarea specializării cu codul 30 În lista de valori se mai pot folosi:
se putea face şi astfel:  Expresii
INSERT INTO SPEC (CODS) VALUES(30);
 Subcereri
rezultatul obţinut fiind acelaşi ca mai sus.
În toate cazurile, inserarea va eşua dacă
noua linie nu respectă vreuna din
constrângerile de integritate care sunt active
în acel moment pentru tabela în care se face
adăugarea.

F. Radulescu. Curs: Baze de date 11 F. Radulescu. Curs: Baze de date 12

2
Florin Radulescu - Baze de date (note de curs)

EXPRESII SUBCERERI
In acest caz valoarea expresiei trebuie să fie Rezultatul unei subcereri necolelate care
compatibilă cu tipul coloanei. întoarce o singură valoare poate fi folosit
Expresiile pot conţine operatori şi funcţii. în lista de valori a cererii INSERT.
Exemplu: următoarea cerere de inserare este Exemplu: cererea:
validă: INSERT INTO SPEC(CODS)
INSERT INTO STUD (MATR, NUME, DATAN,
VALUES ((SELECT MAX(CODS) FROM SPEC)+1);
CODS) VALUES (1200+15, 'ION ' ||
'DOBRE', SYSDATE, 24); va insera o specializare având codul 25 (în
Valorile inserate vor fi: 1215 , 'ION DOBRE', cazul în care valoarea maximă pe
data curentă şi 24. coloana CODS este 24).
F. Radulescu. Curs: Baze de date 13 F. Radulescu. Curs: Baze de date 14

INSERT .. SELECT (1) EXEMPLU


 Sintaxa este în acest caz următoarea:  Fie o tabelă NRSTUD(CODS, NRSTUD) care conţine
INSERT INTO tabela [(lista_de_coloane)] pentru fiecare specializare numărul de studenţi al
acesteia.
cerere_select
 Umplerea ei se poate face prin cererea:
 Modul de execuţie al acestei cereri este următorul: INSERT INTO NRSTUD
 Se execută cererea SELECT, SELECT CODS, COUNT(*) FROM STUD GROUP
 Liniile rezultatului sunt inserate în tabelă, BY CODS;
 Numărul de coloane al tabelei/listei de coloane trebuie  Conţinutul tabelei NRSTUD va fi:
să fie egal cu cel al rezultatului cererii SELECT iar CODS NRSTUD
tipurile trebuie să fie compatibile,
----- ------
 În cazul în care o linie din rezultatul cererii SELECT nu
satisface constrângerile de integritate ale tabelei în 11 3
care se face inserarea, întreaga comandă eşuează (nici 21 4
celelalte linii nu sunt inserate). 24 5
F. Radulescu. Curs: Baze de date 15 F. Radulescu. Curs: Baze de date 16

DELETE EXEMPLE
Sintaxa cererii care efectuează ştergerea unor  Exemplul 1: dacă se doreşte ştergerea tuturor
linii dintr-o tabelă este următoarea: studenţilor specializării cu codul 11 cererea este:
DELETE FROM tabela  DELETE FROM STUD WHERE CODS = 11;
[WHERE conditie]  Exemplul 2: ştergerea liniilor corespunzătoare
studenţilor cu cel mai mic punctaj din fiecare
În clauza WHERE pot să apară aceleaşi specializare se face cu cererea:
elemente ca şi în cazul cererilor SELECT (deci DELETE FROM STUD
inclusiv subcereri). WHERE MATR IN
Efectul cererii este ştergerea tuturor liniilor (SELECT MATR FROM STUD
pentru care condiţia este verificată. WHERE (CODS, PUNCTAJ) IN
În cazul absenţei clauzei WHERE se şterg (SELECT CODS, MIN(PUNCTAJ)
toate liniile tabelei. FROM STUD GROUP BY CODS));
F. Radulescu. Curs: Baze de date 17 F. Radulescu. Curs: Baze de date 18

3
Florin Radulescu - Baze de date (note de curs)

UPDATE
OBSERVATIE  Sintaxa cererii de actualizare (modificare) a valorilor dintr-o
tabelă este:
Stergerea nu se va efectua şi va UPDATE tabela
SET coloana1 = expresie1 [,
semnala o eroare dacă una dintre liniile coloana2=expresie2, ...]
[WHERE conditie];
care îndeplinesc condiţia conţine o cheie  Efectul este următorul:
referită printr-o constrângere de tip  În WHERE pot să apară aceleaşi elemente ca şi în cazul
cererilor SELECT,
FOREIGN KEY într-o tabelă din baza de  Toate liniile care îndeplinesc condiţia din WHERE vor fi
actualizate conform cu specificaţiile din SET. În cazul
date. absenţei clauzei WHERE, toate liniile tabelei vor fi
actualizate,
 Expresiile din clauza SET se evaluează pornind de la
valorile conţinute în linia care se modifică şi ele trebuie să
aibă un tip compatibil cu al coloanelor asociate,
 O aceeaşi coloană nu poate apare de două ori în clauza
SET.
F. Radulescu. Curs: Baze de date 19 F. Radulescu. Curs: Baze de date 20

EXEMPLE EXEMPLE – cont.


 Exemplul 1: Mărirea cu 10% a punctajului studenţilor Exemplul 3: În cazul în care pentru o coloană
de la specializarea cu codul 11 se face cu cererea:
UPDATE STUD se doreşte actualizarea valorilor prin aducerea
SET PUNCTAJ = PUNCTAJ * 1.1 lor la valoarea implicită asociată la crearea
WHERE CODS = 11 tabelei sau la o valoare nulă se folosesc de
 Exemplul 2: În cazul în care, pentru toţi studenţii, pe
lângă mărirea punctajului cu 10% se doreşte şi asemenea cuvintele cheie DEFAULT şi NULL.
incrementarea anului de studii pentru studenţii din În cazul folosirii lui DEFAULT, dacă nu există
anii 1-4 şi stocarea pe coloana AN a valorii 0 pentru
studenţii de anul 5, cererea este: o valoare implicită asociată, în coloana
UPDATE STUD respectivă se va stoca o valoare nulă.
SET PUNCTAJ = PUNCTAJ * 1.1, UPDATE SPEC SET DOMENIU = DEFAULT;
AN = DECODE (AN, 5, 0, AN+1);
UPDATE SPEC SET DOMENIU = NULL;

F. Radulescu. Curs: Baze de date 21 F. Radulescu. Curs: Baze de date 22

SUBCERERI IN SET SUBCERERI IN SET – cont.


Expresiile din clauza SET pot conţine  Subcererile pot fi prezente atât pe clauza WHERE cât şi
subcereri pe tabela care se actualizează sau în locul numelui tabelei (acest caz mai tarziu).
pe o altă tabelă din baza de date.  De exemplu, dacă se doreşte actualizarea numărului de
studenţi doar pentru specializările având mai mult de
Exemplu: Pentru actualizarea numărului de trei studenţi cererea este:
studenţi din tabela NRSTUD descrisă anterior UPDATE NRSTUD
se poate folosi următoarea cerere corelată: SET NRSTUD =
UPDATE NRSTUD N (SELECT COUNT(*)
SET NRSTUD = FROM STUD WHERE CODS = NRSTUD.CODS)
(SELECT COUNT(*) WHERE CODS IN
FROM STUD (SELECT CODS FROM STUD GROUP BY CODS
WHERE CODS = N.CODS); HAVING COUNT(*) > 3);

F. Radulescu. Curs: Baze de date 23 F. Radulescu. Curs: Baze de date 24

4
Florin Radulescu - Baze de date (note de curs)

EFECT CONSTRANGERI MERGE


 În cazul în care noile valori ale unei linii nu satisfac  O cerere MERGE efectuează fie actualizarea fie
constrângerile de integritate active pentru tabela inserarea unor linii într-o tabelă, după cum acestea
respectivă, cererea va eşua şi va returna un mesaj de îndeplinesc sau nu o condiţie de tip join.
eroare.  Sintaxa cererii este următoarea:
MERGE INTO nume_tabela_1 [alias_tabela_1]
 Este cazul actualizărilor în care: USING nume_tabela_2 | nume_vedere | subcerere
 Noua valoare este nulă şi coloana are o constrângere de ON (conditie_de_join)
integritate de tip NOT NULL, WHEN MATCHED THEN
 Noua valoare face ca linia să conţină o valoare de cheie care UPDATE SET
mai există în tabelă, într-o altă linie, coloana1 = expresie1
 Noua valoare nu verifică o constrângere de tip CHECK, [, coloana2=expresie2, ...]
 Vechea valoare a cheii este referită prin constrângeri de tip WHEN NOT MATCHED THEN
FOREIGN KEY în alte tabele, INSERT [(lista_coloane)] VALUES
 Noua valoare a unei chei străine nu se regăseşte în tabela (lista_valori);
referită prin FOREIGN KEY.

F. Radulescu. Curs: Baze de date 25 F. Radulescu. Curs: Baze de date 26

MERGE – cont. EXEMPLU


 Tabela în care se fac actualizări/inserări este cea specificată în
clauza MERGE INTO. În continuare vom denumi această tabelă
În cazul în care conţinutul tabelei STUD se
tabela destinatie. modifică, aducerea tabelei NRSTUD în
 Valorile actualizate / inserate sunt determinate de tabela / vederea concordanţă cu acesta se poate face prin
/ subcererea din clauza USING. În continuare vom denumi această
tabelă tabela sursa. cererea:
 Decizia privind operaţia efectuată (actualizare sau inserare) este MERGE INTO NRSTUD
luată pe baza condiţiei de join dintre tabela sursă şi tabela USING (SELECT CODS C, COUNT(*) NR
destinaţie, specificată în clauza ON,
 În cazul în care linia curentă din tabela sursă are linii FROM STUD GROUP BY CODS)
corespondente prin condiţia ON în tabela destinaţie, se execută o ON (NRSTUD.CODS = C)
actualizare a acestor linii pe baza specificaţiilor din clauza UPDATE
SET, WHEN MATCHED THEN
 În cazul în care linia curentă din tabela sursă nu are nici o linie UPDATE SET NRSTUD.NRSTUD = NR
corespondentă prin condiţia ON în tabela destinaţie, se execută
inserarea unei noi linii pe baza specificaţiilor din INSERT, WHEN NOT MATCHED THEN
 Liniile din tabela destinaţie care nu au corespondent prin condiţia INSERT VALUES (C, NR);
ON nu sunt afectate de această cerere (nu sunt nici actualizate, nici
şterse).
F. Radulescu. Curs: Baze de date 27 F. Radulescu. Curs: Baze de date 28

ACTUALIZARI PRIN SUBCERERI:


EXEMPLU – cont.
 Se evaluează subcererea din clauza USING.
CLAUZA WITH CHECK OPTION
Rezultatul conţine codurile specializărilor şi numărul
de studenţi corespunzător acestora calculate pe baza În cazul cererilor INSERT, DELETE şi UPDATE
datelor din tabela STUD. se poate folosi o subcerere în locul numelui
 În cazul în care un cod de specializare există atât în tabelei al cărei conţinut se modifică.
tabela NRSTUD cât şi în rezultatul subcererii, linia Aceste subcereri trebuie să satisfacă
corespunzătoare din NRSTUD este actualizată să restricţiile care vor fi prezentate în detaliu în
reflecte noul număr de studenţi, cel din rezultatul
subcererii. capitolul următor în paragraful privind
 În cazul în care au apărut studenţi la specializări noi
actualizarea datelor prin intermediul vederilor.
(linia din rezultatul subcererii conţine un cod de Este vorba în principal despre subcereri care
specializare inexistent în tabela NRSTUD) se se referă la o singură tabelă şi nu conţin
inserează o nouă linie în NRSTUD conţinând datele funcţii de grup sau grupare şi nici nu au
referitoare la aceste specializări. coloane definite prin expresii.
F. Radulescu. Curs: Baze de date 29 F. Radulescu. Curs: Baze de date 30

5
Florin Radulescu - Baze de date (note de curs)

WITH CHECK OPTION - cont EXEMPLE: INSERARE


Pentru un mai bun control al operaţiilor Inserarea unei noi specializări, cu şi fără WITH CHECK OPTION:
efectuate prin intermediul subcererilor,  Varianta 1: fără WITH CHECK OPTION. Deşi noua linie nu poate
fi regăsită prin subcerere (codul specializării nu îndeplineşte
acestea pot conţine clauza WITH CHECK condiţia CODS > 11), ea va fi totuşi inserată:
OPTION care specifică: INSERT INTO (SELECT * FROM SPEC WHERE CODS >
11)
 În cazul unui INSERT, noua linie îndeplineşte
VALUES (9, 'UNNUME', 'UNDOMENIU');
condiţiile pentru a fi regăsită prin subcererea prin
care se face inserarea,  Varianta 2: cu WITH CHECK OPTION. Deoarece noua linie nu
poate fi regăsită prin subcerere ea nu va fi inserată şi se va
 În cazul lui UPDATE, noile valori ale liniilor semnala mesajul de eroare ORA-01402: view WITH CHECK
actualizate îndeplinesc de asemenea condiţiile OPTION where-clause violation:
pentru regăsirea lor prin intermediul subcererii, INSERT INTO
 În cazul cererilor DELETE se pot şterge doar linii (SELECT * FROM SPEC
care au corespondent în rezultatul subcererii. WHERE CODS > 11
Folosirea lui WITH CHECK OPTION, deşi permisă, WITH CHECK OPTION)
nu are nici un efect. VALUES (9, 'UNNUME', 'UNDOMENIU');

F. Radulescu. Curs: Baze de date 31 F. Radulescu. Curs: Baze de date 32

EXEMPLE: STERGERE EXEMPLE: ACTUALIZARE


 Stergerea unor specializări, cu şi fără WITH CHECK  Actualizarea unor specializări, cu şi fără WITH CHECK
OPTION: Următoarele două cereri au acelaşi efect: OPTION:
ştergerea specializării cu codul 21.  Varianta 1: fără WITH CHECK OPTION. Unele noi valori nu
pot fi regăsite prin subcerere (21 şi 24 devin > 50) dar
 Specializarea cu codul 24 nu este ştearsă, deşi cererea se va executa fără erori:
domeniul ei este 'UMANIST', pentru că ea nu este UPDATE (SELECT * FROM SPEC WHERE CODS <
regăsită de subcerere: 50)
DELETE (SELECT * FROM SPEC SET CODS = CODS + 30;
WHERE CODS < 24)  Varianta 2: cu WITH CHECK OPTION. În acest caz cererea
WHERE DOMENIU = 'UMANIST'; va semnala o eroare (codurile unora dintre specializări
depăşesc 50. Eşecul este la nivel de cerere şi nu sunt
Sau cu WITH CHECK OPTION: actualizate nici liniile care prin această operaţie pot fi încă
DELETE (SELECT * FROM SPEC regăsite de subcerere (cazul specializării cu codul 11):
WHERE CODS < 24 WITH CHECK OPTION) UPDATE (SELECT * FROM SPEC
WHERE DOMENIU = 'UMANIST'; WHERE CODS < 50 WITH CHECK OPTION)
SET CODS = CODS + 30;
F. Radulescu. Curs: Baze de date 33 F. Radulescu. Curs: Baze de date 34

CONSISTENTA LA CITIRE CONSISTENTA.. (2)


Sistemul Oracle implementează În mod curent pe aceeaşi bază de date
operează simultan mai mulţi utilizatori care
mecanisme care îi permit fiecărui pot efectua două tipuri de operaţii:
utilizator (uman sau aplicaţie care  Operaţii de citire. În această categorie intră în
utilizează baza de date) să aibă în orice principal regăsirile de date prin cereri SELECT.
moment o viziune consistentă a datelor.  Operaţii de scriere. În această categorie sunt
operaţiile de INSERT, UPDATE, DELETE şi MERGE
În continuare sunt prezentate descrise anterior.
elementele de bază privind consistenţa În lipsa unei tratări necorespunzătoare,
execuţia simultană a unei operaţii de scriere
la citire, blocările implicite efectuate de cu o altă operaţie (de citire sau de scriere)
sistem şi mecanismele de implementare poate duce la inconsistenţe în utilizarea bazei
a tranzacţiilor. de date.
F. Radulescu. Curs: Baze de date 35 F. Radulescu. Curs: Baze de date 36

6
Florin Radulescu - Baze de date (note de curs)

EXEMPLU CUM FACE ORACLE:


 Fie doi utilizatori care lucrează simultan pe tabela  Aceleaşi date pot fi citite simultan de oricâţi
STUD, primul incrementând anul de studii (o cerere utilizatori,
UPDATE) şi al doilea afişând conţinutul tabelei  Aceleaşi date nu pot fi modificate simultan de doi
(cerere SELECT). Fără mecanisme de păstrare a unei utilizatori. În momentul în care unul din ei modifică o
viziuni consistente asupra datelor este posibilă valoare, sistemul efectuează o blocare implicită a
următoarea situaţie: liniei care o conţine blocând accesul pentru scriere al
altor utilizatori.
 Unele dintre linile afişate pentru al doilea utilizator  Aceleaşi date pot fi modificate la un moment dat de
conţin anul de studii încă nemodificat (cererea un utilizator şi citite de oricâţi alţii,
UPDATE nu a ajuns încă la aceste linii),  Modificările făcute de un utilizator în conţinutul
 Celelalte linii afişate conţin anul modificat de cererea tabelelor nu sunt vizibile pentru ceilalţi utilizatori
UPDATE în curs. până în momentul în care se execută implicit sau
explicit înscrierea lor permanentă în baza de date
(operaţie numită în terminologia de specialitate
comitere).
F. Radulescu. Curs: Baze de date 37 F. Radulescu. Curs: Baze de date 38

CUM FACE ORACLE – cont. EXEMPLU


 Până la comiterea modificărilor, operaţiile de citire  Exemplu: să considerăm trei posturi de lucru, U1, U2
efectuate de alţi utilizatori returnează conţinutul de şi U3 de la care se execută următoarele cereri, la
date anterior modificării lor, momentele de timp specificate (t1 < t2 < ... < t6).
 Până nu au fost comise, modificările pot fi revocate,  Iniţial presupunem că tabela NRSTUD conţine
anulându-se efectul cererilor care le-au efectuat,
informaţii corecte despre specializările şi numărul de
 În momentul comiterii sau revocării modificărilor se studenţi asociat lor:
ridică toate blocările aferente acestora,
U1/t1: UPDATE NRSTUD SET NRSTUD = 0;
U1/t2: SELECT * FROM NRSTUD;
În acest fel operaţiile de citire şi modificare a datelor U2/t3: SELECT * FROM NRSTUD;
se pot executa simultan fără să interfereze unele cu
U3/t4: UPDATE NRSTUD SET CODS = CODS + 1;
celelalte.
U1/t5: COMMIT;
De asemenea sunt prevenite inconsistenţele care pot
apare la modificarea simultană a aceloraşi date. U2/t6: SELECT * FROM NRSTUD;

F. Radulescu. Curs: Baze de date 39 F. Radulescu. Curs: Baze de date 40

U1/t1: UPDATE NRSTUD SET NRSTUD = 0; U1/t1: UPDATE NRSTUD SET NRSTUD = 0;
U1/t2: SELECT * FROM NRSTUD; U1/t2: SELECT * FROM NRSTUD;
U2/t3: SELECT * FROM NRSTUD; U2/t3: SELECT * FROM NRSTUD;
U3/t4: UPDATE NRSTUD SET CODS = CODS + 1; U3/t4: UPDATE NRSTUD SET CODS = CODS + 1;
U1/t5: COMMIT; U1/t5: COMMIT;
U2/t6: SELECT * FROM NRSTUD; U2/t6: SELECT * FROM NRSTUD;

La momentul t1, U1 execută o actualizare a  La momentul t3, U2 afişează de asemenea conţinutul
tabelei NRSTUD. Datele afişate vor conţine vechile
datelor, aducând la 0 valorile de pe coloana valori din coloana NRSTUD (diferite de 0), cele
NRSTUD. Noile valori nu sunt încă modificate fiind disponibile decat pentru U1.
permanente, fiind vizibile doar pentru U1.  La momentul t4, U3 lansează o cerere de actualizare
pe tabela NRSTUD. Deoarece U1 nu a comis sau
În acelaşi timp sistemul blochează liniile revocat încă modificările, cererea lui U3 intră în
modificate, ele fiind accesibile pentru scriere aşteptare, liniile necesare fiind blocate de sistem.
doar pentru U1.  La momentul t5 U1 comite modificările. Ele devin
permanente iar liniile blocate din NRSTUD sunt
La momentul t2, U1 afişează datele. deblocate. În consecinţă se execută şi cererea lui U3
Rezultatul conţine valorile modificate. care fusese plasată în aşteptare.

F. Radulescu. Curs: Baze de date 41 F. Radulescu. Curs: Baze de date 42

7
Florin Radulescu - Baze de date (note de curs)

U1/t1: UPDATE NRSTUD SET NRSTUD = 0;


U1/t2: SELECT * FROM NRSTUD;
U2/t3:
U3/t4:
SELECT * FROM
UPDATE NRSTUD
NRSTUD;
SET CODS = CODS + 1;
TRANZACTII
U1/t5: COMMIT;  În contextul acestui capitol, o tranzacţie poate fi
U2/t6: SELECT * FROM NRSTUD;
definită ca o succesiune de cereri DML (printre care
 Sistemul blochează pentru U3 liniile modificate din pot exista şi cereri de regăsire a informaţiilor)
NRSTUD. Ele nu mai pot fi scrise decât de acesta. executate într-o aceeaşi sesiune de lucru.
 La momentul t6 se execută din nou o cerere de  Modificarile facute in baza de date pe parcursul unei
regăsire a lui U1. Datele afişate vor conţine valorile tranzactii pot fi la final fie toate comise fie toate
modificate ale numărului de studenţi (0) şi cele încă revocate
nemodificate pentru codul specializării (U3 nu a  Tranzactia este din acest punct de vedere o operatie
comis încă modificările). atomica
 Pentru testarea acestui comportament se pot folosi  La încheierea unei tranzacţii, toate liniile blocate de
trei ferestre SQL*Plus deschise simultan pe acelaşi sistem pentru aceasta sunt eliberate.
calculator, cu acelaşi nume de utilizator Oracle.

F. Radulescu. Curs: Baze de date 43 F. Radulescu. Curs: Baze de date 44

TRANZACTII – cont. CERERI DDL SI DCL


 Tranzacţia începe cu prima cerere DML şi se termină În ceea ce priveşte cererile DDL şi DCL,
în momentul în care:
 Se execută o cerere COMMIT care face permanente
acestea se constituie de asemenea în
modificările efectuate de tranzacţie. tranzacţii.
 Se execută o cerere ROLLBACK care revocă modificările
efectuate de tranzacţie. Execuţia unei astfel de cereri se face astfel:
 Se execută o cerere DDL (de exemplu CREATE) sau o cerere  Anterior execuţiei este finalizată prin comitere
DCL. Tranzacţia se încheie înainte de execuţia acesteia prin tranzacţia în curs.
comiterea modificărilor
 Se încheie sesiunea de lucru (ieşire din SQL*Plus). În acest  Se execută cererea DDL sau DCL.
caz modificările efectuate de tranzacţie sunt de asemenea  Efectul acesteia este de asemenea comis. Cererile
comise.
 Apare o cădere hardware sau software a sistemului.
de acest tip nu pot fi revocate prin ROLLBACK.
Modificările efectuate de tranzacţie sunt revocate.

F. Radulescu. Curs: Baze de date 45 F. Radulescu. Curs: Baze de date 46

SQL*PLUS COMMIT SI ROLLBACK


În SQL*Plus există de asemenea posibilitatea Sintaxa cererilor COMMIT şi ROLLBACK
de a specifica faptul că fiecare cerere DML
trebuie comisă automat după execuţie. este următoarea:
Setarea poate fi efectuată astfel:  COMMIT; - Toate modificările efectuate de
 SET AUTOCOMMIT OFF - Comiterea şi revocarea
sunt la nivel de tranzacţie şi nu la nivel de cerere cererile DML ale tranzacţiei sunt comise.
DML. Este opţiunea implicită.  ROLLBACK; - Toate modificările efectuate
 SET AUTOCOMMIT ON - Fiecare cerere DML este
o tranzacţie. de cererile DML ale tranzacţiei sunt
Atentie: inchiderea ferestrei SQL*Plus (din revocate.
butonul x) este considerata incident software In ambele cazuri tranzactia curenta se
si tranzactia curenta este revocata!
incheie.
F. Radulescu. Curs: Baze de date 47 F. Radulescu. Curs: Baze de date 48

8
Florin Radulescu - Baze de date (note de curs)

SAVEPOINT EXEMPLU
 În sistemul Oracle există şi posibilitatea ca o tranzacţie să
fie revocată parţial.
 Pentru asta însă trebuiesc setate puncte de revenire cu
Fie următoarea succesiune de cereri SQL,
cererea SAVEPOINT. Sintaxa aferentă acestor operaţii este executate imediat după intrarea într-o
următoarea: sesiune de lucru SQL*Plus.
SAVEPOINT nume; INSERT INTO SPEC ...
ROLLBACK TO [SAVEPOINT] nume; SAVEPOINT P1;
 SAVEPOINT nume: specifică definirea unui punct de UPDATE STUD ...
revenire, având asociat un nume. Pe cuprinsul execuţiei unei
tranzacţii se pot fixa mai multe astfel de puncte. SAVEPOINT P2
 ROLLBACK TO nume: specifică revocarea tuturor DELETE SPEC ...
modificărilor efectuate după fixarea punctului de revenire cu
numele respectiv. Modificările efectuate înainte de acest ROLLBACK TO P2
punct rămân şi nu sunt revocate. Ele pot fi comise sau INSERT INTO STUD ...
revocate ulterior, revocarea putând fi de asemenea parţială.
În acelaşi timp, toate punctele de revenire fixate ulterior ROLLBACK TO P1;
celui în cauză se pierd. CREATE TABLE ...

F. Radulescu. Curs: Baze de date 49 F. Radulescu. Curs: Baze de date 50

INSERT INTO SPEC ... INSERT INTO SPEC ...


SAVEPOINT P1; SAVEPOINT P1;
UPDATE STUD ... UPDATE STUD ...
SAVEPOINT P2 SAVEPOINT P2
DELETE SPEC ... DELETE SPEC ...
ROLLBACK TO P2 ROLLBACK TO P2
INSERT INTO STUD ... INSERT INTO STUD ...
ROLLBACK TO P1; ROLLBACK TO P1;
CREATE TABLE ... CREATE TABLE ...

Tranzacţia începe cu o inserare în tabela Se execută o inserare în tabela STUD. Ulterior
SPEC. După efectuarea acesteia se fixează însă se revine în punctul P1. Sunt revocate astfel
punctul de revenire P1. efectele inserării şi actualizării tabelei STUD.
Se execută o actualizare a tabelei STUD şi Ultima cerere din exemplu este un CREATE.
fixarea punctului de revenire P2. Înainte de execuţia sa sunt comise modificările
executate de tranzacţie. Singura cerere DML care
Se execută o ştergere de linii din SPEC. încă nu a fost revocată este prima inserare în
Urmează însă o revenire la punctul P2 care SPEC şi va fi singura comisă.
anulează efectele acestei ştergeri. Se execută CREATE care fiind cerere DDL se
comite automat.
F. Radulescu. Curs: Baze de date 51 F. Radulescu. Curs: Baze de date 52

CONCLUZII
Mecanismele de tranzacţie şi blocările
implicite puse la dispoziţie de sistem
permit asigurarea consistenţei bazei de Sfarsitul capitolului
date în contextul operării concurente cu
aceleaşi date. ACTUALIZAREA
Pe lângă blocările implicite, Oracle pune DATELOR
la dispoziţia utilizatorilor şi mecanisme
de blocare explicită care nu fac obiectul
lucrării de faţă.
F. Radulescu. Curs: Baze de date 53 F. Radulescu. Curs: Baze de date 54

9
Florin Radulescu - Baze de date (note de curs)

STUD
SQL - 7 MATR NUME AN GRUPA DATAN LOC TUTOR PUNCTAJ CODS
---- ------- -- ------ --------- ---------- ----- ------- ----
1456 GEORGE 4 1141A 12-MAR-82 BUCURESTI 2890 11
1325 VASILE 2 1122A 05-OCT-84 PITESTI 1456 390 11
1645 MARIA 3 1131B 17-JUN-83 PLOIESTI 1400 11
3145 ION 1 2112B 24-JAN-85 PLOIESTI 3251 1670 21
2146 STANCA 4 2141A 15-MAY-82 BUCURESTI 620 21
3251 ALEX 5 2153B 07-NOV-81 BRASOV 1570 21
2215 ELENA 2 2122A 29-AUG-84 BUCURESTI 2146 890 21
ALTE OBIECTE ALE 4311
3514
ADRIAN
FLOREA
3 2431A 31-JUL-83 BUCURESTI
5 2452B 03-FEB-81 BRASOV
450
3230
24
24
1925 OANA 2 2421A 20-DEC-84 BUCURESTI 4311 760 24
BAZEI DE DATE 2101
4705
MARIUS
VOICU
1 2412B 02-SEP-85 PITESTI
2 2421B 19-APR-84 BRASOV
3514
4311
310
1290
24
24

F. Radulescu. Curs: Baze de date 1 F. Radulescu. Curs: Baze de date 2

SPEC si BURSA OBIECTIV


CODS NUME DOMENIU
----- ---------- --------------- Acest capitol prezintă modul de lucru cu
11 MATEMATICA STIINTE EXACTE alte obiecte care pot exista într-o bază
21 GEOGRAFIE UMANIST
24 ISTORIE UMANIST
de date Oracle:
 vederi,
TIP PMIN PMAX SUMA
-------------------- ----- ----- -----  secvenţe,
FARA BURSA 0 399
 indecşi
BURSA SOCIALA 400 899 100
BURSA DE STUDIU 900 1799 150  sinonime.
BURSA DE MERIT 1800 2499 200
BURSA DE EXCEPTIE 2500 9999 300

F. Radulescu. Curs: Baze de date 3 F. Radulescu. Curs: Baze de date 4

VEDERI VEDERI (2)


În capitolele anterioare a fost prezentată Ca şi toate celelalte sisteme relaţionale,
posibilitatea folosirii unei subcereri în clauza
FROM a unei cereri SELECT precum şi ca bază
Oracle permite asocierea unui nume
de pornire pentru cereri de tip INSERT, pentru o cerere SQL de tip SELECT şi
DELETE şi UPDATE. stocarea acesteia ca obiect al bazei de
Inconvenientul principal în această abordare date.
este inexistenţa unui nume asociat cererii
respective. Termenul care desemnează o astfel de
În unele cazuri se pot folosi aliasuri de tabelă cerere este vedere (în limba engleză:
dar rescrierea subcererii este necesară în view).
orice cerere care pleacă de la aceasta.
F. Radulescu. Curs: Baze de date 5 F. Radulescu. Curs: Baze de date 6

1
Florin Radulescu - Baze de date (note de curs)

VEDERI – UTILIZARE (1) VEDERI – UTILIZARE (2)


O vedere se comportă ca o tabelă în cazul  Ori de câte ori se execută o cerere având la bază o
vedere, ea este recalculată. Astfel, orice modificare
execuţiei de cereri SELECT şi poate fi folosită efectuată în tabelele pe baza cărora e definită
uneori pentru efectuarea de actualizări ale vederea se reflectă automat în aceasta.
bazei de date.  Structura unei vederi nu se poate modifica prin cereri
de tip ALTER ci prin recrearea vederii cu specificarea
Există însă şi diferenţe între o vedere şi o unei alte cereri SQL.
tabelă, mai ales din punct de vedere al  Constrângerile de integritate nu se pot defini la nivel
implementării: de vedere. O vedere moşteneşte implicit toate
În cazul unei vederi, baza de date stochează constrângerile definite în tabelele pe baza cărora este
definită pentru coloanele care sunt regăsite prin
definiţia acesteia (cererea SQL ca şir de cererea asociată ei.
caractere) şi nu datele regăsite prin aceasta.
F. Radulescu. Curs: Baze de date 7 F. Radulescu. Curs: Baze de date 8

VEDERI – UTILIZARE (3) VEDERI-SINTAXA (1)


Vederile permit implementarea de scheme externe prin Sintaxa cererii de creare a unei vederi este următoarea:
care diverse categorii de utilizatori accesează doar CREATE [OR REPLACE] [FORCE | NOFORCE]
acele porţiuni din baza de date pe care le folosesc în VIEW nume_vedere
mod obişnuit, asigurându-se astfel: [(lista_de_coloane)]
 Confidenţialitatea datelor: utilizatorii care accesează AS subcerere
baza de date doar prin intermediul unor vederi pot fi [WITH CHECK OPTION [CONSTRAINT
restricţionaţi în ceea ce priveşte datele pe care le pot nume_constrangere]]
utiliza prin însăşi definiţia vederilor respective (ele nu
conţin coloanele/liniile/datele la care nu se doreşte [WITH READ ONLY [CONSTRAINT
accesul acelei categorii de utilizatori). nume_constrangere]];
 Asigurarea corectitudinii datelor: prin faptul că un Semnificaţia elementelor prezente într-o astfel de cerere
este următoarea:
utilizator nu are acces la date pe care uzual nu le
foloseşte este împiedicată coruperea accidentală a  nume_vedere - specifică numele asociat vederii
celorlalte date din cauza necunoaşterii semnificaţiei respective. Respectă aceleaşi condiţii ca în cazul
lor. numelor de tabele.
 subcerere - cererea SQL de tip SELECT asociată vederii.
F. Radulescu. Curs: Baze de date 9 F. Radulescu. Curs: Baze de date 10

VEDERI-SINTAXA (2) VEDERI-SINTAXA (3)


Elementele opţionale au următoarea semnificaţie:  OR REPLACE - în cazul în care există deja o vedere
 lista_de_coloane - specifică numele coloanelor din cu acel nume, ea este înlocuită. Este modul uzual
prin care se modifică structura şi conţinutul unei
vedere. Acestea trebuie să respecte restricţiile uzuale vederi. În lipsa acestei opţiuni sistemul semnalează în
pentru nume de coloane descrise în capitolele astfel de situaţii o eroare.
precedente (30 de caractere, etc.). În lipsa acestei  FORCE | NOFORCE (valoare implicită NOFORCE) - la
opţiuni coloanele vederii au aceleaşi nume cu ale crearea unei vederi sistemul verifică existenţa
rezultatului cererii SQL asociate. tabelelor folosite în definiţia acesteia şi semnalează
 În cazul în care rezultatul cererii asociate vederii are erori în cazul detectării unor absenţe.
nume de coloane care nu respectă restricţiile privind  În cazul folosirii opţiunii FORCE această verificare nu
astfel de nume este obligatorie fie folosirea mai duce la eroare şi vederea este stocată în baza de
listei_de_coloane fie modificarea cererii prin date. Vederea nu poate însă fi folosită până când
adăugarea unor aliasuri de coloană corespunzătoare. discrepanţa dintre definiţia sa şi structura bazei de
date nu este înlaturată.

F. Radulescu. Curs: Baze de date 11 F. Radulescu. Curs: Baze de date 12

2
Florin Radulescu - Baze de date (note de curs)

VEDERI-SINTAXA (4) EXEMPLE


 WITH CHECK OPTION - ca şi în capitolul precedent, CREATE OR REPLACE VIEW STUD_AN1 AS
această opţiune împiedică efectuarea de modificări SELECT * FROM STUD WHERE AN = 1
ale conţinutului bazei de date dacă liniile
inserate/actualizate nu sunt regăsite prin cererea WITH CHECK OPTION;
asociată vederii. Această opţiune este din categoria
constrângerilor de integritate şi se poate asocia un CREATE OR REPLACE VIEW LISTA_AN1
nume cu CONSTRAINT nume.
(MATRICOLA, NUMELE, ANUL, NRPUNCTE) AS
 WITH READ ONLY - nu sunt permise modificări ale
datelor prin intermediul vederii. De asemenea se SELECT MATR, NUME, AN, PUNCTAJ
poate asocia un nume pentru aceasta constrângere. FROM STUD_AN1
 Asocierea de nume pentru ultimele două opţiuni WHERE CODS = 21
permite activarea şi dezactivarea lor.
WITH READ ONLY;

F. Radulescu. Curs: Baze de date 13 F. Radulescu. Curs: Baze de date 14

OBSERVATII ALT EXEMPLU


 O vedere se poate folosi pentru definirea altor vederi Se pot defini vederi având asociate cereri SQL
(LISTA_AN1 e definită pe baza STUD_AN1). oricât de complicate. Un exemplu de vedere
 Prin vederea STUD_AN1 nu se pot insera decât având la baza joinul celor trei tabele STUD,
studenţi de anul 1 şi nu se poate modifica valoarea SPEC şi BURSA este următorul:
anului de studiu din 1 în altă valoare, nulă sau CREATE OR REPLACE VIEW LISTA_BURSA AS
nenulă (constrângerea WITH CHECK OPTION). SELECT MATR, ST.NUME NUMESTUD, AN,
 Prin vederea LISTA_AN1 se pot efectua doar regăsiri PUNCTAJ AS PCT,
de date (constrângerea WITH READ ONLY). SP.NUME NUMESPEC, SUMA
 Numele coloanelor din vederea LISTA_AN1 este altul FROM STUD ST, SPEC SP, BURSA
decât cel din tabela STUD şi vederea STUD_AN1 ca WHERE ST.CODS = SP.CODS AND
urmare a folosirii unei liste de nume în cererea de PUNCTAJ BETWEEN PMIN AND PMAX
creare. ORDER BY SP.NUME, PUNCTAJ DESC;

F. Radulescu. Curs: Baze de date 15 F. Radulescu. Curs: Baze de date 16

STERGERE VEDERI MODIFICARE DATE PRIN VEDERI


Ştergerea unei vederi se face cu cererea Ştergere linii prin vederi
DROP VIEW. Sintaxa acesteia este: Cererea DELETE poate avea la bază o
DROP VIEW nume_vedere vedere dacă aceasta verifică
Exemplu: ştergerea vederilor STUD_AN1 şi următoarele restricţii:
LISTA_A1 se face cu cererile: Are la bază o singură tabelă
DROP VIEW STUD_AN1;
DROP VIEW LISTA_AN1;
Nu conţine funcţii de grup
Fiind o comandă DDL, ştergerea unei vederi Nu conţine clauza GROUP BY
nu poate fi revocată cu ROLLBACK. Nu conţine clauza DISTINCT
Nu conţine funcţia ROWNUM
F. Radulescu. Curs: Baze de date 17 F. Radulescu. Curs: Baze de date 18

3
Florin Radulescu - Baze de date (note de curs)

EXEMPLE (1) EXEMPLE (2)


 Următoarele vederi nu pot fi folosite pentru ştergere
deoarece încalcă una sau mai multe din restricţiile de mai În ambele cazuri a fost nevoie de utilizarea unor
sus: aliasuri de coloană deoarece:
 Exemplul 1: Vedere care conţine DISTINCT, grupare şi
funcţii de grup: MAX(PUNCTAJ) nu respectă convenţia pentru
CREATE OR REPLACE VIEW NU_STERGE AS nume de coloane (conţine paranteze).
SELECT DISTINCT MAX(PUNCTAJ) MAXIM FROM
STUD ST.NUME şi SP.NUME duc la crearea unei
GROUP BY CODS; vederi având două coloane cu acelaşi nume
 Exemplul 2: Vedere care conţine ROWNUM şi join: (NUME).
CREATE OR REPLACE VIEW NU_STERGE AS
SELECT ROWNUM NRCRT, ST.NUME NUMESTUD, ROWNUM este un nume ilegal de coloană
SP.NUME NUMESPEC (cuvânt rezervat SQL)
FROM STUD ST, SPEC SP
WHERE ST.CODS = SP.CODS;
F. Radulescu. Curs: Baze de date 19 F. Radulescu. Curs: Baze de date 20

MODIFICARE DATE PRIN VEDERI EXEMPLU (1)


Actualizare Prin intermediul vederii TBURSA
se pot actualiza toate coloanele vederii care
Pentru a efectua actualizări (UPDATE) provin din coloane ale tabelei BURSA dar
prin intermediul unei vederi aceasta nu se poate specifica modificarea coloanei
trebuie să verifice următoarele restricţii: suplimentare SUMAMARITA definită de
expresia aritmetica SUMA*1.5:
Vederea verifică toate restricţiile
enumerate anterior pentru ştergere, CREATE OR REPLACE VIEW TBURSA AS
SELECT PMIN MINIM, PMAX MAXIM,
Comanda UPDATE nu actualizeză TIP TIPBURSA, SUMA, SUMA*1.5
coloanele definite prin expresii. SUMAMARITA
FROM BURSA;

F. Radulescu. Curs: Baze de date 21 F. Radulescu. Curs: Baze de date 22

EXEMPLU (2) MODIFICARE DATE PRIN VEDERI


 Următoarea actualizare va mări valoarea sumei în Inserare
cazul bursei având punctajul minim 2500: Pentru a se putea insera noi linii prin
UPDATE TBURSA intermediul unei vederi, aceasta trebuie să
SET SUMA = 400 satisfacă următoarele restricţii:
WHERE MINIM = 2500;
Vederea verifică toate restricţiile enumerate
 În schimb cererea de actualizare: anterior pentru ştergere,
UPDATE TBURSA
SET SUMAMARITA = 600 Vederea conţine toate coloanele tabelei de
WHERE MINIM = 2500; bază pentru care există constrângeri de tip
 va semnala eroarea ORA-01733: virtual column not
NOT NULL
allowed here deoarece se încearcă actualizarea unei Comanda de inserare nu încearcă să insereze
coloane definite printr-o expresie. date în coloane care provin din expresii.

F. Radulescu. Curs: Baze de date 23 F. Radulescu. Curs: Baze de date 24

4
Florin Radulescu - Baze de date (note de curs)

EXEMPLU (1) EXEMPLU (2)


cazul vederii TBURSA descrisă mai sus, în schimb cererea
aceasta conţine toate coloanele tabelei
INSERT INTO TBURSA
BURSA (deci inclusiv pe cele pentru care am
putea avea constrângeri de tip NOT NULL) şi VALUES (5000, 9999,
respectă şi restricţiile enumerate la ştergere. 'SUPLIMENTARA', 500, 750);
Rezultă că vom putea executa cu succes o
cerere de inserare de tipul:
INSERT INTO TBURSA va returna eroarea ORA-01733: virtual
(MINIM, MAXIM, TIPBURSA, SUMA) column not allowed here.
VALUES (5000, 9999, 'SUPLIMENTARA',
500);

F. Radulescu. Curs: Baze de date 25 F. Radulescu. Curs: Baze de date 26

OBSERVATII OBIECTE
Operaţiile de modificare a conţinutului
tabelelor prin intermediul vederilor definite pe
baza lor trebuie să respecte toate  vederi,
constrângerile de integritate ale acestora.  secvenţe,
De exemplu:
 nu se poate şterge o linie printr-o vedere dacă ea
 indecşi
conţine o cheie referită prin FOREIGN KEY,  sinonime.
 nu se pot insera linii care duplică o valoare de
cheie primară sau
 nu se poate actualiza o linie astfel încât o
constrângere de tip CHECK nu mai este verificată.

F. Radulescu. Curs: Baze de date 27 F. Radulescu. Curs: Baze de date 28

SECVENTE SECVENTE – cont.


 În multe aplicaţii este nevoie de generarea unor
secvenţe de numere care să fie folosite în comenzi de Soluţia care se foloseşte în Oracle este
tip INSERT sau UPDATE pentru valorile cheilor aceea a definirii unor obiecte numite
primare ale înregistrărilor inserate sau modificate.
 Soluţia calculării unei valori maxime şi a incrementării secvenţe care pot fi apelate în cereri
ei nu este corectă în contextul unei utilizări SQL şi care nu returnează niciodată o
concurente a datelor.
 O cerere de tipul următor: aceeaşi valoare.
SELECT MAX(MATR) + 1
FROM STUD; O secvenţă nu este asociată unei tabele
nu ne garantează obţinerea de valori unice pentru ci poate fi folosită pentru a genera
numerele matricole din înregistrările inserate în
tabela STUD deoarece ea poate fi executată simultan, valori care se utilizează oriunde este
returnând aceeaşi valoare. necesar.
F. Radulescu. Curs: Baze de date 29 F. Radulescu. Curs: Baze de date 30

5
Florin Radulescu - Baze de date (note de curs)

SECVENTE – SINTAXA (1) SECVENTE – SINTAXA (1)


Sintaxa definirii unei secvenţe este  nume_secventa: numele obiectului de tip secvenţă.
Respectă convenţiile Oracle privitoare la nume.
următoarea:
 pas: fiecare valoare generată se obţine din
CREATE SEQUENCE nume_secventa precedenta prin adăugarea acestui pas. Implicit pasul
[INCREMENT BY pas] are valoarea 1. În cazul în care valoarea sa este
[START WITH valoare_initiala] negativă secvenţa este descrescătoare
[MAXVALUE valoare_maxima | NOMAXVALUE]  valoare_initiala: prima valoare generată de secvenţă.
 valoare_maxima: în cazul specificării unei astfel de
[MINVALUE valoare_minima | NOMINVALUE]
valori, secvenţa nu poate genera valori mai mari
[CYCLE | NOCYCLE] decât aceasta. Implicit nu există o limitare superioară
[CACHE numar_valori | NOCACHE]; a valorilor generate (NOMAXVALUE).

F. Radulescu. Curs: Baze de date 31 F. Radulescu. Curs: Baze de date 32

SECVENTE – SINTAXA (2) EXEMPLU


 valoare_minima: în cazul secvenţelor descrescătoare Pentru a genera noi numere matricole
secvenţa nu poate genera valori mai mici decât
aceasta. Implicit nu există o limitare inferioară a care să pornească de la valoarea 5000,
valorilor generate (NOMINVALUE). pasul de incrementare să fie 2 iar
 CYCLE: în cazul atingerii valorii maxime sau minime,
secvenţa reporneşte de la valoarea iniţială. Implicit valoarea maximă să fie 9998 se crează
secvenţele se crează cu NOCYCLE (fără ciclare). secvenţa MATRICOLA cu cererea:
 CACHE numar_valori: implicit sistemul generează şi CREATE SEQUENCE MATRICOLA
ţine în memorie următoarele 20 de valori din
secvenţă. În cazul în care se doreşte ca numărul de INCREMENT BY 2
valori din memorie să fie altul foloseşte această
opţiune.
START WITH 5000
MAXVALUE 9998;
F. Radulescu. Curs: Baze de date 33 F. Radulescu. Curs: Baze de date 34

SECVENTE - FOLOSIRE OBSERVATIE


Fiecare secvenţă se foloseşte prin intermediul celor Inserarea unui nou student pentru care LUCA
două pseudocoloane pe care le are: este tutor nu se poate face cu cererea:
 nume_secventa.NEXTVAL returnează următoarea INSERT INTO STUD (TUTOR, MATR, NUME,
valoare din secvenţă.
AN, GRUPA, DATAN, LOC, PUNCTAJ, CODS)
 nume_secventa.CURRVAL returnează ultima valoare
VALUES(MATRICOLA.CURRVAL,
furnizată deja de secvenţă.
MATRICOLA.NEXTVAL, 'GEO', 1, '1111B',
'14-MAY-85', 'IASI', 1500, 11);
Exemplu: inserarea unui nou student folosind un număr
matricol generat de secvenţa:
În acest caz, deşi CURRVAL este folosit în
INSERT INTO STUD VALUES(MATRICOLA.NEXTVAL, lista de valori înaintea lui NEXTVAL, atât în
'LUCA', 4, '1141B', '14-MAY-82', 'IASI', coloana MATR cât şi în TUTOR va fi inserată
NULL, 1500, 24); aceeaşi valoare (cea dată de NEXTVAL).

F. Radulescu. Curs: Baze de date 35 F. Radulescu. Curs: Baze de date 36

6
Florin Radulescu - Baze de date (note de curs)

NEXTVAL: DA! NEXTVAL: NU!


Pe lângă lista de valori pentru inserarea NEXTVAL şi CURRVAL nu se pot folosi:
unei noi linii, NEXTVAL şi CURRVAL mai în clauza SELECT a cererii care defineşte o
pot fi folosite: vedere,
în clauza SET a unui UPDATE, într-o cerere SELECT DISTINCT
într-o cerere SELECT conţinând GROUP BY,
în clauza SELECT a unei subcereri doar HAVING sau ORDER BY,
dacă aceasta face parte dintr-o
în subcereri ale unor cereri SELECT, DELETE
comandă de inserare a rezultatelor sale, sau UPDATE,
într-o clauză SELECT a unei cereri ca valoare implicită de coloană în cereri
aflată pe primul nivel. CREATE TABLE sau ALTER TABLE.

F. Radulescu. Curs: Baze de date 37 F. Radulescu. Curs: Baze de date 38

SECVENTE - MODIFICARE SECVENTE - STERGERE


 Cererea prin care se modifică parametrii unei secvenţe are
următoarea sintaxă: Ştergerea unei secvenţe se face prin
ALTER SEQUENCE nume_secventa
[INCREMENT BY pas] comanda
[MAXVALUE valoare_maxima | NOMAXVALUE]
[MINVALUE valoare_minima | NOMINVALUE]
DROP SEQUENCE nume_secventa;
[CYCLE | NOCYCLE]
[CACHE numar_valori | NOCACHE]; Fiind o comandă DDL, ştergerea unei
 Semnificaţia clauzelor este cea deja menţionată la cererea de
creare. Singurul element care nu se poate modifica este
secvenţe nu poate fi revocată cu
valoarea de start. ROLLBACK.
 Noile valori ale parametrilor se aplică pentru valorile generate
după modificarea secvenţei. În cazul clauzelor MAXVALUE şi
MINVALUE, valorile respective nu pot fi mai mici, respectiv mai
mari decat valoarea curentă a secvenţei.

F. Radulescu. Curs: Baze de date 39 F. Radulescu. Curs: Baze de date 40

OBIECTE INDECSI
 Un index este o structură de căutare rapidă care
poate fi folosită de sistem pentru creşterea vitezei de
 vederi, evaluare a cererilor prin faptul că parcurgerea
tabelelor nu se mai face secvenţial, înregistrare cu
 secvenţe, înregistrare, ci sunt accesate direct liniile necesare
cererii respective.
 indecşi  Sistemul Oracle crează automat indecşi de tip unic
 sinonime. pentru cheile specificate la crearea tabelei prin
constrângerile PRIMARY KEY şi UNIQUE.
 În plus faţă de aceştia se pot crea şi alţii, unici sau
neunici (în acest ultim caz valorile indexate se pot
repeta) prin cererea CREATE INDEX

F. Radulescu. Curs: Baze de date 41 F. Radulescu. Curs: Baze de date 42

7
Florin Radulescu - Baze de date (note de curs)

INDECSI – SINTAXA EXEMPLE – cont.


CREATE INDEX nume index Exemplul 2: în cazul în care se execută
ON nume_tabela (expresie1 [, frecvent cereri de căutare după locul
expresie2, ...]); naşterii şi codul specializării studenţilor,
Exemplul 1: în cazul în care se execută se poate crea un index multi-coloană:
frecvent cereri de căutare după locul CREATE INDEX INDEX_LOC_CODS
naşterii studenţilor, se poate crea un ON STUD (LOC, CODS);
index mono-coloană după acesta:
CREATE INDEX INDEX_LOC
ON STUD (LOC);
F. Radulescu. Curs: Baze de date 43 F. Radulescu. Curs: Baze de date 44

EXEMPLE – cont. OBSERVATII


Exemplul 3: în cazul în care se execută Indecşii sunt menţinuţi automat de sistem.
Orice modificare a tabelei este însoţită de
frecvent cereri de căutare după anul şi locul reactualizarea indecşilor dacă valorile pe baza
naşterii studenţilor, se poate crea indexul cărora aceştia au fost creaţi se modifică.
următor. Din această cauză crearea unui număr mare
de indecşi pentru tabele care se actualizează
Acesta foloseşte o expresie pentru frecvent poate duce nu la creşterea vitezei de
extragerea anului naşterii: execuţie ci la scăderea sa.
CREATE INDEX INDEX_AN_LOC ON STUD În documentaţia sistemului sunt enumerate
cazurile în care este indicată crearea de
(TO_NUMBER(TO_CHAR(DATAN, 'YYYY')), indecşi şi cazurile în care aceasta este
LOC); contraproductivă.
F. Radulescu. Curs: Baze de date 45 F. Radulescu. Curs: Baze de date 46

INDECSI: DA! INDECSI: NU!


Coloanele conţin un procent însemnat de Tabela are un număr mic de linii.
valori nule (creşte viteza de regăsire a Majoritatea execuţiilor de cereri afectează un
înregistrărilor care conţin valori nenule). procent mai mare de 4% din liniile tabelei.
Coloana/coloanele/expresiile respective sunt Coloana/coloanele/expresiile respective nu
folosite în clauza WHERE a unor cereri sunt folosite în clauza WHERE a unor cereri
executate frecvent. executate frecvent.
Tabela este frecvent modificată (prin INSERT,
Coloanele conţin o mare varietate de valori, UPDATE sau DELETE).
Tabela are un număr mare de linii şi Condiţiile din WHERE conţin expresii calculate
majoritatea execuţiilor de cereri afectează un pe baza coloanelor respective. În acest caz
procent de maxim 4% din acestea indexul nu poate fi utilizat pentru a creşte
viteza de execuţie.
F. Radulescu. Curs: Baze de date 47 F. Radulescu. Curs: Baze de date 48

8
Florin Radulescu - Baze de date (note de curs)

INDEX - STERGERE OBIECTE


Ştergerea unui index se face prin
cererea  vederi,
DROP INDEX nume_index;
 secvenţe,
Fiind o comandă DDL, ştergerea unui  indecşi
index nu poate fi revocată cu
 sinonime.
ROLLBACK.

F. Radulescu. Curs: Baze de date 49 F. Radulescu. Curs: Baze de date 50

SINONIME SINTAXA
Obiectelor din baza de date li se pot asocia nume Cererea de creare a unui sinonim are
alternative - sinonime.
Crearea sinonimelor are ca obiect simplificarea următoarea sintaxă:
operării cu obiectele respective, putând asigura: CREATE [PUBLIC] SYNONYM sinonim
Nume alternative mai sugestive pentru obiecte FOR obiect;
care la creare au primit o denumire criptică.
Nume alternative mai scurte pentru obiecte care Opţiunea PUBLIC specifică faptul că
la creare au primit o denumire lungă. sinonimul este accesibil şi celorlalţi
Nume alternative mai scurte pentru obiectele utilizatori ai sistemului.
create de alţi utilizatori (pentru a fi accesate
acestea trebuie prefixate cu numele utilizatorului
care le deţine).
F. Radulescu. Curs: Baze de date 51 F. Radulescu. Curs: Baze de date 52

EXEMPLU EXEMPLU – cont.


 Exemplu:
CREATE PUBLIC SYNONYM ST
În schimb cererea:
FOR STUD; SELECT ST.NUME, SPEC.NUME
 După crearea acestui sinonim, ST poate apare în FROM ST, SPEC
cereri în locul lui STUD, dar nu şi împreună cu acesta.
 De exemplu, cererea: WHERE ST.CODS = SPEC.CODS;
SELECT A.NUME, B.NUME
FROM STUD A, SPEC B
va returna rezultatul dorit: numele
WHERE ST.CODS = B.CODS; studenţilor şi numele specializărilor
va semnala o eroare deoarece în contextul clauzei acestora.
FROM conţinute, pentru coloanele din STUD se poate
folosi pentru prefixare fie STUD fie A.

F. Radulescu. Curs: Baze de date 53 F. Radulescu. Curs: Baze de date 54

9
Florin Radulescu - Baze de date (note de curs)

SINONIM - STERGERE
Ştergerea unui sinonim se face prin
cererea
DROP [PUBLIC] SYNONYM nume_sinonim; Sfarsitul capitolului
PUBLIC se foloseşte pentru ştergerea ALTE OBIECTE ALE BAZEI
sinonimelor create cu această opţiune.
Fiind o comandă DDL, ştergerea unui DE DATE
sinonim nu poate fi revocată cu
ROLLBACK.

F. Radulescu. Curs: Baze de date 55 F. Radulescu. Curs: Baze de date 56

10
Florin Radulescu - Baze de date (note de curs)

STUD
SQL - 8 MATR NUME AN GRUPA DATAN LOC TUTOR PUNCTAJ CODS
---- ------- -- ------ --------- ---------- ----- ------- ----
1456 GEORGE 4 1141A 12-MAR-82 BUCURESTI 2890 11
1325 VASILE 2 1122A 05-OCT-84 PITESTI 1456 390 11
1645 MARIA 3 1131B 17-JUN-83 PLOIESTI 1400 11
3145 ION 1 2112B 24-JAN-85 PLOIESTI 3251 1670 21
2146 STANCA 4 2141A 15-MAY-82 BUCURESTI 620 21
3251 ALEX 5 2153B 07-NOV-81 BRASOV 1570 21
2215 ELENA 2 2122A 29-AUG-84 BUCURESTI 2146 890 21
TIPURI DE DATE 4311
3514
ADRIAN
FLOREA
3 2431A 31-JUL-83 BUCURESTI
5 2452B 03-FEB-81 BRASOV
450
3230
24
24
1925 OANA 2 2421A 20-DEC-84 BUCURESTI 4311 760 24
COMPUSE 2101
4705
MARIUS
VOICU
1 2412B 02-SEP-85 PITESTI
2 2421B 19-APR-84 BRASOV
3514
4311
310
1290
24
24

F. Radulescu. Curs: Baze de date 1 F. Radulescu. Curs: Baze de date 2

SPEC si BURSA OBIECTIV


CODS NUME DOMENIU
----- ---------- --------------- Acest capitol prezintă modul de lucru cu
11 MATEMATICA STIINTE EXACTE tipurile de date compuse utilizabile in
21 GEOGRAFIE UMANIST
24 ISTORIE UMANIST
SQL:
Tabelă (Nested TABLE)
TIP PMIN PMAX SUMA
-------------------- ----- ----- ----- Tablou de dimensiune variabilă
FARA BURSA 0 399 (VARRAY)
BURSA SOCIALA 400 899 100
BURSA DE STUDIU 900 1799 150
BURSA DE MERIT 1800 2499 200
BURSA DE EXCEPTIE 2500 9999 300

F. Radulescu. Curs: Baze de date 3 F. Radulescu. Curs: Baze de date 4

Tipuri compuse Asemănări


Pentru descrierea tipurilor compuse se poate Colecţiile de tip TABLE şi VARRAY se
folosi comanda de creare tip. Aceasta are aseamănă între ele în următoarele privinţe:
următoarea formă:
a. O colecţie de acest fel poate fi stocată într-o
celulă a unei tabele din baza de date (deci o
CREATE TYPE denumire_tip descriere_tip;
tabelă poate avea o coloană de tip colecţie
TABLE sau VARRAY
Cu ajutorul ei vom putea defini tipurile
compuse (denumite generic colecţii): b. Accesul la elemente se face prin indicele
1. Tabelă (Nested TABLE) acestora care porneşte de la 1.
2. Tablou de dimensiune variabilă (VARRAY)

F. Radulescu. Curs: Baze de date 5 F. Radulescu. Curs: Baze de date 6

1
Florin Radulescu - Baze de date (note de curs)

Asemănări Diferenţe
c. Numărul de elemente dintr-o astfel de Diferenţele sunt următoarele:
colecţie poate varia (dar în cazul VARRAY nu a. Numărul maxim de elemente ale tipului TABLE
poate depăşi limita maximă declarată) nu este fixat la descrierea lui, spre deosebire de
d. Elementele unei astfel de colecţii sunt toate VARRAY unde se specifică această limită.
de acelaşi tip de date. b. Indicii elementelor unui VARRAY se păstrează
prin stocarea în baza de date şi regăsirea lui pe
e. Limitările privind tipul elementelor sunt
când în cazul TABLE acest lucru nu este
aceleaşi în cele două cazuri.
adevărat. Din acest motiv tipul TABLE seamănă
cu mulţimile din limbajele de programare Pascal
şi C spre deosebire de tipul VARRAY care este
asemănător cu tablourile.
F. Radulescu. Curs: Baze de date 7 F. Radulescu. Curs: Baze de date 8

Diferenţe Diferenţe
c. În cazul unui VARRAY indicii elementelor sunt e. În cazul TABLE stocarea valorilor se face
succesivi, pornind de la indicele 1, crescător cu într-o aşa numită 'tabelă de stocare' (store
o unitate. La TABLE deşi intiţial indicii table) asociată tabelei de bază.
elementelor sunt succesivi, prin ştergerea unor
elemente pot să apară 'goluri' (operaţia de
ştergere 'din mijloc' nu este posibilă la
VARRAY).
d. Ca stocare fizică în baza de date, datele de tip
VARRAY se memorează fie în interiorul tabelei
(pentru dimensiune mai mică de 4 KB) fie în
spaţiul asociat tabelei (tablespace).
F. Radulescu. Curs: Baze de date 9 F. Radulescu. Curs: Baze de date 10

Limitări Creare tipuri


Limitările privind tipul elementelor unor date de În acest caz trebuie creat un tip corespunzător
acest fel sunt următoarele: folosind CREATE TYPE.
Sunt interzise (in Oracle V9) colectiile cu De exemplu dacă se doreşte ca pe o coloană a
elemente de tip : unei tabele de studenţi să avem lista cursurilor la
 REF CURSOR care sunt înscrişi (o listă de denumiri de cursuri)
 BINARY_INTEGER, PLS_INTEGER putem scrie cererea de creare a tabelei astfel,
 LONG, LONG RAW folosind TABLE:
 NATURAL, NATURALN
 POSITIVE, POSITIVEN
CREATE TYPE ListaCursuri AS TABLE OF
 REF CURSOR
VARCHAR2(30);
 SIGNTYPE
 STRING

F. Radulescu. Curs: Baze de date 11 F. Radulescu. Curs: Baze de date 12

2
Florin Radulescu - Baze de date (note de curs)

Creare tipuri Adăugare linii


Vom adauga acum la tabela STUD o coloana Pentru adaugare/modificare de valori pe aceasta
de tip TABLE: coloana putem folosi constructori de tip 'cast':
ALTER TABLE stud ADD (cursuri
ListaCursuri) NESTED TABLE INSERT INTO stud VALUES (1234,
cursuri STORE AS cursuri_tbl; 'IONESCU', 1, '311CD', '14-APR-
1997', 'PLOIESTI', 1456, 1200,
Coloanele de tip TABLE se stochează într-o
11, ListaCursuri('Analiza',
tabelă separată asociată tabelei de bază.
NULL, NULL, 'Algebra', NULL,
În cererea de creare anterioară clauza
NESTED TABLE defineşte numele acestei 'Fizica', 'Limba engleza'));
tabele.
F. Radulescu. Curs: Baze de date 13 F. Radulescu. Curs: Baze de date 14

Rezultat Rezultat
MATR NUME CURSURI
Tabela arata acum astfel: ---------- ---------- -----------------------------------
1234 IONESCU LISTACURSURI('Analiza', NULL, NULL,
'Algebra', NULL, 'Fizica', 'Limba engleza')
1456 GEORGE
SELECT matr, nume, cursuri 1325 VASILE
1645 MARIA
3145 ION
FROM stud; 2146 STANCA
3251 ALEX
2215 ELENA
4311 ADRIAN
3514 FLOREA
1925 OANA
2101 MARIUS
4705 VOICU

13 înregistrări selectate.

F. Radulescu. Curs: Baze de date 15 F. Radulescu. Curs: Baze de date 16

Actualizare linii Actualizare linii


Pentru actualizări putem folosi de asemenea SELECT matr, nume, cursuri
FROM stud WHERE matr=1234;
constructori:
MATR NUME CURSURI
UPDATE stud ---------- ---------- ---------------------------------
1234 IONESCU LISTACURSURI('Analiza',
SET cursuri=ListaCursuri('Analiza', 'Algebra', 'Sport', 'Programare')
'Algebra', 'Sport', 'Programare')
WHERE matr = 1234;

1 înregistrare actualizată.

F. Radulescu. Curs: Baze de date 17 F. Radulescu. Curs: Baze de date 18

3
Florin Radulescu - Baze de date (note de curs)

TABLE - Lucrul cu elementele TABLE → INSERT


În cazul în care se doreşte actualizarea  Inserare. Exemplu: Se adaugă la lista de cursuri
'Limba spaniola':
directă a unei colecţii stocate în baza de date
se foloseşte operatorul: INSERT INTO
TABLE (subcerere) TABLE(SELECT cursuri
care returnează o colecţie de tip TABLE. FROM stud
WHERE matr=1234)
Cererea principală se va aplica colecţiei şi nu
VALUES ('Limba spaniola');
liniei din tabelă.
1 înregistrare creată.

F. Radulescu. Curs: Baze de date 19 F. Radulescu. Curs: Baze de date 20

TABLE → INSERT TABLE → UPDATE


 Actualizare: Exemplu: se modifică 'Limba spaniola' în
'Limba germana'. Denumirea implicită pentru coloana
 Conţinutul liniei modificate este următorul: tabelei returnată de TABLE este COLUMN_VALUE:

SELECT matr, nume, cursuri UPDATE


FROM stud WHERE matr=1234; TABLE(SELECT cursuri
FROM stud
WHERE matr=1234)
MATR NUME CURSURI
SET COLUMN_VALUE = 'Limba germana'
-------- ---------- --------------------- WHERE COLUMN_VALUE= 'Limba spaniola';
1234 IONESCU LISTACURSURI('Analiza',
'Algebra', 'Sport', 'Programare', 'Limba 1 înregistrare actualizată.
spaniola')

F. Radulescu. Curs: Baze de date 21 F. Radulescu. Curs: Baze de date 22

TABLE → UPDATE TABLE → DELETE


Conţinutul liniei modificate este următorul:  Ştergere. Exemplu: Se şterge din listă cursul
'Sport'.
DELETE
SELECT matr, nume, cursuri
TABLE(SELECT cursuri
FROM stud WHERE matr=1234; FROM stud
WHERE matr=1234)
MATR NUME CURSURI WHERE COLUMN_VALUE='Sport';
------ ---------- -----------------
1234 IONESCU LISTACURSURI('Analiza', 1 înregistrare ştearsă.
'Algebra', 'Sport', 'Programare',
'Limba germana')

F. Radulescu. Curs: Baze de date 23 F. Radulescu. Curs: Baze de date 24

4
Florin Radulescu - Baze de date (note de curs)

TABLE → DELETE TABLE → SELECT


Conţinutul liniei modificate este următorul: Regăsire. Exemplu: Listarea tuturor
cursurilor studentului:
SELECT matr, nume, cursuri
FROM stud WHERE matr=1234; SELECT *
FROM
MATR NUME CURSURI TABLE (SELECT cursuri
------- ---------- -----------------
FROM stud
1234 IONESCU LISTACURSURI('Analiza',
'Algebra', 'Programare', 'Limba germana') WHERE matr=1234);

F. Radulescu. Curs: Baze de date 25 F. Radulescu. Curs: Baze de date 26

TABLE → SELECT TABLE → SELECT


Se obtine rezultatul: Alt exemplu: Pentru regăsirea unui curs:
SELECT COLUMN_VALUE
COLUMN_VALUE FROM
------------------------------ TABLE (SELECT cursuri
Analiza FROM stud
Algebra WHERE matr=1234)
Programare WHERE COLUMN_VALUE='Limba germana'
Limba germana

F. Radulescu. Curs: Baze de date 27 F. Radulescu. Curs: Baze de date 28

TABLE → SELECT VARRAY


SELECT COLUMN_VALUE
FROM
În Oracle9i nu este permisă actualizarea
TABLE (SELECT cursuri directă a unei colecţii de tip VARRAY stocată
FROM stud
WHERE matr=1234)
în baza de date. Regăsirea se face însă
WHERE COLUMN_VALUE='Limba germana' folosind ca în exemplul anterior operatorul
 Se obtine rezultatul: TABLE (subcerere).
COLUMN_VALUE Exemplu: Dacă numărul de cursuri este
------------------------------ maxim 25 putem folosi VARRAY:
Limba germana CREATE TYPE ListaCursuri AS
VARRAY(25) OF VARCHAR2(30);

F. Radulescu. Curs: Baze de date 29 F. Radulescu. Curs: Baze de date 30

5
Florin Radulescu - Baze de date (note de curs)

VARRAY VARRAY
Adaugarea unei coloane de acest tip la tabela Sau, pentru a crea o tabela noua cu o astfel
STUD: de coloana:
ALTER TABLE stud ADD (cursuri CREATE TABLE Student (
ListaCursuri) id_student NUMBER(4),
nume VARCHAR2(25),
adresa VARCHAR2(35),
cursuri ListaCursuri); -- VARRAY

F. Radulescu. Curs: Baze de date 31 F. Radulescu. Curs: Baze de date 32

VARRAY → INSERT linie VARRAY → UPDATE linie


Pentru adaugarea unei noi linii avand o  Pentru actualizare (inlocuirea unei colectii cu o
valoare pe coloana de tip VARRAY se folosesc alta) se folosesc de asemenea constructorii (ca la
constructori de tip 'cast', ca in cazul TABLE: TABLE):
INSERT INTO stud VALUES (1234,
'IONESCU', 1, '311CD', '14-APR- UPDATE stud
1997', 'PLOIESTI', 1456, 1200, 11, SET cursuri=ListaCursuri('Analiza',
ListaCursuri('Analiza', NULL, 'Algebra', 'Sport', 'Programare')
NULL, WHERE matr = 1234;
'Algebra', NULL, 'Fizica', 'Limba
engleza')); 1 înregistrare actualizată.

F. Radulescu. Curs: Baze de date 33 F. Radulescu. Curs: Baze de date 34

VARRAY → UPDATE linie VARRAY → SELECT colecţie


 Rezultatul obtinut este: Listarea tuturor cursurilor studentului.
Cererea urmatoare functioneaza si in cazul
SELECT matr, nume, cursuri VARRAY:
FROM stud WHERE matr=1234; SELECT *
FROM
MATR NUME CURSURI
TABLE (SELECT cursuri
------- ---------- ----------------
1234 IONESCU LISTACURSURI('Analiza', FROM stud
'Algebra', 'Sport', 'Programare') WHERE matr=1234);

F. Radulescu. Curs: Baze de date 35 F. Radulescu. Curs: Baze de date 36

6
Florin Radulescu - Baze de date (note de curs)

VARRAY → Limitări Excepţii


Nu se pot executa operatii de tip INSERT, În cazul în care manipularea unei colecţii este
UPDATE şi DELETE la nivel de element al unei defectuoasă se pot ridica o serie de excepţii.
colecţii de tip VARRAY din baza de date Exemple:
(operatii posibile in cazul TABLE). COLLECTION_IS_NULL
Pentru a face astfel de operatii: VALUE_ERROR
a. se regăseşte colecţia într-o variabilă PL/SQL, SUBSCRIPT_OUTSIDE_LIMIT
b. se actualizează variabila, SUBSCRIPT_BEYOND_COUNT
c. se reintroduce în baza de date cu o cerere NO_DATA_FOUND
UPDATE ca la mai sus.

F. Radulescu. Curs: Baze de date 37 F. Radulescu. Curs: Baze de date 38

Sfarsitul capitolului

TIPURI DE DATE
COMPUSE

F. Radulescu. Curs: Baze de date 39

7
Florin Radulescu - Baze de date (note de curs)

STUD
SQL - 9 MATR NUME AN GRUPA DATAN LOC TUTOR PUNCTAJ CODS
---- ------- -- ------ --------- ---------- ----- ------- ----
1456 GEORGE 4 1141A 12-MAR-82 BUCURESTI 2890 11
1325 VASILE 2 1122A 05-OCT-84 PITESTI 1456 390 11
1645 MARIA 3 1131B 17-JUN-83 PLOIESTI 1400 11
3145 ION 1 2112B 24-JAN-85 PLOIESTI 3251 1670 21

ELEMENTE DE 2146
3251
2215
STANCA
ALEX
ELENA
4 2141A 15-MAY-82 BUCURESTI
5 2153B 07-NOV-81 BRASOV
2 2122A 29-AUG-84 BUCURESTI 2146
620
1570
890
21
21
21
4311 ADRIAN 3 2431A 31-JUL-83 BUCURESTI 450 24

PL/SQL 3514
1925
FLOREA
OANA
5 2452B 03-FEB-81 BRASOV
2 2421A 20-DEC-84 BUCURESTI 4311
3230
760
24
24
2101 MARIUS 1 2412B 02-SEP-85 PITESTI 3514 310 24
4705 VOICU 2 2421B 19-APR-84 BRASOV 4311 1290 24

F. Radulescu. Curs: Baze de date 1 F. Radulescu. Curs: Baze de date 2

SPEC si BURSA PL/SQL


CODS NUME DOMENIU
----- ---------- --------------- PL/SQL (Procedural Language/SQL)
11 MATEMATICA STIINTE EXACTE este o extensie procedurală a limbajului
21 GEOGRAFIE UMANIST
24 ISTORIE UMANIST
SQL pentru SGBD Oracle (extensie
proprietară).
TIP PMIN PMAX SUMA
-------------------- ----- ----- -----
Apariţia sa este datorată faptului că
FARA BURSA 0 399 limbajul SQL este un limbaj de cereri şi
BURSA SOCIALA 400 899 100 nu un limbaj de programare
BURSA DE STUDIU 900 1799 150
BURSA DE MERIT 1800 2499 200
BURSA DE EXCEPTIE 2500 9999 300

F. Radulescu. Curs: Baze de date 3 F. Radulescu. Curs: Baze de date 4

PROGRAM = BLOC CE PUTEM SCRIE IN PL/SQL?


 Unitatea de execuţie este blocul care conţine: Blocuri anonime (Anonymous blocks)
 cereri SQL
 instrucţiuni PL/SQL.
Proceduri şi funcţii stocate (Stored
procedures/functions)
 Ele sunt executate astfel:
 Cererile SQL sunt trimise pentru a fi executate de serverul Proceduri şi funcţii folosite în aplicaţii
Oracle. Rezultatele acestora pot fi folosite apoi în (Application procedures/functions)
instrucţiunile PL/SQL.
 Instrucţiunile PL/SQL sunt executate de Executorul de Declanşatori ataşaţi bazei de date (Database
Instrucţiuni Procedurale (Procedural Statement triggers)
Executor) aflat în Motorul PL/SQL (PL/SQL Engine).
 Motorul PL/SQL este prezent în:
Declanşatori folosiţi în aplicaţii (Application
 Serverul Oracle
triggers)
 Unelte Oracle Pachete (Packaged procedures)

F. Radulescu. Curs: Baze de date 5 F. Radulescu. Curs: Baze de date 6

1
Florin Radulescu - Baze de date (note de curs)

CUM ARATA UN BLOC? DECLARE - BEGIN


DECLARE -- opţional Este zona de declaraţii a blocului.
declaraţii de variabile, cursori, excepţii definite de Sunt declarate în principal variabile, cursori,
utilizator excepţii utilizator necesare blocului, dar şi alte
BEGIN -- obligatoriu elemente (tipuri, proceduri, funcţii, etc.).
cereri SQL Această parte este opţională, un bloc putând
instrucţiuni PL/SQL începe direct cu cuvântul cheie BEGIN (care
este obligatoriu).
EXCEPTION -- opţional
Tipurile de date din SQL pot fi folosite (cu
acţiuni executate în caz de ridicare excepţii
unele diferenţe) şi în PL/SQL.
END; -- obligatoriu
F. Radulescu. Curs: Baze de date 7 F. Radulescu. Curs: Baze de date 8

BEGIN - EXCEPTION EXCEPTION - END


Corpul blocului, format din: Acţiuni executate în caz de eroare
 cereri SQL şi (tratarea erorilor).
 instrucţiuni PL/SQL care descriu procesarea Este o parte opţională a unui bloc (dar
datelor în cadrul acestuia. cuvântul cheie END care marchează
Cuvântul cheie EXCEPTION poate lipsi, sfârşit de bloc este obligatoriu).
în care caz blocul se termină cu END.

F. Radulescu. Curs: Baze de date 9 F. Radulescu. Curs: Baze de date 10

REGULI DE SCRIERE
EXEMPLU  Fiecare cerere SQL şi instrucţiune PL/SQL se încheie cu
DECLARE
punct şi virgulă (;)
v_nume VARCHAR2(10);  DECLARE, BEGIN şi EXCEPTION nu se termină cu punct şi
BEGIN
virgulă
SELECT NUME  După END se pune punct şi virgulă
INTO v_nume  Terminarea blocului se face cu punct (.)
FROM SPEC  Rularea unui bloc (in SQL*Plus) se face cu / sau r (run) la
WHERE CODS=11; promptul SQL>
DBMS_OUTPUT.PUT_LINE('Specializarea: '||  Ultimul bloc executat poate fi editat (ed in SQL*Plus)
v_nume);  În caz de rulare cu succes, după eventualele mesaje
EXCEPTION tipărite de bloc apare:
WHEN OTHERS THEN PL/SQL procedure successfully completed
DBMS_OUTPUT.PUT_LINE('A aparut o  In caz de rulare cu eroare netratată, se va afişa codul şi
exceptie'); mesajul de eroare.
END;

F. Radulescu. Curs: Baze de date 11 F. Radulescu. Curs: Baze de date 12

2
Florin Radulescu - Baze de date (note de curs)

OBSERVATIE VARIABILE PL/SQL


 În exemplul de mai sus a fost folosită pentru  Scalare:
procedura DBMS_OUTPUT.PUT_LINE.  Aceste variabile pot conţine o singură valoare. Tipurile
 Aceasta face parte din pachetul DBMS_OUTPUT pus principale corespund celor care se pot asocia coloanelor unei
tabele Oracle.
la dispoziţie de sistemul Oracle şi va fi utilizată şi în
capitolele următoare. Sintaxa este:  Compuse:
DBMS_OUTPUT.PUT_LINE(expresie)  Conţin mai multe valori, de exemplu o înregistrare (linie) din
rezultatul unei cereri SQL
 Procedura evaluează valoarea expresiei, o
 Referinţă:
converteşte la şir de caractere şi o tipăreşte.
 Conţin pointeri (referinţe) către alte elemente de program.
 Cum implicit SQL*Plus nu afişează mesajele tipărite Nu sunt tratate în acest curs (cu excepţia tipului REF
de server, pentru a le putea vedea opţiunea CURSOR)
SQL*PLUS serveroutput trebuie trecută pe ON prin  LOB (obiecte mari):
comanda:  Acestea conţin valori numite locatori (locators) care specifică
SQL> SET SERVEROUTPUT ON locaţia unor obiecte mari (imagini de exemplu).
F. Radulescu. Curs: Baze de date 13 F. Radulescu. Curs: Baze de date 14

DECLARARE VARIABILE EXEMPLE


Sintaxa unei declaraţii de variabile este:
Identificator [CONSTANT] tipdedate [NOT NULL]
[:= | DEFAULT expresie]
DECLARE
 Identificator - Numele variabilei. Se aplică aceleaşi reguli ca la v_nume VARCHAR2(10) := 'ION';
orice alt obiect SQL
 [CONSTANT] - Variabila nu-şi poate schimba valoarea.
v_datanasterii DATE;
Constantele trebuiesc iniţializate la declarare. v_cods NUMBER(2) NOT NULL := 21;
 Tipdedate - Tipul variabilei (un tip scalar, compus, referinţă
sau LOB). v_suma CONSTANT NUMBER := 100;
 [NOT NULL] - Variabila nu poate fi nulă. Aceste variabile
trebuiesc iniţializate la declarare.
 [:= expresie] - Iniţializare cu o expresie. Variabilele
neiniţializate conţin iniţial valoarea NULL.
 [DEFAULT expresie] - Valoare implicită dată de o expresie
(iniţializează variabila).

F. Radulescu. Curs: Baze de date 15 F. Radulescu. Curs: Baze de date 16

ATRIBUIRI TIPURI DE DATE


Sintaxa atribuirii este: Se pot folosi tipurile din SQL (cele
Identificator := expresie; pentru coloanele unei tabele)
Exemple: Pentru unele dintre acestea lungimea
v_nume := 'ION'; maxima admisibila este diferita in
v_datanasterii := '12-APR-89'; PL/SQL fata de SQL
v_data2 := to_date('14-04-79', Exista in PL/SQL si tipul BOOLEAN care
'DD-MM-YY'); lipseste in SQL
v_numar := v_n1 + v_n2 * 1230;

F. Radulescu. Curs: Baze de date 17 F. Radulescu. Curs: Baze de date 18

3
Florin Radulescu - Baze de date (note de curs)

DOMENIU DE VALABILITATE
ATRIBUTUL %TYPE
 Putem defini tipul unei variabile în funcţie de tipul
PENTRU NUME
altei variabile sau a unei coloane de tabelă folosind Un identificator definit într-un bloc este
construcţia:
Variabila%TYPE local acelui bloc şi global în toate
 sau subblocurile sale.
Tabela.Coloana%TYPE
 Exemplu: În cazul în care un subbloc redefineşte
DECLARE
v_numar NUMBER(5,2); un identificator, în subbloc poate fi
v_altnumar
v_nume
v_numar%TYPE;
stud.nume%TYPE;
folosit doar acesta din urmă.
 Notă: Dacă o variabilă este definită pe baza tipului
unei coloane de tip NOT NULL ea nu moşteneşte
acest atribut, putând conţine şi valoarea NULL.

F. Radulescu. Curs: Baze de date 19 F. Radulescu. Curs: Baze de date 20

EXEMPLU OPERATORI
DECLARE
a NUMBER; Operator Semnificaţie
b VARCHAR2(10); ** ridicare la putere
*, / înmulţire, împărţire
BEGIN +, -, || adunare, scădere, concatenare
DECLARE =, <, >, <=, >=, <>, !=, comparaţie
a VARCHAR2(20); ~=, ^=,IS NULL, LIKE,
BETWEEN, IN
c NUMBER; NOT negaţie logică
BEGIN AND ŞI logic
-- pot fi folositi a (VARCHAR2(20)), b si c OR SAU logic
END;
-- pot fi folositi a (NUMBER) si b
END;

F. Radulescu. Curs: Baze de date 21 F. Radulescu. Curs: Baze de date 22

EXPRESII LOGICE VALORI NULE


 În cazul unei expresii logice complexe evaluarea se opreşte în  Comparaţiile care implică o valoare nulă returnează
momentul în care valoarea expresiei este cunoscută. Exemplu: NULL.
DECLARE
a NUMBER;
 Negarea unei valori de NULL returnează NULL.
b NUMBER;  O condiţie care se evaluează la NULL e tratată ca
BEGIN FALSE.
. . .  În cazul expresiilor CASE (prezentate mai jos) nu se
if (a = 0) or ((b/a) < 1) then poate scrie WHEN NULL ci sintaxa este WHEN
. . . expresie IS NULL.
END IF;
 Un şir de caractere de lungime 0 este tratat de
. . .
PL/SQL ca o valoare de NULL.
END;
 În cazul în care variabila a are valoarea 0 expresia logică se  Operatorul de concatenare || ignoră valorile nule.
evaluează la TRUE şi nu se mai testează a doua parte a ei care  Operatorul IN (listă de valori) ignoră valorile nule din
ar genera o excepţie de tip ZERO_DIVIDE. listă
 Operatorul NOT IN (listă de valori) întoarce FALSE
dacă lista conţine o valoare nulă.
F. Radulescu. Curs: Baze de date 23 F. Radulescu. Curs: Baze de date 24

4
Florin Radulescu - Baze de date (note de curs)

EXPRESII CASE – FORMA 1 EXPRESII CASE – FORMA 2


DECLARE DECLARE
codjud VARCHAR2(2) := 'CJ';
codjudet VARCHAR2(2) := 'CJ'; numejud VARCHAR2(20);
numejudet VARCHAR2(20); BEGIN
BEGIN numejud := CASE
WHEN codjud = 'MM' THEN 'Maramures'
numejudet := CASE codjudet WHEN codjud ='CT' THEN 'Constanta'
WHEN 'MM' THEN 'Maramures' WHEN codjud ='CJ' THEN 'Cluj'
WHEN codjud LIKE 'A%' THEN ‘Incepe cu A'
WHEN 'CT' THEN 'Constanta'
WHEN codjud IS NULL THEN 'Cod judet NULL'
WHEN 'CJ' THEN 'Cluj' ELSE 'Alt judet'
ELSE 'Alt judet' END; END;
END;
END;
F. Radulescu. Curs: Baze de date 25 F. Radulescu. Curs: Baze de date 26

FUNCTII: SQL vs. PL/SQL DECIZIE


Funcţiile SQLCODE şi SQLERRM nu pot fi IF conditie1 THEN
folosite în cereri SQL.
instructiuni1;
Funcţiile DEREF, REF, VALUE, DECODE,
DUMP, GREATEST, LEAST şi VSIZE nu pot fi [ELSIF conditie2 THEN
folosite în instrucţiunile procedurale ale instructiuni2;]
PL/SQL (în documentaţia Oracle9 nu mai sunt
amintite în această categorie GREATEST şi . . . . . . . . . . .
LEAST). [ELSE
Funcţiile statistice şi analitice (ex: AVG, SUM,
COUNT, MIN, MAX, etc.) sunt specifice SQL şi instructiuni_else;]
nu pot fi folosite în instrucţiunile procedurale END IF;
ale PL/SQL.

F. Radulescu. Curs: Baze de date 27 F. Radulescu. Curs: Baze de date 28

EXEMPLU
DECLARE
v_nr number(2);
CICLURI: LOOP
BEGIN
SELECT cods
INTO v_nr
LOOP
FROM spec
WHERE domeniu='STIINTE EXACTE'; Instructiuni;
dbms_output.put_line('Numarul specializarii este: ‘ ||v_nr);
IF (v_nr=21) then EXIT [WHEN conditie]; --
dbms_output.put_line('Este 21');
ELSIF v_nr < 21 then
dbms_output.put_line('Mai mic decat 21');
iesire din ciclu
ELSE
dbms_output.put_line('Mai mare decat 21'); Instructiuni;
END IF;
EXCEPTION END LOOP;
WHEN no_data_found THEN
dbms_output.put_line('Nu exista');
WHEN too_many_rows THEN
dbms_output.put_line('Sunt mai multe');
WHEN others THEN
dbms_output.put_line('Eroare nespecificata');
END;

F. Radulescu. Curs: Baze de date 29 F. Radulescu. Curs: Baze de date 30

5
Florin Radulescu - Baze de date (note de curs)

LOOP: EXEMPLU
DECLARE
v_contor number(2) :=6;
v_dom varchar2(20);
v_cods number; v_nume varchar2(10); CICLURI: FOR
BEGIN
LOOP
BEGIN
SELECT cods, nume, domeniu
INTO v_cods, v_nume, v_dom FOR contor IN [REVERSE] val_init..val_fin LOOP
FROM spec
WHERE cods=v_contor; Instructiuni PL/SQL si cereri SQL;
dbms_output.put_line('Cod '|| v_contor|| ' nume '||v_nume||
' domeniu '||v_dom); END LOOP;
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('Nu exista codul '||
v_contor);
END; -- pentru subbloc
v_contor := v_contor + 5;
EXIT when v_contor > 40;
END LOOP;
EXCEPTION
WHEN others THEN
dbms_output.put_line('Exceptie');
END;

F. Radulescu. Curs: Baze de date 31 F. Radulescu. Curs: Baze de date 32

FOR: EXEMPLU CICLURI: WHILE


DECLARE
v_contor number(2); v_cods number; WHILE conditie LOOP
v_nume varchar2(10); v_dom varchar2(20);
BEGIN
Instructiuni PL/SQL si
FOR v_contor IN 20..25 LOOP cereri SQL;
BEGIN
SELECT cods, nume, domeniu
INTO v_cods, v_nume, v_dom
END LOOP;
FROM spec WHERE cods=v_contor;
dbms_output.put_line('Cod '|| v_contor||
' nume '||v_nume||' domeniu '||v_dom);
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('Nu exista codul '||
v_contor);
END; -- pentru subbloc
END LOOP;
END;

F. Radulescu. Curs: Baze de date 33 F. Radulescu. Curs: Baze de date 34

WHILE: EXEMPLU
DECLARE
v_contor number(2) :=6; v_cods number;
ALEGERE: CASE
v_nume varchar2(10); v_dom varchar2(20);
BEGIN
WHILE v_contor <=40 LOOP
CASE expresie
BEGIN
SELECT cods, nume, domeniu WHEN 'val1' THEN
INTO v_cods, v_nume, v_dom
FROM spec Instructiuni1;
WHERE cods=v_contor;
dbms_output.put_line('Cod '|| v_contor||
' nume '||v_nume||' domeniu '||v_dom);
WHEN 'val2' THEN
EXCEPTION
WHEN no_data_found THEN Instructiuni2;
dbms_output.put_line('Nu exista codul '||

END; -- pentru subbloc


v_contor); - - - - - - - -
v_contor := v_contor + 5;
END LOOP; [ELSE
EXCEPTION
WHEN others THEN Instructiuni_else;]
dbms_output.put_line('Exceptie');
END;
END CASE;
F. Radulescu. Curs: Baze de date 35 F. Radulescu. Curs: Baze de date 36

6
Florin Radulescu - Baze de date (note de curs)

EXCEPTIA CASE NOT FOUND


CASE: EXEMPLU  În cazul absenţei lui ELSE se adaugă implicit ridicarea unei
excepţii predefinite:
DECLARE ELSE RAISE CASE_NOT_FOUND;
v_dom varchar2(20);  Exemplu: domeniul pentru specializarea cu cod 21 (UMANIST)
BEGIN nu este printre etichetele CASE şi nu există ELSE:
SELECT domeniu . . . .
INTO v_dom SELECT domeniu
FROM spec INTO v_dom
WHERE cods=21; FROM spec
CASE v_dom WHERE cods=21;
WHEN 'UMANIST' THEN CASE v_dom
dbms_output.put_line('UMAN'); WHEN 'STIINTE EXACTE' THEN
WHEN 'STIINTE EXACTE' THEN dbms_output.put_line('EXACTE');
dbms_output.put_line(‘REAL'); END CASE;
ELSE . . . .
dbms_output.put_line('ALTCEVA'); va semnala excepţia: ORA-06592: CASE not found while executing
END CASE; CASE statement.
END;

F. Radulescu. Curs: Baze de date 37 F. Radulescu. Curs: Baze de date 38

VARIABILE COMPUSE INREGISTRARI


Pentru descrierea tipurilor compuse se poate  Înregistrările din PL/SQL sunt similare înregistrărilor
din limbajul Pascal sau structurilor din C. Sub un
folosi declaraţia de tip. Aceasta are acelaşi nume sunt înmagazinate mai multe valori de
următoarea formă: tipuri diferite care se numesc câmpuri.
TYPE denumire_tip descriere_tip;  Definirea unei înregistrări se poate face în două
moduri:
Cu ajutorul ei vom putea defini şi tipurile  Folosind o descriere a fiecărei componente a înregistrării. În
compuse care se pot folosi în PL/SQL: acest caz o variabilă de acest tip poate să nu fie asociată cu
o tabelă sau cu rezultatul unei cereri SQL.
 Înregistrare (RECORD)
 Folosind %ROWTYPE se poate defini o înregistrare
 Tablou asociativ (TABLE .. INDEX BY) compatibilă cu o linie a unei tabele sau cu o linie a
rezultatului unei cereri SQL.
 Tabelă (Nested TABLE)
 Tablou de dimensiune variabilă (VARRAY)

F. Radulescu. Curs: Baze de date 39 F. Radulescu. Curs: Baze de date 40

INREGISTRARI - DESCRIERE EXEMPLU


DECLARE
v_punctaj NUMBER(4);
Sintaxa: TYPE t_student IS RECORD
(matr NUMBER(4) NOT NULL := 1234,
TYPE denumire_tip IS RECORD nume stud.nume%type,
punctaj v_punctaj%type,
(nume_camp1 tip_camp [NOT NULL]
data DATE DEFAULT SYSDATE);
[:= | DEFAULT expresie] v_student t_student;
[, nume_camp2 ...]); BEGIN
Referirea unui câmp al unei variabile de tip v_student.matr := v_student.matr + 1;
v_student.nume := 'MARCEL';
înregistrare se face prin construcţia: v_student.punctaj := 1400;
nume_inregistrare.nume_camp . . .
END;

F. Radulescu. Curs: Baze de date 41 F. Radulescu. Curs: Baze de date 42

7
Florin Radulescu - Baze de date (note de curs)

%ROWTYPE EXCEPTII
 Sintaxa:  În cazul sistemelor de gestiune a bazelor de date
nume_variabila nume_tabela%ROWTYPE; erorile (dar nu numai) sunt numite şi excepţii.
 Exemplu:  Un bloc PL/SQL poate conţine între EXCEPTION şi
DECLARE END instrucţiuni care să trateze :
v_student stud%ROWTYPE;  erorile returnate de serverul Oracle sau uneltele
BEGIN Oracle
SELECT *
 situaţii definite de utilizator (excepţii definite de
INTO v_student
utilizator).
FROM stud WHERE matr=1456;
v_student.nume := 'MARCEL';  Excepţiile pot avea asociat un nume (identificator).
v_student.punctaj := 1400;  Unele dintre aceste nume sunt predefinite (pentru o
. . . parte dintre erorile returnate de server sau unelte).
END;

F. Radulescu. Curs: Baze de date 43 F. Radulescu. Curs: Baze de date 44

EXCEPTII – cont. EXCEPTII – CARACTERISTICI(1)


Apariţia unei excepţii este numită şi Apariţia unei excepţii, tratată sau nu, termină
ridicarea unei excepţii (exception execuţia blocului. Toate instrucţiunile PL/SQL
raising). sau cererile SQL care apar după cererea sau
instrucţiunea care a ridicat excepţia nu mai
În acest caz execuţia normală a blocului sunt executate.
este întreruptă şi se face tratarea În cazul în care o excepţie are asociat un
excepţiei: se sare în zona EXCEPTION tratament, la ridicarea ei se trece la execuţia
pentru execuţia instrucţiunilor asociate instrucţiunilor de tratare după care se iese din
acesteia. blocul curent fără eroare.

F. Radulescu. Curs: Baze de date 45 F. Radulescu. Curs: Baze de date 46

EXCEPTII – CARACTERISTICI(2) EXEMPLU


DECLARE
În cazul în care apare o excepţie care v_nume varchar2(10);
nu este tratată explicit în porţiunea BEGIN
dintre EXCEPTION şi END, blocul se SELECT nume INTO v_nume FROM stud
WHERE cods>20;
termină cu eroare, excepţia putând fi END;
tratată de blocul înconjurător (dacă  În cazul în care cererea SQL returnează mai mult
decât o singură înregistrare, valoarile rezultate nu pot
există). fi stocate într-o singură variabilă scalară. Numele
În cazul excepţiilor definite de utilizator predefinit al acestei exceptii este TOO_MANY_ROWS
 O altă eroare pentru blocul de mai sus este şi
acestea trebuiesc ridicate explicit în nereturnarea nici unei valori de către cererea SQL (în
zona dintre BEGIN şi EXCEPTION prin cazul în care nici o specializare nu are codul mai
mare ca 20). Numele predefinit al acestei exceptii
instrucţiunea PL/SQL RAISE. este NO_DATA_FOUND
F. Radulescu. Curs: Baze de date 47 F. Radulescu. Curs: Baze de date 48

8
Florin Radulescu - Baze de date (note de curs)

SINTAXA
EXEMPLU – cont. DECLARE
. . . .
DECLARE BEGIN
v_nume varchar2(10); . . . .
EXCEPTION
BEGIN
WHEN exceptie_11 OR exceptie_12 . . .THEN
SELECT nume INTO v_nume FROM stud instructiuni_1
WHERE cods>20; [WHEN exceptie_21 OR exceptie_22 . . . THEN
EXCEPTION instructiuni_2]
WHEN NO_DATA_FOUND THEN . . . . . .
[WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Nu exista date'); Instructiuni_others]
WHEN TOO_MANY_ROWS THEN END;
DBMS_OUTPUT.PUT_LINE('Mai multe linii'); unde:
WHEN OTHERS THEN  exceptie_xy: identificatorul unei excepţii
DBMS_OUTPUT.PUT_LINE('Alta exceptie');  instructiuni_x: instrucţiuni PL/SQL sau cereri SQL = TRATARE
EXCEPTIE
END;
 instructiuni_others Tratare orice alta exceptie.

F. Radulescu. Curs: Baze de date 49 F. Radulescu. Curs: Baze de date 50

OBSERVATII EXCEPTII - CATEGORII


WHEN OTHERS, dacă există, este Excepţii Oracle predefinite.
întotdeauna ultima. Excepţii Oracle care nu sunt
După tratatea excepţiei apărute se iese predefinite (non-predefinite)
din blocul curent. Excepţii definite de utilizator
În consecinţă este inutilă prezenţa
aceleiaşi excepţii pe mai mult de un
WHEN

F. Radulescu. Curs: Baze de date 51 F. Radulescu. Curs: Baze de date 52

PREDEFINITE PREDEFINITE (2)


ACCESS_INTO_NULL  PROGRAM_ERROR
CASE_NOT_FOUND  ROWTYPE_MISMATCH
COLLECTION_IS_NULL  SELF_IS_NULL
CURSOR_ALLREADY_OPEN  STORAGE_ERROR
DUP_VAL_ON_INDEX  SUBSCRIPT_BEYOND_COUNT
INVALID_CURSOR  SUBSCRIPT_BEYOND_LIMIT
INVALID_NUMBER  SYS_INVALID_ROWID
 TIMEOUT_ON_RESOURCE
LOGIN_DENIED
 TOO_MANY_ROWS
NO_DATA_FOUND
 VALUE_ERROR
NOT_LOGGED_ON
 ZERO_DIVIDE

F. Radulescu. Curs: Baze de date 53 F. Radulescu. Curs: Baze de date 54

9
Florin Radulescu - Baze de date (note de curs)

PREDEFINITE – cont. PREDEFINITE - SINTEZA


Excepţiile predefinite au deja un NU se declară în zona DECLARE
identificator asociat. NU trebuiesc ridicate explicit prin RAISE
Ele sunt ridicate automat la apariţie de Se tratează în zona EXCEPTION
către serverul Oracle sau uneltele
Oracle.
Exemplul anterior continea tratarea
pentru doua erori predefinite

F. Radulescu. Curs: Baze de date 55 F. Radulescu. Curs: Baze de date 56

NON-PREDEFINITE EXEMPLU
DECLARE
Reprezintă alte erori returnate de v_nume VARCHAR2(10);
Oracle, în afara celor predefinite. v_numar NUMBER;
eroare_grupare EXCEPTION;
Aceste erori se pot trata în două PRAGMA EXCEPTION_INIT(eroare_grupare, -979);
BEGIN
moduri: SELECT NUME, COUNT(*) INTO v_nume, v_numar
FROM STUD GROUP BY CODS;
 Prin folosirea lui WHEN OTHERS EXCEPTION
 Prin declararea excepţiei (i se dă un nume) WHEN eroare_grupare THEN
DBMS_OUTPUT.PUT_LINE('Eroare grupare');
şi asocierea unui cod de eroare Oracle în WHEN OTHERS THEN
zona DECLARE şi tratarea ei în zona DBMS_OUTPUT.PUT_LINE('Alta exceptie');
END;
EXCEPTION.
F. Radulescu. Curs: Baze de date 57 F. Radulescu. Curs: Baze de date 58

NON-PREDEFINITE - SINTEZA EXCEPTII UTILIZATOR


Se declară în zona DECLARE şi se Un program PL/SQL poate conţine
asociază un cod de eroare excepţii definite de utilizator.
NU trebuiesc ridicate explicit prin RAISE În cazul când programul detectează o
situaţie anormală el poate trece în zona
Se tratează în zona EXCEPTION de excepţii prin instrucţiunea PL/SQL
RAISE nume_exceptie
Astfel de excepţii trebuiesc:
 Declarate explicit
 Ridicate explicit
F. Radulescu. Curs: Baze de date 59 F. Radulescu. Curs: Baze de date 60

10
Florin Radulescu - Baze de date (note de curs)

EXCEPTII UTILIZATOR -
EXEMPLU
DECLARE
SINTEZA
prea_putini EXCEPTION; v_nrstud NUMBER;
BEGIN Se declară în zona DECLARE (ca nume)
SELECT count(*)
INTO v_nrstud Se ridică explicit cu RAISE
FROM stud WHERE cods=21;
IF (v_nrstud < 5) THEN Se tratează în zona EXCEPTION
RAISE prea_putini;
END IF;
EXCEPTION
WHEN prea_putini THEN
DBMS_OUTPUT.PUT_LINE(‘< 5 studenti');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Alta exceptie');
END;

F. Radulescu. Curs: Baze de date 61 F. Radulescu. Curs: Baze de date 62

SQLCODE SI SQLERRM CODURI RETURNATE


 În cazul în care dorim ca în zona EXCEPTION ..
WHEN OTHERS să identificăm ce eroare a apărut
putem folosi două funcţii care întorc codul numeric Valoare SQLCODE Descriere
respectiv mesajul text al erorii respective. 0 Nu a apărut nici o excepţie
 În funcţie de valoarea lor putem să tratăm diferenţiat
diferite erori netratate anterior în blocul respectiv. 1 A apărut o excepţie definită de utilizator
 Cele două funcţii sunt: 100 A apărut excepţia NO_DATA_FOUND
 SQLCODE - întoarce codul numeric al excepţiei
(erorii returnate)
Număr negativ Cod eroare returnat de serverul Oracle
 SQLERRM - întoarce mesajul text asociat cu acea
excepţie

F. Radulescu. Curs: Baze de date 63 F. Radulescu. Curs: Baze de date 64

EXEMPLU DOMENIU VALABILITATE


DECLARE  Ca si in cazul tuturor numelor:
DECLARE
V_cod NUMBER; exceptia1 EXCEPTION; -
v_text VARCHAR2(255); BEGIN
BEGIN DECLARE -- incepe un subbloc
exceptia1 EXCEPTION; -- diferita de exceptia1 anterioara
. . . . . BEGIN
EXCEPTION ...
WHEN OTHERS THEN IF ... THEN
RAISE exceptia1; -- nu e tratata de bloc
ROLLBACK; -- fiind redefinita in subbloc
v_cod := SQLCODE; END IF;
END; -- sfarsit subbloc
v_text := SQLERRM; EXCEPTION
INSERT INTO ERORI VALUES(v_cod, v_text); WHEN exceptia1 THEN -- nu trateaza exceptia din subbloc
END; ...
END;

F. Radulescu. Curs: Baze de date 65 F. Radulescu. Curs: Baze de date 66

11
Florin Radulescu - Baze de date (note de curs)

RAISE_APPLICATION_ERROR EXEMPLU
Excepţiile de acest tip sunt similare erorilor DECLARE
Oracle non-predefinite dar trebuiesc ridicate v_suma NUMBER; suma_nula EXCEPTION;
PRAGMA EXCEPTION_INIT(suma_nula, -20021);
explicit în zona executabilă sau în zona de BEGIN
excepţii folosind: SELECT suma INTO v_suma
RAISE_APPLICATION_ERROR(cod_eroare, FROM bursa WHERE pmin < 100;
text_eroare) IF v_suma IS NULL THEN
unde: RAISE_APPLICATION_ERROR(-20021,
'Suma este nula');
 cod_eroare este un număr ales de utilizator între -
20000 şi -20999 END IF;
EXCEPTION
 text_eroare este un text ales de utilizator WHEN suma_nula THEN
Şi la aceste excepţii se poate folosi PRAGMA dbms_output.put_line(SQLERRM);
EXCEPTION_INIT pentru a le asigna un END;
nume.
F. Radulescu. Curs: Baze de date 67 F. Radulescu. Curs: Baze de date 68

ALT EXEMPLU RETRATARE EXCEPTII


DECLARE
v_suma NUMBER; v_coderoare NUMBER;
În cazul în care se doreşte tratarea unei
BEGIN excepţii apărute într-un subbloc atât în acesta
SELECT suma INTO v_suma cât şi în blocul înconjurător, se procedează în
FROM bursa WHERE pmin < 100;
IF v_suma IS NULL THEN modul următor:
RAISE_APPLICATION_ERROR(-20021,  Se prevede tratarea excepţiei respective în zona
'Suma este nula');
END IF;
EXCEPTIONS a subblocului.
EXCEPTION  La sfârşitul secvenţei de instrucţiuni care tratează
WHEN OTHERS THEN excepţia se plasează instrucţiunea RAISE fără
v_coderoare := SQLCODE; parametri. Ea ridică excepţia curentă pentru blocul
IF (v_coderoare = -20021) THEN
dbms_output.put_line(SQLERRM);
înconjurător.
END IF;  Se prevede tratarea excepţiei respective în zona
END; EXCEPTIONS a blocului.

F. Radulescu. Curs: Baze de date 69 F. Radulescu. Curs: Baze de date 70

EXEMPLU OBSERVATIE
DECLARE
exceptia1 EXCEPTION;
BEGIN
Exceptiile aparute:
DECLARE -- incepe un subbloc
BEGIN  In zona de declaratii
...
IF ... THEN  In zona de tratare a exceptiilor
RAISE exceptia1;
END IF;
EXCEPTION -- tratare exceptii subbloc Nu se pot trata in blocul in care au aparut
WHEN exceptia1 THEN
-- instructiuni tratare in subbloc
. . . .
ci in zona de exceptii a blocului
RAISE;
END; -- sfarsit subbloc
inconjurator
EXCEPTION
WHEN exceptia1 THEN -- retratare exceptia1 in bloc
...
END;

F. Radulescu. Curs: Baze de date 71 F. Radulescu. Curs: Baze de date 72

12
Florin Radulescu - Baze de date (note de curs)

CURSORI FOLOSIRE (1)


Pentru execuţia cererilor SQL prezente În zona de declaraţii se defineşte cursorul
(nume, cerere SQL asociată).
în blocurile PL/SQL şi pentru stocarea
În zona executabilă (dupa BEGIN, deci
rezultatelor acestora Oracle foloseşte un inclusiv în zona de tratare a excepţiilor) se
spaţiu de lucru accesibil utilizatorului pot folosi instrucţiunile de lucru cu un cursor:
prin intermediul unui obiect numit OPEN, FETCH şi CLOSE.
cursor. Pentru orice tip de cursor se pot folosi
metodele asociate acestora:
Acesta poate fi de exemplu folosit  %ISOPEN,
pentru a parcurge linie cu linie  %NOTFOUND,
rezultatul şi pentru a afla câte linii are  %FOUND şi
acesta.  %ROWCOUNT

F. Radulescu. Curs: Baze de date 73 F. Radulescu. Curs: Baze de date 74

FOLOSIRE (2) FOLOSIRE (3)


Declararea cursorului Încărcarea liniei curente
DECLARE FETCH nume_cursor INTO lista_variabile |
variabila_inregistrare
CURSOR nume_cursor IS cerere_select;
Se încarcă linia curentă într-o mulţime de
Deschiderea cursorului
variabile sau o singură variabilă înregistrare
OPEN nume_cursor;
(având mai multe câmpuri).
 se execută cererea SQL asociată cursorului.
 se aduce în zona de memorie a acestuia rezultatul
Corespondenţa este poziţională
cererii (o tabelă rezultat). Se incrementează indicatorul liniei curente.
 se setează înregistrarea (linia) curentă la prima linie. Dacă nu s-a putut încărca o linie (mai sunt
linii în rezultat) %FOUND întoarce FALSE.
F. Radulescu. Curs: Baze de date 75 F. Radulescu. Curs: Baze de date 76

FOLOSIRE (4) ATRIBUTE CURSOR


 În cazul în care încărcarea se face într-o listă de  Atributele cursorului pot fi consultate după ce s-a
variabile trebuie ca: făcut primul FETCH şi ele au următoarele valori:
 numărul de variabile din listă să fie acelaşi cu numărul de  nume_cursor%ROWCOUNT: numărul de linii
coloane din rezultatul cererii SELECT încărcate cu FETCH de la deschiderea cursorului.
 tipurile variabilelor din listă să fie aceleaşi cu tipurile
coloanelor din rezultatul cererii SELECT  nume_cursor%FOUND: TRUE dacă ultimul FETCH a
încărcat o nouă linie şi FALSE altfel.
 În cazul în care încărcarea se face într-o variabilă
înregistrare trebuie ca:  nume_cursor%NOTFOUND: TRUE dacă ultimul
 numărul de câmpuri al variabilei să fie acelaşi cu numărul de FETCH nu a încărcat o nouă linie şi FALSE altfel.
coloane din rezultatul cererii SELECT  nume_cursor%ISOPEN: TRUE dacă acel cursor e
 tipurile câmpurilor variabilei să fie aceleaşi cu tipurile deschis şi FALSE altfel
coloanelor din rezultatul cererii SELECT
 Se poate defini o variabilă de acelaşi tip cu liniile rezultatului
folosind construcţia nume_cursor%rowtype.

F. Radulescu. Curs: Baze de date 77 F. Radulescu. Curs: Baze de date 78

13
Florin Radulescu - Baze de date (note de curs)

EXEMPLU CICLURI FOR PENTRU CURSORI


DECLARE  Pentru a uşura parcurgerea liniilor tabelei rezultat asociată
CURSOR studenti IS SELECT * FROM STUD WHERE CODS = 21; unui cursor deschis în PL/SQL există un ciclu FOR special:
v_stud studenti%rowtype;
BEGIN FOR nume_inregistrare IN nume_cursor LOOP
-- deschidere cursor instructiuni;
OPEN studenti;
LOOP
END LOOP
-- incarcarea liniei curente  Variabila înregistrare nu trebuie definită de utilizator, acest
FETCH studenti INTO v_stud; lucru făcându-se automat.
-- iesire cand nu mai sunt linii  Domeniul de valabilitate al acestei variabile este corpul
EXIT WHEN studenti%notfound;
dbms_output.put_line(studenti%rowcount||
ciclului.
' Student: '||v_stud.nume);  OPEN, FETCH şi CLOSE se execută automat
END LOOP;  Se execută câte un pas al ciclului pentru fiecare linie a
-- inchidere cursor rezultatului
CLOSE studenti;
END;  Ieşirea din ciclu se face automat la terminarea liniilor.

F. Radulescu. Curs: Baze de date 79 F. Radulescu. Curs: Baze de date 80

CURSORI CU PARAMETRI
EXEMPLU DECLARE
CURSOR studenti (v_cods number :=21,
-- fara OPEN, FETCH, declarare v_stud v_loc varchar2:='BUCURESTI') IS
DECLARE SELECT nume FROM stud
WHERE cods = v_cods and loc = v_loc;
CURSOR studenti IS i number;
BEGIN
SELECT * FROM STUD WHERE CODS = 21; FOR i IN 1..5 LOOP -- cod specializare = i*5+1
BEGIN dbms_output.put_line('Specializarea ' || (i*5+1));
FOR v_stud in studenti((i*5+1), 'PLOIESTI') LOOP
FOR v_stud IN studenti LOOP dbms_output.put_line(studenti%rowcount||
dbms_output.put_line(studenti%rowcount|| ' Student: '||v_stud.nume);
END LOOP; -- inchide automat cursorul
' Student: '||v_stud.nume); END LOOP; -- ciclul FOR i in 1..5
END LOOP; -- nu e necesar CLOSE dbms_output.put_line('Cu parametrii impliciti');
FOR v_stud IN studenti LOOP
END; dbms_output.put_line(studenti%rowcount||
' Student: '||v_stud.nume);
END LOOP; -- inchide automat cursorul
END;

F. Radulescu. Curs: Baze de date 81 F. Radulescu. Curs: Baze de date 82

WHERE CURRENT OF
DECLARE
CURSOR c_stud IS select nume, loc
from stud FOR UPDATE; -- blocheaza liniile
-- selectate
v_nume stud.nume%type; v_loc stud.loc%type;
v_nr number;
BEGIN
OPEN c_stud; v_nr := 0;
LOOP
FETCH c_stud INTO v_nume, v_loc;
EXIT WHEN c_stud%notfound;
dbms_output.put_line(v_nume||' '||v_loc); Starsit
UPDATE stud1
SET punctaj = punctaj * 1.1
WHERE CURRENT OF c_stud; -- linia din tabela din care
provine
-- linia curenta a cursorului
v_nr := v_nr + 1;
END LOOP;
COMMIT;
F. Radulescu. Curs: Baze de date 83 F. Radulescu. Curs: Baze de date 84

14
Florin Radulescu - Baze de date (note de curs)

STUD
SQL-10 MATR NUME AN GRUPA DATAN LOC TUTOR PUNCTAJ CODS
---- ------- -- ------ --------- ---------- ----- ------- ----
1456 GEORGE 4 1141A 12-MAR-82 BUCURESTI 2890 11
1325 VASILE 2 1122A 05-OCT-84 PITESTI 1456 390 11
1645 MARIA 3 1131B 17-JUN-83 PLOIESTI 1400 11
3145 ION 1 2112B 24-JAN-85 PLOIESTI 3251 1670 21

PROCEDURI, FUNCTII, 2146


3251
2215
STANCA
ALEX
ELENA
4 2141A 15-MAY-82 BUCURESTI
5 2153B 07-NOV-81 BRASOV
2 2122A 29-AUG-84 BUCURESTI 2146
620
1570
890
21
21
21

PACHETE, 4311
3514
1925
ADRIAN
FLOREA
OANA
3 2431A 31-JUL-83 BUCURESTI
5 2452B 03-FEB-81 BRASOV
2 2421A 20-DEC-84 BUCURESTI 4311
450
3230
760
24
24
24

DECLANSATORI 2101
4705
MARIUS
VOICU
1 2412B 02-SEP-85 PITESTI
2 2421B 19-APR-84 BRASOV
3514
4311
310
1290
24
24

F. Radulescu. Curs: Baze de date 1 F. Radulescu. Curs: Baze de date 2

SPEC si BURSA PL/SQL


CODS NUME DOMENIU
----- ---------- --------------- In mod Clasic se scriu folosind PL/SQL
11 MATEMATICA STIINTE EXACTE
21 GEOGRAFIE UMANIST
PL/SQL (Procedural Language/SQL)
24 ISTORIE UMANIST este o extensie procedurală a limbajului
SQL pentru SGBD Oracle (extensie
TIP PMIN PMAX SUMA
-------------------- ----- ----- -----
proprietară).
FARA BURSA 0 399 Apariţia sa este datorată faptului că
BURSA SOCIALA 400 899 100
limbajul SQL este un limbaj de cereri şi
BURSA DE STUDIU 900 1799 150
BURSA DE MERIT 1800 2499 200 nu un limbaj de programare
BURSA DE EXCEPTIE 2500 9999 300

F. Radulescu. Curs: Baze de date 3 F. Radulescu. Curs: Baze de date 4

PROGRAM = BLOC CE PUTEM SCRIE IN PL/SQL?


 Unitatea de execuţie este blocul care conţine: Blocuri anonime (Anonymous blocks)
 cereri SQL
 instrucţiuni PL/SQL.
Proceduri şi funcţii stocate (Stored
procedures/functions)
 Ele sunt executate astfel:
 Cererile SQL sunt trimise pentru a fi executate de serverul Proceduri şi funcţii folosite în aplicaţii
Oracle. Rezultatele acestora pot fi folosite apoi în (Application procedures/functions)
instrucţiunile PL/SQL.
 Instrucţiunile PL/SQL sunt executate de Executorul de Declanşatori ataşaţi bazei de date (Database
Instrucţiuni Procedurale (Procedural Statement triggers)
Executor) aflat în Motorul PL/SQL (PL/SQL Engine).
 Motorul PL/SQL este prezent în:
Declanşatori folosiţi în aplicaţii (Application
 Serverul Oracle
triggers)
 Unelte Oracle Pachete (Packaged procedures)

F. Radulescu. Curs: Baze de date 5 F. Radulescu. Curs: Baze de date 6

1
Florin Radulescu - Baze de date (note de curs)

CUM ARATA UN BLOC? EXEMPLU


DECLARE -- sau CREATE Pr/Fct DECLARE
v_nume VARCHAR2(10);
declaraţii de variabile, cursori, excepţii definite de BEGIN
utilizator SELECT NUME
INTO v_nume
BEGIN -- obligatoriu FROM SPEC
cereri SQL WHERE CODS=11;
DBMS_OUTPUT.PUT_LINE('Specializarea: '||
instrucţiuni PL/SQL v_nume);
EXCEPTION
EXCEPTION -- opţional
WHEN OTHERS THEN
acţiuni executate în caz de ridicare excepţii DBMS_OUTPUT.PUT_LINE('A aparut o
exceptie');
END; -- obligatoriu END;

F. Radulescu. Curs: Baze de date 7 F. Radulescu. Curs: Baze de date 8

PROCEDURI PROCEDURI – cont.


 Sintaxa declarării unei proceduri este:  [CREATE [OR REPLACE]] - arată că procedura se
[CREATE [OR REPLACE]] – pt. proceduri stocate defineşte ca obiect al bazei de date şi va fi stocată în
PROCEDURE nume_procedura[(parametru[, aceasta. Altfel ea este parte a unui bloc PL/SQL.
parametru]...)]  [AUTHID {DEFINER | CURRENT_USER}] -
[AUTHID {DEFINER | CURRENT_USER}] {IS | AS} specifică dacă o procedură stocată se execută cu
[PRAGMA AUTONOMOUS_TRANSACTION;] drepturile celui care a creat-o (valoare implicită) sau
[declaratii locale] ale utilizatorului curent.
BEGIN
 [PRAGMA AUTONOMOUS_TRANSACTION;] -
instructiuni executabile sau NULL;
dacă se specifică această caracteristică, execuţia
[EXCEPTION
procedurii suspendă tranzacţia curentă care se reia
tratare erori]
după terminarea execuţiei acesteia.
END [nume_procedura];

F. Radulescu. Curs: Baze de date 9 F. Radulescu. Curs: Baze de date 10

EXEMPLUL 1
PARAMETRI FORMALI CREATE OR REPLACE PROCEDURE SALUT IS
BEGIN
nume_parametru [IN | OUT [NOCOPY] | IN DBMS_OUTPUT.PUT_LINE(’SALUT’);
OUT [NOCOPY]] END SALUT;
numetip [{:= | DEFAULT} expresie]
Efect: se stocheaza procedura in baza de date, ca
 IN, OUT şi IN OUT arată că este vorba de un obiect persistent.
parametru de intrare, de ieşire sau bidirecţional
(default: IN). Poate fi folosit apoi in alte blocuri (cu sau fara
nume).
 În corpul unui subprogram nu se poate asigna o
valoare unui parametru transmis cu IN. Exemplu: folosirea intr-un bloc anonim (la promptul
SQL din SQL*Plus de exemplu):
 NOCOPY: În mod implicit parametrii de tip IN sunt
transmişi prin referinţă iar cei OUT şi IN OUT prin BEGIN
valoare. Se poate specifica în acest caz (OUT, IN
SALUT();
OUT) transmiterea prin referinţă folosind NOCOPY.
END;
 numetip este un nume de tip fără specificarea
dimensiunii (deci VARCHAR2 de exemplu şi nu
VARCHAR2(10).
F. Radulescu. Curs: Baze de date 11 F. Radulescu. Curs: Baze de date 12

2
Florin Radulescu - Baze de date (note de curs)

EXEMPLUL 2 EXEMPLUL 2 - utilizare


Marirea salariului cu un procent dat pentru angajatul Modul 1:
avand un empno dat:
BEGIN
create or replace procedure mareste_sal(idemp number,
procent number) MARESTE_SAL(1234, 20);
is END;
v_sal number;
Begin
select sal into v_sal Modul 2:
from emp
where emp.empno=idemp; EXEC MARESTE_SAL(1234, 20);
update emp
set salary=(v_sal+v_sal*procent*.01)
where emp.empno=ide;
end;
F. Radulescu. Curs: Baze de date 13 F. Radulescu. Curs: Baze de date 14

EXEMPLUL 2 – utilizare in PHP EXEMPLUL 3


Apelare: Procedura seteaza un parametru de tip out:
http://www.unserver.ro/script.php?empno=1234&procent=20
script.php contine: create or replace procedure nume_emp(idemp in
<?php emp.empno%type, nume out emp.ename%type)
// conectare is
$c = oci_connect("scott","tiger");
begin
$cerere = "begin mareste_sal($_REQUEST[“empno”],
$_REQUEST[“procent”]); end;"; select ename into nume
// atentie: nu trebuie uitat ; de dupa end! from emp
echo "<h2>Cererea este: $cerere</h2>";
//parse where emp.empno=idemp;
$stmt = oci_parse($c, $cerere); end;
// executie
oci_execute($stmt,OCI_DEFAULT);
?>

F. Radulescu. Curs: Baze de date 15 F. Radulescu. Curs: Baze de date 16

EXEMPLUL 4 – procedura bloc


EXEMPLUL 3 – afisari in PHP PROCEDURE alt_tutor (cod_stud INTEGER, nou_tutor INTEGER,
mesaj aut varchar2)
Apelare: http://www.unserver.ro/script.php?empno=1234
IS
script.php contine: tutor_actual number;
<?php fara_tutor EXCEPTION; este_el EXCEPTION;
// conectare BEGIN
$c = oci_connect("scott","tiger"); SELECT tutor INTO tutor_actual FROM stud
$cerere = “begin nume_emp($_REQUEST[“empno”], :nume); end;"; WHERE matr = cod_stud;
// in nume s-a pus numele pt cod 1234 IF nou_tutor=cod_stud THEN
echo "<h2>Cererea este: $cerere</h2>"; RAISE este_el;
//parse
ELSIF tutor_actual IS NULL THEN
$stmt = oci_parse($c, $cerere);
// bind
RAISE fara_tutor;
oci_bind_by_name($stmt, ":nume", $nume, 32); ELSE
// executie UPDATE stud1 SET tutor = nou_tutor
oci_execute($stmt,OCI_DEFAULT); WHERE matr = cod_stud;
echo $nume; mesaj := 'Actualizat '||cod_stud;
?> END IF;

F. Radulescu. Curs: Baze de date 17 F. Radulescu. Curs: Baze de date 18

3
Florin Radulescu - Baze de date (note de curs)

EXEMPLUL 4
EXCEPTION
WHEN NO_DATA_FOUND THEN
EXEMPLUL 4 - utilizare
mesaj := 'Nu exista studentul'; DECLARE
m varchar2(30);
WHEN fara_tutor THEN -- DEFINIRE PROCEDURA
mesaj := 'Nu are tutor'; PROCEDURE alt_tutor(. . .
WHEN este_el THEN . . .
mesaj := 'Nu isi poate fi tutor'; END alt_tutor;
BEGIN -- blocul principal
END alt_tutor; -- FOLOSIRE PROCEDURA
alt_tutor(1325, 1645, m);
In acest caz procedura nu se stocheaza in baza de dbms_output.put_line(m);
date. alt_tutor(1456, 1645, m);
dbms_output.put_line(m);
Este locala blocului si poate fi folosita doar in acest alt_tutor(1645, 1645, m);
context. dbms_output.put_line(m);
END;

F. Radulescu. Curs: Baze de date 19 F. Radulescu. Curs: Baze de date 20

EXEMPLUL 4 – rulare in PHP FUNCTII


Apelare: http://www.unserver.ro/script.php?empno=1234
script.php contine: Ca si procedurile, functiile pot fi:
<?php
 Functii stocate in baza de date, definite in afara
// conectare
$c = oci_connect("scott","tiger"); oricarui bloc (cu CREATE OR REPLACE)
$cerere = “aici tot blocul, inclusiv procedura, fara afisari";
echo "<h2>Cererea este: $cerere</h2>";
 Functii care sunt locale unui bloc de nivel
//parse superior, acestea nefiind stocate ci traind doar
$stmt = oci_parse($c, $cerere); pe timpul executiei blocului de care apartin.
// bind: aici mesajele se asociaza cu variabile php
// executie  Functiile stocate pot fi utilizate:
oci_execute($stmt,OCI_DEFAULT);
// echo variabilele de mai sus cu mesajele • In alte blocuri PL/SQL
?> • In cereri SQL (cu anumite restrictii)

F. Radulescu. Curs: Baze de date 21 F. Radulescu. Curs: Baze de date 22

Sintaxa Sintaxa
[CREATE [OR REPLACE ] ] –- FUNCTII STOCATE
FUNCTION nume_functie [ ( parametru [ ,
Elementele care apar şi la proceduri au
parametru ]... )] aceeaşi semnificaţie.
RETURN tip_date_returnate
[ AUTHID { DEFINER | CURRENT_USER } ]
În plus apare tipul valorii returnate care,
{IS | AS} ca şi parametrii formali, nu poate fi
[ PRAGMA AUTONOMOUS_TRANSACTION; ] constrâns prin specificarea unei dimensiuni
[declaratii locale]
BEGIN
maxime.
instructiuni executabile sau NULL; În zona executabilă trebuie să apară
[EXCEPTION
instrucţiunea RETURN expresie care
tratare erori]
END [nume_functie]; specifică valoarea returnată de funcţie.

F. Radulescu. Curs: Baze de date 23 F. Radulescu. Curs: Baze de date 24

4
Florin Radulescu - Baze de date (note de curs)

EXEMPLU
FUNCTION alt_tutor (cod_stud INTEGER, nou_tutor INTEGER)
RETURN VARCHAR2 IS
tutor_actual number;
FUNCTIE IN BLOC
fara_tutor EXCEPTION; este_el EXCEPTION; DECLARE
BEGIN
SELECT tutor INTO tutor_actual FROM stud -- DEFINIRE FUNCTIE
WHERE matr = cod_stud; FUNCTION alt_tutor (cod_stud INTEGER,
IF nou_tutor=cod_stud THEN
RAISE este_el; nou_tutor INTEGER) RETURN VARCHAR2 IS
ELSIF tutor_actual IS NULL THEN
RAISE fara_tutor;
. . . . .
ELSE END alt_tutor;
UPDATE stud1 SET tutor = nou_tutor
WHERE matr = cod_stud; BEGIN -- FOLOSIRE FUNCTIE
RETURN 'Actualizat '||cod_stud; dbms_output.put_line(alt_tutor(1325, 1645));
END IF;
EXCEPTION dbms_output.put_line(alt_tutor(1456, 1645));
WHEN NO_DATA_FOUND THEN dbms_output.put_line(alt_tutor(1645, 1645));
RETURN 'Nu exista studentul';
WHEN fara_tutor THEN END;
RETURN 'Nu are tutor';
WHEN este_el THEN
RETURN 'Nu isi poate fi tutor';
END alt_tutor;

F. Radulescu. Curs: Baze de date 25 F. Radulescu. Curs: Baze de date 26

Folosire in SQL EXEMPLU


CREATE OR REPLACE
 Pentru ca o funcţie stocată să fie apelabilă în cereri FUNCTION SPECIALIZAREA (cod_stud INTEGER)
SQL trebuie să respecte următoarele restricţii: RETURN VARCHAR2 IS
 Când este apelată într-o cerere SELECT funcţia nu trebuie să V_SPEC SPEC.NUME%TYPE;
modifice nimic în tabelele bazei de date. BEGIN
SELECT SPEC.NUME
 Când este apelată în INSERT, UPDATE sau DELETE funcţia INTO V_SPEC
nu poate regăsi sau modifica tabela actualizată de cererea FROM STUD, SPEC
SQL. WHERE STUD.CODS=SPEC.CODS AND
 Când este apelată din SELECT, INSERT, UPDATE sau STUD.MATR=cod_stud;
RETURN V_SPEC;
DELETE funcţia nu poate executa cereri de control pentru EXCEPTION
tranzacţii (ex.: COMMIT), cereri de control pentru sesiunea WHEN NO_DATA_FOUND THEN
de lucru (ex.: SET ROLE) sau cereri de control sistem (ca RETURN 'Nu exista studentul';
ALTER SYSTEM). De asemenea nu poate executa cereri care WHEN OTHERS THEN
se comit automat (ca de exemplu CREATE). RETURN 'Exceptie';
END SPECIALIZAREA;

F. Radulescu. Curs: Baze de date 27 F. Radulescu. Curs: Baze de date 28

FOLOSIRE (1) FOLOSIRE (2)


CERERE: CERERE:
SELECT NUME, SPECIALIZAREA(MATR) SELECT MATR, NUME, MATR+280, SPECIALIZAREA(MATR+280)
FROM STUD; FROM STUD
REZULTAT: REZULTAT:
NUME SPECIALIZAREA MATR NUME MATR+280 SPECIALIZAREA
---------- -------------------- ---------- ---------- ---------- -------------------
GEORGE MATEMATICA 1456 GEORGE 1736 Nu exista studentul
VASILE MATEMATICA 1325 VASILE 1605 Nu exista studentul
MARIA MATEMATICA 1645 MARIA 1925 ISTORIE
ION GEOGRAFIE 3145 ION 3425 Nu exista studentul
STANCA GEOGRAFIE 2146 STANCA 2426 Nu exista studentul
ALEX GEOGRAFIE 3251 ALEX 3531 Nu exista studentul
ELENA GEOGRAFIE 2215 ELENA 2495 Nu exista studentul
ADRIAN ISTORIE 4311 ADRIAN 4591 Nu exista studentul
FLOREA ISTORIE 3514 FLOREA 3794 Nu exista studentul
OANA ISTORIE 1925 OANA 2205 Nu exista studentul
MARIUS ISTORIE 2101 MARIUS 2381 Nu exista studentul
VOICU ISTORIE 4705 VOICU 4985 Nu exista studentul

F. Radulescu. Curs: Baze de date 29 F. Radulescu. Curs: Baze de date 30

5
Florin Radulescu - Baze de date (note de curs)

Mai mult despre parametri Mai mult despre parametri


Modul IN: Parametrul este un parametru de intrare. Specificarea unei valori implicite se face ca în
 Parametrul este transmis prin referinţă, deci se exemplul următor:
transmite o adresă a originalului.
FUNCTION marire_bursa(cod_stud
 Parametrul acţionează ca o constantă: în corpul
subprogramului acesta nu poate fi modificat (de INTEGER, suma REAL DEFAULT 100)
exemplu prin atribuire sau SELECT INTO), o astfel de RETURN VARCHAR2
operaţie ducând la erori de compilare. Modul IN este IS . . .
modul implicit de transmitere.
 La apelarea subprogramului parametrul actual poate În acest caz funcţia se poate chema cu 2
fi o constantă, un literal, o variabilă iniţializată sau o parametri actuali dar şi cu unul singur, în al
expresie. doilea caz al doilea având valoarea implicită 100:
 Spre deosebire de celelalte două moduri pentru marire_bursa(1645, 200)
aceşti parametri se pot defini valori implicite
(DEFAULT). marire_bursa(1645)

F. Radulescu. Curs: Baze de date 31 F. Radulescu. Curs: Baze de date 32

Mai mult despre parametri Mai mult despre parametri


 În cazul următor însă: Modul OUT: Parametrul este un parametru
FUNCTION marire_bursa(suma REAL DEFAULT de ieşire.
100, cod_stud INTEGER) RETURN VARCHAR2 Parametrul este transmis prin valoare, deci
IS . . . se transmite o copie a originalului.
 apelurile: Parametrul poate fi modificat în corpul
marire_bursa(1645) subprogramului.
marire_bursa(, 1645) La apelarea subprogramului parametrul
 semnalează eroare şi nu actualizează bursa
actual trebuie să fie o variabilă.
studentului cu matricola 1645. Varianta corecta este: La apelare acesta poate avea o valoare
marire_bursa(cod_stud=>1645) care se pierde însă la apel (în afara cazului
când se specifică NOCOPY).
F. Radulescu. Curs: Baze de date 33 F. Radulescu. Curs: Baze de date 34

Mai mult despre parametri Mai mult despre parametri


Modul OUT: continuare Modul IN OUT: Parametrul este un
 În momentul apelului parametrul este iniţializat cu
NULL. Din acest motiv tipul lui nu poate fi unul parametru de intrare şi de ieşire.
constrâns de NOT NULL (ex.: POSITIVEN, Parametrul este transmis prin valoare, deci
NATURALN)
 Parametrului nu i se poate asocia o valoare implicită
se transmite o copie a originalului.
(DEFAULT). Parametrul poate fi modificat în corpul
 În corpul subprogramului trebuie să i se asocieze o subprogramului.
valoare (altfel rămâne cu valoarea NULL).
 La ieşirea din subprogram PL/SQL asignează valoarea La apelarea subprogramului parametrul
respectivă (inclusiv NULL) parametrului actual. actual trebuie să fie o variabilă iniţializată
 Dacă subprogramul iese cu o excepţie netratată care se poate folosi în corpul
asignarea de mai sus nu este făcută.
subprogramului.
F. Radulescu. Curs: Baze de date 35 F. Radulescu. Curs: Baze de date 36

6
Florin Radulescu - Baze de date (note de curs)

Mai mult despre parametri DECLANSATORI


Modul IN OUT: continuare Execuţia unei proceduri, funcţii sau bloc PL/SQL
Parametrului nu i se poate asocia o valoare se poate declanşa automat la apariţia unui
eveniment dacă există un declanşator (în
implicită (DEFAULT). engleză trigger) asociat cu evenimentul
În corpul subprogramului parametrului i se respectiv.
poate asocia o valoare (altfel aceasta rămâne De exemplu orice modificare a punctajului unui
valoarea de la apel). student (folosind UPDATE) poate declanşa
La ieşirea din subprogram PL/SQL asignează automat inserarea unei linii într-o tabelă de
valoarea respectivă (inclusiv NULL) istoric unde este salvată vechea valoare a
punctajului.
parametrului actual.
Declansatorii uzuali sunt folositi impreuna cu
Daca subprogramul iese cu o excepţie netratată INSERT, UPDATE si DELETE.
asignarea de mai sus nu este făcută.
F. Radulescu. Curs: Baze de date 37 F. Radulescu. Curs: Baze de date 38

Sintaxa Exemplul 1 – la nivel de linie


CREATE [OR REPLACE] TRIGGER nume_trigger  Salvează într-o tabelă ISTORIC valorile punctajelor
{BEFORE | AFTER | INSTEAD OF} studenţilor atunci când coloana respectivă este
{DELETE | INSERT | UPDATE [OF col1 [, col2] actualizată:
...]}
[OR CREATE OR REPLACE TRIGGER scrie_istorie
{DELETE | INSERT | UPDATE [OF col3 [, col4] AFTER UPDATE OF punctaj ON stud
...]} FOR EACH ROW
] ...
ON nume_tabela
BEGIN
[ [REFERENCING { OLD [AS] old [NEW [AS] new] INSERT INTO ISTORIC
| NEW [AS] new [OLD [AS] old] } VALUES (:old.MATR, :old.punctaj,
] :new.punctaj);
[ FOR EACH ROW ]
[WHEN (conditie)] ]
END;
bloc_PL_SQL – aici este actiunea executata!

F. Radulescu. Curs: Baze de date 39 F. Radulescu. Curs: Baze de date 40

Exemplul 1 – la nivel de linie Exemplul 2 – la nivel de cerere


 Efectul unei actualizări a tabelei STUD asupra conţinutului
tabelei ISTORIC este următorul. Daca se ruleaza cererea: Inregistrează cine a modificat tabela
UPDATE STUD SPEC şi când (dar nu şi cum):
SET PUNCTAJ = PUNCTAJ + 100 CREATE OR REPLACE TRIGGER
WHERE CODS = 11; cine_modifica
 Si apoi se interogheaza tabela istoric:
SELECT * FROM ISTORIC; BEFORE INSERT OR DELETE OR UPDATE
 Se vad aceste linii adaugate: ON spec
MATR PVECHI PNOU BEGIN
----- ------ -----
INSERT INTO MODIF VALUES (USER,
1456 2890 2990
1325 390 490
SYSDATE);
1645 1400 1500 END;

F. Radulescu. Curs: Baze de date 41 F. Radulescu. Curs: Baze de date 42

7
Florin Radulescu - Baze de date (note de curs)

Declansatori Exemplu
 Declanşatorii se pot asocia nu numai cererilor DML ci şi altor tipuri de
cereri: cereri DDL, erori server Oracle, pornire şi oprire server (startup, CREATE OR REPLACE TRIGGER nusterg_spec
shutdown), etc.
 Exemplu de evenimente DDL care pot declansa un trigger: before drop or truncate
BEFORE / AFTER ALTER
BEFORE / AFTER CREATE
BEFORE / AFTER DROP
on schema
BEFORE / AFTER RENAME
BEFORE / AFTER ANALYZE WHEN (ora_dict_obj_name = 'SPEC' AND
BEFORE / AFTER ASSOCIATE STATISTICS
BEFORE / AFTER DISASSOCIATE STATISTICS ora_dict_obj_type = 'TABLE')
BEFORE / AFTER AUDIT
BEFORE / AFTER NOAUDIT BEGIN
BEFORE / AFTER COMMENT
BEFORE / AFTER DDL
BEFORE / AFTER GRANT RAISE_APPLICATION_ERROR(-20001,
BEFORE / AFTER REVOKE
BEFORE / AFTER TRUNCATE 'Protected : table SPEC');
AFTER SUSPEND
END;
F. Radulescu. Curs: Baze de date 43 F. Radulescu. Curs: Baze de date 44

Exemplu – cont. Declansatori


ora_dict_obj_name si ora_dict_obj_type sunt Observatie: nu se poate folosi COMMIT
atribute ale evenimentului care a declansat in interiorul unui trigger.
un trigger.
Un trigger FOR EACH ROW e parte a
Ele sunt disponibile in momentul declansarii si
pot fi folosite in corpul acestuia, ca in
unei tranzactii mai mari (in cazul in care
exemplul de mai sus. e asociat la un INSERT / UPDATE /
Pe langa cele 2 exista o multime de alte DELETE de exemplu).
atribute disponibile. Actiunea lui COMMIT ar fi prematura in
acest caz – sunt mai multe linii afectate

F. Radulescu. Curs: Baze de date 45 F. Radulescu. Curs: Baze de date 46

PACHETE Pasul 1
 Specificaţia unui pachet conţine declaraţiile publice
Mai multe proceduri şi/sau funcţii pot aferente acestuia, vizibile pentru aplicaţiile care îl folosesc.
forma un pachet (package).  Sintaxa simplificată a declarării specificaţiei este
următoarea:
Declararea unui pachet se face în două CREATE [OR REPLACE] PACKAGE nume_pachet
[AUTHID {CURRENT_USER | DEFINER}]
etape: {IS | AS}
[definitii tipuri pentru colectii si
 Declararea specificaţiei pachetului. inregistrari;
subtipuri]
 Declararea corpului său conţinând [declarare colectii, constante, exceptii,
implementarea procedurilor şi funcţiilor obiecte,
inregistrari, variabile si cursori]
componente. [declaratii functii si proceduri]
END [nume_pachet];

F. Radulescu. Curs: Baze de date 47 F. Radulescu. Curs: Baze de date 48

8
Florin Radulescu - Baze de date (note de curs)

Exemplu Pasul 2
CREATE OR REPLACE PACKAGE STD AS  Sintaxa simplificată a declarării implementării
(corpului) unui pachet este următoarea:
FUNCTION NUME (PMATR NUMBER) [CREATE [OR REPLACE] PACKAGE BODY nume_pachet
RETURN VARCHAR2; {IS | AS}
[definitii tipuri pentru colectii si
FUNCTION PUNCTE (PMATR NUMBER) inregistrari;
RETURN NUMBER; subtipuri]
[declarare colectii, constante, exceptii,
END STD; obiecte, inregistrari, variabile]
[definitie cursori]
Aici sunt 2 functii, dar pot fi un mix de [definitie functii si proceduri]
proceduri si functii [BEGIN
instructiuni
END [nume_pachet];]
F. Radulescu. Curs: Baze de date 49 F. Radulescu. Curs: Baze de date 50

Exemplu Utilizare
CREATE OR REPLACE PACKAGE BODY STD AS
FUNCTION NUME (  Folosirea subprogramelor care fac parte dintr-un
PMATR NUMBER) RETURN VARCHAR2 IS
V_NUME VARCHAR2(10);
pachet se face prin construcţia:
BEGIN nume_pachet.nume_subprogram([parametri_ac
SELECT NUME INTO V_NUME
FROM STUD tuali])
WHERE MATR=PMATR;
RETURN V_NUME;  Exemplu: Cererea următoare returnează numele
END NUME;
FUNCTION PUNCTE (
studentului, numele tutorului său şi punctajul
PMATR NUMBER) RETURN NUMBER IS acestuia:
V_PUNCTE NUMBER(4);
BEGIN SELECT NUME, STD.NUME(TUTOR) TUTOR,
SELECT PUNCTAJ INTO V_PUNCTE
FROM STUD STD.PUNCTE(TUTOR) PUNCTE
WHERE MATR=PMATR;
RETURN V_PUNCTE; FROM STUD;
END PUNCTE;
END STD;

F. Radulescu. Curs: Baze de date 51 F. Radulescu. Curs: Baze de date 52

Rezultat Alt exemplu – pasul 1


 Rezultatul conţine valori nule pentru studenţii care nu au un tutor:
NUME TUTOR PUNCTE Din documentatia Oracle
---------- ---------- ------ (http://docs.oracle.com/cd/B10501_01/appdev.920/a96624/09_pac
GEORGE ks.htm)
VASILE GEORGE 2890 CREATE OR REPLACE PACKAGE emp_actions AS -- spec
MARIA
// declaratii pachet
ION ALEX 1570
STANCA TYPE EmpRecTyp IS RECORD (emp_id INT, salary REAL);
ALEX CURSOR desc_salary RETURN EmpRecTyp;
ELENA STANCA 620 // continut pachet
ADRIAN PROCEDURE hire_employee ( ename VARCHAR2, job VARCHAR2,
FLOREA mgr NUMBER, sal NUMBER, comm NUMBER, deptno NUMBER);
OANA ADRIAN 450
PROCEDURE fire_employee (emp_id NUMBER);
MARIUS FLOREA 3230
VOICU ADRIAN 450 // gata
END emp_actions;

F. Radulescu. Curs: Baze de date 53 F. Radulescu. Curs: Baze de date 54

9
Florin Radulescu - Baze de date (note de curs)

Alt exemplu Pachete fara corp


CREATE OR REPLACE PACKAGE BODY emp_actions AS -- body
CURSOR desc_salary RETURN EmpRecTyp IS SELECT empno, Exista si pachete care contin doar
sal FROM emp ORDER BY sal DESC;
PROCEDURE hire_employee ( ename VARCHAR2, job VARCHAR2,
declaratii de date – ele nu au nevoie de
mgr NUMBER, sal NUMBER, comm NUMBER, deptno NUMBER)
IS
Pasul 2 – declaratia de “body”.
BEGIN
INSERT INTO emp VALUES (empno_seq.NEXTVAL, ename, job,
Ele definesc tipuri, constante, cariabile,
mgr, SYSDATE, sal, comm, deptno); exceptii care se pot folosi ca declaratii
END hire_employee;
PROCEDURE fire_employee (emp_id NUMBER) IS globale, utilizabile de subprograme sau
BEGIN
DELETE FROM emp WHERE empno = emp_id;
declansatori
END fire_employee;
END emp_actions;

F. Radulescu. Curs: Baze de date 55 F. Radulescu. Curs: Baze de date 56

Exemplu
Din aceeasi sursa (docs.oracle.com):
CREATE PACKAGE trans_data AS -- bodiless package
TYPE TimeRec IS RECORD (minutes SMALLINT, hours
SMALLINT);
TYPE TransRec IS RECORD ( category VARCHAR2,
account INT, amount REAL, time_of TimeRec); Starsit
minimum_balance CONSTANT REAL := 10.00;
number_processed INT;
insufficient_funds EXCEPTION;
END trans_data;

F. Radulescu. Curs: Baze de date 57 F. Radulescu. Curs: Baze de date 58

10

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