Sunteți pe pagina 1din 102

Baze de date

Note de curs

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Cuprins
1

INTRODUCERE......................................................................................................................................................5
1.1
CE ESTE O BAZA DE DATE...................................................................................................................................5
1.2
CUM SE STOCHEAZA INFORMATIA IN BAZA DE DATE..........................................................................................7
1.3
INSTALAREA BAZEI DE DATE...............................................................................................................................8
1.3.1
Instalare Oracle 9i, 10g.............................................................................................................................9
1.3.2
Verificarea instalrii bazei de date..........................................................................................................10
1.3.3
Dezinstalarea bazei Oracle. Exportul informatiilor din baza..................................................................11
1.3.3.1

1.4
2

Salvarea bazei de date:.........................................................................................................................................11

CE ESTE LIMBAJUL SQL...................................................................................................................................12

NOIUNI DE BAZ DESPRE PROIECTAREA BAZELOR DE DATE........................................................13


2.1
TERMENI DE TIUT DESPRE BAZELE DE DATE...................................................................................................13
2.2
CE REPREZINT O PROIECTARE BUN A UNEI BAZE DE DATE?..........................................................................14
2.3
PROCESUL DE PROIECTARE................................................................................................................................14
2.3.1
Determinarea scopului bazei de date.......................................................................................................15
2.3.2
Gsirea i organizarea informaiilor necesare........................................................................................15
2.3.3
mprirea informaiilor n tabele............................................................................................................17
2.3.4
Transformarea elementelor informaionale n coloane...........................................................................19
2.3.5
Specificarea cheilor primare....................................................................................................................21
2.3.6
Crearea relaiilor tabelelor......................................................................................................................23
2.3.7
Crearea unei relaii de tipul unul-la-mai-muli........................................................................................24
2.3.8
Crearea unei relaii mai-muli-la-mai-muli............................................................................................25
2.3.9
Crearea unei relaii de tipul unu-la-unu..................................................................................................27
2.3.10
Rafinarea proiectrii................................................................................................................................28
2.3.11
Rafinarea tabelului Produse....................................................................................................................29
2.3.12
Aplicarea regulilor de normalizare..........................................................................................................30
2.3.12.1
2.3.12.2
2.3.12.3

Prima form normal.......................................................................................................................................31


A doua form normal.....................................................................................................................................31
A treia form normal.....................................................................................................................................31

STRUCTURA ORGANIZATORIC A FACULTII. CREAREA BAZEI "STUD"...................................33


3.1
CREAREA CONTULUI UTILIZATOR N BAZA DE DATE.........................................................................................33
3.2
STRUCTURA ORGANIZATORIC A FACULTII...................................................................................................33
3.3
STRUCTURA TABELELOR...................................................................................................................................34
3.3.1
Analiza tabelelor din baza de date...........................................................................................................35
3.4
RAFINAREA BAZEI DE DATE..............................................................................................................................38
3.5
CREAREA TABELELOR N BAZA DE DATE...........................................................................................................39
3.6
TIPURI DE DATE DEFINITE N BAZA DE DATE.....................................................................................................40

CONSTRNGERI.................................................................................................................................................42
4.1
4.2
4.3
4.4
4.5
4.6

CONSTRNGERI DE TIP PRIMARY KEY (PK).....................................................................................................42


CONSTRNGERI DE UNICITATE (UK).................................................................................................................42
CONSTRNGERI DE TIP "NOT NULL" (NN).......................................................................................................43
CONSTRNGERI DE TIP "FOREIGN KEY"...........................................................................................................44
CONSTRNGERI DE TIP "CHECK".......................................................................................................................44
DEFINIREA CONSTRNGERILOR N BAZA DE DATE "STUD"...............................................................................44
Page 2 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

INTRODUCEREA DATELOR N TABELE.......................................................................................................46


5.1
5.2
5.3

SINTAXA COMENZII INSERT...............................................................................................................................46


VALOAREA NULL............................................................................................................................................46
INTRODUCEREA DATELOR N TABELE................................................................................................................47

EXTRAGEREA INFORMAIILOR DIN BAZA DE DATE............................................................................48


6.1
COMANDA SELECT.........................................................................................................................................48
6.1.1
Selectarea datelor dintr-un database link................................................................................................49
6.2
SELECTAREA INFORMAIILOR DIN MAI MULTE TABELE SIMULTAN....................................................................49
6.3
AFIAREA LINIILOR CE NU RESPECT CONDIIA DE LEGTUR N COMANDA SELECT.....................................51
6.4
CLAUZA WHERE. OPERATORI LOGICI................................................................................................................52
6.4.1
Operatori de comparaie..........................................................................................................................52
6.4.2
Operatori AND , OR, NOT.......................................................................................................................53
6.4.3
Operatorul "between"..............................................................................................................................55
6.4.4
Operatorul "in"........................................................................................................................................55
6.4.5
Operatorul "like"......................................................................................................................................55
6.4.6
Clauza distinct..........................................................................................................................................56
6.4.7
Operatorul "is null".................................................................................................................................57
6.5
CLAUZA ORDER BY.......................................................................................................................................58

FUNCII SQL........................................................................................................................................................60
7.1
FUNCII PENTRU PRELUCRAREA IRURILOR DE CARACTERE............................................................................60
7.2
FUNCII PENTRU VALORI NUMERICE................................................................................................................61
7.3
FUNCII PENTRU DATE CALENDARISTICE.........................................................................................................62
7.4
FUNCII PENTRU CONVERSIA TIPULUI DE DATE...............................................................................................63
7.4.1
Conversia datelor de tip "date" n iruri de caractere.............................................................................63
7.4.2
Conversia numerelor n iruri de caractere.............................................................................................64
7.4.3
Conversia datelor de tip text in format "date".........................................................................................65
7.4.4
Conversia textului in format numeric......................................................................................................66
7.5
FUNCIA DECODE...........................................................................................................................................66
7.6
FUNCII DE GRUP..............................................................................................................................................67
7.6.1
Functii matematice de grup.....................................................................................................................67
7.6.2
Clauza "group by"....................................................................................................................................69

SUBINTEROGRI................................................................................................................................................72
8.1
8.2
8.3
8.4

CONSTRUCTIA CLAUZEI "WHERE" PRIN SUBINTEROGARE.................................................................................72


COLOANE OBINUTE PRIN SUBINTEROGRI......................................................................................................73
TABELE INTERMEDIARE....................................................................................................................................74
VIZUALIZRI.....................................................................................................................................................75

INSTRUCIUNI DML..........................................................................................................................................77
9.1
COMANDA INSERT..........................................................................................................................................77
9.1.1
Folosirea funciilor pentru completarea valorilor de insert....................................................................78
9.1.2
Utilizarea subinterogrilor n comanda insert........................................................................................78
9.2
COMANDA UPDATE.........................................................................................................................................79
9.3
COMANDA DELETE.........................................................................................................................................79
9.3.1
Stergerea n cascad................................................................................................................................80

10

TRANZACII N BAZA DE DATE.................................................................................................................82


10.1 COMANDA ROLLBACK......................................................................................................................................82
10.2 COMANDA COMMIT..........................................................................................................................................82
10.2.1
Commit implicit........................................................................................................................................83
10.2.2
Comanda Savepoint.................................................................................................................................83
Page 3 of 102

Baze de date
Project no.
Document no.

11

BD 2011

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

PL/SQL................................................................................................................................................................85
11.1 STRUCTURA PROGRAMELOR PL/SQL...............................................................................................................85
11.2 FUNCIA DE CALCUL A MEDIEI PONDERATE......................................................................................................86
11.3 TRIGGERI...........................................................................................................................................................88
11.3.1
Completarea automat a coloanelor de tip PK.......................................................................................89
11.3.2
Verificarea notelor obinute de studeni...................................................................................................90

12

BIBLIOGRAFIE................................................................................................................................................92

13

ANEXE................................................................................................................................................................93
13.1 INSTRUCTIUNILE SQL PENTRU CREAREA OBIECTELOR N BAZA DE DATE........................................................93
13.1.1
Creare tabele............................................................................................................................................93
13.1.2
Introducerea date n baz.........................................................................................................................97
13.2 FRAZE SELECT N BAZA DE DATE....................................................................................................................101
13.2.1
Studenti-grupe-discipline-note...............................................................................................................101
13.3 CREARE USERI, IMPORT, EXPORT.....................................................................................................................102

Page 4 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

1 Introducere
Acest curs se vrea un ndrumar pentru cei care vor s se iniieze n domeniul bazelor de date, prezentnd
modul de stocare a datelor i principalele instruciuni de accesare a informaiilor stocate n baz. Este un
curs introductiv destinat n principal utilizatorilor bazelor de date, adic celor ce acceseaz baza pentru
obinerea de informaii utile, fr s cunoasc n mod obligatoriu cum a fost proiectat baza de date sau
alte tehnici de administrare a bazei. Se axeaz n principal pe instruciunile SQL (Structured Query
Language) cu care utilizatorul obinuit trebuie s lucreze pentru a introduce informaii n baz, s modifice
aceste informaii n timp i s scoat apoi rapoarte i analize complexe specifice domeniului de lucru.
Ca metod de lucru, pe parcursul cursului se va proiecta o baz de date minimal care s stocheze
informaiile specifice activitii dintr-o unitate de nvmnt superior: studenii nscrii n facultate, grupele
de care aparin, specializrile, disciplinele studiate i notele obinute. Fiecare cursant va trebui s treac
prin toate fazele necesare realizrii acestui sistem de stocare i administrare a datelor: crearea tabelelor,
introducerea datelor n tabele, modificarea datelor, selectarea i filtrarea datelor, realizarea de situaii
specifice activitii didactice.

Ce este o baz de date


Baza de date reprezint un sistem de stocare i gestionare a informaiei. Calculatorul s-a impus n toate
domeniile de activitate n primul rnd datorit capacitii sale extraordinare de administrare a informaiei.
Cum informaiile au devenit din ce n ce mai complexe i mai numeroase, a aprut necesitatea unui
program care s poat ine controlul attor date, s rspund la cererile mai multor utilizatori simultan, s
fac backup i s asigure consistena datelor.
De exemplu, pentru aplicaia pe care dorim s o dezvoltm, ar trebui s salvm pe disc cte un fiier care
s conin numele studenilor, un fiier pentru disciplinele parcurse de acetia, un fiier cu notele obinute
etc. Problema slvrii i citirii datelor din fiier trebuie s fie rezolvat de ctre programator care trebuie s
tie n orice moment poziia curent din fiier pentru studentul vizat. Programatorul trebuie s-i
implementeze o hart a stocrii informaiei, astfel nct s fie capabil n orice moment s gseasc
informaiile necesare unui student specificat. Acest task presupune un efort imens din partea
programatorului i este vulnerabil erorilor de programare. Problema se complic foarte mult dac sunt mai
muli utilizatori care acceseaz simultan informaia: un profesor ncarc notele de la examen, un alt profesor
trece absenele n catalog i muli ali studeni ncearc s vad ce note au obinut la ultimul examen.

Page 5 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Este mult mai simplu s utilizm un sistem de gestionare a informaiei care s primeasc toate datele
referitoare la activitatea didactic din facultate i apoi s ne dea informaia de care avem nevoie pentru un
student anume. Acest sistem este baza de date. Baza de date poate fi privit ca un container n care noi
introducem tot felul de piese electronice: rezistene, condensatori, circuite integrate de mrimi, culori i
valori diferite. Dupa ce-am introdus aceste piese, putem s cerem bazei de date s ne spun cte
rezistene de 100 de Ohm exist n container specificnd culoarea, tehnologia de fabricaie i productorul
pentru fiecare. Mai mult, piesele sunt descrcate simultan de mai muli lucrtori, n timp ce alii extrag
componente, alii fac inventarul pentru a determina ce piese sunt n cantitatea critic i trebuie fcute noi
comenzi de achiziie.
Alt exemplu ce justific necesitatea bazelor de date este dat de gestionarea activitii ntr-o ntreprindere.
Suntem ntr-o ntreprindere de cteva mii de angajai. Activitatea ntreprinderii este mprit pe diverse
servicii: aprovizionare, desfacere, ntreinere a echipamentelor, producie, serviciul financiar, contabilitate,
magazia, salarizare, personal , etc.
S lum magazia: aici trebuie inut evidena tuturor articolelor necesare n procesul de producie. Sunt
sute de mii de articole: de la articole mrunte de tip urub, pix, electrod sudur, la subansambluri,
semifabricate i produse finite destinate desfacerii. Fiecare articol poate proveni de la mai muli furnizori
avnd preuri i caliti diferite. Cnd se face o intrare n magazie a unui articol se completeaz un
document care merge la serviciul financiar ce ine evidena facturilor i a clienilor, documentul se conteaz
apoi la serviciul contabilitate ce ine evidena pe conturi de cheltuieli i aa mai departe. n orice moment
trebuie tiut situaia cantitativ i valoric a magaziei. Cei de la producie lanseaz n fabricaie un nou lot;
exist piesele necesare n magazie? La ce pre va rezulta noul produs innd cont c s-au utilizat uruburi
din loturi diferite i la preuri diferite? Care este valoarea articolelor din magazie? Care este situaia contului
de TVA? Cte produse sunt n magazie pentru desfacere? Aceste situaii trebuie date n condiiile n care
sunt mai multe magazii care suport tranzacii de intrare-ieire n mod permanent.
Soluia acestei probleme complexe este baza de date. O singur baz de date ce ruleaz pe server, toi
utilizatorii lucreaz simultan pe baz astfel nct s avem n orice moment situaia cumulat a tuturor
tranzaciilor. n orice moment persoanele din conducere pot vedea ce clieni au datorii mai mari de o limit
sau mai vechi de un anumit termen, situaia bncilor, situaia salariilor, cash-flow-ul, etc i pe baza acestor
informaii s ia decizii n cunostin de cauz.
Este clar ca astzi nu mai poate fi construit o aplicaie serioas care s nu aib n spate o baz de date.
De aceea, la orice interviu de angajare la o firma din domeniul informatic se cer cunotine minime de SQL
i baze de date.

Page 6 of 102

Baze de date
Project no.
Document no.

BD 2011

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Instalarea bazei de date


Primul pas n dezvoltarea aplicaiei este instalarea bazei de date n care s definim tabelele cu informaii.
Ce baz de date alegem? Sunt mai multe soluii, n funcie de numrul de utilizatori care lucreaz simultan
pe baz i de resursele financiare disponibile.
Dac banii reprezint un criteriu serios, atunci putem opta pentru baza Microsoft Acces care este inclus n
pachetul Microsoft Office la un pre rezonabil (totui baza Acces nu rezist la mai multe de 5-10 conexiuni
simultane, de aceea nici nu este considerat baz de date n adevaratul sens al cuvntului). Mai sunt
variantele free, care se pot utiliza n mod gratuit: MySQL, SQLite, SQLExpress, etc.
Totui, bazele de date ce se remarc prin stabilitate, capacitate de stocare, accesare simultan de ctre
mai muli useri, rapiditate n stocarea i selectia datelor sunt date de SQL Server sau Oracle.
SQL Server reprezint soluia propus de Microsoft pentru aplicaii cu baze de date i care este integrat cu
pachetul Microsoft Visual Studio .NET de construire a aplicaiilor.
Firma Oracle construiete motorul de baze de date de cteva zeci de ani i s-a impus ca lider mondial n
acest domeniu. Noi alegem serverul Oracle ca s putem beneficia de toate facilitile unei baze de date:
secvene, triggeri, constrngeri, funcii PL/SQL, proceduri stocate, instruciunea DECODE, etc.

1.2.1 Instalare Oracle 9i, 10g


Versiunea 9i a serverului Oracle Server include 3 CD-uri. Se introduce primul CD n unitate i se parcurge
toi paii programului de instalare dnd click pe butonul Next la toate ferestrele Wizard-ului de instalare.
Bineneles, nu poi scpa peste tot cu Next, undeva te ntreab cum se va chema baza de date pe care vrei
s-o construieti (noi punem "stud") , te mai ntreab parolele pentru utilizatorii "sys" i "system". Aici dai ce
parol vrei, dar e bine s nu intrai cu aceste parole n baz. Vom crea un utilizator "stud" cu parola "stud"
n schema cruia vom construi toate tabelele de care avem nevoie.
Daca totul merge OK , la sfritul instalrii vor aprea pe disc un folder "Oracle" i mai multe servicii cu
denumirea Oracle (programul "Services" din Settings/Control Panel/Administrative Tools/Services pentru
sistemul de operare Win XP). Dup cum ai presupus, baza de date lucreaz ca un serviciu Windows.
Serviciile Windows sunt programe care se lanseaz automat la pornirea calculatorului ( de aceea stm i
ateptm atta la pornire, Windows-ul are de pornit serviciile, la care am adugat i noi baza Oracle).
Dintre toate serviciile instalate de Oracle, ne intereseaz dou: "OracleServiceStud" dac am denumit baza
de date "stud" i "OracleOraHome92TNSListener". Primul este baza de date, al doilea este serviciul ce se
ocup de comunicaii (ascult la port comenzile ctre baz i le transmite mai departe la baza de date).

Page 7 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Baza Oracle ocup o bun parte din memoria RAM a calculatorului. De aceea, dac nu avem treab cu
baza la un moment dat, e bine s-o oprim ca s eliberm din resursele hardware ale calculatorului.
Cum oprim baza? Mergem n Services , click dreapta pe serviciul "OracleServiceStud" i selectm "Stop".
Problema e ca baza pornete din nou la urmtoarea startare a calculatorului. Ca s scpm de acest lucru,
mergem la acelai serviciu , click dreapta, i selectm "Properties". Selectm la opiunea "Startup Type"
valoarea "Manual". Din acest moment baza nu va porni dect atunci cnd mergem noi n Services i dm
"Start" pe acel serviciu. Bineneles, dac baza nu-i pornit, nu o putem utiliza.

1.2.2 Verificarea instalrii bazei de date


Primul lucru care-l facem dup instalarea bazei este s verificm funcionarea acesteia. Exist un program
n Start\Programs\Oracle-OraHome92\Enterprise Manager Console. Putem intra n acest program i s
gestionm baza de date. Ne ntreab un user i o parol unde introducem "system" cu parola
corespunzatoare.
Trebuie s ne obinuim c orice acces la baza de date se face prin parol. Baza conine informaii de
importan capital pentru instituia respectiv (ntreprindere, banc, ...). De aceea nu putem lsa pe oricine
s acceseze i s modifice informaia.
Chiar daca Enterprise Manager Console este un program agreabil, ce ne poart prin toat buctria bazei,
nu vom lucra cu acest program, tocmai c este prea puternic pentru noi i putem strica ceva n mod
ireversibil. Acest program este pentru administratorii bazelor de date, cei care se asigur ca baza s
funcioneze i rspund pentru acest task.
Pentru un utilizator obinuit al bazei de date, vom utiliza un editor de SQL prin care vom scrie comenzi ctre
baza de date. Un astfel de editor care vine cu baza este Start\Programs\Oracle-OraHome92\Application
development\SQL Plus. Ne ntreab iari user, parola i "Host String", adic numele bazei de date pe care
ne conectm. Evident, aici tastm "stud". Putem avea surpriza ca programul s ne ntoarc o eroare de
tipul "ERROR: TNS: could not resolve service name", adic nu a gsit baza pe care noi am vrut s ne
conectm. Si asta din diverse motive: nu am tastat corect numele bazei sau, nu am realizat corect legtura
la baza de date. Cnd lucrm pe acelai calculator n care este instalat baza, legtura se face automat i
este un fiier n "D:\oracle\ora92\network\admin\tnsnames.ora" care descrie aceast legtur:
STUD =
(DESCRIPTION =
(ADDRESS_LIST =
Page 8 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

(ADDRESS = (PROTOCOL = TCP)(HOST = lucian)(PORT = 1521))


)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = stud)
)
)
Dar cnd lucrm pe alt calculator i ne conectm la baza de pe calculatorul server prin Oracle Client trebuie
s avem grij ca fiierul tnsnames.ora de pe calculatorul local s aib definiia legturii corect. Fraza din
tnsnames.ora definete protocolul de comunicaie ntre client i baz (se foloseste TCP), numele
calculatorului server (HOST='....'), (aici se poate nlocui cu IP-ul acestuia sub forma: 192.161.2.3. Pentru a
afla IP-ul calculatorului intrai ntr-o fereastra cmd (start\run... : cmd) i dai comanda:"ipconfig").
SQL Plus nu reprezint o interfa grafic cu baza de date, este doar un editor text unde utilizatorul poate
scrie i executa comenzi SQL. Pentru o interfa mai agreabil putem utiliza programul SQL Navigator
produs de firma Quest Software. Acest program pune la dispoziie pe lng editorul de SQL i un Object
Navigator prin care putem vedea toate obiectele din baza de date, putem edita obiecte sau crea altele noi.

1.2.3 Dezinstalarea bazei Oracle. Exportul informaiilor din baz


Dac ceva s-a blocat la instalare, sau baza nu mai merge, sau efectiv vrem s facem curaenie pe
calculator, trebuie s dezinstalm baza Oracle i s-o instalm din nou. Atenie: la dezinstalare se pierde
toat informaia din baz. Cnd nu vrem s pierdem toate tabelele cu datele incluse, mai nti trebuie dat
un export la baz, s salvm ntr-un fiier coninutul acesteia.

1.2.3.1

Salvarea bazei de date

La instalarea serverului Oracle s-a instalat i un produs numit EXP n directorul " D:\oracle\ora92\bin" (dac
baza s-a instalat pe D). Programul EXP este utilizat pentru salvarea bazei Oracle ntr-un fiier. Se deschide
o fereastr Command Dos (Start/Run... cmd) i se introduce comanda:

exp

stud/stud@stud

file=c:\stud.dmp

log=c:\stud.log

grants=N

recordlength=8192

buffer=30000000

sau: exp bd1/bd1@stud file=bd1.dmp

Deci se export toate obiectele care in de user-ul stud (se intra cu parola "stud" pe baza "stud"). Fiierul
rezultat "stud.dmp" va fi pe discul C i fiierul de mesaje "stud.log" va fi salvat pe acelai disc.
Dup instalarea unei noi baze de date i crearea user-ului "stud" se pot importa informaiile din
baza veche cu comanda:

imp adm/adm@stud fromuser=adm touser=adm file=c:/adm.dmp log=c:/adm_imp.log grants=N


recordlength=8192 buffer=30000000 commit=y
Page 9 of 102

Baze de date
Project no.

BD 2011

Document no.

Pentru

dezinstalarea

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

bazei

Oracle

CR no.:

se

merge

pe

programul

Start/Programs/Oracle

Installation

Products/Universl Installer i se alege "Deinstall Products...". Dup ce se selecteaz toate produsele


pentru dezinstalare i se d comanda de dezinstalare ar trebui s fie curat pe disc. n realitate nu este aa,
directorul Oracle rmne n continuare pe disc, iar serviciile de asemenea.
Curaenia total se face dup ce intrm n regitri i stergem directoarele Oracle gsite acolo. Deci se intr
n regitrii Windows (Start/Run... i se tasteaz "regedit"). Intrm n editorul de regitri i cutm n folderul
"HKEY_LOCAL_MACHINE / SOFTWARE" directorul "ORACLE". Click dreapta pe acest director i dm
comanda delete. Mergem apoi n directorul "HKEY_LOCAL_MACHINE / SYSTEM / ControlSet001 /
Services" i tergem toate directoarele care ncep cu secvena "Oracle". n sfrit, mergem i n
"HKEY_LOCAL_MACHINE / SYSTEM / ControlSet002 / Services" unde facem aceeai curenie i putem
spune c am scpat de serviciile Oracle.
Atenie: nu modificai registrii Windows fr o bun nelegere a celor ce dorii sa schimbai,

orice

