Documente Academic
Documente Profesional
Documente Cultură
şi limbajul SQL
1
CUPRINS
INTRODUCERE..................................................................................................................................3
CAPITOLUL 1. MODELE DE DESCRIERE A DATELOR...................................................................5
1.1. MODELARE E-R (ENTITY-RELATIONSHIP)......................................................................................5
1.2. REPREZENTARE GRAFICĂ - DIAGRAME E-R.................................................................................... 8
1.3. RESTRICTII STRUCTURALE.........................................................................................................11
1.4. CHEI.................................................................................................................................... 14
CAPITOLUL 2. ALGEBRA RELAŢIONALĂ...................................................................................16
2.1 STRUCTURA RELAŢIONALA A DATELOR.........................................................................................16
2.2. ALGEBRA RELAŢIONALĂ...........................................................................................................19
CAPITOLUL 3. NORMALIZAREA DATELOR...............................................................................25
3.2. DEPENDENŢE FUNCŢIONALE..................................................................................................... 29
3.3. FORME NORMALE.................................................................................................................. 33
CONCLUZII...................................................................................................................................38
CAPITOLUL 4. PROIECTAREA A BAZELOR DE DATE RELAŢIONALE...........................................40
4.1. METODOLOGIA PROIECTĂRII BAZELOR DE DATE............................................................................40
4.2. PREZENTAREA METODOLOGIEI..................................................................................................41
4.3. CREAREA MODELULUI LOGIC.....................................................................................................43
4.4. PROIECTAREA LOGICĂ A BAZEI DE DATE - EXEMPLU.......................................................................51
CAPITOLUL 5. SECURITATE ŞI INTEGRITATE............................................................................65
5.1. INTEGRITATE......................................................................................................................... 65
5.2. SECURITATE.......................................................................................................................... 68
CAPITOL 6. LIMBAJUL SQL......................................................................................................72
6.1. TIPURILE DE DATE SQL........................................................................................................... 73
6.2. INSTRUCŢIUNI PENTRU DEFINIREA DATELOR.................................................................................74
6.3. INSTRUCŢIUNI PENTRU MANIPULAREA DATELOR...........................................................................74
6.4. INSTRUCŢIUNE SELECT...........................................................................................................76
6.5. ORDONAREA TUPLELOR (CLAUZA ORDER BY)............................................................................80
6.6. GRUPAREA REZULTATELOR (CLAUZA GROUP BY)........................................................................82
6.7. INTEROGARI PE MAI MULTE TABELE...........................................................................................84
6.8. SUBINTEROGARI.....................................................................................................................86
6.9. OPERATORII ANY ŞI ALL.........................................................................................................90
6.10. OPERATORUL EXISTS...........................................................................................................93
BIBLIOGRAFIE........................................................................................................................94
2
3
INTRODUCERE
În primii ani, calculatoarele erau utilizate mai ales pentru a duce la bun
sfârşit calcule laborioase în care nu erau implicate cantităţi prea mari de date, aşa-
numitele calcule ştiinţifice. Odată cu apariţia limbajelor de nivel înalt şi a
posibilităţii stocării de mari cantităţi de informaţie pe suport magnetic adresabil
(memorie externa) s-a pus şi problema eficientizării prelucrării acestora. De data
aceasta nu calculele creşteau costul în timp al prelucrărilor ci manipularea datelor,
respectiv regăsirea, actualizarea, etc. S-a constatat ca un factor important al
creşterii eficienţei prelucrărilor este modul de organizare al informaţiilor. De aici şi
până la a gândi sisteme unitare de reprezentare şi manipulare a masivelor de date
n-a mai fost decât un pas.
Prima variantă de prelucrare a cantităţilor mari de informaţie s-a bazat pe
organizarea datelor sub forma înregistrărilor în fişiere tradiţionale pe suport
adresabil. În această variantă se elaborau programe de aplicaţie care defineau şi
manipulau propriile date şi aveau în general ca scop elaborarea de rapoarte pentru
diverşi beneficiari. Aceste programe au avut menirea de a înlocui prelucrarea
sistemelor de fişiere manuale care mai funcţionează şi astăzi în unele locuri cum ar
fi cabinetele medicale. Aşadar prelucrările oferite de un sistem tradiţional bazat pe
fişiere copiau în mare masură metodele manuale de prelucrare. Evident că puterea
de calcul şi memorare caracteristică sitemelor de calcul au făcut ca gama
prelucrărilor să crească simţitor, la aceasta adăugându-se viteza şi siguranţa
prelucrărilor.
Cu toate ca la momentul respectiv abordarea tradiţională bazată pe fişiere a
fost un evident progres, putem să amintim aici şi o serie de limitări ale acestui
sistem de prelucrare a datelor:
Separarea şi izolarea datelor
Duplicarea datelor
Dependenţa datelor
4
Incompatibilitatea fişierelor
Interogări fixe / proliferarea aplicaţiilor.
Evoluţia metodelor şi tehnicilor de organizare a datelor a fost determinată de
necesitatea de a avea un acces cât mai rapid şi mai uşor la un volum din ce în ce
mai mare de informaţii precum şi de perfecţionarea echipamentelor de culegere,
memorare, transmitere şi prelucrare a datelor.
Conceptul de bază de date s-a definit în 1969 cu ocazia prezentării primului
proiect de raport CODASYL (Raportul final s-a prezentat în 1971). Ideea
principală în organizarea datelor se baza pe existenţa a trei componente de bază:
schema de reţea - care reprezenta organizarea logica a întregii baze de
date;
subschema - care reprezenta o parte a bazei de date aşa cum e vazută
de utilizator sau de programele de aplicaţie;
un limbaj de gestionare a datelor - care definea caracteristicile datelor,
structura lor şi care manipula datele.
Pentru standardizare, s-au propus trei limbaje:
un limbaj de definire a datelor (LDD) la nivel de schemă;
un limbaj ător la nivel de subschemă;
un limbaj de manipulare a datelor (LMD).
5
Capitolul 1. Modele de descriere a datelor
Generalitati
Un model de date cuprinde trei parti:
1. o parte referitoare la structura, care consta intr-un set de reguli ce impun
modul de alcatuire a bazei de date;
2. o parte referitoare la manipularea datelor, care defineste tipul de operatii
care sunt permise asupra datelor. Sunt incluse aici operatiile care sunt utilizate
pentru a actualiza sau a regasi datele in baza de date precum şi operatiile pentru
schimbarea structurii bazei de date;
3. o parte referitoare la integritatea datelor, parte care cuprinde reguli de
integritate care asigura acuratetea datelor.
Modele de date se pot realiza pentru fiecare nivel de abstractizare. Astfel
putem vorbi de:
model extern de date (care reprezinta asa-numitul univers al
discursului, adica punctul de vedere al utilizatorului);
model de date conceptual (care reprezinta structura logica a bazei de
date, independenta de sistemul de gestiune ales);
model de date intern (care reprezinta schema conceptuala intr-un mod
in care poate fi perceputa de SGBD).
Modele de date bazate pe obiecte utilizeaza concepte: entităţi, atribute,
relaţii.
6
reprezentare a bazelor de date relaţionale şi de aceea este un instrument util in
proiectarea acestora.
Concepte de baza
Conceptele primare ale modelului E-R includ : tip de entitate (multime-
entitate), tip de relaţie (multime-relatie), atribute.
Numim entitate un obiect sau un concept ce se poate identifica in mod unic.
Notiunea de entitate este un concept de baza in cadrul modelului E-R. Ea
reprezinta 'obiecte' concrete (cu existenta fizica) sau abstracte (cu existenta
conceptuala).
Exemplu: Popescu Ion, posesor al buletinului de identitate seria ABC,
numarul: 444555 este o entitate deoarece identifica in mod unic o persoana in acest
univers. O entitate care reprezinta un obiect ceva mai abstract poate fi, de exemplu,
un cont la banca identificabil in mod unic prin numarul sau şi numele bancii.
Numim tip de entitate sau multime-entitate un set de entitati de acelasi tip.
Exemplu: Multimea tuturor persoanelor care sunt studenti ai Facultatii de
Stiinte pot defini multimea-entitate sau tipul de entitate student.
Tipul de entitate reprezintă o multime de 'obiecte' ce apartin lumii reale şi
care sunt descrise de aceleasi proprietati.
Orice obiect care apartine unui tip de entitate şi care este identificabil in mod
unic este numit simplu entitate. (se mai intalnesc denumirile: aparitia unei entitati
sau instanta unei entitati). Un tip de entitate conţine mai multe entităţi. O baza de
date este o colectie de tipuri de entitate din care fiecare contine un numar
neprecizat de entitati de acelasi tip.
Tipurile de entitate nu sunt neaparat disjuncte. Aceasta inseamna ca pot
exista entitati care sa apartina mai multor tipuri de entitate.
Exemplu: Se pot defini urmatoarele tipuri de entitate: profesor,
corespunzator tuturor cadrelor didactice ale Facultatii de Stiinte şi student,
corespunzator tuturor studentilor aceleiasi facultati. Se observa usor ca pot exista
studenti care sunt in acelasi timp şi cadre didactice (studenti la master care sunt
preparatori sau asistenti).
7
Un tip de entitate se identifică printr-un nume şi o listă de proprietati. O bază
de date conţine în general mai multe tipuri de entităţi. Fiecare tip de entitate are
propriul set de proprietati.
Numim atribute proprietaţile atasate unui tip de entitate.
Exemplu: entitatea student poate fi descrisa de atributele: nume_student,
prenume_student, data_nasterii, sex, adresa, telefon, numar_matricol, grupa.
Prin domeniul atributului intelegem multimea valorilor care pot fi atribuite
unui atribut simplu.
Atributele unei entitati contin valorile care descriu fiecare entitate şi cu
ajutorul carora fiecare entitate se poate identifica in mod unic. Aceste valori
reprezinta cea mai mare parte a datelor memorate intr-o baza de date.
Domeniul unui atribut nu se poate defini intotdeauna foarte exact. De
exemplu, atributul nume_student trebuie să fie un şir de caractere dar poate lua ca
valori doar un nume de familie existent. Unele domenii se pot descompune în mai
multe subdomenii. De exemplu data_naşterii se poate descompune in
subdomeniile: an, lună, zi.
In general putem considera ca fiecare entitate este reprezentabila cu ajutorul
unei multimi de perechi de forma (nume_atribut, valoare_atribut), cate o pereche
pentru fiecare atribut atasat tipului de entitate corespunzator.
Exemplu: o entitate a tipului de entitate student poate fi reprezentata de
multimea: {(nume_student, Popescu), (prenume_student, Ion), (data_nasterii,
15.11.1991), (sex, masculin), (adresa, B-dul Moscova, 12, Chisinau, cod 2068),
(telefon, (022)444555), (numar_matricol, 31455), (grupa, 7211)}
Atributele se pot clasifica în simple sau compuse; cu o singură valoare sau
cu mai multe valori; respectiv derivate.
Numim atribut simplu orice atribut care are doar o singură componentă şi o
existenţă independentă.
Aceste atribute nu se pot diviza în mai multe atribute distincte. Ele se mai
numesc şi atribute atomice.
Exemplu: atributul sex corespunzator tipului de entitate student.
8
Numim atribut compus orice atribut care are mai multe componente,
fiecare cu o existenţă independentă.
Aceste atribute se pot diviza în general in mai multe atribute simple.
Exemplu: atributul adresă se poate descompune în atributele: strada, număr,
oraş, cod_poştal. Decizia ca un atribut compus să se descompună în mai multe
atribute simple este dependentă de modul în care se va utiliza acel atribut: pe
componente, sau ca un întreg.
Numim atribut cu o singură valoare orice atribut care poate lua cate o
singură valoare pentru fiecare entitate.
Majoritatea atributelor sunt atribute cu o singură valoare.
Numim atribut cu mai multe valori orice atribut care poate lua mai multe
valori pentru fiecare entitate.
Pentru atributele cu mai multe valori trebuie precizate numarul minim şi
numarul maxim de valori pe care le poate lua atributul respectiv.
Exemplu: atributul telefon poate fi un atribut cu mai multe valori. In acest
caz se poate limita de exemplu numarul numerelor de telefon la care poate fi gasit
studentul la minim 0 şi la maxim 3. Deci se pot stabili numarul minim şi numarul
maxim de valori pe care le poate lua atributul.
Numim atribut derivat orice atribut a cărui valoare se poate calcula din
unul sau mai multe alte atribute. Aceste atribute nu trebuie neaparat sa descrie
entitatea careia ii corespunde atributul derivat.
Exemple: valoarea pentru atributul vârsta este derivată din valoarea
atributului data_naşterii şi din data curenta. Valoarea atributului
numărul_total_de_entităţi se poate calcula numărând entităţile înregistrate.
9
linii, care au rolul de a evidentia legaturile intre elementele
diagramei.
Dreptunghiurile şi elipsele sunt etichetate cu numele 'obiectului' reprezentat.
Acestea nu sunt singurele elemente grafice utilizate intr-o diagrama E-R. Pe
masura ce vom defini noi concepte vom reveni cu precizari legate de modul de a le
reprezenta.
Un atribut se reprezintă printr-o elipsă, legată de entitatea careia îi este
asociat cu o linie şi etichetată cu numele atributului. Elipsa este trasata cu linie
punctată, dacă atributul este un atribut derivat şi respectiv cu linie dublă, daca
atributul poate lua mai multe valori.
Dacă un atribut este compus, atunci componentele atributului se reprezintă
prin elipse legate cu cate o linie de atributul compus.
numãr
num
e bloc
locatari adresa
numãr adresa
scara
matricol apartamen etaj
t adresa
adresa
adresa
De exemplu, entitatea locatari are următoarele atribute: număr_matricol,
nume şi adresa. Dintre aceste atribute, atributul adresa este atribut compus, care se
descompune în număr_bloc, scara, etaj şi apartament. Atributul număr_matricol
este o cheie.
Numim tip de relaţie orice asociere între tipuri de entităţi.
Numim relaţie orice asociere între entităti, când asocierea include cate o
entitate pentru toate tipurile de entitate participante.
Fie E1, E2, ..., En tipuri de entitate. Formal, un tip de relatie este o
submultime a urmatoarei multimi:
10
{( e1, e2, ..., en) | unde e1E1, e2E2, ..., enEn }
ceea ce inseamna ca ( e1, e2, ..., en) reprezinta formal o relatie.
Exemplu: Intr-o aplicaţie care ar servi unor evidente in cadrul asociatiilor de
locatari putem considera tipul de entitate locatari descris de atributele: nume,
adresa şi numar_matricol şi tipul de entitate scari descris de atributele
numar_de_bloc şi scara. Intre tipul de entitate scari şi tipul de entitate locatari se
poate stabili un tip de relatie numit este_locuita_de. Acest tip de relatie va contine
relatii de tipul ('Scara A', 'Popescu Ion') care va fi interpretata: "Scara A este
locuita de Popescu Ion".
Numim gradul relaţiei numărul entităţilor participante în relaţie. Asadar
relatia reprezentata mai sus are gradul n. Entităţiile implicate intr-o relaţie se
numesc participanţi. Dacă intr-o relaţie sunt doi participanţi, atunci relaţia se
numeşte binară.
Tipurile de relatii se reprezinta in diagramele E-R cu ajutorul romburilor
care sunt etichetate cu numele tipului de relatie.
nume
numar
scara numar
de adresa
matricol
bloc
scari este locu- locatari
1 ita de M
11
entitate la relaţie şi înapoi, primesc diferite etichete, care sunt importante în
înţelegerea corectă a relaţiei.
Exemplu: Daca am considera entitatile lucratori şi manageri care se refera la
personalul aceleiasi intreprinderi, am face constatarea ca sunt descrise de aceleasi
atribute deci apartin aceluiasi tip de entitate şi anume angajati. Relatia binara
lucreaza_pentru, stabilita intre lucratori şi manageri este o relatie recursiva.
Rolurile jucate de fiecare entitate se pot stabili recurgandu-se la perechi ordonate
(muncitor, manager). Astfel relatia ('Popescu Ion', 'Ionescu Gheorghe') se
interpreteaza "Popescu Ion lucreaza pentru (este subordonatul lui) Ionescu
Gheorghe".
lucrator
angajati lucreaza
manager pentru
Unui tip de relatie i se pot asocia atribute descriptive in acelasi mod in care
se pot asocia atribute unui tip de entitate.
Exemplu: Tipului de relatie este_locuita_de, care implica tipurile de entitate
scari şi locatari, i se poate asocia atributul data care sa retina data la care locatarul
L s-a mutat pe scara S. Dupa cum se observa, acest atribut descrie exclusiv tipul de
relatie şi el nu mai are sens in afara ei.
12
a) Restrictii de cardinalitate Numim cardinalitate (polaritate) numărul
relaţiilor posibile pentru o entitate participantă. Altfel spus, cardinalitatea exprima
numarul entitatilor la care o alta entitate poate fi asociata prin intermediul unei
relatii.
Observatie: Am utilizat in definitia de mai sus referiri la entitati şi la relatii
pentru a fi mai expliciti. Restrictiile structurale se refera insa in mod evident la
tipurile de relatie şi la tipurile de entitate asociate. Aceasta observatie ramane
valabila şi in consideratiile ce urmeaza.
Majoritatea tipurilor de relatie au gradul doi. Cardinalitatea in acest caz
poate fi de tipurile: unu-la-unu (1:1), unu-la-mai-multe (1:M), sau mai-multe-la-
mai-multe (M:N).
Relaţiile unu-la-unu:
În relaţiile unu-la-unu, o entitate, apartinand unui tip de entitate, este legată
de cel mult o entitate din celalalt tip de entitate implicat in relatia respectiva.
Implicarea fiecarei entitati intr-o relatie data este numita "participarea entitatii".
In diagrama E-R se eticheteaza arcul dintre relaţie şi fiecare tip de entitate cu
cardinalul relaţiei; in cazul relatiilor unu-la-unu fiecare din cele doua arce se
eticheteaza cu 1.
Relaţiile unu-la-mai-multe:
In relaţia de tip unu-la-mai-multe orice entitate, apartinand primului tip de
entitate, este legată de 0, 1, sau mai multe entităţi apartinand celui de-al doilea tip
de entitate participant la relatie. Exemplificăm acest tip de relaţie prin relaţia
este_locuita_de dintre tipurile de entităţi scari, respectiv locatari. In reprezentarea
grafică a acestui tip de relatie, arcul dinspre tipul de entitate scari se eticheteaza cu
1 iar arcul dinspre tipul de entitate locatari se eticheteaza cu M.
Din exemplul de mai sus se observă usor că dacă relaţia directă este de unu-
la-mai-multe, atunci relatia inversă este de unu-la-unu.
Relaţiile mai-multe-la-mai-multe:
Acest tip de relaţie se deosebeşte de relaţia unu-la-mai-multe prin faptul că
relaţia inversă nu este de unu-la-unu, ci de unu-la-mai-multe. Deci, dacă şi relaţia
13
directă şi relaţia inversă sunt de tipul unu-la-mai-multe, atunci relaţia directa este
de tipul mai-multe-la-mai-multe şi se notează cu (N:M).
atribute atribute
scari este locuita de locatari
nr_mat
nr_bloc R1
Sc.A Fam.1 numele
scara
R2 Fam.2
Sc.B nr_mat
nr_bloc
Fam.3 numele
scara R3
Sc.C
Reprezentarea cu retele semantice a relaţiei 1:M este_locuita_de
nr_mat
nr_bloc
b) Restrictii de participare numele
scara
Numim restrictii de participare acele restrictii prin care se determină dacă
existenţa unui tip de entitate depinde de faptul ca este legat sau nu de un alt tip de
entitate prin intermediul relatiei in discutie.
Participarea unei entitati poate fi totală sau parţială. Participarea este totala
daca existenta entitatii respective necesita existenta unei entitati asociate în relaţia
dată. În caz contrar participarea se numeşte parţială. Termenii participare totala şi
participare partiala pot fi inlocuiti cu participare obligatorie respectiv participare
optionala. În diagrama E-R aceste tipuri de relaţii se reprezintă prin arc cu linie
dublă pentru participarea totală, respectiv cu linie simplă pentru participarea
parţială. Pentru participarea parţială, există un mod de notaţie prin care se
etichetează arcele relaţiei cu perechea de numere ce reprezintă minimul, respectiv
maximul entităţilor participante la relaţie.
Exemplu: Daca se considera filialele unei firme oarecare ca entitati in tipul
de entitate filiala şi daca se considera tipul de entitate personal (unde entitatile
reprezinta personalul firmei respective) se poate defini tipul de relatie are_alocat
stabilit intre o filiala concreta şi personalul firmei. In acest caz, daca se considera
ca fiecare filiala are alocat personal al firmei atunci participarea tipului de entitate
filiala in relatia are_alocat este totala. Daca insa admitem ca unii membri ai
14
personalului (de exemplu vanzatorii) nu lucreaza in birourile nici unei filiale,
atunci participarea tipului de entitate personal in relatia are_alocat este partiala.
c) Dependenţele de existenţă
Numim tip slab de entitate un tip de entitate, a cărui existenţă este
dependentă de existenta unui alt tip de entitate.
Numim tip tare de entitate un tip de entitate, a cărui existenţă nu depinde
de existenta nici unui alt tip de entitate.
Entităţile slabe se mai numesc existential dependente sau subordonate iar
entitatile tari se mai numesc părinte sau dominante.
In diagrama E-R tipurile de entitate tari se reprezinta cu un dreptunghi trasat
cu linie simpla. Pentru tipurile de entitate slabe conturul dreptunghiului este trasat
cu linie dubla. De asemenea aceasta notatie se extinde şi la relatii. Astfel: o relatie
care leaga doua tipuri de entitate tari este reprezentata cu un romb trasat cu linie
simpla iar relatia care leaga un tip de entitate tare de un tip de entitate slab este
reprezentata cu un romb trasat cu linie dubla.
1.4. Chei
Conceptual este evident ca entitatile şi relatiile individuale care participa la
modelarea unei baze de date sunt distincte intre ele. Diferenta intre entitati sau
diferenta intre relatii se exprima cu ajutorul atributelor care le descriu.
Numim supercheie asociata unui tip de entitate, orice submultime a
multimii de atribute ce descriu tipul de entitate, submultime care poate duce la
identificarea in mod unic a oricarei entitati in cadrul tipului de entitate luat in
considerare.
Este evident ca, daca o submultime de atribute formeaza o supercheie, atunci
orice multime de atribute care include supercheia este tot o supercheie.
Numim cheie candidat orice supercheie care contine un numar minim de
atribute. Pentru o cheie candidat nici o submultime proprie nu mai este supercheie.
Putem spune ca o cheie candidat este caracterizata de urmatoarele proprietati:
15
- unicitatea, deoarece valoarea cheii este unica pentru fiecare entitate in
parte;
- ireductibilitatea, deoarece nici o submultime proprie de atribute ale cheii
nu are proprietatea de unicitate.
Observatie: Faptul ca valorile unei chei candidat sunt unice pentru fiecare
entitate nu poate fi determinat decat cu ajutorul informatiilor semantice referitoare
la valorile atributelor ce formeaza cheia. Trebuie sa se cunoasca semnificatiile din
lumea reala a atributelor ce formeaza cheia pentru a se stabili daca acestea vor avea
valori unice. Doar faptul ca, pentru o multime oarecare de entitati concrete, valorile
difera intre ele nu este de ajuns.
Pentru un tip de entitate este posibil sa se poata determina una sau mai multe
chei candidat.
Dintre acestea, cheia primară este cheia aleasa ca mijloc principal de
identificare a entitatilor in cadrul tipului de entitate respectiv.
Cheia primară este in general cea mai scurtă dintre cheile candidat.
In diagrama E-R atributele care intră în componenţa cheii primare, se
evidentiază prin sublinierea numelui atributului.
Numim cheie compusă orice cheie candidat care contine cel putin două
atribute.
Probleme se ivesc atunci cand trebuie sa identificam in mod unic entitatile
unui tip de entitate slab. Sa observam ca un tip de entitate tare are intotdeauna o
cheie primara, deci are intotdeauna cel putin o cheie candidat. Un tip de entitate
slab nu are cheie primara.
Numim discriminatorul unui tip de entitate slab, un set de atribute care
permite realizarea unei distinctii intre entitatile care depind de o anume entitate
tare. Asadar, cheia primara a unui tip de entitate slab este formata din cheia
primara a tipului de entitate tare de care este dependenta existential, la care se
adauga multimea atributelor care compun discriminatorul tipului de entitate slab.
16
Capitolul 2. Algebra relaţională
In cadrul bazelor de date relaţionale, datele sunt organizate sub forma unor
tablouri bidimensionale (tabele) de date, numite relaţii. Asocierile dintre relaţii se
reprezintă explicit prin atribute de legătură. Aceste atribute figurează într-una din
relaţiile implicate in asociere (de regulă, în cazul legaturilor de tip "unu la mulţi")
sau sunt plasate într-o relaţie distinctă, construită special pentru exprimarea
legaturilor între relaţii (în cazul legaturilor de tip "mulţi la mulţi"). O bază de date
relaţională (BDR) reprezintă un ansamblu de relaţii, prin care se reprezintă atât
datele cât şi legăturile dintre date.
Operatorii modelului relaţional. Definesc operaţiile care se pot efectua
asupra relaţiilor, in scopul realizarii funcţiilor de prelucrare asupra bazei de date,
respectiv consultarea, inserarea, modificarea şi ştergerea datelor.
Restricţiile de integritate ale modelului relaţional. Permit definirea
stărilor coerente ale bazei de date.
17
Pentru un ansamblu de domenii D1, D2, ..., Dn produsul cartezian al
acestora reprezinta ansamblul tuplurilor <v1, v2, ..., vn>, unde: v1 este o valoare
apartinând domeniului D1, v2 este o valoare din D2.
De exemplu, tuplurile: <"Maria", "F", 50>, <"Vasile", "M",15>,
<"Vasile","M",20>, <"Vasile", "F",100> aparţin produsului cartezian: D3 x
D1 x D2.
Relaţie
Să presupunem că se acordă o anumită semnificaţie valorilor domeniilor D1,
D2, D3, definite anterior.
Sa considerăm, de exemplu ca D1 cuprinde valorile referitoare la sexul unei
persoane, D2 conţine valori care exprimă vârsta unei persoane şi D3 cuprinde
numele unor persoane.
Numai unele dintre tuplurile produsului cartezian: D3 x D1 x D2 pot avea o
semnificaţie şi anume cele care conţin numele, sexul şi vârsta aceleiaşi persoane.
Dintre cele 202 tupluri care au valoarea "Vasile" pe prima pozitie, numai
unul poate avea o semnificaţie, dacă presupunem că există o singură persoană cu
acest nume.
Se desprinde de aici necesitatea definirii unei submulţimi de tupluri, din
cadrul produsului cartezian al domeniilor, submulţime care să cuprindă numai
tuplurile cu semnificaţie.
Relaţia reprezintă un subansamblu al produsului cartezian al mai multor
domenii, subansamblu caracterizat printr-un nume şi care conţine tupluri cu
semnificatie. Considerând, de exemplu, că nu se cunosc decât două persoane
definim realţia R prin tuplurile care descriu aceste persoane şi anume:
R: (<"Maria", "F", 30>, <"Vasile", "M", 35>)
Intr-o relaţie, tuplurile trebuie să fie distincte (nu se admit duplicări ale
tuplurilor).
O reprezentare comodă a relaţiei este tabelul bidimensional (tabela de date în
care liniile reprezinta tuplurile, iar coloanele corespund domeniilor).
18
Relaţie reprezentată sub forma unei tabele de date
Reprezentarea tabelară este preferată adesea altor forme de reprezentare a
relaţiilor, întrucat este uşor de înţeles şi de utilizat.
În prezentarea conceptului de reţatie se recurge uneori la analogii cu alte
concepte, extrem de bine cunoscute în domeniul prelucrării automate a datelor
precum cel de fişier. Relaţia poate avea semnificaţia unui fişier, tuplul poate fi
considerat drept o înregistrare, iar valorile din cadrul tuplului pot fi interpretate
drept valori ale câmpurilor de înregistrare.
În cadrul modelului relaţional nu intereseaza decat relaţiile finite, chiar dacă
în construirea relaţiilor se admit domenii infinite. Numărul tuplurilor dintr-o relaţie
reprezinta cardinalul relaţiei, în timp ce numărul valorilor dintr-un tuplu defineste
gradul relaţiei.
Atribut
In timp ce tuplurile dintr-o relaţie trebuie să fie unice un domeniu poate
apare de mai multe ori în produsul cartezian pe baza căruia este definită relaţia.
Să considerăm, de exemplu, că pentru o persoana dispunem de urmatoarele
date: nume,sex, vârsta şi numele soţului/soţiei.
O posibilitate de organizare a acestor date o reprezintă relaţia PERS:
R: D3 D1 D2
“Maria” “F” 30
“Vasile” “M” 35
Relaţia PERS
20
1. Reuniunea. Reprezintă o operaţie a AR definita pe doua relaţii: R1 şi R2
ambele cu o aceeaşi schemă, operaţie care constă din construirea unei noi relaţii
R3, cu schema identică cu R1 şi R2 şi având drept extensie tuplurile din R1 şi R2
luate impreună o singură dată.
Notaţia pentru reuniune este: R1 U R2
Reprezentarea grafică a reuniunii:
A B
X Y Z X Y Z
1 2 3 1 2 3
10 11 12 40 50 60
20 30 40 70 80 90
C= A U B
X Y Z
1 2 3
10 11 12
20 30 40
40 50 60
70 80 90
unde: "operator de comparaţie" poate fi: <, <=, >=, > sau <>.
22
Notaţia folosită in mod uzual pentru desemnarea operaţiei de selecţie este
următoarea:
Σ(conditie)R.
6. Joncţiunea (Joinul). Reprezintă o operaţie din AR definită pe două
relaţii: R1 şi R2, operaţie care constă din construirea unei noi relaţii R3,
prin concatenarea unor tupluri din R1 cu tupluri din R2. Se concateneaza acele
tupluri din R1 şi R2 care satisfac o anumita condiţie, specificată explicit în cadrul
operaţiei. Extensia relaţiei R3 va contine deci combinaţiile acelor tupluri care
satisfac condiţia de concatenare.
Notaţiiile pentru desemnarea operaţiei de joncţiune sunt:
23
JOIN (R1,R2, condiţie) = RESTRICT(PRODUCT(R1,R2), condiţie)
Produsul cartezian reprezintă o operaţie laborioasă şi foarte costisitoare, ceea
ce face ca in locul produsului să fie utilizat joinul ori de câte ori acest lucru este
posibil. Cu toate că apare drept o operaţie derivată, joinul este prezentat de obicei
drept o operaţie de bază din AR, dată fiind importanţa sa in cadrul sistemelor
relaţionale, în special la construirea relaţiilor virtuale.
Au fost definite numeroase variante ale operaţiei de joncţiune, variante care
diferă nu numai în funcţie de tipul condiţiilor de concatenare, ci şi după modul de
definire a schemei şi respectiv, extensiei relaţiei rezultate prin joncţiune.
Joncţiunea naturală. In cazul equijoinului, schema relaţiei conţine toate
atributele celor doi operanzi. În toate tuplurile relaţiei rezultat vor exista de aceea
cel puţin două valori egale. In sensul eliminării acestei redundanţe s-a introdus
joncţiunea naturală, ca operaţie definită pe două relaţii: R1 şi R2, prin care este
construită o noua relaţie R3, a cărei schemă este obţinută prin reuniunea atributelor
din relaţiile R1 şi R2 (atributele cu acelaşi nume se iau o singură dată) şi a cărei
extensie conţine tuplurile obţinute prin concatenarea tuplurilor din R1 cu tuplurile
din R2 care prezintă aceleaşi valori pentru atributele cu acelaşi nume.
X Y Z X Y Z
1 2 3 1 2 3
10 11 12 40 50 60
20 30 40 70 80 90
C= A ∩ B
X Y Z
1 2 3
25
Capitolul 3. Normalizarea datelor
3.1. Redundanta informatiilor şi anomalii la actualizare
La proiectarea unei baze de date, un obiectiv foarte important, care trebuie
urmarit cand se gandeste un model de date, este realizarea unei reprezentari corecte
a datelor, a relatiilor dintre date şi a restrictiilor impuse asupra datelor. Pentru
realizarea acestui obiectiv se utilizeaza tehnica normalizarii, care are ca scop
principal identificarea setului celui mai adecvat de relatii care sa modeleze
realitatea dorita.
Procesul de normalizare a fost introdus de E. F. Codd (1972). Iniţial s-au
propus trei forme normale, notate 1NF, 2NF, respectiv 3NF. Mai târziu, prin
enuntarea unei definitii mai tari a formei normale trei, s-a obtinut forma Boyce-
Codd (BCNF), după numele celor care au introdus aceasta forma normala: R.
Boyce şi E.F.Codd (1974). Toate aceste forme normale se bazeaza pe dependentele
functionale stabilite intre atributele unei relatii.
Formele normale cele mai folosite sunt: forma normală 3 şi forma normală
Boyce-Codd. Există şi forme normale mai tari - forma normală 4 (4NF) şi forma
normală 5 (5NF) - dar acestea se folosesc foarte rar.
Procesul de normalizare este o metodă formală care identifica relaţiile
bazandu-se pe cheile primare ale acestora (sau pe cheile candidat în cazul BCNF)
şi pe dependenţele funcţionale care exista intre atributele acestor relatii.
Normalizarea sprijina proiectantul bazei de date, dandu-i posibilitatea sa aplice o
serie de teste asupra relatiilor individuale, asa incat schema relaţionala poate fi
normalizata la forma normala dorita, pentru a se preveni aparitia anomaliilor la
actualizare.
Pentru a ilustra procesul de normalizare, vom utiliza exemple din sistemul
informatic Asociatie de locatari.
Partea cea mai importantă la proiectarea bazei de date este gruparea
atributelor în relaţii cu scopul de a minimiza redundanţa informaţiilor şi (odata cu
aceasta) spaţiul ocupat de relatii (tabele sau fişiere) pe suportul magnetic.
26
Fie relaţia Furnizori_Cheltuieli exemplificată mai jos. In exemple se vor simplifica
numele atributelor.
Relaţia Furnizori_Cheltuieli
Sa presupunem ca aplicaţia pe care o vom studia ca exemplu contine datele
organizate intr-o singura relatie descrisa de urmatoarele schema de relatie:
Furnizori_Cheltuieli = (Cod_furn, Den_furn, Cod_fiscal, Cod_chelt,
Den_chelt, Data, Valoare)
Dintre atribute, cele evidentiate constituie cheia primara pentru relatia
respectiva. Relatia Furnizori_Cheltuieli are cheia compusa din atributele
Cod_furn, Cod_Chelt şi Data. Datele sunt prost organizate in relatia prezentata.
Informaţia despre furnizori din relatia Furnizori_Cheltuieli este redundantă.
Detaliile despre furnizor se repetă la fiecare introducere a unei cheltuieli noi.
Nu este insa singura problema pe care o organizare nepotrivita a datelor o
poate genera.
O altă consecinta a redundanţei informatiilor din baza de date, o reprezinta
problemele de actualizare a informaţiei stocate. Enumeram mai jos o parte dintre
acestea.
Anomalii de adaugare
Anomaliile de inserare se pot clasifica în două tipuri:
Pentru a adauga detaliile despre o cheltuială către un furnizor, în
relaţia Furnizori_Cheltuieli trebuie obligatoriu adăugate şi detaliile despre
furnizorul în cauză, chiar dacă ele există deja în baza de date. Această anomalie
poate duce la apariţia de informatii diferite despre acelasi furnizor în înregistrări
diferite. Informatia despre furnizor isi pierde in acest mod consistenta, nu ne mai
putem baza pe corectitudinea datelor despre furnizor in baza de date.
27
Pentru a adăuga detalii despre un furnizor nou în relaţia
Furnizori_Cheltuieli, trebuie neapărat adăugată şi o cheltuială pentru asociaţia de
locatari către acel furnizor. În cazul în care încă nu a sosit factura de la furnizor, nu
se poate înregistra nici o cheltuială şi deci trebuie introduse valori nule. Este
nerecomandabil sa se lucreze cu valori nule deoarece se genereaza probleme la
regasirea şi actualizarea informatiilor.
Anomalii de ştergere
În cazul ştergerii unei cheltuieli a asociaţiei de locatari către un furnizor nou
(tot in cadrul relatiei Furnizori_Cheltuieli ), se va şterge şi furnizorul. Deci toate
detaliile introduse despre acel furnizor vor fi pierdute, ceea ce duce la
obligativitatea reintroducerii datelor la o nouă folosire al acelui furnizor.
Anomalii de modificare
Dacă în relaţia Furnizori_Cheltuieli dorim să schimbăm valoarea unui
atribut al unui furnizor, va trebui să schimbăm datele pentru fiecare apariţie a
acelui furnizor. De exemplu, dacă dorim să schimbăm codul fiscal al furnizorului
cu codul F100, va trebui să schimbăm acest atribut în toate tuplele in care apare
furnizorul F100. Din nou, este posibil ca datele sa nu fie modificate corect. Este
posibil sa ramana tuple cu datele nemodificate sau este posibil sa se modifice
datele respective cu valori diferite in locuri diferite. (Nu dorim sa insistam asupra
cauzelor care pot duce la aceste situatii.).
Anomaliile enumerate mai sus se pot evita prin folosirea (in acest caz) a
două relatii distincte: Cheltuieli şi Furnizori. În acest caz dacă trebuie modificat un
atribut al unui furnizor, modificarea se va executa intr-un singur loc în relatia
Furnizori. Asemanator, daca e necesara o stergere in relatia Cheltuieli, aceasta nu
va mai afecta furnizorii din relatia Furnizori. De asemenea orice cheltuiala
adaugata şi orice furnizor nou adaugat nu se vor mai conditiona reciproc in nici un
fel.
Descompuneri cu pierderi de informatii
In urma analizarii anomaliilor de actualizare prezentate mai sus am tras
concluzia ca o descompunere a relatiilor care ne fac probleme este binevenita şi
28
duce la rezolvarea problemelor. Este bine insa sa tratam descompunerile de relatii
cu prudenta deoarece o descompunere neglijenta ne poate crea probleme la fel de
mari cu acelea de care tocmai ne-am ocupat. Este posibil sa pierdem informatii
daca nu suntem atenti la modul in care se realizeaza descompunerea.
In general se poate urmari ca in fiecare relatie sa se reprezinte informatii
despre o singura multime-entitate. Criteriul este mai mult de ordin intuitiv şi el nu
ne este de mare ajutor in cazul reprezentarii multimilor-relatie. In acest caz, intr-o
relatie se intalnesc date despre mai multe multimi-entitate. Este necesar sa se
stabileasca o modalitate riguroasa de a decide care sunt informatiile care trebuie sa
alcatuiasca o astfel de relatie.
Orice relatie se construieste pe baza unei scheme de relatie. Fie R o schema
oarecare de relatie. Un set de scheme de relatie reprezinta o descompunere a lui R
şi se noteaza {R1, R2, …, Rn} daca
=R
29
3.2. Dependenţe funcţionale
Unul din cele mai importante concepte asociate cu normalizarea este
conceptul de dependenţă funcţională. Dependenţa funcţională descrie un anumit tip
de legatura care se stabileste intre atributele aceleiasi relatii.
Fie o schema de relatie R şi fie submultimile de atribute A şi B din R. Se
verifica AR şi BR. Spunem ca B depinde functional de A şi scriem AB daca
pentru orice relatie legala r, construita pe schema de relatie R, se verifica
urmatoarea situatie:
pentru orice pereche de tuple t1 şi t2 din r, pentru care t1[A]=t2[A], are loc
intotdeauna şi t1[B]=t2[B].
Aceasta inseamna ca atunci cand un tuplu t1 are (pe submultimea de atribute
A) aceeasi valoare cu alt tuplu t2, obligatoriu cele doua tuple vor avea aceeasi
valoare şi pe submultimea de atribute B. Valorile din B sunt in mod unic
determinate de valorile din A.
Numim determinant al unei dependente funcţionale, atributul, sau mulţimea
atributelor din partea stângă a săgeţii.
O parte dintre dependenţele funcţionale pentru relaţia Furnizori_Cheltuieli
sunt:
Cod_furn Den_furn
Cod_furn Cod_fiscal
Cod_chelt Den_chelt
Cod_chelt, Cod_furn, Data Valoare
Numele furnizorului este determinat in mod unic de codul furnizorului. La
coduri egale, numele sunt identice.
Valoarea insa nu poate fi determinata in mod unic decat de combinatia cod
cheltuiala, cod furnizor şi data. Intr-o anume data, un anumit furnizor, pentru un
anumit serviciu (care duce la un anume cod cheltuiala) cere o suma bine
determinata de bani. Nici una dintre valori nu poate determina valoarea şi nici in
combinatii de cate doua. Daca nu se iau cele trei informatii impreuna se pot crea
confuzii in legatura cu valoarea. (Acelasi cod de cheltuiala poate corespunde la
30
valori diferite in date diferite. Acelasi furnizor poate avea chiar şi coduri de
cheltuiala diferite darmite valoarea care le reprezinta, s.a.m.d.)
Notiunea de dependenta functionala generalizeaza notiune de cheie. Se poate
da urmatoarea definitie a supercheii:
Spunem ca submultimea de atribute K din schema de relatie R este o
supercheie daca KR, adica pentru orice pereche de tuple t1 şi t2 din r, pentru care
t1[K]=t2[K], are loc intotdeauna şi t1[R]=t2[R].
Dependentele functionale ne permit sa exprimam restrictii asupra relatiilor
pe care nu le putem exprima cu ajutorul cheilor. Dependenţa funcţională este o
proprietate legata de semantica atributelor în relaţii. Dependentele functionale pot
fi stabilite de cine cunoaste exact legaturile intre valorile atributelor, deci de catre
cineva care cunoaste foarte bine aplicaţia şi semnificatia informatiilor din relatii.
Nu se pot da retete pentru stabilirea dependentelor functionale, dar se pot da
metode de a determina toate dependentele functionale dintr-o relatie daca se
cunosc cateva dependente de la care poate porni algoritmul.
O metoda de a determina multimea tuturor dependentelor functionale dintr-o
relatie se bazeaza pe asa-numitele Axiome ale lui Armstrong.
Regulile (Axiomele) lui Armstrong:
1) regula reflexivitatii – daca X este un subset de atribute din R şi YX,
atunci are loc XY;
2) regula creşterii – daca X, Y şi W sunt subseturi de atribute din R şi
daca XY atunc WXWY;
3) regula tranzitivitatii – daca X, Y şi Z sunt subseturi de atribute din R
şi daca XY şi YZ atunci are loc şi XZ.
Cele trei reguli sunt suficiente şi formeaza un set complet pentru a se putea
determina toate dependentele functionale daca se porneste de la un set de baza
initial. Totusi se mai utilizeaza in mod obisnuit şi reguli suplimentare (care pot fi
deduse din primele trei) deoarece usureaza calculele.
31
Astfel:
4) regula reuniunii – daca X, Y şi Z sunt subseturi de atribute din R şi
daca XY şi XZ atunci şi XYZ;
5) regula descompunerii – daca daca X, Y şi Z sunt subseturi de atribute
din R şi daca XYZ atunci au loc şi XY şi XZ;
6) regula pseudotranzitivitatii - daca X, Y, W şi Z sunt subseturi de
atribute din R şi daca XY şi WYZ atunci şi WXZ
EXEMPLU:
Fie schema de relatie R={A, B, C, G, H, I} şi fie setul de dependente initial
notat cu F şi format din dependentele: AB, AC, CGH, CGI, BH.
Pornind de la acest set initial se mai pot calcula şi urmatoarele dependente:
AH, utilizand regula tranzitivitatii aplicata la dependentele AB şi
BH;
CGHI, utilizand regula reuniunii pentru dependentele CGH şi
CGI;
si asa mai departe… …
Daca se noteaza cu F setul initial de dependente functionale, cu F + se va nota
inchiderea lui F (deci toate dependentele functionale care se pot defini pentru
relatia in cauza.)
Putem reveni in acest moment pentru a trata descompunerile de relatii. Am
subliniat mai inainte ca este necesar sa fim atenti la descompuneri pentru a evita
pierderea de informatii.
Descompuneri fara pierderi la jonctiune
Fie o descompunere oarecare {R1, R2, …, Rn} a relatiei R. Pentru o
descompunere oarecare se verifica intotdeuna relatia:
r ri
unde prin X s-a notat produsul cartezian, operatie din algebra relaţionala.
Altfel spus, orice tuplu din relatia r duce, prin descompunere, la cate un tuplu t i in
32
fiecare relatie ri. Cand se realizeaza produsul cartezian cu toate relatiile r i, se obtin
in general mai multe tuple decat au fost in relatia initiala r, deoarece produsul
cartezian are ca rezultat toate combinatiile posibile intre elementele participante.
Asupra relatiilor dintr-o baza de date se impun intotdeauna anumite restrictii
sau conditii, care sa asigure corectitudinea informatiilor din respectiva baza de
date.
In general spunem ca o relatie este legala daca satisface toate regulile sau
restrictiile care sunt impuse la proiectarea bazei de date.
Fie C un set de restrictii asupra bazei de date. O descompunere {R 1, R2, …,
Rn} a unei scheme de relatie R este o descompunere fara pierderi la jonctiune
pentru R, daca pentru toate relatiile r definite pe schema R (care sunt legale sub
restrictiile C) se verifica:
r=
33
Vom obtine un set de multimi de dependente functionale F 1, F2, …, Fn. Fie
F'= Fi, reuniunea seturilor de dependente funtionale. In general F'F. Dar s-ar
34
grupuri repetitive. În acest caz creăm mai multe relaţii noi. Aceste relaţii noi,
precum şi tabela normalizată vor fi în formă normală unu.
Pentru relaţia Furnizori_Cheltuieli:
Cod_furn Den_furn Cod_fiscal Cod_chelt Den_chelt Data Valoare
F100 Moldgaz R1234567 C15 Incalzire 30.06.12 2150,00
F100 Moldgaz R1234567 C16 Apa calda 30.06.12 500,00
F110 Renel R7654321 C10 Iluminat 30.06.12 3000,00
F110 Renel R7654321 C11 Lift 30.06.12 200,00
Tabela nenormalizată Furnizori_Cheltuieli.
36
Forma Normală Doi (2NF). O relaţie este în forma normală doi, dacă este
în forma normală unu şi fiecare atribut care nu aparţine cheii primare, este total
dependent funcţional de cheia primară.
Vom demonstra aducerea la forma normală doi, folosind relaţia
Furnizori_Cheltuieli. Putem trece la forma normală doi prin ştergerea atributelor
care nu depind total de cheia primară şi trecerea lor într-o altă tabelă împreună cu
determinantul lor. După efectuarea acestor transformări, vom obtine următoarele
relaţii:
Relatia Cheltuieli:
Cod_furn. Cod_chelt Data Valoare
F100 C15 30.06.99 1500
F100 C16 30.06.99 500
F110 C10 30.06.99 3000
F110 C11 30.06.99 200
Relaţia Furnizori:
Cod_furn Den_furn Cod_fiscal
F100 Moldgaz R1234567
F110 Renel R7654321
Relatia Tip_cheltuiala:
Cod_Chelt Den_chelt
C15 Incalzire
C16 Apa calda
C10 Iluminat
C11 Lift
Relaţiile rezultate după trecerea la 2NF a relaţiei Furnizori_Cheltuieli.
Relaţiile rezultate au următoarele scheme de relatie:
Furnizori = (Cod_furn., Den_furn, Cod_fiscal)
Tip cheltuială = (Cod_Chelt., Den_chelt)
Cheltuieli = (Cod_furn, Cod_chelt, Data, Valoare)
37
Forma Normală Trei (3NF)
Forma normală doi chiar dacă nu conţine atâta redundanţă ca forma normală
unu, totuşi există cazuri în care pot apărea anomalii la actualizare. Aceste anomalii
apar din cauza redundanţei generate de dependenţa tranzitivă.
Dependenţă tranzitivă. Dacă atributele A, B, C sunt în relaţiile AB şi
BC, atunci spunem că atributul C este dependent tranzitiv de atributul A, via B.
Forma Normală Trei (3NF). Spunem ca o relaţie este în formă normala trei
daca este deja in forma normală doi şi nici un atribut care nu aparţine cheii primare
nu este tranzitiv dependent de cheia primara.
În cazul existenţei dependenţei tranzitive, ştergem coloanele care sunt
tranzitiv dependente de cheia primară şi creăm o relaţie nouă cu aceste coloane,
împreună cu determinantul lor, adică cheia primară.
Examinând relaţiile în forma normală de mai sus, observăm că nu există
dependenţe tranzitive. Deci relaţiile sunt în formă normală trei.
Forma Normală Boyce-Codd (BCNF)
Baza de date trebuie proiectată astfel încât să nu conţină dependenţe parţiale
sau tranzitive, pentru că altfel ne putem confrunta cu anomaliile descrise la
inceputul capitolului.
Forma normală Boyce-Codd se obtine utilizand cheile candidat din relaţie. O
relaţie cu o singură cheie candidat în formă normală trei este şi în formă normală
Boyce-Codd.
Forma normală Boyce-Codd (BCNF). Spunem ca o relaţie este în forma
normală Boyce-Codd dacă şi numai dacă orice determinant din relaţie este cheie
candidat.
Să căutăm determinanţii din exemplul de mai sus:
Cod_furn Den_furn, Cod_fiscal
Cod_chelt Den_chelt
Cod_furn, Cod_chelt, Data Valoare
38
Toţi cei trei determinanţi sunt şi chei candidat in relatiile lor. Deci relatiile
din exemplul de mai sus sunt în formă normală Boyce-Codd. Relaţiile în formă
normală trei sunt în general şi în formă normală Boyce-Codd. În cazul în care
relaţia nu este în formă normală Boyce-Codd, trecerea la BCNF se realizează prin
ştergerea din relaţia iniţială a atributelor care sunt asociate unui determinant care
nu este cheie candidat şi crearea unei noi relaţii cu aceste atribute şi determinantul
lor.
Există situaţii când este foarte greu de descompus relatiile, ca să ajungem la
BCNF. În aceste situaţii este indicata rămânerea la forma normală trei.
Concluzii
Forma Normală Unu (1NF)
Trebuie să căutăm toate intersecţiile de linii şi coloane, unde există
repetiţii. Aceste repetiţii se pot elimina prin două modalităţi:
39
Forma Normală Boyce-Codd (BCNF)
Cerinţa la forma normală Boyce-Codd este ca fiecare determinant din relaţie
să fie cheie candidat. În cazul în care nu este îndeplinită această cerinţă, vom şterge
atributele dependente funcţional de determinantul care nu este cheie candidat şi
creăm o nouă relaţie în care să avem atributele şterse şi determinantul lor. În unele
cazuri trecerea la forma normală Boyce-Codd complică foarte mult baza de date,
caz în care este de preferat rămânerea la forma normală trei.
40
Capitolul 4. Proiectarea a bazelor de date relaţionale
41
4.2. Prezentarea metodologiei
Să vedem care sunt paşii de urmat în proiectare:
42
Pasul 4. Proiectarea fizică şi implementarea bazei de date
relaţionale: Translatarea modelului logic global în SGBD.
Pasul 4.1. Proiectarea relaţiilor de bază în SGBD.
Pasul 4.2. Crearea regulilor de integritate în SGBD.
Pasul 5. Proiectarea şi implementarea reprezentării fizice.
Pasul 5.1. Analizarea tranzacţiilor.
Pasul 5.2. Alegerea organizării fişierelor.
Pasul 5.3. Alegerea indecsilor secundari.
Pasul 5.4. Introducerea unei redundanţe comntrolate.
Pasul 5.5. Estimarea spaţiului pe disc.
Pasul 6. Proiectarea şi implementarea unui mechanism de securitate.
Pasul 6.1. Crearea view-urilor pentru utilizatori.
Pasul 6.2. Proiectarea regulilor de acces la baza de date.
Pasul 7. Verificarea sistemului operaţional.
Proiectarea logică a bazei de date se divide în trei paşi mari. Primul pas are
ca obiectiv, descompunerea proiectării sistemului informatic în vederi, care se pot
discuta cu utilizatorii sistemului. Modelul de date astfel creat, se validează prin
normalizare şi prin tranzacţii în pasul doi. În final, se generează modelul global al
întreprinderii, care este la rândul lui validat şi verificat cu ajutorul utilizatorului
sistemului.
tipuri de entităţi,
tipuri de relaţii,
atribute,
domeniile atributelor,
cheile candidat,
chei primare
Paşii din prima etapă a proiectării logice sunt:
44
Pasul 1.5. Determinarea atributelor care compun cheile candidate şi
primare.
Pasul 1.6. Specializare/generalizare (pas opţional).
Pasul 1.7. Desenarea diagramei entity-relationship.
Pasul 1.8. Verificarea modelului conceptual local cu ajutorul
utilizatorului.
Pasul 1.1. Identificarea tipurilor de entităţi
După identificarea entităţiilor, le dăm câte un nume, iar aceste nume le vom
evidenţia în dicţionarul de date, împreună cu explicaţiile despre entităţi, precum şi
posibilele aliasuri.
În cele mai multe din cazuri, relaţiile sunt binare, adică se realizează întrea
exact două entităţi. Există şi relaţii mai complexe, care se realizează între mai
multe entităţi, sau relaţii recursive, care pune în relaţie o singură entitate cu ea
însăşi.
Utilizarea modelării ER
Este important să notăm dacă un atribut este simplu sau compus. Conform
acestei informaţii va trebui să luăm decizii referitoare la acel atribut. Dacă un
atribut este compus, atunci putem opta pentru descompunerea sa, dacă este
necesară prelucrarea separată a detelor compuse, sau putem să-l lăsăm compus în
caz contrar.
Sunt acele atribute, care se pot calcula din alte atribute existente în baza de
date. De exemplu numărul locatarilor de pe o scară se poate număra în tipul de
entitate Locatari. Deci acest atribut este atribut derivat.
47
inconsistentă. De aceea este important de a menţiona dacă un atribut este sau nu
derivat.
Dacă identificăm un atribut care să nu-l putem asocia nici unei entităţi sau
relaţii, ne întoarcem la paşii anteriori, identificând noua relaţie sau entitate la care
să asociem atributul respectiv.
În cazul în care putem asocia acelaşi atribut la mai multe entităţi, atunci va
trebui să decidem dacă generalizăm sau nu aceste entităţi, proces care este descris
la pasul 1.6.
Documentarea atributelor
O cheie candidat este un atribut, sau un grup de atribute care identifică unic
fiecare înregistrare din tipul de entitate. Putem identifica una, sau mai multe chei
candidat. În acest caz trebuie să alegem dintre ele o cheie primară. Cheile candidat
care nu sunt primare, se vor numi chei alternante. Pentru alegerea unei chei ca fiind
cheie primară, vom ţine cont de următoarele:
49
fără o entitate tare, care să-i fie “părinte”. Cheia primară a entităţii slabe este
derivată parţial sau total din cheia primară a entităţii tari.
50
Pasul 1.8. Verificarea modelului conceptual local cu ajutorul
utilizatorului
51
Obiectivul: Combinarea modelelor locale logice într-un model logic
global.
Cerinţele utilizatorilor.
Analiza şi colectarea datelor îl vom începe la o asociaţie de locatari. Aici
trebuie să cerem informaţiile necesare pentru realizarea sistemului. Trebuie să
colectăm informaţiile despre lucrul de zi cu zi a şefului asociaţiei de locatari. Vom
mai avea nevoie de toate rapoartele pe care ei le întocmesc. Toate informaţiile
52
despre sistemul de evidenţă a asociaţiei de locatari se pot împărţi în mai multe
view-uri. Aceste view-uri sunt:
53
(1) Fiecare cheltuială se înregistrează în momentul primilii facturii de la
furnizor. Cheltuielile sunt identificate unic printr-un număr de ordine care este
continuu pe un an. Pentru fiecare cheltuială se înregistrează informaţiile: codul
cheltuielii, codul furnizorului, numărul şi data facturii, valoarea facturii.
(2) Cheltuielile se pot referii la o singură scară sau la mai multe scări, sau
se pot referi la o singură familie sau mai multe familii.
(3) Pentru fiecare familie se înregistrează lunar valoarea ce trebuie plătită
asociaţiei. Dacă este cazul, se înregistrează şi restanţele.
(4) Când o familie îşi achită datoria la asociaţie, se emite o chitanţă, care
trebuie să conţină informaţii despre valoarea plătită, data plăţii şi numele persoanei
care a făcut plata. Chitanţa se identifică unic prin numărul său.
(5) Pentru a efectua mai uşor înregistrarea cheltuielilor, memorăm şi
datele despre furnizori. Aceste date sunt: denumirea, codul fiscal, contul bancar şi
banca, adresa (strada, numărul, bl., sc., ap., localitatea şi judeţul). Furnizorii se pot
identifica unic printr-un cod intern - cod furnizor.
(6) Pe lângă cheltuielile către furnizori există şi cheltuieli, care trebuiesc
plătite de locatari, dar care rămân la asociaţie. Astfel de cheltuială este fondul de
rulment, fondul de reparaţii, sau dacă este cazul, şi alte fonduri. Aceste cheltuieli
se vor înregistra în acelaşi mod ca şi celelalte, cu diferenţa că aici se va introduce
un “furnizor” special pregătit.
(7) Fiecare familie trebuie să aibă plătită o sumă la asociaţia de locatari
pentru fondul de rulment. În cazuri speciale se adună bani şi pentru fondul de
reparaţii, sau alte fonduri.
54
Evidenţa mijloacelor fixe şi a obiectelor de inventar.
(1) Mijloacele fixe şi obiectele de inventar se vor identifica unic, cu
ajutorul unui cod numit numar de inventar. Pentru aceste obiecte mai reţinem
următoarele informaţii: numele, valoarea şi locul unde este amplasat.
tipuri de entităţi,
tipuri de relaţii,
atribute,
domeniile atributelor,
chei candidat,
chei primare.
Locatari Scări
Familii
Cheltuieli Furnizori
Plăţi Chitanţe
Familii Scări
primesc Chitanţe
57
Întrebare: Pot locui pe o scară mai mulţi locatari?
Răspuns: Da.
Răspuns : Nu.
Deci cardinalul acestei relaţii este de 1:1, de unde rezultă că relaţia iniţială
are cardinalul 1:M.
Răspuns : Nu.
Răspuns: Da.
Deci tipul de entitate scări partcipă parţial, iar tipul de entitate Locatari
participă total la relaţie.
Răspuns : Da.
59
Diagrama ER a view-ului “Cheltuieli”
Documentarea atributelor:
61
Acum vom examina tabelele şi vom căuta cheile candidat pentru entităţile în
cauză. Dintre aceste chei candidat vom selecta cheia primară.
62
Pentru o mai bună înţelegere a modelului local creat, folosim diagrama ER.
Această diagramă şi documentaţia creată se referă la modelul local conceptual.
Înainte de a termina pasul 1, trebuie verificat modelul la care s-a ajuns. Dacă
se descoperă erori, atunci ne întoarcem la pasurile anterioare şi le remediem. Vom
repeta aceşti paşi până când modelul creat va fi în conformitate cu realitatea.
Pentru fiecare entitate tare a modelului, creăm o relaţie care include toate
atributele simple ale entităţii. Structura entităţii Furnizori este:
Pentru fiecare entitate slabă, descriem relaţia, incluzând atributele simple ale
entităţii, specificând cheia străină şi entitatea la care se referă această cheie străină.
Structura entităţii Cheltuieli este:
Acest proces continuă, până când se vor prelucra toade relaţiile din baza de
date.
63
Validarea modelului prin normalizare.
Cod_furnizor Denumire, Cod_fiscal, Cont, Banca, Str, Nr, Bl, Sc, Ap,
Loc
Cod_fiscal Cod_furnizor, Denumire, Cont, Banca, Str, Nr, Bl, Sc, Ap,
Loc
65
Capitolul 5. Securitate şi integritate
5.1. Integritate
Integritatea bazelor de date se refera la corectitudinea informaţiilor şi
presupune detectarea, corectarea şi prevenirea diferitelor erori care pot afecta
datele introduse în bazele de date. Cand facem referiri la integritatea datelor,
întelegem că datele sunt consistente relativ la toate restrictiile formulate anterior
(care se aplica datelor respective) şi ca urmare a acestui fapt, datele sunt
considerate valide.
Conditiile de integritate numite şi reguli sau restrictii de integritate nu permit
introducerea in baza de date a unor date aberante şi sunt exprimate prin conditii
puse asupra datelor.
In general sunt acceptate mai multe criterii de clasificare a regulilor de
integritate.
O serie de conditii sunt de tip structural, legate de anumite egalitati intre
valori, şi exprimate prin dependente functionale sau prin declararea unor campuri
cu valori unice (de cele mai multe ori aceste campuri sunt chei).
O alta serie de conditii se clasifica dupa unitatea la care se aplica restrictia si,
in acest caz, exista restrictii pe domenii (ce privesc anumite valori pentru atribute)
sau restrictii pe tabele (relatii). Restrictiile pe tabele pot fi unituplu (se refera la
fiecare tuplu in parte) sau multituplu (se refera la combinatii de mai multe tupluri).
O restrictie de integritate de relatie unituplu impune ca in fiecare tuplu al
unei relatii de baza, in campurile corespunzatoare cheii primare, se apara valori
diferite de valorile nule corespunzatoare. Aceasta regula se mai poate enunta şi sub
forma: "intr-o baza de date relaţionala nu se inregistreaza nici o informatie despre
ceva ce nu poate fi identificat."
Un exemplu de restrictie de integritate de relatie de tip multituplu este
restrictia referentiala care se exprima prin conditia ca, pentru cheile externe, daca
nu sunt nule, sa se admita valori corespunzatoare uneia din cheile primare existente
66
in relatia referita. Verificarea acestei conditii are loc de cate ori se insereaza un nou
tuplu ce contine o cheie externa sau se modifica valoarea unei chei externe a unui
tuplu, semnalandu-se eventualele neconcordante şi anuland modificarile.
Verificarea unicitatii cheii primare şi restrictiile rezultate din dependentele
functionale şi multivaloare sunt alte exemple de acelasi tip.
Un alt criteriu de clasificare este acela prin care se deosebesc regulile de
integritate ce se refera la diferitele stari ale bazei de date de regulile ce se refera la
tranzitia dintr-o stare in alta.
Restrictiile pot fi clasificate şi din punct de vedere al momentului in care se
aplica ele, astfel avem reguli imediate (ce se verifica in momentul in care se
efectueaza operatia indicata) sau reguli amanate (ce se verifica numai dupa ce au
fost executate şi alte operatii asociate dar inainte de a se modifica baza de date).
In functie de aria de aplicare, restrictiile pot fi impartite in restrictii generale,
aplicabile tuturor relatiilor din baza de date şi restrictii particulare, care se pot
aplica numai la anumite relatii.
Regulile de integritate se aplica relatiilor de baza in care sunt reprezentate
efectiv datele bazei de date. Dintre regulile generale cel mai des folosite in modelul
relaţional sunt regulile ce privesc cheile primare şi cheile externe.
Analizam in continuare cateva tipuri de restrictii de integritate.
I. Restrictii pentru integritatea entitatii
Enunt: Intr-o relatie de baza nici un atribut al unei chei primare nu poate
avea valori nule.
Deja cunoastem ca se cere (in multe situatii) ca valorile cheilor primare sa
fie unice. In majoritatea SGBD unicitatea cheii primare şi integritatea entitatii sunt
conditii obligatorii.
II. Restrictii pentru integritatea referentiala
Enunt: Daca exista o cheie externa intr-o relatie, ori valoarea cheii externe
trebuie sa se potriveasca cu valoarea unei chei candidat a vreunui tuplu in relatia de
origine, ori valoarea cheii externe trebuie sa fie nula.
67
Cu alte cuvinte, daca o valoare exista intr-o relatie pe post de cheie externa,
ori ea trebuie sa se potriveasca cu valoarea unei chei primare dintr-o alta relatie ori
sa fie nula.
III. Restrictiile de domeniu
Aceste restrictii sunt intotdeauna restrictii de stare imediate. Aceste restrictii
se pot referi la tipul de date pentru un atribut, la o lista de valori posibile, la un
ordin de marime, la un format sau o forma, la o conditie exprimata cu o formula
logica sau la o procedura care este apelata de cate ori are loc o modificare pentru
domeniul specificat.
Integritatea datelor este strans corelata cu securitatea datelor unei baze de
date.
Daca se definesc controalele de securitate in absenta celor de integritate,
validitatea şi consistenta datelor se bazeaza exclusiv pe utilizarea corecta şi de
buna credinta a sistemului de catre utilizatorii autorizati. Daca insa se definesc
numai controale de integritate, datele au sansa sa fie consistente dar sunt
susceptibile la pericolele care provin din lipsa securitatii.
Este important de mentionat aici ca restrictiile de integritate nu garanteaza
corectitudinea datelor. Aceasta deoarece este aproape imposibil (in multe situatii)
ca verificarea corectitudinii sa fie realizata automat.
Exemplu: Nu se poate verifica automat daca numele unei persoane este
"Pop" sau "Popa", cum nu se poate verifica automat daca data nasterii este
"10.01.2001" sau "01.01.2001", etc.
Pentru a asigura un grad multumitor de integritate a datelor trebuie prevazute
restrictii de integritate in asociere cu principalele momente in care datele
respective sunt manipulate, cum ar fi: introducerea, actualizarea şi stergerea.
Acestea sunt operatii susceptibile de introducerea de date inconsistente in baza de
date.
Asociata cu integritatea datelor este şi protectia datelor impotriva unor
evenimente de avarie cum ar fi caderea sistemului cauzata de defectarea unor
componente hardware sau software.
68
Pierderea accidentala de consistenta a datelor poate rezulta din:
- incidente ce apar pe parcursul executarii tranzactiilor,
- anomalii datorate accesului concurent la baza de date,
- anomalii datorate lucrului cu date distribuite pe mai multe calculatoare intr-
o retea,
- erori logice care apar din programele utilizator, si altele.
Pentru reconstituirea bazelor de date in cazul cand pot sa apara inconsistente
in general, majoritatea bazelor de date se copiaza periodic pe medii magnetice ce
se pastreaza in locuri sigure. De asemenea se tine o evidenta a tuturor
transformarilor efectuate in baza de date de cand s-a efectuat ultima copie. Fisierul
care contine aceste modificari se numeste jurnal. Fiecare inregistrare din jurnal
contine un identificator al programului care a facut modificarea, fosta valoare şi
noua valoare introdusa pentru un element. Tot in jurnal se mai pastreaza diferitele
momente importante din desfasurarea programelor (inceput, sfarsit, terminarea
unor operatii, etc.).
Se spune despre o tranzactie ca este comisa daca au fost terminate toate
calculele produse de ea in aria de lucru şi s-a facut o copie a rezultatelor ei in
jurnal. Aparitia unor caderi dupa ce o tranzactie a fost comisa nu afecteaza
continutul bazei de date deoarece se poate reconstitui baza de date cu ajutorul
ultimei copii şi a jurnalului in care se gasesc toate rezultatele tranzactiilor comise.
Modificarile tranzactiilor abandonate sau necomise nu sunt luate in considerare la
parcurgerea jurnalului pentru restaurarea bazei de date.
Se defineste strategia de comitere in doua faze astfel: o tranzactie poate sa
scrie intr-o baza de date numai dupa ce a fost comisa şi o tranzactie poate fi comisa
numai dupa ce a inregistrat in jurnal toate schimbarile de elemente produse de ea.
5.2. Securitate
Prin securitatea bazelor de date se intelege protejarea bazelor de date
impotriva folosirii neautorizate a lor şi in special a modificarilor şi distrugerilor
69
nedorite de date şi a citirilor nepermise de date. Pentru realizarea securitatii datelor
din baza de date se utilizeaza controale tehnice şi administrative.
Securitatea este in general asociata cu urmatoarele situatii:
- acces fraudulos la date,
- pierderea confidentialitatii (secretului) datelor,
- pierderea caracterului privat al datelor,
- pierderea integritatii datelor,
- pierderea disponibilitatii datelor.
Este mai dificila protejarea datelor impotriva accesului rauvoitor, intentionat.
Se recunoaste ca de fapt nu exista protectie absolut sigura ci doar protectii şi
masuri de securitate mai eficiente sau mai putin eficiente.
Forme de acces intentionat şi rauvoitor la datele unei baze de date:
- citire neautorizata a unor date,
- modificari neutorizate de date,
- distrugeri de date.
Notiunea de securitate a bazei de date este de obicei asociata cu accesul
rauvoitor, pe cand integritatea se refera la evitarea pierdelor accidentale de
consistenta. Adevarul este insa undeva la mijloc.
Pentru protectia bazei de date se pot lua masuri de asigurare a securitatii la
mai multe nivele:
- la nivel fizic - locurile in care se afla calculatoarele trebuie protejate de
accesul persoanelor neautorizate;
- la nivel uman – este recomandabil sa se acorde autorizatiile de acces cu
multa grija şi sa se tina evidente stricte ale persoanelor autorizate
- la nivel sistem de operare – slabiciunile protectiei la nivel de sistem de
operare trebuie eliminate sau compensate de alte masuri
- la nivel SGBD – sistemul ofera anumite facilitati care sprijina protectia
datelor
Tehnici de asigurare a securitatii datelor:
1. Identificarea utilizatorilor.
70
Fiecarui utilizator in parte i se acorda anumite drepturi de operare pe diferite
portiuni din baza de date la diferite nivele cum ar fi relatia, inregistrarea, pagina,
atributul, etc. Drepturile se refera la posibilitatea citirii, inserarii, stergerii sau
modificarii datelor respective. Identificarea se face de obicei prin parole stabilite
fie de administratorul bazei de date fie de utilizator.
2. Protejarea datelor prin codificare (criptare).
Deoarece s-ar putea ajunge la date şi prin alte mijloace decat prin
intermediul SGBD-ului (de exemplu prin citirea directa a mediului magnetic) se
poate face o protectie prin pastrarea codificata a datelor pe mediul magnetic.
Decodificarea datelor se poate face numai dupa identificarea utilizatorului prin
garzi asociate lui.
3. Utilizarea view-urilor in aplicaţii.
Abilitatea view-urilor de a "ascunde" o parte din informatiile din baza de
date poate fi utilizata şi pentru stabilirea unui anumit grad de securitate a datelor.
Astfel se poate vorbi de acces la nivel de relatie (tabela) sau acces la nivel de view.
In unele sisteme nu sunt acceptate modificari prin intermediul view-urilor.
Astfel de view-uri se numesc read-only (numai pentru citire) şi sunt utilizate mai
ales in aplicaţiile in care datele pot fi citite de toti utilizatorii (baze de date publice)
dar modificarile se fac numai cu aprobarea administratorului/proprietarului bazei
de date.
Modificarile din view-uri nu sunt in general admise deoarece pot duce la
efecte laterale ce privesc parti din baza de date ce nu apar in view-uri. De exemplu
stergerea unui element din view poate sa duca la eliminarea unui alt element care
are singura legatura cu elemntul sters şi care nu se afla in view.
4. Administrarea şi transmiterea drepturilor.
Se tine evidenta stricta a drepturilor de acces ale fiecarui utilizator la portiuni
din baza de date şi se fixeaza reguli de transmitere de la un utilizator la altul a
dreptului de acces.
Forme de autorizare:
- autorizare la citire (consultare)
71
- autorizare la inserare (adaugare)
- autorizare la actualizare (care exclude stergerile)
- autorizare la stergeri (la nivel de tuplu)
In situatiile de mai sus nu se pune problema modificarilor la nivel de schema
a bazei de date.
Daca consideram şi acest aspect putem vorbi de:
- autorizare la nivel de index (creare-stergere de indexi)
- autorizare la nivel de relatii (creare)
- autorizare de modificari la nivel de relatii (stergeri sau adaugari de atribute
in cadrul relatiilor)
- autorizari de stergeri ale relatiilor
Diferitele protectii pot fi indicate prin intermediul limbajului de prelucrare a
datelor. Portiunile din baza de date ce pot fi folosite de utilizator pot fi definite prin
operatii de selectie şi proiectie care fac invizibile alte portiuni ale bazei de date.
Conducerea organizatiei, care este proprietara bazei de date, trebuie sa ia
masuri de securitate care reduc riscul de a se pierde informatii sau de a se distruge
informatii. Prin pierdere de informatii se poate intelege ca se pierde caracterul
privat al informatiilor, ele devin accesibile unui grup mai mare de persoane decat
cel prevazut. Nu intotdeauna "scurgerile" de informatii lasa urme, deci nu se
materializeaza intotdeauna in schimbari detectabile la nivelul bazei de date.
Problema securitatii cuprinde aspecte legale, sociale şi etice, aspecte privind
controlul fizic (paza şi posibilitati de blocarea accesului la terminale), aspecte de
politie (fixarea conditiilor de acces), aspecte operationale (modul de stabilire a
parolelor), aspecte privind controlul hard (modul de acces hard la diferite
componente), securitatea sistemului de operare (protejarea informatiilor şi anularea
rezultatelor intermediare pentru pastrarea secretului datelor) aspecte privind
notiunea de proprietate asupra datelor din baza de date şi altele asemanatoare.
Trebuie sa mentionam aici ca furturile şi fraudele nu sunt neaparat legate de
baza de date, ele sunt un factor de risc pentru intreaga organizatie, gravitatea
acestor fapte depinzand şi de profilul organizatiei in cauza.
72
Capitol 6. Limbajul SQL
73
Scrierea comenzilor SQL
O instrucţiune SQL este formată din cuvinte rezervate şi cuvinte definite
de utilizator. Cuvintele rezervate constituie partea fixă şi se scriu exact cum este
necesar. Cuvintele definite de utilizator reprezintă denumirile diverselor obiecte
din BD.
Terminator de instrucţiune este „;”.
Identificatorii SQL sunt utilizaţi pentru a numi obiecte din BD. Pentru
caracterele utilizate, standardul ISO permite A...Z, a...z, 0...9, _. Restricţii impuse
identificatorilor:
• nu poate fi mai lung de 128 caractere
• trebuie să înceapă cu o literă
• nu poate conţine spaţii libere
interval INTERVAL
74
6.2. Instrucţiuni pentru definirea datelor
CREATE TABLE nume_tabel
(câmp1 tip_dată [NOT NULL],
câmp2 tip_dată [NOT NULL],
câmp3 tip_dată [NOT NULL]...);
Crează un tabel şi defineşte structura unei înregistrări precum şi tipurile de
date asociate câmpurilor. Numele tabelului trebuie să fie unic în BD. Clauza NOT
NULL arată că în câmpul respectiv nu se memorează valori de tip NULL.
ALTER TABLE nume_tabel
ADD nume_câmp tip_dată
Adaugă un câmp la un tabel existent.
DROP TABLE nume_tabel
Şterge complet un tabel din BD.
Exemplu:
1. create table product(p_id number(4) not null, p_desc varchar(25) not
null, cost number(7,2), price number(7,2));
2. alter product add m_id number(4) not null;
3. drop table product;
75
a). In primul caz se adaugă o singură înregistrare într-un tabel,
menţionându-se câmpurile şi valorile acestora. Se utilizează pentru operaţii simple,
care presupun lucrul cu un număr redus de înregistrări.
INSERT INTO nume_tabel (câmp1, câmp2...)
VALUES (valoare1, valoare2...);
Reguli:
• valorile din clauza VALUES vor avea aceeaşi natură cu câmpurile din clauza
INTO
• corespondenţă între câmp1 şi valoare1, etc.
• dacă un câmp are specificaţia NOT NULL, este obligatorie introducerea unei
valori pentru aceasta
b). În al doilea caz, este posibil să se copieze mai multe înregistrări dintr-
un tabel în unul sau mai multe tabele.
INSERT INTO tabel_destinaţie (câmp1, câmp2...)
SELECT câmp1, câmp2...
FROM tabel_sursă
WHERE criteriu_de_adăugare;
Reguli:
• numărul şi natura câmpurilor din clauza INTO să fie aceleaşi cu cele returnate
de instrucţiunea SELECT
• dacă nu se introduce WHERE, toate înregistrările din tabel_sursă vor fi
adăugate în tabel_destinaţie
Interogările de acţiune tip DELETE şterg parţial sau total înregistrările
dintr-un tabel. Nu se foloseşte pentru ştergerea de valori din câmpuri individuale,
ci acţionează asupra înregistrării în totalitatea ei. Dacă se şterg toate înregistrările,
structura de tabel rămâne, ea putând fi eliminată numai cu DROP TABLE.
DELETE FROM nume_tabel
[WHERE criteriu_de_ştergere];
76
Ca şi instrucţiunea INSERT, operaţia de ştergere a înregistrărilor dintr-o
tabelă poate duce la probleme de integritate referenţială în alte tabele.
Interogările de acţiune tip UPDATE pot introduce înregistrări noi şi pot
modifica valorile câmpurilor din înregistrări existente.
UPDATE nume_tabel
SET nume_câmp1=valoare1 [,nume_câmp2=valoare2]...
[WHERE criteriu_de_actualizare];
Ca şi în celelalte locuri unde apare clauza WHERE, restricţionarea se poate
accentua folosind şi operatori logici.
Exemplu:
UPDATE Comunicaţii
SET Reţea=”Orange”
WHERE Reţea=”Dialog” AND Data>'12.12.2011';
77
o serie de atribute separate prin virgulã care vor apãrea în tabela-
rezultat în ordinea explicitatã în linia de comandã, de la stanga la dreapta;
toate atributele din relatia asupra careia se aplica interogarea, în
ordinea în care au fost definite în aceastã relatie (in locul acestei liste se poate
utiliza semnul "*");
expresii formate din urmatoarele elemente:
- atribute şi operatori aritmetici (de exemplu: cantitate*pret_unitar)
- functii standard (de exemplu CONCAT( ));
- constante;
- variabile de memorie.
expresii care contin functii SQL agregat cum ar fi AVG( ), MAX( ),
MIN( ), COUNT( ), SUM( ) ...
Optiunea DISTINCT permite eliminarea tuplelor duplicat. In acest mod
numai prima aparitie a unui tuplu este afisatã în tabela-rezultat.
Exemplu:
"Sa se afiseze toate orasele resedinte ale furnizorilor, dar sa apara fiecare
oras o singura data in tabela-rezultat"
SELECT DISTINCT oras
FROM furnizori;
Aceasta interogare va avea ca rezultat o tabela care contine toate orasele in
care isi au resedinta furnizorii din tabela FURNIZORI, dar fiecare oras va fi afisat
o singura data.
Optiunea ALL permite dimpotrivã, afisarea tuplelor-duplicat. Aceastã
optiune este implicitã.
Clauza FROM are forma generala:
FROM <<nume relatie>/ <nume view>[<alias>] ... >
si specifica relatiile (pot fi şi nume de view) din care vor fi regãsite datele. In cazul
în care se operazã cu mai multe tabele, este utilã atribuirea unor prescurtãri,
(numite alias) numelor de tabele ce vor fi utilizate în interogare.
78
Exemple:
1) "Sa se afiseze codurile furnizorilor şi numerele de comanda
corespunzatoare pentru toti furnizorii care a cel putin o comanda"
SELECT 1.cod_furnizor, B.numar_comanda
FROM furnizori 1, comenzi B
WHERE 1.cod_furnizor=B.cod_furnizor;
2) "Sa se afiseze codurile furnizorilor, numele furnizorilor, cantitatile, şi
numerele comenzilor pentru toti furnizorii care au cel putin o comanda"
SELECT A.cod_furnizor, nume_furnizor, cantitate, numar_comanda
FROM furnizori A, comenzi B
WHERE A.cod_furnizor=B.cod_furnizor
A se observa ca in al doilea exemplu nu s-a mai utilizat notatia cu alias
pentru atributul numar_comanda din tabela comenzi deoarece nu este pericol de
confuzie. In schimb s-a utilizat notatia pentru a deosebi atributul cod_furnizor din
tabela furnizori de atributul cu acelasi nume din tabela comenzi.
Pentru a restrange tuplele ce apar în tabela-rezultat, se specificã o conditie de
cãutare prin utilizarea unui predicat de selectie in clauza WHERE.
Clauza WHERE are forma generala:
WHERE <predicat> / <expresie>;
Numai tuplele care satisfac predicatul de selectie vor fi incluse in tabela-
rezultat. Predicatul de cãutare poate fi specificat printr-o conditie logica in care se
utilizeaza urmatoarele elemente:
operatori:
- aritmetici: + - / *
- relaţionali:< > <= >= <> != =
- logici: NOT AND OR
- operatori SQL: IN, EXISTS, ALL, ANY
sub-interogãri (exprimate prin interogari SQL),cu observatia cã
acestea vor fi primele evaluate şi tabela-rezultat trebuie sã corespundã operatorilor
ce i se aplicã în continuare.
79
Operatorii aritmetici
Ca operanzi, se pot utiliza atribute, constante, functii sau expresii algebrice.
Expresiile algebrice pot aparea in clauzele SELECT sau WHERE.
Exemplu:
"Sa se afiseze codul produsului şi valoarea pe care o reprezinta cantitatea
de produs comandata la diversi furnizori"
SELECT cod_produs, cantitate*pret_unitar
FROM comenzi
WHERE cantitate<>0;
Operatorii relaţionali
< mai mic
> mai mare
! negarea operatorilor <, >, =. Se obtin operatorii: !=(diferit), !<(nu mai
mic), !>(nu mai mare).
<= mai mic sau egal
=> mai mare sau egal
<> diferit
Facem observatia că valorile comparate trebuie să apartină unor tipuri de
date compatibile (care se pot compara intre ele).
Exemplu:
"Sa se afiseze codurile plantelor de culoare alba."
SELECT cod-produs
FROM flori
WHERE culoare='alb':
Operatorii logici
Dacã o clauzã WHERE contine mai multe conditii formate prin utilizarea
aceluiasi tip de oparator logic, evaluarea se va face de la stanga la dreapta. tipul de
operator logic este dat de precedenta operatorilor. Operatorul NOT are cea mai
mare prioritate, urmat de AND şi OR care practic sunt de prioritati egale.
80
Pentru a schimba ordinea de evaluare a unei expresii se utilizeazã
parantezele rotunde ().
Exemple:
1) "Sa se afiseze numele plantelor de culoare alba şi de inaltime minima 50
cm"
SELECT nume_planta
FROM flori
WHERE culoare='alb' AND inaltime<50;
2) "Sa se afiseze numele, culoarea şi inaltimea plantelor care fie au
culoarea alba fie sunt de inaltime mai mica de 50 cm"
SELECT nume_planta, culoare, inaltime
FROM flori
WHERE culoare='alb' OR inaltime<50;
3) A se observa ca ultima interogare este echivalenta cu interogarea
SELECT nume_planta, culoare, inaltime
FROM flori
WHERE culoare='alb' OR NOT inaltime>=50;
81
FROM flori
ORDER BY nume_planta ASC;
A se observa ca daca ar fi lipsit mentiunea ASC, ordinea tuplelor ar fi fost
aceeasi deoarece ordinea ascendenta este implicita.
În loc de precizarea numelui atributului dupã care se face ordonarea, se
poate preciza pozitia atributului în lista de atribute specificate în comanda
SELECT.
Exemplu:
SELECT oras, cod_furnizor, nume_furnizor
FROM furnizori
ORDER BY 1 DESC, 3 ASC;
In urma executiei interogarii se va obtine o tabela cu numele oraselor sortate
descrescator şi pentru fiecare oras, codurile furnizorilor şi apoi numele funizorilor
in ordine alfabetica.
Operatorul IN permite simplificarea predicatului de cãutare.Predicatul IN
testeazã dacã valoarea unui atribut specificat în lista de atribute din clauzaWHERE
se potriveste uneia din valorile listei specificate în predicatul IN (testeazã
apartenenta la o multime).
Exemplu:
"Sa se afiseze toate datele despre furnizorii care au sediul in Chisinau sau in
Balti sau in Calaras"
SELECT *
FROM furnizori
WHERE oras IN ('Chisinau', 'Balti', 'Calaras');
Functii standard
Functiile standard, cunoscute şi sub numele de functii agregat, apar in clauza
SELECT şi se aplica atributelor din tabelele implicate in interogare. Functii
standard sunt:
- valoarea medie - AVG
- valoarea minima - MIN
82
- valoarea maxima - MAX
- total(sumare) - SUM
- numãrãtoare - COUNT
NOTA: Nu este permisa utilizarea acestor functii in clauza WHERE
deoarece ele actioneaza la nivel de atribut şi nu la nivel de tuplu.
Exemple:
1)"Care este cantitatea minima comandata?"
SELECT MIN(cantitate)
FROM comenzi;
Spre exemplu,urmãtoarea interogare are ca rezultat afisarea cantitãtii totale
şi a numãrului de produse din fisierul de comenzi.
SELECT SUM(cantitate), COUNT(*)
FROM comenzi;
2) "Care este cantitatea medie comandata?"
SELECT AVG(cantitate)
FROM comenzi;
3)"Care este cantitatea totala comandata din planta cu cod '202'?"
SELECT SUM(cantitate)
FROM comenzi
WHERE cod_produs='202';
4)"Cate tuple contine tabela de flori?"
SELECT COUNT(*)
FROM flori;
5)"Cate culori de flori sunt inregistrate pentru florile din fisier?"
SELECT COUNT(DISTINCT culoare)
FROM flori;
83
utilizarea clauzelor GROUP BY şi HAVING. Aceste clauze organizeazã tuplele
în grupuri asupra cãrora se pot realiza anumite operatii, în special prin aplicarea
functiilor agregat.
Clauza GROUP BY grupeazã tuplele din relatie dupã atributele cu aceeasi
valoare care sunt specificate în clauzã, şi generezã un singur tuplu pentru fiecare
grup de tuple cu aceeasi valoare pe atribut.
Atributele care apar în clauza SELECT pot fi de douã feluri:
- atribute care alcãtuiesc baza pentru grupare (cele care apar în clauza
GROUP BY)
- atribute care nu participa la gruparea rezultatelor.
Exemplu:
1)"In ce orase exista furnizori ai florariei?"
SELECT oras
FROM furnizori
GROUP BY oras;
In urma executarii interogarii vor apare orasele din fisierul de furnizori
listate o singura data.
2)"Cati furnizori au sediul in fiecare oras?"
SELECT oras, COUNT(*)
FROM furnizori
GROUP BY oras;
3)"In care orase locuiesc cel putin 3 furnizori?"
SELECT oras, COUNT(*)
FROM furnizori
GROUP BY oras
HAVING COUNT(*)>=3;
Clauza GROUP BY se poate folosi şi cu clauzele ORDER BY şi WHERE.
Exemple:
1)"Sa se afiseze in ordine alfabetica orasele in care exista furnizori ai
florariei".
84
SELECT oras
FROM furnizori
GROUP BY oras
ORDER BY oras;
2)"Care furnizori livreaza in interval de cel mult 17 zile?"
SELECT cod_furnizor
FROM comenzi
WHERE timp_livrare<17
GROUP BY cod_furnizor;
85
2)"Sa se afiseze datele de mai sus dar numai pentru furnizorii care au
adresa in Chisinau"
SELECT 1.cod_furnizor, nume_furnizor, cantitate, nr_comanda
FROM furnizori 1, comenzi b
WHERE 1.cod_furnizor=b.cod_furnizor AND oras='Chisinau';
3)"Ce flori au aceeasi inaltime cu laleaua?" A se observa ca aceasta
interogare necesita realizarea produsului cartezian al tabelei FLORI cu ea insasi.
SELECT p1.nume_planta, p2.nume_planta, p1.inaltime, p2.inaltime
FROM flori p1, flori p2
WHERE p1.inaltime=p2.inaltime AND p2.nume_planta='LALEA';
Clauza UNION
Clauza UNION permite realizarea reuniunii de tabele. In cazul cand dorim
sa reunim doua sau mai multe tabele, este obligatoriu ca acestea sa fie descrise de
scheme de relatie identice (acelasi numar de atribute şi corespunzator – de la
stanga la dreapta – atributele din tabele au acelasi nume şi aceeasi descriere).
Aceste conditii sunt impuse tabelelor implicate in operatiile intersectie şi minus
(diferenta). Operatiile reuniune, intersectie şi diferenta de tabele actioneaza analog
cu aceleasi operatii aplicate la multimi.
Forma generala a reuniunii de tabele este:
SELECT A1 ,…, Am
FROM
[WHERE …]
UNION
SELECT A1 ,…, Am
FROM …
[WHERE …]
Exemple:
1)"Sa se afiseze numele plantelor şi codurile plantelor care au inaltimea fie
mai mica decat 20 cm fie mai mare decat 50 cm."
86
SELECT nume_planta, cod_produs
FROM flori
WHERE culoare='alb' AND inaltime<20
UNION
SELECT nume_planta, cod_produs
FROM flori
WHERE culoare='alb' AND inaltime>50;
6.8. Subinterogari
Unul din motivele pentru care SQL este considerat un limbaj puternic de
interogare este acela cã oferã posibilitatea construirii interogãrilor complexe,
formate din mai multe subinterogãri simple.
Aceste interogãri complexe sunt construite prin includerea în clauza
WHERE a inca unei clauze SELECT. Forma generala a unei astfel de constructii
este:
SELECT < lista atribute1 >
FROM < lista relatii1 >
WHERE < subinterogare >
Se observa ca aceasta constructie a fost deja utilizata in exemplul de mai sus
care ilustreaza o clauza UNION.
In constructia de mai sus clauza SELECT interioarã genereazã valorile
pentru conditia de cãutare a clauzei SELECT exterioare care o contine. Clauza
SELECT exterioarã genereazã o relatie pe baza valorilor generate de cãtre clauza
interioarã. Modul de constuire a interogãrii exterioare depinde de numãrul valorilor
returnate de cãtre interogarea interioarã. În acest sens, putem distinge:
- subinterogãri care returneazã o singurã valoare
- subinterogãri care returneazã mai multe valori.
Din punctul de vedere al ordinii de evaluare al interogãrilor putem distinge:
subinterogãri simple
87
Interogarea interioarã este evaluatã prima, independent de interogarea
exterioarã. Rezultatul evaluãrii interogãrii interioare este utilizat de cãtre
interogarea exterioarã .
subinterogãri corelate
Valorile returnate de cãtre interogarea interioarã depind de valorile returnate
de cãtre interogarea exterioarã. Interogarea interioarã este evaluatã repetat pentru
fiecare tuplu cercetat de interogarea exterioara.
Subinterogãri simple care returnezã o singurã valoare
Aceste interogãri au urmãtoarea sintaxã:
SELECT < lista atribute >
FROM < lista relatii >
WHERE < atribut > (< subinterogare >);
unde este un operator relaţional: = <>>= <= !=
Vom considera urmãtorul exemplu:
Exemplu:
1)"Sã se afiseze numele plantelor care au inaltimea egala cu cea a lalelei".
SELECT nume_planta
FROM flori
WHERE inaltime=
(SELECT inaltime
FROM flori
WHERE nume_planta='LALEA');
Aceeasi interogare poate oferi lista numelor de plante in ordine alfabetica
inversa daca se utilizeaza şi o clauza ORDER BY.
SELECT nume_planta
FROM flori
WHERE inaltime=
(SELECT inaltime
FROM flori
WHERE nume_planta='LALEA')
88
ORDER BY nume_planta DESC;
Procesul de evaluare a acestei interogãri se desfãsoarã astfel:
Se evalueazã în primul rînd interogarea interioarã. Conditia de evaluare a
interogãrii interioare este nume_planta='LALEA'.
Valoarea obtinuta pentru atributul inaltime (sa presupunem ca laleaua are 30
cm) este stocata într-o tabela temporara. Rezultatul evaluãrii interogãrii interioare
devine conditie de cãutare pentru interogarea exterioarã, care ar putea fi exprimata
in aceasta faza ca:
SELECT nume_planta
FORM flori
WHERE inaltime=30;
In urma executarii interogarii exterioare este creatã o relatie finalã, ce va
contine tuplele a cãror inaltime este aceeasi cu valoarea stocata în tabela
temporarã.
Interogarea interioarã poate contine în clauza WHERE şi conditii complexe,
formate prin utilizarea operatorilor logici (NOT, AND, OR) şi a functiilor agregat
(AVG, MAX, …).
Exemplu:
"Sa se afiseze numele plantelor care au inaltimea minima"
SELECT nume_planta
FORM flori
WHERE inaltime=
(SELECT MIN(inaltime)
FROM flori);
Subinterogãri simple care returnezã mai multe valori
Principiul de construire a acestui tip de interogare imbricatã utilizeazã în
clauza WHERE conditii, care evaluate, genereazã o multime de valori. In aceastã
categorie intrã operatorii (NOT) IN, (NOT) ANY, (NOT) ALL, (NOT) EXISTS.
Exemplu:
1)"Care furnizori mai au inca de executat livrari?"
89
SELECT nume_furnizor
FROM furnizori
WHERE cod_furnizor IN
(SELECT cod_furnizor
FROM comenzi
GROUP BY cod_furnizor);
2)"Care furnizori, dintre furnizorii obisnuiti ai florariei, nu mai au nimic de
livrat?"
SELECT nume_furnizor
FROM furnizori
WHERE cod_furnizor NOT IN
(SELECT cod_furnizor
FROM comenzi
GROUP BY cod_furnizor);
A se observa ca cele doua interogari difera doar prin operatorul logic NOT.
De asemenea se poate remarca faptul ca prima interogare aminteste de apartenenta
din teoria multimilor iar a doua interogare corespunde operatiei minus (diferenta).
Daca versiunea SQL nu are un cuvant rezervat pentru operatia diferenta intre
tabele, se poate constru aceasta operatie cu ajutorul preicatului NOT IN ca in
exemplul de mai sus.
3)"Care furnizori au numarul maxim de comenzi de flori?"
SELECT nume_furnizor
FROM furnizori
WHERE cod_furnizor IN
(SELECT cod_furnizor
FROM comenzi
GROUP BY cod_furnizor
HAVING COUNT(*)=
(SELECT MAX(COUNT(cod_furnizor))
FROM comenzi
90
GROUP BY cod_furnizor));
Subinterogãri corelate
În exemplele de panã acum, interogarea interioarã era evaluatã prima, dupã
care valoarea sau valorile rezultate erau utilizate de cãtre clauza WHERE din
interogarea exterioarã.
Exista şi o alt forma de subinterogare şi anume subinterogarea corelatã,
caz în care interogarea exterioarã transmite repetat cîte o valoare pentru interogarea
interioarã.
De fiecare datã cînd este transmisã o valoare, este evaluatã interogarea
interioarã. Dacã ambele interogãri acceseazã acelasi tabel, trebuie asigurate alias-
uri pentru fiecare referintã la tabelul respectiv. Ambele interogãri accesezã tuple
diferite din acelasi tabel în acelasi moment.
Exemplu:
"Sa se afiseze culoarea, inaltimea şi numele plantelor pentru plantele cu
inaltimea maxima, ordonate dupa culoare"
SELECT culoare, inaltime, nume_planta
FROM flori f
WHERE inaltime=
(SELECT MAX(inaltime)
FROM flori
WHERE culoare=f.culoare)
ORDER BY culoare;
A se observa ca şi interogarea anterioara se poate incadra in cazul ilustrat de
exemplul de mai sus.
91
= ANY si IN
!= ANY si NOT IN
Operatorul ALL returneazã tuplele pentru care valorile atributului din clauza
WHERE sunt mai mici, mai mari, mai mici sau egale, etc. … decat toate valorile
generate de interogarea interioarã. Sã facem observatia cã acest operator nu poate
fi utilizat cu operatorul relaţional =, ceea ce ar corespunde cazului banal în care
toate valorile din listã sunt identice:
Pentru a stabili mai exact modul in care se selecteaza valorile cu operatorii
ANY şi ALL dam mai jos o serie de cazuri concrete.
Sa presupunem ca interogarea este de forma:
SELECT …
FROM …
WHERE x < ALL (1, 2, 3, 4)
Sa observam ca daca inlocuim operatorul ALL cu expresia verbala toate
putem citi "Valorile lui x trebuie sa fie mai mici decat toate valorile din paranteza
ce urmeaza dupa ALL."
Atunci vom lua in considerare urmatoarele situatii:
93
FROM flori
WHERE inaltime>=50);
94
BIBLIOGRAFIE
95