Documente Academic
Documente Profesional
Documente Cultură
Există mai multe încercări de clasificare a limbajelor de programare. Unii autori consideră
semnificative două clase: limbajele procedurale şi limbajele neprocedurale. În clasa limbajelor
neprocedurale ar intra şi limbajele specializate (orientate pe problemă), de exemplu limbajele
de simulare (GPSS, SIMULA, SYMSCRIPT etc.). Există limbaje specializate, de exemplu: sistemele
software specializate pentru calcul numeric (MATLAB, MATHCAD, MATHEMATICA, MAPLE etc.),
sistemele software specializate pentru calcule statistice (SPSS, STATISTICA, etc.), care conţin şi
1
elemente de limbaj procedural prin care utilizatorul poate interveni în descrierea algoritmului
de rezolvare a problemei.
2
deoarece structurile de control existente nu permit aplicarea principiilor programării
structurate, iar folosirea în exces a instrucţiunii de salt necondiţionat GOTO poate genera un stil
de programare necorespunzător. Alte variante sunt QBasic, GWBasic, Basic2 şi altele. O
variantă evoluată de BASIC este Visual Basic, creată de către compania Microsoft şi care se
adresează programatorilor mai avansați. Limbajul Visual Basic permite crearea de aplicații
relativ complexe prin manipularea componentelor vizuale (grafice) ale programelor.
(1971) PASCAL
Limbajul Pascal a fost dezvoltat de Niklaus Wirth de la Universitatea Tehnică din Zürich. A fost
denumit astfel în onoarea matematicianului, fizicianului şi filosofului francez Blaise Pascal
(1623-1662), care construieşte în 1642 un calculator mecanic numit Pascaline. Limbajul Pascal
permite programarea structurată, este apropiat de limbajul natural (limba engleză) şi are o
sintaxă simplă. Deoarece este foarte asemănător limbajului algoritmic, prin formarea unui mod
de gândire structurat, devine un instrument important de comunicare în mediul universitar.
Limbajul Pascal este un limbaj de programare procedural imperativ. Cele mai populare
implementări ale acestui limbaj au fost Turbo Pascal și Borland Pascal, ambele ale firmei
Borland. Profesorul Niklaus Wirth a sintetizat în următoarea ecuaţie conceptul de program scris
într-un limbaj de programare procedural imperativ : algoritmi + structuri de date = programe.
(1972) C
A fost dezvoltat în Laboratoarele Bell de către Denis Ritchie pentru a avea un limbaj simplu și
portabil pentru scrierea sistemului de operare UNIX. Limbajul operează în strânsă legătură cu
hardware-ul, fiind cel mai apropiat de limbajul de asamblare, față de majoritatea celorlalte
limbaje de programare. Sintaxa limbajului C a stat la baza multor limbaje create ulterior: C++,
Java, JavaScript.
(1979) ADA
Numele limbajului este dat în memoria primei femei programator din lume, Augusta Ada Byron,
contesă de Lovelace, fiica lordului Byron și asistenta lui Charles Babbage. Ideea realizării acestui
limbaj este dată de constatarea că în Departamentul Apărării a SUA erau implementate în
deceniul opt peste 450 de limbaje de programare, inclusiv “dialecte” şi variante. Proiectul vast,
costisitor şi ambiţios de a construi “un PL/I al anilor ’80” a condus la realizarea şi standardizarea
limbajului ADA pentru a fi utilizat în aplicaţiile software ale Penatgonului. Limbajul a fost
proiectat pornind de la limbajul Pascal, este orientat spre programare modulară, are o mare
elasticitate în ceea ce privește tipurile de date şi aduce o abordare nouă pentru tratarea
excepțiilor program. Implementările pe diverse arhitecturi sunt însoțite și de instrumente de
ingineria programării. Aşteptarea ca limbajul ADA să devină unul din principalele limbaje de
programare utilizate în mod curent, la fel ca şi în cazul limbajului PL/I, nu s-a realizat.
(1983) C++
A fost realizat de Bjarne Stroustrup la Bell Labs ca o serie de îmbunătățiri ale limbajului C. Este
un limbaj procedural care permite programarea orientată pe obiecte. Devine unul dintre cela
mai populare limbaje de programare. Limbajul de programare C++ a fost standardizat în 1998.
3
(1989) SQL – Structured Query Language
SQL este un limbaj de programare neprocedural bazat pe algebra relaţională, pentru
manipularea datelor în sistemele de gestiune a bazelor de date relaționale. Permite inserarea
datelor, actualizarea și ștergere, modificarea și crearea schemelor, controlul accesului la date şi
formularea interogărilor. A devenit un standard în domeniu, fiind cel mai popular limbaj de
interogare utilizat în SGBD-urile relaționale.
4
Un pachet adițional, Simulink, oferă posibilitatea de a realiza modele matematice de simulare
pentru sistemele dinamice.
Limbajele apărute după 1990, sunt în general legate de dezvoltarea noilor tehnologii web, a
aplicaţiilor pe Internet.
(1995) JAVA
Java este un limbaj de programare orientat-obiect. A fost dezvoltat de către James Gosling la
Sun Microsystems (în prezent filială Oracle). În Java sunt realizate multe aplicaţii web, iar noile
evoluţii tehnologice permit utilizarea sa şi pe dispozitivele mobile. Un program Java compilat,
corect scris, poate fi rulat fără modificări pe orice platformă pe care este instalată o mașină
virtuală JVM (Java Virtual Machine). Are un mare nivel de portabilitate datorită modalităţii de
translatare în două faze, care va fi prezentată în paragraful următor.
1
Prima lucrare în limba română apare în 1994 la Editura Tehnică - MathCAD Prezentare şi probleme
rezolvate, autori Ernest Scheiber şi Dorin Lixăndroiu.
5
Internet. Aceste fişiere pot fi create utilizând orice editor de texte, afişate şi modificate pe orice
calculator cu orice sistem de operare.
Limbajul de programare apare ca un intermediar între sistemul real în care a apărut problema
de rezolvat şi sistemul de calcul. În această idee, fiecare element al limbajului de programare
trebuie văzut simultan din două puncte de vedere:
- logic (punctul de vedere al problemei), adică ce reprezentăm din problemă cu ajutorul
elementului din limbaj;
- fizic (punctul de vedere al implementării), adică ce realizează calculatorul la execuţia
elementului din limbaj.
Utilizarea unui program scris într-un limbaj de programare de nivel înalt devine posibilă prin
activarea unui program de translatare (program de traducere) care traduce şi converteşte în
una sau mai multe etape programul iniţial, într-un limbaj de nivel inferior acceptat de
calculatorul pe care se doreşte execuţia programului.
Problema
modelare
Algoritmul
problemei
limbaj de programare
Program
6
Translatarea se poate realiza în 3 moduri:
modalitatea compilativă – translatarea este efectuată înaintea execuţiei de un program
specializat numit compilator; programul scris în limbaj sursă (program sursă) este
tradus într-un program obiect echivalent cu cel iniţial ce poate fi executat direct
de procesor. Avantaj: execuţie rapidă. Dezavantaj: programul obiect (executabil)
obţinut în urma compilării într-un format de nivel scăzut (cod maşină) nu poate fi
rulat decât pe platforma pe care a fost compilat.
Exemple de limbaje cu compilator: Pascal, C,...
modalitatea interpretativă - translatarea este efectuată în cursul procesului de execuţie de
un interpretor. Fiecare instrucţiune din programul sursă este interpretată
(tradusă) şi executată. De exemplu, în cazul unei instrucţiuni de ciclare
interpretarea este repetată la fiecare reluare a ciclului. Avantaj: simplitate.
Dezavantaj: viteza de execuţie redusă.
Exemplu de limbaj cu interpretor: Basic.
modalitatea translatării în două faze – în prima fază programul sursă este tradus într-un cod
intermediar (cod de octeţi) care apoi este rulat pe o maşină virtuală. Prima fază
corespunde compilării, iar cea de-a doua fază corespunde interpretării codului
de octeţi generat, care este asemănător codului scris într-un limbaj de
asamblare. De aici, avantajul acestui cod care este interpretat în mediul de
execuţie al limbajului de programare şi poate fi rulat pe orice platformă care
foloseşte acest mediu.
Exemplu de limbaj cu translatare în două faze (compilare şi interpretare): Java cu
mediu de execuţie maşina virtuală Java (JVM). JVM interpretează codul
precompilat şi îl va rula sub forma unei aplicaţii.
7
4.3. COMPILATOARE
În cazul existenţei unui program de translatare (compilator) execuţia unui program scris în
limbaj de programare (program sursă) presupune într-o primă etapă compilarea programului,
urmată de lansarea în execuţie.
Datele de intrare
Compilatorul este un program complex, care realizează printr-un şir de transformări succesive
trecerea programului sursă în program obiect.
În figura 4.3 se prezintă modelul unui compilator, din care rezultă fazele procesului de
compilare.
8
Programul sursă
Analiza lexicală
Şir de entităţi
Analiza
Analiza sintactică erorilor
Arbore sintactic
Gestiunea
tabelelor Analiza semantică
Cod intermediar
Optimizarea de cod
Generarea de cod
Programul obiect
1) Analiza lexicală este realizată de analizorul lexical, parte a compilatorului, care admite
la intrare şirul simbolurilor din programul sursă şi produce la ieşire un şir de entităţi.
2) Analiza sintactică este realizată de analizorul sintactic, parte a compilatorului, care
admite la intrare şirul entităţilor furnizate de analizorul lexical şi produce la ieşire o
reprezentare a structurii sintactice (expresii, liste, instrucţiuni, proceduri etc.).
Structurile sintactice identificate sunt plasate într-un arbore sintactic, care reflectă
relaţiile existente între structuri. Analiza sintactică verifică dacă şirul entităţilor este
corect, în sensul respectării definiţiilor sintactice.
3) Analiza semantică este realizată de generatorul de cod, parte a compilatorului, care
admite la intrare reprezentarea structurii sintactice a programului sursă. Prin
parcurgerea arborelui sintactic se extrag informaţii privind apariţia obiectelor
purtătoare de date din program (ex. variabile, proceduri etc.) şi se verifică consistenţa
utilizării lor. Se obţine o translatare a programului sursă în cod intermediar, care este o
succesiune de instrucţiuni simple (similare macroinstrucţiunilor unui limbaj de
asamblare) direct executabile de calculator.
4) Optimizarea codului este realizată de optimizator, parte a compilatorului, care admite
la intrare forma în cod intermediar a programului sursă şi produce la ieşire o transcriere
eficientă a acestuia. Optimizarea constă în eliminarea redundanţelor, a calculelor şi
variabilelor inutile în scopul unei execuţii mai eficiente prin reducerea memoriei
ocupate şi a timpului de execuţie.
9
5) Generarea finală a codului este realizată de asamblor, parte a compilatorului, care
admite la intrare transcrierea eficientă a programului sursă translatat şi produce la
ieşire programul obiect (forma direct executabilă).
6) Gestiunea tabelelor este o colecţie de proceduri ce crează şi actualizează baza de date
cu care se lucrează în diferitele faze ale compilării.
7) Analiza erorilor este o colecţie de proceduri care sunt activate în momentul apariţiei
unei erori în program. În urma detectării sunt transmise utilizatorului mesaje de eroare
pentru a efectua corecţiile necesare şi se revine din eroare, adică, pe cât posibil,
procesul de compilare continuă până la epuizarea textului sursă, astfel încât numărul de
compilări necesare eliminării tuturor erorilor dintr-un program să fie cât mai mic.
Practic, există erori specifice fiecărei faze de compilare.
10
ELEMENTE DE TEORIA LIMBAJELOR FORMALE
Definiţia 4.2. Dacă a1a2 ...ar şi b1b2 ... bp sunt două cuvinte, funcţia c : V V V definită
prin c a1a2 ...ar , b1b2 ... bp a1a2 ...ar b1b2 ... bp se numeşte operaţie de concatenare. Avem
evident xy x y . Cuvântul vid este elementul neutru pentru operaţia de concatenare.
Tradus în termenii unui limbaj de programare problema apartenenţei constă în a decide dacă
un şir de simboluri din alfabetul limbajului formează un program corect sau nu. Această
problemă trebuie rezolvată de orice compilator.
Pentru a studia un limbaj acesta trebuie specificat într-un anumit mod. Dacă limbajul L este
finit, specificarea se poate face prin enumerarea tuturor cuvintelor limbajului şi atunci, evident,
problema apartenenţei unui cuvînt la limbaj este rezolvată – L este decidabil.
Dacă L este infinit studiul limbajului presupune definirea unor proprietăţi a cuvintelor şi a unor
reguli de formare a propoziţiilor. În acest caz, o metodă de a reprezenta limbajul L este
sistemul generator numit gramatică. Orice cuvânt din L se poate construi prin metode bine
definite, folosind regulile gramaticii, numite şi producţii.
1
O gramatică G pentru un limbaj L foloseşte două mulţimi finite şi disjuncte de simboluri:
VT - simboluri terminale (ireductibile), reprezintă chiar alfabetul V pe care L este definit;
VN - simboluri neterminale (variabile sintactice), sunt folosite în procesul de generare a
cuvintelor limbajului.
Exemplu
Gramatica G este definită astfel:
G S , X ,Y ,a , b , c , d, S , P
unde: VN S , X ,Y
VT a , b , c , d
S VN este simbolul de start
P S XY , X a , X b ,Y c ,Y d .
Relaţiile de derivare directă pot fi extinse la relaţii de derivare în k paşi.
k
Notăm o derivare de lungime k, formată dintr-un şir de derivaţii:
1 , 1 2 ,...., k1
Notăm cu relaţia de derivare generală, care spune că în gramatica G, α generează pe
G
(sau derivă din ) în k 1 paşi.
Definiţia 4.5. Numim forme propoziţionale şirurile derivate din simbolul de start (S) al
gramaticii. Formele propoziţionale alcătuite numai din simboluri terminale se numesc
propoziţii.
Definiţia 4.6. Fie gramatica G VN ,VT , S , P . Limbajul generat de gramatica G este format din
mulţimea propoziţiilor LG w | S w . Două gramatici sunt echivalente, dacă generează
G
acelaşi limbaj.
2
Observaţii. Limbajul generat de o gramatică G este format numai din propoziţii care conţin
simboluri din alfabetul terminal VT . Propoziţiile sunt derivabile din simbolul de start (S).
Exemplu
Fie gramatica G definită astfel:
G S,a , b, S , P
unde: VN S
VT a , b
S VN este simbolul de start
P S aSb , S ab .
O propoziţie care aparţine lui L(G) este:
3
S aSb aaSbb aaabbb a 3 b 3 sau notat altfel: S a 3 b 3
Se poate demonstra că limbajul generat de această gramatică este LG a n b n | n 1 .
Noam Chomsky1 introduce în 1959, o clasificare a gramaticilor după forma producţiilor: tipul 1 –
gramatici dependente de context, tipul 2 - gramatici independente de context, tipul 3 –
gramatici regulate. Corespunzător acestor tipuri de gramatici avem clasele limbajelor generate.
Definiţia 4.7. O gramatică G VN ,VT , S , P se numeşte independentă de context (context free)
dacă fiecare producţie este de forma A cu AVN şi VN VT .
Limbajul independent de context, generat de o gramatică independentă de context, reprezintă
modelul utilizat în definirea limbajelor de programare. Se demonstrează că orice limbaj
independent de context este decidabil.
Concluzii. În sensul celor prezentate mai sus, putem spune că un program scris într-un limbaj de
programare este o propoziţie corectă pe un vocabular. Limbajul de programare conţine o
mulţime infinită de propoziţii, care sunt programele realizabile în acest limbaj. Gramatica
limbajului conţine regulile care stabilesc modul de construcţie a propoziţiilor limbajului, adică
regulile care ne permit scrierea programelor.
În general, o formă propoziţională poate fi obţinută prin mai multe derivări considerate
echivalente. Numim derivare stânga, derivarea în care se înlocuieşte la fiecare pas cel mai din
stânga simbol neterminal. Analog, derivarea dreapta se obţine înlocuind la fiecare pas cel mai
din dreapta simbol neterminal.
1
Noam Chomsky (n. 1928, Philadelphia, SUA) este un cunoscut profesor de lingvistică la Massachusetts
Institute of Technology (MIT). Are contribuţii majore în “teoria gramaticii generative” cu aplicaţii directe
în construcţia limbajelor de programare și în domeniul lingvisticii teoretice.
3
Exemplu. Fie gramatica G definită astfel:
G S,a , , ,( , ) , , S , P
unde: VN S
VT a , , ,( , )
S VN este simbolul de start
P S S S , S S S , S S , S a .
S S
x
S S
( )
a
S
S S
+
+
S
a a
S
Figura 4.4. Arborele de derivare
4
Observăm că frontiera arborelui din Figura 4.4. reproduce propoziţia a a a L( G ) .
Aplicaţie.
Fie gramatica independentă de context G VN ,VT , S , P ,
unde: VN S , A , B
VT a , , ,( , )
S VN este simbolul de start
P conţine următoarele producţii (reguli de rescriere):
(1) S S A
(2) S A
(3) A A B
(4) A B
(5) B S
(6) B a
S S A A A B A a A a A B a B B a a B a a S
( 1) ( 2) ( 4) (6) ( 3) ( 4) (6) ( 5) ( 1)
a a S A a a A A a a B A a a a A a a a A B
( 2) ( 4) (6) ( 3) ( 4)
a a a B B a a a a B a a a a a .
(6) (6)
Rezultă că propoziţia a a a a a LG şi deci faza de analiză sintactică a fost parcursă
fără eroare.
5
Analog, aplicând derivări la dreapta obţinem:
S S A S A B S A S S A S A S A S A B
( 1) ( 3) ( 5) ( 1) ( 3) (6)
S A S A a S A S B a S A S a a S A A a a
( 4) (6) ( 2) ( 4)
S A B a a S A a a a S B a a a S a a a a
(6) ( 4) (6) ( 2)
A a a a a B a a a a a a a a a LG .
( 4) (6)
Problema realizării analizei sintactice revine la definirea unui algoritm care să decidă dacă o
propoziţie aparţine sau nu limbajului generat de gramatica G. Un astfel de algoritm poate fi
privit ca o maşină cu operaţii simple, care primeşte la intrare şirul simbolurilor de analizat (care
constituie programul sursă), îl parcurge secvenţial şi în final prin starea în care rămâne,
stabileşte dacă şirul a fost acceptat sau nu. Structura matematică folosită pentru recunoaşterea
(acceptarea) unui program ca aparţinând limbajului de programare în care a fost realizat se
numeşte automat de acceptare.
Pentru a crea o imagine asupra modului de lucru al compilatorului, prezentăm fazele parcurse
pentru translatarea unei instrucţiuni simple de atribuire.
Analiza lexicală
Analiza sintactică
:=
Id1 +
= Id2 = x
:= Id3 12
2:
=
Analiza semantică
6
:=
Tabela informaţii +
Id1
= x
valoare ....... Id2
avans ....... :=
Id3 int-to-real
rata ....... 2:
=
12
Generarea codului
intermediar
Optimizarea codului
Generarea codului
MOVE id3, R2
MULTIPLY 12.0, R2
MOVE id2, R1
ADDITION R2, R1
MOVE R1, id1
Comentarii
Analiza lexicală - se parcurge şirul simbolurilor din instrucţiunea de atribuire şi se
constată că din punct de vedere lexical instrucţiunea este corectă, se găseşte un şir de
entităţi format din 3 identificatori (id1, id2, id3) şi o constantă (12).
Analiza sintactică pleacă de la şirul entităţilor furnizate de analizorul lexical şi produce o
reprezentare a structurii sintactice sub formă de arbore de derivare (o reprezentare
grafică a derivării). Se constată că şirul entităţilor este corect, în sensul respectării
7
definiţiei sintactice de construcţie a unei instrucţiuni de atribuire, cu alte cuvinte,
instrucţiunea de atribuire este corectă.
Analiza semantică impune schimbarea reprezentării întregi a valorii 12 în formatul de
reprezentare a numerelor reale. Se realizează prin funcţia de conversie int-to-real
(integer to real). Această conversie este necesară pentru a putea evalua o expresie de
forma: real := real x real.
Generarea codului intermediar presupune execuţia secvenţei:
temp1 := integer-to-real (12)
temp2 := id3 x temp1
temp3 := id2 + temp2
id1 := temp3
unde temp1, temp2, temp3 sunt variabile temporare.
Se obţine: temp1 ← 12.0
temp2 ← rata x 12.0
temp3 ← avans + temp2 (← avans + rata x 12.0)
id1 ← temp3 (← avans + rata x 12.0)
Optimizarea codului presupune o analiză a secvenţei generate anterior. Se observă că
numărul de atribuiri poate fi redus.
Se obţine: temp1 := id3 x 12.0
id1 := id2 + temp1
adică: temp1 ← rata x 12.0
id1 ← avans + rata x 12.0
8
Revenim la secvenţă şi obţinem în urma execuţiei:
R2 ← rata
R2 ← R2 x 12.0 (← rata x 12.0)
R1 ← avans
R1 ← R1 + R2 (← avans + rata x 12.0)
id1 ← R1 (← avans + rata x 12.0)
adică evaluarea instrucţiunii de atribuire:
valoare := avans + rata x 12
BIBLIOGRAFIE
Aho A.V., Sethi R., Ullman J.D. (1986) Compilers: Principles, Techniques, and Tools,
Addison Wesley, Pearson Education, Inc.
Niţchi Ş. (coord.) (2009) Elemente avansate de informatică economică, Editura RisoPrint,
Cluj-Napoca
9
INTRODUCERE ÎN BAZE DE DATE
O colecţie de date reuneşte date despre o anumită clasă de obiecte (reale sau conceptuale). De
exemplu, în domeniul contabilităţii financiare, colecţia de date CONTURI conţine informaţiile
referitoare la clasa de obiecte conturi: simbolul contului (SIMB_CONT), denumirea contului
(DEN_CONT), tipul contului (TIP_CONT), soldul iniţial debitor (SID) şi respectiv soldul iniţial
creditor (SIC). Evident, un cont dat va avea soldul iniţial fie debitor, fie creditor. Pentru
exemplificare, considerăm colecţia de date CONTURI.
Într-o întreprindere sunt identificate mai multe colecţii de date, de exemplu: PERSONAL –
conţine informaţii despre persoanele angajate în firmă;
PRODUSE - conţine informaţii despre produsele realizate;
STOCURI - conţine informaţii despre stocurile existente de materii prime, materiale,
produse finite, etc.
TRANZACŢII - conţine informaţii privind intrările/ieşirile în/din stocuri.
1
Principalele etape ale evoluţiei tehnicilor de organizare şi prelucrare a datelor sunt:
A doua etapă – este marcată de separarea dintre structura logică de date şi structura
fizică. Rezultă independenţa fizică a datelor. În această etapă se utilizează fişiere
secvenţial-indexate, fişiere directe, fişiere inverse, etc. Ca suport de memorare externă
apare discul magnetic.
Se asigură independenţa aplicaţiilor de modificările echipamentelor hardware (bandă,
disc, etc.). Apar primele facilităţi de protecţie a datelor. Apare şi posibilitatea de lucru în
mod conversaţional. O facilitate importantă pusă la dispoziţia utilizatorilor este
generarea automată de rapoarte. Apare o separare (parţială) între modul în care un
fişier este privit de utilizator (nivelul logic) şi modul de memorare pe suportul magnetic
(nivelul fizic).
O caracteristică comună a primelor două etape: fiecare aplicaţie lucrează cu propriile fişiere,
fără a avea nici o legătură cu fişierele utilizate de alte aplicaţii. Aceasta aduce inconvenienţe
majore legate de:
redundanţa datelor - prezenţa aceloraşi date în mai multe fişiere, crează probleme
evidente în operaţiile de actualizare;
inconsistenţa datelor - aceeaşi informaţie este memorată diferit în fişiere diferite (mai
ales când informaţia se modifică);
absenţa unor legături logice între datele din grupuri diferite de fişiere, număr mare de
fişiere, timp mare de prelucrare;
flexibilitate redusă a sistemului la apariţia unei noi aplicaţii.
A treia etapă – este definită de apariţia fişierelor integrate (sisteme de fişiere). Se reduce
redundanţa şi implicit inconsistenţa datelor - aceleaşi date fizice pot fi utilizate în comun
de către mai multe aplicaţii. Apar proceduri care gestionează relaţiile dintre fişierele din
sistem, rezultând astfel o structură logică unitară. Rămân însă deficienţele comune
primelor două etape, legate de gestiunea fişierelor care uneori este realizată cu
programe scrise în diferite limbaje de programare. Structura fişierului trebuie precizată
în programul de gestiune, ceea ce conduce la modificarea programului în cazul
modificării structurii fişierului.
Notă. Structura integrată stă la originea noţiunii de model conceptual (modelul ce conţine
descrierile tuturor datelor şi a legăturilor dintre ele).
În concluzie, sistemele bazate pe fişiere (file based) au următoarele caracteristici:
fiecare program defineşte şi gestionează propriile date;
datele sunt descrise independent în toate fişierele în care apar;
2
fiecare fişier de date este descris în toate programele care îl accesează;
nu există control al accesului şi al manipulării datelor, în afara celui impus prin
programele de aplicaţie.
Din aceste carcateristici decurg următoarele dezavantaje ale organizării datelor după modelul
file based:
redundanţa şi inconsistenţa datelor;
dificultatea accesului – în cazul în care o informaţie este exploatată de mai mulţi
utilizatori, fişierele tradiţionale nu permit accesarea datelor după mai multe criterii
specifice diferiţilor utilizatori sau grupuri de utilizatori;
complexitatea actualizărilor – într-un mediu multiutilizator (multiuser) efectuarea unei
actualizări (modificare, adăugare sau ştergere) poate conduce la situaţii conflictuale
atunci când doi utilizatori vor să modifice simultan aceeaşi dată; acest gen de conflicte
poate fi rezolvat printr-un program supervizor al prelucrărilor;
probleme de securitate – crearea unor mecanisme de protecţie a datelor împotriva
accesului neautorizat este dificilă;
asigurarea integrităţii datelor – presupune crearea unor proceduri de analiză a
restricţiilor semantice la care sunt supuse datele; acestea formează mecanismul de
integritate;
dificultatea de a obţine răspunsuri rapide la probleme ad-hoc simple – presupune
realizarea unor programe utilizând limbaje procedurale pentru a obţine răspunsul la o
interogare;
inflexibilitatea faţă de schimbările ulterioare din sistemul informaţional;
costul ridicat – datorat gradului de redundanţă a datelor şi efortului necesar
interconectării fişierelor de date pentru a realiza un nivel minim de integritate şi
securitate a datelor.
A patra etapă – este etapa bazelor de date. Sintagma bază de date apare în anul 1964,
în titlul conferinţei Development and Management of a Computer – Centered Data
Base organizată la Santa Monica (California) de System Development Corporation.
Momentul consacrării termenului DATA BASE este 1969, când la CODASYL (Conference
On DAta SYstems Language) se prezintă într-un raport conceptul de bază de date.
3
1.2. BAZE DE DATE - CONCEPTE GENERALE
Definiţia 1.1. DATA reprezintă înregistrarea unei observaţii, obiect, fenomen, imagine, sunet sau
text, într-o formă convenabilă unei prelucrări, interpretări sau transmiteri prin mijloacele
informaticii. Datele reprezintă aspecte elementare nesupuse unei prelucrări şi neevaluate din
punct de vedere al utilităţii.
Definiţia 1.2. INFORMAŢIA este semnificaţia ce poate fi ataşată sau poate fi dedusă dintr-un
ansamblu de date pe baza corelaţiilor dintre acestea, având un scop bine determinat, de
satisfacere a cerinţelor utilizatorilor.
Definiţia 1.3. BAZA DE DATE (Database) este un ansamblu structurat de colecţii de date
operaţionale înregistrate pe suport adresabil, aflate în interdependenţă logică, împreună cu
descrierea datelor şi a relaţiilor dintre ele şi care sunt prelucrate în aplicaţiile informatice ale
unei organizaţii. Baza de date permite operaţii de introducere, ştergere, actualizare şi
interogare a datelor.
BAZE DE DATE ANALITICE - sunt utilizate mai ales în aplicaţiile de prelucrare analitică on-line
(on-line analytical processing – OLAP), când este necesară stocarea şi urmărirea datelor istorice
şi dependente de timp. Sunt importante cînd este necesară urmărirea tendinţelor, vizualizarea
datelor statistice pe o perioadă mai lungă de timp sau efectuarea unor previziuni tactice sau
strategice de afaceri. Datele stocate într-o bază de date analitică sunt de tip static, adică nu se
4
modifică niciodată (sau foarte rar). Bazele de date analitice utilizează frecvent bazele de date
operaţionale ca sursă principală de date.
5
Utilizatorii bazei de date sunt:
Utilizatorii finali (nespecialişti) accesează baza de date prin intermediul unui program de
aplicaţie care le dă drepturi limitate de acces la date pentru anumite operaţii de
prelucrare; utilizatorii finali, în general, efectuează un număr mare de operaţii
tranzacţionale asupra bazei de date utilizând interfeţe de comunicare cu baza de date
apropiate de limbajul natural, dar nu cunosc structura bazei de date şi nici modul efectiv
de lucru cu baza de date.
Arhitectura internă a unui sistem de baze de date (figura 1.1) - conţine trei nive niveluri de
abstractizare şi percepţie a datelor, introduse în anul 1975, prin raportul ANSI/SPARC DBMS –
Report of the Study Group on Data Base Management Systems (Acronimul ANSI/SPARC
înseamnă American National Standards Institute / Standards Planning And Requirements
Committee):
Nivelul extern (External Schema, User’ View) – este nivelul logic al utilizatorului
individual, care este cel mai apropiat de utilizator. Acesta poate fi un programator de
aplicaţii (administratorul aplicaţiei) sau un utilizator final. Fiecare utilizator are la
dispoziţie un limbaj:
- pentru programatorul de aplicaţii (administratorul aplicaţiei) limbajul poate fi Java,
C++, PL/I, etc.
- pentru utilizatorul final limbajul va fi ori unul de interogare (SQL), ori unul specializat
adaptat cerinţelor utilizatorului.
6
Un sistem de baze de date acceptă mai multe limbaje gazdă. Un sublimbaj de date (DSL
– Data SubLanguage) este un subset al limbajului complet, care se referă în mod specific
la obiectele şi operaţiile bazei de date. Sublimbajul de date este înglobat în limbajul
gazdă corespunzător. Unul dintre sublimbajele de date acceptat de către majoritatea
sistemelor curente este SQL. Limbajul SQL, care va fi prezentat în Capitolul 4, poate fi
folosit interactiv, ca limbaj de interogare autonom, cât şi înglobat în alte limbaje, cum ar
fi Java, C++, PL/I, etc.
De exemplu, sistemul de baze de date Oracle are 6 precompilatoare (C, Pascal, Ada,
Cobol, Pl/1, Fortran) care permit includerea de instrucţiuni SQL sau blocuri PL/SQL în
programele scrise în limbajele gazdă.
Orice sublimbaj de date conţine două limbaje subordonate:
- un limbaj de definire a datelor (DDL –Description Data Language) pentru definirea
obiectelor bazei de date;
- un limbaj de manipulare a datelor (DML – Data Manipulation Language) care
realizează prelucrarea acestor obiecte.
7
Utilizator A1 Utilizator A2 Utilizator B1
Schema Schema
externă A - Vederea externă externă B - Vederea externă
interfaţa cu A interfaţa cu B
utilizatorul utilizatorul
Corespondenţa extern/
conceptual pentru B
Corespondenţa extern/
conceptual pentru A
Schema Vederea
conceptuală conceptuală
Sistemul de
Corespondenţa
gestiune a
conceptual/intern
bazelor de date
(SGBD)
Definiţia
structurii de
stocare Baza de date stocată
(schema
(vederea internă)
internă)
8
Curs 5 Baze de date – Modelele de date specializate
Modelele de date specializate sunt modelul ierarhic, modelul rețea, modelul relațional,
modelul obiect si modelul obiect-relațional.
Modelul de date ierarhic – în modelul ierarhic o baza de date se reprezintă print-o
structură ierarhică de înregistrări de date conectate prin legături. Modelul de date
ierarhic a fost primul model folosit pentru dezvoltarea bazelor de date. Cel mai
cunoscut SGBD ierarhic este sistemul IMS (information management system) si a fost
dezvoltat de IBM in cadrul programului de cercetări spațiale Apollo in anii 1960. O
inregistrare de date in modelul ierarhic este o instanta a unui tip de inregistrare si constă
dintr-o colectie de campuri, fiecare camp continand valoarea unui atribut. Un tip de
inregistrare corespunde unui tip de entitate iar o inregistrare corespunde unei entități
din modelul entitate-asociere. Un tip de legatura in modelul ierarhic este un tip de
asociere cu raportul de cardinalitate 1 la n intre doua tipuri de inregistrari. Tipul de
inregistrare din partea 1 a asocierii este numit tip de inregistrare parinte iar tipul din
partea cu multiplicitatea n a asocierii este numit tip de inregistrare fiu. Schema
conceptuala a unei baze de date ierarhice se reprezinta printr-un nr de scheme ierarhice.
O schema ierarhica este un arbore directionat reprezentat pe mai multe niveluri in care
nodurile sunt tipurile de inregistrari iar arcele sunt tipuri de legaturi. Fiecare nod cu
exceptia nodului radacina are o singura legatura catre un nod de nivel superior. Fiecare
nod cu except nodurilor frunza are una sau mai multe legaturi catre nodurile de pe
nivelul imediat inferior adica nodurile fii. In concluzie se poate stabili o corespondenta
intre o schema conceptuala ierarhica si o diagrama entitate-asociere dupa cum
urmeaza: tipurile de inregistrari corespund tipurilor de entitati iar tipurile de legaturi
corespund tipurilor de asocieri. In modelul ierarhic nu sunt admise decat legaturi de tip
parinte-fiu care corespund asocierilor 1 la 1 si asocierilor 1 la n din modelul entitate
asociere. Asocierile n la n din modelul entitate-asociere nu se pot reprezenta in mod
direct in modelul ierarhic ci doar prin multiplicarea inregistarilor de tip fiu atunci cand
sunt referite de mai multe inregistrari de tip parinte. Acest lucru conduce la o mare
redundanta a datelor (datele respective sunt multiplicate de mai multe ori).
Implementarea modelului ierarhic se realizeaza prin memorarea explicita a tuturor
legaturilor de tip parinte-fiu astfel in fiecare inregistrare de tip parinte se memoreaza
lista adreselor la inregistrarile fiu cu care aceasta este asociata. De aceea, in modelul
ierarhic nu se pot rezolva decat acele interogari pentru care au fost prevazute in mod
explicit legaturile necesare. Avantajele acestui model sunt simplitatea si eficienta de
calcul dar datorita redundantei foarte mari a datelor astazi acest model nu mai este
folosit.
Modelul de date retea: acest model foloseste o structura de graf pentru definirea
schemei conceptuale a bazei de date. Nodurile grafului sunt tipuri de entitati iar
muchiile grafului reprezinta asocierile dintre tipurile de entitati.
Deosebirea fata de modelul ierarhic consta in aceea ca in modelul retea, asocierile n la
n se reprezint afara duplicarea inregistrarilor, fiecare inregistrare putand fi referita de
mai multe inregistrari ceea ce elimina redundanta datelor. La fel ca si in modelul
ierarhic, un mare dezavantaj este ca fiecare interogare trebuie sa fie prevazuta inca din
faza de proiectare prin memorarea explicita a legaturilor intre tipurile de entitati. In
plus, in cazul modelului retea, complexitatea reprezentarii datelor este deosebit de
ridicata. Azi modelul de date retea este foarte putin utilizat de BD de uz general.
Primele generatii de realitate virtuala cu scene tridimensionale se bazau pe modelul de
date retea pentru stocarea bazelor de date grafice.
Modelul de date relational: modelul relational se bazeaza pe notiunea de relatie din
matematica care corespunde unei multimi de entitati de acelasi tip si are o reprezentare
usor de inteles, de manipulat ce consta dintr-o tabela bidimensionala compusa din linii
si coloane. Fiecare linie din tabela reprezinta o entitate si este compusa din multimea
valorilor atributelor entitatii repsective, fiecare atribut corespunzand unei coloane a
tabelei. Modelul de date relational a fost propus de cercetatorul E.F.Cod din cadrul
companiei IBM la inceputul anilor 1970. Chiar daca notiunile de relatie tabela difera
in esenta lor, pentru ca relatia este o multime de entitati iar tabela este o reprezentare
vizuala a acesteia, cele doua denumiri se pot folosi in general in mod interschimbabil.
Principalele caracteristici ale modelului de date relational: datele sunt percepute de
utilizatori ca tabele din numai ca tabele; operatorii care pot fi folositi pentru prelucrarea
datelor genereaza o tabela rezultat din tabelelele operanti; asocierea dintre tabele se
realizeaza prin intermediul egalitatii valorilor unor atribute comune ce permite
rezolvarea oricarei interogari fara sa fie necesar sa se prevada legaturi explicite in cazul
modelelor prerelational. Prin SGBD relationale intelegem acele sisteme de gestiune
construite pe modelul relational cum ar fi Microsoft Access, Oracle, MySQL,
SQLServer etc. Un mare avantaj al modelului de date relational il reprezinta faptul ca
datele pot fi manipulate cu ajutorul unui limbaj comun numit SQL.
Modelul orientat obiect – modelul obiect este un concept unificator in stiinta
calculatoarelor si este aplicabil in programare, in proiectarea hardware-ului, a
interfetelor sau bazelor de date. Sistemele de BD orientate obiect se bazeaza pe limbaje
de programare orientate obiect cu capacitati de persistenta in care datele sunt
independente de tipul de viata al programelor care le creeaza sau acceseaza prim
memorare pe calculator. In practica, exista unele domenii in care modelul relational s-
a dovedit insuficient cum ar fi sisteme GPS, medicina etc. In programarea orientat
obiect, programele sunt organizate ca si colectii de obiecte, fiecare obiect fiind o
instanta a unei clase, fiecare clasa reprezinta abstractizarea unui tip de entitate din
realitatea modelata, iar clasele sunt membre ale unei ierarhii de clase corelate intre ele
prin relatii de mostenire. Orice obiect este incapsulat, ceea ce ca inseamna
reprezentarea lui nu este vizibila utilizatorilor care au acces doar la functiile pe care
acel obiect este capabil sa le execute. Principalul avantaj al acestui model de date il
reprezinta capacitatea lor de a definii si manevra tipuri de date complexe care se pot
extinde prin mecanismul de mostenire. Principalul dezavantaj il reprezinta faptul ca
programatorii trebuie sa prevada in structura obiectelor toate asocierile necesare tuturor
interogarilor.
Modelul de date obiect-relational: acest model reprezinta extinderea modelului
relational cu caracteristici ale modelului obiect extinderea necesara pentru realizarea
BD care definesc si prelucreaza tipuri de date complexe. Acest model pastreaza
structura datelor in relatii sau tabele dar adauga posibilitatea definirii unor noi tipuri de
date pentru domeniile de valori ale atributelor. Tipurile de date definite de utilizator
pot fi extinse prin mecanismul de moștenire. In general aceste modele se realizeaza
prin extinderea sistemelor relationale, adaugandu-se caracteristici ale modelului obiect
dar pastrand toate caracteristicile modelului relational.
Curs 6 Baze de Date – Baze de date relationale
Modelul relational a aparut in 1970, si pana la acest moment este cel mai
raspandit model de date, astfel incat majoritatea sistemelor de baze de date astazi
folosesc modelul de date relational. Modelul relational se caracterizeaza prin
simplitate si precizia modului de definire a elementelor de baza precum si un
suport teoretic substantial pentru realizarea bazelor de date relationale.
(relatie=tabela)
O baza de date relationala este compusa dintr-o multime finita de relatii,
fiecare relatie reprezentand un tip de entitate sau o asociere intre doua sau mai
multe tipuri de entitati. Exemplu – baza de date pentru administrarea unei
biblioteci cuprinde relatiile carti (titlu, autor, an aparitie, cod editura), edituri (cod
editura, denumire, adresa, telefon) si imprumuturi (nr inmprumut, cod carte, cod
abonat, data imprumutului si data returului)
Din definitia bazei de date rezulta ca intr-o baza de date, fiecare relatie este
unica deoarece am spus ca baza de date este o multime de relatii. Orice relatie se
defineste prin intermediul atributelor sale (Exemplu – relatia carti se defineste
prin atributele cod carte, titlu, autor, an aparitie, cod editura). Atributele unei
relatii sunt atributele tipului de entitate sau de asociere pe care il reprezinta relatia
respectiva. Fiecare atribut al unei relatii are un domeniu de definitie si poate lua
o singura valoare din domeniul sau de definitie pentru fiecare tuplu al relatiei
(linie). Domeniul de definitie reprezinta o multime de valori si atributul nostru isi
poate lua valoarea doar din acel domeniu.
Un domeniu de definitie este o multime, un nume de valori atomice de
acelasi tip, avand o anumita semnificatie din care isi iau valori atributele relatiei.
Nu trebuie confundata atomicitatea din punct de vedere semantic a valorii unui
atribut cu atomicitatea structurii de date prin care se reprezinta valoarea acelui
atribut in memoria calculatorului. De exemplu, un atribut care desemneaza un
nume de persoana se reprezinta printr-un sir de caractere care poate fi descompus
in elementele componente, adica in caractere, dar sistemul de gestiune nu atribuie
nici o semnificatie unui element separat, ci numai intregului sir de caractere.
Schema relatiei este notata r (A1, A2, Ai,…… An) este compusa din
numele relatiei si din lista ordonata a atributelor sale A1, A2, Ai, ….. An, fiecare
atribut Ai definit pe domeniul sau de definitie D(Ai). Relatia carti (cod carte, titlu,
autor, an aparitie, editura). Schema relatiei este folosita pentru a descrie relatia
respectiva si se mai numeste tipul sau intensitatea relatiei. Numarul de atribute
ale schemei unei relatii se numeste gradul relatiei. O relatie R definita de schema
r de A1, A2, Ai….. An este o multime de n tupluri, fiecare tuplu fiind o lista
ordonata de n valori V1, V2, Vi, Vn, unde Vi este valoarea atributului Ai
apartinand domeniului sau de definitie. Din aceasta definitie rezulta ca intr-o
relatie nu exista tupluri duplicat, deoarece relatia este o multime matematica de
tupluri. Totodata, in fiecare tuplu, un atribut nu poate lua decat o valoare din
domeniul sau de definitie. Numarul de atribute ale relatiei se numeste gradul
relatiei iar numarul de tupluri se numeste cardinalitatea relatiei. O relatie
corespunde in general unei multimi de entitati din diagrama entitate-asociere a
unei baze de date, iar un tuplu reprezinta o entitate din multimea de entitati.
Atributele tipului de entitate din modelul conceptual de nivel inalt devin
atributele relatiei in modelul relational. De exemplu se defineste relatia studenti
(nr matricol, nume, prenume, data nasterii, gen, adresa, specializare). Domeniile
de definitie ale atributelor se specifica prin numele domeniului, semnificatia
acestuia, tipul de date si restrictiile asupra valorilor in cadrul acelui tip de date.
De exemplu, domeniul pentru nume este format din numele de persoane
reprezentate printr-un sir maxim de 30 de caractere, pentru ca ne imaginam ca nu
exista niciun nume mai lung de 30 de caractere in care primul caracter este o litera
mare, iar celelalte sunt mici. Domeniul pentru data nasterii este format din
domeniul tuturor datelor calendaristice posibile pentru un student, astfel incat
studentul sa aiba mai mult de 18 ani si mai putin de 80. Domeniul pentru gen este
format din valorile posibile pentru sexul unui student masculin/feminin. Cel mai
frecvent in implementarea modelului relational in cadrul unor sisteme de gestiune
de baze de date diferite este ca domeniile de definitie ale atributelor sa foloseasca
direct tipurile de date predefinite ale limbajului de definire a datelor specific
acelui sistem de gestiune de baze de date.
Reprezentarea relatiilor prin tabele
O tabela este o reprezentare a unei relatii si este compusa din urmatoarele
parti: numele tabelei care este identic cu numele relatiei pe care o reprezinta; un
numar de coloane egal cu numarul de atribute ale relatiei, fiecare coloana
reprezentand un atribut; capul tabelei in care se inscriu numele atributelor relatiei
fiecare atribut fiind inscris in coloanal corespunzatoare; o multime de linii, fiecare
linie corespunzand unui tuplu, deci unei entitati; fiecare element al unei linii se
inregistreaza valoarea atributului corespunzator coloanei in care se afla elementul
respectiv. Termenul de tabela, pe care o reprezinta o relatie, este de fapt o notiune
similara, cu mentiunea ca tabela este o notiune reala, in timp ce relatia este o
notiune abstracta. Reprezentarea unei notiuni abstracte cum este relatia intr-o
forma usor de interpretat cum este tabela, este o proprietate esentiala a modelului
relational.
Ordonarea valoriilor atributelor in tupluri
Tuplul este considerat o lista ordonata de n valori ale atributelor A1, A2,
Ai,… An, ordinea valorilor atributelor intr-un tuplu nu are nicio importanta daca
se face o corespondenta intre un atribut cu valoarea acestuia. Fie schema relatiei
definite ca o multime de atribute R de A1, A2, Ai, An, relatia R este o multime
de n tupluri T, fiecare tuplu fiind compus dintr-o multime de n perechi ordonate
T=A1 V1, Ai Vi, An Vn, unde Vi este valoarea atributului Ai din domeniul sau
de definitie. In aceasta definitie, ordinea atributelor nu mai conteaza deoarece
numele atributului si valoarea lui sunt grupate impreuna si de aceea, aceasta
definitie a relatiei are un caracter mult mai general
Curs 7 Baze de date – Limbajul SQL (Structured Query
Language)
Limbajul SQL este limbajul utilizat de majoritatea sistemelor de baze de
date relationale pentru definirea si manipularea datelor. Limbajul SQL a fost
dezvoltat la mijlocul anilor 1970 iar in 1979 Oracle a introdus prima
implementare a limbajului SQL in varianta comerciala. In anul 1987 Institutul
National American de Standarde a elaborat standardul limbajului SQL.
Majoritatea sistemelor de gestiune de baze de date relationale suporta standardul
SQL 2. Totusi, fiecare dintre acestea implementeaza un dialect specific al
limbajului SQL, de exemplu, in diferite implementari ale limbajului SQL pot sa
lipseasca unele comenzi prevazute in standardul SQL 2 dar pot exista extensii
specifice neprevazute in standarde. Limbajul SQL foloseste termenii de tabela,
linie si coloana pentru a desena o relatie, un tuplu sau un atribut. Deci se poate
spune ca este orientat spre reprezentarea prin tabele a relatiilor care este mai
simpla si mai intuitiva atat pentru proiectanti cat si pentru programatori.
Limbajul SQL cuprinde atat componenta de descriere a datelor relationale
cat si componenta de manipulare a datelor, ambele fiind absolut necesare in
gestiunea bazelor de date. Pe langa aceste componente principale, standardul
SQL 2 mai prevede si alte componente dupa cum urmeaza:
1 – Controlul tranzactiilor contine comenzi pentru specificarea
tranzactiilor. Unele implementari adauga comenzilor prevazute in standard ci alte
comenzi suplimentare de control al concurentei sau de refacere a datelor.
2 - Controlul securitatii si al protectiei datelor. Aceasta componenta contine
comenzi de administrare a bazelor de date pentru definirea utilizatorilor si a
drepturilor acestora de acces la tabele. Aceasta componenta este puternic
dependenta de sistemul de gestiune al bazei de date, iar pentru sistemele
performante, administrarea bazei de date este o munca foarte complexa.
Limbajul SQL este un limbaj neprocedural. O instructiune SQL specifica
ce informatii trebuie sa fie setate sau obtinute si nu specifica modul sau procedura
in care se opereaza. Limbajul SQL contine numai instructiuni de definire si
manipulare a datelor si nu contine instructiuni de control al fluxului executiei cum
ar fi FOR, WHILE sau IF. De aceea pentru realizarea aplicatiilor de baze de date
s-au dezvoltat mai multe tehnologii, limbaje, biblioteci sau interfete de
programare care integreaza instructiunile SQL de acces la date. O instructiune
SQL este o secventa de elemente componente ce se termina cu semnul; . Fiecare
instructiune SQL contine o comanda SQL care specifica ce actiune se efectueaza,
urmata de alte elemente componente care specifica operatii, clauze sau
parametrii. De exemplu, instructiunea SELECT Nume FROM Studenti contine
comanda SQL SELECT urmata de alte elemente componente ale instructiunii.
Un element al unei instructiuni SQL poate fi cuvant cheie, identificator, constanta
sau caracter special.
Cuvinte cheie si identificatori: cuvintele cheie sunt elemente componente
cu semnificatie fixa in limbajul SQL. Acestea pot fi de exemplu comenzi
(SELECT, INSERT, UPDATE, DELETE), pot fi operatori (AND, OR, NOT,
LIKE) sau clauze (WHERE, SET, VALUES). De exemplu, SELECT Nume,
Varsta FROM Studenti WHERE Specializare=”Management”. In acest caz
cuvintele cheie sunt SELECT, FROM si WHERE. Identificatorii sunt elemente
componente care denumesc tabele, coloane sau alte elemente ale bazei de date.
In exemplul anterior Studenti si Specializare sunt identificatori. Pe langa acest tip
de identificatori simpli formati dintr-o secventa de litere sau cifre, mai exista si
alt tip de identificatori numiti identificatorii delimitati ce constau dintr-o secventa
de caractere incadrata la inceput si la sfarsit de ghilimele. Un identificator
delimitat este considerat intotdeauna identificator si niciodata nu este considerat
cuvant cheie.
Constante: constantele pot fi siruri de caractere, numere intregi, numere
reale sau constanta null. O constanta sir de caractere consta dintr-o secventa de
caractere delimitata la inceput si la sfarsit de cate un apostrof.
Caractere speciale: Unele caractere care nu sunt litere sau cifre au rol de
operator SQL sau pot avea o semnificatie speciala in cadrul comenzilor SQL. De
exemplu caracterul; este folosit pentru terminarea comenzilor. Caracterul. este
folosit ca punct zecimal in timp ce simbolul asterix * este folosit atat pentru
inmultire dar si pentru inlocuirea tuturor atributelor cand urmeaza dupa SELECT.
De exemplu SELECT * FROM Studenti va afisa toate coloanele din tabela
Studenti.
O expresie SQL consta dintr-unul sau mai multi operanti, operatori si
paranteze. Un operant poate fi numele unei coloane dintr-o tabela, o constanta
sau valoarea rezultat a unei functii. Parantezele sunt folosite pentru a preciza o
anumita ordine a operatiilor daca aceasta este diferita de cea implicita data de
precedenta operatorilor. Un operator SQL este compus din unul sau mai multe
caractere speciale care nu sunt cifre sau litere cum ar fi de exemplu +-*<>?! sau
este un cuvant cheie ca de exemplu AND, OR, NOT sau LIKE.
Operatorii de comparatie din SQL: a between m and n. (Compara a cu
valorile m si n adica A trebuie sa fie mai mare decat m si mai mic decat n). IN –
a IN (v1, v2... vn) compara a cu o lista de valori v1, v2.... vn. IS null – a IS null
(compara a cu valoare null). Tot asa a IS not null (compara a cu valoarea not null).
a LIKE sir de caractere (compara a cu un model sir de caractere). Operatorii logici
ai limbajului SQL sunt notati prin cuvinte cheie AND, OR si NOT. Toti acesti
operatori se aplica unor variabile logice cu 3 valori ADEVARAT, FALS si
NULL, unde NULL semnifica lipsa de informatie.
A B A AND B A OR B
ADEVARAT ADEVARAT ADEVARAT ADEVARAT
ADEVARAT FALS FALS ADEVARAT
ADEVARAT NULL NULL ADEVARAT
FALS FALS FALS FALS
FALS NULL FALS NULL
NULL NULL NULL NULL
A NOT A
ADEVARAT FALS
FALS ADEVARAT
NULL NULL
Curs 8 Baze de date Functiile definite in SQL
De 2 categorii: functii agregat si functii scalare. Functiile agregat
calculeaza un rezultat din mai multe linii ale unei tabele. Functiile scalare primesc
unul sau mai multe argumente si returneaza o valoarea calculata sau valoarea null
in caz de eroare (functiile numerice, pentru manipularea sirurilor de caractere,
pentru timp sau functii de conversie).
Instructiunea DELETE permite stergerea uneia sau mai multor linii dintr-
o tabela ce are sintaxa: DELETE FROM tabel [WHERE conditie]. Din tabela se
sterg acele linii care indeplinesc conditia data in clauza WHERE. Daca este omisa
clauza WHERE, vor fi sterse toate liniile din tabela.
Curs Baze de Date 11- Constrangeri de
integritate
Constrangerile de integritate sunt reguli care se definesc la proiectarea unei
baze de date si care trebuie sa fie respectate de orice stare a acesteia. Relatiile
unei baze de date reflecta realitatea moderata si de aceea valorile pe care le scoti
trebuie sa respecte anumite reguli care sa corespunda celor din realitate.
Constrangerile se pot clasifica dupa locul unde sunt definite si dupa modul in care
sunt definite. Din punct de vedere al locului unde sunt definite, constrangerile pot
fi constrangeri intra-relatie si constrangeri inter-relatie.
Constrangerile intra-relatie sunt reguli care se impun in cadrul unei singure
relatii si asigura integritatea datelor acesteia. Ele sunt la randul lor de 3 categorii:
1- constrangeri de domeniu
2- constrangeri de tuplu
3- constrangeri impuse prin dependente de date
Constrangerile inter-relatii sunt reguli care se impun intre doua sau mai
multe relatii. Cele mai importante constrangeri inter-relatii sunt constrangerile de
integritate referentiala care se realizeaza prin intermediul cheilor straine si asigura
asocierea corecta a relatiilor.
Din punct de vedere al modului de definire, constrangerile unei baze de
date se pot clasifica in constrangeri inerente, implicite si explicite. Constrangerile
inerente sunt cele ale modelului de date insusi care nu trebuie sa fie specificate la
definirea relatiilor dar sunt respectate prin modul in care se construiesc relatii.
De exemplu in modelul relational, constrangerea ca valoare a fiecarui
atribut sa fie atomica, adica indivizibila, este o constrangere inerenta
Constrangerile implicite sunt reguli care se definesc odata cu definirea
schemelor relatiilor, sunt memorate in baza de date si sistemul de gestiune
verifica si impune automat respectarea lor. Constrangerile de domeniu,
constrangerile de tuplu si constrangerile de integritate referentiala sunt exemple
de constrangeri implicite.
Constrangerile explicite sunt constrangeri suplimentare pe care trebuie sa
le respecte relatiile unei baze de date si care nu sunt impuse automat de sistemul
de gestiune de baze de date si necesita proceduri speciale de verificare si
impunere a respectarii lor.
Constrangeri de domeniu
Constrangerile de domeniu sunt conditii impuse valorilor atributelor astfel
incat acestea sa corespunda semnificatiei pe care o au in realitatea modelata.
Dintre constrangerile de domeniu, constrangerea NOT NULL si constrangerea de
valoare implicita sunt constrangeri cu caracter general care se pot aplica oricarui
atribut.
Nu orice atribut poate lua valoarea NULL. De exemplu, tabela studenti
(nume, data nasterii, specializare, adresa...) nu are sens sa inregistreze un student
al carui nume nu se cunoaste, deci pentru care sa se admita valoarea de NULL
pentru atributul nume. In aceste situatii, la definirea relatiilor se impune pentru
anumite atribute constrangerea NOT NULL, insemnand ca atributul nu poate lua
valoarea NULL in niciun tuplu al relatiei. Constrangerea NOT NULL pentru un
atribut se introduce la crearea relatiei prin comanda Create Table.
Valorile implicite ale atributelor se stabilesc pentru unul sau mai multe
atribute ale unei relatii. In cazul in care la inserarea unui tuplu nu se specifica
valoarea unui atribut, atunci atributul primeste valoarea implicita daca a fost
definita sau valoarea NULL daca nu a fost definita o valoare implicita pentru
atributul respectiv dar sunt admise valori NULL. In situatia in care nu a fost
definita o valoare implicita, si nici nu sunt admise valori NULL, se genereaza o
eroare.
In limbajul SQL, valoarea implicita a unui atribut se poate specifica la
crearea tabelei corespunzatoare ca o constrangere de coloana impreuna cu alte
constrangeri.
Constrangerea de verificare in limbajul SQL, domeniile se pot stabili ca
tipuri de date predefinite cum este tipul numeric, text sau sir de caractere, data
calendaristica etc. Pentru fiecare atribut definit pe un tip de date SQL se pot
adauga constrangeri de verificare la definirea tabelei prin comanda Create Table.
Constrangerile de tuplu
O relatie este definita ca o multime de tupluri, deci tuplurile unei relatii
trebuie sa fie distincte. Aceasta inseamna ca intr-o relatie nu pot exista 2 sau mai
multe tupluri care sa contina aceasi combinatie de valori ale tuturor atributelor.
De obicei intr-o schema de relatie exista o submultime de atribute SK cu
proprietatea ca nu exista doua tupluri distincte ale relatiei TI si TJ care sa aiba
aceasi combinatie de valori ale atributelor submultimilor respective, adica TI
(SK) este diferit de TJ (SK) daca TI este diferite de TJ.
O super cheie a relatiei este o submultime SK de atribute ale relatiei care
prezinta proprietatea de unicitate, adica orice combinatie de valori ale atributelor
supercheii este unica pentru orice stare a relatiei. O cheie candidata este o super
cheie ireductibila. Cheia candidata trebuie sa prezinte urmatoarele doua
proprietati:
1- unicitate, adica nu exista doua tupluri diferite ale relatiei care sa contina
aceasi combinatie de valori ale atributelor cheii candidate
2- ireductibilitate, adica nu exista nicio submultime proprie nevida a cheii
candidate care sa aiba proprietatea de unicitate
Acest lucru inseamna ca daca se elimina un atribut oarecare din
submultimea cheii candidate, noua submultime de atribute nu mai are proprietatea
de unicitate, adica vor putea exista doua sau mai multe tupluri care sa prezinte
aceeasi combinatie de valori ale atributelor din submultimea cheii candidate.
Asadar o cheie candidata este o super cheie minimala, adica o super cheie din
care nu se mai poate elimina niciun atribut fara sa se piarda proprietatea de
unicitate.
Proprietatea cheii de a avea o valoare unica pentru fiecare tuplu este o
constrangere de integritate a tuplurilor relatiei respective care trebuie sa fie
respectata de orice stare a relatiei in orice moment. O cheie candidata poate sa fie
simpla daca este alcatuita dintr-un singur atribut sau compusa daca este alcatuita
din mai multe atribute. Atunci cand exista mai multe chei candidate, una dintre
ele se alege ca si cheie primara, celelalte fiind numite chei secundare, alternative
sau unice.
Curs 12 Baze de Date
O cheie primară este o cheie candidată, căreia proiectantul îi conferă un rol special de
accesare și identificare a tuplurilor relației. Asupra cheii primare se impun următoarele
restricții: 1- nici o valoare atributelor cheii primare nu poate fi modificată prin operații de
actualizare a datelor.
2- nu se admit valori de NULL pentru nici unul din atributele cheii primare.
O cheie secundară este o cheie candidată care nu a fost desemnată de proiectant ca și
cheie primară. Cheile secundare admit valori de NULL pentru unele din atributele lor dacă se
respectă condiția de unicitate a valorilor. Alegerea cheii primare din mai multe chei candidate
este arbitrară, dar în mod obișnuit, se alege acea cheie cu cel mai mic număr de atribute.
Deoarece condiția de unicitate se verifică la fiecare tuplu nou introdus, și toate operațiile de
identificare a tuplurilor se fac prin operații de comparație a valorilor atributelor cheii primare,
este evident că aceste operații sunt cu atât mai eficiente cu cât numărul de atribute ale cheii
primare este mai mică.
O cheie primară compusă din atributele existente ale tipului de entitate se numește cheie
naturală. În general, cheile naturale sunt compuse din mai multe atribute, ceea ce conduce la
scăderea eficienței operaților relaționale, de aceea, de foarte multe ori se introduc chei
artificiale.
O cheie artificială primară este un atribut care se adaugă în schema relației pentru
identificarea unică a tuplurilor. De exemplu, dacă presupunem o tabelă cu studenții unei
universități, putem introduce câmpul artificial număr matricol, prin care fiecare student este
identificat în mod unic. Câmpul CNP nu poate fi folosit în acest caz ca și cheie primară,
deoarece o persoană poate fi student la mai multe facultăți și atunci CNP-ul s-ar repeta,
nemaiputând fi o cheie unică.
În limbajul SQL, constrângerea de cheie primară se introduce la definirea relației prin
comanda CREATE TABLE. Dacă cheia primară este simplă, adică formată dintr-un singur
atribut, constrângerea de cheie primară se poate specifica la definirea atributului ca o
constrângere de atribut. Dacă cheia primară este compusă, adică formată din mai multe atribute,
atunci constrângerea de cheie primară se specifică după definirea atributelor ca o constrângere
de tabelă