Sunteți pe pagina 1din 16

4.

Interogri
4.1 Probleme propuse
1. Folosind baza de date de la capitolul 1.1, sa se realizeze o interogare care s afieze toate notele studentului al crui nume este Tasica. Rezolvare: Aceast problem se poate rezolva uor folosind o facilitate a produsului Micrososft Access numit query sau interogare. n Access, ca in orice sistem de gestiune a bazelor de date, interogrile se realizeaz cu ajutorul unui limbajului SQL. Fiind un produs pentru nespecialiti, Microsoft Access pune la dispoziia utilizatorului o interfa care ascunde detaliile tehnice legate de limbajul SQL utilizatorul putnd realiza interogri fr ca sa cunoasc acest limbaj. Pentru a realiza un query este nevoie sa se intre in zona de lucru a query-urilor efectund click pe butonul Queries aflat in panoul dreapta a ferestrei Database.

Pentru a crea un query, recomandm folosirea opiunii Create query by using wizard care este cel mai uor de folosit. Efectuand dublu click pe aceasta optiune apare fereastra de mai jos:

Se selecteaz tabela dorit, n cazul nostru studeni, din care se includ in query campurile nume si prenume. Aceasta operatie se realizeaza efectuand click pe butonul cu semnul > pentru fiecare camp in parte.

Dup aceea se selcteaz tabela note, din care se includ in query cmpurile nota si data.

Apoi alegem denumirea din tabela materii.

In acest moment se apas butonul Next.

Fereastra de mai sus ntreab utilizatorul dac dorete o interogare detaliat sau una de tip rezumat. Recomandm s folosim opiunile implicite si s se apesm butonul Next ca s ajungem la pasul Finish.

Apsnd Finish, pe ecran o s apar rezultatele execuiei cererii. n cazul nostru, vor fi afiate notele pentru toi studenii.

Pentru a restriciona cutarea la codul unui anumit student, va trebui s modificm interogarea alegnd opiunea Design View din meniul de context care se obine efectund click dreapta pe numele interogrii.

In continuare restricionm query-ul la studenii cu numele de Tasica. Acest lucru se face scriind Tasica in zona de Criteria de sub nume.

Putem sa vizualizm codul SQL generat in mod automat de interfaa grafica efectund click dreapta in partea de sus a ferestrei si alegnd opiunea SQL View.

Pe ecran va aprea codul SQL corespunztor.

Adic: SELECT studeni.nume, studenti.prenume, note.nota, note.data, materii.denumire FROM studenti INNER JOIN (materii INNER JOIN [note] ON materii.ID = note.id_mat) ON studenti.ID = note.id_stud WHERE (((studenti.nume)="Tasica")); Nu vom insista asupra semnificaiei termenilor de mai sus deoarece depesc cadrul acestei lucrri. Trecnd peste majoritatea elementelor, se observa ca exista o clauza WHERE care pune condiia de selectare a nregistrrilor din tabele. Schimbnd condiia de aici se modifica si nregistrrile selectate de query. Spre exemplu da n loc de Tasica scriem Ion i pe ecran va apare:

Se pot face chiar i modificri mai complexe, cum ar fi s cerem numele de la tastatura. Dac scriem in loc de Tasica un cuvant oarecare, fr s fie ncadrat de ghilimele i fr s conin spaii, atunci sistemul va solicita de la tastatura o valoare. Sub form de parametru Spre exemplu putem modifica interogarea astfel: SELECT [studenti].[nume], [studenti].[prenume], [note].[nota], [note].[data], [materii].[denumire] FROM studenti INNER JOIN (materii INNER JOIN [note] ON [materii].[ID]=[note].[id_mat]) ON [studenti].[ID]=[note].[id_stud] WHERE ((([studenti].[nume])=Dati_numele)); In acest caz ni se va solicita s scriem numele, de la tastatur, dup care interogarea se va executa pentru valoarea respectiv. 2. Se d o firm care vinde diferite produse. Produsele sunt livrate clienilor conform contractelor. Orice contract poate s cuprind mai multe produse, dar un contract poate fi ncheiat cu un singur client. Dup definirea datelor i normalizarea lor pn n FN3 (forma normal 3), se poate construi o baz de date cu patru tabele: Tabelul clienti, cu informaii despre clienii firmei, cu care sau negociat diferite contracte:

Tabelul produse, care cuprinde date referitoare la produsele comercializate de firm:

Datele referitoare la contracte trebuie mprite n dou tabele, ca cerin a normalizrii (necesar pentru a aduce datele n forma normal doi) : exist o dependen parial ntre contract_id i client_id, astfel ultimul nu poate face parte din tabelul contracte. (la fel i cu data livrrii data_liv). Aceste dou cmpuri sunt dependente doar de contract_id, nu i de cheia compus din tabelul contracte. Se creaz astfel un tabel adiional: contract_info:

Urmtorul pas este crearea legturilor dintre tabele: Cu un client se pot ncheia mai multe contracte, astfel relaia dintre tabelele clieni i contr_info este de unu - la mai muli. Un contract poate cuprinde mai multe produse, pentru fiecare combinaie contract produs se creaz o linie nou n tabelul contracte. Fiecare produs figureaz ns o singur dat n tabelul produse. Astfel relaia dintre tabelele produse i contracte este de unu - la mai muli. La fel este i cea dintre contr_info i contract. Un contract este prezent o singur dat n tabelul contr_info, i de mai multe ori n tabelul contracte, datorit faptului, c un contract poate conine mai multe produse de livrat.

