Documente Academic
Documente Profesional
Documente Cultură
2021
BAZE DE DATE
ASPECTE CONCEPTUALE PRIVIND
ORGANIZAREA DATELOR
BUCUREŞTI
2021-2022
Conf.univ.dr. IULIANA BOTHA (ȘIMONCA)
iuliana.botha@ie.ase.ro
Organizarea datelor
Organizarea datelor presupune:
• definirea şi structurarea datelor în colecţii de date
omogene în memoria internă sau în memoria externă;
• stabilirea legăturilor între date, conform unui model de
date.
1
04.10.2021
Organizarea datelor
Memoria internă vs. Memoria externă
Obiective specifice
• Minimizarea timpului de acces;
• Minimizarea spaţiului de memorie ocupat;
• Eliminarea redundanţei datelor;
• Reprezentarea, pe cât este posibil, a tuturor
legăturilor dintre obiectele, fenomenele, procesele
economice pe care aceste date le reprezintă;
• Asigurarea independenţei datelor faţă de programe şi
invers.
2
04.10.2021
Paradigma DIKUW
(Data > Information > Knowledge > Understanding > Wisdom)
Înţelepciune
Înţelegere
Cunoştinţe
Informaţii
Date
• Proces analitic prin care se sintetizează informaţii derivate, în vederea adăugării unui plus de
cunoaştere
Înţelegere • Se folosesc cunoştinţe pentru verificarea ipotezelor şi observarea de contradicţii, ambiguităţi
3
04.10.2021
Fişiere de date
• Fişierul reprezintă o colecţie organizată de date,
omogenă din punct de vedere al conţinutului şi
al prelucrării, stocată pe un suport de memorie
externă;
4
04.10.2021
• Acces secvenţial
• Acces direct
10
5
04.10.2021
11
12
6
04.10.2021
Baze de date
13
14
7
04.10.2021
Generația IV
(2010+)
Generația III • BD NoSQL
(1990)
Generația II • BD orientate-
(1980) obiect
• BD relaționale
Generația I
(1970)
• BD ierarhice și
rețea
16
8
04.10.2021
17
18
9
04.10.2021
19
Depozite de date
Depozitele de date sunt destinate managerilor şi
analiştilor în procesul luării deciziilor strategice privind
dezvoltarea şi viitorul organizaţiilor.
Furnizează o sursă integrată şi centralizată de date,
separată de sistemul operaţional.
Datele extrase sunt utilizate în analize dinamice care
presupun schimbări de perspectivă asupra datelor şi
vizualizări ale acestora de la un nivel detaliat la unul
sintetic, agregat şi invers.
20
10
04.10.2021
Obiective
• Depozitul de date trebuie să asigure accesul la datele
organizaţiei;
• Utilizarea datelor din depozite direct în analize, fără
alte prelucrări suplimentare;
• Stocarea de date istorice;
• Orientarea depozitului pe subiectele importante ale
procesului economic: clienţi, furnizori, produse,
activităţi.
21
22
11
04.10.2021
23
CURSUL 2...
Elemente de teoria bazelor de date
Modele de date
12
10.10.2021
BAZE DE DATE
ELEMENTE DE TEORIA
BAZELOR DE DATE
BUCUREŞTI
2021-2022
Conf.univ.dr. IULIANA BOTHA (ȘIMONCA)
iuliana.botha@ie.ase.ro
Baze de date
Metadate
SBD
SGBD
Entitatea
1
10.10.2021
Instanţa
Atributul
▪ Este o proprietate care:
✓ descrie o entitate
✓ cuantifică o entitate
✓ califică o entitate
✓ clasifică o entitate
✓ specifică o entitate
Atributul
▪ Definirea unui atribut poate fi extinsă prin impunerea
unui tip de dată, a unui format de reprezentare, a unei
valori implicite, a restricţiilor de integritate.
▪ Atribute cheie, non-cheie, opţionale, obligatorii
2
10.10.2021
Valoarea
▪ Un atribut are o singură valoare, la un moment
dat, pentru fiecare instanţă a entităţii.
▪ Atributele pot avea valori:
✓ Volatile
✓ Non-volatile
✓ Elementare
✓ Compuse
caracteristici
(atribute, câmpuri)
valoare instanţă
(înregistrare, articol)
Metadate:
✓date despre date;
✓descrierea detaliată a datelor, formatul şi caracteristicile instanţelor populate
cu date;
✓stocate în dicţionarul bazei de date.
Terminologie alternativă
3
10.10.2021
Sistem
Un sistem desemnează un ansamblu de entităţi
între care există legături variabile de
intercondiţionare şi a cărui funcţionare,
desfăşurată într-un mediu dinamic, pe care îl
influenţează şi de care este influenţat, permite
atingerea unor obiective cu evoluţie dinamică.
10
Sistemul
informatic
Sistemul operaţional
(condus)
11
Sistemul informatic
Este inclus în cadrul sistemului informaţional şi are ca
obiect de activitate, în general, procesele de
culegere, verificare, transformare, stocare şi
prelucrare automată a datelor.
Componentele sistemului informatic:
◦ Hardware
◦ Software
◦ Comunicaţii
◦ Baza ştiinţifico-metodologică
◦ Baza informaţională
◦ Resursele umane
12
4
10.10.2021
BAZE DE DATE
MODELE DE DATE
Modelul de date
Model abstract care descrie modul în care datele
sunt reprezentate şi accesate, utilizând formalizări
matematice.
Elementele modelului de date:
1. Structura de date
2. Operatorii
3. Restricţiile de integritate
14
Structura de date
Modalitate de stocare a informaţiilor într-un sistem
informatic, astfel încât acestea să poată fi utilizate în mod
eficient.
Poate fi definită ca o colecţie de date între care s-au stabilit
o serie de legături care conduc la un anumit mecanism de
selecţie şi identificare a componentelor.
Categorii de legături:
◦ legături de apartenenţă a datelor la entitate;
◦ legături dintre entităţile de acelaşi tip sau de tipuri diferite.
15
5
10.10.2021
Structura de date
În funcţie de tipurile de legături există cinci structuri logice
de date şi anume:
◦ structura punctuală,
◦ structura liniară: masivele unidimensionale (vectorii), masivele
multidimensionale (matrice), stiva şi listele.
◦ structura arborescentă (arborii)
◦ structura reţea
◦ structura relaţională (colecţie de date structurate în tabele de date
elementare fără o legătură fizică între ele).
Operatorii
Acţionează asupra structurilor de date pentru operaţii de
prelucrare: actualizare, consultare, sortare.
17
Restricţiile de integritate
Au rolul de a păstra datele corecte, consistente şi coerente
în procesul de culegere, stocare, prelucrare, transmitere şi
extragere a acestora.
18
6
10.10.2021
19
BAZE DE DATE
ORGANIZAREA DATELOR
ÎN BAZE DE DATE
Baze de date
Conform CODASYL, o bază de date este definită ca
una sau mai multe colecţii de date aflate în
interdependenţă, împreună cu un fişier de
descriere globală a datelor şi a legăturilor dintre
acestea (dicţionarul de date).
21
7
10.10.2021
22
24
8
10.10.2021
25
26
9
10.10.2021
28
Arhitectura pe componente a
unui SBD
29
Datele
▪ Colecţiile cu datele propriu-zise: între aceste colecţii de date
sunt legături de diferite tipuri (unu la unu, unu la mulţi, mulţi
la mulţi), fiecare colecţie trebuind să fie legată de cel puţin o
altă colecţie din baza de date;
▪ Dicţionarul de date: zonă separată a bazei de date care
conţine informaţii despre baza de date şi cuprinde structura
de date, restricţiile de integritate, viziunile, clusterele etc.;
▪ Fişierele anexe: conţin informaţii auxiliare bazei de date
30
10
10.10.2021
Componenta software
▪ Are rolul de a realiza şi exploata baza de date
▪ Ansamblu complex de programe utilizate pentru
realizarea aplicaţiilor cu baze de date, care conţine:
◦ sistemul de gestiune a bazelor de date cu ajutorul
căruia utilizatorul poate realiza şi exploata baza de
date;
◦ programele de aplicaţie dezvoltate de către
utilizatori.
31
Elemente auxiliare
▪ setul de proceduri automate (rutine) şi manuale conform
cărora se va desfăşura activitatea în cadrul sistemului de
baze de date;
▪ reglementările legale privind dreptul de utilizare a unor
produse şi servicii necesare în sistemul de baze de date;
▪ reglementările administrative ale organizaţiei în care se va
realiza sistemul de baze de date;
▪ mijloacele hardware utilizate pentru buna funcţionare a
sistemului de baze de date;
▪ personalul implicat pentru realizarea şi utilizarea sistem de
baze de date, pe categorii de utilizatori.
32
33
11
10.10.2021
CURSUL 3...
Modelul de date relaţional
34
12
18.10.2021
BAZE DE DATE
BUCUREŞTI
2021-2022
Conf.univ.dr. IULIANA BOTHA (ȘIMONCA)
iuliana.botha@ie.ase.ro
❑ Structura relaţională
❑ Operatorii relaţionali
❑ Restricţiile de integritate
Structura relaţională
❑ Domeniu
❑ Relaţie
❑ Atribut
❑ Tuplu
❑ Cheie
❑ Schemă
1
18.10.2021
Domeniul
Reprezintă un ansamblu de valori, caracterizat
printr-un nume.
Un domeniu se poate defini:
◦ explicit, prin enumerarea tuturor valorilor aparţinând
acestuia
◦ implicit, prin precizarea proprietăţilor pe care le au valorile
din cadrul domeniului respectiv
Exemplu:
D1 : {"F", "M" }
D2 : {x | x N, x [0, 100]}
D3 : {s | s=şir de caractere}
Domeniul
Pentru un ansamblu de domenii D1, D2, ..., Dn
produsul cartezian al acestora reprezintă ansamblul
tuplurilor <v1, v2, ..., vm>, unde: v1 este o valoare
aparţinând domeniului D1, v2 este o valoare din D2
ş.a.m.d.
De exemplu, tuplurile:
<"Maria", "F", 50>,
<"Vasile", "M", 15>,
<"Vasile", "M", 20>,
<"Vasile", "F", 100>
aparţin produsului cartezian: D3 D1 D2.
Relaţia
Relaţia reprezintă un subansamblu al produsului cartezian al
mai multor domenii, care este caracterizat printr-un nume şi
conţine tupluri cu semnificaţie.
Într-o relaţie, tuplurile trebuie să fie distincte (nu se admit
duplicări).
2
18.10.2021
Relaţia
R : {<a, 1, α >, <b, 2, β >}
Reprezentare ca tabel bidimensional
D3 D1 D2
a 1 α
b 2 β
Atributul
Atributul reprezintă coloana unei tabele de date,
caracterizată printr-un nume. Numele coloanei (atributului)
exprimă, de regulă, semnificaţia valorilor din cadrul coloanei
respective.
Tuplul
Tuplul reprezintă linia unei tabele de date şi nu are nume.
Cheia
Cheia desemnează un atribut sau un ansamblu de atribute
care are rolul de a identifica o înregistrare dintr-o tabelă.
Extensia relației
Extensia unei relaţii: ansamblul tuplurilor care compun
la un moment dat relaţia
Cardinalul relației
Cardinalul relației: numărul tuplurilor dintr-o relaţie
Gradul relației
Gradul relației: numărul valorilor dintr-un tuplu
3
18.10.2021
Algebra relaţională
Introdusă de E.F.Codd ca o colecţie de operaţii pe relaţii
în care operatorii descriu tipuri de prelucrări asupra
relaţiilor, operanzii sunt relaţii, iar rezultatul este, de
asemenea, o relaţie.
◦ Operatori de bază:
➢ Universali: reuniunea, diferenţa, produsul
cartezian
➢ Specifici: proiecţia, selecţia şi joncţiunea
◦ Operatori derivaţi: intersecţia şi diviziunea
◦ Extensii ale algebrei relaţionale standard:
complementarea unei relaţii, spargerea unei relaţii şi
închiderea tranzitivă.
4
18.10.2021
R A1 A2 A3 A4
Proiecţia
Definită asupra unei relaţii R, proiecţia constă din
construirea unei noi relaţii P, în care se regăsesc numai
acele atribute din R specificate explicit în cadrul
operaţiei.
Implică efectuarea unor tăieturi verticale asupra relaţiei
R şi care pot avea ca efect apariţia unor tupluri
duplicate, care se cer a fi eliminate.
Se trece de la o relaţie de grad n la o relaţie de grad p,
mai mic decât cel iniţial (p < n), adică de la un spaţiu de
n dimensiuni la unul cu mai puţine dimensiuni, ceea ce
explică şi numele de proiecţie.
Proiecţia
Ai,……, Am (R)
R[Ai,..., Am]
PROJECT(R, Ai,..., Am)
ANGAJATI Varsta,salariu
Nume Varsta Salariu Varsta Salariu
Ion 25 3000 25 3000
Varsta Salariu
Mihai 30 2000 30 2000
25 3000
Anca 25 3000 25 3000
30 2000
Sofia 30 2000 30 2000
Mircea 30 2000 30 2000
Exemplu SQL
FROM angajati;
5
18.10.2021
R A1 A2 A3 A4
Selecţia
Reprezintă operaţia definită asupra unei relaţii R,
care constă din construirea unei relaţii S, cu aceeaşi
schemă ca R şi a cărei extensie este constituită din
acele tupluri din R care satisfac condiţia menţionată
explicit în cadrul operaţiei.
Implică efectuarea de tăieturi orizontale asupra
relaţiei R, adică eliminarea unor tupluri ale relaţiei.
Selecţia
δcondiţie (R)
R [condiţie]
RESTRICT (R, condiţie)
ANGAJATI
Nume Varsta Salariu δ(salariu>2000 or nume=Mircea)
Ion 25 3000 Nume Varsta Salariu
Mihai 30 2000 Ion 25 3000
Anca 25 3000 Anca 25 3000
Sofia 30 2000 Mircea 30 2000
Mircea 30 2000
Exemplu SQL
SELECT *
FROM angajati
6
18.10.2021
Produsul cartezian
Este o operaţie definită pe două relaţii, R1 şi R2.
Pe baza relaţiilor R1 şi R2 se construieşte o nouă
relaţie, R3, a cărei schemă se obţine prin
concatenarea schemelor relaţiilor R1 şi R2 şi a cărei
extensie cuprinde toate combinaţiile tuplurilor din
R1 cu cele din R2.
Produsul cartezian
R1 x R2
PRODUCT (R1, R2) Angajati x Comenzi
ID Nume NRC Data ID
TIMES (R1, R2)
1 Ion 1 01.01.11 1
Angajati Comenzi
1 Ion 2 07.01.11 2
ID Nume NRC Data ID
1 Ion 3 08.01.11 3
1 Ion 1 01.01.11 1
1 Ion 4 08.01.11 2
2 Mihai 2 07.01.11 2
1 Ion 5 09.01.11
3 Anca 3 08.01.11 3
2 Mihai 1 01.01.11 1
4 Sofia 4 08.01.11 2
2 Mihai 2 07.01.11 2
5 Mircea 5 09.01.11
…… ……. …… …… ……
Exemplu SQL
SELECT *
FROM angajati, comenzi;
SELECT *
FROM angajati CROSS JOIN comenzi;
7
18.10.2021
Joncţiune
Reprezintă operaţia definită pe două relaţii, R1 şi R2,
care constă din construirea unei noi relaţii R3, prin
concatenarea unor tupluri din R1 cu tupluri din R2,
pe baza unei condiţii specificate explicit în cadrul
operaţiei.
Extensia relaţiei R3 va conţine combinaţiile acelor
tupluri care satisfac condiţia de concatenare.
Tipuri de joncţiuni
❑ Internă (inner join)
➢ De egalitate
➢ Naturală
➢ De neegalitate
❑ Externă (outer join)
➢ La stânga
➢ La dreapta
➢ Completă
Tipuri de joncţiuni
8
18.10.2021
R1 ⋈ R2
Joncţiunea de egalitate
Operaţie definită pe două relaţii, R1 şi R2, prin care
este construită o nouă relaţie, R3, a cărei schemă
este obţinută prin reuniunea atributelor din
relaţiile iniţiale;
Extensia relaţiei R3 conţine tuplurile obţinute prin
concatenarea tuplurilor din R1 cu tuplurile din R2
care au aceleaşi valori pentru atributele folosite în
condiţia de joncţiune.
Joncţiunea de egalitate
Angajati Comenzi
9
18.10.2021
Exemple SQL
SELECT *
FROM angajati a, comenzi c
WHERE a.id_ang=c.id_ang;
SELECT *
FROM angajati a JOIN comenzi c
ON a.id_ang=c.id_ang;
SELECT *
FROM angajati a JOIN comenzi c
USING (id_Ang);
Joncţiunea naturală
Presupune existenţa unor atribute având aceeaşi
denumire în ambele relaţii
Joncţiunea externă
Operaţie prin care din două relaţii, R1 şi R2, se
obţine o nouă relaţie, R3, prin joncţiunea relaţiilor
iniţiale
La noua relaţie R3 sunt adăugate şi tuplurile din R1
şi/sau R2 care nu au participat la joncţiune.
Aceste tupluri sunt completate în relaţia R3 cu valori
NULL pentru atributele relaţiei corespondente (R2,
respectiv R1).
◦ R1 ⋈ R2
◦ EXT-JOIN (R1, R2, condiţie)
10
18.10.2021
Joncţiunea la stânga
Joncţiunea la dreapta
Joncţiunea completă
11
18.10.2021
Reuniunea
Este o operaţie definită pe două relaţii, R1 şi R2,
ambele cu aceeaşi schemă, prin care se obţine o
nouă relaţie R3, cu schema identică cu R1 şi R2, dar
având ca extensie tuplurile din R1 şi R2, luate
împreună o singură dată.
◦ R1 R2
◦ OR (R1, R2)
◦ APPEND (R1, R2)
◦ UNION (R1, R2)
Exemplu UNION
Clienti Angajati
12
18.10.2021
Diferenţa
Este o operaţie definită pe două relaţii, R1 şi R2,
ambele cu aceeaşi schemă, prin care se obţine o
nouă relaţie, R3, cu extensia formată din acele
tupluri ale relaţiei R1 care nu se regăsesc şi în relaţia
R 2.
◦ R1 – R2
◦ REMOVE (R1, R2)
◦ MINUS (R1, R2)
Diferenţa
NU!
DE CE?
Clienti – Comenzi
Clienti – Comenzi
DA
Ce afişează?
13
18.10.2021
Intersecţia
Reprezintă o operaţie definită pe două relaţii, R1 şi
R2 ambele cu aceeaşi schemă, prin care se obţine o
nouă relaţie, R3, cu schema identică cu a relaţiilor
operand şi cu extensia formată din tuplurile din R1
şi R2.
◦ R1 R2
◦ INTERSECT (R1, R2)
◦ AND (R1, R2)
Intersecţia
Clienti Comenzi
Ce afişează?
14
18.10.2021
Alţi operatori
❑ Diviziunea
❑ Complementarea
❑ Spargerea unei relaţii
❑ Închiderea tranzitivă
Calculul relaţional
Introdus, ca şi algebra relaţională de către E.F.
Codd.
Este o adaptare a calculului cu predicate de ordinul
1 (domeniu al logicii matematice) la domeniul
bazelor de date relaţionale.
Predicatul este o relaţie care se stabileşte între
anumite elemente şi care are drept argumente
variabile care nu sunt predicate.
Calculul relaţional
Variabila poate fi de tip tuplu (valorile sunt dintr-un
tuplu al unei tabele) sau domeniu (valorile sunt
dintr-un domeniu al unei tabele).
Rezultă:
◦ Calcul relaţional orientat pe tuplu
◦ Calcul relaţional orientat pe domeniu
15
18.10.2021
Operatori
❑ Conectivele (conectorii):
• Conjuncţia
• Disjuncţia
• Negaţia
❑ Cuantificatorii:
• Cuantificatorul existenţial
• Cuantificatorul universal
Restricţiile de integritate
Restricţiile de integritate, denumite şi reguli de
integritate, definesc cerinţele pe care trebuie să le
satisfacă datele din cadrul bazei de date pentru a
putea fi considerate corecte şi coerente în raport cu
domeniul pe care îl reflectă.
Restricţiile de integritate
❑ Restricţii structurale (minimale):
▪ De unicitate a cheii
▪ Referenţială
▪ Entităţii
❑ Restricţii de comportament:
▪ De domeniu
16
18.10.2021
Restricţia referenţială
Un atribut sau un grup de atribute dintr-o relaţie R1 ale
cărui/căror valori sunt definite pe acelaşi/aceleaşi
domeniu/domenii ca şi cheia primară a unei alte relaţii,
R2 şi care are rolul de a modela asocierea între entităţile
reprezentate cu ajutorul relaţiilor R1 şi R2.
R1 şi R2 nu trebuie să fie neapărat distincte.
CLIENTI
COMENZI
Id_client Cheie primară
Nr_comanda Cheie primară Denumire
Data_comanda CUI Cheie candidată
Data_livrare CNP Cheie candidată
Modalitate_comanda Capital_social
Modalitate_livrare Nivel_venit
Id_client Cheie externă Email
17
18.10.2021
Restricţia entităţii
Restricţia entităţii reprezintă restricţia de
integritate care impune ca într-o relaţie, anumite
atribute sa fie nenule.
CLIENTI COMENZI
Restricţiile de integritate
suportate în SQL-Oracle
NOT NULL
◦ nu permite valori NULL (nespecificate) în coloanele unei tabele;
UNIQUE
◦ nu permite valori duplicat în coloanele unei tabele;
PRIMARY KEY
◦ nu permite valori duplicate sau NULL în coloana sau coloanele definite
astfel;
FOREIGN KEY
◦ presupune ca fiecare valoare din coloana sau setul de coloane definit
astfel să aibă o valoare corespondentă identică în tabela de legătură,
tabelă în care coloana corespondentă este definită cu restricţia
UNIQUE sau PRIMARY KEY;
CHECK
◦ elimină valorile care nu satisfac anumite cerinţe (condiţii) logice.
18
18.10.2021
Exemplificare SQL-Oracle
Exemplificare SQL-Oracle
Exemplificare SQL-Oracle
19
18.10.2021
Să se rezolve!
Fie două tabele COMEZI şi FIRME fiecare având câte 20 de înregistrări. O
firmă poate da mai multe comenzi, o comandă trebuie dată de către o
singură firmă. Care din următoarele afirmaţii este adevărată:
a)Un left join între COMEZI şi FIRME nu poate returna acelaşi număr de
înregistrări ca un right join între FIRME şi COMENZI
b)Un full join între cele două tabele nu poate returna acelaşi număr de
înregistrări ca un left join între FIRME şi COMEZI
c)Produsul cartezian între cele două tabele nu returnează mai multe
înregistrări decât un full join între aceleaşi tabele
d)Un inner join între FIRME şi COMENZI poate returna acelaşi număr de
înregistrări ca un right join între aceleaşi tabele
e)Toate afirmaţiile de mai sus sunt false
CURSUL 4...
Baze de date relaţionale
20
25.10.2021
Definiţie BDR
BUCUREŞTI
2021-2022
Conf.univ.dr. IULIANA BOTHA (ȘIMONCA)
2
iuliana.botha@ie.ase.ro
1
25.10.2021
2
25.10.2021
5 6
3
25.10.2021
Descrierea entităţilor
7 8
4
25.10.2021
Asocierile dintre entităţi pot fi clasificate după mai multe criterii, şi anume: Asocierile dintre entităţi pot fi clasificate după mai multe criterii, şi anume:
A. Cardinalitatea asocierii: A. Cardinalitatea asocierii:
1. gradul asocierii (maximele cardinalităţii): 2. obligativitatea participării entităţilor la asociere (minimele
a) asocieri de tip unu la unu; cardinalităţii):
b) asocieri de tip unu la mulţi; a) asocieri parţiale;
c) asocieri de tip mulţi la mulţi. b) asocieri totale (complete).
9 10
5
25.10.2021
Asocierile dintre entităţi pot fi clasificate după mai multe criterii, şi anume: Asocierile dintre entităţi pot fi clasificate după mai multe criterii, şi anume:
A. Cardinalitatea asocierii: B. Numărul de entităţi distincte care participă la asociere:
3. concomitent după gradul asocierii şi după obligativitatea participării 1. asocieri binare (între două entităţi distincte);
la asociere: 2. asocieri recursive (asocieri ale entităţilor cu ele însele);
a) asocieri parţiale de tip unu la unu; 3. asocieri complexe (între mai mult de două entităţi distincte).
b) asocieri totale de tip unu la unu;
c) asocieri parţiale de tip unu la mulţi;
d) asocieri totale de tip unu la mulţi;
e) asocieri parţiale de tip mulţi la mulţi;
f) asocieri totale de tip mulţi la mulţi.
11 12
6
25.10.2021
efectuează
COMANDĂ unul sau mai mulţi angajaţi
CLIENT
este realizată
13 14
7
25.10.2021
15 16
8
25.10.2021
17 18
9
25.10.2021
19 20
10
25.10.2021
21 22
11
25.10.2021
23 24
12
25.10.2021
25 26
13
25.10.2021
27 28
14
25.10.2021
Studiu de caz
1. Să se construiască diagrama entitate-asociere pentru următorul scenariu.
2. Să se proiecteze schema conceptuală a bazei de date relaţionale.
CURSUL 5...
Studiul de caz tratează gestiunea activităţii unei unităţi hoteliere.
În vederea cazării, un client poate solicita rezervarea uneia sau mai multor camere prin e-mail sau
telefonic. Pentru aceasta furnizează recepţionerului informaţii privind perioada de cazare şi Baze de date relaţionale – Tehnica normalizării
tipurile de camere solicitate. Clienţii vor beneficia de reduceri dacă rezervă cel puţin 3 camere sau
dacă perioada de cazare depăşeşte 5 zile. Recepţionerul verifică disponibilitatea camerelor şi îl
înştiinţează pe client de acest lucru precum şi de costul estimat al cazării. Dacă nu există camere
disponibile conform solicitării, recepţionerul poate oferi clientului alternative. De asemenea,
clientul poate solicita un discount (suplimentar sau nu), iar recepţionerul va decide fezabilitatea
discountului, fiind asistat obligatoriu de managerul hotelului. În situaţia în care clientul este de
acord cu preţul propus, se va proceda la realizarea rezervării. Pentru clienţii noi, recepţionerul
solicită datele de identificare, pe care le introduce în aplicaţie.
Odată ajuns la hotel, şi dacă a făcut în prealabil o rezervare, clientul va furniza datele de
identificare ale sale şi/sau ale rezervării şi se face cazarea. Dacă nu există o rezervare, se va
verifica disponibilitatea camerelor pentru perioada cerută. Atunci când se găseşte o astfel de
cameră, se face cazarea. La finalul sejurului, recepţionerul întocmeşte o listă cu toate serviciile
solicitate de client şi preţul acestora. Lista trebuie validată de client, după care se întocmeşte
factura finală. Factura poate fi plătită parţial sau integral, prin transfer bancar, numerar sau
folosind un card bancar. Totodată, înainte de a părăsi hotelul, clientul este rugat să completeze un
formular prin care să evalueze serviciile oferite de unitatea hotelieră.
29 30
15
30.10.2021
BAZE DE DATE
BUCUREŞTI
2021-2022
Tehnica normalizării
Optimizarea schemei conceptuale a BDR
1
30.10.2021
Tehnica normalizării
Optimizarea schemei conceptuale a BDR
Tehnica normalizării
Optimizarea schemei conceptuale a BDR
2
30.10.2021
Tehnica normalizării
Anomaliile de actualizare
Tehnica normalizării
Forma normală unu (FN1)
3
30.10.2021
Tehnica normalizării
Aducerea relaţiilor în FN1
Tehnica normalizării
Aducerea relaţiilor în FN1
R
Marca Nume_angajat Adresa Prenume_copil Datanaştere_copil
4
30.10.2021
Tehnica normalizării
Forma normală doi (FN2)
Tehnica normalizării
Aducerea relaţiilor în FN2
5
30.10.2021
Tehnica normalizării
Aducerea relaţiilor în FN2
R
NrComanda CodProdus DenProdus UM Cantitate
În relaţia R se manifestă R1
următoarele dependenţe NrComanda CodProdus Cantitate
funcţionale parţiale:
CodProdus → DenProdus
CodProdus → UM
R2
CodProdus DenProdus UM
11
Tehnica normalizării
Forma normală trei (FN3)
12
6
30.10.2021
Tehnica normalizării
Aducerea relaţiilor în FN3
13
Tehnica normalizării
Aducerea relaţiilor în FN3
R
Marca NumeAng DataAng Salariu CodDep DenDep CodFunctie DenFunctie SalMin SalMax
R1
În cadrul relaţiei R se manifestă
Marca NumeAng DataAng Salariu CodDep CodFunctie
dependenţele funcţionale
tranzitive:
CodDep → DenDep
CodFunctie → DenFunctie R2
CodFunctie → SalMin CodDep DenDep
CodFunctie → SalMax
R3
CodFunctie DenFunctie SalMin SalMax
14
7
30.10.2021
Tehnica normalizării
Forma normală Boyce-Codd (BCNF)
15
Tehnica normalizării
Aducerea relaţiilor în BCNF
8
30.10.2021
Tehnica normalizării
Aducerea relaţiilor în BCNF
Tehnica normalizării
Aducerea relaţiilor în BCNF
R
IdClient IdTranzactie Valoare ComisionStandard Piata Discount
R1
IdClient IdTranzactie Valoare ComisionStandard Piata
R2
Piata TipClient Discount
18
9
30.10.2021
Tehnica normalizării
Forma normală patru (FN4)
19
Tehnica normalizării
Aducerea relaţiilor în FN4
20
10
30.10.2021
Tehnica normalizării
Aducerea relaţiilor în FN4
R
Curs Profesor ReferintaBibliografica
R1
Curs Profesor
În cadrul relaţiei R se manifestă
următoarele dependenţe
multivaloare:
Curs →→ Profesor R2
Curs →→ ReferintaBibliografica Curs ReferintaBibliografica
21
Tehnica normalizării
Forma normală cinci (FN5)
22
11
30.10.2021
Tehnica normalizării
Aducerea relaţiilor în FN5
Tehnica normalizării
Aducerea relaţiilor în FN5
R
Curs Profesor Specializare
R1
Curs Profesor
În cadrul relaţiei R se
manifestă următoarele
dependenţe multivaloare: R2
Curs →→ Profesor Curs Specializare
Curs →→ Specializare
Profesor →→ Specializare
R3
Profesor Specializare
24
12
30.10.2021
Tehnica normalizării
Optimizarea schemei conceptuale a BDR
Data depends on the key, the whole key and nothing but the key...
So help me Codd!
FN1
FN2 FN3
26
13
30.10.2021
Tehnica normalizării
Determinarea formei normale la care trebuie aduse relaţiile din BDR
27
Studiu de caz
O societate comercială doreşte să-şi informatizeze activitatea de aprovizionare cu
mărfuri de la furnizori.
Aprovizionarea cu mărfuri se realizează în baza facturilor primite de la furnizori,
fiecare Factură identificându-se printr-un număr unic, dată factură, data scadenţei,
codul, denumirea, contul bancar al furnizorului, codul, denumirea, unitatea de
măsură, cantitatea şi preţul mărfurilor facturate, valoarea acestora şi valoarea
totală a facturii.
Furnizorii societăţii, se identifică printr-un cod unic, nume, adresa, telefon şi cont
bancar.
Nomenclatorul mărfurilor include cod marfă, denumire marfă, unitatea de măsură
şi caracteristici tehnice.
Plata facturii se realizează printr-o Chitanţă, conform facturii emise, în care se
precizează numărul chitanţei, data chitanţei, suma plătită, denumirea şi contul
furnizorului. Societatea plăteşte cu un astfel de document o singură factură.
28
14
30.10.2021
Studiu de caz
FACTURI_APROVIZIONARE
NrFact
Se identifică lista de atribute DataFact
▪NrFact ▪ ContBancar DataScad
Cantitate
▪DataFact ▪ Telefon
Pret
▪ CodMarfa
▪DataScad CodFz
▪ DenMarfa NumeFz
▪Cantitate
▪ UM Adresa
▪Pret ▪ Caracteristici ContBancar
▪CodFz ▪ NrChit Telefon
▪NumeFz ▪ DataChit CodMarfa
DenMarfa
▪Adresa ▪ SumaPlata
UM
Caracteristici
NrChit
DataChit
SumaPlata
29
Studiu de caz
Schema iniţială a relaţiei Facturi_Aprovizionare
(NrFact, DataFact, DataScad, Cantitate, Pret, CodFz, NumeFz, Adresa, ContBancar,
Telefon, CodMarfa, DenMarfa, UM, Caracteristici, NrChit, DataChit, SumaPlata)
Atribute compuse
Adresa: CodPostal, Strada, Localitate
Caracteristici: Culoare, Material, Dimensiuni
30
15
30.10.2021
Studiu de caz
FN1
FACTURI_APROVIZIONARE
NrFact
Cheie primară
DataFact
compusă !!!
DataScad
Cantitate
Pret
CodFz
NumeFz
Adresa
ContBancar
Telefon Atribute
CodMarfa compuse
DenMarfa
UM
Caracteristici
NrChit
DataChit
SumaPlata
31
FACTURI_APROVIZIONARE
Studiu de caz NrFact
FN1 DataFact
DataScad
Cantitate
Pret
CodFz
Facturi_Aprovizionare în FN1: NumeFz
(NrFact, DataFact, DataScad, Cantitate, Pret, CodPostal
CodFz, NumeFz, CodPostal, Strada, Localitate, Strada
ContBancar, Telefon, CodMarfa, DenMarfa, Localitate
UM, Culoare, Material, Dimensiuni, NrChit, ContBancar
Telefon
DataChit, SumaPlata)
CodMarfa
DenMarfa
UM
Culoare
Material
Dimensiuni
NrChit
DataChit
SumaPlata
32
16
30.10.2021
Studiu de caz
FN2 Dependenţe funcţionale:
(NrFact, CodMarfa) -> Cantitate
(NrFact, CodMarfa) -> Pret DETALII_
FACTURI_APROVIZIONARE APROVIZIONARE
NrFact -> DataFact
NrFact
NrFact -> DataScad
DataFact
DataScad NrFact -> CodFz
Cantitate NrFact -> NumeFz
Pret NrFact -> CodPostal
CodFz
NumeFz NrFact -> Strada FACTURI_
CodPostal NrFact -> Localitate APROVIZONARE
Strada NrFact -> ContBancar
Localitate
NrFact -> Telefon
ContBancar
Telefon NrFact -> NrChit
CodMarfa NrFact -> DataChit
DenMarfa NrFact -> SumaPlata
UM
Culoare CodMarfa -> DenMarfa
Material CodMarfa -> UM
Dimensiuni CodMarfa -> Culoare
NrChit MARFURI
CodMarfa -> Dimensiuni
DataChit
SumaPlata CodMarfa -> Material
33
Studiu de caz
FN2
FACTURI_APROVIZIONARE DETALII_APROVIZIONARE MARFURI
NrFact NrFact CodMarfa
DataFact CodMarfa DenMarfa
DataScad Cantitate UM
CodFz Pret Culoare
NumeFz Material
CodPostal Dimensiuni
Strada
Localitate
ContBancar
Telefon
NrChit
DataChit
SumaPlata
34
17
30.10.2021
Studiu de caz
FN3
Tabelele Marfuri și Detalii_Aprovizionare sunt în FN3
35
Studiu de caz
FN3
FACTURI_APROVIZIONARE DETALII_APROVIZIONARE MARFURI
NrFact NrFact CodMarfa
CodFz CodMarfa DenMarfa
DataFact Cantitate UM
DataScad Pret Culoare
Material
Dimensiuni
FURNIZORI CHITANTE
CodFz NrChit
NumeFz NrFact
CodPostal DataChit
Strada SumaPlata
Localitate
ContBancar
Telefon
36
18
30.10.2021
Studiu de caz
FN3
FACTURI_APROVIZIONARE DETALII_APROVIZIONARE MARFURI
NrFact NrFact CodMarfa
CodFz CodMarfa DenMarfa
DataFact Cantitate UM
DataScad Pret Culoare
Material
Dimensiuni
FURNIZORI
CodFz CHITANTE
NumeFz
CodPostal NrChit
Strada NrFact
Localitate DataChit
ContBancar
Telefon
37
CURSUL 6...
Limbaje relaţionale pentru definirea şi manipularea
datelor. Limbajul SQL.
19
ACADEMIA DE STUDII ECONOMICE BUCUREŞTI
FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ
BAZE DE DATE
BUCUREŞTI
2021-2022
1
Limbajul pentru definirea datelor (LDD)
❑ Descrierea datelor este stocată în dicţionarul BD.
❑ Comenzile LDD pot fi clasificate în funcţie de nivelul de
organizare a datelor la care acţionează:
✓ nivel conceptual
✓ nivel logic
✓ nivel fizic
2
Limbajul pentru definirea datelor (LDD)
Comenzile LDD care acţionează la nivel logic:
Comandă LDD Descriere
CREATE VIEW creează o tabelă virtuală
Caracteristici generale:
❑ tratarea datelor la nivel de ansamblu
❑ operatorii relaţionali implementaţi folosesc instrucţiuni din
limbajul relaţional existent în SGBDR, care poate avea la bază:
calculul relaţional, algebra relaţională, transformarea sau
grafica
❑ singurul limbaj relaţional standardizat internaţional este SQL
❑ utilizatorii limbajelor relaţionale sunt specialiştii
3
Limbajul SQL
Limbajul SQL
Versiuni ale An
Particularităţi
standardului SQL lansare
SQL-86 1986 Prima versiune SQL standardizată
SQL-89 1989 + restricţii de integritate
Versiune revizuită complet; stă la baza versiunilor
SQL-92 1992 ulterioare
SQL:1999 1999 + facilităţi ale limbajelor orientate-obiect
SQL:2003 2003 + facilităţi OLAP, comanda MERGE, facilităţi XML
SQL:2006 2006 + suport XML
SQL:2008 2008 + declanşatori INSTEAD OF, comanda TRUNCATE
SQL:2011 2011 + suport BD temporale
SQL:2016 2016 + suport JSON
SQL:2019 2019 + suport vectori multidimensionali
4
Limbajul SQL
Există două moduri de lucru cu baze de date şi anume:
❑ SQL interactiv, în care un utilizator tastează o singură
comandă, care este trimisă imediat bazei de date. Rezultatul
unei interogări interactive este o tabelă de date în memoria
principală;
❑ SQL încorporat (embedded SQL), în care declaraţiile SQL sunt
plasate într-un program de aplicaţie. Interfaţa poate fi pe
bază de videoformate sau linie de comandă. SQL poate fi
static (în cazul în care întreaga comandă este specificată la
momentul scrierii programului) sau dinamic (pe baza datelor
introduse de utilizator se formează comanda pentru baza de
date).
Limbajul SQL-Oracle
L I M BA JU L D E D E F I N I R E A DAT E LO R
5
Limbajul SQL-Oracle.
Crearea tabelelor
Tabela reprezintă o structură de date care conţine datele unei BDR.
În general, crearea unei tabele constă din:
❑ definirea coloanelor
❑ definirea restricţiilor de integritate
❑ specificarea parametrilor de stocare
❑ definirea cluster-ului în care este inclusă tabela etc.
11
Limbajul SQL-Oracle.
Crearea tabelelor
12
6
Limbajul SQL-Oracle.
Crearea tabelelor
13
Limbajul SQL-Oracle.
Crearea tabelelor
Restricţiile de integritate în Oracle:
❑ PRIMARY KEY
❑ FOREIGN KEY
❑ UNIQUE
❑ NOT NULL
❑ CHECK
14
7
Limbajul SQL-Oracle.
Crearea tabelelor
Restricţiile de integritate:
➢ pot fi create odată cu tabela sau după crearea acesteia
➢ pot fi activate sau dezactivate în funcţie de necesităţi (implicit
sunt active)
➢ pot fi specificate la nivel de coloană sau la nivel de tabelă (cu
excepţia NOT NULL)
➢ au ataşat un nume intern unic (specificat explicit de utilizator
sau atribuit automat de sistem)
➢ asigură faptul că valorile unei coloane satisfac o condiţie
declarată
➢ previn ştergerea unei tabele dacă există dependenţe
15
Limbajul SQL-Oracle.
Crearea tabelelor
▪ Restricţia PRIMARY KEY ataşată unui ansamblu de coloane (definirea
de cheie primară compusă) poate fi definită numai la nivel de tabelă.
▪ Restricţia NOT NULL poate fi definită numai la nivel de coloană.
▪ Restricţia CHECK la nivel de coloană nu poate referi alte coloane ale
aceleiaşi tabele. Definită la nivel de tabelă, însă, restricţia poate face
referire la una sau mai multe coloane.
▪ Restricţia FOREIGN KEY poate fi definită cu opţiunile:
➢ ON DELETE CASCADE – ştergerea unei înregistrări din tabela părinte
este autorizată şi implică ştergerea automată a înregistrărilor
corespondente din tabela copil;
➢ ON DELETE SET NULL – ştergerea unei înregistrări din tabela părinte
este autorizată şi implică transformarea în valori NULL a valorilor cheii
externe din înregistrările corespondente aflate în tabela copil.
16
8
Limbajul SQL-Oracle.
Crearea tabelelor
1) fără indicarea restricţiilor de integritate
Limbajul SQL-Oracle.
Crearea tabelelor
2) cu indicarea restricţiilor de integritate la nivel de coloană
18
9
Limbajul SQL-Oracle.
Crearea tabelelor
3) cu indicarea restricţiilor de integritate la nivel de tabelă
CREATE TABLE angajati (
marca NUMBER(4),
nume VARCHAR2(20),
prenume VARCHAR2(20),
email VARCHAR2(20),
data_angajare DATE DEFAULT SYSDATE,
salariu NUMBER(8,2),
id_departament NUMBER(3),
CONSTRAINT pkAng PRIMARY KEY (marca),
CONSTRAINT uqMail UNIQUE (email),
CONSTRAINT ckMail CHECK (email LIKE '%@%.%'),
CONSTRAINT nnNume CHECK (nume IS NOT NULL),
CONSTRAINT nnPrenume CHECK (prenume IS NOT NULL),
CONSTRAINT fkDep FOREIGN KEY(id_departament) REFERENCES
departamente (id_departament) ON DELETE CASCADE );
19
Limbajul SQL-Oracle.
Crearea tabelelor
4) prin copiere din altă tabelă
20
10
Limbajul SQL-Oracle.
Modificarea structurii tabelelor
Modificarea structurii unei tabele constă din:
❑ adăugarea unor coloane noi într-o tabelă existentă (eventual
cu indicarea de restricţii sau de valori implicite)
❑ modificarea coloanelor unei tabele
❑ specificarea unor restricţii pentru coloane existente
❑ activarea, dezactivarea sau suprimarea unor restricţii de
integritate
❑ redenumiri ale coloanelor sau redenumirea tabelei
21
Limbajul SQL-Oracle.
Modificarea structurii tabelelor
ALTER TABLE nume_tabela
ADD (nume_coloana_1 tip_data restrictie,
... nume_coloana_2 tip_data restrictie);
22
11
Limbajul SQL-Oracle.
Modificarea structurii tabelelor
ALTER TABLE nume_tabela
ADD CONSTRAINT nume_restrictie tip_restrictie ….;
23
Limbajul SQL-Oracle.
Modificarea structurii tabelelor
24
12
Limbajul SQL-Oracle.
Modificarea structurii tabelelor
❑ Schimbarea definiţiei unei coloane din NULL în NOT NULL se
poate realiza doar dacă există siguranţa că fiecare linie a
coloanei respective este NOT NULL sau dacă tabela nu are
date.
25
Limbajul SQL-Oracle.
Ştergerea tabelelor
26
13
Limbajul SQL-Oracle.
Ştergerea tabelelor
27
Limbajul SQL-Oracle.
Ştergerea tabelelor
28
14
CURSUL 7...
15
ACADEMIA DE STUDII ECONOMICE BUCUREŞTI
FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ
BAZE DE DATE
BUCUREŞTI
2021-2022
Limbajul SQL-Oracle
L I M BA JU L D E M A N I P U L A R E A DAT E LO R
1
Limbajul SQL-Oracle
Limbajul SQL-Oracle
Interogarea datelor
Clauze în SELECT Descriere
restricţionează liniile care se returnează pe baza unui criteriu
WHERE condiţie specificat în condiţia de selecţie
structurează rezultatul într-o manieră ierarhică (asemănător
clauze de ordonare ierarhică cu o organigramă)
grupează liniile în scopul identificării valorilor comune
GROUP BY coloane_grupare grupurilor (valori agregate calculate prin funcţii de grup)
restricţionează grupurile create prin clauza GROUP BY pe baza
HAVING condiţie unei condiţii asupra funcţiilor de grup
ORDER BY coloane_ordonare sortează liniile (implicit ascendent)
2
Rezolvaţi!
Se consideră tabela: PORTS (PORT_ID, PORT_NAME, COUNTRY, CAPACITY), având
următoarele înregistrări:
PORT_ID PORT_NAME COUNTRY CAPACITY
1 Galveston USA 4
2 San Diego USA 4
3 San Francisco USA 3
4 Los Angeles USA 4
5 San Juan USA 3
6 Grand Cayman UK 3
Ce rezultat va produce următoarea interogare SQL:
SELECT *
FROM PORTS
WHERE PORT_NAME LIKE 'San%'
OR PORT_NAME LIKE 'Grand%'
AND CAPACITY = 4;
5
Limbajul SQL-Oracle
Precedenţa operatorilor
Operator
*, /, -,+
= , >= , > , <= , < , <> , != , IS , LIKE , IN
BETWEEN
NOT
AND
|| , OR
3
Rezolvaţi!
Se consideră tabela: PORTS (PORT_ID, PORT_NAME, COUNTRY, CAPACITY), având
următoarele înregistrări:
PORT_ID PORT_NAME COUNTRY CAPACITY
1 Galveston USA 4
2 San Diego USA 4
3 San Francisco USA 3
4 Los Angeles USA 4
5 San Juan USA 3
6 Grand Cayman UK 3
Limbajul SQL-Oracle
Interogarea datelor
Utilizarea pseudocoloanelor (valori atribuite automat de către sistem
fiecărei tabele) în comenzile SQL:
ROWNUM
SELECT ROWNUM, id_angajat, nume, salariul
FROM angajati;
4
Rezolvaţi!
Rezolvaţi!
Afişaţi primii 3 angajaţi cu cel mai mare salariu.
10
5
Rezolvaţi!
Afişaţi primii 3 angajaţi cu cel mai mare salariu.
11
Rezolvaţi!
Afişaţi primii 3 angajaţi cu cel mai mare salariu.
12
6
Rezolvaţi!
13
Rezolvaţi!
Afişaţi al doilea angajat cu cel mai mare salariu.
Angajații ordonați în funcție de salariu, în sens descrescător.
14
7
Rezolvaţi!
Afişaţi al doilea angajat cu cel mai mare salariu.
no rows selected
15
Rezolvaţi!
Afişaţi al doilea angajat cu cel mai mare salariu.
SELECT *
FROM
(SELECT ROWNUM as rn, id_angajat, nume, salariul
FROM (SELECT id_angajat, nume, salariul
FROM angajati
ORDER BY salariul DESC)
WHERE ROWNUM <= 2)
WHERE rn = 2;
16
8
Rezolvaţi!
Afişaţi al doilea angajat cu cel mai mare salariu - Rezolvare alternativă!
17
18
9
…începând de la Oracle 12c...
Afişaţi al doilea angajat cu cel mai mare salariu.
19
Limbajul SQL-Oracle
Interogarea datelor
Utilizarea expresiilor în comenzile SQL:
◦ Pe lângă specificarea coloanelor, într-o comandă SELECT pot fi incluse
şi expresii
◦ O expresie se poate referi la: literali, operatori, funcţii SQL
20
10
Limbajul SQL-Oracle
Interogarea datelor
Utilizarea expresiilor în comenzile SQL este permisă în:
◦ lista de coloane a unei comenzi SELECT
◦ clauzele WHERE, HAVING şi ORDER BY dintr-o comandă SELECT
◦ clauza VALUES a unei comenzi INSERT
◦ clauzele SET şi WHERE ale unei comenzi UPDATE
◦ clauza WHERE a unei comenzi DELETE
SELECT id_angajat, nume, salariul, salariul * 1.5
FROM angajati
WHERE comision IS NOT NULL
AND salariul*1.5>16000
ORDER BY salariul*1.5 DESC;
21
Limbajul SQL-Oracle
Interogarea datelor
Tabela DUAL
◦ tabelă existentă în orice BD Oracle
◦ are o singură coloană: DUMMY de tip VARCHAR2(1)
◦ are o singură linie, conţinând valoarea x
◦ utilizată pentru testarea unor comenzi SELECT care nu fac referiri neapărat la o
tabelă dintr-o BD
22
11
Limbajul SQL-Oracle
Funcţii SQL
Funcţii SQL care manipulează şiruri de caractere
Sintaxă Descriere Rezultat
UPPER (s) / LOWER (s) Conversie de format: ORACLE / oracle şir de caractere
LPAD (s1,n,s2) / RPAD (s1,n,s2) Completează un șir (la dreapta/stânga) şir de caractere
LTRIM (s1,s2) / RTRIM (s1,s2) Trunchează un șir (la dreapta/stânga) şir de caractere
Limbajul SQL-Oracle
Funcţii SQL
SELECT UPPER('oracle'), LOWER('oracle'), INITCAP('oracle')
FROM dual;
SUBSTR('ORACLEDATABASE',1,3) SUBSTR('ORACLEDATABASE',-8,4)
---------------------------- -----------------------------
ora data
24
12
Limbajul SQL-Oracle
Funcţii SQL
SELECT CONCAT('Oracle ' ,'Database'),
LPAD('Oracle',15,'*'), RTRIM('Oracle****','*'),
TRIM(BOTH '*' FROM '**Oracle****'), LENGTH('Oracle'),
INSTR('Oracle Database','a',1,3)
FROM dual;
TRIM(BOTH'*'FROM'**ORACLE****' LENGTH('ORACLE')
------------------------------ ----------------
Oracle 6
INSTR('ORACLEDATABASE','A',1,3
------------------------------
11
25
Limbajul SQL-Oracle
Funcţii SQL
REPLACE('ORACLEDATABASE','A') REPLACE('ORACLEDATABASE','A',‘*')
----------------------------- --------------------------------
orcle dtbse or*cle d*t*b*se
26
13
Ce afişează comanda următoare?
27
CUPRINS
----------------------------------------
Capitolul 1 ..................... pag.20
28
14
Limbajul SQL-Oracle
Funcţii SQL
Funcţii SQL care manipulează valori numerice
29
Limbajul SQL-Oracle
Funcţii SQL
30
15
Limbajul SQL-Oracle
Funcţii SQL
Funcţii SQL care manipulează date calendaristice
Sintaxă Descriere Rezultat
SYSDATE Returnează data curentă a serverului dată calendaristică
NEXT_DAY (d,s) Afișează data calendaristică a următoarei zile indicate dată calendaristică
Returnează ultima zi a lunii din care face parte data
LAST_DAY (d) calendaristică dată calendaristică
MONTHS_BETWEEN (d1,d2) Returnează numărul de luni dintre două date calendaristice număr
EXTRACT (DAY FROM d)
EXTRACT (MONTH FROM d) Extrage componente dintr-o dată calendaristică număr
EXTRACT (YEAR FROM d) 31
Limbajul SQL-Oracle
Funcţii SQL
SELECT SYSDATE,ROUND(SYSDATE,'MM'),ROUND(SYSDATE+1,'MM'),
ROUND(SYSDATE,'YY'),TRUNC(SYSDATE,'MM'),TRUNC(SYSDATE,'YY')
FROM dual;
SYSDATE ROUND(SYSDATE,'MM') ROUND(SYSDATE+1,'MM') ROUND(SYSDATE,'YY')
----------- ------------------ --------------------- -------------------
15-11-2021 01-11-2021 01-12-2021 01-01-2022
TRUNC(SYSDATE,'MM') TRUNC(SYSDATE,'YY')
------------------- -------------------
01-11-2021 01-01-2021
32
16
Limbajul SQL-Oracle
Funcţii SQL
SELECT SYSDATE, NEXT_DAY(SYSDATE,'Vineri'),
LAST_DAY(SYSDATE)
FROM dual;
SELECT ADD_MONTHS(SYSDATE,4),
MONTHS_BETWEEN(ADD_MONTHS(SYSDATE,4),SYSDATE)
FROM dual;
ADD_MONTHS(SYSDATE,4) MONTHS_BETWEEN(ADD_MONTHS(SYSD
--------------------- ------------------------------
15-03-2022 4
33
Limbajul SQL-Oracle
Funcţii SQL
Funcţii SQL speciale
Sintaxă Descriere
NVL (e1,e2) Returnează e2 dacă e1 este NULL
DECODE (e,expresii_de_căutare,d)
Verifică variante alternative
CASE expr WHEN cond THEN rez ... ELSE rez END
34
17
Limbajul SQL-Oracle
Funcţii SQL
SELECT 14+NULL-4
FROM dual;
35
Limbajul SQL-Oracle
Funcţii SQL
36
18
Limbajul SQL-Oracle
Funcţii SQL
SELECT nume, salariul+comision "Venit total"
FROM angajati
WHERE comision IS NULL;
NUME Venit total
------------------------- -----------
King
Kochhar
...
Limbajul SQL-Oracle
Funcţii SQL
SELECT pret_lista, pret_min, NULLIF(pret_lista,pret_min)
FROM produse;
38
19
Limbajul SQL-Oracle
Funcţii SQL
SELECT denumire_produs,pret_lista,
CASE
WHEN pret_lista < 100 THEN 'pret mic '
WHEN pret_lista BETWEEN 100 AND 200 THEN 'pret mediu '
ELSE 'pret mare'
END Calificativ
FROM produse;
39
Limbajul SQL-Oracle
Funcţii SQL
SELECT denumire_produs, categorie, pret_lista,
CASE LOWER(categorie)
WHEN 'hardware4' THEN 0.2
WHEN 'hardware2' THEN 0.15
ELSE 0
END * pret_lista Majorare_pret
FROM produse
WHERE LOWER(categorie) LIKE 'h%' ;
40
20
Limbajul SQL-Oracle
Funcţii SQL
SELECT denumire_produs, categorie, pret_lista,
DECODE(LOWER(categorie),'hardware4' ,0.2,'hardware2' ,0.15,0)
* pret_lista Majorare_pret
FROM produse
WHERE LOWER(categorie) LIKE 'h%' ;
41
Limbajul SQL-Oracle
Funcţii SQL
Funcţii SQL de conversie între tipuri de date
Sintaxă Descriere
TO_NUMBER(s,format) Convertește un șir de caractere la număr
42
21
Limbajul SQL-Oracle
Funcţii SQL
SELECT TO_NUMBER('$17,000.23', '$999,999.99')
FROM dual;
TO_NUMBER('$17,000.23','$999,99.99')
------------------------------------
17000,23
TO_CHAR(198,'$999,999.99')
--------------------------
$198.00
43
Limbajul SQL-Oracle
Funcţii SQL
TO_CHAR(SYSDATE+1,'DAY,DDMONTHYYYY')
----------------------------------
MARŢI , 16 NOIEMBRIE 2021
TO_CHAR(SYSDATE,'DD-MON-YYYYHH
------------------------------
13-NOI-2021 11:56:31
44
22
Limbajul SQL-Oracle
Funcţii SQL
SELECT TO_DATE('23-10-2010','DD-MM-YYYY')
FROM dual;
TO_DATE('23-10-2010','DD-MM-YY
------------------------------
23-10-2010
45
Limbajul SQL-Oracle
Funcţii SQL
Funcţii SQL de grup
Sintaxă Descriere
COUNT(e) Returnează numărul de înregistrări dintr-un grup de linii
46
23
Limbajul SQL-Oracle
Funcţii SQL
SELECT COUNT(*) SELECT COUNT(id_angajat)
FROM angajati; FROM angajati;
COUNT(*) COUNT(ID_ANGAJAT)
---------- -----------------
107 107
SELECT COUNT(comision)
FROM angajati;
COUNT(COMISION)
---------------
35
47
Rezolvaţi!
Afişaţi pentru fiecare angajat identificat prin nume numărul total de
comenzi intermediate, precum şi valoarea acestora.
48
24
Rezolvare
49
CURSUL 8...
25
ACADEMIA DE STUDII ECONOMICE BUCUREŞTI
FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ
Limbajul SQL-Oracle
Agregarea datelor
BAZE DE DATE Clauze în SELECT Descriere
grupează liniile în scopul identificării
GROUP BY
valorilor comune grupurilor (valori
Limbaje relaţionale pentru definirea şi coloane_grupare
agregate calculate prin funcţii de grup)
manipularea datelor. Limbajul SQL. restricţionează grupurile create prin clauza
HAVING condiţie GROUP BY pe baza unei condiţii asupra
funcţiilor de grup
BUCUREŞTI
2021-2022
1
Limbajul SQL-Oracle
Agregarea datelor Rezolvaţi!
SELECT id_departament Departament,
Ce rezultat va produce următoarea interogare SQL?
COUNT(id_angajat) "NR.ANGAJATI"
FROM angajati
WHERE id_departament IS NOT NULL SELECT id_departament Departament, id_functie Functie,
GROUP BY id_departament
HAVING COUNT(id_angajat)>2; COUNT(id_angajat) "NR.ANGAJATI"
FROM angajati
DEPARTAMENT NR.ANGAJATI
----------- ----------- WHERE id_departament IS NOT NULL
30 6
50 45 GROUP BY id_departament, id_functie
60 5
80 34 ORDER BY id_departament;
90 3
100 6
3 4
2
Limbajul SQL-Oracle
Rezolvare Agregarea datelor
DEPARTAMENT FUNCTIE NR.ANGAJATI
Operatori Descriere
----------- ---------- -----------
10 AD_ASST 1
20 MK_MAN 1 ROLLUP creează subtotaluri
20 MK_REP 1
30 PU_CLERK 5 creează subtotaluri pentru fiecare
30 PU_MAN 1 CUBE
combinaţie posibilă de dimensiuni
40 HR_REP 1
50 SH_CLERK 20
defineşte grupuri multiple într-o singură
50 ST_CLERK 20 GROUPING SET
cerere
50 ST_MAN 5
5 6
3
Limbajul SQL-Oracle
Agregarea datelor Rezultat
DEPARTAMENT FUNCTIE NR.ANGAJATI
----------- ---------- -----------
10 AD_ASST 1
SELECT id_departament Departament, id_functie Functie,
10 1
COUNT(id_angajat) "NR.ANGAJATI" 20 MK_MAN 1
20 MK_REP 1
FROM angajati 20 2
30 PU_CLERK 5
WHERE id_departament IS NOT NULL
30 PU_MAN 1
GROUP BY ROLLUP(id_departament, id_functie) 30 6
40 HR_REP 1
ORDER BY id_departament; 40 1
50 SH_CLERK 20
50 ST_CLERK 20
50 ST_MAN 5
50 45
...................................
7
106 8
4
Limbajul SQL-Oracle
Agregarea datelor Rezultat
DEPARTAMENT FUNCTIE NR.ANGAJATI
----------- ---------- -----------
SELECT id_departament Departament, id_functie Functie, ..................................
30 PU_CLERK 5
COUNT(id_angajat) "NR.ANGAJATI" 30 PU_MAN 1
30 6
FROM angajati
40 HR_REP 1
WHERE id_departament IS NOT NULL 40 1
50 SH_CLERK 20
GROUP BY CUBE(id_departament, id_functie) 50 ST_CLERK 20
50 ST_MAN 5
ORDER BY id_departament; 50 45
AD_PRES 1
AD_VP 2
FI_ACCOUNT 5
HR_REP 1
IT_PROG 5
...................................
106
9 10
5
Limbajul SQL-Oracle Limbajul SQL-Oracle
Agregarea datelor Agregarea datelor
SELECT GROUPING(id_functie) Verificare, id_departament
Funcţii Descriere Rezultat
Departament, id_functie Functie,
1 – dacă a avut loc o grupare de tip
identifică liniile agregate produse ROLLUP sau CUBE COUNT(id_angajat) "NR.ANGAJATI"
GROUPING prin utilizarea operatorilor ROLLUP NUMBER
0 – dacă nu a avut loc o grupare de
sau CUBE FROM angajati
tip ROLLUP sau CUBE
WHERE id_departament IS NOT NULL
GROUP BY ROLLUP(id_departament, id_functie)
ORDER BY id_departament;
11 12
6
Limbajul SQL-Oracle
Rezultat Agregarea datelor
SELECT
VERIFICARE DEPARTAMENT FUNCTIE NR.ANGAJATI NVL(DECODE(GROUPING(l.oras),1,UPPER(t.denumire_tara),
---------- ----------- ---------- -----------
0 10 AD_ASST 1 INITCAP(t.denumire_tara)),'TOTAL GENERAL')
1 10 1 denumire_tara,
0 20 MK_MAN 1
0 20 MK_REP 1 l.oras, COUNT(d.id_departament) Nr_departamente
1 20 2
............................................. FROM departamente d, locatii l, tari t
1 106 WHERE d.id_locatie=l.id_locatie
AND l.id_tara=t.id_tara
GROUP BY ROLLUP(t.denumire_tara,l.oras);
13 14
7
Limbajul SQL-Oracle
Rezultat Agregarea datelor
DENUMIRE_TARA ORAS NR_DEPARTAMENTE SELECT l.oras Oras, d.id_departament Departament,
----------------------------- ---------------------- ---------------
Canada Toronto 1 a.id_functie Functie, COUNT(a.id_angajat) "NR.ANGAJATI"
CANADA 1
Germany Munich 1 FROM angajati a, departamente d, locatii l
GERMANY 1
United Kingdom London 1
WHERE a.id_departament IS NOT NULL
United Kingdom Oxford 1 AND a.id_departament=d.id_departament
UNITED KINGDOM 2
United States Of America Seattle 21 AND d.id_locatie=l.id_locatie
United States Of America Southlake 1
United States Of America South San Francisco 1 GROUP BY GROUPING SETS ((),(l.oras),
UNITED STATES OF AMERICA 23
TOTAL GENERAL 27 (l.oras, d.id_departament),
(l.oras, d.id_departament, a.id_functie))
ORDER BY l.oras, d.id_departament;
15 16
8
Rezultat SELECT l.oras Oras, d.id_departament Departament, a.id_functie
Functie, COUNT(a.id_angajat) "NR.ANGAJATI"
ORAS DEPARTAMENT FUNCTIE NR.ANGAJATI FROM angajati a, departamente d, locatii l
------------------------------ ----------- ---------- ----------- WHERE a.id_departament IS NOT NULL
Oxford 80 SA_REP 29 AND a.id_departament=d.id_departament
Oxford 80 SA_MAN 5 AND d.id_locatie=l.id_locatie
Oxford 80 34 GROUP BY l.oras, d.id_departament, a.id_functie
Oxford 34 UNION ALL
Seattle 10 AD_ASST 1 SELECT l.oras Oras, d.id_departament Departament, NULL,
Seattle 10 1 COUNT(a.id_angajat) "NR.ANGAJATI"
Seattle 30 PU_MAN 1 .......
Seattle 30 PU_CLERK 5 GROUP BY l.oras, d.id_departament
Seattle 30 6 UNION ALL
Seattle 90 AD_VP 2 SELECT l.oras Oras, NULL, NULL, COUNT(a.id_angajat) "NR.ANGAJATI"
Seattle 90 AD_PRES 1 .......
Seattle 90 3 GROUP BY l.oras
Seattle 100 FI_MGR 1 UNION ALL
Seattle 100 6 SELECT NULL, NULL, NULL, COUNT(a.id_angajat) "NR.ANGAJATI"
Seattle 100 FI_ACCOUNT 5 FROM angajati a, departamente d, locatii l
Seattle 110 AC_MGR 1 WHERE a.id_departament IS NOT NULL
Seattle 110 AC_ACCOUNT 1 AND a.id_departament=d.id_departament
Seattle 110 2 AND d.id_locatie=l.id_locatie;
Seattle 18
106 18
9
Limbajul SQL-Oracle
Agregarea datelor Rezolvaţi!
CUBE(a,b,c)=GROUPING SETS((a,b,c),(a,b),(a,c),(b,c),(a),(b),(c),())
ROLLUP(a,b,c)=GROUPING SETS((a,b,c),(a,b),(a),())
19 20
10
Limbajul SQL-Oracle
Rezolvaţi! Joncţiuni
22 23
11
Limbajul SQL-Oracle Limbajul SQL-Oracle
Joncţiuni Joncţiuni
Oracle Standard SQL
Oracle Standard SQL
Joncţiune externă completă
Joncţiune externă stânga SELECT t1.a, t2.c SELECT t1.a, t2.c
SELECT t1.a, t2.c SELECT t1.a, t2.c FROM tabela1 t1, tabela2 t2 FROM tabela1 t1 FULL JOIN tabela2 t2
FROM tabela1 t1, tabela2 t2 FROM tabela1 t1 LEFT JOIN tabela2 t2 WHERE t1.b=t2.b (+) ON t1.b=t2.b;
WHERE t1.b=t2.b (+); ON t1.b=t2.b; UNION
SELECT t1.a, t2.c
Joncţiune externă dreapta FROM tabela1 t1, tabela2 t2
WHERE t1.b (+)=t2.b;
SELECT t1.a, t2.c SELECT t1.a, t2.c
FROM tabela1 t1, tabela2 t2 FROM tabela1 t1 RIGHT JOIN tabela2 t2 Joncţiunea tabelei cu ea însăşi
WHERE t1.b (+)=t2.b; ON t1.b=t2.b; SELECT t1.a, t2.b SELECT t1.a, t2.b
FROM tabela1 t1, tabela1 t2 FROM tabela1 t1 JOIN tabela1 t2
WHERE t1.a=t2.b; ON t1.a=t2.b;
24 25
12
CURSUL 9...
13
ACADEMIA DE STUDII ECONOMICE BUCUREŞTI
FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ
BAZE DE DATE
BUCUREŞTI
2021-2022
Limbajul SQL-Oracle
Interogarea datelor. Subcereri.
Subcerere (cerere imbricată) – comandă SELECT inclusă într-o altă
comandă SQL, care poate returna una sau mai multe linii.
Subcererile sunt utilizate pentru:
➢ a obţine rezultate pe baza unor criterii, care apoi să fie utilizate pentru
identificarea altor răspunsuri
➢ a crea tabele pe baza unora deja existente
➢ a manipula seturi mari de date, prin includerea în comenzi INSERT, UPDATE
sau DELETE
➢ a crea tabele virtuale (vederi, views)
➢ a defini vederi dinamice (subcereri incluse în clauza FROM)
➢ a defini expresii calculate dinamic prin subcereri scalare
1
Limbajul SQL-Oracle
Interogarea datelor. Subcereri.
Tipuri de subcereri:
Subcereri Descriere
returnează o singură linie (conţinând valori pentru una
➢ subcereri single-row
sau mai multe coloane)
➢ subcereri multiple-row returnează 0, 1 sau mai multe linii
returnează mai mult de o coloană ca rezultat al unei
➢ subcereri multiple-column
subcereri single-row sau multiple-row
subcereri de oricare dintre tipurile anterioare, care asigură
➢ subcereri corelate legătura dintre tabele, prin referirea de coloane ale cererii
părinte
returnează o singură coloană rezultat; pot fi utilizate ca
➢ subcereri scalare
orice expresie care apare într-o comandă SQL
Limbajul SQL-Oracle
Interogarea datelor. Subcereri.
SELECT id_angajat, nume
FROM angajati
WHERE id_functie = (SELECT id_functie
FROM angajati
WHERE UPPER(nume)='ABEL')
AND UPPER(nume)!='ABEL';
2
Limbajul SQL-Oracle
Interogarea datelor. Subcereri.
SELECT id_angajat, nume
FROM angajati
WHERE id_functie = (SELECT id_functie FROM angajati
WHERE UPPER(nume)='KING')
AND UPPER(nume)!='KING';
Limbajul SQL-Oracle
Interogarea datelor. Subcereri.
Operatori de comparaţie utilizaţi în cadrul subcererilor multiple-row:
Operatori Descriere
• compară cu o listă de valori
IN
• verifică dacă valoarea căutată se regăseşte în listă
NOT • utilizat cu operatorul IN
• utilizat în combinaţie cu operatorii de comparaţie (=, <)
ANY • verifică dacă valoarea căutată îndeplineşte condiţia de comparaţie cu
oricare dintre liniile returnate de subcerere
SOME • la fel ca operatorul ANY
• utilizat în combinaţie cu operatorii de comparaţie (=, <)
ALL • verifică dacă valoarea căutată îndeplineşte condiţia de comparaţie cu
toate liniile returnate de subcerere
3
Limbajul SQL-Oracle
Interogarea datelor. Subcereri.
• ANY compară valoarea cu oricare valoare returnată de interogare
• ALL compară valoarea cu toate valorile returnate de interogare
Limbajul SQL-Oracle
Interogarea datelor. Subcereri.
SELECT id_angajat, salariul
FROM angajati
WHERE salariul > ALL (10000, 15000, 20000);
4
Limbajul SQL-Oracle
Interogarea datelor. Subcereri.
SELECT id_angajat, salariul
FROM angajati
WHERE salariul > ANY (10000, 15000, 20000);
Limbajul SQL-Oracle
Interogarea datelor. Subcereri.
UPDATE angajati
SET salariul=1.1*salariul
WHERE (id_functie, id_departament) =
(SELECT id_functie, id_departament
FROM angajati
WHERE UPPER(nume)='ABEL');
10
5
Limbajul SQL-Oracle
Interogarea datelor. Subcereri.
11
Limbajul SQL-Oracle
Interogarea datelor. Subcereri.
UPDATE angajati
SET salariul=1.1 * salariul
WHERE id_angajat IN
(SELECT id_angajat FROM comenzi);
UPDATE angajati a
SET a.salariul=1.1 * a.salariul
WHERE EXISTS
(SELECT * FROM comenzi
WHERE id_angajat=a.id_angajat);
14
6
Limbajul SQL-Oracle
Interogarea datelor. Subcereri.
SELECT c.nume_client
FROM clienti c SEMI-JOIN
WHERE EXISTS
(SELECT * FROM comenzi co
WHERE co.id_client=c.id_client);
SELECT c.nume_client
FROM clienti c
WHERE NOT EXISTS
(SELECT * FROM comenzi co
WHERE co.id_client=c.id_client);
15
Limbajul SQL-Oracle
Interogarea datelor. Subcereri.
Găsiți angajații care au subordonați
SAU
16
7
Limbajul SQL-Oracle
Interogarea datelor. Subcereri.
Găsiți angajații care nu au subordonați
SAU
17
Limbajul SQL-Oracle
Interogarea datelor. Cereri ierarhice.
18
8
Limbajul SQL-Oracle
Interogarea datelor. Cereri ierarhice.
19
Limbajul SQL-Oracle
Interogarea datelor. Cereri ierarhice.
Nod rădăcină
Nivel 1
Nivel 2
Nivel 3
Nivel 4
20
9
Limbajul SQL-Oracle
Interogarea datelor. Cereri ierarhice.
SELECT a.id_angajat, a.nume "ANGAJAT",
a.id_manager, m.nume "MANAGER"
FROM angajati a, angajati m
WHERE a.id_manager=m.id_angajat
ORDER BY a.id_angajat;
ID_ANGAJAT ANGAJAT ID_MANAGER MANAGER
---------- ------------------------- ---------- ---------------------
101 Kochhar 100 King
102 De Haan 100 King
103 Hunold 102 De Haan
104 Ernst 103 Hunold
105 Austin 103 Hunold
106 Pataballa 103 Hunold
107 Lorentz 103 Hunold
108 Greenberg 101 Kochhar
109 Faviet 108 Greenberg
110 Chen 108 Greenberg
Limbajul SQL-Oracle
Interogarea datelor. Cereri ierarhice.
Clauze în SELECT Descriere
START WITH identifică nodul rădăcină
defineşte legăturile de tip self-join, precum şi direcţia în care va
CONNECT BY
fi traversată ierarhia
ORDER SIBLINGS BY sortează liniile din cadrul fiecărui nivel ierarhic
10
Limbajul SQL-Oracle
Interogarea datelor. Cereri ierarhice.
LEVEL ID_ANGAJAT NUME
---------- ---------- ---------
1 100 King
SELECT LEVEL, id_angajat, nume 2 101 Kochhar
3 108 Greenberg
FROM angajati 4 109 Faviet
START WITH id_angajat=100 4 110 Chen
4 111 Sciarra
CONNECT BY 4 112 Urman
id_manager=PRIOR id_angajat; 4 113 Popp
3 200 Whalen
3 203 Mavris
3 204 Baer
3 205 Higgins
4 206 Gietz
2 102 De Haan
3 103 Hunold
4 104 Ernst
4 105 Austin
4 106 Pataballa
4 107 Lorentz
Limbajul SQL-Oracle
Interogarea datelor. Cereri ierarhice.
LEVEL ID_ANGAJAT ANGAJAT
SELECT LEVEL, id_angajat, ----------1 ---------- -------------------
100 King
LPAD(' ',LEVEL)||nume angajat 2 101 Kochhar
3 108 Greenberg
FROM angajati 4 109 Faviet
START WITH id_angajat=100 4 110 Chen
4 111 Sciarra
CONNECT BY 4 112 Urman
4 113 Popp
id_manager=PRIOR id_angajat; 3 200 Whalen
3 203 Mavris
3 204 Baer
3 205 Higgins
4 206 Gietz
2 102 De Haan
3 103 Hunold
4 104 Ernst
4 105 Austin
4 106 Pataballa
4 107 Lorentz
11
Limbajul SQL-Oracle
Interogarea datelor. Cereri ierarhice.
SELECT LEVEL, id_angajat,
LPAD(' ',LEVEL)||nume angajat
FROM angajati
START WITH id_angajat=110
CONNECT BY
PRIOR id_manager = id_angajat;
Limbajul SQL-Oracle
Interogarea datelor. Cereri ierarhice.
LEVEL ID_ANGAJAT ANGAJAT
---------- ---------- ----------------
SELECT LEVEL, id_angajat, 1 100 King
LPAD(' ',LEVEL)||nume angajat 2 148 Cambrault
3 172 Bates
FROM angajati 3 169 Bloom
3 170 Fox
START WITH id_angajat=100
3 173 Kumar
CONNECT BY 3 168 Ozer
3 171 Smith
id_manager=PRIOR id_angajat 2 102 De Haan
ORDER SIBLINGS BY nume; 3 103 Hunold
4 105 Austin
4 104 Ernst
4 107 Lorentz
4 106 Pataballa
2 147 Errazuriz
3 166 Ande
3 167 Banda
3 163 Greene
3 165 Lee
3 164 Marvins
12
Limbajul SQL-Oracle
Interogarea datelor. Cereri ierarhice.
LEVEL ID_ANGAJAT ANGAJAT
------ ---------- ---------------------------------
SELECT LEVEL, id_angajat, 1 100 /King
2 101 /King/Kochhar
SYS_CONNECT_BY_PATH(nume,'/') 3 108 /King/Kochhar/Greenberg
angajat 4 109 /King/Kochhar/Greenberg/Faviet
4 110 /King/Kochhar/Greenberg/Chen
FROM angajati 4 111 /King/Kochhar/Greenberg/Sciarra
4 112 /King/Kochhar/Greenberg/Urman
START WITH id_angajat=100 4 113 /King/Kochhar/Greenberg/Popp
3 200 /King/Kochhar/Whalen
CONNECT BY 3 203 /King/Kochhar/Mavris
id_manager=PRIOR id_angajat; 3 204 /King/Kochhar/Baer
3 205 /King/Kochhar/Higgins
4 206 /King/Kochhar/Higgins/Gietz
2 102 /King/De Haan
3 103 /King/De Haan/Hunold
4 104 /King/De Haan/Hunold/Ernst
4 105 /King/De Haan/Hunold/Austin
4 106 /King/De Haan/Hunold/Pataballa
4 107 /King/De Haan/Hunold/Lorentz
Limbajul SQL-Oracle
Interogarea datelor. Cereri ierarhice.
LEVEL ID_ANGAJAT ANGAJAT
SELECT LEVEL, id_angajat, ---------- ---------- -----------------
LPAD(' ',LEVEL)||nume angajat 1 100 King
2 102 De Haan
FROM angajati 3 103 Hunold
4 104 Ernst
START WITH id_angajat=100 4 105 Austin
CONNECT BY 4 106 Pataballa
4 107 Lorentz
id_manager=PRIOR id_angajat 2 114 Raphaely
3 115 Khoo
AND id_angajat!=101; 3 116 Baida
3 117 Tobias
3 118 Himuro
3 119 Colmenares
13
Limbajul SQL-Oracle
Actualizarea datelor
Comandă Descriere
INSERT adaugă o înregistrare nouă într-o tabelă
UPDATE modifică valori asociate coloanelor unei tabele
realizează fie modificări ale datelor, fie ştergeri, fie
MERGE adăugări de înregistrări dintr-o altă tabelă, în funcţie de o
condiţie de potrivire
DELETE şterge înregistrări dintr-o tabelă
31
Limbajul SQL-Oracle
Actualizarea datelor. Comanda MERGE
SELECT id_angajat, nume, salariul, id_functie
FROM angajati
ORDER BY id_angajat;
32
14
Limbajul SQL-Oracle
Actualizarea datelor. Comanda MERGE
SELECT id_angajat, nume, salariul, id_functie
FROM angajati_noi
ORDER BY id_angajat;
Limbajul SQL-Oracle
Actualizarea datelor. Comanda MERGE
MERGE INTO angajati a
USING angajati_noi b
ON (a.id_angajat=b.id_angajat)
WHEN MATCHED THEN
UPDATE
SET a.salariul=b.salariul,
a.id_functie=b.id_functie
WHEN NOT MATCHED THEN
INSERT
(a.id_angajat,a.prenume,a.nume,a.email,a.data_angajare
,a.id_functie,a.salariul,a.id_departament)
VALUES
(b.id_angajat,b.prenume,b.nume,b.email,b.data_angajare
,b.id_functie,b.salariul,b.id_departament);
34
15
Limbajul SQL-Oracle
Actualizarea datelor. Comanda MERGE
SELECT id_angajat, nume, salariul, id_functie
FROM angajati
ORDER BY id_angajat;
35
CURSUL 10...
16
ACADEMIA DE STUDII ECONOMICE BUCUREŞTI
FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ
BAZE DE DATE
BUCUREŞTI
2021-2022
✓ Secvenţe (SEQUENCES)
✓ Sinonime (SYNONYMS)
✓ Indecşi (INDEXES)
✓ Clustere (CLUSTERS)
✓ etc.
1
Tabele virtuale
❑ Tabelă virtuală view viziune vedere
Tabele virtuale
2
Tabele virtuale
........
5
Tabele virtuale
❑ O tabelă virtuală trebuie să aibă nume de coloane valide
atenţie la utilizarea expresiilor!
❑ În funcţie de complexitatea comenzii SELECT, tabelele virtuale
pot fi:
➢ simple (cu interogări asupra unei singure tabele, fără grupări sau
expresii)
➢ complexe (cu interogări asupra mai multor tabele, cu grupări sau
folosind expresii)
3
Tabele virtuale
CREATE OR REPLACE VIEW clerk AS
SELECT id_angajat, nume, id_departament, id_functie
FROM angajati
WHERE id_functie = 'PU_CLERK'
OR id_functie = 'SH_CLERK'
OR id_functie = 'ST_CLERK';
UPDATE clerk
SET id_functie = 'PU_MAN'
WHERE id_angajat = 115;
Tabele virtuale
4
Tabele virtuale
CREATE OR REPLACE VIEW clerk AS
SELECT id_angajat, nume, id_departament, id_functie
FROM angajati
WHERE id_functie = 'PU_CLERK'
OR id_functie = 'SH_CLERK'
OR id_functie = 'ST_CLERK'
WITH CHECK OPTION;
ORA-01402: în vizualizarea
WITH CHECK OPTION clauza
WHERE este încalcata
Tabele virtuale
CREATE OR REPLACE VIEW clerk AS
SELECT id_angajat, nume, id_departament, id_functie
FROM angajati
WHERE id_functie = 'PU_CLERK'
OR id_functie = 'SH_CLERK'
OR id_functie = 'ST_CLERK'
WITH READ ONLY;
UPDATE clerk
SET id_functie = 'ST_CLERK'
WHERE id_angajat = 116;
10
5
Tabele virtuale
11
Secvenţe
12
6
Secvenţe
Opţiunile posibil de specificat la crearea unei secvenţe:
INCREMENT BY număr_întreg
MAXVALUE număr_întreg
NOMAXVALUE
MINVALUE număr_întreg
NOMINVALUE
CYCLE
NOCYCLE
13
Secvenţe
Utilizarea secvenţelor presupune referirea a două pseudo-coloane:
❑ NEXTVAL
◦ incrementează secvenţa către următorul număr, în concordanţă cu
directivele indicate la crearea secvenţei
◦ returnează noua valoare
◦ apelul iniţial al lui NEXVAL va returna prima valoare din secvenţă
❑ CURRVAL
◦ afişează valoarea curentă din secvenţă
◦ poate fi utilizată numai dacă anterior a fost deja referită pseudo-
coloana NEXTVAL
14
7
Secvenţe
15
Secvenţe
Aspecte privind utilizarea secvenţelor:
◦ o comandă SQL care foloseşte pseudo-coloana NEXTVAL va conduce
la avansarea în secvenţă chiar şi în cazul în care comanda iniţială
eşuează
◦ nu pot fi folosite pseudo-coloanele NEXTVAL şi CURRVAL în clauza
DEFAULT a comenzilor CREATE TABLE sau ALTER TABLE
◦ nu pot fi folosite pseudo-coloanele NEXTVAL şi CURRVAL în subcereri
incluse în comenzile CREATE VIEW sau SELECT, UPDATE, DELETE
◦ nu pot fi folosite pseudo-coloanele NEXTVAL şi CURRVAL în clauza
WHERE a unei comenzi SELECT
◦ nu pot fi folosite pseudo-coloanele NEXTVAL şi CURRVAL la definirea
restricţiilor de integritate de tip CHECK
16
8
Secvenţe
Modificarea secvenţelor:
ALTER SEQUENCE nume_secvenţă
opţiuni_secvenţă;
Ştergerea secvenţelor:
DROP SEQUENCE nume_secvenţă;
17
Sinonime
18
9
Sinonime
Crearea sinonimelor:
◦ private
CREATE OR REPLACE SYNONYM ang1 FOR angajati;
◦ publice
CREATE OR REPLACE PUBLIC SYNONYM ang2 FOR
angajati;
Utilizarea sinonimelor:
SELECT id_angajat, nume, id_departament,
id_functie
FROM ang1
WHERE id_functie = 'PU_CLERK';
19
Sinonime
Ştergerea sinonimelor:
◦ private
DROP SYNONYM ang1;
◦ publice
DROP PUBLIC SYNONYM ang2;
20
10
Indecşi
❑ Un index este un obiect asociat unei tabele sau unui grup de
tabele (cluster), care se creează în mod explicit folosind
comanda SQL CREATE INDEX pentru a mări viteza de acces la
datele unei tabele.
❑ Indecşii pot fi unici sau nu. Crearea unui index unic se face cu
comanda CREATE UNIQUE INDEX sau prin definirea unei
restricţii de integritate UNIQUE sau PRIMARY KEY.
21
22
11
Aspecte privind indexarea în bazele de
date
❑ numărul indecşilor ce pot fi creaţi pentru o tabelă poate fi
oricât de mare, cu toate acestea numărul lor trebuie corelat cu
tipul operaţiilor majoritare ce se vor executa asupra tabelei;
23
24
12
Aspecte privind indexarea în bazele de
date
Actualizarea unui index se face prin comanda SQL ALTER INDEX.
25
Tipuri de indecşi
Tip index Descriere
Index cu cheie inversă Tip de index folositor numai în cazul căutării în arbore a
(reverse-key index) unor valori exacte
13
Grupări de tabele (clustere)
27
28
14
Grupări de tabele (clustere)
Pentru a crea o tabelă într-un cluster se parcurg în mod
obligatoriu următorii paşi:
1. Se creează clusterul
29
30
15
Grupări de tabele (clustere)
2) Adăugarea tabelelor la cluster
După crearea clusterului, adăugarea tabelelor la cluster se face folosind
comanda CREATE TABLE cu clauza CLUSTER:
CREATE TABLE nume_cluster
(nume_coloana tip_data [, nume_coloana
tip_data])
CLUSTER nume_cluster
32
16
Exemplificare SQL-Oracle
Crearea clusterului sal_dept, cu indicarea grupării după coloanele cod_dept şi cod_tara
CREATE CLUSTER sal_dept
(cod_dept NUMBER(10),
cod_tara NUMBER(10));
Adăugarea tabelelor la clusterul sal_dept
CREATE TABLE departamente CREATE TABLE salariati
(cod_dept NUMBER(10), (cod_salariat NUMBER(10) PRIMARY KEY,
cod_tara NUMBER(10), nume VARCHAR2(10) NOT NULL,
nume_dept VARCHAR2(10), prenume VARCHAR2(10),
PRIMARY KEY(cod_dept, data_nastere DATE,
cod_tara) salariu NUMBER(10),
) cod_dept NUMBER(10),
CLUSTER sal_dept(cod_dept, cod_tara NUMBER(10),
cod_tara); FOREIGN KEY(cod_dept, cod_tara)
REFERENCES
departament(cod_dept,cod_tara))
CLUSTER sal_dept(cod_dept,cod_tara);
Crearea indexului pentru clusterul sal_dept
CREATE INDEX sal_dept_ind
ON CLUSTER sal_dept; 33
17
CURSUL 11...
18
ACADEMIA DE STUDII ECONOMICE BUCUREŞTI
FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ
BAZE DE DATE
Optimizarea cererilor de
regăsire a datelor în bazele de date
BUCUREŞTI
2021-2022
minimizarea costului de
execuţie
1
Mecanisme de optimizare a cererilor de
regăsire
Transformări relaţionale
✓orice interogare se poate scrie cu ajutorul expresiilor bazate pe calcul relaţional şi pe algebra relaţională
✓cele două tipuri sunt echivalente şi pot fi oricând rescrise în celălalt tip
✓se pot realiza prin două strategii de optimizare:
✓generale: se bazează pe proprietăţile operaţiilor din algebra relaţională:
➢selecţia înaintea proiecţiei
➢selecţia înaintea joncţiunii
➢proiecţia înaintea joncţiunii
✓specifice: depind de SGBDR şi ţin de memorarea datelor, de modul de accesare, precum şi de
ordonarea expresiilor algebrice
2
Strategii de optimizare a cererilor de regăsire.
Recomandări.
1.Se indexează coloanele cel mai des folosite în clauza WHERE, pentru acces direct
la înregistrările care dau elemente ale rezultatului
SELECT *
FROM T_PRODUSE
WHERE DESCRIERE = 'Toner';
Înainte:
După:
3
Strategii de optimizare a cererilor de regăsire.
Recomandări.
2. Se evită folosirea funcţiilor UPPER sau LOWER asupra coloanelor indexate
SELECT *
FROM T_PRODUSE
WHERE UPPER(DESCRIERE) = 'TONER';
Înainte:
După:
4
Strategii de optimizare a cererilor de regăsire.
Recomandări.
3. Se evită folosirea funcţiei SUBSTR asupra coloanelor indexate
SELECT *
FROM T_PRODUSE
WHERE SUBSTR(DESCRIERE,1,2) = 'To';
Înainte:
După:
10
5
Strategii de optimizare a cererilor de regăsire.
Recomandări.
4. Se recomandă folosirea clauzei EXISTS în loc de DISTINCT
SELECT DISTINCT P.ID_PRODUS, C.ID_COMANDA
FROM T_PRODUSE P, T_COMENZI_DESFACERE C
WHERE P.ID_PRODUS=C.ID_PRODUS;
Înainte:
După:
6
Strategii de optimizare a cererilor de regăsire.
Recomandări.
5. Se evită plasarea în clauza HAVING a condiţiilor care nu includ funcţii de grup
Înainte:
SELECT ID_COMANDA, COUNT(ID_PRODUS)
FROM T_COMENZI_DESFACERE
GROUP BY ID_COMANDA
HAVING ID_COMANDA IN (66,77);
7
Strategii de optimizare a cererilor de regăsire.
Recomandări.
6. Se folosesc grupuri de tabele (clustere) astfel încât tabelele care sunt accesate
frecvent împreună să poată fi stocate fizic în aceleaşi blocuri de date, cu
scopul reducerii numărului de operaţii de I/O şi implicit pentru a creşte
performanţele
Înainte:
SELECT C.ID_COMANDA, C.STATUS, P.ID_PRODUS
FROM T_PRODUSE P, T_COMENZI_DESFACERE C
WHERE P.ID_PRODUS=C.ID_PRODUS;
8
Strategii de optimizare a cererilor de regăsire.
Recomandări.
SAU
CREATE CLUSTER T_CLU (ID_PRODUS NUMBER);
CREATE INDEX IDX_CLU ON CLUSTER T_CLU;
17
18
9
Strategii de optimizare a cererilor de regăsire.
Recomandări.
7. Se construiesc indecşi asupra funcţiilor ataşate coloanelor (function-based
indexes)
SELECT C.ID_COMANDA, P.ID_PRODUS,
C.CANTITATE_COMANDATA-C.CANTITATE_LIVRATA "REST"
FROM T_COMENZI_DESFACERE C, T_PRODUSE P
WHERE P.ID_PRODUS=C.ID_PRODUS
AND C.CANTITATE_COMANDATA - C.CANTITATE_LIVRATA > 0;
Înainte:
19
După:
10
Strategii de optimizare a cererilor de regăsire.
Recomandări.
8. Se indexează coloanele ale căror valori sunt sortate des
SELECT *
FROM T_PRODUSE
ORDER BY CATEGORIE DESC;
Înainte:
21
După:
22
11
Strategii de optimizare a cererilor de regăsire.
Recomandări.
9. În funcţia COUNT se folosesc ROWID sau coloane indexate
Înainte:
SELECT COUNT(CATEGORIE)
FROM T_PRODUSE;
23
SELECT COUNT(id_produs)
FROM T_PRODUSE;
sau
SELECT COUNT(ROWID)
FROM T_PRODUSE;
24
12
Strategii de optimizare a cererilor de regăsire.
Recomandări.
10. Se partiţionează tabelele de mari dimensiuni în segmente mai mici numite
partiţii, astfel încât interogările să le acceseze individual şi nu întreaga tabelă
din care au provenit
Înainte:
SELECT C.ID_COMANDA, C.STATUS, P.ID_PRODUS
FROM T_PRODUSE P, T_COMENZI_DESFACERE C
WHERE P.ID_PRODUS=C.ID_PRODUS
AND C.CANTITATE_COMANDATA = 2;
13
Strategii de optimizare a cererilor de regăsire.
Recomandări.
După:
27
28
14
Strategii de optimizare a cererilor de regăsire
în SGBD ORACLE
29
30
15
Strategii de optimizare a cererilor de regăsire
în SGBD ORACLE
31
32
16
Strategii de optimizare a cererilor de regăsire
în SGBD ORACLE
Algoritmul Sort merge joins
◦ este recomandat pentru joncţiuni în care una dintre tabele are înregistrările deja sortate;
◦ în general, dacă este realizată în prealabil o ordonare a înregistrărilor, acest algoritm duce
la scăderea costurilor de execuţie faţă de rezultatele similare obţinute prin aplicarea
algoritmului Hash joins;
◦ Sort merge joins este recomandat şi pentru cazurile în care se realizează o joncţiune cu o
condiţie de inegalitate sau pentru seturi foarte mari de date;
◦ principiul de execuţie nu este ghidat de alegerea uneia dintre tabele, ci presupune:
◦ se realizează o ordonare a datelor din ambele tabele după cheia (condiţia) de căutare.
Dacă deja a fost aplicată o sortare corespunzătoare, acest pas nu se mai aplică;
◦ se realizează operaţia de joncţiune între cele două tabele ordonate.
◦ alegerea acestui algoritm este recomandată pentru seturi mari de date şi pentru condiţii
de inegalitate între tabele deoarece acest tip de joncţiune necesită şi o ordonare a
datelor.
33
34
17
Strategii de optimizare a cererilor de regăsire
în SGBD ORACLE
Algoritmul Cartesian Joins
◦ se aplică în cazul joncţiunilor de tip produs cartezian, atunci când între cele două
tabele implicate nu se poate realiza o legătură, iar rezultatul cererii constă în
combinaţia fiecărei înregistrări din prima tabelă cu fiecare înregistrare din cea
de-a doua.
35
SELECT /*+ USE_NL(c cd) */ SELECT /*+ USE_MERGE(c cd) SELECT /*+ USE_HASH(c cd)
c.id_client, */ */
c.nume_client, c.id_client, c.id_client,
NVL(SUM(cd.cantitate_comand c.nume_client, c.nume_client,
ata),0) cantitate_totala NVL(SUM(cd.cantitate_comand NVL(SUM(cd.cantitate_comand
FROM t_clienti c, ata),0) cantitate_totala ata),0) cantitate_totala
t_comenzi_desfacere cd FROM t_clienti c, FROM t_clienti c,
WHERE t_comenzi_desfacere cd t_comenzi_desfacere cd
c.id_client=cd.id_client(+) WHERE WHERE
group by c.id_client, c.id_client=cd.id_client(+) c.id_client=cd.id_client(+)
c.nume_client; group by c.id_client, group by c.id_client,
c.nume_client; c.nume_client;
36
18
Strategii de optimizare a cererilor de regăsire
în SGBD ORACLE
37
CURSUL 12...
19
ACADEMIA DE STUDII ECONOMICE BUCUREŞTI
FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ
BAZE DE DATE
BUCUREŞTI
2021-2022
1
Integritatea datelor
Integritatea datelor
INTEGRITATEA SEMANTICĂ
❑În Oracle:
◦ resticţiile implicite: PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT
NULL, CHECK
◦ restricţiile explicite: declanşatori (triggeri)
2
Integritatea datelor
CONTROLUL CONCURENŢEI LA DATE
Integritatea datelor
CONTROLUL CONCURENŢEI LA DATE (cont.)
3
Integritatea datelor
CONTROLUL CONCURENŢEI LA DATE (cont.)
Integritatea datelor
CONTROLUL CONCURENŢEI LA DATE (cont.)
4
Integritatea datelor
Securitatea datelor
10
5
Securitatea datelor
AUTORIZAREA ŞI CONTROLUL ACCESULUI LA DATE
❑Constă în identificarea utilizatorilor şi restricţionarea accesului
acestora la anumite date, pentru diferite prelucrări, în funcţie de
categoria de utilizatori.
❑În acest scop, administratorul BD construieşte profile de
utilizatori, precizând categoria, grupa, numele, parola, drepturile
acordate.
❑În Oracle:
◦ CREATE PROFILE...
◦ CREATE ROLE...
◦ CREATE USER... PROFILE...
◦ GRANT rol TO user
◦ GRANT privilegii TO user
11
Securitatea datelor
TABELE VIRTUALE
12
6
Securitatea datelor
PROCEDURI SPECIALE
13
Securitatea datelor
CRIPTAREA DATELOR
14
7
BAZE DE DATE
16
8
Evoluţia organizării datelor
Depozite
Baze de
de date
date NoSQL
(1990)
Baze de date (2010+)
(1970)
Fișiere de
date (1960)
18
9
Caracteristici ale bazelor de date
NoSQL
❑ Permit lucrul eficient cu date semistructurate și
nestructurate
❑ Folosesc mai multe limbaje de interogare diferite
(NoSQL - not only SQL)
❑ Nu impun o anumită structură a datelor (schema-
less)
❑ Pot gestiona volume mari de date (big data)
❑ Folosesc o arhitectură distribuită: datele sunt
păstrate într-un mod redundant, pe mai multe
servere
19
20
10
NoSQL vs. SQL
SQL NoSQL
Stocare date Conform modelului Stocare folosind formate
relațional, în tabele de non-relaționale specifice
date
Date stocate Structurate Semi-structurate,
nestructurate
Schema Statică Dinamică
Scalabilitate Verticală Orizontală
Limbaj de interogare SQL Not only SQL
Joncțiuni Da Nu
Gestiune tranzacții ACID CAP
21
22
11
Tipuri de baze de date NoSQL
1. BD care stochează structuri cheie-valoare
(Redis, Riak, Oracle NoSQL)
2. BD orientate pe coloane
(Cassandra, HBase)
3. BD organizate pe document
(MongoDB, CouchDB)
4. BD organizate ca graf
(Neo4J, Allegro, Polyglot)
23
Trend BD - 2021
24
12
Trend BD - 2021
25
26
13
Caracteristici
❑ Rapiditate, accesul la memorie fiind mai rapid decât
accesul la disc
27
Domenii de aplicabilitate
❑ Aplicații pentru care timpul de răspuns este critic:
◦ Telecomunicații
◦ Industria bancară
◦ Rețele mobile de publicitate
❑ Analiza de date – odată cu extinderea pe scară largă a
procesoarelor multi-core
28
14
Limitări
❑ Volatilitatea memoriei RAM pe care se realizează
stocarea datelor
29
CURSUL 13...
Recapitulare
15
ACADEMIA DE STUDII ECONOMICE BUCUREŞTI
FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ
BAZE DE DATE
Noţiuni recapitulative
BUCUREŞTI
2021-2022
Baze de date
Metadate
SBD
SGBD
1
Modele de date
❑ Componente + descrieri
Baze de date
❑ Definiţii
❑ Caracteristici
❑ Niveluri de organizare
❑ Tipologia BD
❑ Etape de realizare a unei BD
2
Modelul de date relaţional
❑ Structura relaţională
❑ Restricţiile de integritate
❑ Definiţie
❑ Tehnica normalizării
3
Limbajul SQL
4
Baze de date relaţionale.
Tehnica normalizării.
Exemplu
FN1 DETALII_COMENZI
Nr_comanda
DETALII_COMENZI Cheie primară Data_comanda
Nr_comanda compusă !!! Cod_client
Data_comanda Nume_client
Cod_client Cod_postal
Nume_client Localitate
Adresa_client Banca_client
Banca_client Cont_client
Cont_client Cod_produs
Cod_produs Atribute Denumire_produs
Denumire_produs compuse Unitate_masura
Unitate_masura Cantitate
Cantitate Pret_unitar
Pret_unitar Discount
Discount Dimensiune
Proprietati Culoare
10
5
Baze de date relaţionale.
Tehnica normalizării.
Exemplu
FN2
11
12
6
SUCCES!