SUPORT PENTRU LABORATOR - ULBS
SUPORT PENTRU LABORATOR - ULBS
SUPORT PENTRU LABORATOR - ULBS
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
ă ş<br />
BAZE DE DATE<br />
<strong>SUPORT</strong> <strong>PENTRU</strong> <strong>LABORATOR</strong><br />
VISUAL FOXPRO<br />
Ş<br />
Edited by Foxit PDF Editor<br />
Copyright (c) by Foxit Software Company, 2004<br />
For Evaluation Only.<br />
Ş
Limbaje de programare şi baze de date 1<br />
SISTEMUL DE GESTIUNE A<br />
BAZELOR DE DATE<br />
Principalele obiective ale capitolului sunt:<br />
Concepte principale din teoria relaţională<br />
Cheia primară<br />
Cheia externă<br />
Sisteme de gestiune a bazelor de date<br />
Sistemul de gestiune a bazelor de date (SGBD) este<br />
componenta unui sistem de bază de date care are rolul de a permite<br />
descrierea şi manipularea conform unui model de date.<br />
În momentul actual, cea mai mare parte a SGBD-urilor care se<br />
utilizează sunt bazate pe modelul relaţional.<br />
VFP este un SGBD relaţional cu limbaj propriu, care suportă<br />
un nucleu extins din limbajul relaţional SQL (Structured Query<br />
Language).
2<br />
Suport pentru laborator<br />
PRINCIPALELE CONCEPTE DIN TEORIA RELAŢIONALĂ<br />
Domeniul - reprezintă un ansamblu de valori, caracterizat<br />
printr-un nume. Domeniul se poate defini explicit, prin enumerarea<br />
tuturor valorilor care aparţin acestuia (exemplu D1:{roşu, galben,<br />
albastru}), sau implicit prin precizarea proprietăţilor pe care le au<br />
valorile domeniului respectiv (exemplu: D2:{e/e∈ N }<br />
Relaţia - (tabela) reprezintă un subansamblu al produsului<br />
cartezian dintre mai multe domenii (D1xD2x…) caracterizat printr-un<br />
nume. Reprezentarea folosită pentru o relaţie (R) este tabloul<br />
bidimensional (tabela de date) de forma:<br />
Atributul este coloana unei relaţii caracterizate printr-un<br />
nume. Fiecare atribut îşi ia valorile dintr-un domeniu. Mai multe<br />
atribute pot lua valori din acelaşi domeniu.<br />
Tuplul este linia dintr-o relaţie şi nu are nume. Valorile dintr-un<br />
tuplu aparţin produsului cartezian dintre domeniile relaţiei (exemplu<br />
tuplul v1, v2, ...,vn, unde v1∈D1, v2∈D2,...,vn∈Dm, cu n ≥m numere<br />
întregi).<br />
Schema relaţiei este un ansamblu format din numele relaţiei<br />
(R) urmat între parantaze rotunde de lista atributelor (Ai), pentru<br />
fiecare atribut precizându-se domeniul asociat (Dj):<br />
R(A1:D1, A2:D2,...,An:Dm):<br />
unde n ≥m numere întregi.<br />
Cheia este un atribut sau un ansamblu de atribute cu ajutorul<br />
căruia se poate identifica un tuplu dintr-o relaţie.<br />
Cheia este primară dacă identificarea este unică, adică există<br />
un singur tuplu cu o anumită valoare pentru cheie.
Limbaje de programare şi baze de date 3<br />
Cheia este simplă, dacă este formată dintr-un singur atribut.<br />
Cheia este compusă dacă este formată dintr-un ansamblu de<br />
atribute.<br />
Cheia este externă într-o relaţie R1, dacă ansamblul de<br />
atribute care o defineşte ia valori din aceleaşi domenii ca şi cheia<br />
primară a unei relaţii R2 si dacă are rolul de a stabili o legătura<br />
(asociere) între cele două relaţii.<br />
Prezentare comparativă a noţiunilor privind organizarea<br />
datelor în memoria externă în fişiere, baze de date relaţionale (BDR)<br />
şi cele utilizate în VFP.<br />
Mem<br />
externă<br />
FISIER CÂMP - CHEIE - -<br />
BDR RELAŢIE ATRIBUT ASOCIERE CHEIE CHEIE DOMENIU<br />
PRIMARĂ EXTERNĂ<br />
VFP TABELĂ CÂMP ASOCIERE CHEIE CHEIE -<br />
(LEGATURA) PRIMARĂ<br />
Intrebări:<br />
1. Pentru tabelele FURNIZORI şi FACTURI<br />
(ANEXA 1) care sunt cheile?<br />
2. Daţi exemplu de un atribut şi de un tuplu<br />
pentru relaţia FACTURI (ANEXA 1)
4<br />
GENERALITĂŢI DESPRE<br />
APLICAŢIA VISUAL FOX PRO<br />
Suport pentru laborator<br />
Principalele obiective ale capitolului sunt:<br />
Prezentarea şi utilizare aplicaţia Visual Fox Pro<br />
Baze de date<br />
Crearea, consultarea şi actualizarea tabelelor<br />
Visual Fox Pro (VFP) este un limbaj specializat în prelucrarea<br />
datelor, grupate în baze de date, permiţând întregistrarea,<br />
păstrarea, regăsirea şi analiza cu uşurinţă a acestora. O bază de<br />
date reprezintă o colecţie de informaţii - de exemplu nume, adrese,<br />
produse, facturi – care pot fi gestionate cu ajutorul unor aplicaţii<br />
specifice, printre care şi Visual Fox Pro. Pentru o mai bună<br />
organizare a bazelor de date sau a celorlalte obiecte, acestea sunt<br />
grupate într-un proiect, care reprezintă de asemenea şi baza<br />
realizării formatului distribuibil (executabil).
Limbaje de programare şi baze de date 5<br />
UTILIZAREA APLICAŢIEI VISUAL FOX PRO<br />
1. Clic pe Start<br />
2. Activaţi opţiunea Programs<br />
3. Clic pe pictograma aplicaţiei Visual Fox Pro<br />
VFP dispune de o fereastră principală care cuprinde:<br />
Elementele ferestrei VFP<br />
Proiectele sunt formate din mai multe obiecte:<br />
Obiect Descriere<br />
bară de<br />
instrumente<br />
bară de meniu<br />
fereastră de comenzi<br />
Tabelele sunt formate din câmpuri (coloane) – care<br />
formează structura tabelei şi înregistrări (rânduri) –<br />
reprezentând conţinutul tabelei. În cadrul fiecărui câmp<br />
există mai multe valori.<br />
O bază de date trebuie să conţină cel puţin o tabelă.<br />
Interogări ale tabelelor sau bazelor de date, respectiv<br />
decuparea şi prezentarea datelor în funcţie de anumite<br />
condiţii.<br />
Formularele reprezintă ferestre personalizate care oferă un<br />
acces şi o vizualizare facilă a datelor dintr-o tabelă sau o<br />
interogare.<br />
Rapoartele prezintă datele dintr-o tabelă sau o interogare<br />
într-un format imprimabil.
6<br />
CREAREA UNUI PROIECT<br />
Suport pentru laborator<br />
Pentru realizarea unui proiect, se procedează astfel:<br />
1. Clic pe meniul File<br />
2. Se activează opţiunea New<br />
3. Se bifează opţiunea Project<br />
4. Clic pe butonul New File<br />
5. Se atribuie un nume proiectului şi se salvează în locaţia dorită.<br />
Crearea unui nou proiect<br />
VFP pune la dispoziţia utilizatorilor un coordonator al întregii<br />
activităţi denumit “Project Manager”, care dispune de o fereastră cu<br />
6 pagini ce grupează pe categorii elementele componente ale unui<br />
proiect şi o bară cu opţiuni dependentă de context.
Limbaje de programare şi baze de date 7<br />
Fereastra Project Manager – fără tabele sau baze de date<br />
În cazul în care fereastra Project Manager se închide,<br />
redeschiderea acesteia se realizează prin alegerea din meniul File a<br />
opţiunii Open şi apoi prin căutarea proiectului dorit în locaţia în care<br />
a fost salvat.<br />
CREAREA ŞI CONSULTAREA UNEI TABELE<br />
Crearea tabelelor se realizează în două etape:<br />
I. Crearea structurii tabelelor (creare câmpuri);<br />
II. Crearea conţinutului tabelei (încărcarea informţiilor).<br />
Pentru crearea structurii unei tabele se procedează astfel:<br />
1. Se deschide/crează un proiect.<br />
2. Din fereastra Project Manager se execută clic pe pagina Data.<br />
3. Se execută clic pe opţiunea Free Tables, apoi pe butonul New şi<br />
New Table.<br />
4. Se atribuie o denumire tabelei şi se allege locaţi în care va fi<br />
salvată. În urma acestei acţiuni rezultă o fereastră denumită<br />
Table Designer.<br />
În fereastra Table Designer există 3 pagini:
8<br />
• Fields<br />
(pagina de<br />
câmpuri);<br />
Pagina Fields cuprinde:<br />
• denumire câmp (name);<br />
• tip date (valori) aferente<br />
câmpului (type);<br />
• mărimea maximă a<br />
valorilor (width);<br />
Fereastra Table Designer<br />
• Indexes (pagina de<br />
indecşi);<br />
Suport pentru laborator<br />
• Table (tabele),<br />
cu informaţii<br />
despre tabelă.<br />
• opţiunea specifică tipului de<br />
date numeric (decimal);<br />
• indecşi (index);<br />
• indicatorul Null (dacă nu<br />
există momentan date).<br />
Datele sunt de mai multe tipuri: numeric (numeric, real, integer,<br />
currency, double); şiruri de caractere; logic; dată calendaristică;<br />
moment de timp; memo şi general.<br />
La acţionarea butonului OK utilizatorul este interogaţ dacă doreşte<br />
să introducă date în tabelă, iar la alegerea opţiunii YES se pot<br />
introduce informaţii.<br />
Fereastra de confirmare
Limbaje de programare şi baze de date 9<br />
La revenirea în Project Manager (PM) se observă la rubrica<br />
Free tables semnul + care arată faptul că au fost create tabele<br />
libere (neaparţinând unei bază de date).<br />
Feareastra Project Manager – cu o tabelă<br />
În partea din dreapta a ferestrei PM, în pagina Data se<br />
observă, există mai multe butoane pentru diverse opţiuni, astfel:<br />
• new – creare tabelă nouă;<br />
• add – adăugare tabelă<br />
creată anterior;<br />
• modify – modificare<br />
structură tabelă;<br />
• browse – vizualizare<br />
înregistrări tabelă;<br />
• remove –<br />
eliminare/ştergere tabelă<br />
din proiectul curent;<br />
• build.<br />
Consultarea conţinutului unei tabele se realizează astfel:<br />
1. În Project Manager, în pagina Data se selectează tabela<br />
dorită.<br />
2. Se execută clic pe butonul Browse.<br />
ACTUALIZAREA STRUCTURII UNEI TABELE<br />
Buton pentru<br />
acces la<br />
structura<br />
tabelei/bazei<br />
de date<br />
Buton<br />
pentru<br />
acces la<br />
conţinutul<br />
tabelei<br />
Actualizarea structurii unei tabele, similar cu actualizarea<br />
conţinutului, este marcată de trei operaţii: adăugare, modificare şi<br />
ştergere a înregistrărilor, toate implicând vizualizarea iniţială a<br />
structurii tabelei cu ajutorul butonului/comenzii Modify/Modify<br />
structure.
10<br />
Suport pentru laborator<br />
A. Adăugarea şi modificarea câmpurilor se realizează astfel:<br />
1. Din fereastra Project Manager se execută clic pe pagina Data şi<br />
se alege denumirea tabelei care trebuie actualizată.<br />
2. Se execută clic pe butonul Modify.<br />
3. Se realizează direct acţiunea dorită.<br />
B. Ştergerea câmpurilor se realizează astfel:<br />
1. Din fereastra Project Manager se execută clic pe pagina Data şi<br />
se alege denumirea tabelei care trebuie actualizată.<br />
2. Se execută clic pe butonul Modify.<br />
3. Se execută clic pe denumirea câmpului care se doreşte a fi şters<br />
şi apoi pe butonul Delete.<br />
ACTUALIZAREA CONŢINUTULUI UNEI TABELE<br />
Actualizarea conţinutului unei tabele este marcată de trei operaţii:<br />
adăugare, modificare şi ştergere a înregistrărilor, toate implicând<br />
vizualizarea iniţială a conţinutului tabelei cu ajutorul<br />
butonului/comenzii Browse.<br />
A. Adăugarea înregistrărilor se realizează astfel:<br />
Pentru a adăuga o singură înregistrare:<br />
1. Din fereastra Project Manager se execută clic pe pagina Data şi<br />
se alege tabele care trebuie actualizată.<br />
2. Se execută clic pe butonul Browse.<br />
3. Din meniul Table se activează opţiunea Append New Record şi<br />
se adaugă o înregistrare.<br />
Pentru a adăuga mai multe înregistrări:<br />
1. Din fereastra Project Manager se execută clic pe pagina Data şi<br />
se alege tabele care trebuie actualizată.<br />
2. Se execută clic pe butonul Browse.<br />
3. Din meniul View se activează opţiunea Append Mode şi se<br />
adugă, rând pe rând mai multe înregistrări.<br />
B. Modificarea înregistrărilor se realizează după cum urmează:<br />
Pentru a modifica independent înregistrările:
Limbaje de programare şi baze de date 11<br />
1. Din fereastra Project Manager se execută clic pe pagina Data şi<br />
apoi pe butonul Browse efectuându-se apoi modificasrea pentru<br />
înregistrarea dorită.<br />
Pentru a modifica înregistrările în funcţie de anumite criterii<br />
1. Din fereastra Project Manager se execută clic pe pagina Data<br />
şi apoi pe butonul Browse.<br />
2. Din meniul Table se activează opţiunea Replace Field.<br />
3. Rezultă o fereastră în care la opţiunea Field... With... (se alege<br />
câmpul în care va fi modificată cu informaţia) completând<br />
Replacement Criteria (domeniul înregistrărilor = totalitatea<br />
înregistrărilor afectate de execuţia unei comenzi).<br />
Vizualizarea conţinutului tabelei şi modificarea înregistrărilor<br />
Stabilirea domeniului înregistrărilor se face :<br />
b. static (independent de informaţiile conţinute în înregistrări),<br />
utilizând clauzele:<br />
• All – se referă la toate înregistrările;<br />
• Next – de exemplu următoarele 4 înregistrări începând<br />
cu înregistrarea curentă;<br />
• Rest – se referă la înregistrarea curenta şi la toate<br />
celelalte înregistrări până la sfârşitul tabelei;<br />
• Record – înregistrarea a patra, de exemplu.<br />
c. dinamic (în funcţie de informaţiile conţinute în înregistrări)<br />
utilizând:
12<br />
Suport pentru laborator<br />
• for se referă la toate înregistrările din tabelă<br />
pentru care condiţia este adevarată;<br />
• while se referă la înregistrările cuprinse între<br />
înregistrarea curentă şi prima înregistrare pentru care<br />
condiţia este falsă.<br />
C. Ştergerea înregistrărilor se realizează în două moduri<br />
a) Ştergere logică, acest tip de ştergere permiţând recuperarea<br />
înregistrărilor.<br />
1. Se vizulizează conţinutul tabelei.<br />
2. Se acţionează cu mouse-ul spaţiul de ştergere aflat în stânga<br />
înregistrării care se doreşte a fi ştearsă logic, moment în care<br />
înregistrarea va fi marcată. Înregistrarea poate fi recuperată<br />
executând un clic pe celaşi spaţiu.<br />
Ştergerea logică a înregistrărilor<br />
Pentru ştergerea unor înregistrări care îndeplinesc o anumită<br />
condiţie se utilizează din meniul Table opţiunea Delete Records. În<br />
fereastra rezultată se stabileşte domeniul înregistrărilor.<br />
b) Ştergere fizică, acest tip de ştergere nepermiţând recuperarea<br />
înregistrărilor.<br />
1. Se vizualizează conţinutul tabelei.<br />
2. Se şterg logic înregistrările dorite.<br />
3. Din meniul Table se alege opţiunea Remove Deleted Records<br />
apoi se execută clic pe butonul Yes.
Limbaje de programare şi baze de date 13<br />
APLICAŢIA 1<br />
Confirmarea ştergerii fizice a unei înregistrări<br />
Creaţi o tabelă următoarea structură:<br />
Intrebări:<br />
Care sunt componentele unei tabele?<br />
Cum se construieşte o tabelă în Visual Fox Pro?<br />
Ce înseamnă actualizarea conţinutului unei<br />
tabele? Cum se actualizează conţinutul unei<br />
tabele?<br />
Prezentatţi modul de vizualizare a conţinututlui<br />
unei tabele.<br />
Prezentaţi modul de actualizare a structurii unei<br />
tabele.<br />
Studiu individual<br />
Aplicaţia 1: Creare şi actualizare tabelă.<br />
Nume C 30<br />
Prenume C 30<br />
Cod N 3<br />
Oras C 20<br />
Medie N 6 ; 2<br />
Admis L
14<br />
şi cu următorul conţinut :<br />
Nume Prenume Cod Oras Medie Admis<br />
Ionescu Maria 1 Iasi 9.27<br />
Vlad Mirela 8 Deva 9.50<br />
Georgecu Ana 5 Cluj 8.85<br />
Popescu Denisa 4 Arad 9.33<br />
Rauta Andreea 6 Deva 9.50<br />
Stanciu Roxana 2 Deva 9.10<br />
Radulescu Ruxandra 3 Cluj 9.29<br />
Matei Iuliana 7 Ploiesti 9.60<br />
a) Să se adauge un nou câmp, denumit Admis.<br />
Suport pentru laborator<br />
b) Se presupune că doar candidatele cu medii peste 9.25 au fost<br />
admise. Să se completeze valorile corespunzătoare pentru<br />
câmpul Admis.<br />
c) Candidatele din Deva sunt de fapt din Bucureşti. Să se modifice<br />
valorile corespunzătoare din câmpul oraş, stabilind domeniul<br />
înregistrărilor cu for.<br />
d) Să se adauge înregistrarea:<br />
Cretulescu Alexandra 9 Orastie 8.00 F<br />
e) Să se şteargă logic înregistrările aferente candidatelor care au<br />
obţinut medie mai mică decât 9.10, utilizând opţiunea Delete<br />
Record şi stabilind domeniul înregistrărilor cu for.<br />
f) Să se şteargă fizic înregistrările şterse logic la punctul anterior.
Limbaje de programare şi baze de date 15<br />
Baze de date. Sortare. Indexare<br />
Principalele obiective ale capitolului sunt:<br />
Crearea unei baze de date<br />
Înţelegerea conceptelor de sortare şi indexare<br />
Înţelegerea noţiunii de index. Tipuri de indecşi<br />
Validare la nivel de câmp şi înregistrare<br />
CREAREA UNEI BAZE DE DATE<br />
O bază de date este formată din una sau mai multe tabele cu<br />
legături între ele şi eventual secvenţe de cod. Pentru crearea unei<br />
baze de date se parcurge următoarea succesiune de paşi:<br />
1. Se crează un nou proiect, rezultând pagina Project Manager.<br />
2. Din pagina Data se selectează opţiunea Databases, se execută<br />
clic pe butonul New şi se crează o baza de date, rezultând o<br />
fereastră denumită Database Designer.<br />
3. În fereastra Project Manager se execută click pe semnul ‘+’<br />
apărut în faţa denumirii bazei de date. Se selectează opţiunea<br />
Tables şi se execută clic pe butonul New.
16<br />
Fereastra Database Designer<br />
Suport pentru laborator<br />
Fereastra Project Manager cu o<br />
tabelă şi o bază de date<br />
SORTAREA ŞI INDEXAREA UNEI TABELE<br />
Sortarea reprezintă ordonarea fizică a înregistrărilor unei tabele. În<br />
urma sortării rezultă o noua tabelă în care înregistrările sunt<br />
aranjate într-o anumita ordine.<br />
Ordonarea fizică a înregistrărilor tabelei se realizează utilizând<br />
instrucţiunea:<br />
sort on to <br />
Aceasta va fi aşadar scrisă în fereastra de comenzi, urmată de<br />
apăsarea butonului Enter de la tastatură.<br />
Pentru a vizualiza conţinutul noii tabele, mai întâi aceasta se<br />
deschide, utilizând comanda use . Se<br />
execută comanda browse.<br />
Indexarea reprezintă ordonarea logică a înregistrărilor unei tabele.<br />
În urma indexării înregistrările tabelei sunt vizualizate într-o<br />
anumită ordine, dată de index.<br />
Se pot stabili mai mulţi indecşi dar numai unul este activ la un<br />
moment dat.<br />
Indexul poate fi :<br />
• Regular (normal)<br />
• Unique (unic), adică într-un câmp pot fi introduse valori egale,<br />
dar prin alegerea acestui tip de index doar prima în ordinea<br />
apariţiei va fi accesibilă
Limbaje de programare şi baze de date 17<br />
• Primary (primar), adică cel care asigură identificarea unică a<br />
înregistrărilor unei tabele. Acest tip de index poate fi stabilit<br />
doar dacă tabela face parte dintr-o bază de date. Pentru o<br />
tabelă se poate stabili un singur index primar. Indexul primar<br />
obligă ca toate valorile din câmpul ales să fie distincte.<br />
• Candidate (candidat), utilizat în cazul în care într-o tabela este<br />
nevoie de mai multe câmpuri cu valori distincte. Deoarece se<br />
poate stabili doar un singur index primar, pentru celelalte<br />
câmpuri în care sunt necesare valori distincte, se aleg indecşi<br />
de tip candidat.<br />
MODUL DE STABILIRE A INDECŞILOR<br />
a) Din fereastra Project Manager se selectează denumirea tabelei<br />
care face parte din baza de date.<br />
b) Se execută un clic pe butonul Modify.<br />
c) În fereastra care rezultă, denumită Table designer, în pagina<br />
Fields se execută un clic pe câmpul care va fi stabilit ca index.<br />
d) Din opţiunea Index se alege Ascending (crescător) sau<br />
Descending (descrescător), adcă valorile din câmpul respectiv vor fi<br />
ordonate crescător/descrescător.<br />
Fereastra Table Designer – opţiunile Ascending/Descending<br />
g) Din fereastra Table designer , pagina Indexes , optiunea Type<br />
se alege tipul de index dorit.
18<br />
Fereastra Table Designer – tipuri de indecşi<br />
MODUL DE ACTIVARE A INDECŞILOR<br />
Suport pentru laborator<br />
a) Se vizualizeaza conţinutul tabelei.<br />
b) Din meniul Table se selectează optiunea Properties. Din pagina<br />
Index order se alege denumirea câmpului care se doreşte a fi<br />
activat.<br />
c) Se execută clic pe butonul OK.<br />
Fereastra de activare unui index
Limbaje de programare şi baze de date 19<br />
Alte opţiuni aferente unei tabele dintr-o bază de date<br />
1. Se selecteaza denumirea tabelei din fereastra Project Manager,<br />
se executa Modify.<br />
2. În pafina Fields , în josul paginii există anumite opţiuni care vor fi<br />
utlizate după cum urmează:<br />
• Format: stabileşte un format de editare pentru valorile unui<br />
câmp, de exemplu formatul “a” permite introducerea numai a<br />
literelor şi a cifrelor.<br />
Cum se procedează ?<br />
Se executa clic pe câmpul dorit şi în opţiunea Format se scrie litera<br />
a.<br />
• Input mask : permite stabilirea unei “măşti de intrare”, de<br />
exemplu, stabilirea faptului că prima litera va fi majusculă<br />
Cum se procedeaza ?<br />
Se executa clic pe campul dorit şi în opţiunea Input mask se<br />
scrie : !aaaaaaaaaa.<br />
• Caption : permite stabilirea unei denumiri mai lungi pentru<br />
câmpuri<br />
Cum se procedează ?<br />
Se execută clic pe câmpul căruia se doreşte a se modifica<br />
denumirea şi în opţiunea Caption se scrie denumirea dorită, având<br />
un număr mai mare de caractere decât cel permis în mod uzual.<br />
• Field Validation : permite validarea la nivel de câmp, adică<br />
interzice ieşirea din acel câmp dacă informaţia introdusă nu a<br />
corespuns unei cerinţe.
20<br />
Suport pentru laborator<br />
Cum se procedează ?<br />
Se executa clic pe câmpul ales şi în opţiunea Rule se scrie condiţia,<br />
în opţiune Message existând posibilitatea scrierii unui measaj.<br />
Observaţie : mesajul va fi afişat când condiţia de validare la nivelul<br />
câmpului nu este respectată.<br />
În pagina Table există următoarele opţiuni :<br />
• Record Validation : se poate realiza validarea la nivel de<br />
înregistrare<br />
Cum se procedează ?<br />
În opţiunea Rule se scrie condiţia, în opţiune Message se va scrie<br />
un mesaj corespunzător, aferent încălcării condiţiei.<br />
Obs : mesajul va fi afişat când condiţia de validare la nivelul<br />
înregistrărilor nu este respectată.<br />
• Insert trigger : limitează introducerea de noi înregistrări<br />
Cum se procedează ?<br />
În opţiunea Insert trigger se scrie condiţia utilizând, de exemplu,<br />
RECNO()< sau > o valoare.<br />
• Update trigger : restricţionează modificarea denumirii oricărui<br />
câmp din tabelă.
Limbaje de programare şi baze de date 21<br />
Cum se procedează ?<br />
În opţiunea Update trigger se scrie .F.<br />
• Delete trigger : interzice ştergerea oricărei înregistrări din<br />
tabelă, de exemplu se interzice ştergerea unei înregistrări.<br />
Cum se procedează ?<br />
În opţiunea Delete trigger se scrie RECNO()#<br />
• Table comment: permite adăugarea unui comentariu referitor<br />
la înregistrările, structura sau utilitatea tabelei.<br />
Tot în cadrul acestei pagini se regăsesc şi informaţii despre locaţia<br />
pe hard disk unde se află tabela, precum şi numărul de înregistrări şi<br />
de câmpuri.<br />
Observaţie:<br />
• pentru a vizualiza data în ordine azi/luna/an, în fereastra de<br />
comenzi se execută comanda set date to dmy<br />
• pentru a vizualiza anul de forma ‘1998’ in loc de ‘98’ se execută<br />
comanda set century on<br />
Intrebări:<br />
Care este diferenţa dintre o tabelă şi o bază de<br />
date?<br />
Ce înseamnă sortarea? Dar indexarea?<br />
Care sunt diferenţele dintre cele două<br />
concepte?<br />
Ce semnifică noţiunile de validare la nivel de<br />
câmp şi validare la nivel de înregistrare?<br />
Studiu individual<br />
APLICAŢIA 2: Creare bază de date, creare<br />
tabelă, stabilire şi activare indecşi, utilizarea<br />
opţiunilor suplimentare privind tabelele (validare<br />
la nivel de câmp şi la nivel de înregistrare).
22<br />
APLICAŢIA 2<br />
Suport pentru laborator<br />
Să se creeze baza de date denumită STUDENT în care se<br />
află o tabelă cu următoarea structură:<br />
şi cu următorul conţinut :<br />
Marca N 4<br />
Nume C 30<br />
Prenume C 30<br />
Oras C 20<br />
Data_ang D 8<br />
Salariu N 10<br />
Marca Nume Prenume Oras Data_ang Salariu<br />
1 Ionescu Maria Iasi 11.01.00 500<br />
13 Vlad Mirela Deva 04.04.99 600<br />
134 Radu Andrei Cluj 12.07.03 350<br />
140 Stan Denisa Arad 03.11.01 380<br />
7 Rauta Andreea Deva 07.30.00 650<br />
18 Stanciu Alex Brasov 08.15.98 400<br />
39 Radulescu Ruxandra Cluj 09.16.00 260<br />
57 Matei Iuliana Ploiesti 10.10.02 390<br />
241 Cretulescu Alexandra Orastie 02.11.03 100<br />
114 Filip Carmen Oradea 03.01.02 850<br />
1. Să se sorteze tabela. Să se vizualizeze conţinutul tebelei<br />
rezultate.<br />
2. Să se stabilească următorii indecşi: marca – index de tip primar<br />
şi oraş – index de tip normal.<br />
3. Să se activeze pe rând indecşii stabiliţi la puncul anterior.<br />
4. Să se stabilească pentru câmpul oraş formatul a.<br />
5. să se stabilească faptul că pentru câmpul oraş prima literă va fi<br />
majusculă.<br />
6. Să se stabilească pentru câmpul oraş o denimre mai lungă,<br />
respectiv: Locul nasterii angajatului<br />
7. Regula de validare la nivelul câmpului marca nu permite valori<br />
mai mici decât 250. Să se stabilească acestă regulă şi, în cazul<br />
în care aceasta este încălcată să se afişeze mesajul: Marca<br />
trebuie sa fie mai mica decat 250.<br />
8. Introduceţi o nouă înregistrare în care valoarea din câmpul<br />
marca să încalce regula. Ce se întâmplă?
Limbaje de programare şi baze de date 23<br />
9. Regula de validare la nivelul înregistrărilor stabileşte ca salariul<br />
să nu fie mai mic decât 300. Să se stabilească acestă regulă şi,<br />
în cazul în care aceasta este încălcată să se afişeze mesajul:<br />
Salariul trebuie sa fie mai mare decat 300.<br />
10. Introduceţi o nouă înregistrare în care valoarea din câmpul<br />
salariu să încalce regula. Ce se întâmplă?<br />
11. Limitaţi introducerea de noi înregistrări la 14 şi apoi introduceţi o<br />
nouă înregistrare. Ce se întâmplă?<br />
12. Restricţionaţi modificarea denumirii oricărui câmp din tabelă.<br />
Verificaţi.<br />
13. Interziceţi ştergerea primei înregistrări. Verificaţi.<br />
14. Adăugaţi următorul comentariu referitor la tabelă: Aceasta tabela<br />
este utilizata pentru evidenta salaratilor firmei ALFA SRL, de la<br />
infiintare pana in prezent.
24<br />
Suport pentru laborator<br />
BAZE DE DATE. LEGĂTURI ÎNTRE TABELE<br />
Principalele obiective ale capitolului sunt:<br />
Prezentarea tipurilor de legături între tabelele<br />
aparţinând unei baze de date<br />
Între doua sau mai multe tabele aparţinând unei baze de date se<br />
pot stabili două tipuri de legături (relaţii):<br />
1. legături temporare : valabile în cadrul sesiunii de lucru curente<br />
2. legături permanente : valabile ori de câte ori se deschide baza<br />
de date, se construiesc o singură dată şi fac parte integrantă din<br />
baza de date<br />
La stabilirea unei relaţii între două tabele una dintre tabele are rol<br />
conducător, fiind denumită tabela-părinte şi cealaltă tabelă este<br />
condusă, fiind denumită tabela-fiu.<br />
Legăturile se stabilesc pe baza unui câmp comun celor două tabele,<br />
pentru valori egale aflate în acele câmpuri. Pentru tabela-părinte<br />
acest câmp se numeşte cheie primară, iar pentru tabela-fiu câmpul<br />
se numeşte cheie externă.
Limbaje de programare şi baze de date 25<br />
De asemenea se impune o precizare: cheia primară reprezintă un<br />
câmp ale cărui valori au rol unic de identificare a fiecărei<br />
înregistrări. De exemplu, CNP este cheie primară într-o tabelă cu<br />
informaţii despre populaţia unui oraş, deoarece fiecare cetăţean are<br />
un singur CNP, deci fiecere înregistrare va fi unică, nu pot exista<br />
două înregistrări cu aceeaşi valoare CNP.<br />
Stabilirea legăturilor temporare şi a legăturilor permanente<br />
presupune realizarea simultană a trei condiţii:<br />
a) existenţa unei baze de date cu cel puţin două tabele ;<br />
b) în tabela-părinte câmpul comun este index primar<br />
c) în tabela-fiu câmpul comun este stabilit ca fiind index – de<br />
obicei normal.<br />
LEGĂTURI TEMPORARE<br />
1. Se crează un nou proiect sau se deschide un proiect existent,<br />
conţinând o bază de date.<br />
2. Se verifică existenţa indecşilor sau se stabilesc indecşii în cazul<br />
în care nu sunt stabiliţi.<br />
3. Din meniul Window se alege opţiunea Data Session. Se<br />
execută clic pe butonul Open, pentru a deschide tabelele.<br />
4. Din fereastra obţinută astfel, denumită Open, se execută clic pe<br />
tabela care se doreşte a fi deschisă, bifând de semenea<br />
opţiunea Exclusive, apoi se execută clic pe butonul OK.<br />
Fereastra Data Session<br />
5. Se procedează similar pentru toate tabelele pentru care se<br />
doreşte stabilirea unor legături temporare.
26<br />
Suport pentru laborator<br />
6. Se execută clic pe denumirea tabelei-părinte. Se execută clic pe<br />
butonul Relations.<br />
7. În fereastra rezultantă, denumită denumită Set Index Order se<br />
execută OK, apoi în fereastra Expression Builder, în dreptul<br />
opţiunii SET RELATION se scrie denumirea câmpului comun, în<br />
cazul în care această denumire nu există deja.<br />
8. Se execută clic pe butonul OK. În acest moment între cele două<br />
tabele a fost realizată o legătură temporară de tip one-to-one.<br />
Fereastra Expression Builder<br />
9. În cazul în care se doreşte realizarea unei legături de tip one-tomany,<br />
se execută clic pe butonul 1 to many. Din fereastra<br />
rezultată, denumită Create One-To-Many Relationship se<br />
alege denumirea tabelei/tabelelor cu care se doreşte a se<br />
realiza legătura, se execută clic pe butonul Move şi apoi pe<br />
butonul OK.
Limbaje de programare şi baze de date 27<br />
Fereastra pentru crearea legăturilor de tip one-to-many<br />
10. Se vizualizează în paralel conţinutul tabelelor şi se execută un<br />
clic pe căte o înregistrare din tabela-părinte, în tabela-fiu fiind<br />
afişate doar înregistrările care conţin în index valoarea<br />
înregistrării curente din tabela-părinte.<br />
Corespondenţa în modul Browse a valorilor comune ale unui index<br />
Se constată că principalul avantaj al legăturii temporare este acela<br />
că în momentul în care în tabela-părinte cursorul este mutat pe o<br />
înregistrare, în tabela-fiu sunt afişate doar înregistrările care conţin<br />
valoarea din câmpul comun aferent înregistrării din tabela-părinte.<br />
LEGĂTURI PERMANENTE<br />
1. Se deschide fereastra Database Designer, executând un clic în<br />
fereastra Project Manager pe denumirea bazei de date şi apoi<br />
pe butonul Modify. În acest moment structura şi indexul fiecărei<br />
tabele pot fi vizualizate.
28<br />
Suport pentru laborator<br />
2. Se execută un clic pe denumirea indexului primar corespunzător<br />
din tabela-părinte şi, prin metoda drag-and-drop se plasează<br />
cursorul pe denumirea corespunzătoare a indexului din tabelafiu,<br />
eliberând cursorul. Se constată realizarea unei legături<br />
permamante.<br />
Realizarea unei legături permanente<br />
Stabilirea unei legături permanente permite stabilirea integrităţii<br />
referenţiale. O restricţie de integritate referenţială se referă la faptul<br />
că în tabela-fiu nu pot exista înregistrări în care în cheia externă să<br />
fie înregistrate valori care nu se află în mulţimea valorilor cheii<br />
primare din tabela-părinte.<br />
De exemplu, dacă se dau două tabele FACTURI [numar_factura,<br />
data_factura, cod_client] şi CLIENŢI [cod_client, nume_client,<br />
localitate], nu poate exista o înregistrare (numar_factura: 12,<br />
data_factura: 12/06/2005, cod_client: 111) dacă în tabela CLIENŢI<br />
nu există un client cu cod 111, altfel spus, nu poate exista o factură<br />
emisă de un client care nu există.<br />
Integritatea referenţială se stabileşte astfel.<br />
1. Se execută un clic dreapta pe legătura creată şi se alege<br />
opţiunea Edit Referential Integrity.<br />
2. În fereastra rezultată, se pot stabili trei tipuri de reguli referitoare<br />
la înregistrările din ambele tabele:<br />
• Rules for Updating – reguli pentru actualizare;<br />
• Rules for Deleting – reguli pentru ştergere;<br />
• Rules for Inserting – reguli pentru inserare.
Limbaje de programare şi baze de date 29<br />
Fereastra Referential Integrity Builder<br />
Pentru primele două opţiuni, există trei posibilităţi: cascade,<br />
restrict şi ignore.<br />
Cascade se referă la faptul că atunci când o înregistrare<br />
conţinând o valoare ale indexului primar din tabela-părinte este<br />
modificată/ştearsă, se realizează actualizarea/ştergerea automată a<br />
înregistrărilor din tabela-fiu care conţin acea valoare.<br />
Restrict se referă la faptul că nu este permisă<br />
modificarea/ştergerea unei înregistrări, şi implicit a unei valor a<br />
indexului primar, atunci când în tabela-fiu se regăsesc înregistrări<br />
care conţin acea valoarea.<br />
Ignore se referă la posibilitatea actualizării/ştergerii<br />
independente a înregistrărilor din cele două tabele în momentul<br />
modificării/ştergerii unei valori a indexului primar.<br />
Pentru opţiunea Rulea for Inserting există dor două posibilităţi:<br />
restrict şi ignore, referindu-se la faptul că nu este permisă/este<br />
permisă adăugarea unei noi înregistrări în tabela-fiu dacă valoarea<br />
înregistrată în index nu există în mulţimea valorilor indexului primar<br />
corespunzător tabelei-părinte.<br />
Studiu individual<br />
Aplicaţia 3: Creare legături temporare şi<br />
permamante între tabele aprţinând unei baze de<br />
date.
30<br />
APLICAŢIA 3<br />
Suport pentru laborator<br />
Să se realizeze un nou proiect. Să se realizeze o bază de<br />
date. Să se creeze următoarele tabele, aparţinând bazei de date:<br />
Structură<br />
Cod_client C 4<br />
Nume C 20<br />
Oras C 10<br />
Index primar, ascendent :<br />
cod_client<br />
Structură<br />
Nr_fact N 10<br />
Cod_client C 4<br />
Data D 8<br />
Index primar, ascendent :<br />
nr_fact<br />
Index normal, ascendent:<br />
cod_client<br />
Structură<br />
Cod_produs N 10<br />
Den_produs C 30<br />
PU N 10<br />
Cant N 10<br />
Nr_fact N 10<br />
Index primar,<br />
ascendent :<br />
cod_produs<br />
Index normal,<br />
ascendent: nr_fact<br />
Conţinut<br />
Conţinut<br />
Cod_client Nume Oras<br />
AMP Amep Brasov<br />
COR CorrImpex Galati<br />
DAV Daval Brasov<br />
ERG Energo Bucuresti<br />
HTR Hatrom Brasov<br />
Conţinut<br />
Nr_fact Cod_client Data<br />
23 AMP 05/11/05<br />
116 HTR 04/12/05<br />
315 COR 06/04/05<br />
117 DAV 12/03/04<br />
18 ERG 12/05/04<br />
56 ERG 11/07/05<br />
12 AMP 02/10/04<br />
Cod_<br />
produs<br />
Den_produs PU Cant Nr_fact<br />
1 Apa<br />
minerala<br />
2 500 56<br />
2 Biscuiti 1 55 116<br />
3 Cereale 4 15 315<br />
4 Portocale 5 10 116<br />
5 Servetele 1 150 117<br />
6 Ciocolata 3 40 116<br />
7 Compot 2 14 18<br />
8 Iaurt 3 12 23<br />
9 Paine 1 100 12
Limbaje de programare şi baze de date 31<br />
3. Să se stabilească legături temporare între cele trei tabele.<br />
4. Să se stabilească legături permamante între cele trei tabele.<br />
5. Să se stabilească următoarele restricţii de integritate<br />
referenţială: cascade pentru ştergere şi restrict pentru inserarea<br />
unei noi înregistrări.<br />
6. Să se verifice integritatea referenţială prin ştergerea unei<br />
înregistrări existente şi prin adăugarea unei noi înregistrări.
32<br />
Suport pentru laborator<br />
INSERAREA, MODIFICAREA ŞI ŞTERGEREA<br />
LINIILOR<br />
Principalele obiective ale capitolului sunt:<br />
ADĂUGAREA UNEI LINII<br />
Adăugarea unei linii într-o tabelă<br />
Editarea unor date dintr-o tabelă<br />
Ştergerea unor date dintr-o tabelă<br />
Comanda SQL de adăugare de noi linii este INSERT, care<br />
are, în modul de lucru cel mai puţin pretenţios următorul format:<br />
INSERT INTO TABELĂ [(ATRIBUT1, ATRIBUT2,... .)] VALUES<br />
(VALOARE_ATRIBUT1, VALOARE_ATRIBUT2,... .)<br />
În cazul tabelei ANGAJATI se poate introduce o nouă line<br />
astfel:<br />
Se dă tabela Angajaţi cu urmatoarele date:
Limbaje de programare şi baze de date 33<br />
INSERT INTO ANGAJATI VALUES (11, 'RADU', 'Info', 250)<br />
iar tabela va arăta astfel:<br />
STERGEREA LINIILOR<br />
Comanda SQL pentru ştergerea uneia sau mai multor linii<br />
dintr-o tabelă este DELETE<br />
DELETE FROM TABELA WHERE CONDITIE<br />
Dacă dorim să ştergem ultima înregistrare introdusă vom<br />
avea:<br />
DELETE FROM ANGAJATI WHERE NUME='RADU'
34<br />
Suport pentru laborator<br />
În cazul Visual FOXPRO este nevoie de comanda PACK ca<br />
ştergerea să fie efectivă, astfel:<br />
PACK<br />
Iar tabela va arăta astfel:<br />
MODIFICAREA VALORILOR UNOR ATRIBUTE<br />
Pentru a modifica valoarea unuia sau mai multor atribute sau<br />
mai multe linii dintr-o tabelă se foloseşte comanda UPDATE cu<br />
formatul general:<br />
UPDATE TABELA SET ATRIBUT1=EXPRESIE [,<br />
ATRIBUT2=EXPRESIE2.... .] WHERE PREDICAT
Limbaje de programare şi baze de date 35<br />
Modificarea se va produce pe toate liniile tabelei care<br />
îndeplinesc condiţia formulată prin predicat.<br />
În cazul tabelei ANGAJATI dacă dorim schimbarea salariului<br />
în 1000 pentru angajata GABRIELA vom avea:<br />
UPDATE ANGAJATI SET SAL_BRUT=1000 WHERE<br />
NUME='Gabriela'<br />
APLICAŢIA 4<br />
Studiu individual<br />
Aplicaţia 4: Introducere, ştergere şi modificarea<br />
unor date dintr-o tabelă<br />
1. Creaţi tabela FACTURI (ca în ANEXA 1)<br />
2. În tabela FACTURI (ANEXA 1) adăugaţi următoarele date:
36<br />
Suport pentru laborator<br />
3. În tabela FACTURI modificaţi VALOAREA la 75000 pentru toate<br />
facturile care au valoare mai mare de 10.000.<br />
4. Ştergeţi toate facturile pentru care cod_furn este c1.<br />
5. Modificati cod_furn în n99 pentru facturile a căror valoare este de<br />
cel puţin 8000.<br />
6. Ştergeti toate înregistrările pentru care nr_factură este mai mic de<br />
4000.<br />
7. Stergeti toate datele din tabela FACTURI.<br />
8. Introduceţi cinci facturi noi utilizând INSERT şi cinci facturi<br />
utilizând BROWSE.
Limbaje de programare şi baze de date 37<br />
NUCLEUL SQL ÎN VISUAL FOX PRO<br />
Principalele obiective ale capitolului sunt:<br />
Introducere în conceptul de interogare<br />
a bazelor de date<br />
Sintaxa şi utilizarea comenzii SELECT<br />
CONCEPTUL DE INTEROGARE ŞI COMANDA SELECT<br />
Extragerea informaţiilor din una sau mai multe tabele libere<br />
sau aparţinând unei baze de date, pe baza unor criterii definite de<br />
utilizator poartă denumirea de interogare.<br />
Visual Fox Pro include un set de comenzi ale limbajului SQL<br />
(Structured Query Language) care permite interogarea tabelelor şi<br />
furnizarea rezultatelor sub forma unor interogări, care pot fi<br />
depozitate la o destinaţie precizată. Prin intermediul unei interigări<br />
se construieşte o instrucţiune SELECT a acestui limbaj, care<br />
cuprinde întregul mecanism de interogare al VFP.<br />
Rezultatele interogărilor se pot obţine cu ajutorul unui<br />
generator denumit Query Designer, cu posibilitate de utilizare pe<br />
baza rubricii Queries din fereastra Project Manager, existând<br />
posibilitatea de a utiliza de asemenea şi ajutorul oferit de VFP prin<br />
intermediul Query Wizard.
38<br />
Suport pentru laborator<br />
O altă posibilitate de obţinere a rezultatelor interogărilor este<br />
utilizarea comenzii Select, reprezentată de o sintaxă specifică,<br />
comandă care va fi executată în fereastra de comenzi.<br />
Exemplificarea utilizării comenzii Select se va realiza utilizând o<br />
bază de date cu informaţii necesare organizării sesiunii studenţeşti.<br />
PRINCIPALELE CLAUZE ALE FRAZEI SELECT<br />
Orice frază de tip SELECT are trei clauze principale:<br />
SELECT<br />
FROM<br />
WHERE<br />
Dintre aceste trei clauze doar SELECT şi FROM sunt<br />
obligatorii în orice frază.<br />
SELECŢIA ŞI PROIECŢIA<br />
Clauza SELECT corespunde operatorului proiecţie din algebra<br />
relaţională, fiind utilizată pentru desemnarea listei de atribute<br />
(coloane) din rezultat. Clauza FROM este cea în care sunt<br />
enumerate relaţiile din care vor fi extrase informaţiile aferente<br />
consultării. Clauza WHERE desemnează predicatul selectiv al<br />
algebrei relaţionale (condiţia), relativ la atribute ale relaţiilor care<br />
apar în clauza FROM.<br />
La modul general, o consultare SQL poate fi prezentată sub<br />
forma:<br />
select c1,c2,...,cn<br />
from r1,r2,...,rm<br />
where p<br />
unde:<br />
cj - reprezintă coloanele rezultat;<br />
rj - reprezintă relaţiile ce trebuie parcurse;<br />
p - reprezintă predicatul, condiţia ce trebuie îndeplinită de<br />
tupluri (linii) pentru a fi incluse în rezultat.<br />
Predicatul poate fi simplu sau compus (din mai multe condiţii).<br />
Când clauza WHERE este omisă se consideră implicit că<br />
predicatul p are valoare logică ''adevărat'', astfel încât în rezultat vor
Limbaje de programare şi baze de date 39<br />
fi incluse toate liniile din tabelă sau produsul cartezian al tabelelor,<br />
enumerate în clauza FROM.<br />
Dacă în locul coloanelor c1,c2,...,cn apare simbolul *,<br />
rezultatul va fi alcătuit din toate coloanele relaţiilor specificate în<br />
clauza FROM.<br />
Atributele rezultatului preiau numele din tabela (tabelele)<br />
specificate în clauza FROM. Schimbarea numelui se realizează prin<br />
caluza AS.<br />
exemplu:<br />
select c1,c2 as NUME_NOU from r1<br />
unde numele coloanei c2 devine NUME_NOU;<br />
SQL nu elimină automat liniile identice din rezultat, deci pentru<br />
ca fiecare linie să apară o singură dată este necesara utilizarea<br />
opţiunii DISTINCT.<br />
exemplu:<br />
select distinct c1,c2 from r1<br />
În concluzie, o frază SELECT, corespunde:<br />
• unei selecţii algebrice (clauza WHERE p)<br />
• unei proiecţii (SELECT ci)<br />
• unui produs cartezian (FROM - r1 ⊗ r2 ⊗ ... ⊗ rm)<br />
şi conduce la obţinerea unui rezultat cu n coloane, fiecare coloană<br />
fiind: un atribut din r1,r2,...,rm sau expresie calculată pe baza unor<br />
atribute din r1,r2,...,rm.<br />
Execuţia unei fraze SELECT realizează un rezultat sub formă<br />
tabelară.<br />
Rezultatul poate fi:<br />
1. o listă (text)<br />
2. o tabelă propriu-zisă<br />
3. o tabelă temporară<br />
4. o tabelă derivată (imagine)<br />
5. o variabilă masiv (tablou)<br />
Exemplu:<br />
Utilizăm tabela ANGAJATI în care introducem următoarele<br />
date:
40<br />
Datele tabelei angajati.dbf<br />
1. Care sunt datele conţinute în tabela angajati?<br />
Suport pentru laborator<br />
select nr, nume, prenume, data_nasterii, sal_brut, cod_dep from<br />
angajati<br />
sau:<br />
select * from angajati<br />
Rezultatele exemplului 1.1<br />
2. Care sunt numele salariaţilor şi salariul brut?<br />
select nume, sal_brut from angajati
Limbaje de programare şi baze de date 41<br />
Rezultatele exemplului 1.2<br />
3. Care sunt numele salariaţilor şi salariul brut, dar pentru coloana<br />
sal_brut denumim coloana salariu_brut?<br />
select nume, sal_brut as salariu_brut from angajati<br />
Rezultatele exemplului 1.3<br />
4. Afişaţi numele angajatilor şi salariul brut, pentru salariaţii care au<br />
salariul brut mai mare de 700 lei<br />
select nume from angajati where sal_brut>700<br />
Rezultatele exemplului 1.4<br />
5. Care sunt datele salariaţilor care lucrează în departamentul<br />
informatic (cod_dep="info")?<br />
select * from angajati WHERE cod_dep="info"<br />
Rezultatele exemplului 1.5
42<br />
Suport pentru laborator<br />
6. Care sunt datele salariaţilor care lucrează în departamentul<br />
informatic (cod_dep="info") şi care au salariul brut mai mare de 700<br />
de lei?<br />
select * from angajati where cod_dep="info" and sal_brut>700<br />
Rezultatele exemplului 1.6<br />
7. Afişaţi numele salariaţilor şi codul departamentului pentru<br />
angajatii care sunt fie în departamentul informatic (cod_dep="info")<br />
fie în departamentul contabilitate (cod_dep="cont")<br />
select nume, cod_dep from angajati where cod_dep="info" or<br />
cod_dep="cont"<br />
Rezultatele exemplului 1.7<br />
8. Afişaţi numele angajaţilor şi data naşterii pentru angajaţii născuţi<br />
după 15-03-1980 (formatul pentru data este {^yyyy/mm/dd})<br />
select nume, data_nasterii from angajati where data_nasterii ><br />
{^1980/03/15}<br />
Rezultatele exemplului 1.8<br />
9. Afişaţi numele angajaţilor şi data naşterii pentru angajaţii născuţi<br />
între 15-03-1980 şi 20-05-1983
Limbaje de programare şi baze de date 43<br />
select nume, data_nasterii from angajati where data_nasterii ><br />
{^1980/03/15} and data_nasterii < {^1983/05/20}<br />
Rezultatele exemplului 1.9<br />
10. Care sunt codurile de departament din tabela angajati?<br />
select cod_dep from angajati<br />
Rezultatele exemplului 1.10<br />
11. Care sunt codurile de departament din tabela angajati, afişate o<br />
singură dată?<br />
select distinct cod_dep from angajati<br />
Rezultatele exemplului 1.11
44<br />
APLICAŢIA 5<br />
Intrebări:<br />
Suport pentru laborator<br />
1. Care sunt clauzele principale ale unei<br />
selecţii?<br />
2. Care sunt clauzele obligatorii ale unei<br />
selecţii?<br />
3. Câte tabele putem trece la clauza FROM?<br />
Studiu individual<br />
Aplicaţia 5: Introducere de date, selecţii simple<br />
şi utilizând condiţii simple şi compuse.<br />
1. Realizaţi o tabelă FURNIZORI cu structura tabelei FURNIZORI<br />
din ANEXA 1.<br />
2. Introduceti următoarele date:<br />
3. Care sunt furnizorii din Brasov?<br />
4. Care sunt furnizorii din Braşov sau Bucuresti?
Limbaje de programare şi baze de date 45<br />
5. Care sunt furnizorii care nu stau în Constanţa?<br />
6. Ştergeţi furnizorii care sunt din Bucureşti.<br />
7. Introduceţi trei furnizori noi utilizând INSERT.<br />
8. Modificaţi localitatea în Cluj pentru furnizorii din Constanta.
46<br />
Coloane, expresii<br />
Suport pentru laborator<br />
Principalele obiective ale capitolului sunt:<br />
Definirea unor coloane noi<br />
Realizarea de calcule pe baza unor date din baza de<br />
date.<br />
O facilitate importantă în multe interogări SQL ţine de<br />
definirea, pe lângă atributele tabelelor, a unor coloane noi, pe baza<br />
unor expresii. Clauza AS ermite denumirea coloanelor calculate sau<br />
redenumirea unor coloane ale tabelelor.<br />
De exemplu dacă dorim să aflăm care este TVA-ul aferent<br />
unei facturi, vom avea:<br />
In tabelă FACTURI avem introduse următoarele date:
Limbaje de programare şi baze de date 47<br />
Datele tabelei FACTURI<br />
Pentru a afişa valoarea tva-ului, precum şi valoarea cu TVA<br />
pentru fiecare factură vom avea selectul:<br />
select nr_factura, cod_furn, data_fact, valoare, valoare*19/100 as<br />
TVA, valoare*119/100 as val_totala from facturi<br />
şi vom obţine Query-ul:<br />
Rezultatele selecţiei<br />
Dacă stabilim că pentru fiecare factură pe care o facem<br />
termenul scadent pentru plată este de 2 luni vom calcula data<br />
scadentă astfel:<br />
select nr_factura, gomonth(data_fact,2) as data_scadenta from<br />
facturi
48<br />
Suport pentru laborator<br />
Obţinerea datei scadente pentru fiecare factură<br />
Funcţia GOMONTH (data, nr_luni) returnează o nouă dată<br />
plecând de la data introdusă la care adună un nr. de luni.<br />
Dacă stabilim că pentru fiecare factură pe care o facem<br />
termenul scadent pentru plată este de 60 de zile vom calcula data<br />
scadentă astfel:<br />
select nr_factura, gomonth(data_fact,0)+60 as data_scadenta<br />
from facturi<br />
Obţinerea datei scadente pentru fiecare factură<br />
Intrebări:<br />
1. Cum putem să denumim coloana din rezultat?<br />
2. Cum putem obţine o coloană nouă utilizând în<br />
selecţie o condiţie?
Limbaje de programare şi baze de date 49<br />
APLICAŢIA 6<br />
Studiu individual<br />
Aplicaţia 6: Calcularea amortizării lunare prin<br />
metoda liniară.<br />
1. Realizaţi tabela MF după structura tabelei MF din ANEXA 1.<br />
2. Introduceti următoarele date:<br />
3. Care sunt mijloacele fixe cu valoare mai mare de 30000?<br />
4. Dacă PER_AMORT reprezintă perioada de amortizare în ani,<br />
calculati care este valoarea amortizării lunare liniare.<br />
5. Denumiţi coloana cu amortizarea lunară liniară AM_LUN.<br />
6. Care sunt mijloacele fixe care au amortizarea lunară mai mare de<br />
1000?<br />
7. Modificati perioada de amortizare în 5 pentru mijloacele fixe cu<br />
codul 10004.<br />
8. Calculaţi care este amortizarea lunară pentru "masina 2"<br />
9. Calculaţi amortizarea lunară liniară pentru mijloacele fixe<br />
cumpărate de la furnizorul c1 sau c2.
50<br />
Funcţiile agregat: COUNT,<br />
SUM, AVG, MIN, MAX<br />
Suport pentru laborator<br />
Principalele obiective ale capitolului sunt:<br />
Utilizarea funcţiilor Count, sum, avg. min, max<br />
Realizarea unor noi coloane care să conţină date<br />
obţinute prin utilizarea funcţiilor de mai sus.<br />
Funcţia COUNT contorizează valorile neutre ale unei coloane<br />
sau numărul de linii dintr-un rezultat al unei interogări, altfel spus, în<br />
rezultatul unei consultări, COUNT numără câte vaşlori diferite de<br />
NULL are o coloană specificată sau câte linii sunt:<br />
De exemplu dacă dorim să aflăm căte facturi amvem în tabela<br />
FACTURI (câte linii sunt) avem:<br />
select count (*) from facturi
Limbaje de programare şi baze de date 51<br />
Numărul de facturi din tabela FACTURI<br />
Sau de exemplu dacă dorim să vedem câte facturi au valoarea<br />
peste 3000 vom avea:<br />
select count(*) from facturi WHERE valoare>3000<br />
Numărul de facturi din tabela FACTURI<br />
cu valoare mai mare de 3000<br />
Funcţia SUM este una dintre cele mai utilizate funcţii în<br />
aplicaţiile economice, deoarece datele financiar-contabile şi cele ale<br />
evidenţei tehnico-operative sunt preponderent cantitative.<br />
De exemplu dacă dorim să aflăm care este valoarea totală a<br />
facturilor din tabela FACTURI avem:<br />
select sum(valoare) from facturi<br />
Valoarea totală a facturilor din tabela FACTURI<br />
Sau de exemplu dacă dorim să aflăm care este valoarea totală<br />
a facturilor din tabela FACTURI a furnizorului cu cod_furm "c2"<br />
avem:<br />
select sum(valoare) from facturi where cod_furn="c2"<br />
Valoarea totală a facturilor din tabela FACTURI<br />
a furnizorului cu cod_furm "c2"
52<br />
Suport pentru laborator<br />
Funcţia AVG (AVERAGE) calculează media aritmetică a unei<br />
coloane prin divizarea sumei valorilor coloanei respective la numărul<br />
de valori nenule ale acesteia.<br />
De exemplu dacă dorim să aflăm care este valoarea medie a<br />
facturilor din tabela FACTURI avem:<br />
select avg(valoare) from facturi<br />
Valoarea medie a facturilor din tabela FACTURI<br />
Sau de exemplu dacă dorim să aflăm care este valoarea<br />
medie a facturilor din tabela FACTURI a furnizorului cu cod_furm<br />
"c1" avem:<br />
select avg(valoare) from facturi where cod_furn="c1"<br />
Valoarea medie a facturilor din tabela FACTURI<br />
a furnizorului cu cod_furm "c1"<br />
Deosebit de utile în diverse tipuri de analiză cele două funcţii<br />
MIN şi MAX determină valoarea minimă şi maximă pentru o<br />
coloană. Se pot folosi şi pentru atribute de tip şir de caractere, caz<br />
în care elementul de comparaţie este codul ASCII al caracterelor.<br />
De exemplu dacă dorim care este valoare minimă din tabela<br />
facturi vom avea:<br />
select min(valoare) from facturi<br />
Valoarea minimă din FACTURI
Limbaje de programare şi baze de date 53<br />
Sau de exemplu dacă dorim care este valoare maximă din<br />
tabela facturi vom avea:<br />
select max(valoare) from facturi<br />
Valoarea maximă din FACTURI<br />
Dacă dorim să aflăm care este din punct de vedere alfabetic<br />
cod_furn cu cea mai mare valoare vom avea:<br />
select max(cod_furn) from facturi<br />
APLICAŢIA 7<br />
Valoarea maximă a cod_furn din FACTURI<br />
Studiu individual<br />
APLICAŢIA 7: Utilizarea funcţiilor: AVG; MIN;<br />
MAX; SUM; COUNT<br />
1. Realizaţi tabela FACTURI cu structura tabelei FACTURI din<br />
ANEXA 1.<br />
2. Introduceţi în tabela FACTURI următoarele date:
54<br />
Suport pentru laborator<br />
3. Care este media valorii facturilor?<br />
4. Care este valoarea cea mai mare a unei facturi?<br />
5. Care este valoarea cea mai mică a unei facturi?<br />
6. Calculaţi valoarea medie a valorii facturilor dar nu cu AVG.<br />
7. Câte facturi avem în tabelă?<br />
8. Cate facturi avem în tabelă cu o valoare mai mare de 5000?<br />
9. Câte facturi avem în tabelă cu o valoare între 4000 şi 30000?<br />
(prin două metode)<br />
10. Care este valoare medie a facturilor cu nr. 3525 şi 3522?
Limbaje de programare şi baze de date 55<br />
Opţiunea ORDER BY<br />
Principalele obiective ale capitolului sunt:<br />
Ordonarea datelor unei tabele după unul sau mai<br />
multe atribute<br />
Una dintre caracteristicile modelului relaţional este că nici<br />
ordinea atributelor, nici ordinea liniilor în relaţii nu reprezintă<br />
importanţă din punctul de vedere al conţinutului informaţional.<br />
Însă în practică forma de prezentare a rezultatelor interogării<br />
est importantă. Spre exemplu o listă a localităţilor dintr-o tabelă este<br />
mai uşor citită în ordine alfabetică.<br />
De exemplu dacă dorim pentru tabela facturi să afişăm toate<br />
datele ordonate după câmpul cod_furn vom avea<br />
select * from facturi order by cod_furn
56<br />
Suport pentru laborator<br />
Datele obţinute în urma ordonării după câmpul cod_furn<br />
Aranjarea se poate face atât crescător (ASC) cât şi<br />
descrescător (DESC). În plus se pot specifica mai multe coloane<br />
care să servească drept criterii suplimentare de ordonare. Astfel, la<br />
valori egale ale primului atribut, intră în acţiune criteriul de "balotaj",<br />
care este al doilea atribut, etc.<br />
De exemplu dacă dorim să ordonăm datele din facturi întâi<br />
după cod_furn şi apoi după valoare (după acest criteriu<br />
descrescător) vom avea:<br />
select * from facturi order by cod_furn, valoare desc<br />
Obţinerea datelor ordonate după cod_furn şi apoi<br />
descrescător după valoare<br />
Intrebări:<br />
1. Care este diferenţa între ORDER şi SORT?<br />
2. După câte câmpuri putem ordona şi cum?
Limbaje de programare şi baze de date 57<br />
APLICAŢIA 8<br />
Studiu individual<br />
APLICAŢIA 8: Ordonarea rezultatelor unei<br />
interogări.<br />
1. Realizaţi tabela MF după structura tabelei MF din ANEXA 1.<br />
2. Introduceti următoarele date:<br />
3. Care sunt datele din tabela MF, ordonate alfabetic după<br />
denumire?<br />
4. Care sunt datele din tabela MF, ordonate alfabetic după denumire<br />
şi apoi după valoare?<br />
5. Care este amortizarea lunară liniară pentru fiecare mijloc fix,<br />
datele fiind ordonate după denumirea mijlocului fix?<br />
6. Afişaţi denimirea mijloacelor fixe, ordonată alfabetic pentru<br />
mijloacele fixe cu o valoare mai mare de 32000 inclusiv.<br />
7. Afişaţi alfabetic codurile furnizor - o singură dată.<br />
8. Care este valoarea cea mai mare unui mijloc fix?<br />
9. Care este valoare medie a amortizării lunare a mijloacelor fixe?<br />
10. Câte mijloace fixe avem?
58<br />
Suport pentru laborator<br />
OPERATORII BETWEEN, LIKE ŞI IN<br />
Principalele obiective ale capitolului sunt:<br />
Utilizarea operatorilor<br />
BETWEEN<br />
LIKE<br />
IN<br />
Pentru formularea predicatului de selecţie, SQL permite<br />
utilizarea, pe lângă >,=,
Limbaje de programare şi baze de date 59<br />
Date afişate utilizând condiţia BETWEEN<br />
Acelaşi rezultat il puteam obţine şi cu o condiţie dublă:<br />
select * from facturi where valoare >= 4000 and valoare
60<br />
Suport pentru laborator<br />
Furnizorii a căror cod_furn începe cu litera "c"<br />
De exemplu dacă dorim să afişăm care sunt toţi furnizorii a<br />
căror cod_client începe cu litera "m" vom avea:<br />
select * from facturi where cod_furn like "m%"<br />
Furnizorii a căror cod_furn începe cu litera "m"<br />
De exemplu dacă dorim să afişăm care sunt toţi furnizorii a<br />
căror cod_client are două caractere şi al doilea caracter este 5 vom<br />
avea:<br />
select * from facturi where cod_furn like "_5"<br />
Furnizorii a căror cod_furn are două caractere<br />
şi al doilea caracter este 5<br />
Atunci când se testează dacă valoarea unui atribut este<br />
încadrabilă într-o listă de valori dată, în locul folosirii abundente a<br />
operatorului OR este mai elegant să se apeleze la operatorul IN.<br />
De exemplu dacă dorim să afişăm facturile furnizorilor care au<br />
cod_furn c1, c3 şi c4 avem:<br />
select * from facturi where cod_furn in ("c1","c3","c4")
Limbaje de programare şi baze de date 61<br />
Facturile furnizorilor care au cod_furn c1, c3 şi c4<br />
Sau de exemplu dacă dorim să selectăm facturile care au<br />
valoare de 500, 600, 5000 vom avea:<br />
select * from facturi where valoare in (500, 600, 5000)<br />
APLICAŢIA 9<br />
Facturile care au valoare de 500, 600, 5000<br />
Intrebări:<br />
1. Care este diferenţa între operatorii<br />
BETWEEN şi IN?<br />
2. Cu ce poate fi substituit operatorul<br />
BETWEEN?<br />
Studiu individual<br />
APLCAŢIA 9: Utilizarea operatorilor BETWEEN;<br />
LIKE şi IN în calcularea unor date pe baza<br />
tabelei ANGAJATI.<br />
1. Realizaţi tabela SALARIATI pe baza structurii tabelei ANGAJATI<br />
din ANEXA 1.
62<br />
2. În tabelă introduceţi următoarele date:<br />
Suport pentru laborator<br />
3. Care sunt salariaţii care au salariu cuprins între 550 şi 1000?<br />
4. Care sunt angajaţii care au salariu 600, 1000, 750, sau 300?<br />
5. Câţi angajaţi avem?<br />
6. Care este salariul mediu?<br />
7. Care este numele salariatului cu salariul cel mai mare?<br />
8. Care sunt angajaţii a căror nume începe cu litera M sau I?<br />
9. Câţi angajaţi au prenumele din trei litere?<br />
10. Care sunt salariaţii care nu au prenumele ION sau IOANA?
Limbaje de programare şi baze de date 63<br />
REUNIUNE, PRODUS CARTEZIAN<br />
Principalele obiective ale capitolului sunt:<br />
Prezentarea operatorului UNION<br />
Realizarea produsului cartezian<br />
Primii trei operatori asamblişti prezintă operatori SQL dedicaţi:<br />
UNION, INTERSECT, MINUS (EXTRACT), în timp ce produsul<br />
cartezian se calculează automat prin simpla enumerare a celor fouă<br />
tabele din clauza FROM.<br />
La reuniunea a două tabele, SQL elimină automat liniile<br />
identice din rezultat. Dacă se doreşte prelucrarea tuturor liniilor celor<br />
două relaţii şi implicit apariţia de linii duplicate, se foloseşte caluza<br />
ALL (UNION ALL).<br />
De exemplu, după aceeaşi strctură a tabelei FURNIZORI<br />
creăm tabela FURNIZORI2.<br />
Tabela FURNIZORI2 conţine următoarele date:
64<br />
Datele tabelei FURNIZORI2<br />
Datele tabelei FURNIZORI<br />
Suport pentru laborator<br />
Dacă dorim să afişăm toate datele (utilizând reuniunea) din<br />
tabelele FURNIZORI şi FURNIZORI2 avem:<br />
select * from furnizori union select * from furnizori2
Limbaje de programare şi baze de date 65<br />
Toate datele (utilizând reuniunea) din tabelele FURNIZORI şi<br />
FURNIZORI2<br />
SQL nu pune la dispoziţie vreun operator special dedicat<br />
produsului cartezian.<br />
Produsul cartezian se realizează prein simpla enumerare a<br />
tabebelor în clauza FROM.<br />
De exemplu dacă dorim să realizăm produsul cartezian între<br />
tabelele FACTURI şi FURNIZORI avem:<br />
select * from facturi, furnizori
66<br />
Suport pentru laborator<br />
Produsul cartezian al tabelelor FACTURI şi FURNIZORI<br />
APLICAŢIA 10<br />
Intrebări:<br />
1. Ce reprezintă operatorul UNION?<br />
2. Cum se realizează produsul cartezian?<br />
Studiu individual<br />
APLICAŢIA 10: Evidenţa mijloacelor fixe ale<br />
unei întreprinderi<br />
1. Realizaţi tabela MF1 şi MF2 după structura tabelei MF din<br />
ANEXA 1.
Limbaje de programare şi baze de date 67<br />
2. Introduceti următoarele date:<br />
Datele tabelei MF1<br />
Datele tabelei MF2<br />
3. Care sunt datele din tabela MF1, ordonate alfabetic după<br />
denumire?<br />
4. Care sunt datele din tabela MF2, ordonate alfabetic după<br />
denumire şi apoi după valoare?<br />
5. Afişaţi datele celor două tabele într-un query<br />
6. Care sunt mijloacele fixe ce se găsesc în MF1 şi nu se găsesc în<br />
MF2?<br />
7. Care sunt mijloacele fixe ce se găsesc şi în MF1 şi în MF2?<br />
8. Care este valoarea medie a mijloacelor fixe din MF1?<br />
9. Care este valoarea medie a mijloacelor fixe din MF2 a căror nume<br />
începe cu litera C?
68<br />
Suport pentru laborator<br />
10. Care sunt mijloacele fixe din tabela MF2 furnizate de furnizorii cu<br />
codurile: c1, c2, c4, c5,c8?
Limbaje de programare şi baze de date 69<br />
THETA ŞI ECHI-JONCŢIUNEA<br />
Principalele obiective ale capitolului sunt:<br />
Realizarea unei legături între două sau mai multe<br />
tabele<br />
Utilizarea condiţiilor în echi-joncţiune<br />
SQL nu prezintă clauze sau operatori speciali pentru joncţiune,<br />
joncţiunea fiind o combinaţie între produs cartezian şi selecţie.<br />
Deci pentru theta-joncţiunea dintre două relaţii R1 şi R2 avem:<br />
unde:<br />
select * from R1, R2 where R1.A>=R2.E<br />
R1<br />
A B C<br />
20 XYZ 30<br />
30 XXZ 20<br />
40 YYX 25<br />
iar pentru echi-joncţiune avem:<br />
R2<br />
C D E<br />
25 XYZ 30<br />
40 YYX 25<br />
30 XXZ 40
70<br />
respectiv<br />
select * from R1, R2 where R1.A=R2.E<br />
Varianta cu INNER JOIN (joncţiune internă) este:<br />
select * from R1 inner join R2 on R1.A>=R2.E<br />
select * from R1 inner join R2 on R1.A=R2.E<br />
Suport pentru laborator<br />
Pentru următorul exemplu utilizăm următoarele tabele:<br />
FURNIZORI, FACTURI cu următoarele date:<br />
Se cere să de afişeze pentru fiecare factură numele<br />
furnizorului.
Limbaje de programare şi baze de date 71<br />
select facturi.*, furnizori.nume_furn from facturi, furnizori where<br />
facturi.cod_furn=furnizori.cod_furn<br />
Numele furnizorului pentru fiecare factură<br />
Acelaşi rezultat se poate obţine utilizând INNER JOIN:<br />
select facturi.*, furnizori.nume_furn from facturi inner join furnizori<br />
ON facturi.cod_furn=furnizori.cod_furn<br />
Numele furnizorului pentru fiecare factură<br />
Dacă dorim să afişăm numele furnizorului pentru fiecare<br />
factură numai pentru furnizorul cu cod_furn "c1" vom avea:<br />
select facturi.*, furnizori.nume_furn from facturi, furnizori where<br />
facturi.cod_furn=furnizori.cod_furn and facturi.cod_furn="c1"
72<br />
APLICAŢIA 11<br />
Numele furnizorului pentru fiecare factură<br />
numai pentru furnizorul cu cod_furn "c1"<br />
Intrebări:<br />
Suport pentru laborator<br />
1. De ce două tabele sunt legate logic prin<br />
valori?<br />
2. Care este condiţia necesară pentru echijoncţiune?<br />
Studiu individual<br />
APLICAŢIA 11: Evidenţa salariaţilor dintr-o firmă<br />
1. Să se realizeze tabelele ANGAJATI şi DEPARTAMENTE după<br />
structura tabelelor ANGAJATI şi DEPARTAMENTE din ANEXA 1<br />
2. Introduceţi în tabele următoarele date:
Limbaje de programare şi baze de date 73<br />
3. Afişaţi şeful pentru fiecare angajat.<br />
4. Care sunt angajaţii care lucrează în Braşov?<br />
5. Câţi angajaţi lucrează în Bucureşti?<br />
6. Care este numele angajatului cu salariul maxim?<br />
7. Care este fondul de salarii pentru fiecare cod_dep?<br />
8. Care sunt angajatii angajaţi dupa 01/01/1980?<br />
9. Care sunt angajaţii care lucrează la departamentul marketing?<br />
10. Câţi subalterni are Vlad?<br />
11. Care este salariul mediu pentru departamentul management?<br />
12. Care sunt angajaţii a căror şef începe cu litera "A"?<br />
13. Care sunt angajaţii care lucrează în Braşov sau Bucureşti?
74<br />
Suport pentru laborator<br />
GRUPAREA TUPLURILOR: GROUP BY ŞI<br />
HAVING<br />
Principalele obiective ale capitolului sunt:<br />
Utilizarea grupurilor<br />
Utilizarea condiţiilor pentru grupuri<br />
Clauza GROUP BY formează grupe (grupuri) de tupluri ale<br />
unei relaţii, pe baza valorilor comune ale unui atribut. În frazele<br />
SELECT formulate până în acest paragraf, prin intermediul WHERE<br />
au fost selectate tupluri ale tabelei. Prin asocierea unei clauze<br />
HAVING la GROUP BY este posibilă selectare anumitor grupuri de<br />
tupluri ce îndeplinesc un criteriu, valabil numai la nivel de grup (nu şi<br />
la nivel de linie).<br />
Clauza unei fraze SELECT ce conţine această clauză se<br />
obţine prin regruparea tuturor liniilor din tabelele eumerate în FROM,<br />
extrăgându-se câte o apariţie pentru fiecare valoare distinctă a<br />
coloanei/grupului de coloane.<br />
Formatul general este:
Limbaje de programare şi baze de date 75<br />
select coloană1, coloană2,...,coloană m from tabelă group by<br />
coloană_de_regrupare<br />
De exemplu dacă dorim să vedem care este valoarea totală a<br />
facturilor pentru fiecare cod_furn vom avea:<br />
select cod_furn, sum(valoare) from facturi group by cod_furn<br />
Valoarea totală a facturilor pentru fiecare cod_furn<br />
Cea mai simplă definiţie a clauzei HAVING este: clauza<br />
HAVING este WHERE-ul ce operează la nivel de grupuri. Dacă<br />
WHERE acţionează la nivel de tuplu, selectând acele linii care<br />
îndeplinesc o condiţie specificată, HAVING permite specificarea<br />
unor condiţii de selecţie care se aplică rupurilor de linii create prin<br />
GROUP BY.<br />
Din rezultat sunt eliminate toate grupurile care nu satisfac<br />
condiţia specificată.<br />
De exemplu dacă dorim să vedem care este valoarea totală a<br />
facturilor pentru cod_furn egal cu "c1" vom avea:<br />
select cod_furn, sum(valoare) from facturi group by cod_furn having<br />
cod_furn="c1"<br />
Valoarea totală a facturilor pentru<br />
cod_furn egal cu "c1"
76<br />
APLICAŢIA 12<br />
Intrebări:<br />
Suport pentru laborator<br />
Când se utilizează GROUP BY?<br />
Care este definiţia condiţiei HAVING?<br />
Studiu individual<br />
APLICAŢIA 12: Situaţii de grup la nivelul<br />
salariaţilor<br />
1. Să se realizeze tabelele ANGAJATI şi DEPARTAMENTE după<br />
structura tabelelor ANGAJATI şi DEPARTAMENTE din ANEXA 1<br />
2. Introduceţi în tabele următoarele date:
Limbaje de programare şi baze de date 77<br />
3. Afişaţi şeful pentru fiecare angajat.<br />
4. Care este salariul total pentru fiecare departament?<br />
5. Care este salariul total pentru departamentul MANAGEMENT?<br />
6. Care este suma totală a salariilor din departamentele<br />
management şi contabilitate?<br />
7. Care este numărul de salariaţi din fiecare departament?<br />
8. Care este departamentul cu angajaţii cei mai mulţi?<br />
9. Care este şeful departamentului cu cei mai mulţi angajaţi?<br />
10. Câţi angajaţi are Vlad?
78<br />
Suport pentru laborator<br />
FUNCŢII DE CALCUL ÎN VISUAL FOX PRO<br />
Principalele obiective ale capitolului sunt:<br />
Utilizarea funcţiilor de calcul în Visual Fox Pro<br />
Visual Fox Pro permite utilizarea unor instrucţiuni specifice,<br />
executate în fereastra de comenzi, pentru calcule statistice, dar şi<br />
funcţii statistice şi financiare.<br />
Instrucţiunile cel mai des utilizate pentru calcule statistice sunt:<br />
average to <br />
Instrucţiunea furnizează media aritmetică a valorilor numerice din<br />
câmpul specificat.<br />
count to <br />
Instrucţiunea furnizează numărul de înregistrări din tabelă care<br />
respectă condiţiile impuse în domeniul înregistrărilor.
Limbaje de programare şi baze de date 79<br />
sum to <br />
Instrucţiunea furnizează suma (pe coloană) valorilor din câmpul<br />
specificat.<br />
Unde: denumire câmp reprezintă câmpul pe baza valorilor căruia se<br />
va realiza suma;<br />
domeniul înregistrărilor reprezintă de obicei o condiţie de<br />
filtrare a valorilor care intră în sumă;<br />
denumire variabilă reprezintă o variabilă nouă în care va fi<br />
depozitat rezultatul însumării valorilor.<br />
Pentru afişarea rezultatelor acestor operaţii se srie în fereastra de<br />
comenzi:<br />
?[mesaj], <br />
Exemple de instrucţiuni pentru calcule statistice<br />
Principalele funcţii statistice: AVG( ), COUNT( ), SUM( ) având<br />
efecte similare cu instrucţiunile menţionate mai sus, se utilizează în<br />
cadrul unor instrucţiuni cum ar fi CALCULATE sau SELECT.<br />
Funcţiile financiare cel mai des utilizate sunt:<br />
• PAYMENT (valoare împrumut, rata dobânzii, perioada) –<br />
determină rata periodică – de regulă lunară – care trebuie
80<br />
Suport pentru laborator<br />
achitată pentru a stinge o datorie, un împrumut într-o<br />
perioadă de timp dată, la o anumită rată a dobânzii.<br />
• FV (rata lunară, rata dobânzii, număr de perioade) –<br />
determină valoarea actualizată a unei investiţii cu plăţi<br />
periodice egale, pentru un număr cunoscut de perioade<br />
egale de timp, la o anumită valoare a ratei dobânzii.<br />
• PV (rata lunară, rata dobânzii, număr de perioade) –<br />
determină valoarea prezentă a unei investiţii realizate în<br />
viitor, în condiţiile achitării unor plăţi periodice constante, pe<br />
o anumită perioadă, la o rată a dobânzii constantă.<br />
Observaţie: rata dobânzii se raportează la 12 în toate cele trei<br />
cazuri, caz în care numărul de perioade reprezintă numărul de luni.<br />
Aceste funcţii se utilizează în cadrul unor comenzi de tip<br />
browse. În fereastra de comenzi se va scrie:<br />
browse fields , ,...,<br />
=(parametri<br />
corespunzători)<br />
Denumirile câmpurilor afişate prin comanda browse, strâns<br />
legate de parametrii funcţiei, se utilizează pentru a oferi o imagine<br />
completă asupra situaţiei analizate, alternativ existând posibilitatea<br />
afişării doar a rezultatului obnţinut prin utilizarea funcţiei financiare.<br />
APLICAŢIA 13<br />
Studiu individual<br />
Aplicaţie 13: Utilizare funcţii statistice şi<br />
financiare.<br />
Să se construiască un nou proiect. Să se construiască o tabelă<br />
având următoarea structură:<br />
Cod_firma C 4<br />
Credit N 20<br />
Rata N 20<br />
Rata_dob_c N 6 ;2
Limbaje de programare şi baze de date 81<br />
şi cu următorul conţinut :<br />
Rata_dob_d N 6 ;2<br />
Perioada N 3<br />
Cod_firma Credit Rata Rata_dob_c Rata_dob_d Perioada<br />
AMP 10000 100 0.2 0.1 15<br />
COR 15000 145 0.21 0.11 20<br />
DAV 12000 250 0.23 0.12 36<br />
ERG 45000 500 0.22 0.1 48<br />
HTR 21500 350 0.21 0.14 18<br />
COM 50000 220 0.23 0.11 15<br />
SEP 35000 750 0.23 0.13 24<br />
MAN 15500 600 0.21 0.1 12<br />
RAR 75000 840 0.2 0.12 72<br />
a) Să se determine rata periodică, lunară, care trebuie plătită pentru<br />
creditul contractat, de către fiecare societate comercială, utilizând<br />
funcţia PAYMENT.<br />
b) Valorile înscrise în câmpul rata, reprezintă sume lunare egale<br />
care vor fi depuse de fiecare firmă, la începutul fiecărei luni, în<br />
conturi de depozit. Care este valoarea viitoare a sumei obţinute in<br />
cursul ultimei luni în care firmele vor depune bani în cont? (Utilizaţi<br />
funcţia FV)<br />
c) Câte firme au contactat credite cu o valoare peste 25000 lei?<br />
d) Care este suma totală a creditelor acordate de bănci tuturor<br />
firmelor?<br />
e) Care este media sumelor depuse lunar de firmele al căror cod<br />
începe cu litera “C”?
82<br />
Bibliografie:<br />
Suport pentru laborator<br />
1. Marin Fotache, SQL - Dialecte DB2, Oracle, Visual FoxPro,<br />
Editura Polirom, 2001, Bucureşti<br />
2. Mihaela Muntean, Dezvoltarea aplicaţiilor cu baze de date în<br />
Visual FoxPro, Editura All, 2001, Bucureşti<br />
3. Manualul de utilizare - Visual FoxPro 8.0<br />
4. Grupul BDASEIG, Baze de date. Fundamente teoretice şi<br />
practice, Infomega, 2002<br />
5. Manole Velicanu, Constanţa Bodea, Ion Lungu, Cristina Ioniţă,<br />
Georgeta Bădescu - Sisteme de Gestiune a Bazelor de Date,<br />
Petrion
Limbaje de programare şi baze de date 83<br />
Anexa 1<br />
Tabele utilizate<br />
unde: nr - număr; sal_brut - salariu brut; cod_dep - cod departament<br />
unde: cod_dep - cod departament; den-denumire<br />
unde: nr_factură-număr factură; data_fact - data facturii
84<br />
Suport pentru laborator<br />
unde: cod_furn - cod furnizor; nume_furn - nume furnizor<br />
unde: cod_mf - codul mijlocului fix, per_amort - perioada de<br />
amortizare, cod_furn - codul furnizorului