Access ofer diferite posibiliti de realizare a interogrilor (queries)

Crearea pas cu pas prin Design View Crearea cu vrjitorul (Wizard) Introducerea direct a comenzilor SQL n SQL View

S realizm n continuare o suit de interogri, de exemplu: 1. S se afieze toi clienii firmei se lanseaz vrjitorul din lista cu tabele se selecteaz tabelul clieni din lista available fields se aleg cmpurile client_nume i client_adresa se apas pe butonul finish din lista interogrilor existente se alege interogarea creat i se deschide prin dublu clic

2. S se determine acele produse, care apar cu mai mult de 10 buci n vreun contract. S se afieze i identificatorul contractului respectiv.

se lanseaz utilitarul de construcie a interogrilor (design view) se adaug tabelele produse i contracte se specific coloanele dorite din cele dou tabele se fixeaz condiia, ca pentru fiecare produs din contract numrul de buci livrate s fie mai mare dect zece ( buc > 10 )

comanda SQL aferant interogrii este ( afiabil n SQL View ):

SELECT produse.produs_nume, produse.produs_pret, contracte.buc, contracte.contract_id FROM produse INNER JOIN contracte ON produse.produs_id = contracte.produs_id WHERE (((contracte.buc)>10));

dac se dorete doar numele produselor, care apar n vreun contract cu caracteristica buc > 10, fr a cere i contractul n care figureaz, se poate afia doar numele produselor, o singur dat. n cazul precedent un produs poate s apar de mai multe ori, n funcie de numrul de contracte n care apare

SELECT distinct(produse.produs_nume) FROM produse INNER JOIN contracte ON produse.produs_id = contracte.produs_id WHERE (((contracte.buc)>10)); se execut interogarea prin alegerea opiunii Run din meniul Query

3. S se determine numrul total al contractelor ncheiate de firm

se calculeaz numrul liniilor din tabelul contr_info. Aici apare fiecare contract, ns doar ntr-o singur linie se lanseaz utilitarul de construcie a interogrilor (design view) se execut clic dreapta n cadrul ferestrei aprute, i se alege SQL View

se introduce comanda SQL, care returneaz numrul contractelor nregistrate n tabelul contr_info se alege din meniu comanda Run, pentru a executa interogarea n fereastra SQL View, interogarea arat astfel:

4. S se afieze toate informaiile disponibile despre clienii acelor contracte, care se livreaz nainte de 10 august 2004

pentru aceast interogare avem nevoie de dou tabel: contr_info, pentru a afla data livrrii, i de clieni, pentru a prelua datele necesare despre clieni se adaug tabelele produse i contracte n Design View se selecteaz cmpurile client_nume, client_adresa, contract_id, data_liv se fixeaz condiia pentru data_liv: < 4.08.2004

Comanda SQL corespunztoare este:

SELECT clienti.client_nume, clienti.client_adresa, contr_info.contract_id, contr_info.data_liv FROM clienti INNER JOIN contr_info ON clienti.client_id = contr_info.client_id WHERE ((contr_info.data_liv)<#8/4/2004#); se alege din meniu comanda Run, pentru a executa interogarea

5. S se afieze valoarea total a fiecrui contract care se livreaz dup 1 iulie 2004 valoarea total a unui contract se calculeaz ca suma nmulirii dintre produse i numrul de buci n care acestea vor fi livrate: cmpurile produs_pret din tabelul produse, respectiv buc din tabelul contracte se apeleaz la un treilea tabel: contracte, pentru a face legtura necesar se adaug cele trei tabele n Design View se selecteaz cmpurile contract_id, data_liv, iar pentru valoarea total a unui contract avem nevoie de o expresie compus: sum ( produse.produs_pret * contracte.buc ) pentru a calcula suma, se grupeaz toate expresiile n funcie de contract_id, prin elementul group by se fixeaz condiia pentru data_liv: < 1.07.2004. Acest cmp nu trebuie afiat, aa c nu selectm opiune show pentru el se alege din meniu comanda Run, pentru a executa interogarea

Comanda SQL corespunztoare este:

SELECT contr_info.contract_id, sum(produse.produs_pret*contracte.buc) AS valoare FROM produse INNER JOIN (contr_info INNER JOIN contracte ON contr_info.contract_id = contracte.contract_id) ON produse.produs_id = contracte.produs_id WHERE (((contr_info.data_liv)>#7/1/2004#)) GROUP BY contr_info.contract_id;

Probleme propuse:

1. Folosind baza de date de la problema din capitolul 1.1, s se afieze toi studenii al cror prenume este "Andrei". 2. Realiznd o interogare asupra bazei de date de la aceeai problem, s se afieze toate notele date de profesorul cu numele Man. 3. Plecnd de la datele din tabela profesori, s se afieze toate informaiile existente despre profesorul cu numele "Dinic". 4. Sa se afieze toate notele mai mari dect 5 existente n tabela note. 5. S se afieze numele tuturor studenilor care au restante.. 6.S se afieze toate materiile la care exista restante. 7. S se afieze toi profesorii care au dat note sub cinci. 8. S se afieze toi studenii al cror cod este egal cu o valoare citit de la tastatura. 9. S se determine care sunt materiile la care s-au dat note de 10. 10. S se afieze studenii care au obinut note egale cu cinci.

S-ar putea să vă placă și