modificare greit aici poate duce la blocarea anumitor programe sau chiar a calculatorului. Singura
scpare este reinstalarea sistemului de operare Windows cu o formatare prealabil a discului, ceea ce
consum timp, resurse i pierdere de informaii.
Dup tergerea serviciilor Oracle din Registry putei terge n sfrit directorul ORACLE de pe disc.
Dac v d eroare "acces denied" dai restart la calculator, s-i reciteasc regitrii i s nu mai porneasc
serviciile Oracle.

Ce este limbajul SQL


SQL (Structured Query Language) este un limbaj prin care comunicm cu baza de date. Vrem s
introducem un student n tabela studeni: scriem o comand SQL care va fi neleas i executat de baz:

insert into studenti (nume) values ('Popescu Ionel').

Dac dorim s vedem studenii din baza de date, atunci trebuie s execut o alt instruciune SQL:

select nume_student from studenti;

Page 10 of 102

Baze de date
Project no.
Document no.

BD 2011

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Noiuni de baz despre proiectarea bazelor de date

O baz de date proiectat corespunztor furnizeaz acces la informaii precise, actualizate. Deoarece o
proiectare corect este esenial pentru atingerea scopurilor utilizrii unei baze de date, investiia n timpul
necesar nvrii principiilor unei bune proiectri este esenial. n cele din urm, vei reui s creai o baz
de date care s v ndeplineasc necesitile i care s poat fi modificat cu uurin.
Acest capitol furnizeaz indicaii pentru planificarea unei baze de date. Vei nva cum s decidei de ce
informaii avei nevoie, cum s mprii aceste informaii n tabele i coloane corespunztoare i cum s
facei ca aceste tabele s interacioneze ntre ele.

Termeni de tiut despre bazele de date


Oracle organizeaz informaiile n tabele: liste de rnduri i coloane ce amintesc de registrul unui contabil
sau de o foaie de lucru din Microsoft Office Excel. ntr-o baz de date simpl, se poate s avei doar un
singur tabel. Pentru cele mai multe baze de date va trebui s avei mai multe. De exemplu, se poate s
avei un tabel care stocheaz informaii despre produse, alt tabel care stocheaz informaii despre comenzi
i un altul cu informaii referitoare la clieni.

Figura 1: Organizarea datelor in tabele


Fiecare rnd se mai numete nregistrare i fiecare coloan, de asemenea, se mai numete cmp. O
nregistrare este o modalitate semnificativ i consistent de a combina anumite informaii. Un cmp este
Page 11 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

un element singular de informaie - un tip de element care apare n orice nregistrare. De exemplu, n
tabelul produse, fiecare rnd sau nregistrare ar conine informaii despre un produs. Fiecare coloan sau
cmp conine un anumit tip de informaie despre acest produs, cum ar fi numele sau preul.

Ce reprezint o proiectare bun a unei baze de date?


Anumite principii ghideaz procesul de proiectare al unei baze de date. Primul principiu este acela c
informaiile dublur (numite i date redundante) au o influen negativ, deoarece consum spaiu i
sporesc probabilitatea producerii de erori i inconsistene. Al doilea principiu l reprezint importana
corectitudinii i caracterului complet al informaiilor. Dac baza de date conine informaii incorecte, orice
rapoarte care extrag informaii din baza de date vor conine, de asemenea, informaii incorecte. Drept
urmare, orice decizie luat bazndu-v pe aceste rapoarte va fi greit informat.
O proiectare bun a unei baze de date respecta urmatoarele:

mparte informaiile n tabele pe baza subiectelor, pentru a reduce datele redundante.

Furnizeaz programului Oracle informaiile necesare pentru a asocia informaiile din tabele dup
necesiti.

Asist i asigur acurateea i integritatea informaiilor.

Adapteaz necesitile de procesare a datelor i cele de raportare.

Procesul de proiectare
Procesul de proiectare const n urmtorii pai:

Determinarea scopului bazei de date :


o

acesta ajut la pregtirea pailor rmai.

Gsirea i organizarea informaiilor necesare:


o

Adunarea tuturor tipurilor de informaii pe care le nregistrai n baza de date, cum ar fi


numele produsului i numrul comenzii.

mprirea informaiilor n tabele


o

mprirea elementelor de informaii n entiti sau subiecte majore cum ar fi Produse sau
Comenzi. Apoi, fiecare subiect devine un tabel.

Transformarea elementelor de informaii n coloane

Page 12 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Decidei ce informaii s stocai n fiecare tabel. Fiecare element devine un cmp care este
afiat sub form de coloan n tabel. De exemplu, un tabel Angajai poate include cmpuri,
cum ar fi Nume de familie i Data angajrii.

Specificarea cheilor primare


o

Alegei cheia primar pentru fiecare tabel. Cheia primar este o coloan care se utilizeaz
pentru a identifica n mod unic fiecare rnd. Un exemplu poate fi ID produs sau ID
comand.

Configurarea relaiilor din tabel


o

Privii fiecare tabel i decidei cum se asociaz datele dintr-un tabel cu datele din alte
tabele. Adugai cmpuri la tabele sau creai noi tabele pentru a clarifica relaiile, dup
necesiti.

Rafinarea proiectrii
o

Analizai proiectarea Pentru eliminarea erorilor. Creai tabele i adugai cteva nregistrri
de date eantion. Vedei dac reuii s obinei rezultatele dorite din tabele. Efectuai
ajustri ale proiectrii, dup necesitate

Aplicarea regulilor de normalizare


o

Aplicai regulile de normalizare a datelor pentru a vedea dac tabelele sunt corect
structurate. Efectuai ajustri pentru tabele, dup necessitate

2.3.1 Determinarea scopului bazei de date


Este o idee bun s v notai scopul bazei de date pe o hrtie - scopul acesteia, cum dorii s o utilizai i
cine o va utiliza. Pentru o baz de date mic pentru o afacere de familie, de exemplu, se poate nota ceva
simplu, cum ar fi "Baza de date a clienilor pstreaz o list a informaiilor despre clieni n scopul producerii
de liste de coresponden i de rapoarte." Dac baza de date este mai complex sau este utilizat de mai
multe persoane, cum se ntmpl de obicei ntr-o conjunctur corporativ, scopul se poate ntinde pe mai
multe paragrafe i trebuie s includ cnd i de ctre cine va fi utilizat baza de date. Ideea principal este
s se descrie riguros misiunea bazei de date, care s fie consultat n cadrul procesului de proiectare. O
astfel de instruciune v ajut s v concentrai asupra obiectivelor atunci cnd luai decizii.

2.3.2 Gsirea i organizarea informaiilor necesare


Pentru a gsi i organiza informaiile necesare, ncepei cu informaiile existente. De exemplu, se pot
nregistra comenzile de cumprare ntr-un registru sau se pot ine informaii despre clieni n formulare, ntrun dulap pentru dosare. Colectai aceste documente i trecei n list fiecare tip de informaii afiate (de
exemplu, fiecare caset completat dintr-un formular). Dac nu avei formulare existente, imaginai-v c
trebuie s proiectai un formular pentru a nregistra informaii despre clieni. Ce informaii ai dori s punei
n formular? Ce casete de completat ai crea? Identificai i trecei n list toate aceste elemente. De
Page 13 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

exemplu, s presupunem c n prezent inei lista de clieni pe fie indexate. Examinnd aceste fie vei
descoperi c fiecare fi conine numele, adresa, oraul, statul, codul potal i numrul de telefon ale unui
client. Fiecare dintre aceste elemente poate reprezenta o coloan din tabel.
Pe msur ce pregtii lista, nu v facei griji dac nu este perfect din prima ncercare. n schimb, trecei n
list fiecare element la care v gndii. Dac va utiliza i altcineva baza de date, cerei-i prerea. Lista se
poate mbunti ulterior.
Apoi, luai n considerare tipurile de rapoarte sau de liste potale pe care dorii s le obinei din baza de
date. De exemplu, se poate crea un raport de vnzri pentru un produs, care afieaz vnzrile n funcie
de regiune sau un raport de rezumare a inventarului, care afieaz nivelurile de inventar ale produselor. De
asemenea, se pot genera scrisori formale, care li se vor trimite clienilor pentru a i anuna de evenimente
sau de oferte speciale. Proiectai mintal raportul i imaginai-v cum ar arta. Ce informaii ai dori s punei
n raport? Trecei fiecare element n list. Facei acelai lucru pentru scrisoarea formal i pentru orice alt
raport pe care considerai c l vei crea.

Proiectarea mental a rapoartelor i a listelor potale pe care dorii s le creai v ajut la identificarea
elementelor de care vei avea nevoie n baza de date. De exemplu, s presupunem c le oferii clienilor
oportunitatea de a se abona (sau a se dezabona) la actualizri periodice prin pot electronic i c dorii
s imprimai o list a celor care s-au abonat. Pentru a nregistra acele informaii, adugai o coloan
Abonat la mesaje de pot electronic la tabelul pentru clieni. Pentru fiecare client, se poate seta cmpul
la Da sau la Nu.

Page 14 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Necesitatea de a le trimite mesaje de pot electronic clienilor sugereaz alt element de nregistrat. Dup
ce tii c un client dorete s primeasc mesaje de pot electronic, va trebui s aflai adresa de pot
electronic la care s le trimitei. Aadar, trebuie nregistrat o adres de pot electronic pentru fiecare
client.
Este logic s se construiasc un prototip al fiecrui raport sau listare de ieire i s se ia n considerare
elementele necesare pentru a produce raportul. De exemplu, cnd examinai o scrisoare formal, se poate
s v vin n minte alte idei. Pentru a include o formul introductiv corespunztoare de exemplu, irul
"Dl.", "Dna." sau "Dra." cu care ncepe o formul de salut, va trebui creat un element pentru introducere. De
asemenea, este mai bine s se nceap scrisorile cu Drag Dl. Georgescu, dect cu Drag Dl. Florin
Georgescu. Aadar, de obicei este mai bine s se stocheze numele de familie separat de prenume.
Trebuie s se in cont de faptul c informaiile trebuie desprite n cele mai mici pri utile. n cazul unui
nume, pentru ca numele de familie s fie uor disponibil, se va despri numele n dou pri Nume i
Prenume. Pentru a sorta un raport dup numele de familie, de exemplu, este util s se stocheze separat
numele de familie ale clienilor. n general, pentru a sorta, cuta, celula sau raporta n funcie de un element
informaional, trebuie pus acel element ntr-un cmp propriu.
Gndii-v la ntrebrile la care dorii s rspund baza de date. De exemplu, cte vnzri s-au finalizat
pentru produsul principal? Unde locuiesc cei mai importani clieni? Cine este furnizorul produsului care se
vinde cel mai bine? Anticiparea acestor ntrebri c ajut s v dai seama de elementele suplimentare care
trebuie nregistrate.
Dup ce colectai aceste informaii, suntei gata pentru pasul urmtor.

2.3.3 mprirea informaiilor n tabele


Pentru a mpri informaiile n tabele, alegei cele mai importante entiti sau subiecte. De exemplu, dup
ce gsii i organizai informaiile unei baze de date pentru vnzri de produse, lista preliminar poate
conine:

Page 15 of 102

Baze de date
Project no.
Document no.

BD 2011

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Entitile principale afiate aici sunt produsele, furnizorii, clienii i comenzile. Aadar, este logic s pornii
cu aceste patru tabele: unul pentru date despre produse, unul pentru date despre furnizori i unul pentru
date despre comenzi. Dei lista este incomplet, este un punct de pornire bun. Lista se poate rafina pn
cnd se ajunge la un proiect care funcioneaz bine.
Cnd examinai prima dat lista preliminar de elemente, vei fi tentat() s le plasai pe toate ntr-un singur
tabel, n locul celor patru afiate n imaginea precedent. Vei nva acum de ce nu este o idee bun. Luai
n considerare tabelul afiat aici:

n acest caz, fiecare rnd conine informaii att despre produs, ct i despre furnizorul lui. Deoarece se
poate ca multe produse s aib acelai furnizor, numele i informaiile furnizorului se repet de multe ori.
Acest lucru irosete spaiul de pe disc. nregistrarea informaiilor despre furnizor o singur dat, ntr-un
tabel separat denumit Furnizori, iar apoi legarea acelui tabel cu tabelul Produse, este o soluie mult mai
bun.
A doua problem a acestui proiect apare atunci cnd trebuie modificate informaiile despre furnizor. De
exemplu, s presupunem c trebuie schimbat adresa unui furnizor. Deoarece apare n multe locuri, se
Page 16 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

poate, n mod accidental, s modificai adresa ntr-un loc i s uitai s o modificai n celelalte. nregistrarea
adresei furnizorului ntr-un singur loc rezolv problema.
Cnd proiectai baza de date, ncercai s nregistrai fiecare informaie o singur dat. Dac se repet
aceeai informaie, cum ar fi adresa unui anumit furnizor, n mai multe locuri amplasai informaia ntr-un
tabel separat.
n final, s presupunem c exist un singur produs furnizat de Coho Winery i c dorii s tergei produsul,
dar s pstrai numele i informaiile furnizorului. Cum se poate terge nregistrarea produsului fr a pierde
informaiile despre furnizor? Este imposibil. Deoarece fiecare nregistrare conine date despre un produs,
ct i despre un furnizor, este imposibil s se tearg separat. Pentru a menine datele separate, trebuie
mprit tabelul n dou tabele: unul pentru informaii despre produse i cellalt pentru informaii despre
furnizori. tergerea nregistrrii unui produs ar trebui s tearg doar datele despre produs, nu i datele
despre furnizor.
Dup ce alegei subiectul reprezentat de un tabel, coloanele din acel tabel trebuie s stocheze numai datele
despre acel subiect. De exemplu, tabelul pentru produse trebuie s stocheze numai date despre produse.
Deoarece adresa unui furnizor este o informaie despre furnizor, i nu una despre produs, aparine de
tabelul pentru furnizori.

2.3.4 Transformarea elementelor informaionale n coloane


Pentru a stabili coloanele dintr-un tabel, decidei asupra informaiilor necesare pentru subiectul nregistrat n
tabel. De exemplu, pentru tabelul Clieni, Nume, Adres, Ora-CodPotal, Abonat la mesaje de pot
electronic, Formul introductiv i Adres de pot electronic reprezint o list de coloane bun, pentru
nceput. Fiecare nregistrare a tabelului conine acelai set de coloane, aadar se pot stoca informaiile din
cmpurile Nume, Adres, Ora-CodPotal, Abonat la mesaje de pot electronic, Formul introductiv i
Adres de pot electronic pentru fiecare nregistrare. De exemplu, coloana pentru adrese conine
adresele clienilor. Fiecare nregistrare conine date despre un client, iar cmpul pentru adres conine
adresa acelui client.
Dup ce stabilii setul iniial de coloane pentru fiecare tabel, avei posibilitatea s mbuntii coloanele. De
exemplu, este logic s se stocheze numele clienilor n dou coloane: prenume i nume de familie, pentru a
fi posibil sortarea, cutarea i indexarea pentru una singur dintre coloane. Similar, adresa este alctuit
din cinci componente separate, adres, ora, jude, cod potal i ar/regiune, i este logic s se stocheze
i acestea n coloane separate. Pentru a efectua o operaiune de cutare, filtrare sau sortare dup jude, de
exemplu, trebuie ca informaiile despre jude s se stocheze ntr-o coloan separat.

Page 17 of 102

Baze de date
Project no.
Document no.

BD 2011

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

De asemenea, trebuie s se tie dac informaiile coninute n baza de date au doar caracter intern sau i
internaional. De exemplu, dac planificai s stocai adrese internaionale, este mai bine s avei o coloan
Regiune n locul coloanei Jude, deoarece o astfel de coloan poate conine judee naionale sau alte
ri/regiuni. Asemntor, codul potal este mai bun dect codul Zip dac stocai adrese internaionale.
Urmtoarea list afieaz cteva sfaturi pentru stabilirea coloanelor.

Nu includei date calculate


n cele mai multe cazuri, nu trebuie stocate rezultatele unor calcule n tabele. n schimb, Oracle poate
efectua calculele atunci cnd dorii s vedei rezultatele. De exemplu, s presupunem c exist un
raport Produse comandate care afieaz subtotalul unitilor comandate, pentru fiecare categorie de
produse din baza de date. Cu toate acestea, nu exist o coloan Subtotal Uniti comandate n niciun
tabel. n schimb, tabelul Produse include o coloan Uniti comandate, care stocheaz unitile
comandate din fiecare produs. Utiliznd aceste date, Oracle calculeaz subtotalul de fiecare dat
cnd imprimai raportul. Subtotalul nu trebuie stocat ntr-un tabel.

Stocai cele mai mici pri logice din informaii.


Poate fi tentant s creai un singur cmp pentru nume complete, sau pentru numele produselor
mpreun cu descrierile produselor. Dac se combin mai multe tipuri de informaii ntr-un cmp, este
dificil s se regseasc ulterior date individuale. ncercai s desprii informaiile n pri logice; de
exemplu, creai cmpuri separate pentru prenume i pentru nume de familie, sau pentru numele
produselor i pentru categorii i descrieri.

Page 18 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Dup mbuntirea coloanelor de date din fiecare tabel, se poate alege cheia primar a fiecrui tabel.

2.3.5 Specificarea cheilor primare


Fiecare tabel ar trebui s includ o coloan sau un set de coloane care identific, n mod unic, fiecare rnd
stocat n tabel. De obicei, se utilizeaz un numr unic de identificare, cum ar fi numrul de ID al unui
angajat sau un numr de serie. n terminologia bazelor de date, aceste informaii reprezint cheia primar a
tabelului. Oracle utilizeaz cmpuri de tipul cheie primar pentru a asocia rapid date din tabele multiple i a
cumula datele.
Dac avei deja un identificator unic pentru un tabel, cum ar fi un numr de produs care identific n mod
unic fiecare produs din catalog, avei posibilitatea s utilizai acel identificator ca i cheie primar a tabelului
dar numai dac valorile din aceast coloan vor fi ntotdeauna diferite pentru fiecare nregistrare. Nu pot
exista valori duplicate ntr-o cheie primar. De exemplu, nu utilizai numele oamenilor pentru cheia primar,
deoarece numele nu sunt unice. Este foarte posibil s existe doi oameni cu acelai nume n acelai tabel.
O cheie primar trebuie ntotdeauna s aib o valoare. Dac este posibil ca valoarea unei coloane s
devin neatribuit sau necunoscut (valoare lips) la un anumit moment, nu se poate utiliza ca i
component ntr-o cheie primar.
Trebuie ntotdeauna s alegei o cheie primar a crei valori nu se va schimba. ntr-o baz de date care
utilizeaz mai multe tabele, se poate utiliza cheia primar a unui tabel care referin n alte tabele. Dac se
schimb cheia primar, modificarea trebuie aplicat oriunde se face referire la cheie. Utilizarea unei chei
Page 19 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

primar care nu se va modifica reduce ansele de a se desincroniza cheia primar cu tabelele care fac
referin la ea.
Deseori, e utilizeaz ca i cheie primar un numr unic arbitrar. De exemplu, i se poate atribui fiecrei
comenzi un numr unic de comand. Singurul scop al numrului de comand este identificarea unei
comenzi. O dat atribuit, nu se schimb niciodat.
Dac nu avei o coloan sau un set de coloane care se poate utiliza ca i cheie primar, luai n considerare
utilizarea unei coloane care are tipul de date AutoNumerotare. Cnd se utilizeaz tipul de date
AutoNumerotare, Oracle atribuie automat o valoare. Un astfel de identificator nu are date; nu conine
informaii care descriu rndul pe care l reprezint. Identificatorii fr date sunt ideali pentru rolul de cheie
primar, deoarece nu se modific. Este mai posibil ca o cheie primar care conine date despre un rnd
de exemplu, un numr de telefon sau numele unui client s se modifice, deoarece se poate modifica
informaia n sine.

O coloan setat la tipul de date AutoNumerotare este o cheie primar potrivit. Nu exist dou ID-uri
identice pentru produse.
n unele cazuri, este de preferat s se utilizeze dou sau mai multe cmpuri care mpreun asigur cheia
primar a unui tabel. De exemplu, un tabel Detalii Comenzi care stocheaz elemente de linie pentru
comenzi ar folosi dou coloane n cheia sa primar : ID Comand i ID Produs. Cnd o cheie primar
utilizeaz mai mult de o coloan, aceasta se mai numete i cheie compus.
n cazul bazei de date pentru vnzri de produse, se poate crea o coloan de tipul AutoNumerotare pentru
fiecare dintre tabele, pentru a ndeplini rolul de cheie primar: IDProdus pentru tabelul Produse,
IDComand pentru tabelul Comenzi, IDClient pentru tabelul Clieni i IDFurnizor pentru tabelul Furnizori.

Page 20 of 102

Baze de date
Project no.
Document no.

BD 2011

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

2.3.6 Crearea relaiilor tabelelor


Dup ce ai mprit informaiile n tabele, este nevoie de o asociere util a informaiilor. De exemplu,
urmtorul formular include informaii din mai multe tabele.

Informaiile din acest formular provin din tabelul Clieni...

Page 21 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

tabelul Angajai...
tabelul Comenzi...
tabelul Produse...
i tabelul Detalii Comand.
Oracle este un sistem de gestionare a bazelor de date relaionale. ntr-o baz de date relaional,
informaiile se mpart n tabele separate, bazate pe subiecte. Se pot utiliza relaiile dintre tabele pentru a
asocia informaiile n moduri utile.

2.3.7 Crearea unei relaii de tipul unul-la-mai-muli


Luai n considerare acest exemplu: tabelele Furnizori i Produse din baza de date pentru comenzi de
produse. Un furnizor poate furniza oricte produse. Aadar, pentru orice furnizor din tabelul Furnizori pot
exista multe produse n tabelul Produse. Relaia dintre tabelul Furnizori i tabelul Produse este, prin
urmare, o relaie de tipul unul-la-mai-muli.

Pentru a reprezenta o relaie de tipul unul-la-mai-muli n proiectul bazei de date, luai cheia primar din
partea "unu" a relaiei i adugai-o ca o coloan suplimentar la tabelul din partea "mai-muli" a relaiei. n
acest caz, de exemplu, se adaug coloana ID furnizor, din tabelul Furnizori, la tabelul Produse. Oracle
poate utiliza numrul de ID al furnizorului n tabelul Produse pentru a gsi furnizorul potrivit pentru fiecare
produs.

Page 22 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Coloana ID furnizor din tabelul Produse se numete cheie extern. O cheie extern este cheia primar a
unui alt tabel. Coloana ID furnizor din tabelul Produse este o cheie extern, deoarece este i cheia primar
a tabelului Furnizori.

Furnizai baza pentru a uni tabelele legate prin stabilirea perechilor de chei primare i chei externe. Dac nu
suntei sigur care tabele ar trebui s partajeze o coloan comun, identificarea unei relaii unu-la-mai-muli
va asigura necesitatea unei coloane partajate ntre cele dou tabele implicate.

2.3.8 Crearea unei relaii mai-muli-la-mai-muli


Luai n considerare relaia dintre tabelul Produse i tabelul Comenzi.
O comand poate include mai multe produse. Pe de alt parte, un produs poate aprea n mai multe
comenzi. De aceea, pentru fiecare nregistrare din tabelul Comenzi, pot exista mai multe nregistrri n
tabelul Produse. i pentru fiecare nregistrare din tabelul Produse, pot exista mai multe nregistrri n
tabelul Comenzi. Aceast relaie este de tipul mai-muli-la-mai-muli, deoarece pentru orice produs pot
exista mai multe comenzi; i pentru orice comand pot exista mai multe produse. Reinei faptul c pentru a
detecta relaiile de tipul mai-muli-la-mai-muli dintre tabele, este important s luai n considerare ambele
sensuri ale relaiei.
Subiectele celor dou tabele comenzi i produse se afl ntr-o relaie mai-muli-la-mai-muli. Acest
lucru prezint o problem. Pentru a nelege problema, imaginai-v ce s-ar ntmpla dac ai ncerca s
Page 23 of 102

