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.