2019
BAZE DE DATE
13
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.
14
14
7
07.10.2019
Organizarea datelor
Memoria internă vs. Memoria externă
15
15
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.
16
16
8
07.10.2019
Paradigma DIKUW
(Data > Information > Knowledge > Understanding > Wisdom)
Înţelepciune
Înţelegere
Cunoştinţe
Informaţii
Date
17
17
• 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
18
18
9
07.10.2019
19
19
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ă;
20
20
10
07.10.2019
• Acces secvenţial
• Acces direct
21
21
22
22
11
07.10.2019
23
23
24
24
12
07.10.2019
Baze de date
25
25
26
26
13
07.10.2019
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
27
28
28
14
07.10.2019
29
29
30
30
15
07.10.2019
31
31
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.
32
32
16
07.10.2019
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.
33
33
34
34
17
07.10.2019
35
35
CURSUL 2...
Elemente de teoria bazelor de date
Modele de date
36
18
22.10.2019
BAZE DE DATE
ELEMENTE DE TEORIA
BAZELOR DE DATE
BUCUREŞTI
2019-2020
Conf.univ.dr. IULIANA BOTHA (ȘIMONCA)
iuliana.botha@ie.ase.ro
Baze de date
Metadate
SBD
SGBD
1
22.10.2019
Entitatea
Instanţa
2
22.10.2019
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.
3
22.10.2019
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.
4
22.10.2019
Terminologie alternativă
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
5
22.10.2019
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
6
22.10.2019
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
7
22.10.2019
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
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).
8
22.10.2019
Operatorii
Acţionează asupra structurilor de date pentru
operaţii de prelucrare: actualizare, consultare,
sortare.
Există operatori specifici fiecărui model de date.
În structura relaţională se implementează cu
ajutorul LMD (limbajul de manipulare a datelor).
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.
Se pot descrie prin LDD, dar nu numai.
18
9
22.10.2019
19
BAZE DE DATE
ORGANIZAREA DATELOR
ÎN BAZE DE DATE
10
22.10.2019
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
22
11
22.10.2019
24
12
22.10.2019
25
26
13
22.10.2019
28
14
22.10.2019
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
15
22.10.2019
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
16
22.10.2019
Categorii de utilizatori
Utilizatori finali (end-users)
◦ Au altă pregătire decât cea în informatică şi utilizează
calculatorul ocazional sau zilnic (utilizatorii intensivi)
Specialişti
◦ Au pregătire de profil şi creează produse informatice
Cercetători în informatică
◦ Au pregătire de profil şi creează concepte
33
34
17
22.10.2019
CURSUL 3...
Modelul de date relaţional
35
18
29.10.2019
BAZE DE DATE
BUCUREŞTI
2019-2020
Conf.univ.dr. IULIANA BOTHA (ȘIMONCA)
iuliana.botha@ie.ase.ro
Structura relaţională
Operatorii relaţionali
Restricţiile de integritate
1
29.10.2019
Structura relaţională
Domeniu
Relaţie
Atribut
Tuplu
Cheie
Schemă
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}
2
29.10.2019
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).
3
29.10.2019
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ă.
4
29.10.2019
5
29.10.2019
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ă.
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.
6
29.10.2019
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;
7
29.10.2019
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
8
29.10.2019
Exemplu SQL
SELECT *
FROM angajati
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.
9
29.10.2019
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;
10
29.10.2019
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ă
11
29.10.2019
Tipuri de joncţiuni
R1 ⋈ R2
12
29.10.2019
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
13
29.10.2019
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
14
29.10.2019
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)
Joncţiunea la stânga
15
29.10.2019
Joncţiunea la dreapta
Joncţiunea completă
16
29.10.2019
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
17
29.10.2019
Clienti Angajati
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
R2.
◦ R1 – R2
◦ REMOVE (R1, R2)
◦ MINUS (R1, R2)
18
29.10.2019
Diferenţa
NU!
DE CE?
Clienti – Comenzi
Clienti – Comenzi
DA
Ce afişează?
19
29.10.2019
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
20
29.10.2019
Ce afişează?
Alţi operatori
Diviziunea
Complementarea
Spargerea unei relaţii
Închiderea tranzitivă
21
29.10.2019
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
22
29.10.2019
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ă.
23
29.10.2019
Restricţiile de integritate
Restricţii structurale (minimale):
De unicitate a cheii
Referenţială
Entităţii
Restricţii de comportament:
De domeniu
Temporare
24
29.10.2019
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
25
29.10.2019
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
26
29.10.2019
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.
Exemplificare SQL-Oracle
27
29.10.2019
Exemplificare SQL-Oracle
Exemplificare SQL-Oracle
28
29.10.2019
CURSUL 5...
Baze de date relaţionale
29
30.10.2019
Definiţie BDR
BUCUREŞTI
2019-2020
Conf.univ.dr. IULIANA BOTHA (ȘIMONCA)
2
iuliana.botha@ie.ase.ro
1
30.10.2019
2
30.10.2019
5 6
3
30.10.2019
Descrierea entităţilor
7 8
4
30.10.2019
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
30.10.2019
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
30.10.2019
efectuează
COMANDĂ unul sau mai mulţi angajaţi
CLIENT
este realizată
13 14
7
30.10.2019
15 16
8
30.10.2019
17 18
9
30.10.2019
19 20
10
30.10.2019
21 22
11
30.10.2019
23 24
12
30.10.2019
25 26
13
30.10.2019
27 28
14
30.10.2019
Studiu de caz
1. Să se construiască diagrama enititate-asociere pentru următorul scenariu.
2. Să se proiecteze schema conceptuală a bazei de date relaţionale.
CURSUL 6...
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
06.11.2019
BAZE DE DATE
BUCUREŞTI
2019-2020
Tehnica normalizării
Optimizarea schemei conceptuale a BDR
1
06.11.2019
Tehnica normalizării
Optimizarea schemei conceptuale a BDR
Tehnica normalizării
Optimizarea schemei conceptuale a BDR
2
06.11.2019
Tehnica normalizării
Anomaliile de actualizare
Tehnica normalizării
Forma normală unu (FN1)
3
06.11.2019
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
06.11.2019
Tehnica normalizării
Forma normală doi (FN2)
Tehnica normalizării
Aducerea relaţiilor în FN2
5
06.11.2019
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
06.11.2019
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
06.11.2019
Tehnica normalizării
Forma normală Boyce-Codd (BCNF)
15
Tehnica normalizării
Aducerea relaţiilor în BCNF
8
06.11.2019
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
06.11.2019
Tehnica normalizării
Forma normală patru (FN4)
19
Tehnica normalizării
Aducerea relaţiilor în FN4
20
10
06.11.2019
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
06.11.2019
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
06.11.2019
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
06.11.2019
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
06.11.2019
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
06.11.2019
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
06.11.2019
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
06.11.2019
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
06.11.2019
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
Rezolvați
Precizați ce formă normală este încălcată:
19
06.11.2019
Rezolvați
Precizați ce formă normală este încălcată:
Rezolvați
Precizați ce formă normală este încălcată:
20
06.11.2019
CURSUL 7...
Limbaje relaţionale pentru definirea şi manipularea
datelor. Limbajul SQL.
21
ACADEMIA DE STUDII ECONOMICE BUCUREŞTI
FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ
BAZE DE DATE
BUCUREŞTI
2019-2020
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
standardului Particularităţi
lansare
SQL
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
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
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)
);
17
Limbajul SQL-Oracle.
Crearea tabelelor
2) cu indicarea restricţiilor de integritate la nivel de coloană
CREATE TABLE angajati
(
marca NUMBER(4) CONSTRAINT pkAng PRIMARY KEY,
nume VARCHAR2(20) NOT NULL,
prenume VARCHAR2(20) NOT NULL,
email VARCHAR2(20) CONSTRAINT uqMail UNIQUE
CONSTRAINT ckMail CHECK (email LIKE '%@%.%'),
data_angajare DATE DEFAULT SYSDATE,
salariu NUMBER(8,2),
id_departament NUMBER(3) CONSTRAINT fkDep REFERENCES
departamente (id_departament) ON DELETE CASCADE
);
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
Limbajul SQL-Oracle Limbajul SQL-Oracle
Interogarea datelor
Clauze în SELECT Descriere
Comandă LMD Descriere restricţionează liniile care se returnează pe baza unui criteriu
WHERE condiţie
specificat în condiţia de selecţie
SELECT regăseşte date din una sau mai multe tabele
structurează rezultatul într-o manieră ierarhică (asemănător
adaugă o înregistrare nouă într-o tabelă
clauze de ordonare ierarhică
INSERT cu o organigramă)
UPDATE modifică valori asociate coloanelor unei tabele grupează liniile în scopul identificării valorilor comune
GROUP BY coloane_grupare
grupurilor (valori agregate calculate prin funcţii de grup)
realizează fie modificări ale datelor, fie adăugări de înregistrări dintr-o
MERGE restricţionează grupurile create prin clauza GROUP BY pe baza
altă tabelă, în funcţie de o condiţie de potrivire HAVING condiţie
unei condiţii asupra funcţiilor de grup
DELETE şterge înregistrări dintr-o tabelă
ORDER BY coloane_ordonare sortează liniile (implicit ascendent)
3 4
3 4
2
Rezolvaţi! Limbajul SQL-Oracle
Precedenţa operatorilor
Se consideră tabela: PORTS (PORT_ID, PORT_NAME, COUNTRY, CAPACITY), având
următoarele înregistrări:
PORT_ID PORT_NAME COUNTRY CAPACITY Operator
1 Galveston USA 4 *, /, -,+
2 San Diego USA 4
= , >= , > , <= , < , <> , != , IS , LIKE , IN
3 San Francisco USA 3
4 Los Angeles USA 4 BETWEEN
5 San Juan USA 3 NOT
6 Grand Cayman UK 3
AND
Ce rezultat va produce următoarea interogare SQL:
SELECT * || , OR
FROM PORTS
WHERE PORT_NAME LIKE 'San%'
OR PORT_NAME LIKE 'Grand%'
AND CAPACITY = 4;
5 6
5 6
3
Rezolvaţi! Limbajul SQL-Oracle
Interogarea datelor
Se consideră tabela: PORTS (PORT_ID, PORT_NAME, COUNTRY, CAPACITY), având
următoarele înregistrări: Utilizarea pseudocoloanelor (valori atribuite automat de către sistem
PORT_ID PORT_NAME COUNTRY CAPACITY
fiecărei tabele) în comenzile SQL:
1 Galveston USA 4
2 San Diego USA 4 ROWNUM
3 San Francisco USA 3
4 Los Angeles USA 4
5 San Juan USA 3 SELECT ROWNUM, id_angajat, nume, salariul
6 Grand Cayman UK 3 FROM angajati;
7 8
7 8
4
Rezolvaţi! Rezolvaţi!
Afişaţi primii 3 angajaţi cu cel mai mare salariu.
9 10
9 10
5
Rezolvaţi! Rezolvaţi!
Afişaţi primii 3 angajaţi cu cel mai mare salariu.
Afişaţi primii 3 angajaţi cu cel mai mare salariu.
11 12
11 12
6
Rezolvaţi! Rezolvaţi!
Afişaţi al doilea angajat cu cel mai mare salariu.
Afişaţi al doilea angajat cu cel mai mare salariu. ID_ANGAJAT NUME SALARIUL
---------- ------------------------- ----------
100 King 24000
108 Greenberg 16500
102 De Haan 15500
145 Russell 14000
146 Partners 13500
201 Hartstein 13000
205 Higgins 12000
147 Errazuriz 12000
168 Ozer 11500
...........
13 14
13 14
7
Rezolvaţi! Rezolvaţi!
Afişaţi al doilea angajat cu cel mai mare salariu. Afişaţi al doilea angajat cu cel mai mare salariu.
SELECT *
FROM
SELECT ROWNUM, id_angajat, nume, salariul (SELECT ROWNUM as rn, id_angajat, nume, salariul
FROM (SELECT id_angajat, nume, salariul FROM (SELECT id_angajat, nume, salariul
FROM angajati FROM angajati
ORDER BY salariul DESC) ORDER BY salariul DESC)
WHERE ROWNUM = 2; WHERE ROWNUM <= 2)
-- WHERE ROWNUM < 3 AND ROWNUM >= 2; WHERE rn = 2;
15 16
15 16
8
Limbajul SQL-Oracle
Rezolvaţi! Interogarea datelor
Utilizarea expresiilor în comenzile SQL:
Afişaţi al doilea angajat cu cel mai mare salariu.
◦ Pe lângă specificarea coloanelor, într-o comandă SELECT pot fi incluse
şi expresii
Rezolvare alternativă!
◦ O expresie se poate referi la: literali, operatori, funcţii SQL
17 18
17 18
9
Limbajul SQL-Oracle Limbajul SQL-Oracle
Interogarea datelor Interogarea datelor
Utilizarea expresiilor în comenzile SQL este permisă în: Tabela DUAL
◦ lista de coloane a unei comenzi SELECT ◦ tabelă existentă în orice BD Oracle
◦ clauzele WHERE, HAVING şi ORDER BY dintr-o comandă SELECT ◦ are o singură coloană: DUMMY de tip VARCHAR2(1)
◦ clauza VALUES a unei comenzi INSERT ◦ are o singură linie, conţinând valoarea x
◦ clauzele SET şi WHERE ale unei comenzi UPDATE ◦ utilizată pentru testarea unor comenzi SELECT care nu fac referiri neapărat la o
tabelă dintr-o BD
◦ clauza WHERE a unei comenzi DELETE
SELECT 1000* 1.5
SELECT id_angajat, nume, salariul, salariul * 1.5
FROM dual;
FROM angajati
WHERE comision IS NOT NULL
SELECT SYSDATE, CURRENT_DATE
AND salariul*1.5>16000
FROM dual;
ORDER BY salariul*1.5 DESC;
19 20
19 20
10
Limbajul SQL-Oracle Limbajul SQL-Oracle
Funcţii SQL Funcţii SQL
Funcţii SQL care manipulează şiruri de caractere
Sintaxă Descriere Rezultat SELECT UPPER('oracle'), LOWER('oracle'), INITCAP('oracle')
FROM dual;
UPPER (s) / LOWER (s) Conversie de format: ORACLE / oracle şir de caractere
UPPER('ORACLE') LOWER('ORACLE') INITCAP('ORACLE')
INITCAP (s) Conversie de format: Oracle şir de caractere --------------- --------------- -----------------
CONCAT (s1,s2) Concatenează două șiruri şir de caractere ORACLE oracle Oracle
LPAD (s1,n,s2) / RPAD (s1,n,s2) Completează un șir (la dreapta/stânga) şir de caractere
SELECT SUBSTR('oracle database',1,3),
LTRIM (s1,s2) / RTRIM (s1,s2) Trunchează un șir (la dreapta/stânga) şir de caractere
SUBSTR('oracle database',-8,4)
TRIM (info s1 FROM s2) Trunchează un șir şir de caractere FROM dual;
LENGTH (s) Calculează lungimea unui șir număr SUBSTR('ORACLEDATABASE',1,3) SUBSTR('ORACLEDATABASE',-8,4)
INSTR (s1,s2, poz,n) Indică poziția unui subșir număr ---------------------------- -----------------------------
ora data
SUBSTR (s,poz,n) Extrage un subșir dintr-un șir dat şir de caractere
21 22
11
Limbajul SQL-Oracle Limbajul SQL-Oracle
Funcţii SQL Funcţii SQL
SELECT CONCAT('Oracle ' ,'Database'),
LPAD('Oracle',15,'*'), RTRIM('Oracle****','*'), SELECT REPLACE('oracle database','a'),
TRIM(BOTH '*' FROM '**Oracle****'), LENGTH('Oracle'), REPLACE('oracle database','a','*')
INSTR('Oracle Database','a',1,3) FROM dual;
FROM dual;
REPLACE('ORACLEDATABASE','A') REPLACE('ORACLEDATABASE','A',‘*')
CONCAT('ORACLE','DATABASE') LPAD('ORACLE',15,'*') RTRIM('ORACLE****','*') ----------------------------- --------------------------------
--------------------------- --------------------- ----------------------- orcle dtbse or*cle d*t*b*se
Oracle Database *********Oracle Oracle
TRIM(BOTH'*'FROM'**ORACLE****' LENGTH('ORACLE')
------------------------------ ----------------
Oracle 6
INSTR('ORACLEDATABASE','A',1,3
------------------------------
11
23 24
23 24
12
Ce afişează comanda următoare? Ce afişează comanda următoare?
25 26
25 26
13
Limbajul SQL-Oracle Limbajul SQL-Oracle
Funcţii SQL Funcţii SQL
Funcţii SQL care manipulează valori numerice
SELECT ROUND(3.148,2), TRUNC(3.148,2), MOD(11,3)
Sintaxă Descriere Rezultat FROM dual;
ROUND (n,i) Rotunjește numărul n la i zecimale număr
27 28
27 28
14
Limbajul SQL-Oracle Limbajul SQL-Oracle
Funcţii SQL Funcţii SQL
Funcţii SQL care manipulează date calendaristice SELECT SYSDATE, ROUND(SYSDATE,'MM'), ROUND(SYSDATE,'YY'),
Sintaxă Descriere Rezultat TRUNC(SYSDATE,'MM'), TRUNC(SYSDATE,'YY')
FROM dual;
SYSDATE Returnează data curentă a serverului dată calendaristică
SYSDATE ROUND(SYSDATE,'MM') ROUND(SYSDATE,'YY')
CURRENT_DATE Returnează data curentă a clientului dată calendaristică ----------- ------------------- -------------------
20-11-2019 01-12-2019 01-01-2020
ROUND (d,i) Rotunjește o dată calendaristică dată calendaristică
29 30
15
Limbajul SQL-Oracle Limbajul SQL-Oracle
Funcţii SQL Funcţii SQL
SELECT SYSDATE, NEXT_DAY(SYSDATE,'Vineri'), Funcţii SQL speciale
LAST_DAY(SYSDATE)
FROM dual; Sintaxă Descriere
----------- -------------------------- ----------------- NULLIF (e1,e2) Returnează NULL dacă e1=e2; altfel întoarce e1
20-11-2019 22-11-2019 30-11-2019
DECODE (e,expresii_de_căutare,d)
Verifică variante alternative
CASE expr WHEN cond THEN rez ... ELSE rez END
SELECT ADD_MONTHS(SYSDATE,4),
MONTHS_BETWEEN(ADD_MONTHS(SYSDATE,4),SYSDATE)
FROM dual;
ADD_MONTHS(SYSDATE,4) MONTHS_BETWEEN(ADD_MONTHS(SYSD
--------------------- ------------------------------
20-03-2020 4
31 32
31 32
16
Limbajul SQL-Oracle Limbajul SQL-Oracle
Funcţii SQL Funcţii SQL
33 34
33 34
17
Limbajul SQL-Oracle Limbajul SQL-Oracle
Funcţii SQL Funcţii SQL
SELECT nume, salariul+comision "Venit total"
FROM angajati SELECT pret_lista, pret_min, NULLIF(pret_lista,pret_min)
WHERE comision IS NULL; FROM produse;
NUME Venit total PRET_LISTA PRET_MIN NULLIF(PRET_LISTA,PRET_MIN)
------------------------- ----------- ---------- ---------- ---------------------------
King 221,00 180,00 221
Kochhar 73,00 73,00
... 299,00 244,00 299
399,00 355,00 399
SELECT nume, salariul+NVL(comision,0) "Venit total"
FROM angajati
WHERE comision IS NULL;
NUME Venit total
------------------------- -----------
King 24000
Kochhar 17000
...
35 36
35 36
18
Limbajul SQL-Oracle Limbajul SQL-Oracle
Funcţii SQL Funcţii SQL
SELECT denumire_produs,pret_lista, SELECT denumire_produs, categorie, pret_lista,
CASE CASE LOWER(categorie)
WHEN pret_lista < 100 THEN 'pret mic ' WHEN 'hardware4' THEN 0.2
WHEN pret_lista BETWEEN 100 AND 200 THEN 'pret mediu ' WHEN 'hardware2' THEN 0.15
ELSE 'pret mare' ELSE 0
END Calificativ END * pret_lista Majorare_pret
FROM produse; FROM produse
WHERE LOWER(categorie) LIKE 'h%' ;
DENUMIRE_PRODUS PRET_LISTA CALIFICATIV
------------------------------------------------- ---------- -----------
DIMM - 128 MB 305,00 pret mare DENUMIRE_PRODUS CATEGORIE PRET_LISTA MAJORARE_PRET
DIMM - 16 MB 124,00 pret mediu --------------------- ------------------- ---------- -------------
DIMM - 1GB 599,00 pret mare DIMM - 128 MB hardware4 305,00 61
Battery - EL 44,00 pret mic DIMM - 16 MB hardware2 124,00 24,8
....... .......
37 38
37 38
19
Limbajul SQL-Oracle Limbajul SQL-Oracle
Funcţii SQL Funcţii SQL
SELECT denumire_produs, categorie, pret_lista, Funcţii SQL de conversie între tipuri de date
DECODE(LOWER(categorie),'hardware4' ,0.2,'hardware2' ,0.15,0) Sintaxă Descriere
* pret_lista Majorare_pret
FROM produse TO_NUMBER(s,format) Convertește un șir de caractere la număr
WHERE LOWER(categorie) LIKE 'h%' ; TO_CHAR (n,format) Convertește un număr la șir de caractere
DENUMIRE_PRODUS CATEGORIE PRET_LISTA MAJORARE_PRET TO_CHAR (d,format) Convertește o dată calendaristică la șir de caractere
39 40
39 40
20
Limbajul SQL-Oracle Limbajul SQL-Oracle
Funcţii SQL Funcţii SQL
SELECT TO_NUMBER('$17,000.23', '$999,999.99') SELECT TO_CHAR(SYSDATE+1,'DAY, DD MONTH YYYY')
FROM dual; FROM dual;
TO_NUMBER('$17,000.23','$999,99.99')
TO_CHAR(SYSDATE,'DAY,DDMONTHYYYY')
------------------------------------
----------------------------------
17000,23
JOI , 21 NOIEMBRIE 2019
TO_CHAR(SYSDATE,'DD-MON-YYYYHH
TO_CHAR(198,'$999,999.99')
------------------------------
--------------------------
20-NOI-2019 10:42:51
$198.00
41 42
41 42
21
Limbajul SQL-Oracle Limbajul SQL-Oracle
Funcţii SQL Funcţii SQL
Funcţii SQL de grup
SELECT TO_DATE('23-10-2010','DD-MM-YYYY')
FROM dual; Sintaxă Descriere
COUNT(e) Returnează numărul de înregistrări dintr-un grup de linii
TO_DATE('23-10-2010','DD-MM-YY
------------------------------ SUM(e) Returnează totalul valorilor coloanei argument dintr-un grup de linii
23.10.2010
MIN(e) Returnează minimul valorilor coloanei argument dintr-un grup de linii
43 44
43 44
22
Rezolvaţi!
Limbajul SQL-Oracle Afişaţi pentru fiecare angajat identificat prin nume numărul total de
Funcţii SQL comenzi intermediate, precum şi valoarea acestora.
COUNT(*) COUNT(ID_ANGAJAT)
---------- -----------------
107 107
SELECT COUNT(comision)
FROM angajati;
COUNT(COMISION)
---------------
35
46
45
45 46
23
Rezolvare CURSUL 9...
47
47 48
24
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
2019-2020
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
----------- ---------- -----------
SELECT id_departament Departament, id_functie Functie, 10 AD_ASST 1
10 1
COUNT(id_angajat) "NR.ANGAJATI" 20 MK_MAN 1
20 MK_REP 1
FROM angajati 20 2
WHERE id_departament IS NOT NULL 30 PU_CLERK 5
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
FROM angajati 30 6
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
sau CUBE 0 – dacă nu a avut loc o grupare de 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
WHERE a.id_departament IS NOT NULL
United Kingdom London 1
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
Rezolvare
Rezolvaţi!
Afişaţi numărul de produse din fiecare categorie, precum şi numărul total
de produse
SELECT categorie, COUNT(id_produs) "NR.PRODUSE"
FROM produse
GROUP BY ROLLUP(categorie)
ORDER BY categorie;
CATEGORIE NR.PRODUSE
---------------------------------------- ----------
office1 6
office2 20
office3 6
office4 21
software1 7
software2 3 Afişaţi numărul total de salariaţi, precum şi numărul de salariaţi
software4 22 angajaţi în anii 1996, 1997 şi 1998.
...................................................
288
21 22
11
Limbajul SQL-Oracle Limbajul SQL-Oracle
Joncţiuni Joncţiuni
23 24
12
Limbajul SQL-Oracle CURSUL 10...
Joncţiuni
Oracle Standard SQL
Joncţiune externă completă Limbaje relaţionale pentru definirea şi manipularea datelor.
SELECT t1.a, t2.c SELECT t1.a, t2.c Limbajul SQL. (continuare)
FROM tabela1 t1, tabela2 t2 FROM tabela1 t1 FULL JOIN tabela2 t2
WHERE t1.b=t2.b (+) ON t1.b=t2.b;
UNION
SELECT t1.a, t2.c
FROM tabela1 t1, tabela2 t2
WHERE t1.b (+)=t2.b;
Joncţiunea tabelei cu ea însăşi
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;
25
13
ACADEMIA DE STUDII ECONOMICE BUCUREŞTI
FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ
Limbajul SQL-Oracle
Interogarea datelor. Subcereri.
Subcerere (cerere imbricată) – comandă SELECT inclusă într-o altă
BAZE DE DATE comandă SQL, care poate returna una sau mai multe linii.
Subcererile sunt utilizate pentru:
Limbaje relaţionale pentru definirea şi ➢ a obţine rezultate pe baza unor criterii, care apoi să fie utilizate pentru
manipularea datelor. Limbajul SQL. 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)
BUCUREŞTI ➢ a defini expresii calculate dinamic prin subcereri scalare
2019-2020
1 2
1
Limbajul SQL-Oracle Limbajul SQL-Oracle
Interogarea datelor. Subcereri. Interogarea datelor. Subcereri.
Tipuri de subcereri:
SELECT id_angajat, nume
Subcereri Descriere FROM angajati
WHERE id_functie = (SELECT id_functie
returnează o singură linie (conţinând valori pentru una
➢ subcereri single-row FROM angajati
sau mai multe coloane)
➢ subcereri multiple-row returnează 0, 1 sau mai multe linii
WHERE UPPER(nume)='ABEL')
AND UPPER(nume)!='ABEL';
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
3 4
3 4
2
Limbajul SQL-Oracle Limbajul SQL-Oracle
Interogarea datelor. Subcereri. Interogarea datelor. Subcereri.
SELECT id_angajat, nume Operatori de comparaţie utilizaţi în cadrul subcererilor multiple-row:
FROM angajati
WHERE id_functie = (SELECT id_functie FROM angajati Operatori Descriere
WHERE UPPER(nume)='KING') • compară cu o listă de valori
IN
AND UPPER(nume)!='KING'; • verifică dacă valoarea căutată se regăseşte în listă
NOT • utilizat cu operatorul IN
ORA-01427: single-row subquery returns more than one row
• utilizat în combinaţie cu operatorii de comparaţie (=, <)
ANY • verifică dacă valoarea căutată îndeplineşte condiţia de comparaţie cu
SELECT id_angajat, nume oricare dintre liniile returnate de subcerere
FROM angajati SOME • la fel ca operatorul ANY
WHERE id_functie IN (SELECT id_functie FROM angajati • utilizat în combinaţie cu operatorii de comparaţie (=, <)
WHERE UPPER(nume)='KING') ALL • verifică dacă valoarea căutată îndeplineşte condiţia de comparaţie cu
toate liniile returnate de subcerere
AND UPPER(nume)!='KING';
5 6
5 6
3
Limbajul SQL-Oracle Limbajul SQL-Oracle
Interogarea datelor. Subcereri. Interogarea datelor. Subcereri.
• ANY compară valoarea cu oricare valoare returnată de interogare SELECT id_angajat, salariul
• ALL compară valoarea cu toate valorile returnate de interogare FROM angajati
WHERE salariul > ALL (10000, 15000, 20000);
7 8
7 8
4
Limbajul SQL-Oracle Limbajul SQL-Oracle
Interogarea datelor. Subcereri. Interogarea datelor. Subcereri.
SELECT id_angajat, salariul
FROM angajati UPDATE angajati
WHERE salariul > ANY (10000, 15000, 20000); SET salariul=1.1*salariul
WHERE (id_functie, id_departament) =
(SELECT id_functie, id_departament
FROM angajati
SELECT id_angajat, salariul WHERE UPPER(nume)='ABEL');
FROM angajati
WHERE salariul > 10000
OR salariul > 15000
OR salariul > 20000;
9 10
9 10
5
Limbajul SQL-Oracle
Interogarea datelor. Subcereri. Rezolvaţi!
SELECT (SELECT COUNT(id_client) FROM clienti) "Toti clientii",
(SELECT COUNT(id_client) FROM comenzi) "Clientii cu comenzi“
FROM DUAL;
11 12
11 12
6
Limbajul SQL-Oracle
Rezolvare Interogarea datelor. Subcereri.
SELECT (SELECT COUNT(id_angajat) FROM angajati) "TOTAL",
UPDATE angajati
(SELECT COUNT(id_angajat) FROM angajati WHERE EXTRACT(YEAR FROM
data_angajare)=1996) "ANGAJATI_1996", SET salariul=1.1 * salariul
(SELECT COUNT(id_angajat) FROM angajati WHERE EXTRACT(YEAR FROM WHERE id_angajat IN
data_angajare)=1997) "ANGAJATI_1997", (SELECT id_angajat FROM comenzi);
(SELECT COUNT(id_angajat) FROM angajati WHERE EXTRACT(YEAR FROM
data_angajare)=1998) "ANGAJATI_1998"
FROM DUAL;
UPDATE angajati a
SET a.salariul=1.1 * a.salariul
TOTAL ANGAJATI_1996 ANGAJATI_1997 ANGAJATI_1998 WHERE EXISTS
---------- ------------- ------------- ------------- (SELECT * FROM comenzi
107 10 28 23
WHERE id_angajat=a.id_angajat);
13 15
13 15
7
Limbajul SQL-Oracle Limbajul SQL-Oracle
Interogarea datelor. Subcereri. Interogarea datelor. Subcereri.
SELECT c.nume_client Găsiți angajații care au subordonați
FROM clienti c SEMI-JOIN
WHERE EXISTS SELECT nume FROM angajati
WHERE id_angajat IN
(SELECT * FROM comenzi co
(SELECT id_manager FROM angajati);
WHERE co.id_client=c.id_client);
SAU
SELECT c.nume_client
FROM clienti c SELECT a.nume FROM angajati a
WHERE NOT EXISTS WHERE EXISTS
(SELECT 1 FROM angajati b
(SELECT * FROM comenzi co
WHERE b.id_manager=a.id_angajat);
WHERE co.id_client=c.id_client);
16 17
16 17
8
Limbajul SQL-Oracle Limbajul SQL-Oracle
Interogarea datelor. Subcereri. Interogarea datelor. Cereri ierarhice.
Găsiți angajații care nu au subordonați
SAU
18 19
18 19
9
Limbajul SQL-Oracle Limbajul SQL-Oracle
Interogarea datelor. Cereri ierarhice. Interogarea datelor. Cereri ierarhice.
Nod rădăcină
Exemple de date structurate ierarhic:
Nivel 1
•Ierarhii organizaționale
•Arbori genealogici
Nivel 2
•Link-uri dintre paginile Web ale unei aplicații
•Legături în cadrul rețelelor de socializare Nivel 3
•Activitățile unui proiect
•Sistemul de fișiere
Nivel 4
20 21
20 21
10
Limbajul SQL-Oracle Limbajul SQL-Oracle
Interogarea datelor. Cereri ierarhice. Interogarea datelor. Cereri ierarhice.
SELECT a.id_angajat, a.nume "ANGAJAT", Clauze în SELECT Descriere
a.id_manager, m.nume "MANAGER" START WITH identifică nodul rădăcină
FROM angajati a, angajati m defineşte legăturile de tip self-join, precum şi direcţia în care va
CONNECT BY
WHERE a.id_manager=m.id_angajat fi traversată ierarhia
ORDER BY a.id_angajat; ORDER SIBLINGS BY sortează liniile din cadrul fiecărui nivel ierarhic
ID_ANGAJAT ANGAJAT ID_MANAGER MANAGER
---------- ------------------------- ---------- --------------------- Alte concepte utilizate:
101 Kochhar 100 King
102 De Haan 100 King PRIOR - utilizat în cadrul CONNECT BY pentru stabilirea direcţiei în care va fi traversată
103 Hunold 102 De Haan ierarhia
104 Ernst 103 Hunold
105 Austin 103 Hunold LEVEL - pseudo-coloană care identifică valoarea corespunzătoare nivelului din ierarhie
106 Pataballa 103 Hunold (LEVEL 1 corespunde nodului rădăcină, LEVEL 2 indică nivelul copil relativ la rădăcină etc.)
107 Lorentz 103 Hunold
108 Greenberg 101 Kochhar SYS_CONNECT_BY_PATH – funcţie care afişează calea către orice nod, pornind de la nodul
109 Faviet 108 Greenberg rădăcină
110 Chen 108 Greenberg CONNECT_BY_ROOT – operator care referă datele din nodul rădăcină
23
22 23
11
Limbajul SQL-Oracle Limbajul SQL-Oracle
Interogarea datelor. Cereri ierarhice. Interogarea datelor. Cereri ierarhice.
LEVEL ID_ANGAJAT NUME LEVEL ID_ANGAJAT ANGAJAT
---------- ---------- ---------
1 100 King
SELECT LEVEL, id_angajat, ----------1 ---------- -------------------
100 King
SELECT LEVEL, id_angajat, nume 2 101 Kochhar LPAD(' ',LEVEL)||nume angajat 2 101 Kochhar
3 108 Greenberg 3 108 Greenberg
FROM angajati 4 109 Faviet
FROM angajati 4 109 Faviet
4 110 Chen
START WITH id_angajat=100 4 110 Chen START WITH id_angajat=100
4 111 Sciarra 4 111 Sciarra
CONNECT BY 4 112 Urman CONNECT BY 4 112 Urman
4 113 Popp
id_manager=PRIOR id_angajat; 4 113 Popp id_manager=PRIOR id_angajat; 3 200 Whalen
3 200 Whalen
3 203 Mavris
3 203 Mavris 3 204 Baer
3 204 Baer 3 205 Higgins
3 205 Higgins 4 206 Gietz
4 206 Gietz 2 102 De Haan
2 102 De Haan 3 103 Hunold
3 103 Hunold 4 104 Ernst
4 104 Ernst 4 105 Austin
4 105 Austin 4 106 Pataballa
4 106 Pataballa 4 107 Lorentz
4 107 Lorentz
24 25
12
Limbajul SQL-Oracle Limbajul SQL-Oracle
Interogarea datelor. Cereri ierarhice. Interogarea datelor. Cereri ierarhice.
LEVEL ID_ANGAJAT ANGAJAT
SELECT LEVEL, id_angajat, SELECT LEVEL, id_angajat, ---------- ---------- ----------------
1 100 King
LPAD(' ',LEVEL)||nume angajat LPAD(' ',LEVEL)||nume angajat 2 148 Cambrault
FROM angajati 3 172 Bates
FROM angajati 3 169 Bloom
START WITH id_angajat=110 START WITH id_angajat=100 3 170 Fox
3 173 Kumar
CONNECT BY CONNECT BY 3 168 Ozer
PRIOR id_manager = id_angajat; 3 171 Smith
id_manager=PRIOR id_angajat 2 102 De Haan
ORDER SIBLINGS BY nume; 3 103 Hunold
LEVEL ID_ANGAJAT ANGAJAT 4 105 Austin
---------- ---------- ---------- 4 104 Ernst
1 110 Chen 4 107 Lorentz
2 108 Greenberg 4 106 Pataballa
3 101 Kochhar 2 147 Errazuriz
4 100 King 3 166 Ande
3 167 Banda
3 163 Greene
3 165 Lee
3 164 Marvins
26 27
13
Limbajul SQL-Oracle Limbajul SQL-Oracle
Interogarea datelor. Cereri ierarhice. Interogarea datelor. Cereri ierarhice.
LEVEL ID_ANGAJAT ANGAJAT
------ ---------- --------------------------------- LEVEL ID_ANGAJAT ANGAJAT
SELECT LEVEL, id_angajat, 1 100 /King SELECT LEVEL, id_angajat, ---------- ---------- -----------------
2 101 /King/Kochhar 1 100 King
SYS_CONNECT_BY_PATH(nume,'/') 3 108 /King/Kochhar/Greenberg
LPAD(' ',LEVEL)||nume angajat
2 102 De Haan
angajat 4 109 /King/Kochhar/Greenberg/Faviet FROM angajati 3 103 Hunold
4 110 /King/Kochhar/Greenberg/Chen 4 104 Ernst
FROM angajati 4 111 /King/Kochhar/Greenberg/Sciarra START WITH id_angajat=100 4 105 Austin
4 112 /King/Kochhar/Greenberg/Urman
START WITH id_angajat=100 CONNECT BY 4 106 Pataballa
4 113 /King/Kochhar/Greenberg/Popp
3 200 /King/Kochhar/Whalen 4 107 Lorentz
CONNECT BY 3 203 /King/Kochhar/Mavris
id_manager=PRIOR id_angajat 2 114 Raphaely
id_manager=PRIOR id_angajat; 3 204 /King/Kochhar/Baer 3 115 Khoo
AND id_angajat!=101; 3 116 Baida
3 205 /King/Kochhar/Higgins
4 206 /King/Kochhar/Higgins/Gietz 3 117 Tobias
2 102 /King/De Haan 3 118 Himuro
3 103 /King/De Haan/Hunold 3 119 Colmenares
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
28 29
14
Limbajul SQL-Oracle Limbajul SQL-Oracle
Actualizarea datelor Actualizarea datelor. Comanda MERGE
SELECT id_angajat, nume, salariul, id_functie
Comandă Descriere
FROM angajati
INSERT adaugă o înregistrare nouă într-o tabelă
ORDER BY id_angajat;
UPDATE modifică valori asociate coloanelor unei tabele
realizează fie modificări ale datelor, fie ştergeri, fie ID_ANGAJAT NUME SALARIUL ID_FUNCTIE
MERGE adăugări de înregistrări dintr-o altă tabelă, în funcţie de o ---------- ------------------------- ---------- ----------
100 King 24000 AD_PRES
condiţie de potrivire
101 Kochhar 17000 AD_VP
DELETE şterge înregistrări dintr-o tabelă 102 De Haan 17000 AD_VP
103 Hunold 9110 IT_PROG
104 Ernst 6110 IT_PROG
105 Austin 4910 IT_PROG
106 Pataballa 4910 IT_PROG
107 Lorentz 4310 IT_PROG
30 31
30 31
15
Limbajul SQL-Oracle Limbajul SQL-Oracle
Actualizarea datelor. Comanda MERGE Actualizarea datelor. Comanda MERGE
SELECT id_angajat, nume, salariul, id_functie MERGE INTO angajati a
USING angajati_noi b
FROM angajati_noi
ON (a.id_angajat=b.id_angajat)
ORDER BY id_angajat; WHEN MATCHED THEN
UPDATE
ID_ANGAJAT NUME SALARIUL ID_FUNCTIE
---------- ------------------------- ---------- ---------- SET a.salariul=b.salariul,
99 Loren 4000,00 AD_PRES a.id_functie=b.id_functie
103 Hunold 9500,00 AD_PRES
104 Ernst 6000,00 IT_PROG WHEN NOT MATCHED THEN
105 Austin 7500,00 IT_PROG INSERT
106 Pataballa 4800,00 IT_PROG
120 Weiss 8000,00 ST_MAN (a.id_angajat,a.prenume,a.nume,a.email,a.data_angajare
121 Fripp 8200,00 ST_MAN ,a.id_functie,a.salariul,a.id_departament)
122 Kaufling 7900,00 ST_MAN
123 Vollman 6500,00 ST_MAN VALUES
124 Mourgos 5800,00 ST_MAN (b.id_angajat,b.prenume,b.nume,b.email,b.data_angajare
32 ,b.id_functie,b.salariul,b.id_departament);
33
32 33
16
Limbajul SQL-Oracle CURSUL 11...
Actualizarea datelor. Comanda MERGE
SELECT id_angajat, nume, salariul, id_functie
Gestiunea altor obiecte ale bazei de date
FROM angajati
ORDER BY id_angajat;
34
34 35
17
ACADEMIA DE STUDII ECONOMICE BUCUREŞTI
FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ
✓ Secvenţe (SEQUENCES)
Gestiunea altor obiecte ✓ Sinonime (SYNONYMS)
ale bazei de date ✓ Indecşi (INDEXES)
✓ Clustere (CLUSTERS)
✓ etc.
BUCUREŞTI
2019-2020
1 2
1
Tabele virtuale Tabele virtuale
❑ Tabelă virtuală view viziune vedere Crearea unei tabele virtuale:
❑ O tabelă virtuală desemnează o comandă SELECT stocată CREATE [OR REPLACE] VIEW nume_view
în baza de date sub un anumit nume
AS
❑ O tabelă virtuală poate fi referită ca şi orice altă tabelă de comandă SELECT
bază
[WITH READ ONLY]
❑ Principala utilitate a tabelelor virtuale: asigurarea [WITH CHECK OPTION];
securităţii unei baze de date
3 4
3 4
2
Tabele virtuale Tabele virtuale
❑ O tabelă virtuală trebuie să aibă nume de coloane valide
CREATE OR REPLACE VIEW vw_angajati AS atenţie la utilizarea expresiilor!
SELECT id_angajat, nume, telefon
FROM angajati;
❑ Î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)
View VW_ANGAJATI created. SELECT * FROM vw_angajati;
➢ complexe (cu interogări asupra mai multor tabele, cu grupări sau
folosind expresii)
5 6
3
Tabele virtuale Tabele virtuale
CREATE OR REPLACE VIEW clerk AS
SELECT id_angajat, nume, id_departament, id_functie
FROM angajati
❑ Clauze de restricţionare în subcererea care stă la baza
WHERE id_functie = 'PU_CLERK'
unei tabele virtuale:
OR id_functie = 'SH_CLERK'
OR id_functie = 'ST_CLERK'; ✓ WITH CHECK OPTION
✓ WITH READ ONLY
UPDATE clerk
SET id_functie = 'PU_MAN'
WHERE id_angajat = 115;
7 8
7 8
4
Tabele virtuale Tabele virtuale
CREATE OR REPLACE VIEW clerk AS CREATE OR REPLACE VIEW clerk AS
SELECT id_angajat, nume, id_departament, id_functie SELECT id_angajat, nume, id_departament, id_functie
FROM angajati FROM angajati
WHERE id_functie = 'PU_CLERK' WHERE id_functie = 'PU_CLERK'
OR id_functie = 'SH_CLERK' OR id_functie = 'SH_CLERK'
OR id_functie = 'ST_CLERK' OR id_functie = 'ST_CLERK'
WITH CHECK OPTION; WITH READ ONLY;
9 10
9 10
5
Tabele virtuale Secvenţe
11 12
11 12
6
Secvenţe Secvenţe
Opţiunile posibil de specificat la crearea unei secvenţe: Utilizarea secvenţelor presupune referirea a două pseudo-coloane:
❑ NEXTVAL
START WITH număr_întreg
◦ incrementează secvenţa către următorul număr, în concordanţă cu
INCREMENT BY număr_întreg directivele indicate la crearea secvenţei
MAXVALUE număr_întreg ◦ returnează noua valoare
NOMAXVALUE ◦ apelul iniţial al lui NEXVAL va returna prima valoare din secvenţă
MINVALUE număr_întreg ❑ CURRVAL
NOMINVALUE ◦ afişează valoarea curentă din secvenţă
CYCLE ◦ poate fi utilizată numai dacă anterior a fost deja referită pseudo-
coloana NEXTVAL
NOCYCLE
13 14
13 14
7
Secvenţe Secvenţe
Aspecte privind utilizarea secvenţelor:
CREATE SEQUENCE seq_dep CREATE SEQUENCE seq_ang
◦ o comandă SQL care foloseşte pseudo-coloana NEXTVAL va conduce
START WITH 1 START WITH 1 la avansarea în secvenţă chiar şi în cazul în care comanda iniţială
INCREMENT BY 1 INCREMENT BY 1 eşuează
MAXVALUE 10 MAXVALUE 90 ◦ nu pot fi folosite pseudo-coloanele NEXTVAL şi CURRVAL în clauza
NOCYCLE; NOCYCLE; DEFAULT a comenzilor CREATE TABLE sau ALTER TABLE
◦ nu pot fi folosite pseudo-coloanele NEXTVAL şi CURRVAL în subcereri
INSERT INTO departamente (id_departament, incluse în comenzile CREATE VIEW sau SELECT, UPDATE, DELETE
denumire_departament) ◦ nu pot fi folosite pseudo-coloanele NEXTVAL şi CURRVAL în clauza
VALUES (seq_dep.NEXTVAL, 'IT'); WHERE a unei comenzi SELECT
INSERT INTO angajati (id_angajat, nume, id_departament) ◦ nu pot fi folosite pseudo-coloanele NEXTVAL şi CURRVAL la definirea
VALUES (seq_ang.NEXTVAL, 'Gigi', seq_dep.CURRVAL); restricţiilor de integritate de tip CHECK
15 16
15 16
8
Secvenţe Sinonime
Modificarea secvenţelor:
Un sinonim reprezintă un nume alternativ (alias) pentru un alt
ALTER SEQUENCE nume_secvenţă obiect al bazei de date.
opţiuni_secvenţă;
Există două tipuri de sinonime:
Ştergerea secvenţelor: ➢ Private: există doar la nivelul utilizatorului care le-a creat
DROP SEQUENCE nume_secvenţă;
➢ Publice: sunt deţinute de utilizatorul PUBLIC şi sunt în mod
automat vizibile tuturor utilizatorilor
17 18
17 18
9
Sinonime Sinonime
Crearea sinonimelor:
◦ private
Ştergerea sinonimelor:
CREATE OR REPLACE SYNONYM ang1 FOR angajati;
◦ private
◦ publice
DROP SYNONYM ang1;
CREATE OR REPLACE PUBLIC SYNONYM ang2 FOR
angajati;
◦ publice
DROP PUBLIC SYNONYM ang2;
Utilizarea sinonimelor:
SELECT id_angajat, nume, id_departament,
id_functie
FROM ang1
WHERE id_functie = 'PU_CLERK';
19 20
19 20
10
Aspecte privind indexarea în bazele de
Indecşi date
❑ Un index este un obiect asociat unei tabele sau unui grup de ❑ absenţa sau prezenţa unui index nu influenţează în niciun fel
tabele (cluster), care se creează în mod explicit folosind structura comenzilor SQL de regăsire a datelor din baza de date;
comanda SQL CREATE INDEX pentru a mări viteza de acces la
❑ pentru creşterea vitezei de execuţie a operaţiilor de joncţiune,
datele unei tabele. se recomandă indexarea coloanelor care participă la join;
❑ Coloanele care au ataşate restricţii PRIMARY KEY sau UNIQUE ❑ dacă se distrug indecşii, aplicaţia cu baze de date continuă să
au indecşi creaţi automat. funcţioneze, dar cu performanţe mai mici;
❑ Indecşii pot fi unici sau nu. Crearea unui index unic se face cu ❑ indecşii sunt logic şi fizic independenţi de datele tabelelor cu
comanda CREATE UNIQUE INDEX sau prin definirea unei care sunt asociaţi;
restricţii de integritate UNIQUE sau PRIMARY KEY.
21 22
21 22
11
Aspecte privind indexarea în bazele de Aspecte privind indexarea în bazele de
date date
Un index poate fi creat în mod implicit, odată cu activarea
❑ numărul indecşilor ce pot fi creaţi pentru o tabelă poate fi constrângerilor de integritate UNIQUE sau PRIMARY KEY sau
oricât de mare, cu toate acestea numărul lor trebuie corelat cu explicit, prin folosirea comenzii SQL CREATE INDEX.
tipul operaţiilor majoritare ce se vor executa asupra tabelei;
Crearea implicită se face astfel:
❑ un index se recomandă a se crea după ce datele au fost CREATE TABLE angajati
încărcate în tabelă, altfel acesta va trebui actualizat de fiecare
dată când se încarcă un rând în tabelă; (marca NUMBER(3) PRIMARY KEY,
CNP VARCHAR2(13) UNIQUE
❑ Oracle întreţine în mod automat indecşii creaţi, astfel încât în
nume VARCHAR2(30));
aceştia se reflectă toate actualizările (adăugări, modificări sau
ştergeri de înregistrări) efectuate asupra datelor tabelelor cu
care sunt asociaţi. Crearea explicită se face astfel:
CREATE INDEX idx_nume ON angajati(nume);
23 24
23 24
12
Aspecte privind indexarea în bazele de
date Tipuri de indecşi
Actualizarea unui index se face prin comanda SQL ALTER INDEX. Tip index Descriere
25 26
13
Grupări de tabele (clustere) Grupări de tabele (clustere)
❑ Cheia unui cluster este definită ca fiind coloana sau coloanele
pe care tabelele grupate le au în comun.
❑ Clusterele sunt metode opţionale de memorare a datelor
unor tabele. ❑ Cheia unui cluster nu trebuie confundată cu cheile primare ale
❑ Clusterul este o regrupare fizică a două sau mai multe tabele, tabelelor grupate. Valorile cheii clusterului sunt stocate o
relativ la una sau mai multe coloane, cu scopul creşterii singură dată în schemă, reducându-se astfel spaţiul de stocare
performanţelor. necesar şi procesările suplimentare.
❑ Coloanele de legătură ale tabelelor într-un cluster se numesc ❑ Clusterul este un mecanism transparent aplicaţiilor care
chei ale clusterului. utilizează tabelele acestuia. Datele din tabele sunt manipulate
❑ Tabelele dintr-un cluster sunt stocate împreună pentru a ca şi când acestea ar fi stocate într-o tabelă normală, însă în
reduce numărul de operaţii de I/O cu discul. momentul interogării se va observa o creştere semnificativă a
performanţelor.
27 28
27 28
14
Grupări de tabele (clustere) Grupări de tabele (clustere)
1) Crearea clusterului
Pentru crearea clusterului se foloseşte comanda SQL CREATE CLUSTER în
Pentru a crea o tabelă într-un cluster se parcurg în mod care trebuie specificate coloana sau grupul de coloane după care sunt
obligatoriu următorii paşi: grupate tabelele.
29 30
29 30
15
Grupări de tabele (clustere) Grupări de tabele (clustere)
2) Adăugarea tabelelor la cluster 3) Crearea indexului de cluster
După crearea clusterului, adăugarea tabelelor la cluster se face folosind Pentru coloanele cheie ale clusterului trebuie creat în mod explicit un
comanda CREATE TABLE cu clauza CLUSTER: index de cluster (index de grup). Indexul este utilizat pentru localizarea
CREATE TABLE nume_cluster univocă a liniilor.
(nume_coloana tip_data [, nume_coloana Indexul de cluster trebuie creat înaintea efectuării oricărei operaţii de
tip_data]) interogare sau actualizare asupra clusterului.
CLUSTER nume_cluster Pentru crearea unui index de cluster se foloseşte comanda SQL CREATE
INDEX cu opţiunea ON CLUSTER:
Datorită faptului că tabelele clusterului folosesc alocarea de spaţiu a
acestuia, la folosirea comenzii CREATE TABLE cu opţiunea CLUSTER nu CREATE INDEX nume_index ON CLUSTER
trebuie specificaţi alţi parametri de stocare. nume_cluster;
Nu se poate asocia un cluster unei tabele care există deja. Dacă se
doreşte totuşi acest lucru, se creează o nouă tabelă care va fi inclusă în
cluster şi care va conţine înregistrările tabelei existente (folosind
optiunea AS SELECT).
31 32
31 32
16
Exemplificare SQL-Oracle
Crearea clusterului sal_dept, cu indicarea grupării după coloanele cod_dept şi cod_tara Grupări de tabele (clustere)
CREATE CLUSTER sal_dept
(cod_dept NUMBER(10),
cod_tara NUMBER(10)); Comanda ALTER CLUSTER poate fi folosită pentru a modifica parametrii
Adăugarea tabelelor la clusterul sal_dept de stocare ai clusterului.
CREATE TABLE departamente CREATE TABLE salariati Pentru distrugerea unui cluster se foloseşte comanda SQL DROP
(cod_dept NUMBER(10), (cod_salariat NUMBER(10) PRIMARY KEY, CLUSTER.
cod_tara NUMBER(10), nume VARCHAR2(10) NOT NULL,
nume_dept VARCHAR2(10), prenume VARCHAR2(10), Pentru a şterge un cluster care conţine tabele se foloseşte clauza
PRIMARY KEY(cod_dept, data_nastere DATE, opţională INCLUDING TABLES:
cod_tara) salariu NUMBER(10), DROP CLUSTER sal_dept
) cod_dept NUMBER(10),
CLUSTER sal_dept(cod_dept, cod_tara NUMBER(10), INCLUDING TABLES;
cod_tara); FOREIGN KEY(cod_dept, cod_tara)
REFERENCES Dacă există tabele din afara clusterului care conţin restricţii de
departament(cod_dept,cod_tara)) integritate care se referă la chei din tabelele clusterului, acestea trebuie
CLUSTER sal_dept(cod_dept,cod_tara); de asemenea eliminate. Pentru acest lucru se foloseşte clauza opţională
CASCADE CONSTRAINTS;
Crearea indexului pentru clusterul sal_dept
DROP CLUSTER sal_dept
CREATE INDEX sal_dept_ind
ON CLUSTER sal_dept; 33
INCLUDING TABLES CASCADE CONSTRAINTS; 34
33 34
17
ACADEMIA DE STUDII ECONOMICE BUCUREŞTI
FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ
minimizarea costului de
execuţie
1
Mecanisme de optimizare a cererilor de
regăsire Strategii de optimizare a cererilor de
Transformări relaţionale
regăsire în SGBD ORACLE
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ă: SGBD Oracle dispune de un instrument de analiză a timpilor şi a
selecţia înaintea proiecţiei
selecţia înaintea joncţiunii algoritmilor de execuţie a cererilor – Explain Plan;
proiecţia înaintea joncţiunii
specifice: depind de SGBDR şi ţin de memorarea datelor, de modul de accesare, precum şi de În momentul în care se execută o cerere de regăsire, în funcţie de anumiţi
ordonarea expresiilor algebrice
factori, Oracle aplică un anumit algoritm, de regulă optimizat. Explain Plan
indică secvenţa de paşi pe care optimizatorul Oracle i-a ales pentru
execuţia cererii SQL;
Optimizarea alocării Optimizarea accesului
prin definiţie, bazele de date prin definiţie, căutarea datelor Principiul de lucru are la bază costul execuţiei acelei cereri aplicând pe rând
sunt mari consumatoare de într-o bază de date este o
spaţiu, atât în memoria internă, activitate consumatoare de
diverşi algoritmi de optimizare în funcţie de statisticile obţinute din
cât şi în cea externă timp, din cauza volumului mare dicţionarul metadatelor referitoare la: operatorii relaţionali, numărul de
pentru folosirea cât mai de date stocat şi a complexităţii
eficientă a acestora, SGBDR Mecanisme de SGBDR prezintă cele mai înregistrări din fiecare tabelă implicată, indecşi, clustere şi partiţii
folosesc diverse mecanisme:
reutilizarea, realocarea, zone de
optimizare a cererilor bune performanţe din punctul disponibile pentru acele tabele implicate în cerere;
de vedere al regăsirii datelor,
memorie cu destinaţie specială, datorită limbajelor relaţionale
comprimarea datelor, alocarea implementate – SQL Sunt luaţi în calcul şi alţi factori precum căile de acces la date, ordinea
dinamică joncţiunilor, resursele fizice disponibile (CPU, memorie, operaţii de I/O).
3 4
2
Strategii de optimizare a cererilor de regăsire. Strategii de optimizare a cererilor de regăsire.
Recomandări. Recomandări.
1.Se indexează coloanele cel mai des folosite în clauza WHERE, pentru acces direct
la înregistrările care dau elemente ale rezultatului
CREATE INDEX IDX_DESCRIERE ON T_PRODUSE (DESCRIERE);
SELECT *
FROM T_PRODUSE
WHERE DESCRIERE = 'Toner';
După:
Înainte:
5 6
3
Strategii de optimizare a cererilor de regăsire. Strategii de optimizare a cererilor de regăsire.
Recomandări. Recomandări.
2. Se evită folosirea funcţiilor UPPER sau LOWER asupra coloanelor indexate CREATE INDEX IDX_DESCRIERE_UP
ON T_PRODUSE (UPPER(DESCRIERE));
SELECT *
FROM T_PRODUSE
WHERE UPPER(DESCRIERE) = 'TONER'; După:
Înainte:
7 8
4
Strategii de optimizare a cererilor de regăsire. Strategii de optimizare a cererilor de regăsire.
Recomandări. Recomandări.
3. Se evită folosirea funcţiei SUBSTR asupra coloanelor indexate SELECT *
FROM T_PRODUSE
SELECT *
FROM T_PRODUSE WHERE DESCRIERE like 'To%';
WHERE SUBSTR(DESCRIERE,1,2) = 'To'; După:
Înainte:
9 10
5
Strategii de optimizare a cererilor de regăsire. Strategii de optimizare a cererilor de regăsire.
Recomandări. Recomandări.
4. Se recomandă folosirea clauzei EXISTS în loc de DISTINCT SELECT C.ID_PRODUS, C.ID_COMANDA
FROM T_COMENZI_DESFACERE C
SELECT DISTINCT P.ID_PRODUS, C.ID_COMANDA
WHERE EXISTS (SELECT 'x'
FROM T_PRODUSE P, T_COMENZI_DESFACERE C FROM T_PRODUSE P
WHERE P.ID_PRODUS=C.ID_PRODUS; where P.ID_PRODUS=C.ID_PRODUS);
Înainte: După:
6
Strategii de optimizare a cererilor de regăsire. Strategii de optimizare a cererilor de regăsire.
Recomandări. Recomandări.
5. Se evită plasarea în clauza HAVING a condiţiilor care nu includ funcţii de grup După:
SELECT ID_COMANDA, COUNT(ID_PRODUS)
Înainte: FROM T_COMENZI_DESFACERE
SELECT ID_COMANDA, COUNT(ID_PRODUS) WHERE ID_COMANDA IN (66,77)
FROM T_COMENZI_DESFACERE GROUP BY ID_COMANDA;
GROUP BY ID_COMANDA
HAVING ID_COMANDA IN (66,77);
7
Strategii de optimizare a cererilor de regăsire. Strategii de optimizare a cererilor de regăsire.
Recomandări. Recomandări.
6. Se folosesc grupuri de tabele (clustere) astfel încât tabelele care sunt accesate CREATE CLUSTER T_CLU (ID_PRODUS NUMBER);
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 CREATE TABLE T_PRODUSEC CREATE TABLE T_COMENZI_DESFACEREC
performanţele ( (
ID_PRODUS NUMBER not null, TIP VARCHAR2(25) not null,
Înainte: ID_ORGANIZATIE NUMBER not null, VERIFICAT VARCHAR2(25),
DESCRIERE VARCHAR2(240), STATUS VARCHAR2(25),
SELECT C.ID_COMANDA, C.STATUS, P.ID_PRODUS ID_CLIENT NUMBER,
CATEGORIE VARCHAR2(333),
FROM T_PRODUSE P, T_COMENZI_DESFACERE C GRUPA VARCHAR2(47) ID_COMANDA NUMBER not null,
WHERE P.ID_PRODUS=C.ID_PRODUS; ) DATA DATE,
CLUSTER T_CLU(ID_PRODUS); ID_RAND_COMANDA NUMBER not null,
ID_ORGANIZATIE NUMBER,
ID_PRODUS NUMBER,
CANTITATE_COMANDATA NUMBER,
CANTITATE_LIVRATA NUMBER,
PRET NUMBER
)
CLUSTER T_CLU(ID_PRODUS);
8
Strategii de optimizare a cererilor de regăsire. Strategii de optimizare a cererilor de regăsire.
Recomandări. Recomandări.
SAU După:
CREATE CLUSTER T_CLU (ID_PRODUS NUMBER); SELECT C.ID_COMANDA, C.STATUS, P.ID_PRODUS
CREATE INDEX IDX_CLU ON CLUSTER T_CLU; FROM T_PRODUSEC P, T_COMENZI_DESFACEREC C
WHERE P.ID_PRODUS=C.ID_PRODUS;
CREATE TABLE T_PRODUSEC CREATE TABLE T_COMENZI_DESFACEREC
CLUSTER T_CLU (ID_PRODUS) CLUSTER T_CLU (ID_PRODUS)
AS SELECT * FROM T_PRODUSE; AS SELECT * FROM T_COMENZI_DESFACERE;
17 18
9
Strategii de optimizare a cererilor de regăsire. Strategii de optimizare a cererilor de regăsire.
Recomandări. Recomandări.
7. Se construiesc indecşi asupra funcţiilor ataşate coloanelor (function-based
indexes) CREATE INDEX IDX_REST ON
SELECT C.ID_COMANDA, P.ID_PRODUS, T_COMENZI_DESFACERE (CANTITATE_COMANDATA-CANTITATE_LIVRATA);
C.CANTITATE_COMANDATA-C.CANTITATE_LIVRATA "REST"
FROM T_COMENZI_DESFACERE C, T_PRODUSE P
După:
WHERE P.ID_PRODUS=C.ID_PRODUS
AND C.CANTITATE_COMANDATA - C.CANTITATE_LIVRATA > 0;
Înainte:
19
10
Strategii de optimizare a cererilor de regăsire. Strategii de optimizare a cererilor de regăsire.
Recomandări. Recomandări.
8. Se indexează coloanele ale căror valori sunt sortate des
CREATE INDEX IDX_CATEG ON T_PRODUSE (CATEGORIE);
SELECT *
FROM T_PRODUSE După:
ORDER BY CATEGORIE DESC;
Înainte:
21 22
11
Strategii de optimizare a cererilor de regăsire. Strategii de optimizare a cererilor de regăsire.
Recomandări. Recomandări.
9. În funcţia COUNT se folosesc ROWID sau coloane indexate După:
SELECT COUNT(id_produs)
Înainte: FROM T_PRODUSE;
SELECT COUNT(CATEGORIE) sau
FROM T_PRODUSE; SELECT COUNT(ROWID)
FROM T_PRODUSE;
23 24
12
Strategii de optimizare a cererilor de regăsire. Strategii de optimizare a cererilor de regăsire.
Recomandări. Recomandări.
10. Se partiţionează tabelele de mari dimensiuni în segmente mai mici numite
create table T_COMENZI_DESFACERE_P
partiţii, astfel încât interogările să le acceseze individual şi nu întreaga tabelă (
din care au provenit TIP VARCHAR2(25) not null,
VERIFICAT VARCHAR2(25),
Înainte: STATUS VARCHAR2(25),
SELECT C.ID_COMANDA, C.STATUS, P.ID_PRODUS ID_CLIENT NUMBER,
FROM T_PRODUSE P, T_COMENZI_DESFACERE C ID_COMANDA NUMBER not null,
DATA DATE,
WHERE P.ID_PRODUS=C.ID_PRODUS ID_RAND_COMANDA NUMBER not null,
AND C.CANTITATE_COMANDATA = 2; ID_ORGANIZATIE NUMBER,
ID_PRODUS NUMBER,
CANTITATE_COMANDATA NUMBER,
CANTITATE_LIVRATA NUMBER,
PRET NUMBER
)
PARTITION BY RANGE (CANTITATE_COMANDATA)
(PARTITION CANT_1 VALUES LESS THAN (100) ,
PARTITION CANT_2 VALUES LESS THAN (1000),
PARTITION CANT_3 VALUES LESS THAN (10000));
26
13
Strategii de optimizare a cererilor de regăsire. Strategii de optimizare a cererilor de regăsire.
Recomandări. Recomandări.
27 28
14
Strategii de optimizare a cererilor de regăsire
Strategii de optimizare a cererilor de regăsire în SGBD ORACLE
în SGBD ORACLE Exemplul următor prezintă modalitatea de joncţiune HASH dintre tabelele CLIENTI şi
COMENZI_DESFACERE. În acest caz tabela COMENZI_DESFACERE cu 86 de înregistrări este
utilizată pe post de tabelă hash în memorie, iar tabela CLIENTI având 262 de înregistrări va fi
Algoritmul Hash joins scanată
◦ este utilizat pentru cererile în care sunt implicate tabele cu foarte multe SELECT SELECT /*+ USE_HASH(cd c) */
c.id_client, c.id_client,
înregistrări şi asupra cărora se aplică o joncţiune de egalitate;
c.nume_client, c.nume_client,
◦ algoritmul constă în alegerea tabelei cu dimensiunea mai mică şi construirea cd.data, cd.data,
unei tabele hash în memorie pe baza condiţiei de joncţiune; cd.cantitate_comandata cd.cantitate_comandata
FROM t_clienti c, FROM t_clienti c,
◦ apoi este scanată şi cealaltă tabelă pentru regăsirea de înregistrări care
t_comenzi_desfacere cd t_comenzi_desfacere cd
corespund condiţiei de legătură; WHERE cd.id_produs=454 WHERE cd.id_produs=454
◦ acest algoritm este aplicat în cazul în care tabela mai mică încape în memoria AND c.id_client=cd.id_client; AND c.id_client=cd.id_client;
internă, astfel minimizându-se operaţiile de acces pe disc;
◦ costul execuţiei se rezumă la timpul de parcurgere a tabelei de dimensiune mare
în căutarea înregistrărilor de joncţiune.
29 30
15
Strategii de optimizare a cererilor de regăsire Strategii de optimizare a cererilor de regăsire
în SGBD ORACLE în SGBD ORACLE
Exemplul următor prezintă modalitatea de joncţiune NESTED LOOP dintre tabelele CLIENTI şi
COMENZI_DESFACERE
SELECT SELECT /*+ USE_NL (cd c)*/
Algoritmul Nested loop joins c.id_client, c.id_client,
◦ este recomandat pentru joncţiuni aplicate între subseturi relativ reduse de c.nume_client, c.nume_client,
cd.data, cd.data,
date; cd.cantitate_comandata cd.cantitate_comandata
◦ condiţia de joncţiune reprezintă un mod eficient de parcurgere a tabelelor; FROM t_clienti c, FROM t_clienti c,
◦ opţiunea de utilizare a algoritmului se specifică prin directiva USE_NL t_comenzi_desfacere cd t_comenzi_desfacere cd
WHERE cd.id_produs=454 WHERE cd.id_produs=454
AND c.id_client=cd.id_client; AND c.id_client=cd.id_client;
31 32
16
Strategii de optimizare a cererilor de regăsire Strategii de optimizare a cererilor de regăsire
în SGBD ORACLE în SGBD ORACLE
În exemplul următor se indexează tabelele CLIENTI şi COMENZI_DESFACERE
CREATE INDEX clienti_cust_id_idx ON t_clienti(id_client);
Algoritmul Sort merge joins CREATE INDEX cd_c_id_idx ON t_comenzi_desfacere(id_client);
CREATE INDEX cd_ord_date_idx ON t_comenzi_desfacere(data);
◦ 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 Apoi este aplicată joncţiunea pe cele două tabele cu directiva USE_MERGE
la scăderea costurilor de execuţie faţă de rezultatele similare obţinute prin aplicarea SELECT SELECT /*+ USE_MERGE (cd c)*/
algoritmului Hash joins; c.id_client, c.id_client,
c.nume_client, c.nume_client,
◦ Sort merge joins este recomandat şi pentru cazurile în care se realizează o joncţiune cu o cd.data, cd.data,
condiţie de inegalitate sau pentru seturi foarte mari de date; cd.cantitate_comandata cd.cantitate_comandata
FROM t_clienti c, FROM t_clienti c,
◦ principiul de execuţie nu este ghidat de alegerea uneia dintre tabele, ci presupune:
t_comenzi_desfacere cd t_comenzi_desfacere cd
◦ se realizează o ordonare a datelor din ambele tabele după cheia (condiţia) de căutare. Dacă deja a WHERE cd.id_produs=454 WHERE cd.id_produs=454
fost aplicată o sortare corespunzătoare, acest pas nu se mai aplică; AND c.id_client=cd.id_client; AND c.id_client=cd.id_client;
◦ 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 Strategii de optimizare a cererilor de regăsire
în SGBD ORACLE în SGBD ORACLE
Nested Loop Outer Joins – este Sort Merge Outer Joins – este Hash Join Outer Joins – este
Algoritmul Cartesian Joins utilizat în cazul joncţiunilor aplicat când nu se poate alege o aplicat în principal pentru volume
externe iar principiul de lucru este tabelă pe post de pivot sau mari de date astfel încât metoda
◦ se aplică în cazul joncţiunilor de tip produs cartezian, atunci când între cele două următorul: este aleasă una dintre condiţiile impuse datelor duc la o Hash să fie eficientă şi dacă nu
tabele implicate nu se poate realiza o legătură, iar rezultatul cererii constă în tabele pe post de pivot, iar creştere a costurilor obţinute prin există posibilitatea utilizării unei
combinaţia fiecărei înregistrări din prima tabelă cu fiecare înregistrare din cea înregistrările celei de-a doua aplicarea algoritmului Hash sau tabele pe post de pivot
de-a doua. tabele sunt parcurse într-un ciclu când deja înregistrările sunt
repetitiv în funcţie de condiţia de ordonate
legătură
Algoritmii Outer Joins SELECT /*+ USE_NL(c cd) */ SELECT /*+ USE_MERGE(c cd) SELECT /*+ USE_HASH(c cd)
◦ sunt aplicaţi în cazul joncţiunilor externe şi sunt de patru tipuri: Nested Loop c.id_client, */ */
c.nume_client, c.id_client, c.id_client,
Outer Joins, Hash Join Outer Joins, Sort Merge Outer Joins, Full Outer Joins. 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;
35 36
18
Strategii de optimizare a cererilor de regăsire
în SGBD ORACLE CURSUL 13...
37
19
ACADEMIA DE STUDII ECONOMICE BUCUREŞTI
FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ
1 2
1
Integritatea datelor Integritatea datelor
INTEGRITATEA SEMANTICĂ
Se referă la corectitudinea şi coerenţa datelor, dar şi la
❑Se referă la prevenirea introducerii de date incorecte şi a
manipularea acestora astfel încât să se respecte restricţiile de realizării de prelucrări eronate
integritate ale modelului de date implementat. ❑Se asigură prin restricţii de integritate:
◦ implicite: asigurate automat de SGBD
◦ explicite: asigurate prin program
❑În Oracle:
◦ resticţiile implicite: PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT
NULL, CHECK
◦ restricţiile explicite: declanşatori (triggeri)
3 4
3 4
2
Integritatea datelor Integritatea datelor
CONTROLUL CONCURENŢEI LA DATE CONTROLUL CONCURENŢEI LA DATE (cont.)
❑Se referă la garantarea corectitudinii datelor în cazul prelucrării ❑Rezultatul execuţiei unei tranzacţii poate fi:
tranzacţiilor ◦ succes: dacă operaţiile constituente ale tranzacţiei au fost realizate
şi validate fără probleme, iar baza de de date se regăseşte într-o
❑Tranzacţia desemnează o secvenţă de instrucţiuni de nouă stare coerentă;
manipulare a datelor (în special de actualizare), care formează un ◦ abandon: dacă operaţiile constituente ale tranzacţiei au fost
tot unitar şi care se execută în totalitate sau deloc. anulate, iar baza de date revine la starea coerentă de dinainte de
execuţia tranzacţiei curente.
❑Există tranzacţii:
❑În Oracle, comenzile SQL pentru tratarea tranzacţiilor sunt:
◦ implicite (gestionate de sistem)
◦ COMMIT
◦ explicite (gestionate de programator, prin specificarea limitelor
◦ ROLLBACK
unei tranzacţii în cadrul unei aplicaţii)
◦ SAVEPOINT
5 6
5 6
3
Integritatea datelor Integritatea datelor
CONTROLUL CONCURENŢEI LA DATE (cont.) CONTROLUL CONCURENŢEI LA DATE (cont.)
Caracteristicile unei tranzacţii – ACID În momentul în care mai multe tranzacţii accesează aceleaşi date,
în mod concurent, apare mecanismul de blocare.
❑ Atomicitatea: evidenţiază caracterul atomic al tranzacţiilor, acestea
fiind executate pe principiul totul sau nimic. În cazul accesului concurent, SGBDR acordă priorităţi tranzacţiilor
❑ Consistenţa (coerenţa): presupune execuţia tranzacţiilor cu implicate. Tranzacţia cu prioritatea cea mai mare are acces la
respectarea restricţiilor de integritate. date, iar acestea sunt blocate pentru celelate tranzacţii, care
aşteaptă finalizarea prelucrărilor curente.
❑ Izolarea: presupune execuţia tranzacţiilor independent unele de
altele. Interblocare: dacă tranzacţia T1 utilizează datele D1, iar
tranzacţia T2 datele D2, iar T1 are nevoie de D2 şi T2 de D1 (au
❑ Durabilitatea (persistenţa): evidenţiază caracterul persistent al nevoie de aceleaşi date, deja ocupate), atunci conflictul se
tranzacţiilor salvate. rezolvă tot prin acordarea de priorităţi.
7 8
7 8
4
Integritatea datelor Securitatea datelor
9 10
9 10
5
Securitatea datelor Securitatea datelor
AUTORIZAREA ŞI CONTROLUL ACCESULUI LA DATE
TABELE VIRTUALE
❑Constă în identificarea utilizatorilor şi restricţionarea accesului
acestora la anumite date, pentru diferite prelucrări, în funcţie de ❑Construcţii logice reprezentând cereri de regăsire memorate în
categoria de utilizatori. dicţionarul BD (comenzi SELECT stocate).
❑În acest scop, administratorul BD construieşte profile de ❑La apelul tabelei virtuale, interogarea este executată şi se vor
utilizatori, precizând categoria, grupa, numele, parola, drepturile accesa datele doar pe o parte a bazei de date, la care utilizatorii
acordate. au acces.
❑În Oracle: ❑În Oracle:
◦ CREATE PROFILE...
◦ CREATE VIEW...
◦ CREATE ROLE...
◦ odată creată, o tabelă virtuală se apelează prin comenzi SQL, ca
◦ CREATE USER... PROFILE...
şi orice altă tabelă relaţională
◦ GRANT rol TO user
◦ GRANT privilegii TO user
11 12
11 12
6
Securitatea datelor Securitatea datelor
PROCEDURI SPECIALE CRIPTAREA DATELOR
❑ Proceduri stocate în baza de date, oferite de SGBDR sau ❑Operaţie de codificare a datelor, în vederea stocării sau
create de programator. transmiterii lor codat, nu în clar.
❑ În Oracle se pot scrie proceduri stocate în limbajul PL/SQL ❑În acest sens, se vor utiliza algoritmi de criptare, o cheie de
pentru a realiza diferite acţiuni, pe date restricţionate. acces la aceştia şi un algoritm de decriptare.
13 14
13 14
7
Evoluţia organizării datelor Baze de date NoSQL
Proiectate să rezolve probleme de scalabilitate și
performanță pentru soluții informatice distribuite,
integrate în cloud
Folosesc un mecanism pentru stocarea și accesarea
Depozite
datelor diferit de cel implementat în modelul
de date
Baze de
date NoSQL
relațional, care se bazează pe structuri tabelare
(1990)
Baze de date (2010+)
(1970)
Fișiere de
date (1960)
18
17 18
9
Caracteristici ale bazelor de date
NoSQL Limitări ale bazelor de date NoSQL
❑ Permit lucrul eficient cu date semistructurate și ❑ Nu există o standardizare
nestructurate
❑ Nu se asigură o protecţie performantă a datelor
❑ Folosesc mai multe limbaje de interogare diferite
❑ Nu se asigură consistenţa datelor
(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
19 20
10
NoSQL vs. SQL Stocarea datelor în bazele de date NoSQL
❑ stocarea bazată pe grup de coloane
SQL NoSQL
❑ stocarea bazată pe documente
Stocare date Conform modelului Stocare folosind formate
relațional, în tabele de non-relaționale specifice ❑ stocarea bazată pe structuri de tip chei-valoare
date
Date stocate Structurate Semi-structurate, ❑ stocarea datelor bazată pe graf
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
21 22
11
Tipuri de baze de date NoSQL Evoluție BD - 2019
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 24
23 24
12
Evoluție BD - 2019 Baze de date in-memory
Se bazează în mod primar pe memoria internă pentru
stocarea datelor, în contrast cu sistemele clasice care
utilizează mecanisme de stocare pe disc.
25 26
25 26
13
Caracteristici Domenii de aplicabilitate
❑ Rapiditate, accesul la memorie fiind mai rapid decât ❑ Aplicații pentru care timpul de răspuns este critic:
accesul la disc ◦ Telecomunicații
◦ Industria bancară
❑ Algoritmii de optimizare internă sunt mai simpli
◦ Rețele mobile de publicitate
❑ Execută mai puține instrucțiuni ale procesorului. ❑ Analiza de date – odată cu extinderea pe scară largă a
procesoarelor multi-core
❑ Accesarea datelor în memorie elimină timpul de căutare
la interogarea datelor, ceea ce oferă performanțe mai
rapide și mai previzibile decât varianta de stocare pe disc.
27 28
27 28
14
Limitări CURSUL 14...
❑ Volatilitatea memoriei RAM pe care se realizează Recapitulare
stocarea datelor
29
29 30
15