Baze de date
Project no.
Document no.

BD 2011

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

creai o relaie ntre dou tabele adugnd cmpul ID produs la tabelul Comenzi. Pentru a avea mai mult de
un produs pentru fiecare comand, avei nevoie de mai mult de o nregistrare pentru fiecare comand n
tabelul Comenzi. S-ar repeta informaiile despre comand pentru fiecare rnd asociat cu o comand
rezultnd o proiectare ineficient care poate produce date exacte. Aceeai problem apare dac se adaug
cmpul ID comand la tabelul Produse rezult mai multe nregistrri n tabelul Produse pentru fiecare
produs. Cum se rezolv aceast problem?
Rspunsul este crearea celui de-al treilea tabel, numit adesea tabel de jonciune, care separ relaia maimuli-la-mai-muli n dou relaii unu-la-mai-muli. Inserai cheia primar a fiecruia dintre cele dou tabele
n al treilea tabel. Ca rezultat, al treilea tabel nregistreaz fiecare apariie sau instan a relaiei.

Fiecare nregistrare din tabelul Detalii comand reprezint un element linie ntr-o comand. Cheia primar a
tabelului Detalii comand const n dou cmpuri cheile externe ale tabelelor Comenzi i Produse.
Utilizarea cmpului ID comand singur nu funcioneaz ca o cheie primar pentru acest tabel, deoarece o
comand poate avea mai multe elemente linie. ID comand se repet pentru fiecare element linie dintr-o
comand, astfel nct cmpul nu conine valori unice. Nici utilizarea cmpului ID produs singur nu
funcioneaz, deoarece un produs poate aprea n mai multe comenzi diferite. Dar, mpreun, cele dou
cmpuri produc ntotdeauna o valoare unic pentru fiecare nregistrare.
n baza de date pentru vnzri de produse, tabelele Comenzi i Produse nu sunt asociate direct. n schimb,
ele sunt asociate indirect prin tabelul Detalii comand. Relaia mai-muli-la-mai-muli ntre comenzi i
produse se reprezint n baza de date utiliznd dou relaii unu-la-mai-muli:

Page 24 of 102

Baze de date
Project no.
Document no.

BD 2011

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

ntre tabelele Comenzi i Detalii comand exist o relaie unu-la-mai-muli. Fiecare comand are mai
mult de un element line, dar fiecare element linie este conectat cu o singur comand.

ntre tabelele Produse i Detalii comand exist o relaie unu-la-mai-muli. Fiecare produs poate avea
mai multe elemente linie asociate, dar fiecare element linie face referire la un singur produs.

Din tabelul Detalii comand, se pot determina toate produsele dintr-o anumit comand. De asemenea, se
pot determina toate comenzile pentru un anumit produs.
Dup incorporarea tabelului Detalii comand, lista tabelelor i cmpurilor poate arta cam aa:

2.3.9 Crearea unei relaii de tipul unu-la-unu


Un alt tip de relaie este relaia unu-la-unu. De exemplu, s presupunem c trebuie nregistrate cteva
informaii speciale despre produse suplimentare, de care vei avea nevoie rar sau care se aplic numai
ctorva produse. Deoarece vei avea nevoie rar de aceste informaii i stocarea informaiilor n tabelul
Produse ar produce spaii libere pentru fiecare produs la care acestea nu se aplic, amplasai-le ntr-un
tabel separat. Ca i tabelul Produse, ID produs se utilizeaz cu rolul de cheie primar. Relaia dintre acest
tabel suplimentar i tabelul Produs este o relaie de tipul unu-la-unu. Pentru fiecare nregistrare din tabelul

Page 25 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Produs, exist o singur nregistrare care se potrivete n tabelul suplimentar. Cnd identificai o astfel de
relaie, ambele tabele trebuie s partajeze un cmp comun.
Cnd observai necesitatea unei relaii unu-la-unu n baza de date, gndii-v dac se pot pune informaiile
din cele dou tabele mpreun ntr-un singur tabel. Dac, dintr-un anumit motiv, nu dorii s facei acest
lucru, poate pentru c ar rezulta multe spaii libere, lista urmtoare v arat cum se reprezint relaia n
proiectare:

Dac cele dou tabele au acelai subiect, probabil se poate configura relaia utiliznd aceeai
cheie primar n ambele tabele.

Dac cele dou tabele au subiecte diferite, cu chei primare diferite, alegei unul din tabele (oricare)
i inserai cheia sa primar n cellalt tabel pe post de cheie extern.

Determinarea relaiilor dintre tabele v ajut s v asigurai c avei tabelele i coloanele corecte. Cnd
exist o relaie unu-la-unu sau unu-la-mai-muli, tabelele implicate trebuie s partajeze o coloan sau mai
multe coloane comune. Cnd exist o relaie mai-muli-la-mai-muli, este necesar un al treilea tabel pentru a
reprezenta relaia.

2.3.10

Rafinarea proiectrii

Din momentul n care avei tabelele, cmpurile i relaiile de care avei nevoie, trebuie s creai i s
populai tabelele cu date eantion i s ncercai s lucrai cu informaiile: crend interogri, adugnd
nregistrri noi i aa mai departe. Acest lucru ajut la evidenierea problemelor poteniale de exemplu,
este posibil s avei nevoie s adugai o coloan pe care ai uitat s o inserai n timpul fazei de proiectare,
sau este posibil s avei un tabel care s trebuiasc separat n dou tabele pentru a elimina duplicarea.
Vedei dac se poate utiliza baza de date pentru a obine rspunsurile dorite. Creai schie neprelucrate ale
formularelor i rapoartelor, i vedei dac v arat datele pe care le ateptai. Cutai dubluri inutile de date
i, dac le gsii, modificai proiectarea pentru a le elimina.
Pe msur ce testai baza de date iniial, probabil vei descoperi c se pot face mbuntiri. Cteva lucruri
care trebuie verificate:

Ai uitat vreo coloan? Dac da, apar informaiile n tabelele existente? Dac informaiile sunt
despre altceva, este posibil s fie nevoie s creai un alt tabel. Creai o coloan pentru fiecare
element informaional care trebuie urmrit. Dac informaiile nu se poate calcula de pe o alt
coloan, probabil avei nevoie de o coloan nou pentru asta.

Page 26 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Sunt inutile unele coloane, pentru c se pot calcula din cmpuri deja existente? Dac un element
informaional se poate calcula dintr-o alt coloana deja existent ca, de exemplu, preul redus
calculat din preul de vnzare este mai bine, n general, s se procedeze aa i s se evite
crearea unei coloane noi.

Introducei n mod repetat informaii dublate n unul din tabele? Dac da, probabil c trebuie
mprit tabelul n dou tabele ntre care s existe o relaie de tipul unu-la-mai-muli.

Avei tabele cu multe cmpuri, un numr limitat de nregistrri i multe cmpuri goale n
nregistrrile individuale? Dac da, gndii-v la reproiectarea tabelului astfel nct s aib mai
puine cmpuri i mai multe nregistrri.

A fost mprit fiecare element informaional n cele mai mici pri utile? Dac trebuie efectuate
operaii de raportare, sortare, cutare sau calculare pentru un element informaional, punei acel
element n propria sa coloan.

Conine fiecare coloan date despre subiectul tabelului? Dac o coloan nu conine informaii
despre subiectul tabelului, aceasta aparine unui alt tabel.

Sunt toate relaiile dintre tabele reprezentate prin cmpuri comune sau printr-un al treilea tabel?
Relaiile unu-la-unu i unu-la-mai-muli necesit coloane comune. Relaiile mai-muli-la-mai-muli
necesit un al treilea tabel.

2.3.11Rafinarea tabelului Produse


S presupunem c fiecare produs din baza de date vnzri intr ntr-o categorie general, cum ar fi buturi,
condimente, sau fructe de mare. Tabelul Produse poate conine un cmp care arat categoria fiecrui
produs.
S presupunem c, dup examinarea i redefinirea proiectului bazei de date, decidei s stocai o descriere
a categoriei alturi de numele acesteia. Dac adugai un cmp Descriere categorie la tabelul Produse,
trebuie repetat descrierea fiecrei categorii pentru fiecare produs care intr in acea categorie iar
aceasta nu este o soluie bun.
O soluie mai bun ar fi s facei Categorii un subiect nou de urmrit pentru baza de date, cu propriul tabel
i propria cheie primar. Se poate aduga cheia primar de la tabelul Categorii la tabelul Produse, cu rol de
cheie extern.
ntre tabelele Categorii i Produse exist o relaie unu-la-mai-muli: o categorie poate include mai mult de
un produs, dar un produs poate aparine numai unei categorii.

Page 27 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Cnd revizualizai structurile tabelului, cutai grupuri repetitive. De exemplu, luai n considerare un tabel
care conine urmtoarele coloane:

ID produs

Nume

ID produs1

Nume1

ID produs2

Nume2

ID produs3

Nume3

n acest caz, fiecare produs este un grup repetitiv de coloane, care difer numai prin adugarea unui numr
la sfritul numelui coloanei. Cnd vedei coloanele numerotate astfel, ar trebui s reanalizai proiectarea.
Un astfel de proiect are mai multe defecte. Pentru nceput, v oblig s stabilii o limit superioar pentru
numrul produselor. Dup ce se depete aceast limit, trebuie adugat un grup de coloane nou la
structura tabelului, ceea ce reprezint o activitate administrativ major.
O alt problem este faptul c furnizorii care au mai puin dect numrul maxim de produse vor irosi spaiu,
din moment ce coloanele suplimentare vor fi goale. Cel mai serios defect al unui astfel de proiect este faptul
c efectuarea multor activiti, cum ar fi sortarea sau indexarea unui tabel dup ID-urile sau numele
produselor, devine dificil.
Oricnd vedei un grup repetitiv, reanalizai cu atenie proiectarea, n ideea de a mpri tabelul n dou. n
exemplul de mai sus, este mai bine s utilizai dou tabele, unul pentru furnizori i unul pentru produse,
legate prin ID furnizor.

2.3.12

Aplicarea regulilor de normalizare

Regulile de normalizare a datelor (denumite uneori reguli de normalizare) pot fi aplicate ca un pas din
cadrul proiectrii. Aceste reguli se utilizeaz pentru a verifica dac tabelele sunt structurate corect. Procesul
aplicrii regulilor la proiectarea bazei de date este denumit normalizarea bazei de date, sau doar
normalizare.
Normalizarea este foarte util dac ai determinat toate elementele informaionale i ai creat un proiect
preliminar. Scopul este s v asigurai c ai mprit elementele informaionale n tabelele
Page 28 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

corespunztoare. Normalizarea nu v poate ajuta s v asigurai c avei de la nceput toate elementele de


date corecte.
Regulile se aplic succesiv, asigurndu-v la fiecare pas c proiectul va ajunge la ceea ce se numete o
"form normal." n principiu, sunt acceptate cinci forme normale de la prima form normal pn la a
cincea. Acest articol le acoper pe primele trei, deoarece acestea sunt necesare pentru majoritatea
proiectelor de baze de date.

2.3.12.1

Prima form normal

Prima form normal presupune c exist o singur valoare la fiecare intersecie dintre un rnd i o
coloan din tabel, i niciodat o list de valori. De exemplu, nu poate exista un cmp denumit Pre n care
s plasai mai multe preuri. Dac privii intersecia dintre un rnd i o coloan ca pe o celul, atunci fiecare
celul poate conine o singur valoare.

2.3.12.2

A doua form normal

A doua form normal necesit ca fiecare coloan care nu este cheie s depind complet de cheia primar,
nu doar de o parte a cheii. Aceast regul se aplic cnd se utilizeaz o cheie primar care conine mai
multe coloane. De exemplu, s presupunem c avei un tabel care conine urmtoarele coloane, dintre care
ID comand i ID produs alctuiesc cheia primar:

ID comand (cheie primar)

ID produs (cheie primar)

Nume produs

Acest proiect ncalc a doua form normal, deoarece Nume produs depinde de ID produs, dar nu i de ID
comand, aadar nu depinde de ntreaga cheie primar. Nume produs trebuie eliminat din tabel. Aparine
de alt tabel (Produse).

2.3.12.3

A treia form normal

A treia form normal necesit ca fiecare coloan care nu este cheie s depind de ntreaga cheie primar,
dar i ca toate coloanele care nu sunt chei s fie reciproc independente.
Un alt mod de a spune aste este c fiecare coloan care nu este cheie trebuie s depind de ntreaga
cheie primar i numai de cheia primar. De exemplu, s presupunem c avei un tabel care conine
urmtoarele coloane:
Page 29 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

ID produs (cheie primar)

Nume

PSV

Reducere

CR no.:

S presupunem c Reducere depinde de preul sugerat de vnzare (PSV). Acest tabel ncalc a treia form
normal, deoarece o coloan care nu este cheie, Reducere, depinde de alt coloan care nu este cheie,
PSV. Independena coloanelor nseamn c se poate modifica orice coloan care nu este cheie fr a
afecta alte coloane. Dac se modific o valoare din cmpul PSV, se modific n mod corespunztor
Reducere, aadar nclcndu-se regula. n acest caz, Reducere trebuie mutat n alt tabel pentru care PSV
este cheie.

In acest capitol am nvat despre modul de proiectare a unei baze de date: cum mprim informaiile n
tabele, definirea relaiilor ntre tabele, reguli de normalizare a bazei de date.
In continuare trecem efectiv la crearea unei baze de date aplicnd aceste reguli de proiectare. Baza de
date va conine informaiile primare despre studenii unei faculti, necesare n realizarea rapoartelor despre
situaia la nvtur a studentilor.

Page 30 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

3 Structura organizatoric a facultii. Crearea bazei "stud"


Crearea contului utilizator n baza de date
Ca s putem lucra pe baza de date trebuie mai inti s introducem un utilizator de care se aparin toate
obiectele necesare implementrii programului. Acest utilizator se va denumi "stud" i va avea parola "stud",
sau fiecare user i creeaz propriul cont folosind numele propriu.
Comanda SQL care creeaz un nou utilizator este urmtoarea:

create user stud identified by stud;

Dac dorim s tergem user-ul creat avem la dispoziie comanda "drop":

drop user stud;

Atentie: tergerea unui user implic pierderea tuturor informaiilor care aparin acelui user: tabele, triggeri,
funcii, proceduri , biblioteci etc, de aceea trebuie realizat un export mai nti pe acel user, export ce
salveaz informaia ntr-un fiier pe disc (vezi comanda de export in capitolul "Dezinstalarea bazei Oracle").
Deci, intrm in SQL Plus cu user-ul system i dm comanda de creare a userului "stud". Orice
instruciune SQL se termin cu semnul ";". Odat creat, user-ul trebuie s primeasc i nite drepturi care
s-i permit s ntreprind anumite aciuni pe baza de date. Vom vorbi mai trziu despre drepturi, acum ne
vom mrgini s-i dm user-ului "stud" un rol de "data base administrator" (dba), rol suficient de puternic ca
s realizm ceea ce ne-am propus:

grant dba to stud;

Dupa crearea user-ului "stud" se iese din SQL Plus si se reintr cu noul user sau, se poate reconecta direct
cu noua identitate:

connect stud/stud@stud;

Din acest moment vom lucra numai sub user-ul "stud", deci la nceputul fiecrei sesiuni se va da user-ul
stud i parola corespunztoare. Primul lucru ce-l avem de rezolvat este crearea tabelelor n care vom ine
informaia. Baza de date creat este minimal, acoperind doar cteva aspecte din activitatea colar a
studenilor.

Structura organizatoric a facultii


S spunem cteva cuvinte despre structura organizatoric a facultii noastre :

Anul universitar ncepe n octombrie i se termin n septembrie anul viitor.

Page 31 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Pentru a obine licena de absolvire, studentul trebuie sa treac printr-un ciclu de studii ce
presupune un numr de ani de studiu : anul 1, anul 2, anul 3 i anul 4.

La nceputul fiecarui an universitar studenii se nscriu la facultate, fiind repartizai ntr-o


grup de studiu.

Nu toi studenii parcurg acelai domeniu, facultatea avnd mai multe specializri de studiu,
(Maini Electrice, Metrologie, Informatic Aplicat, etc), fiecare specializare fiind format
din una sau mai multe grupe de studeni.

In fiecare semestru dint-un an de studiu studenii trebuie s studieze un numr de


discipline specifice specializrii la care s-au nscris. Fiecare disciplin se pred la o
anumit specializare i ntr-un anumit an de studiu.

Semestrele se ncheie cu o sesiune de examinare unde studenii primesc note la


disciplinele studiate.

Structura tabelelor
Conform observaiilor de mai sus, ar rezulta urmtoarea structur de tabele necesar pentru stocarea
informaiilor specifice activitii didactice :

Tabela "ani_universitari": ine evidena anilor colari: 2011-2012, 2012-2013,...;

Tabela "specializri": include denumirea specializrilor pe facultate;

Tabela "ani_studiu": conine anii de studiu din facultate: anul 1, anul 2, 3,...;

Tabela "grupe": memoreaz denumirea grupelor de studiu

Tabela "studenti": conine toi studenii care trec prin facultate

Tabela "studenti_grupe" este tabela de legatura ntre studeni i grupe. Nu se poate trece
direct numrul grupei la fiecare student pentru ca acel student trece prin mai multe grupe
de studiu n decursul anilor, deci un student are ataate mai multe grupe, aa cum o grup
are ataai mai muli studeni. Este o legatur de tip "mai-multi-la-mai-multi" ce se rezolv
prin aceast tabel suplimentar.

Tabela "discipline": cnd se introduce o disciplin n tabel trebuie specificat anul de studiu
i specializarea la care se studiaz acea disciplin, precum si semestrul de studiu (1 sau
2).

Tabela "note" conine catalogul n care vor fi trecute notele la diverse testri i examene
finale ale studenilor. Fiecare not trecut n catalog trebuie s aparin unui student
(pk_student) i unei discipline (pk_disciplina).

Page 32 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

In figura de mai jos sunt date tabelele bazei de date, la fiecare tabel precizndu-se numele i tipurile
coloanelor incluse.

Tabelele bazei de lucru


Structura tabelelor reflect n fapt structura organizatoric a facultii. In acelai timp, trebuie avut n vedere
i eventualele rapoarte pe care trebuie s le furnizm despre procesul didactic din facultate. O list
minimal a acestor rapoarte trebuie s includ urmtoarele situaii:

Lista studentilor din facultate

Lista studentilor pe grupe i ani de studiu dintr-un anumit an universitar

Lista disciplinelor grupate pe specializrile din facultate

Lista disciplinelor ataate unui student ntr-un an universitar mpreun cu notele obinute de acesta

Mediile generale ale studenilor, media pe grupe i discipline de studiu

Studenii cu rezultate bune la nvtur, avnd media superioar grupei din care face parte

Studenii care repet un anumit an de studiu

Etc

Page 33 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

3.3.1 Analiza tabelelor din baza de date


In principiu, majoritatea tabelelor trebuie s conin o serie de trei coloane relativ obligatorii:

Coloana primary_key, avand prefixul "pk_", este coloana ce conine o valoare unic pentru fiecare
rnd din tabel. Orice tabel trebuie s aib o coloan care s identifice n mod unic o linie din
cadrul tabelei i care ne d sigurana c baza de date va reui s stocheze i s furnizeze
informaia n mod corect.

Coloana de cod, avnd prefixul "cod_", reprezint codul atribuit liniei respective. De cele mai multe
ori acest cod este unic dar nu n mod obligatoriu.

Coloana pentru descrierea informaiei din rnd, are prefixul "descriere_", i conine un text
descriptiv despre linia respectiv.

Aceste trei coloane se vor ntlni n toate tabelele create de noi n baza de date avnd semnificaiile
descrise mai sus.
In continuare prezentm arhitectura fiecrui tabel cu discuiile aferente:
1. Tabela "ani_universitari": este tabela ce stocheaz anii universitari parcuri din momentul crerii
bazei de date. Este o tabel independent de celelalte date din baz (tabela parinte), nu depinde
de nici o alta tabela, reprezint pur i simplu o iniruire de ani universitari. Include urmtoarele
coloane:

Pk_an_universitar: (ex: 1,2,3, ...)un numar unic ce identific fiecare an universitar n parte

Cod_an_universitar: (ex: "2011/2012", "2012/2013", ...) un text ce descrie simplu un an


universitar

Descriere_an_universitar: (ex: "An universitar 2011/2012")

2. Tabela "specializari": este tabela ce conine specializrile din facultate. De asemenea este o tabela
independent, structura specializrilor nu depinde de studeni sau grupe, ci este data de profilul
facultii.
Include urmtoarele coloane:

Pk_specializare: (ex: 1,2,3, ...) un numr unic ce identific fiecare specializare n parte

Cod_specializare: (ex: "IAD", "IA", ...) un text ce descrie simplu specializarea

Descriere_specializare: (ex: "Instrumentatie si Achizitii de Date"), reprezint denumirea


complet a specializarii

3. Tabela "ani_studiu": este tabela ce conine anii de studiu pe care i parcurge un student n
decursul facultii.
Include urmtoarele coloane:

Pk_an_studiu: (ex: 1,2,3, ...) un numr unic ce identific fiecare an n parte


Page 34 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Cod_an_studiu: (ex: "1", "2", ...) un text ce reprezint anul de studiu

Descriere_an_studiu: (ex: "Anul I", "Anul II", ...), reprezint descrierea anului de studiu

4. Tabela "discipline": este tabela ce conine disciplinele studiate n facultate. Nu mai este o tabela
independent, ci una copil, aceasta tabela depinznd de anii de studiu i de specializrile din
facultate.
Include urmtoarele coloane:

Pk_disciplina: (ex: 1,2,3, ...) un numr unic ce identific fiecare disciplin n parte

Cod_disciplina: (ex: "BD", "ME", ...) un text ce descrie simplu disciplina

Descriere_specializare: (ex: "Instrumentatie si Achizitii de Date"), reprezint denumirea


complet a specializrii

Pk_specializare: este specializarea la care se pred aceast disciplin. Curicula nu este


aceeai pentru toate specializrile, ci fiecare specializare are ataate discipline proprii

Pk_an_studiu: specific anul de studiu la care se pred disciplina

Semestru: (ex:1,2), semestrul de studiu

5. Tabela "grupe": este tabela ce conine grupele de studeni care se formeaz n facultate. Grupele
depind de specializare i de anul de studiu: la specializarea "IA", anul 3 este o singur grup:
"6309".
Include urmtoarele coloane:

Pk_grupa: (ex: 1,2,3, ...) un numr unic ce identific fiecare grup n parte

Cod_grupa: (ex: "6102", "6301", ...)

Descriere_grupa: (ex: "Grupa 6301")

Pk_specializare: specializarea la care aparine grupa

Pk_an_studiu: specific anul de studiu pentru grupa respectiv

6. Tabela "studenti": este tabela cu toti studenii din facultate, conine informaiile statice ale unui
student.
Include urmtoarele coloane:

Pk_student: (ex: 1,2,3, ...) un numr unic ce identific fiecare student n parte

Nume_student

Prenume_student

Nr_matricol

Adresa

7. Tabela "studenti_grupe": reprezint legatura ntre tabela studeni i tabela grupe. Un student
parcurge mai multe grupe n decursul facultii, aa cum o grup are mai multi studeni. Deci nu se
Page 35 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

poate face legatura direct ntre cele dou tabele, ci prin intermediul unei a treia tabele care s
specifice clar n fiecare an universitar componena grupelor.
Include urmtoarele coloane:

Pk_student: este pk-ul studentului curent

Pk_grupa: pk-ul grupei din care face parte studentul

Pk_an_universitar: pk-ul anului universitar pentru care studentul a aparinut grupei


respective.

Medie: media studentului din anul respectiv

Nr_credite: numrul de credite obinute de student

8. Tabela "Note": ine evidena notelor obinute de studeni n timpul examinrilor. Este legat de
tabela "studenti" orice not este asignat n mod unic unui student, i tabela "discipline" orice
not este pus la o anumit disciplin.
Include urmtoarele coloane:

Pk_nota: identificatorul unic al notei

Pk_student: studentul ce a primit nota respectiv

Pk_disciplina: la ce disciplina a luat nota studentul

Nota: un numr cuprins ntre 1 i 10 reprezentnd nota luat de student

Data: data examinrii, de tipul "date"

Rafinarea bazei de date


Chiar dac baza de date este relativ simpl, totui se impun anumite discuii referitoare la proiectarea bazei
de date:

Relaia studeni-grupe: este o relaie clasic de tipul "mai-multi-la-mai-multi". Dac analiza era
limitat doar la un singur an universitar, atunci se putea pune foarte simplu coloana "pk_grupa" n
tabela studenti. Intr-un an universitar un student nu poate fi dect ntr-o grup (mai sunt i cazuri
cnd se permite ca un student s efectueze doi ani ntr-un an). Dar dac lucrm cu mai muli ani
universitari, atunci eram nevoii s inserm acelai student n baza de date dar avand un alt
pk_grupa. Rezult astfel mai multe linii n tabela studenti pentru acelai student, fiecare avnd pkuri diferite, ceea ce nu este absolut deloc corect. Nu se mai poate deloc identifica n mod unic un
student n baza de date, deoarece numele studenilor nu este unic n mod absolut.

Soluia a venit prin crearea unui tabel de legtur ntre studeni i grupe.

Relaia discipline-specializri: exist posibilitatea ca o disciplin mai general s se predea la mai


multe specializri. Soluia n acest caz o reprezint o noua tabel de legatur ntre discipline i

Page 36 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

specializri care s includ i anul universitar curent. Este posibil ca o disciplin s se reformuleze
la un moment dat, nu se mai cheam "BD" ci "BDR" (baze de date relationale) i atunci trebuie
adaugat o nou disciplin. Nu poate fi modificat cea veche deoarece studenii care deja au
absolvit, au studiat disciplina veche i ea trebuie s rmn n baza de date pentru tiprirea foii
matricole n mod corect. Deci, la nceputul fiecrui an universitar ar trebui completat tabela de
legatur ntre discipline i specializri astfel nct, s se poat specifica clar ce discipline s-au
studiat n decursul anilor i n ce ani universitari.
Singura problema ar fi ca este necesar un volum de munc suplimentar pentru a ataa disciplinele la
specializri n fiecare an, munca destul de plictisitoare innd cont c aceste schimbri apar foarte rar n
timp.
Mai exist o soluie cnd se schimb programa unei specializri: se se creeze o nou specializare,
avnd acelai cod, aceeai descriere (dar pk diferit) i noile grupe formate s se ataeze la noua
specializare. Totui, dou specializri cu acelai cod i aceeai descriere pot crea confuzie, dac le
punem ntr-un combo-box (lista de selecie), apar dou linii identice din care utilizatorul nu tie pe care
s o aleag. Atunci se mai introduce o coloana numit "Inactiv" cu variantele "DA" sau "NU". Odat ce
o specializare se modific, atunci se creeaz una nou dup noua curicul i cea veche se trece n
starea inactiv. In felul acesta avem un criteriu de filtrare a specializrilor ce se afieaz la un moment
dat.

De ce nu pot folosi cod_grupa sau cod_specializare ca coloan de tip pk? Este mai util s vedem n
tabela grupe la coloana "pk_specializare" un text de tipul "IAD" decat un numr abstract. S-ar
vedea de la prima vedere la ce specializare este ataat aceast grup, far s mai merg prin
tabela specializri. Dar, aa cum am discutat la punctul anterior, pot adauga o nou specializare cu
acelai cod, deci s-ar nclca regula ce spune c fiecare linie trebuie identificat n mod unic prin
valoarea din coloana de tip pk.

Acceai regul se aplic i la cod_grupa, pot avea grupe cu acelasi cod, dar care s aparin de
specializri diferite n funcie de numrul de studeni din fiecare an universitar.

Crearea tabelelor n baza de date


Avnd structura tabelelor definit, putem trece la crearea efectiv a tabelelor n baza de date. In acest
capitol vom nva sintaxa comenzii SQL de creare a tabelelor cu care vom dezvolta toate tabelele
proiectate.

Page 37 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Dac lucrm n programul SQL Navigator crearea unui tabel este simpl: click dreapta pe subdirectorul
"Tables" din "My Schema" i comanda "Create" din submeniul aprut. Se creeaz tabela "ani_universitari"
avnd urmtoarele coloane:
- pk_an_universitar de tip number (n coloana se vor introduce numai numere care s identifice n
mod unic anul colar);
- cod_an_universitar: varchar2(50)
- descriere_an_universitar: varchar2(50)
Dup ce am completat cele dou coloane se d click pe butonul "Apply Changes to DB" (

).

Cine nu are o asemenea interfa grafic, este nevoit s scrie comanda SQL pentru crearea unei tabele:
create table ani_universitari
(
pk_an_universitar
number,
cod_an_universitar
varchar2(15),
descriere_an_universitar varchar2(50)
);
Dac am greit ceva, putem terge tabela (drop table ani_universitari;) i apoi crea din nou, n forma
corect. Sau, mai avem varianta de modificare a tabelei direct, prin comanda SQL "alter table" :
ALTER TABLE ani_universitari MODIFY ( DESCRIERE_AN_UNIVERSITAR VARCHAR2 (50));
Exist comenzi pentru adugare de coloane, tergere, modificare tip, modificare nume coloane. Comanda
DESCRIBE face o descriere a coloanelor unui tabel cu tipurile aferente.

modificare coloan:
o

alter table studenti modify (nume_stud not null);

alter table studenti modify (nr_matricol number);

Adugare coloan:
o

Stergere coloan:
o

alter table studenti drop column nr_matricol;

Redenumire coloan:
o

alter table ani_universitari add (observatii varchar2(100));

Alter table student rename column nr_matricol to numar_matricol

Descriere arhitectur tabel "student":


o

Describe studenti;

Tipuri de date definite n baza de date


Page 38 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

In momentul cnd se definete o nou coloan n tabel trebuie specificat i tipul de date care vor fi stocate
n acea coloan. Intr-o coloana poatet fi stocat doar un singur tip de date, nu pot fi amestecate tipuri diferite
(numere, texte, date calendaristice).
In continuare se dau principalele tipuri de date ce pot fi stocate n baza de date:

Siruri de caractere:

Varchar2(n): ir de caractere cu lungime variabil, numrul maxim de caractere fiind dat de


numrul n. Textul poate avea sub cele 50 de caractere i atunci spaiul alocat cmpului se
restrnge la dimensiunea textului. Se poate stoca ntr-un astfel de cmp maxim 4000 de octei.
o

Exemplu: varchar2(50): un text de maxim 50 de caractere.

Nvarchar2(n): similar cu varchar2, dar n acest caz se pot introduce caractere naionale
specifice (, , ,...)

Char(n): tot iruri de caractere, dar de lungime fix, maxim 2000 de octei.

Long raw: iruri de caractere de pn la 2 GB

Numere:

Number(p,s): un numr cu p cifre din care s la partea zecimal.


o

Exemplu: number (7,2) stocheaz numere de maxim 5 cifre la partea ntreag i 2 la


partea zecimal

Date calendaristice:

Date: o dat calendaristic ce poate conine orice dat n perioada 4712 .e.n 9999. Aceste
date se pstreaz n baz sub forma unor numere cu virgul, o unitate reprezentnd o zi.
Pentru afiarea datelor calendaristice se folosesc diverse funcii ce formateaz acea data ntrun text corespunztor.

Timestamp(s): tot o dat calendaristic, dar memeoreaz i fraciuni de secund. Numarul s


reprezint cte zecimale se pstreaz dintr-o secund (implicit se ptreaz 5 zecimale, maxim
sunt 9 zecimale). Acest timestamp e util cand ne intereseaz intervale foarte scurte de timp ce
pot fi sub o secund, deci pot fi calculate doar prin compararea unor date de tip timestamp.

Obiecte mari:

Blob (bynary large objects): pentru obiecte foarte mari de date (cum ar fi imagini, obiecte
binare) Oracle pune la dispoziie tipul BLOB. In acest cmp se pot stoca pn la 4 GB de date
binare, fr nici o formatare prealabil (ele sunt tratate ca un ir de octei oarecare).

Page 39 of 102

Baze de date
Project no.
Document no.

BD 2011

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Page 40 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

4 Constrngeri
Constrngeri de tip Primary Key (PK)
Am vzut ca putem afla grupa din care face parte un student tiind numrul liniei din tabela "grupe"
care este asociat studentului. Dar, ce se ntmpl dac s-a ters o grup din baza de date? Toate liniile vor
fi decalate cu un pas, deci toti studenii vor fi trecui automat n grupa anterioar. Este mult mai bine dac
am defini o coloan n tabela "grupe" care s aib ca valoare un numr ntreg pentru fiecare linie care s fie
unic n tabel, indiferent de cte linii are tabela, cte linii s-au ters sau modificat. Putem defini o asemenea
coloan prin constrngerea "primary key".
Constrngerile reprezint un set de reguli pe care noi le definim i apoi baza de date se asigur c
sunt respectate. De exemplu, din experiena noastr de toate zilele, putem trage concluzia destul de util
c nu este bine s bagi mna n foc. De aceea definim o regula : " nu este voie s se bage mna n foc".
Cu toate c regula este clar, e greu s fie respectat. De multe ori omul uit c focul arde, sau din
greeal trece cu mna prin foc, sau introduce mna ntr-o incint n care nu tie c arde focul. Deci, ne
putem frige ori din neatenie, ori din netiin. N-ar fi mai bine dac cineva ar supraveghea tot timpul la
respectarea acestei reguli i, la fiecare ncalcare s ne blocheze s bgm mna n foc?
Exact asta face baz de date: noi definim o constrngere de tip "primary key" pe o coloan i baza
are grij ca niciodat s nu se repete o valoare pe acea coloan.
Dar cum tim s introducem valori n acea coloan? Cine st s verifice ce valori s-au introdus
pn acum i ce valori putem introduce n continuare? Din fericire, baza de date iari ne ajut. Bazele de
tip Oracle conin un obiect numit "Sequence" care este un generator de numere cresctoare unice. Odat
definit, obiectul ne furnizeaz la apel un numar mai mare dect cel furnizat anterior. Nimeni nu poate da
secvena napoi, deci nu este posibil s se repete un numr de mai multe ori. Prin urmare, completarea
unei coloane de tip "primary key" (pk) se face cu ajutorul secvenelor.
Comanda SQL de adugare a unei constrngeri de tip "primary key" este urmtoarea:

alter table studenti add constraint studenti_pk primary key (pk_student);

Crearea unei secvene se face prin comanda:

create sequence seq_pk_stud increment by 1 start with 21 minvalue 10 maxvalue 9999999999


nocycle noorder ;

Constrngeri de unicitate (UK)

Page 41 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Sunt situaii cnd mai multe coloane din tabel trebuie s conin valori unice, dar nu putem defini
dect o coloan ca fiind de tip PK. Pentru celelalte coloane avem la dispoziie constrngerea de unicitate
care odat definit, nu permite repetarea valorilor pe acea coloan.

alter table grupe add constraint grupe_uk unique(cod_grupa, desc grupa);

alter table grupe drop constraint grupe_uk;

Daca vreau s creez o constrngere de unicitate dar datele existente n tabel nu respect condiia impus
de constrngere, se folosete clauza NOVALIDATE (baza deja este pornit, avem date, dar s-a constatat la
un moment dat c unele date nu sunt corecte. Nu putem terge datele, dar din acest moment definim
constrngerea care s nu mai permit introducerea de noi date greite):

alter table studenti add constraint studenti_uk unique(pk_stud, nume_stud) enable novalidate;

OBSERVATIE: novalidate merge numai daca s-a creat un index pe acele coloane:

create index ind_studenti on studenti(pk_stud, nume_stud);

Alte comenzi utile:

Stergerea index: drop index ind_studenti;

Stergere constrngere: alter table studenti drop constraint studenti_uk;

Enable/disable constrngere:
o

alter table enable (novalidate) constraint studenti_uk;

alter table disable constraint studenti_uk; (asta face automat novalidate)

Cnd este util s dezactivm constrngerile?

Importm date n baz care nu respect ordinea: mai nti datele din tabelele printe i apoi cele
din tabelele copil. Prin dezactivarea constrngerilor, pot introduce datele n ordine aleatoare i apoi
constrngerile sunt validate la loc. Condiia este ca datele importate s respecte regulile impuse de
constrngeri.

Import date ntr-o tabel care se autorefer (am date parinte i copil in aceeai tabel).

Sterg date din tabel, dar datorit constrngerilor de tip foreign key, tergerea dureaz foarte mult
(baza trebuie sa verifice c nu tergem date de tip printe ce au date copii n alte tabele). Trebuie
s dezactivez toate constrngerile de tip foreign key care fac referire la tabela din care terg.
Aceste constrngeri se afl printr-un select din tabela user_constraints.

Constrngeri de tip "Not Null" (NN)

Page 42 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Ce se ntmpl dac introducem un student n baz, dar uitm s-i completm numele? Programul
salveaz linia i apoi vine profesorul s pun note n catalog. Cnd ajunge la studentul cu pricina gsete o
linie goal la care nu tie ce not s treac.
De aceea, trebuie s ne asigurm c, coloana "nume" nu are voie s conin valori de tip null.
Aceast problem se rezolv prin constrngerea "Not Null" pe care o aplicm coloanei "nume".

alter table studenti modify (nume_stud varchar2(50) not null);

Constrngeri de tip "Foreign Key"


O alt surs de erori este dat de legtura ntre tabele. De exemplu, n tabela "studenti_grupe"
atam un student la grupa cu pk-ul 31 n loc de 3 cum ar fi corect. Grupa 31 nu exist n baz, deci acel
student nu va aprea n catalog, deoarece catalogul afieaz studenii dintr-o grup.
Soluia este dat de constrngerea de tip "Foreign Key", adic stabilim regula ca toate valorile
introduse n coloana "pk_grupa" s fac parte din mulimea valorilor din coloana "pk" a tabelei "grupe". n
acest fel, cnd se introduce studentul din grupa 31, baza imediat se sesizeaz i ntoarce eroare.

alter table studenti_grupe add constraint stud_grupe_fk foreign key (pk_grupa) references
grupe(pk_grupa);

Observaie: coloana pk_grupa din tabela grupe trebuie s fie declarat ntr-o constrngere de tip PK sau
UK, altfel obinem eroarea: 'no matching unique or primary key for column-list';

Constrngeri de tip "check"


Mai exist o posibilitate de limitare a surselor de eroare: constrngerile generale de tip "check". De
exemplu, nu putem introduce note n afara intervalului [1-10]:

Alter table note add constraint ck_nota CHECK (nota between 1 and 10);

Definirea constrngerilor n baza de date "stud"


Constrngerile trebuie definite nainte de introducerea datelor, altfel riscm s avem date incoerente n
baz. Conform discuiilor din capitolul anterior, pe fiecare tabel din baz trebuie definite cel putin urmtorul
set de constrngeri:
1. Ani_Universitari:
-

pk_an_universitar (pk_an_universitar)

Page 43 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

2. Ani_studiu:
-

pk_an_studiu (cod_an_studiu)

3. Specializari:
-

Pk_specializari (cod_specializare)

4. Discipline:
-

Pk_discipline (cod_disciplina)

Fk_disc_spec : discipline.cod_specializare -> specializari.cod_specializare

Fk_disc_ani_studiu: discipline.cod_an_studiu - > ani_studiu.cod_an_studiu

Unique: denumire_disciplina + cod_specializare (combinatia discipline, spec sa fie unica)

5. Grupe:
-

Pk_grupa (cod_grupa)

6. Studenti:
-

Pk_student (pk_student)

Nn_nume_stud (nume_student) not null

7. Studenti_grupe:
-

Pk_studenti_grupe

Fk_studenti_grupe_grupe: student_grupe.pk_grupa -> grupe.pk_grupa

Fk_studenti_grupe_studenti: student_grupe.pk_student -> studenti.pk_student

8. Note:
-

Pk_nota(pk_nota)

Fk_note_stud : note.pk_student -> studenti.pk_student

Fk_note_discipline : note.pk_disciplina -> discipline.pk_disciplina

Ck_nota : nota > 1 i nota <= 10

Page 44 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

5 Introducerea datelor n tabele


Sintaxa comenzii Insert
Odat create tabelele, putem introduce date n ele. Comanda SQL de introducere a datelor n tabele este
INSERT ce are sintaxa dat n continuare:

insert into ani_universitari (pk_an_universitar, cod_an_universitar, descriere_an_universitar)


values (-1, '2010-2011', 'an universitar 2010-2011');

Dup comanda "insert into" se pune numele tabelei n care se introduc datele, ntre paranteze se trec
denumirile coloanelor care se completeaz cu informaii, apoi dup cuvntul "values" se pun valorile noilor
date ale tabelei. Observm c valorile numerice se scriu ca atare pe cnd cmpurile de tip text se scriu cu
apostrof ( 'an scolar 2007-2008' ).
Aceeai comand poate fi dat i prin sintaxa:

insert into ani_scolari values (4,'an scolar 2007-2008');

cnd se renun la specificarea coloanelor completate. In acest caz paranteza "values" trebuie s conin
valori pentru toate coloanele tabelei. Prima variant este de preferat deoarece se vede foarte clar ce
coloane se completeaz (sunt tabele care au zeci de coloane i doar cteva primesc valori la o inserare) i
n al doilea rnd nu se tie niciodat dac nu cumva mai trebuie adugat o coloan la o tabel dup
conceperea bazei de date. O coloan n plus necesit modificarea tuturor insert-urilor scrise sub a doua
variant.
Not: trebuie verificat

dac studentul primete not doar la o disciplin pe care el o studiaz.

Constrngerea fk_note_discipline verific c disciplina la care se pune nota exist n baza de date, dar nu
poate verifica dac studentul ce primete nota studiaz sau nu acea disciplin. Aceast verificare trebuie
fcuta printr-un trigger, concept ce se va studia n alt capitol.

Valoarea NULL
Ce se ntmpl cu acele coloane care nu sunt specificate n comanda insert?

insert into studenti (pk_student, nume_student) values(20,'Ionescu');

In comanda precedent nu s-a completat prenumele studentului introdus n baz. Dac ne uitm la
informaiile din tabela studeni:

select * from studenti;

Page 45 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

vom vedea c la studentul cu pk-ul 20 coloana "prenume_student" nu are nimic. La omiterea unei coloane
n comanda insert baza de date introduce automat valoarea NULL n acea coloan. NULL nseamn "nimic"
i d multe bti de cap programatorilor. Deoarece un singur NULL pus ntr-o relaie sau ntr-o ecuaie d
peste cap toat ecuaia care va returna ntotdeauna NULL, indiferent de celelali membri ai ecuaiei (nimic
adunat, mpartit, testat etc cu ceva d ntotdeauna nimic).
Este foarte greu s inem evidena valorilor care sunt NULL n baza de date, de aceea, pentru a nu bloca
procesarea informaiei n cazul ntlnirii unei valori NULL se folosete funcia NVL care s furnizeze o
valoarea implicit pentru coloanele ce nu au valori:

select nvl(prenume_student,'prenume student') from studenti;

Dac coloana "prenume_student" are valori diferite de NULL atunci funcia "nvl" returneaz acea valoare, n
caz contrar returneaz irul 'prenume student'.

Introducerea datelor n tabele


Folosind comanda insert prezentat mai sus, se introduc date de lucru n tabele astfel nct s obinem o
baz de date funcional (grupe, studeni, sepecializri, discipline, note, etc).
Prezentm n continuare cteva tabele:

select * from specializari;

select * from grupe;

select * from discipline;

Page 46 of 102

Baze de date
Project no.
Document no.

BD 2011

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Pentru o introducere mai rapid a datelor se pot utiliza frazele insert listate n anexa "Introducerea date n
baz".

Page 47 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

6 Extragerea informaiilor din baza de date


Comanda SELECT
Orice informaie din baz trebuie la un moment dat extras i vizualizat. In acest scop folosim comanda
SQL SELECT, comanda cu care ne confruntm cel mai des n lucrul cu baza de date.
M intereseaz s vd studenii nscrii in facultate:

select * from studenti;

Dar nu vreau s vd toate coloanele, nu m intereseaz pk-ul studentului, sau alt pk, vreau s tiu numele
i prenumele studentului:

select nume_student, prenume_student from studenti;

Sunt prea muli, nu vreau s vd toi studenii care au trecut prin facultate, vreau s vd numai studenii
care sunt la litera 'B':

select nume_student, prenume_student from studenti


where nume_student like 'B%';

Din cele prezentate pn acum putem reine sintaxa de baz a instruciunii SELECT:

select nume_coloane from nume_tabel where condiii de selecie.

Dup cuvntul "select" se introduc numele coloanelor din tabela care vrem sa fie afiate. Dac sunt mai
multe coloane, se despart prin virgul, dup ultima coloan nu se pune virgul. Dorim toate coloanele din
tabel? punem direct * (select *). Urmeaz clauza "from" dup care punem numele tabelei din care
Page 48 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

extragem acele informaii. Nu dorim toate liniile din tabel? atunci trebuie s adugm clauza "where" unde
introducem condiiile pe care trebuie s le ndeplineasc liniile din tabel ce se doresc afiate.

6.1.1 Selectarea datelor dintr-un database link


Dac sunt mai multe baze de date instalate n sistem, exist posibilitatea s se creeze legturi ntre
acestea, astfel nct, printr-o sesiune deschis pe o baz, s pot accesa informaii din baza vecin.
In acest scop se creeaz o legtur (database link) ntre baza curent i alt baz din sistem:

CREATE DATABASE LINK adina_link CONNECT TO adina IDENTIFIED BY adina USING 'stud'

Selectul dintr-un tabel aparinnd unei baze de date vecine se face prin intermediul legturii create:

select * from studenti@adina_link;

In felul acesta pot trece date dintr-o baz n alta, sau pot face un select care s afieze datele cumulate din
cele dou baze (folosim clauza Union):

select studenti.nume_student || ' '|| studenti.prenume_student "Nume prenume student",


'baza db3' "baza de origine"
from studenti
union
select studenti.nume_student || ' '|| studenti.prenume_student "Nume prenume student",
'baza db1' "baza de origine"
from studenti@db1_link
order by "baza de origine" desc ;

Selectarea informaiilor din mai multe tabele simultan


De cele mai multe ori informaiile necesare nu sunt stocate ntr-un singur tabel, ci sunt dispersate n mai
multe tabele. De exemplu, un caz tipic apare cnd vreau s vd studenii pe fiecare grup dintr-un anumit
an universitar. In acest caz datele se regsesc n tabele diferite: tabela studenti conine numele studenilor,
iar tabela studenti_grupe conine legatura ntre studenti si grupe, iar tabela ani_universitari pstreaz anii
universitari:

select st.nume_student, st.prenume_student, g.cod_grupa,


au.cod_an_universitar
from studenti st, grupe g, studenti_grupe stg, ani_universitari au
Page 49 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

where st.pk_student = stg.pk_student


and stg.pk_grupa = g.pk_grupa
and stg.pk_an_universitar = au.pk_an_universitar
order by au.cod_an_universitar, g.cod_grupa;

Instruciunea select permite extragerea informaiilor din mai multe tabele simultan. Pot vizualiza att numele
studentului, ct i specializarea acestuia, chiar dac cele dou informaii sunt n tabele diferite. Important
este s existe o legtur ntre cele dou tabele astfel nct unei linii dintr-o tabel s-i corespund una sau
mai multe linii din cealalt tabel. Cnd fraza select lucreaz cu dou tabele (sau mai multe), ntotdeauna
trebuie s existe clauza where n care se specific legtura ntre tabele. In selectul de mai sus legtura
dintre tabela student si tabela student_grupe se realizeaz prin coloana "pk_student" comun celor dou
tabele , n timp ce mai departe se merge pe legtura "pk_an_universitar" pentru a lega anul universitar de
selectul nostru.
Cum lucreaz selectul n acest caz? Se aduce numele studentului i pk-ul din tabela "studenti" i apoi se
caut toate liniile din tabela "student_grupe" ce corespund acelui pk. Pentru fiecare din aceste linii se
testeaz dac respect cealalt condiie dat de pk_grup (stg.pk_grupa = g.pk_grupa), cele care
nu respect condiia sunt eliminate din select. Se merge In continuare pe condiia "pk_an_universitar" pn
sunt eliminate toate liniile nedorite.
Ce se ntmpl dac uit pur i simplu s pun n clauza "where" legtura dintre tabele? Atunci e grav, se
umple ecranul cu zeci de rnduri fr nici o noim. Fraza select face produsul cartezian ntre cele dou
tabele i afieaz rezultatul (adic pentru fiecare linie din tabela "studenti" parcurge toate liniile din tabela
"studenti_grupe").
Concluzie: s nu uitm niciodat s punem n clauza "where" condiia de legtur dintre tabele atunci cnd
selectm coloane din mai multe tabele simultan.

Page 50 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Tema: s se construiasc un select care s afieze toi studentii din facultate, mpreun cu grupa,
disciplinele i notele obinute la examene:

select st.nume_student, st.prenume_student, g.cod_grupa,


d.cod_disciplina, n.nota, au.cod_an_universitar
from studenti st, grupe g, studenti_grupe stg, ani_universitari au, note
n, discipline d
where st.pk_student = stg.pk_student
and stg.pk_grupa = g.pk_grupa
and stg.pk_an_universitar = au.pk_an_universitar
and stg.pk_student_grupa = n.pk_student_grupa
and n.pk_disciplina = d.pk_disciplina
order by nume_student,au.cod_an_universitar, g.cod_grupa
;

Afiarea liniilor ce nu respect condiia de legtur n comanda


select
S presupunem c este un student care nu este ataat la nici o grup, deci nu are nici o linie inserat n
tabela "studenti_grupe".

insert into studenti values(null,'Chirila', 'C-tin',null);

Nu atasez nici o grup la acest student i facem un select care s-mi afieze studenii i grupele ataate:

select st.nume_student, st.prenume_student, stg.pk_grupa


from studenti st, studenti_grupe stg
where st.pk_student = stg.pk_student
order by nume_student asc ;

Studentul Chirila nu apare n selectul precedent, chiar dac el exist n baza de date, deoarece linia
respectiv cade n clauza st.pk_student = stg.pk_student.
Totui, dac vreau s vad toi studenii, indiferent dac au grupe asociate sau nu, cei care au grupe
asociate s li se afieze grupa, cei care nu au, s apar fr grup, dar s apar.
In acest caz trebuie s utilizez operatorul (+):

Page 51 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

select st.nume_student, st.prenume_student, stg.pk_grupa


from studenti st, studenti_grupe stg
where st.pk_student = stg.pk_student (+)
order by nume_student asc ;

Operatorul (+) pus n dreapta tabelului ce nu are corespondent pentru fiecare linie din primul tabel, are ca
efect afiarea tuturor liniilor selectate din primul tabel, indiferent dac au sau nu legtur cu cel de-al doilea.
Afiez i codul grupei din care face parte studentul. In acest caz trebuie sa folosesc de dou ori operatorul
"outer join" (+):

select st.nume_student, st.prenume_student, stg.pk_grupa, g.cod_grupa


from studenti st, studenti_grupe stg, grupe g
where st.pk_student = stg.pk_student (+)
and stg.pk_grupa = g.pk_grupa (+)
order by nume_student asc
;

Clauza where. Operatori logici


6.4.1 Operatori de comparaie
In general, tabelele au mii de linii, milioane chiar, clauza where este cea care ne ajut s sortm aceste linii
i s scoatem numai informaia de care avem nevoie. In aceast clauz sunt scrise expresii logice ce
returneaz doar dou valori: valoarea "adevrat" (true) sau valoarea "fals" (false). Expresiile logice sunt
construite cu ajutorul operatorilor de comparaie:
Operator
=
>
>=
<
<=
<> !=

Explicaie
Egal cu
Mai mare dect
Mai mare sau egal
Mai mic dect
Mai mic sau egal
Diferit de

Page 52 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Exemple:
1. S se listeze toi studenii care au note mai mari de 8:

select st.nume_student, st.prenume_student, g.cod_grupa,


d.cod_disciplina, n.nota, au.cod_an_universitar
from studenti st, grupe g, studenti_grupe stg, ani_universitari au, note
n, discipline d
where st.pk_student = stg.pk_student
and stg.pk_grupa = g.pk_grupa
and stg.pk_an_universitar = au.pk_an_universitar
and stg.pk_student_grupa = n.pk_student_grupa
and n.pk_disciplina = d.pk_disciplina
and n.nota >8
order by nume_student,au.cod_an_universitar, g.cod_grupa
;
2. S se listeze toi studenii care au luat nota 7:

select st.nume_student, st.prenume_student, g.cod_grupa,


d.cod_disciplina, n.nota, au.cod_an_universitar
from studenti st, grupe g, studenti_grupe stg, ani_universitari au, note
n, discipline d
where st.pk_student = stg.pk_student
and stg.pk_grupa = g.pk_grupa
and stg.pk_an_universitar = au.pk_an_universitar
and stg.pk_student_grupa = n.pk_student_grupa
and n.pk_disciplina = d.pk_disciplina
and n.nota = 7
order by nume_student,au.cod_an_universitar, g.cod_grupa
;
3. Studenii, disciplinele i notele obinute dar exceptnd disciplina 'PSM1':

select st.nume_student, st.prenume_student, g.cod_grupa,


d.cod_disciplina, n.nota, au.cod_an_universitar
from studenti st, grupe g, studenti_grupe stg, ani_universitari au, note
n, discipline d
where st.pk_student = stg.pk_student
and stg.pk_grupa = g.pk_grupa
and stg.pk_an_universitar = au.pk_an_universitar
and stg.pk_student_grupa = n.pk_student_grupa
and n.pk_disciplina = d.pk_disciplina
and d.cod_disciplina <> 'PSM1'
order by nume_student,au.cod_an_universitar, g.cod_grupa
;

6.4.2 Operatori AND , OR, NOT


Clauza "where" poate conine mai multe fraze care mpreun s construiasc valoarea de adevr final.
Frazele sunt legate prin trei termeni cheie:

"and" : returneaz "true" numai dac toate frazele din compoziie sunt "true"
Page 53 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

"or" : returneaza "true" dac cel puin o fraz este "true".

"not" : inverseaz valoarea de adevr a frazei la care se aplic

Exemple:
1. Afieaz studenii care au obinut la disciplina ME nota 7 i nota 8:

select st.nume_student, st.prenume_student, g.cod_grupa,


d.cod_disciplina, n.nota, au.cod_an_universitar
from studenti st, grupe g, studenti_grupe stg, ani_universitari au, note
n, discipline d
where st.pk_student = stg.pk_student
and stg.pk_grupa = g.pk_grupa
and stg.pk_an_universitar = au.pk_an_universitar
and stg.pk_student_grupa = n.pk_student_grupa
and n.pk_disciplina = d.pk_disciplina
and d.cod_disciplina = 'ME'
and (n.nota=7 and n.nota=8 )
order by nume_student
;
Evident, selectul nu aduce nici o linie, nu exist nici un student care s aib n acelai timp nota 7 i nota 8
la aceeai disciplin. Corect este:

select st.nume_student, st.prenume_student, g.cod_grupa,


d.cod_disciplina, n.nota, au.cod_an_universitar
from studenti st, grupe g, studenti_grupe stg, ani_universitari au, note
n, discipline d
where st.pk_student = stg.pk_student
and stg.pk_grupa = g.pk_grupa
and stg.pk_an_universitar = au.pk_an_universitar
and stg.pk_student_grupa = n.pk_student_grupa
and n.pk_disciplina = d.pk_disciplina
and d.cod_disciplina = 'ME'
and (n.nota=7 or n.nota=8 )
order by nume_student
;
2. S nu uitm s punem parantezele rotunde:

select st.nume_student, st.prenume_student, g.cod_grupa, d.cod_disciplina,


n.nota, au.cod_an_universitar
from studenti st, grupe g, studenti_grupe stg, ani_universitari au, note n,
discipline d
where st.pk_student = stg.pk_student
and stg.pk_grupa = g.pk_grupa
and stg.pk_an_universitar = au.pk_an_universitar
and stg.pk_student_grupa = n.pk_student_grupa
and n.pk_disciplina = d.pk_disciplina
and d.cod_disciplina = 'ME'
and n.nota=7 or n.nota=8
order by nume_student
;

Page 54 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Dac uitm de paranteze, atunci obinem sute de mii de linii cu informaii eronate, deoarece pentru fiecare
nota de 8 din tabela note se repet selectul iniial.
Mai sunt disponibili i ali operatori de relaie care ne ajut la construirea clauzei "where":

6.4.3 Operatorul "between"


Acest operator stabilete un interval n care se afl informaia selectat:
Exemplu: afieaz studenii cu notele cuprinse n intervalul [5, 8]:

select st.nume_student, st.prenume_student, g.cod_grupa,


d.cod_disciplina, n.nota, au.cod_an_universitar
from studenti st, grupe g, studenti_grupe stg, ani_universitari au, note
n, discipline d
where st.pk_student = stg.pk_student
and stg.pk_grupa = g.pk_grupa
and stg.pk_an_universitar = au.pk_an_universitar
and stg.pk_student_grupa = n.pk_student_grupa
and n.pk_disciplina = d.pk_disciplina
and d.cod_disciplina = 'ME'
and n.nota between 5 and 8
order by nume_student
;

6.4.4 Operatorul "in"


Stabilete o list de valori n care se afl informaia selectat:
Ex: afieaz studenii cu notele incluse n mulimea { 3, 4, 6, 8} :

select st.nume_student, st.prenume_student, g.cod_grupa,


d.cod_disciplina, n.nota, au.cod_an_universitar
from studenti st, grupe g, studenti_grupe stg, ani_universitari au, note
n, discipline d
where st.pk_student = stg.pk_student
and stg.pk_grupa = g.pk_grupa
and stg.pk_an_universitar = au.pk_an_universitar
and stg.pk_student_grupa = n.pk_student_grupa
and n.pk_disciplina = d.pk_disciplina
and d.cod_disciplina = 'ME'
and n.nota in (4,6,8)
order by nume_student
;

6.4.5 Operatorul "like"

Page 55 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Este operatorul care ne scoate din ncurctur cnd nu tim ce cutm, ci doar bnuim. Dac nu tiu
numele complet al unui student, ci doar cteva caractere, atunci folosesc clauza like pentru filtrarea liniilor.
1. Ex: caut studenii de la litera A:

select * from studenti


where studenti.nume_student like 'A%';

Deci scriem n clauza where caracterele pe care le tim sigur ("A") i pentru restul caracterelor punem
simbolul "%". Fraza select anterioar se traduce: adu-mi toi studenii al cror nume ncepe cu litera "A".
2. Toate fetele din facultate (prenumele se termina cu litera 'a' sau 'A')

select * from studenti


where (prenume_student like '%a' or prenume_student like '%A');

Ca s nu cutm n zadar, utilizm funcia "upper" ce transform toate literele n majuscule :

select st.nume_student, st.prenume_student, upper(st.prenume_student)


from studenti st
where upper(prenume_student) like '%A';

3. M mai pot juca cu operatorul "like"; vreau toi studentii care au n componena numelui irul de
caractere "ut":

select st.nume_student, st.prenume_student, upper(st.prenume_student)


from studenti st
where upper(prenume_student) like '%UT%';

6.4.6 Clauza distinct


Sa afim studenii i grupele din care fac parte:

select st.nume_student, st.prenume_student, g.cod_grupa


from studenti st, grupe g, studenti_grupe stg
where st.pk_student = stg.pk_student
and stg.pk_grupa = g.pk_grupa
order by nume_student, g.cod_grupa
;

Page 56 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

In rezultat Iacob Adelina apare de dou ori pentru ca a repetat anul colar, deci a fost de dou ori n
aceeai grup (chiar dac n ani universitari diferii).
Daca vreau s afiez doar liniile distincte, ce nu repet informaia afiat de alte linii, folosesc clauza
"distinct":

select distinct st.nume_student, st.prenume_student, g.cod_grupa


from studenti st, grupe g, studenti_grupe stg
where st.pk_student = stg.pk_student
and stg.pk_grupa = g.pk_grupa
order by nume_student, g.cod_grupa
;

Directiva "distinct" nltur informaia care se repet n rezultatul frazei select. In acest fel, studenii vor fi
afiai o singur dat, indiferent de numrul de nregistrri gsite n tabela studenti.
Dar dac se afieaz i pk_an_universitar, atunci Iacob Adelina apare iari de dou ori, pentru c, n acest
caz, liniile nu mai sunt identice.

select distinct st.nume_student, st.prenume_student, g.cod_grupa,


stg.pk_an_universitar
from studenti st, grupe g, studenti_grupe stg
where st.pk_student = stg.pk_student
and stg.pk_grupa = g.pk_grupa
order by nume_student, g.cod_grupa
;

6.4.7 Operatorul "is null"


O valoare nul e o valoare care nu e disponibil, neatribuit, necunoscut i neaplicabil. Adic, oriunde
folosim null ntr-o expresie, toat expresia devine null (false). Nu pot folosi expresii de tipul =null, sau
<>null.
De exemplu, m intereseaz studenii ce nu au numr matricol; ncercm fraza urmtoare:

select * from studenti where nr_matricol = null;

Evident, nu aduce nici o linie, am fcut o greeal evident, am pus null ntr-o expresie logic.
Corect ar fi n felul urmtor:

select * from studenti where nr_matricol is null;

Page 57 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Si viceversa, vrem s vedem studenii care au numr matricol:

select * from studenti where nr_matricol is not null;

Clauza ORDER BY
Clauza "order by" se folosete pentru a ordona liniile aduse de fraza select. Intotdeauna aceast clauz se
pune ultima ntr-o fraz select. Liniile aduse de select nu sunt ordonate, de aceea e posibil ca acelai select
rulat de mai multe ori s aduc liniile n ordine diferite. Order by rezolv aceast problem, prin ordonare,
aceeai linie va fi tot timpul la locul ei.
S vedem studenii n ordinea alfabetic:

select st.nume_student, st.prenume_student


from studenti st
where st.nr_matricol is null
order by st.nume_student, st.prenume_student;

Implicit "order by" lucreaz ascendent, adic de la valoare mic spre valoare mare. Dar dac vreau s-i
afiez n ordine invers, folosesc clauza "desc":

select st.nume_student, st.prenume_student


from studenti st
where st.nr_matricol is null
order by st.nume_student desc, st.prenume_student desc;

Deci folosesc clauza "desc" (de la descendent) i schimb ordinea de listare. Pentru ordinea ascendent
folosesc cuvntul "asc" (dar acesta este implicit, nu trebuie scris neaprat).
Pot face ordonarea dup mai multe coloane, i pun n ordinea notelor, dar la aceeai not, s fie n ordinea
alfabetic:

select st.nume_student, st.prenume_student, g.cod_grupa,


d.cod_disciplina, n.nota, au.cod_an_universitar
from studenti_grupe stg, studenti st, ani_universitari au, grupe g,
specializari s,
discipline d, note n
where stg.pk_student = st.pk_student
and stg.pk_an_universitar = au.pk_an_universitar
and stg.pk_grupa = g.pk_grupa
and g.pk_specializare = s.pk_specializare
and s.pk_specializare = d.pk_specializare
and g.pk_an_studiu = d.pk_an_studiu
and n.pk_student_grupa = stg.pk_student_grupa
and n.pk_disciplina = d.pk_disciplina
order by n.nota desc, st.nume_student
;
Page 58 of 102

Baze de date
Project no.
Document no.

BD 2011

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

La prima vedere pare ilogic s pun order by dup nume_stud, deoarece aceast coloan nu este de tip
number, ca s-o poi ordona. Dar s ne amintim c, toat informaia din calculator este sub form de
numere, deci are sens ordonarea. Literele din cadrul numelui studentului sunt memorate sub forma unor
numere ce corespund codurilor ASCII ale acelor litere. Nu ntmpltor, codurile ASCII ale literelor
corespund ordinii din alfabet (litera "a" are codul ASCII mai mic dect litera "b").
Exerciii:
1. S se afieze disciplinele studiate de grupele 6403 i 6404:

select g.cod_grupa,
d.cod_disciplina
from grupe g, specializari s,discipline d
where g.pk_specializare = s.pk_specializare
and s.pk_specializare = d.pk_specializare
and g.cod_grupa in ('6403','6404')
order by g.cod_grupa
;

Page 59 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

7 Funcii SQL
Adesea avem nevoie ca informaia adus de fraza select s fie prelucrat nainte de afiare. Vreau s m
asigur c toi studenii vor fi afiai cu litere mari. In acest caz folosesc funcia "upper" ce prelucreaz
informaia de pe fiecare rnd al rezultatului adus de fraza select:

select upper(nume_student) from studenti;

Nu-mi place titlul coloanei adus de fraza select, a dori s se numeasc "nume student":

select upper(nume_student) "nume student" from studenti ;

SQL permite definirea de alias-uri pentru nume de coloane astfel nct acestea s fie ct mai explicite.
Aceste alias-uri trebuie s urmeze imediat dup numele coloanei n fraza select i trebuie scrise folosind
ghilimele.
Funciile SQL se mpart n dou tipuri: funcii de un singur rnd , care ntorc cte un rezultat pentru fiecare
linie adus de fraza select, i funcii de grup ce prelucreaz informaia de pe mai multe linii i returneaz o
valoare pentru ntreg grupul de linii.
In continuare sunt listate cteva funcii de rnd care se ntlnesc n mod frecvent n practica SQL:

Funcii pentru prelucrarea irurilor de caractere


1. Funcie
LOWER
UPPER
INITCAP

2. Rezultat
Face conversia caracterelor alfabetice n litere mici
Face conversia caracterelor alfabetice in litere mari
Face conversia pentru primul caracter din fiecare cuvnt n litera

CONCAT(exp1,exp2)
SUBSTR(expresie,

mare iar pentru restul caracterelor conversia se face n litere mici


Concateneaz cele dou expresii
Intoarce n caractere din cadrul expresiei ncepnd cu pozitia m.

m/,n/)

Daca m este negativ atunci poziia de nceput a numrrii este


ultimul caracter din ir. Dac n este omis atunci funcia ntoarce

LENGTH(expresie )
INSTR(expresie ,"sir")

toate caracterele de la poziia m pna la sfritul irului.


Intoarce numarul de caractere din expresie
Caut irul de caractere "sir" n expresie i ntoarce poziia unde a
fost gsit.

Exemple:
Page 60 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

vrem sa facem un raport simplu in care fiecare student sa apar numai cu primele 3 litere
din nume (facem o prescurtare):

select substr(nume_student,1,3) from studenti where rownum < 4;

Am pus condiia rownum < 4 ca s aduc numai 3 linii din rezultatul selectului. Rownum este o coloan
implicit construit de motorul SQL n care se pstreaz numrul liniei curente.

Funcii pentru valori numerice

funcia round (numar, n): rotunjete numrul la n zecimale. Dac n lipsete, se rotunjete
la partea ntreag. Rotunjirea se face prin adaos (dac numrul zecimal se apropie mai
mult de ntregul superior, sau prin lips).

funcia trunc (numar, n): similar cu round numai c se face trunchiere, adic rotunjire prin
lips ntotdeauna

funcia mod(n,m): ntoarce restul mpririi lui n la m

select round(2.55) , round(2.49), trunc(2.55), mod(5,4) from dual;

select round(2.55,1) , round(2.49,1), trunc(2.55,2), mod(8.2,3.3) from dual;

Tabela "dual" este o tabel creat automat sub user-ul "sys" i este accesibil tuturor utilizatorilor. Are o
singur coloan "dummy" cu o singur linie "X":

select * from dual;

Se utilizeaz cnd vrem s afim diverse informaii care nu sunt n tabele din baza de date. Vreau s
afiez rezultatul mpririi lui 3 la 2:

select 3/2 from dual;

Page 61 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Nu exist alt posibilitate de a afia informaie dect prin fraza select, care are o sintax fixat: select ...
from nume_tabel, de aceea am nevoie de tabela "dual".

Funcii pentru date calendaristice


Datele calendaristice ocup un capitol important n cadrul SQL deoarece foarte multe informaii sunt legate
de date calendaristice. Oracle memoreaz data calendaristic sub forma unui numr ce reine urmtoarele
valori: secol, an, luna, zi, ora, minute, secunde. Coloanele din tabele care conin date calendaristice sunt
definite cu tipul "date", similar cu "number" pentru numere sau "varchar2" pentru caractere.

funcia sysdate: returneaz data curent (citit din memoria CMOS a calculatorului):

select sysdate "data curenta" from dual;

select trunc(sysdate ,'mm') from dual;

select sysdate + 1 from dual;

Un ntreg adunat (sau sczut) la o dat calendaristic crete acea dat cu 1 zi. Vreau s cresc cu 7 ore de
exemplu, adun la data respectiv 7/24:

select sysdate + 7/24 from dual;

funcia months_between(data1, data2): returneaz numrul de luni ntre cele dou date,
numr ce poate fi negativ dac data2 e mai mica dect data1.

add_month(data,n): adun n luni la data, n poate fi i negativ

next_day(data,'nume_zi'): gsete data cnd cade prima dat ziua 'nume_zi' ce urmeaz
dup data:

select next_day(sysdate,'monday') from dual;

last_day(data): aduce ultima zi din luna n care se afl data:

Page 62 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

select last_day('23-sep-05') from dual;

Exerciii:
1. S se gseasc prima zi din luna urmtoare lunii curente:

select last_day(sysdate) + 1 from dual;

2. S se gseasc cnd cade prima zi de vineri din luna viitoare:

select next_day(last_day(sysdate),'friday') from dual;

3. S se calculeze vrsta unui student pornind de la data lui de natere

Funcii pentru conversia tipului de date


Sunt funcii ce permit conversia unui ir de caractere ntr-un numr sau ntr-o dat calendaristic sau
invers: din numr n ir de caractere.

7.4.1 Conversia datelor de tip "date" n iruri de caractere

funcia to_char(expresie, format): convertete valoarea expresiei ntr-un ir de caractere


conform specificaiilor date n cmpul format.

Vrem s afim data curent (sysdate), dar ntr-un format specific: zi-luna-an:

select to_char(sysdate,'dd-mon-yy') from dual;

Sunt permise o mulime de formate pentru afiarea unei date calendaristice. Prezentm n continuare doar
cteva mai semnificative:
YYYY sau YY sau Y
MM
MONTH
MON
WW sau W
DDD sau DD sau D
DAY

Ultimele 4,2 sau 1 cifr din an


Luna scris cu dou cifre
Numele ntreg al lunii scris pe 9 caractere
Luna scris pe 3 caractere
Saptamna din an sau luna
Ziua din an ,luna sau saptamna.
Denumirea complet a zilei completat eventual
Page 63 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

DY

cu spaii pn la 9 caractere.
O abreviaie a denumirii unei zile format din trei

AM sau PM
A.M. sau P.M.
HH sau HH12 sau HH24
MI
SS
SSSSS

litere
indicator de meridian
indicator de meridian cu puncte
ora
minute (0-59)
secunde (0-59)
Numarul de secunde ncepnd cu miezul noptii

Exemplu:

select to_char(sysdate,'ww') nr_saptamana_an, to_char(sysdate,'day-mon-yy') zi_luna_an


from dual;

select to_char(sysdate,'day -> hh24:mm:ss') from dual;

7.4.2 Conversia numerelor n iruri de caractere


Funcia to_char este utilizat i pentru conversia numerelor n iruri de caractere:

select to_char(21.4) from dual;

Avem diverse formate sub care putem afia valorile numerice:

select to_char(234567.1,'999,999,999.00')format_suficient ,
to_char(234567,'9,999.00') format_prea_mic,

to_char(234567,'$999,999,999.00')

cu_dolar,

to_char(23.48,'999,999.0')

rotunjire_zecimale,

to_char(23.67,'999,999') fara_zecimale
from dual;

Dac nu specificm un format funcia to_char afieaz numrul aa cum este, fr separatoare sau
rotunjiri. Prin cmpul de formatare scris ntre apostrofuri sunt definite numrul de cifre pentru afiare, poziia
virgulei de separare, numrul de zecimale, afiare cu moned, etc. Observm c dac numrul de cifre
Page 64 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

specificat n cmpul de formatare este prea mic, atunci to_char afieaz semnul (#) n locul valorii
numerice.

7.4.3 Conversia datelor de tip text in format "date"

funcia to_date(expresie, format):

Funcia to_date (expresie, format) returneaz o valoare de tip dat calendaristic calculat pe baza
expresiei ce se interpreteaz conform irului din cmpul format.

select to_date('01/02/05','dd/mm/yy') "zi/luna/an" ,

to_date('01/02/05','mm/dd/yy') "luna/zi/an",
to_date('01-feb-05','dd-mon-yy') "zi-luna-an",
to_char(to_date('01-feb-05','dd-mon-yy'),'dd-mon-yy') "zi-luna-an cu to_char"
from dual;

Prin funcia to_date transformm un ir de caractere ntr-o dat. Intotdeauna avem probleme cu
interpretarea unui ir de caractere ce reprezint o dat calendaristic. S lum de exemplu textul
"01/02/05"; poate fi interpretat ca fiind 1 februarie 2005 dac lucrm dup modelul romnesc, sau foarte
bine, poate fi 2 ianuarie 2005 interpretat dup modelul american: mm/dd/yy (ei pun luna n faa zilei). De
aceea, cnd transformm un ir de caractere n dat trebuie s specificm formatul. Mai ru este pentru cel
care utilizeaz programul, vede data 01/02/2005 i nu tie cum s-o interpreteze. In acest caz, data se
afieaz prin funcia to_char n care putem specifica exact cum trebuie s apar data la utilizator. Indicat
este s se utilizeze formatul cu litere pentru afiarea lunii, astfel nct s dispar orice dubii n citirea datei
calendaristice.
In coloana 3 din exemplul precedent, chiar dac am utilizat formatul de citire a date sub forma 'dd-mon-yy',
ea a fost afiat tot cu cifre : 1/02/2005. Aceast afiare depinde de modul cum a fost setat programul SQL
Navigator, sau, dac se utilizeaz SQL Plus de setrile din regitrii Windows: run ->regedit
->hkey_local_machine -> software ->oracle -> nls_date_format. Ca s nu mai depind de aceste setri ce
pot diferi de la un calculator la altul, am folosit funcie to_char (coloana 4 din exemplul de mai sus).

7.4.4 Conversia textului in format numeric

funcia to_number(sir_caractere, format):

Page 65 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Prin to_number se returneaz un numr pornind de la un ir de caractere. Acest ir este interpretat conform
formatului specificat i tradus ntr-un numr. Dac cele dou cmpuri nu corespund, funcia to_number d
eroare.

select

TO_NUMBER('100.00',

'9G999D99'),

TO_NUMBER('5,342',

'9G999D99'),

TO_NUMBER('5,342.14', '9G999D99') from dual;

Funcia DECODE
Decode este o funcie foarte puternic ce permite implementarea unei structuri de programare n codul
SQL. Funcia nu este standard SQL, ea fiind specific motorului Oracle. Prin funcia decode putem simula
structura if - else specific oricrui limbaj de programare n sensul c putem selecta informaie diferit n
funcie de anumite rezultate obinute n procesul rulrii.
Formatul funciei este:
decode (expresie,

prima_varianta , rezultat1,
a_doua_varianta, rezultat2,
.............. ,
rezultat_default

);
Se evalueaz expresia i se compar valoarea acesteia cu variantele scrise n partea a doua a funciei. In
caz c valoarea expresiei coincide cu o variant, se ntoarce rezultatul corespunztor acelei variante, n caz
contrar se ntoarce "rezultat_default".
Exemplu: s zicem c profesorul de la disciplina IB (Instrumentatie de Bord) vrea s mreasc la
toi studenii nota cu 1 punct, iar profesorul de ME vrea s micoreze notele cu 1 punct. Deci trebuie s
facem un select din tabela note, dar acest select s se comporte diferit, n funcie de valoarea rndului
"cod_disciplina".
select stg.pk_student_grupa, st.nume_student, st.prenume_student, g.cod_grupa,
d.cod_disciplina, n.nota,
decode(d.cod_disciplina, 'IB', decode(n.nota, 10, 10, n.nota +1),
'ME',n.nota - 1,
n.nota) Nota_Modificata,
ast.cod_an_studiu, au.cod_an_universitar
from studenti_grupe stg, studenti st, ani_universitari au, grupe g,
specializari s,
discipline d, ani_studiu ast, note n
Page 66 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

where stg.pk_student = st.pk_student


and stg.pk_an_universitar = au.pk_an_universitar
and stg.pk_grupa = g.pk_grupa
and g.pk_specializare = s.pk_specializare
and s.pk_specializare = d.pk_specializare
-and g.cod_grupa = '6303'
and g.pk_an_studiu = d.pk_an_studiu
and g.pk_an_studiu = ast.pk_an_studiu
and n.pk_student_grupa = stg.pk_student_grupa
and n.pk_disciplina = d.pk_disciplina
order by d.cod_disciplina
;

Se observ c la acelai student nota de la IB a crescut cu 1 punct n timp ce la ME a sczut cu aceeai


valoare.

Funcii de grup
7.6.1 Functii matematice de grup
Aceste funcii nu se aplic unei singure linii, ele calculeaz informaii caracteristice unui grup de rnduri:
max, min, avg, count(*), sum.
select max(nota),round(avg(nota),2), min(nota), sum(nota),
count(*), round(sum(nota)/count(*),2) from note;

In exemplul de mai sus am extras cteva informaii globale ale tabelei "note":

max(nota_finala) : calculeaz cea mai mare valoare din coloana "nota_finala". Chiar dac
sunt mai multe note de 9, funcia max returneaz o singur valoare

min(nota_finala) : returneaz cea mai mica valoare din coloana "nota_finala";


Page 67 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

avg (nota_finala): calculeaz media aritmetic a notelor obinute de studeni;

sum(nota_finala) : calculeaz suma tuturor notelor;

count(*) : returneaz numarul de linii din tabela sit_final.

Un avantaj al acestor funcii e c nu prea sunt ncurcate de valoarea null gsit pe anumite linii. Acea linie
care are valoarea null este ignorat pur i simplu n calcularea valorilor cumulate. Putem verifica acest
lucru printr-un mic experiment. Hai s introducem o nou linie n tabela note dar fr not :
update note set nota = null where pk_nota = 68;
i acum ne uitm dac s-a introdus linia:

select * from note;

i s calculm din nou valorile min, max....


Suma a rmas aceeai, count(*) s-a schimbat i are dreptate, count(*) returneaz numrul de linii ale
tabelei "note". Din aceast cauz nu a mai ieit corect nici media aritmetic calculat de noi sub forma
sum(nota)/count(*). S observm totui c media calculat cu avg(nota_finala) este corect, deci funcia
tie s trateze valoarea null n mod corect.
Putem i noi s calculm corect media dac numrm numai liniile care au nota_finala diferit de
null: count(nota):
select max(nota),round(avg(nota),2), min(nota), sum(nota),
count(*), round(sum(nota)/count(nota),2) from note;
Funciile min, max pot fi folosite i pentru coloane care nu sunt n mod necesar de tip numeric. Aceste
funcii au sens i pentru iruri de caractere sau date calendaristice:

select min(nume_student), max(nume_student) from studenti ;

Evident, min(nume_stud) nu aduce studentul cu cel mai mic nume (adic format din cel mai mic numr de
caractere), ci primul student n ordinea alfabetic din grupul selectat.
Dac vreau s vd cte caractere are cel mai mic nume (fr prenume) scriu urmtorul select:
Page 68 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

select min(length(substr(nume_student,1,instr(nume_student,' ')-1)))


from studenti;

7.6.2 Clauza "group by"


Pn acum am calculat max,min, medie pentru tot tabelul "note". Dar aceste valori nu-mi spun mare lucru,
degeaba calculez eu media notelor pentru toi anii de studii, la toate materiile i-n toi anii colari.
M intereseaz de exemplu s tiu care a fost media pentru disciplina ME, media pentru AE, min, max pe
aceste discipline s pot face comparaii, s trag eventual semnale de alarm n caz c apar nite situaii
catastrofale.
S afim notele obinute pe discipline:
select d.cod_disciplina, n.nota
from discipline d, note n
where n.pk_disciplina = d.pk_disciplina
order by d.cod_disciplina
;
S calculm media notelor la fiecare disciplin:
select d.cod_disciplina, round(avg(n.nota),2)
from discipline d, note n
where n.pk_disciplina = d.pk_disciplina
order by d.cod_disciplina
;

select d.cod_disciplina, round(avg(n.nota),2)


from discipline d, note n
where n.pk_disciplina = d.pk_disciplina
group by d.cod_disciplina
order by d.cod_disciplina
;
Evident c Oracle a dat eroare, ca s calculeze media, trebuie sa-i spui cum s grupeze liniile; media
nseamn c exist un grup, deci trebuie precizat cum se formeaz grupul. Cnd se afieaz doar rezultatul
funciei pe un ntreg tabel, nu avem nevoie de clauza "group by", funcia face media pentru tot tabelul. In
cazul c dorim s vedem i codul disciplinei, atunci trebuie s grupez liniile dup acest cod. Grupurile se
formeaz cu clauza "group_by":
Deci, prima regul: dac vrem s afim o coloan ntr-un select ce folosete o funcie de grup, acea
coloan trebuie s fie inclus n clauza "group by", altfel Oracle d eroare.

S ncercm o alt situaie: care sunt disciplionele de la care s-au obinut medii sub 8?
Page 69 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

select d.cod_disciplina, round(avg(n.nota),2)


from discipline d, note n
where n.pk_disciplina = d.pk_disciplina
and round(avg(n.nota),2) < 8
group by d.cod_disciplina
order by d.cod_disciplina
;

Nu-i bun, nu pot folosi funciile de grup n clauza where. Pentru a face filtrri cu ajutorul funciilor de grup
folosim clauza "having":

select d.cod_disciplina, round(avg(n.nota),2)


from discipline d, note n
where n.pk_disciplina = d.pk_disciplina
group by d.cod_disciplina
having round(avg(n.nota),2) < 8
order by d.cod_disciplina
;

Funciile de grup sunt foarte utile cnd sunt necesare statistici i rapoarte finale. Cu ajutorul lor putem
sintetiza informaia care s reflecte aspecte globale ale tabelelor.
Exerciii:
-

Care este cel mai bun student din grupa sa?

Studenii care repet anul colar (se regsesc de dou ori n acelai an de studiu pe ani
universitari diferii)

Studenii care sunt peste media din grupa lor

Page 70 of 102

Baze de date
Project no.
Document no.

BD 2011

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

8 Subinterogri
Constructia clauzei "where" prin subinterogare
De multe ori se ntmpl s nu putem scrie exact valorile care ne intereseaz n clauza where. De exemplu,
trebuie s dau un raport cu studenii care au obinut cea mai mare not la o sesiune de examene. Problema
e c eu nu tiu care este acea not, poate fi 10, sau 9, sau 8 sau..... Ar trebui s aflu mai nti care este cea
mai mare nota n sesiunea respectiv, iar aceast valoare se afl n mod dinamic printr-un select interior:
select st.nume_student, st.prenume_student, d.cod_disciplina, n.nota
from studenti st, studenti_grupe stg, note n, discipline d, ani_universitari
ani
where st.pk_student = stg.pk_student
and stg.pk_an_universitar = ani.pk_an_universitar
and stg.pk_student_grupa = n.pk_student_grupa
and n.pk_disciplina = d.pk_disciplina
and d.cod_disciplina = 'PSM1'
and ani.cod_an_universitar = '2011-2012'
and n.nota = (
select max(n.nota)
from studenti_grupe stg, ani_universitari ani, note n, discipline d
where n.pk_disciplina = d.pk_disciplina
and n.pk_student_grupa = stg.pk_student_grupa
and stg.pk_an_universitar = ani.pk_an_universitar
and d.cod_disciplina = 'PSM1'
and ani.cod_an_universitar = '2011-2012'
)
;
Dac uneori se ntmpl ca subinterogarea s aduc mai mult de o linie, ceea ce duce la eroare Oracle,
este foarte posibil ca subinterogarea s nu aduc nici o linie, ceea ce propag null-ul i la interogarea
principal i nu se afieaz nimic.
De exemplu, dac n selectul inferior greim codul disciplinei, atunci tot selectul principal d gre:
select st.nume_student, st.prenume_student, d.cod_disciplina, n.nota
from studenti st, studenti_grupe stg, note n, discipline d, ani_universitari
ani
where st.pk_student = stg.pk_student
and stg.pk_an_universitar = ani.pk_an_universitar
and stg.pk_student_grupa = n.pk_student_grupa
and n.pk_disciplina = d.pk_disciplina
and d.cod_disciplina = 'PSM1'
and ani.cod_an_universitar = '2011-2012'
and n.nota = (
select max(n.nota)
from studenti_grupe stg, ani_universitari ani, note n, discipline d
Page 71 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

where n.pk_disciplina = d.pk_disciplina


and n.pk_student_grupa = stg.pk_student_grupa
and stg.pk_an_universitar = ani.pk_an_universitar
and d.cod_disciplina = 'Psm1'
and ani.cod_an_universitar = '2011-2012'
)
;

S mai rezolvm o problem: toi studenii a cror medie pe un an universitar este mai mare dect
media notelor pe acel an universitar:

select st.nume_student, st.prenume_student, avg(n.nota)


from studenti st, studenti_grupe stg, note n, ani_universitari ani
where st.pk_student = stg.pk_student
and stg.pk_an_universitar = ani.pk_an_universitar
and stg.pk_student_grupa = n.pk_student_grupa
and ani.cod_an_universitar = '2011-2012'
group by st.nume_student, st.prenume_student
having avg(n.nota) > (
select avg(n.nota) from note n, studenti_grupe stg, ani_universitari ani
where stg.pk_student_grupa = n.pk_student_grupa
and stg.pk_an_universitar = ani.pk_an_universitar
and ani.cod_an_universitar = '2011-2012'
)
;

Coloane obinute prin subinterogri


O facilitate important a sintaxei SQL este c putem scrie subinterogri chiar n cmpul destinat coloanelor
dintr-o fraz select. Am vzut c o coloan din fraza select trebuie s fie un cmp dintr-un tabel inclus n
clauza "from". Dar nu-i obligatoriu, putem construi coloane distincte printr-o subinterogare ce se leag la
interogarea principal. Trebuie s fim ateni doar ca aceast subinterogare s nu aduc mai mult de o
valoare, pentru c atunci am obine eroare. Nu se pot afia mai multe valori n aceeai linie i aceeai
coloan.
De exemplu, a dori s afiez intr-un select numele studenilor, disciplinele studiate, notele obinute, dar i
media notelor obinute la acea disciplin de ceilali studeni. In felul acesta, a putea face o evaluare mai
corect a notei obinute de student, dac pot s-o compar cu media celorlali (nota 9 nu reprezint o
realizare de exemplu, cnd media pe disciplin este 9.50).

select st.nume_student, st.prenume_student, d.cod_disciplina, n.nota,


(select round(avg(nota),2)
from note where note.pk_disciplina = n.pk_disciplina
) medie_disciplina
from studenti st, studenti_grupe stg, note n, discipline d,
ani_universitari ani
where st.pk_student = stg.pk_student
and stg.pk_an_universitar = ani.pk_an_universitar
and stg.pk_student_grupa = n.pk_student_grupa

Page 72 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

and n.pk_disciplina = d.pk_disciplina


and ani.cod_an_universitar = '2011-2012'
;
In selectul de mai sus, s-a calculat media pe disciplin printr-un subselect care se leag la valoarea
"pk_disciplina" din selectul principal.

Tabele intermediare
Complicm puin lucrurile: care sunt studenii ce au media notelor peste media grupei din care face parte
fiecare (cei mai buni studeni din grupa lor).
Deja problema s-a complicat: trebuie s gsim media fiecrui student i s comparm acea medie cu
media grupei din care face parte studentul. Selectul ar fi mai simplu dac a avea n baz dou tabele:
-

Un tabel care s dea studentul, grupa din care face parte i media obinut de student

Un tabel ce conine grupa i media pe acea grup

Dac a avea acele tabele, atunci selectul se construiete mult mai simplu. Oracle permite definirea unor
tabele temporare, bazate pe un select i care pot fi utilizate n acel select specific:
select st.nume_student, st.prenume_student, medie_studenti.medie_stud
, medie_grupe.cod_grupa, medie_grupe.medie_grupa
from studenti st, studenti_grupe stg,
(
select g.pk_grupa , g.cod_grupa, round(avg(nota),2) medie_grupa
from grupe g, studenti_grupe stg, note n
where g.pk_grupa = stg.pk_grupa
and stg.pk_student_grupa = n.pk_student_grupa
group by g.pk_grupa, g.cod_grupa
)medie_grupe,
(select st.pk_student, round(avg(nota),2) medie_stud
from studenti st, studenti_grupe stg, note n
where st.pk_student = stg.pk_student
and stg.pk_student_grupa = n.pk_student_grupa
group by st.pk_student
) medie_studenti
where st.pk_student = stg.pk_student
and stg.pk_grupa = medie_grupe.pk_grupa
and st.pk_student = medie_studenti.pk_student
and medie_stud > medie_grupa
order by cod_grupa
;
In clauza "from" am adugat cele dou selecturi, le-am dat denumire de tabele i am putut s le utilizm n
selectul superior.

Page 73 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Am vzut n acest capitol ct de puternic poate deveni instruciunea SELECT. In afara selectrii clasice a
informaiilor din tabelele bazei de date, selectul permite utilizarea subselecturilor n clauza where (care n
plus, pot face referire la tabelele din selectul superior) i, de asemenea, permite construirea de tabele
temporare n clauza from (select din select).

Vizualizri
Vizualizrile sunt tabele virtuale create printr-un select din alte tabele. Am vzut n subcapitolul anterior ce
util a fost s creez tabele intermediare cu mediile studenilor, sau mediile grupelor. Alt exemplu, mi-ar fi
foarte util s am un tabel n care s gsesc numele studentului, specializarea, codul grupei din care face
parte, notele obinute i disciplinele la care a obinut note. Cu un asemenea tabel a putea lucra mult mai
uor cnd fac selecturile.
De ce nu se creeaz asemenea tabele? Una din regulile proiectrii bazei de date spune c un tabel nu
trebuie s conin informaii amestecate, cu identiti i funcii diferite. Ce facem dac se modific o
denumire de specializare? Modificm toate liniile tabelului?
Oracle mi vine n ajutor i m las s-mi fac un tabel virtual care s conin aceste cmpuri. Dar nu este un
tabel propriu-zis, ci o imagine ce oglindete informaia din tabelele de baz. In felul acesta, orice modificare
ntr-un tabel de baz apare n mod automat i n imaginea sa din tabela virtual. Aceste tabele se numesc
vizualizri ( VIEW ) i se construiesc cu ajutorul instruciunii select:

Creez un view numit "medie_grupe" care s conin toate grupele i media notelor pe acea grup
n fiecare an universitar:

create or replace view medie_grupe as


select g.pk_grupa , g.cod_grupa, round(avg(nota),2) medie_grupa,
ani.pk_an_universitar
from grupe g, studenti_grupe stg, note n, ani_universitari ani
where g.pk_grupa = stg.pk_grupa
and stg.pk_student_grupa = n.pk_student_grupa
and stg.pk_an_universitar = ani.pk_an_universitar
group by g.pk_grupa, g.cod_grupa, ani.pk_an_universitar
;
Alt view numit "student_grupe_note" ce conine studenii cu grupele din care fac parte, disciplinele
studiate i notele obinute:

create or replace view studenti_grupe_note as


select stg.pk_student_grupa, st.nume_student, st.prenume_student,
g.cod_grupa, d.cod_disciplina, n.nota, ani.pk_an_universitar

Page 74 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

from studenti st, studenti_grupe stg, grupe g, note n, discipline


d, ani_universitari ani
where st.pk_student = stg.pk_student
and stg.pk_an_universitar = ani.pk_an_universitar
and stg.pk_grupa = g.pk_grupa
and stg.pk_student_grupa = n.pk_student_grupa
and n.pk_disciplina = d.pk_disciplina
;
In acest moment am un nou tabel n baz (chiar dac este virtual) din care pot s fac select :

select * from studenti_grupe_note;

Numai c acesta nu este un tabel obinuit, este un tabel logic n care nu pot face modificri, inserri, etc.
Este o oglind unde am grupat n mod avantajos informaia din tabelele de baz astfel nct s am acces
mai uor asupra datelor de interes.

Recapitulare:
In acest capitol am vzut ct de performant poate fi o fraz select, ce faciliti extraordinare ne ofer
pentru cutarea i filtrarea datelor. Dac facem acum o comparaie cu modul de stocare a datelor n fiiere,
unde n afar de un suport de stocare aceste fiiere nu-mi ofer nimic, observm c stocarea datelor n
baza de date este de departe mult mai avantajoas.
Bineneles, informaia introdus i analizat n tabelele de lucru din acest curs este ultraminimal, ca s nu
ocupm spaiul inutil afind rezultatele selecturilor i s putem urmri firul rezultatelor. In practic ns, pe
acelai principiu se pot stoca informaii mult mai ample, cu zeci sau sute de mii de studeni. Un ntreg
centru universitar se introduce n aceeai baz de date ce ruleaz pe un singur calculator i fiecare
profesor, student, secretar de la diverse faculti sau universiti intr cu parola sa prin intermediul
internetului i introduce sau vizualizeaz datele la care are dreptul. Putem gndi mai departe s crem o
baz unic cu toi studenii din ar .a.m.d. S ne gndim ce baz de date uria reprezint Google n
momentul de fa i totui ce repede se deschide o pagin Google care n ultim instan, se bazeaz pe
un select dintr-o baz cu miliarde de linii.

Page 75 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

9 Instruciuni DML
Pn acum ne-am ocupat de modul de extragere a informaiilor din baza de date. Acum trebuie s acordm
un timp special pentru tehnicile de introducere, modificare i tergere a datelor. Aceste instruciuni, care
modific baza de date, se numesc instruciuni DML (Data Manipulation Language).

Comanda INSERT
Introducerea datelor n baz se face cu ajutorul comenzii INSERT prezentat n prima parte a cursului, fiind
necesar pentru completarea tabelelor iniiale. Acum, cnd tim mai multe despre baze de date, s facem
cteva precizri suplimentare.
Am vzut c formatul acestei comenzi este de forma:

INSERT INTO nume_tabel (nume_coloana_1, nume_coloana_2,....,nume_coloana_n) VALUES


(val_1, val_2, ....., val_n);

Ca s introducem un student n tabela studenti, avem mai multe variante:

insert into studenti(nume_student, prenume_student, nr_matricol)


values('Ionescu','Pavel', 1275);
insert into studenti values(null,'Ionescu','Pavel', 1275);

In al doilea caz nu am mai specificat numele coloanelor, ceea ce nseamn c le completm pe toate. Dar
dac uitm o coloan?

insert into studenti values('Ionescu','Pavel', 1275);

Apare eroare: valori insuficiente. Nu tiu ce valoare va primi prin trigger coloana pk_student, dar ea trebuie
pus n cmpul values. In acest caz pot utiliza valoarea NULL.
Bineneles, nu pot pune NULL peste tot unde nu tiu valoarea coloanei.
insert into studenti values(null, null,'Pavel', 1275);
deoarece se sesizeaz constrngerile definite pe tabela "studenti".
Aceste constrngeri trebuie definite chiar la nceput, nainte de introducerea datelor, tocmai ca s m
protejeze mpotriva datelor incoerente. Dac am introdus cteva linii ce nu respect condiia de unicitate i
de "not null", i ncercm apoi s definim constrngerea, aceasta va eua. Deoarece, la definire,
Page 76 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

constrngerea verific dac sunt date n baz ce nu respect condiiile impuse de ea. In caz c gsete
date incorecte, d eroare i anuleaz definiia.
Putem avea surpriza ca insert-ul s dea eroare, chiar dac nu folosim NULL:

insert into studenti_grupe(pk_student) values(100);

In acest caz a fost violat alt constrngere, cea de tip "foreign key" ntre tabela "studenti_grupe" i
"studenti". Aceast constrngere specific faptul c orice linie introdus n tabela "studenti_grupe" trebuie
s aib corespondent n mulimea valorilor "pk_student" din tabela "studenti".

9.1.1 Folosirea funciilor pentru completarea valorilor de insert


In momentul cnd introducem nota n catalog, trebuie s punem i data examinrii. De obicei, punem nota
n catalog n ziua examenului, de aceea, e bine ca sistemul s-mi propun automat ziua curent pentru
coloana "data" din tabela "note". Pentru aceasta folosim funcia "sysdate":

insert into note(pk_student_grupa, pk_disciplina, nota, data)


values(26,2,9,sysdate);

9.1.2 Utilizarea subinterogrilor n comanda insert


Anumite valori introduse de insert pot fi aduse n momentul execuiei prin comanda select dintr-un alt tabel.
De exemplu, vreau s-i pun not studentului Ionescu, dar nu tiu ce pk are (mi trebuie pk_student la
introducerea datelor n tabela note). Eu tiu doar c-l cheam Ionescu i vreau s-i pun nota 8 la disciplina
'ME':
insert into note(pk_student_grupa, pk_disciplina, nota, data) values(
(select stg.pk_student_grupa from studenti st, studenti_grupe stg,
ani_universitari ani
where st.pk_student = stg.pk_student
and stg.pk_an_universitar = ani.pk_an_universitar
and st.nume_student = 'Ionescu'
and ani.cod_an_universitar = '2011-2012')
,(select pk_disciplina from discipline where cod_disciplina = 'ME')
,8,sysdate);
In acest caz, am adus pk-ul printr-un select din tabela "studenti". Trebuie respectate cteva condiii ca s
mearg subinterogarea n insert: comanda select trebuie pus n paranteze, s fie tratat ca un bloc unitar
i ea trebuie s aduc numrul i tipul de valori specificate n comanda insert.

Page 77 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Comanda UPDATE
Ionescu nu este mulumit cu nota 8, a venit a doua zi la mrire i a obinut 10. Dar nu pot s mai pun o not
n catalog deoarece el primete doar o not pe sesiune, de aceea ar trebui s modific nota obinut n ziua
precedent:

update note set nota=10 where pk_nota =


(select n.pk_nota
from studenti st, studenti_grupe stg, note n, discipline d
where st.pk_student = stg.pk_student
and stg.pk_student_grupa = n.pk_student_grupa
and n.pk_disciplina = d.pk_disciplina
and d.cod_disciplina = 'ME'
and st.nume_student = 'Ionescu');

Ce-am nvat mrind nota lui Ionescu?

sintaxa comenzii UPDATE:

update nume_tabel
set nume_col_1 = val_1, nume_col_2=val_2, .... , nume_col_n=val_n
where conditie ;

Dup update si nume tabel urmeaz comanda set dup care se scriu numele coloanelor i valoarea
acestora. Dac sunt mai multe coloane, se despart prin virgul. Urmeaz clauza where care-i foarte
important n acest context.
De ce este important clauza where la update? Dac la select am uitat sau am greit aceast clauz, nu-i
nimic, eventual aduce prea multe date sau deloc. Ne uitm prin ele i ne dm seama imediat c ceva nu-i
n regul. Dar dac uitm s punem clauza "where" la "update"? Atunci e dezastru, modificm notele la toi
studenii din tabela "note". Lipsind clauza "where", comanda "update" nu se mai oprete la o singur linie
cum am fi dorit, ci parcurge toat tabela de date modificnd nota. Iar ca dezastrul s fie complet, Oracle nu
se sesizeaz ca noi am fcut o greeal imens, el nu are de unde s tie c de fapt noi am dorit s
modificm nota la un singur student.

noile valori pe care le setm n baz pot veni i dintr-un alt tabel, aduse prin comanda
"select". Aceste subinterogri trebuie s respecte aceleai condiii de la comanda "insert".

Comanda DELETE
Vreau s terg nota pus studentului Ionescu, el zice c prefer s aib absent n loc de o not mic.

delete from note where pk_nota in

Page 78 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

(select n.pk_nota
from studenti st, studenti_grupe stg, note n, discipline d
where st.pk_student = stg.pk_student
and stg.pk_student_grupa = n.pk_student_grupa
and n.pk_disciplina = d.pk_disciplina
and d.cod_disciplina = 'ME'
and st.nume_student = 'Ionescu');
Sintaxa comenzii "Delete" respect acelai tipar ca la celelalte comenzi DML:

delete from nume_tabel where conditie.

ATENTIE: comanda delete nu terge doar o valoare dintr-o coloan pe o anumit linie, aceast comand
lucreaz pe linii, ea terge toat linia. Rmne valabil discuia pentru clauza "where" de la comanda
"update": dac clauza "where" este uitat sau greit scris, atunci dezastrul este mai mare dect la
comanda "update". In acest caz se terg toate liniile din tabel, sau, ntr-un caz mai fericit, mult mai multe
dect am fi dorit.

Vreau s terg toate liniile din tabel:

delete from note;

Comanda delete terge liniile din tabel, dar nu i tabelul ca obiect al bazei de date. Obiectul se terge prin
comanda DDL (Data Definition Language) "drop":

drop table note;

Comanda DDL "drop" terge complet tabela i nu se mai poate recupera nimic. Dac de la delete se mai
pot recupera datele (n anumite condiii ), dup drop nu se mai poate face nimic.

9.3.1 Stergerea n cascad


Presupunem c vrem s tergem un student din baza de date:

delete from studenti where nume_student = 'Iacob';

Imediat obinem o eroare de integritate:

Am definit o constrngere de tip "foreign key" ntre tabelele studenti i studenti_grupe bazat pe coloana
"pk_student":

ALTER TABLE studenti_grupe


ADD CONSTRAINT fk_student_grupe_st FOREIGN KEY (pk_student)
REFERENCES studenti (pk_student)
Page 79 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Aceast constngere nu permite tergerea unei linii din tabela "studentI dac exist linii aferente n tabela
"studenti_grupe" (nu pot terge studentul dac el este nscris n diverse grupe, are note, etc. Toate aceste
informaii ar rmne suspendate n aer dac s-ar terge studentul).
Cum se poate rezolva problema? Sunt dou soluii:

Mergem mai nti n tabelele copil (note, studenti_grupe) i tergem toate liniile ataate de
studentul ce trebuie ters i la urm tergem studentul:

delete from note where pk_student_grupa in


(select pk_student_grupa
from studenti_grupe stg , studenti st
where stg.pk_student = st.pk_student
and st.nume_student = 'Iacob'
);
delete from studenti_grupe where pk_student in
(select pk_student from studenti where nume_student = 'Iacob');
delete from studenti where nume_student = 'Iacob';

Modificm definiia constrngerii de tip "foreign key" dintre tabele adugnd sufixul "on
delete cascade":

ALTER TABLE studenti_grupe drop CONSTRAINT fk_student_grupe_st;


ALTER TABLE studenti_grupe
ADD CONSTRAINT fk_student_grupe_st FOREIGN KEY (pk_student)
REFERENCES studenti (pk_student) on delete cascade;

ALTER TABLE note drop CONSTRAINT fk_nota_student;


ALTER TABLE note
ADD CONSTRAINT fk_nota_student FOREIGN KEY (pk_student_grupa)
REFERENCES studenti_grupe (pk_student_grupa) on delete cascade;

Iar acum putem terge foarte simplu studentul:

delete from studenti where nume_student = 'Chiriac';

Foarte simpl a doua variant , dar nu indicat. Pentru exemplul nostru a fost simplu, am avut numai aceste
trei tabele, dar ce ne facem dac de tabela "studenti" se mai leag i alte tabele copil, care la rndul lor
sunt prini pentru alte tabele i aa mai departe? Punem peste tot "ON DELETE CASCADE" ? Nu-i bine,
putem scpa de sub control aceste tergeri i la un moment dat, nu mai tii de ce a disprut disciplina de
matematic din baz cnd tu nu ai fcut dect s tergi un student.

Page 80 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

10 Tranzacii n baza de date


Comanda Rollback
Revenim la problema cnd am pus din greeal la toat lumea nota 10:

update note set nota = 10 ;


select * from note;

Constat o eroare de proporii, toat lumea are nota 10, la toate obiectele i n toate sesiunile.
Din fericire nc mai pot corecta eroarea prin utilizarea comenzii ROLLBACK:
rollback;
Pur i simplu rulm rollback i totul s-a rezolvat, am revenit la situaia iniial. Problema e, ct de iniial
este situaia? Pn la ce punct m-am ntors cu baza de date?

Comanda Commit
Comanda ROLLBACK anuleaz ultima tranzacie, dar cnd a nceput aceast tranzacie?
Orice tranzacie ncepe dup comanda commit i se termin la comanda commit. Tranzacia reprezint un
ir de comenzi de tipul select, update, insert, etc, care este privit de Oracle ca un tot unitar: ori toate
comenzile se termin cu succes, ori sunt anulate toate.
De exemplu, ne hotrm s tergem un student din baza de date. Pentru aceasta ncepem s-i tergem
notele, apoi prezena la curs, laborator, apoi din tabela de examene, apoi de la bibliotec, etc.Dup ce
tergem informaiile din toate tabelele copil, la sfrit tergem din tabela "studenti". Dar ce se ntmpl
dac, undeva pe parcurs, o instruciune d eroare? De exemplu, cnd tergem studentul din registrul
bibliotecii, constatm c acest tabel are o alt tabel copil cu crile mprumutate de la bibliotec. Iar acel
student nu a returnat toate crile luate mprumut de la bibliotec. Evident ca procesul de tergere se
oprete aici i nu poate continua pn cnd studentul nu returneaz mprumuturile.

Page 81 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Pe de alt parte, avem deja efectuate cteva tergeri din baza de date. Acestea trebuie refcute, pentru c
nu putem lsa unele tabele sterse i altele nu. Intreg procesul de tergere trebuie terminat cu succes, caz
n care ncheiem tranzacia prin comanda "Commit", altfel situaia n baz trebuie s rmn aceeai.
Refacerea situaiei se face prin comanda ROLLBACK , caz n care ne ntoarcem la situaia de la ultimul
commit executat.
Comanda commit ncheie tranzacia curent astfel nct, toate modificrile realizate pn n acel moment
trec n stare definitiv. Prima comand SQL dup commit ncepe o nou tranzacie care se termin la
urmtorul commit. S reinem deci c prin ROLLBACK putem reface doar modificrile din tranzacia
curent, nimic nu ne mai salveaz dup execuia comenzii COMMIT.

10.2.1

Commit implicit

Se ntampl ca uneori comanda Rollback s nu mai restaureze situaia dat de ultimul commit. Aceasta
pentru c, uneori baza de date realizeaz un commit implicit, adic execut comanda commit fara ca noi s
comandm explicit acest lucru.
Commit-ul implicit se execut atunci cnd utilizatorul ruleaz o comand special de tip DDL sau DCL:

comand DDL (Data Definition Language): de exemplu comanzile "create table..", "alter
table...",etc.

comand DCL (Data Control Language): "create user...", "grant user...",etc.

10.2.2

Comanda Savepoint

Este util cteodat s mprim o tranzacie n mai multe subtranzacii i s anulm prin rollback numai o
anumit subtranzacie. De exemplu, vindem un produs la un client, proces ce presupune mai multe etape:
- scoatem produsul din magazie (modificm stocul din magazia respectiv)
- facem factur pentru client (adugm un document n tabela de documente emise)
- contm acel document (pentru evidena contabil)
Ce se ntmpl dac nu merge contarea ? (nu tiu exact care sunt conturile pe care trebuie s contez). Nu
mai vnd produsul clientului? Dar el este la poart i ateapt s plece cu produsul.
In acest caz salvm cteva puncte intermediare n tranzacia noastr. Dup scoaterea produsului din
magazie definim un punct intermediar de succes :

SAVEPOINT iesire_magazie_succes;

Mergem mai departe i scoatem i factura:

SAVEPOINT factura;
Page 82 of 102

Baze de date
Project no.

BD 2011

Document no.

Product name:

Baze de date note de curs

Date:

July - 2011

Version no.:

3.0

Author:

Lucian Nita

CR no.:

Apoi contm factura. Dac totul e OK dm un COMMIT, altfel m intorc la ultima situaie de succes:

ROLLBACK to factura;

In acest fel am reuit s s scoatem factura clientului, rmnnd pentru mai trziu s rezolvm problema
contrii.

Page 83 of 102

Baze de date
Project no.

BD 2010

Document no.

Product name:

Baze de date note de curs

Date:

Feb - 2010

Version no.:

0.1

Author:

Lucian Nita

CR no.:

11 PL/SQL
SQL este OK n majoritatea taskurilor pe care le avem de ndeplinit cnd lucrm cu o baz de date. Dar de
multe ori, exist necesitatea de a putea rula cteva linii de cod direct pe baz, s putem extrage informaia
ntr-un mod mai flexibil.
De exemplu, m-ar interesa s afiez pentru fiecare student media sa general calculat prin media
aritmetic a tuturor notelor obinute de student. Dar doresc ca media general s nu fie influenat de
notele obinute la sport sau alte materii opionale. Mi-ar fi foarte uor s aflu aceste informaii dac a putea
scrie o funcie care s primeasc ca parametru pk_student (identificatorul unic al studentului) i s-mi
returneze acele valori de care am nevoie. E clar c ntr-o funcie pot folosi acele bucle FOR, LOOP, WHILE,
condiii IF de care avem atta nevoie cnd este necesar s alegem din mai multe variante, s facem tot
felul de sume, s extragem informaia n funcie de anumite condiii.
Orict de puternic ar fi SQL-ul, tot mai avem nevoie de linii de cod, de tehnicile specifice limbajelor de
programare. Un alt avantaj al acestor programe (pe care le denumim PL/SQL) este dat de faptul c ele
ruleaz pe server, deci nu ncrcm n mod excesiv reeaua de calculatoare cu un trafic imens ntre staia
noastr i server (de ct s cer de zeci de ori cu cte un select o poriune de informaie, scriu o funcie
PL/SQL n baz care returneaz o singur dat tot blocul de date cerut).
Ce nseamn PL/SQL? nseamn SQL introdus ntr-o structur de programare. Prin SQL obinem o
informaie care se afieaz i att. Dar dac vreau ca aceast informaie s o salvez ntr-o variabil i apoi
s o prelucrez conform unui algoritm? In SQL clasic nu putem, de aceea folosim PL/SQL.

Structura programelor PL/SQL


Programele PL/SQL pot fi funcii, proceduri, sau blocuri anonime de cod. Diferena ntre funcii i proceduri?
Funcia ntoarce o valoare, procedura nu ntoarce nimic, prin codul ei modific un obiect din baza de date
sau valoarea unui parametru.
Indiferent dac este funcie sau procedur structura este aceeai:
declare
nume_variabile tip;
begin
instructiuni;
RETURN return_value ; (numai pentru functii)

Page 84 of 102

Baze de date
Project no.

BD 2010

Document no.

Product name:

Baze de date note de curs

Date:

Feb - 2010

Version no.:

0.1

Author:

Lucian Nita

CR no.:

exception
WHEN exception_name THEN
instructiuni tratare exceptii ;
END;
Prima parte din program este rezervat declaraiilor de variabile. Urmeaz blocul de instruciuni care se
termin cu instruciunea "end". Intre "begin" si "end" se poate include eventual clauza "exception" unde se
introduc instruciuni de tratare a erorilor aprute n blocul de instruciuni. Structura respect arhitectura
oricrui limbaj de programare: declaraie variabile, instruciuni, tratare erori (construcia begin .... exception
... end poate fi privit ca un bloc try ... catch din limbajele de programare moderne).
Lucrnd pe o baz de date care ne poate surprinde oricnd cu date invalide sau lips, este obligatorie
tratarea erorilor printr-o clauz de tip exception, altfel eroarea se transmite mai departe i apare la interfaa
utilizator cu tot felul de mesaje Oracle neinteligibile pentru utilizatorul final.

Funcia de calcul a mediei ponderate


Exist o medie ponderat ce ia n calcul creditele obinute de un student cnd promoveaz un examen.
Aceast medie are formula:
nr _ total _ discipline

Medie _ ponderata

nr _ credite * nota

i 0
nr _ total _ discipline

nr _ credite
i 0

Se face produsul dintre numrul de credite de la fiecare disciplin studiat de student ntr-un an de studiu i
nota obinut de student. Suma produselor se mparte la numrul total de credite. In caz c studentul nu are
not, atunci se consider nota zero.
Este destul de clar c aceast problem nu prea poate fi rezolvat prin SQL, deci se va construi o funcie
ce primete ca parametru un numar dat de "pk_student_grupa" i va returna un numr ce reprezint media
ponderat.
create or replace function calcul_medie_ponderata( p_pk_student_grupa in
number) return number is
cursor c_discipline_studiate is
select d.pk_disciplina, d.cod_disciplina, d.credite
from studenti_grupe stg, grupe g, discipline d

Page 85 of 102

Baze de date
Project no.

BD 2010

Document no.

Product name:

Baze de date note de curs

Date:

Feb - 2010

Version no.:

0.1

Author:

Lucian Nita

CR no.:

where stg.pk_grupa = g.pk_grupa


and g.pk_specializare = d.pk_specializare
and stg.pk_student_grupa = p_pk_student_grupa
and lower(d.cod_disciplina) != 'educatie fizica';
cursor c_note(p_pk_disciplina in number) is
select max(n.nota)
from note n
where n.pk_student_grupa = p_pk_student_grupa
and n.pk_disciplina= p_pk_disciplina;
v_medie_ponderata
sum_credite
sum_medie_credite
nota_curenta

number
number
number
number

:=
:=
:=
:=

0;
0;
0;
0;

begin
for rec in c_discipline_studiate loop
open c_note(rec.pk_disciplina);
fetch c_note into nota_curenta;
if c_note%notfound then
nota_curenta := 0;
end if;
close c_note;
sum_medie_credite := sum_medie_credite + nvl(rec.credite,0) *
nvl(nota_curenta,0);
sum_credite := sum_credite + nvl(rec.credite,0);
end loop;
if sum_credite != 0 then
v_medie_ponderata := sum_medie_credite/sum_credite;
else
v_medie_ponderata := 0;
end if;
return round(v_medie_ponderata,2) ;
exception when others then
return 0;
end;
Analiza funciei "calcul_medie_ponderata":

Mai nti sunt declarate variabilele "v_medie_ponderata", "sum_credite", "cursor c_note",


etc.

Ce este CURSORUL ? Un cursor este o zon de memorie n care Oracle i depune rezultatele dintr-un
select. Orice select cu care ne-am obinuit noi n SQL este de fapt un cursor pe care l declar implicit
Oracle. In PL/SQL noi avem posibilitatea s definim explicit un astfel de cursor i apoi s parcurgem zona
de memorie i s extragem diverse valori. Avantajul este c ne putem plimba prin cursor i pentru fiecare
valoare s executm anumite operaii n funcie de parametri.

Page 86 of 102

Baze de date
Project no.

BD 2010

Document no.

Product name:

Baze de date note de curs

Date:

Feb - 2010

Version no.:

0.1

Author:

Lucian Nita

CR no.:

Am declarat dou cursoare, unul ce aduce toate disciplinele studiate de studentul dat, cellalt aduce nota
obinut de student la o disciplin dat.

Am

baleiat

ntreg

cursorul

"c_discipline_studiate"

(for

rec

in

c_discipline_studiate loop) i am calculat suma produselor dintre credite i note:


sum_medie_credite:=sum_medie_credite+nvl(rec.credite,0)*nvl(nota_curenta,0);

Dac studentul nu are not, sau disciplina nu are credite, atunci se pune implicit zero
(nvl(nota_curenta,0).

La sfrit se calculeaz media prin mprire:


if sum_credite != 0 then
v_medie_ponderata := sum_medie_credite/sum_credite;
else
v_medie_ponderata := 0;
end if;

Nu lipsete clauza EXCEPTION unde se intr n caz de o eroare n codul nostru ("when others"
adic oricare ar fi eroarea , ea va fi tratat n acest segment). Aici nu facem nimic altceva dect
returnm zero.

Nu explicm aici cum lucreaz instruciunea IF sau altele (FOR, WHILE, EXIT, ... ) ele au aceeai
funciune ca-n orice limbaj de programare. Trebuie doar s fim ateni la sintaxa lor care se
aseamn cu cea din DELPHI.

Testm funcia printr-un select obinuit din baz:

select st.nume_student, st.prenume_student,


calcul_medie_ponderata(stg.pk_student_grupa) medie_ponderata
from studenti st, studenti_grupe stg
where st.pk_student = stg.pk_student
;

11.2.1Medie student
CREATE OR REPLACE
FUNCTION calcul_medie( p_pk_student_grupa in number) return

number is

cursor c_discipline_studiate is
select d.pk_disciplina, d.cod_disciplina
from studenti_grupe stg, grupe g, discipline d

Page 87 of 102

Baze de date
Project no.

BD 2010

Document no.

Product name:

Baze de date note de curs

Date:

Feb - 2010

Version no.:

0.1

Author:

Lucian Nita

CR no.:

where stg.pk_grupa = g.pk_grupa


and g.pk_specializare = d.pk_specializare
and stg.pk_student_grupa = p_pk_student_grupa
and lower(d.cod_disciplina) != 'educatie fizica';
cursor c_note(p_pk_disciplina in number) is
select max(n.nota)
from note n
where n.pk_student_grupa = p_pk_student_grupa
and n.pk_disciplina= p_pk_disciplina;
v_medie
suma_note
nota_curenta
nr_note

number
number
number
number

:=
:=
:=
:=

0;
0;
0;
0;

begin
dbms_output.put_line('*** pk_stud_grupa=' || p_pk_student_grupa);
nr_note := 0;
suma_note := 0;
for rec in c_discipline_studiate loop
nota_curenta := -1;
open c_note(rec.pk_disciplina);
fetch c_note into nota_curenta;
if nota_curenta != -1 then
nr_note := nr_note + 1;
dbms_output.put_line('
nota_curenta =' || nota_curenta || ' nr_note=' ||
nr_note);
else
nota_curenta := 0;
end if;
close c_note;
suma_note := suma_note + nvl(nota_curenta,0);
end loop;
if nr_note > 0 then
dbms_output.put_line('
suma_note = '||suma_note||' nr_note= '||
nr_note);
v_medie := suma_note/nr_note;
else
v_medie := 0;
end if;
return round(v_medie,2) ;
exception when others then
return 0;
end;
/

Page 88 of 102

Baze de date
Project no.

BD 2010

Document no.

Product name:

Baze de date note de curs

Date:

Feb - 2010

Version no.:

0.1

Author:

Lucian Nita

CR no.:

Triggeri
O baz de date performant trebuie s vin n ntmpinarea programatorilor cu diverse obiecte i
mecanisme care s le fac munca mai uoar. Unul din aceste obiecte este TRIGGER-ul.
TRIGER-ul este o seciune de cod ce se execut automat la un anumit eveniment. Odat definit acel
eveniment, baza de date are grij s lanseze n execuie trigger-ul corespunztor ori de cte ori are loc
evenimentul. Este foarte util atunci cnd trebuie executate anumite sarcini n mod automat cnd sunt
ntrunite anumite condiiile impuse.

11.3.1Completarea automat a coloanelor de tip PK


La inserarea datelor n baza de date am folosit n mod extensiv triggerii de completare a valorilor din
coloanele de tip "primary key". Am discutat n acel capitol problema completrii valorilor unice i modul de
rezolvare prin utilizarea secvenelor i trigerilor:
CREATE OR REPLACE TRIGGER bef_studenti_grupe
BEFORE INSERT ON studenti_grupe
REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW
begin
select pk_student_grupa.NEXTVAL into :new.pk_student_grupa from dual;
end;
In acest mod, indiferent de ci utilizatori introduc simultan date n baz, se asigur n mod unic o valoare
de PK pentru fiecare.
Sintaxa unui trigger este aceeai cu a unui bloc PL/SQL cu diferena c, n cazul triggerului avem acces la
valorile vechi i noi din linia de tabel care tocmai se modific.
In header-ul triggerului se definesc condiiile de rulare care fac s se execute triggerul. In exemplul de mai
sus, dorim ca triggerul s se execute naintea unui insert n tabela studenti_grupe:
BEFORE

INSERT ON studenti_grupe

REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW


Ceea ce se traduce prin urmtoarele:
-

Triggerul se execut nainte de a introduce datele (before insert)

Se aplica la tabela "studenti_grupe" (ON studenti_grupe)

Informaiile care sunt nlocuite sunt accesibile prin construcia "OLD", iar cele noi prin
constructia "NEW". Exemplu: ":new.pk_student_grupa" este valoarea care tocmai se

Page 89 of 102

Baze de date
Project no.

BD 2010

Document no.

Product name:

Baze de date note de curs

Date:

Feb - 2010

Version no.:

0.1

Author:

Lucian Nita

CR no.:

dorete a se introduce n linia curent, coloana "pk_student_grupa". Avand acces la ambele


valori, putem face comparaii i analize care s decid dac operaia de modificare este
corect sau nu.
-

Triggerul se va executa pentru fiecare linie afecat de operaia n desfaurare din tabel (FOR
EACH ROW).

11.3.2Verificarea notelor obinute de studeni


Un exemplu pentru demonstrarea utilitii triggeri-lor este dat de necesitatea verificrii notelor inserate n
tabela note. Din diverse cauze, poate interveni eroarea ca un student s primeasc not la o disciplin pe
care nu o studiaz (sunt mai multe surse de program care pot insera note: modulul de profesori, secretara
i pot interveni erori de acest tip). Bineneles c se pot face verificri pe parcursul inserrii notelor, dar toate
aceste verificri pot da eroare la fel de bine. De aceea, baza de date este ultima i cea mai sigur barier
mpotriva erorilor de acest fel. Se definete un trigger de verificare a notelor i n mod sigur acesta se va
executa ntotdeauna cnd se introduce o nou not n tabel.
Triggerul de verificare a notelor este listat in continuare:
create or replace trigger verifica_disciplina_note
before insert or update on note
referencing new as new old as old for each row
begin
declare
cursor c_discipline_studiate is
select 1
from studenti_grupe stg, grupe g, discipline d
where stg.pk_grupa = g.pk_grupa
and g.pk_specializare = d.pk_specializare
and stg.pk_student_grupa = :new.pk_student_grupa
and d.pk_disciplina = :new.pk_disciplina;
dummy
number;
begin
open c_discipline_studiate;
fetch c_discipline_studiate into dummy;
if c_discipline_studiate%notfound then
raise_application_error(-20101,'studentul nu poate primi nota
pentru ca nu studiaza disciplina respectiva');
end if;
close c_discipline_studiate;
exception when others then
raise_application_error(-20101,'Eroare ' || sqlerrm);
end;

Page 90 of 102

Baze de date
Project no.

BD 2010

Document no.

Product name:

Baze de date note de curs

Date:

Feb - 2010

Version no.:

0.1

Author:

Lucian Nita

CR no.:

end;
Dac ncercm acum s introducem o not la o disciplin greit, obinem eroare:

insert into note values(null, 7, 10,9, sysdate);

Recapitulare:

Acest ultim capitol din curs introduce cteva noiuni elementare despre programarea PL/SQL.

Nu toate bazele de date suport limbajul PL/SQL ci doar cele mai performante.

Executarea sarcinilor direct pe server, prin programare PL/SQL are multiple avantaje (trafic redus n
reea, vitez mare de execuie, eliminarea conflictelor de date ntre sesiuni, etc).

Se pot define funcii, proceduri, biblioteci de asemenea programe, triggeri ce se execut automat
pe evenimente prestabilite.

Uureaz foarte mult din munca programaoriloe de aplicaii complexe.

Page 91 of 102

Baze de date
Project no.

BD 2010

Document no.

Product name:

Baze de date note de curs

Date:

Feb - 2010

Version no.:

0.1

Author:

Lucian Nita

CR no.:

12 Bibliografie

http://office.microsoft.com/ro-ro/access-help/notiuni-de-baza-despre-proiectarea-bazelor-de-dateHA001224247.aspx

http://www.w3schools.com/sql/default.asp

http://st-curriculum.oracle.com/tutorial/SQLDeveloper/index.htm

http://www.java2s.com/Tutorial/Oracle/CatalogOracle.htm

Page 92 of 102

Baze de date
Project no.

BD 2010

Document no.

Product name:

Baze de date note de curs

Date:

Feb - 2010

Version no.:

0.1

Author:

Lucian Nita

CR no.:

13 Anexe
Instructiunile SQL pentru crearea obiectelor n baza de date
In continuare sunt date frazele SQL ce creeaz tabelele de lucru mpreun cu legturile ntre ele.

13.1.1

Creare tabele

--ani universitari
delete from ani_universitari;
drop table ani_universitari;
create table ani_universitari
(
pk_an_universitar
number,
cod_an_universitar
varchar2(15),
descriere_an_universitar varchar2(50)
);
alter table ani_universitari add constraint pk_ani_universitari primary
key(pk_an_universitar);
alter table ani_universitari add constraint uk_cod_an_univ unique
(cod_an_universitar);
alter table ani_universitari add constraint uk_desc_ani_univ unique
(descriere_an_universitar);
--ani studiu
drop table ani_studiu;
create table ani_studiu
(
pk_an_studiu
number,
cod_an_studiu
varchar2(2),
descriere_an_studiu
varchar2(50)
);
alter table ani_studiu add constraint pk_an_studiu primary key (pk_an_studiu);
alter table ani_studiu add constraint uk_cod_ani_studiu unique (cod_an_studiu);
-- specializari
drop table specializari;
create table specializari
(
pk_specializare
number,
cod_specializare varchar2(15),
descriere_specializare varchar2(50)
);
alter table specializari add constraint pk_specializare primary key
(pk_specializare);
alter table specializari add constraint uk_specializare unique
(cod_specializare);
-- grupe
drop table grupe;

Page 93 of 102

Baze de date
Project no.
Document no.

BD 2010

Product name:

Baze de date note de curs

Date:

Feb - 2010

Version no.:

0.1

Author:

Lucian Nita

CR no.:

create table grupe


(
pk_grupa
number,
cod_grupa
varchar2(15),
descriere_grupa
varchar2(50), -- aici punem descrieri diferite pentru
acelasi cod
pk_specializare
number,
pk_an_studiu
number
);
alter table grupe add constraint pk_grupa primary key (pk_grupa);
alter table grupe add constraint fk_grupa_specializare foreign key
(pk_specializare) references specializari(pk_specializare) ;
alter table grupe add constraint fk_grupa_an_studiu foreign key (pk_an_studiu)
references ani_studiu(pk_an_studiu) ;
--studenti
drop table studenti;
create table studenti
(
pk_student
nume_student
prenume_student
nr_matricol
);

number,
varchar2(50),
varchar2(50),
number

alter table studenti add constraint pk_student primary key (pk_student);


alter table studenti add constraint uk_nr_matricol_student unique
(nr_matricol);
--studenti_grupe
drop table studenti_grupe;
create table studenti_grupe
(
pk_student_grupa
number,
pk_student
number,
pk_grupa
number,
pk_an_universitar number
);
alter table studenti_grupe add constraint pk_student_grupa primary key
(pk_student_grupa);
alter table studenti_grupe add constraint fk_student_grupe_st foreign key
(pk_student) references studenti(pk_student);
alter table studenti_grupe add constraint fk_student_grupe_gr foreign key
(pk_grupa) references grupe(pk_grupa);
alter table studenti_grupe add constraint fk_student_grupe_au foreign key
(pk_an_universitar) references ani_universitari(pk_an_universitar);
--discipline;
drop table discipline;
create table discipline
(
pk_disciplina
cod_disciplina

number,
varchar2(50),

Page 94 of 102

Baze de date
Project no.

BD 2010

Document no.

Product name:

Baze de date note de curs

Date:

Feb - 2010

Version no.:

0.1

Author:

Lucian Nita

CR no.:

descriere_disciplina varchar2(100),
pk_specializare
number,
pk_an_studiu
number,
semestru
number,
credite
number
);
alter table discipline add constraint pk_disciplina primary key
(pk_disciplina);
alter table discipline add constraint fk_disciplina_spec foreign key
(pk_specializare) references specializari(pk_specializare);
alter table discipline add constraint fk_disciplina_an_studiu foreign key
(pk_an_studiu) references ani_studiu(pk_an_studiu);
alter table discipline add constraint ck_semestru check (semestru in
(1,2));
--note
drop table note;
create table note
(
pk_nota
number,
pk_student_grupa
number,
pk_disciplina
number,
nota
number,
data
date
);
alter table note add constraint pk_nota primary key (pk_nota);
alter table note add constraint fk_nota_student
foreign key (pk_student_grupa) references studenti_grupe(pk_student_grupa);
alter table note add constraint fk_not_disciplina foreign key
(pk_disciplina) references discipline(pk_disciplina);
ALTER TABLE note ADD CONSTRAINT ck_note CHECK (nota <= 10);
/* ------------------------------------------------------------------------Secvente
-------------------------------------------------------------------------*/
CREATE SEQUENCE pk_an_universitar
INCREMENT BY 1
START WITH 1
MINVALUE 1
MAXVALUE 9999999999999;
CREATE SEQUENCE pk_an_studiu;
CREATE SEQUENCE pk_specializare;
CREATE SEQUENCE pk_grupa;
CREATE SEQUENCE pk_student;
CREATE SEQUENCE pk_student_grupa;
CREATE SEQUENCE pk_disciplina;
CREATE SEQUENCE pk_nota;
/* --------------------------------------------------------------------------triggeri ---> completare automata a coloanei pk....

Page 95 of 102

Baze de date
Project no.
Document no.

BD 2010

Product name:

Baze de date note de curs

Date:

Feb - 2010

Version no.:

0.1

Author:

Lucian Nita

CR no.:

---------------------------------------------------------------------*/
CREATE OR REPLACE TRIGGER bef_ani_universitari
BEFORE INSERT ON ani_universitari REFERENCING NEW AS NEW OLD AS OLD FOR EACH
ROW
begin
select pk_an_universitar.NEXTVAL into :new.pk_an_universitar from dual;
end;
/
CREATE OR REPLACE TRIGGER bef_ani_studiu
BEFORE INSERT ON ani_studiu REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW
begin
select pk_an_studiu.NEXTVAL into :new.pk_an_studiu from dual;
end;
/
CREATE OR REPLACE TRIGGER bef_specializari
BEFORE INSERT ON specializari REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW
begin
select pk_specializare.NEXTVAL into :new.pk_specializare from dual;
end;
/
CREATE OR REPLACE TRIGGER bef_grupe
BEFORE INSERT ON grupe REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW
begin
select pk_grupa.NEXTVAL into :new.pk_grupa from dual;
end;
/
CREATE OR REPLACE TRIGGER bef_studenti
BEFORE INSERT ON studenti REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW
begin
select pk_student.NEXTVAL into :new.pk_student from dual;
end;
/
CREATE OR REPLACE TRIGGER bef_studenti_grupe
BEFORE INSERT ON studenti_grupe REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW
begin
select pk_student_grupa.NEXTVAL into :new.pk_student_grupa from dual;
end;
/
CREATE OR REPLACE TRIGGER bef_discipline
BEFORE INSERT ON discipline REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW
begin
select pk_disciplina.NEXTVAL into :new.pk_disciplina from dual;
end;
/

Page 96 of 102

Baze de date
Project no.
Document no.

BD 2010

Product name:

Baze de date note de curs

Date:

Feb - 2010

Version no.:

0.1

Author:

Lucian Nita

CR no.:

CREATE OR REPLACE TRIGGER bef_note


BEFORE INSERT ON note REFERENCING NEW AS NEW OLD AS OLD
begin
select pk_nota.NEXTVAL into :new.pk_nota from dual;
end;
/

13.1.2

FOR EACH ROW

Introducerea date n baz

select * from ani_universitari;


--1. ani_universitari
delete from ani_universitari;
insert into ani_universitari (pk_an_universitar, cod_an_universitar,
descriere_an_universitar)
values (-1, '2010-2011', 'an universitar 2010-2011');
insert into ani_universitari (pk_an_universitar, cod_an_universitar,
descriere_an_universitar)
values (-111, '2011-2012', 'an universitar 2011-2012');
insert into ani_universitari values (null, '2012-2013', 'an universitar 20122013');
insert into ani_universitari (cod_an_universitar, descriere_an_universitar)
values ('2013-2014', 'an universitar 2013-2014');
--2. ani_studiu
insert into ani_studiu
insert into ani_studiu
insert into ani_studiu
insert into ani_studiu
insert into ani_studiu
insert into ani_studiu

values(null,1,'an
values(null,2,'an
values(null,3,'an
values(null,4,'an
values(null,5,'an
values(null,6,'an

1');
2');
3');
4');
5');
6');

--3. specializari
insert into specializari(cod_specializare,descriere_specializare)
values('IAD', 'Instrumentatie si Achizitii de Date');
insert into specializari(cod_specializare,descriere_specializare)
values('IA', 'Informatica Aplicata');
insert into specializari(cod_specializare,descriere_specializare)
values('EM', 'Electromecanica');
insert into specializari(cod_specializare,descriere_specializare)
values('EPAE', 'Actionari');
--4. discipline
insert into discipline
insert into discipline
insert into discipline
insert into discipline
insert into discipline
insert into discipline

values(null,'PSM1','Progr.Sist. de Masurare1',1,4,1);
values(null,'IB','Instrumentatie de bord',1,4,1);
values(null,'ME','Masurari Electrice',1,3,1);
values(null,'BD','Baze Date',2,3,1);
values(null,'MEP','Masini Electrice de putere',3,4,1);
values(null,'AE','Actionari Electrice',4,3,2);

--5. grupe
insert into grupe values(null,'6403','Grupa 6403',1,4);

Page 97 of 102

Baze de date
Project no.

BD 2010

Document no.

insert
insert
insert
insert
insert

into
into
into
into
into

grupe
grupe
grupe
grupe
grupe

Product name:

Baze de date note de curs

Date:

Feb - 2010

Version no.:

0.1

Author:

Lucian Nita

CR no.:

values(null,'6404','Grupa
values(null,'6303','Grupa
values(null,'6401','Grupa
values(null,'6409','Grupa
values(null,'6402','Grupa

6404',1,4);
6303',1,3);
6401',3,4);
6409',2,4);
6402',4,4);

--6. inserez studentii in tabela


delete from studenti;
insert into studenti values(null,'Iosub','Ioan',null);
insert into studenti values(null,'Chiriac','Ionut',null);
insert into studenti values(null,'Proca','Ovidiu',null);
insert into studenti values(null,'Maxim','Ciprian',null);
insert into studenti values(null,'Condurache','George',null);
insert into studenti values(null,'Burca','Bogdan',null);
insert
insert
insert
insert
insert

into
into
into
into
into

studenti
studenti
studenti
studenti
studenti

values(null,'Antohe','Adina',null);
values(null,'Iacob','Adelina',null);
values(null,'Hogas','Ionel',null);
values(null,'Pavel','Ionel',null);
values(null,'Jora','Bogdan',null);

insert into studenti values(null,'Burlacu','Cosmin',null);


insert into studenti values(null,'Simionescu','C-tin',null);
insert into studenti values(null,'Moisa','Cristina',null);
insert into studenti values(null,'Ichim','Andrei',null);
insert into studenti values(null,'Burlacu','Lucian',null);
insert into studenti values(null,'Puiu','Daniel',null);
insert into studenti values(null,'Maxim','Manuela',null);
insert into studenti values(null,'Lemnariu','Ana-Maria',null);
--7. Atasez studentii la grupe
delete from studenti_grupe;
insert into studenti_grupe(pk_student_grupa,
pk_an_universitar) values(-1,1,1,2);
insert into studenti_grupe(pk_student_grupa,
pk_an_universitar) values(-1,2,1,2);
insert into studenti_grupe(pk_student_grupa,
pk_an_universitar) values(-1,3,1,2);
insert into studenti_grupe(pk_student_grupa,
pk_an_universitar) values(-1,4,1,2);
insert into studenti_grupe(pk_student_grupa,
pk_an_universitar) values(-1,5,1,2);
insert into studenti_grupe(pk_student_grupa,
pk_an_universitar) values(-1,6,1,2);

pk_student, pk_grupa,
pk_student, pk_grupa,
pk_student, pk_grupa,
pk_student, pk_grupa,
pk_student, pk_grupa,
pk_student, pk_grupa,

insert into studenti_grupe(pk_student_grupa, pk_student, pk_grupa,


pk_an_universitar) values(-1,7,2,2);
insert into studenti_grupe(pk_student_grupa, pk_student, pk_grupa,
pk_an_universitar) values(-1,8,2,2);
insert into studenti_grupe(pk_student_grupa, pk_student, pk_grupa,
pk_an_universitar) values(-1,9,2,2);

Page 98 of 102

Baze de date
Project no.
Document no.

BD 2010

Product name:

Baze de date note de curs

Date:

Feb - 2010

Version no.:

0.1

Author:

Lucian Nita

CR no.:

insert into studenti_grupe(pk_student_grupa, pk_student, pk_grupa,


pk_an_universitar) values(-1,10,2,2);
insert into studenti_grupe(pk_student_grupa, pk_student, pk_grupa,
pk_an_universitar) values(-1,11,2,2);
insert into studenti_grupe(pk_student_grupa, pk_student, pk_grupa,
pk_an_universitar) values(-1,12,6,2);
insert into studenti_grupe(pk_student_grupa, pk_student, pk_grupa,
pk_an_universitar) values(-1,13,6,2);
insert into studenti_grupe(pk_student_grupa, pk_student, pk_grupa,
pk_an_universitar) values(-1,14,6,2);
insert into studenti_grupe(pk_student_grupa, pk_student, pk_grupa,
pk_an_universitar) values(-1,15,4,2);
insert into studenti_grupe(pk_student_grupa, pk_student, pk_grupa,
pk_an_universitar) values(-1,16,4,2);
insert into studenti_grupe(pk_student_grupa, pk_student, pk_grupa,
pk_an_universitar) values(-1,17,4,2);
insert into studenti_grupe(pk_student_grupa, pk_student, pk_grupa,
pk_an_universitar) values(-1,18,5,2);
insert into studenti_grupe(pk_student_grupa, pk_student, pk_grupa,
pk_an_universitar) values(-1,19,5,2);
-- stdenti de anul trecut
insert into studenti_grupe(pk_student_grupa,
pk_an_universitar) values(-1,1,3,1);
insert into studenti_grupe(pk_student_grupa,
pk_an_universitar) values(-1,2,3,1);
insert into studenti_grupe(pk_student_grupa,
pk_an_universitar) values(-1,3,3,1);
insert into studenti_grupe(pk_student_grupa,
pk_an_universitar) values(-1,4,3,1);
insert into studenti_grupe(pk_student_grupa,
pk_an_universitar) values(-1,5,3,1);
insert into studenti_grupe(pk_student_grupa,
pk_an_universitar) values(-1,6,3,1);

pk_student, pk_grupa,
pk_student, pk_grupa,
pk_student, pk_grupa,
pk_student, pk_grupa,
pk_student, pk_grupa,
pk_student, pk_grupa,

insert into studenti_grupe(pk_student_grupa, pk_student, pk_grupa,


pk_an_universitar) values(-1,7,2,1);
insert into studenti_grupe(pk_student_grupa, pk_student, pk_grupa,
pk_an_universitar) values(-1,8,2,1);

-- 7. Note
--grupa 6404
delete from note;
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,26,2,5,sysdate-401);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,26,1,4,sysdate-402);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)

Page 99 of 102

Baze de date
Project no.
Document no.

BD 2010

Product name:

Baze de date note de curs

Date:

Feb - 2010

Version no.:

0.1

Author:

Lucian Nita

CR no.:

values(-1,7,2,10,sysdate-1);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,7,1,10,sysdate);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,9,2,8,sysdate-1);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,9,1,9,sysdate);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,8,2,9,sysdate-1);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,8,1,9,sysdate);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,11,2,5,sysdate-1);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,11,1,4,sysdate);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,10,2,9,sysdate-1);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,10,1,9,sysdate);
--grupa 6403
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,2,2,8,sysdate-1);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,2,1,6,sysdate);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,4,3,4,sysdate);
--grupa 6401
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,15,5,7,sysdate);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,16,5,9,sysdate);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,17,5,4,sysdate);
--grupa 6303
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,25,3,5,sysdate);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,21,3,9,sysdate);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,24,3,8,sysdate);
insert into note(pk_nota,pk_student_grupa,pk_disciplina,nota,data)
values(-1,22,3,6,sysdate);
commit;

Page 100 of 102

Baze de date
Project no.
Document no.

BD 2010

Product name:

Baze de date note de curs

Date:

Feb - 2010

Version no.:

0.1

Author:

Lucian Nita

CR no.:

Fraze select n baza de date


13.2.1

Studenti-grupe-discipline-note

select stg.pk_student_grupa, st.nume_student, st.prenume_student, g.cod_grupa,


d.cod_disciplina, n.nota, n.data, d.pk_disciplina, ast.cod_an_studiu,
au.cod_an_universitar
from studenti_grupe stg, studenti st, ani_universitari au, grupe g,
specializari s,
discipline d, ani_studiu ast, note n
where stg.pk_student = st.pk_student
and stg.pk_an_universitar = au.pk_an_universitar
and stg.pk_grupa = g.pk_grupa
and g.pk_specializare = s.pk_specializare
and s.pk_specializare = d.pk_specializare
and g.cod_grupa = '6404'
and g.pk_an_studiu = d.pk_an_studiu
and g.pk_an_studiu = ast.pk_an_studiu
and stg.pk_student_grupa = n.pk_student_grupa
and d.pk_disciplina = n.pk_disciplina
order by au.cod_an_universitar, g.cod_grupa,st.nume_student
;

Page 101 of 102

Baze de date
Project no.
Document no.

BD 2010

Product name:

Baze de date note de curs

Date:

Feb - 2010

Version no.:

0.1

Author:

Lucian Nita

CR no.:

Creare useri, import, export


--exp luci2/luci2@statia1_scoala file=d:\stud.dmp
--imp pavel/pavel@statia1_scoala fromuser=luci2 touser=pavel file=d:\stud.dmp
drop user pavel cascade;
create user pavel identified by pavel;
grant dba to pavel;

Page 102 of 102

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