Vous êtes sur la page 1sur 15

Lect univ dr Eugen Gabriel GARAIS

Capitolul 4. Realizarea Interogarilor (Queries) cu Ms Access 2016

SGBD Ms Access 2016 oferă posibilitatea creării de interogări simple sau complexe.
Prin interogări simple se înțelege o interogare ce permite afișarea datelor dintr-o
tabelă fără criterii de selecție sau câmpuri calulate iar prin interogări complexe se
înțeleg acele interogări ce permit afișarea corelată de înregistrări ce aparți unor tabele
diferite relaționate și al căror rezultat este filtrat prin criterii de selecție și conțin
câmpuri calculate. Câmpurile calculate pot fi rezultatul unei formule ce conține valori
a mai multor câmpuri separate prin operatori aritmetici sau rezultatul apelării unei
funcții cu mai mulți parametrii.
O interogare trebuie sa răspundă minimal necesității de a afișa date corelate din mai
multe tabele. Din necesitatea flexibilizării bazei de date datele sunt dispersate în
tabele separate astfel încât baza de date să răspundă a cât mai multe tipuri de viziuni
ale diferitelor tipuri de utilizatori ce caracterizeaza baza de date. Prin interogări
(QUERY) datele nu doar se recompun ci se pot transforma și intersecta astfel încât
rezultatul să ofere necesarul de informație dorit de utilizatori ce au fiecare o viziune
și o necesitate diferită asupra bazei de date.
Interogările pot fi de trei tipuri: interogări de selecție, Crosstab și interogări de
acțiune.

4.1 Interogări de tip selecție


Interogările de tip selecție sunt utilizate pentru a afișa valori din baza de date ce
corespund unor criterii impuse de viziunile formulate de fiecare tip de utilizator ce
reprezintă un anumit departament. Structura relațională a bazei de date ce respectă
regulile formelor de normalizare încă din faza de proiectare oferă flexibilitatea
necesară realizării interogărilor cu viziuni diverse și multiple. Structura relațională a
bazei de date oferă o imagine completă asupra datelor și valorilor posibile din care
cu ajutorul interogărilor de tip selecție extragem doar ceea ce ne este necesar la un
moment dat.
Interogările în cadrul Access sunt realizate cu ajutorul unei interfețe ajutătoare
denumită Query By Example (QBE) dar la baza întregii selecții rezultate se află cod
sursă în limbaj SQL – Structured Query Language. Utilizare limbajului general SQL
ușurează nu doar realizarea interogărilor la mod general ci și interacțiunea cu alte
componente interne sau externe ale Access. Înterogările de tip selecție sunt denumite
și SELECT QUERY. Aceste interogări sunt prefațate de cuvântul cheie SELECT
urmat de elemenete de tip denumire câmp, denumire tebelă, elemente de relaționare
și criterii de filtrare a rezultatelor.
În continuare se preztină modul de realizare a unei interogări de tip selecție din care
se dorește afișarea câmpurilor ce oferă informații despre facultăți și specializările
aferente. În figura 4.1 se prezintă structura întregii baze de date de studenti din care
vom selecta doar informațiile ce ne sunt necesare pentru interogare.

Figura 4.1 – Structura relațională a bazei de date Studenti

a Din tabul superior se selectează Create iar din grupul Queries selectă Query
Design
b Se deschide automat interfața de proiectare a unei noi interogări cu numele
inițial de Query1 de tip SELECT cu o fereastră denumită Show Table din
care se selectează cele două tabele necesare cu numele de facultati si
specializari (ținând tasta CTRL apasată + click de maus pentru selecție
multiplă) după care se apasă pe butonul Add urmat de butonul Close, precum
în figura 4.2

Figura 4.2 – fereastra inițială Show Table pentru alegerea tabelelor necesare
c După închiderea ferestrei Show Table sunt afișate cele doua tabele în zona
superioară a interfeței Query By Example. Tabelele sunt deja relaționate
datorită definirii relațiilor în zona Database Tools > Relationships.
Figura 4.3 – cele două tabele deja relaționate în zona QBE
d Din acest moment se trece la selectarea câmpurilor necesare populării
interogării. Câmpurile necesare trebuie să figureze în partea de jos în dreptul
câmpurilor Field și Table. Selectarea câmpurilor se poate face în două
moduri:
d. a. Se efectuează dublu click pe denumirea câmpurilor dorite pe
tabelele exemplificate în figura 4.3. În acest fel câmpurile sunt afișate
în mod succesiv în partea de jos în ordine de la stânga spre dreapta
d. b. Se selectează din lista derulantă aferentă câmpului Field câpul dorit.
Operațiune se repetă pentru fiecare din câpurile necesare.

Figura 4.4 – QBE cu câmpurile necesare selectate


e Pentru testarea rezultatului prezentei interogării vom apăsa pe butonul View
din tabul Design
f Salvarea pentru utilizarea ulterioară a interogării vom apăsa succesiv pe tasta
CTRL + S sau apăsăm pe butonul al cărui semnul general de salvare este
reprezentat printr-o dischetă identificabilă în partea din stânga sus a ecranului
Prin acest exemplu simplu am realizat o integorare care generează o listă simplă
formată din câmpuri ce se află fizic în tabele diferite dar sunt relaționate prin
utilizarea cheilor. Acesta este primul moment când se observă utilitatea directă a
relaționării tabelelor și a respectării formelor de normalizare. Prin flexibilitate oferită
de relaționare putem genera orice tip de listă necesară în exploatarea datelor.
Interogări de tip selecție cu aplicare de filtre
Interogările pe langă faptul că pot grupa câmpuri din tabele diferite spre a furniza o
listă completă de date, au posibilitatea și de filtra pe baza unor criterii de selecție
datele rezultate. Ne propunem un exemplu de interogare filtrată ce va evidenția o listă
a studenților împreună cu detalii despre centrul din care provin, numele facultății, a
specializării, a anului universitar și a anului de studiu în care sunt înmatriculați.
Această listă dorim să o filtrăm spre a afișa doar studenții din centrul București, care
sunt în anul de studiu 2, an universitar 2014/2015 și specializara de Informatică.
Pentru început vom realiza o interogare care să conțină tabelele: centre, studenti,
stud_specializari, specializari, facultati, stud_anuniv_andtudiu, an_univ ca în figura
4.5. Urmând procedura descrisă la exemplul anterior selectăm câmpurile necesare.

Figura 4.5 – Selecția de bază pentru care implementăm criterii de selecție


Rezultatul interogării la momentul actual (fără criterii de selecție adăugate) arată ca
în figura 4.6 și l-am obținut prin apăsarea butonului View din grupul Results al
tabului Design vizibil în figura 4.5 anterioară.

Figura 4.6 – Lista rezultată fără criterii de selecție


Vom trece la adăugarea criteriilor de selecție ce vor filtra rezultatul final al
interogării. Pentru acest lucru trebuia întâi să deschidem interogarea în modul de
vizualizare Design View prin apăsarea (în figura 4.6) a butonului View al grupului
Views din tabul Home.
În acest moment adăugăm criteriile de selecție propune ca în imaginea 4.7. Partea
superioară a QBE este identică ca în imaginea 4.5 fapt pentru care o vom exclude din
captura de ecran de mai jos.

Figura 4.7 – Criterii de selecție în QBE conform exercițiului propus


Prin rularea interogării, cu criteriile de selecție adăugate, lista prezentată inițial în
figura 4.6 se transformă în cea prezentată în figura 4.8.
Figura 4.8 – Rezultatul interpretării interogării după adăugarea criteriilor de selecție
În figura 4.7 criteriile au fost adăugate pe orizontală în dreptul câmpului Criteria fapt
ce semnifică o filtrare cu criterii ce se adaugă incremental iar rezultatul unei astfel de
interogări este unul care întrunește toate condițiile introduse cu operație selectivă de
tip AND / ȘI. Se observă câmpul inferior ce poartă numele de or. Dacă se
completează acest câmp, intuitiv criteriul de selecție va fi unul de tip OR / SAU.
Criteriile de selecție sunt de mai multe tipuri utilizate și în limbajul SQL. Tipurile
sunt influențate și de tipul de dată aferent câmpului din tabelă ce va popula lista din
interogare.
Tipurile de criterii de selecție sunt prezentate încontinuare pe baza de exemple:
a) Se dorește filtrarea listei după studenții din anul 2 și 3. Criteriul de adăugat
este In(2,3) . Cifrele adăugate funcției In reprezintă lista valorilor posibile
după care se face filtrarea.
b) Se dorește filtrarea anilor de studii astfel încât să aparțină intervalului dat de
la 1 la 3. Criteriul este Between 1 AND 3 . Pentru filtrul Between prima
valoare reprezintă primul element din listă iar ultimul element reprezintă
ultima valoare posibilă din listă.
c) Se dorește filtrarea după anii de studiu mai mari de 1, rezultatul începând cu
valoarea 2. Se adaugă criteriul > 1 . În criterii se pot utiliza și operatori
aritmetici de comparație.
d) Se dorește afișarea tuturor studenților a căror nume începe cu POP. Criteriul
este Like “Pop*”. Pentru filtrarea înregistrărilor ce conțin valori alfanumerice
a căror construcție este incompletă se utilizează cuvântul cheie LIKE urmat
de următoarele tipuri de construcție:
d. a. Like “abc*” – regăsirea valorilor care încep cu un set de caractere
d. b. Like “*xyz” – regăsirea valorilor care se finalizeaza cu un set de
caractere
d. c. Like “*klm*” - regăsirea valorilor ce au în conținut setul de
caractere, iar poziția acestora nu conteaza în text decât alăturarea
exactă a acestora
d. d. Like “m?o” – regăsirea valorilor a cărui element variabil este un
singur caracter alfanumeric. Numărul semenelor de întrebare
specifică numărul exact al caracterelor care pot fi de orice fel între
cele stabilite ca reper.
d. e. Like “m#o” – regăsirea valorilor a cărui element variabil este o cifră
e) Se dorește filtrarea după elemente de tip dată calendaristică
e. a. Să fie afișați toți studenții care au vârsta mai mare de 25 de ani. Se
adaugă criteriul DateDiff ("yyyy", [DataNasterii], Date()) > 25.
Acest criteriu se explică prin diferența numărului de ani dintre data
curentă Date() și data calendaristică indicată în înregistrările dn baza
de date. Se mai poate scrie > DateAdd (" yyyy ", -25, Date())
e. b. Sa fie afișați stundeții care sunt născuți în decembrie. Se adaugă
criteriul DatePart("m", [DataNasterii]) = 12
e. c. Să fie afișați studenții care sunt născuți în primul trimestru al anului.
Se adaugă criteriul DatePart("q", [DataNasterii]) = 1
e. d. Sa fie afișați studenții care nu au completată data nașterii. Se adaugă
criteriul de diferit față de valoarea vidă, adică Is Null sau se trece
negația în caz că se dorește variantă inversă Is Not Null
Interogări parametrizate
Introducerea unui parametru în câmpul alocat criteriului din interogări generează ca
răspuns o modalitate ușoară și rapidă de a personaliza în mod dinamic rezultatul
acesteia. Astfel dacă se dorește ca la momentul rulării unei interogări să fie afișat în
mod automat un mesaj ce permite introducerea unei valori de filtrare se va utiliza
interogarea parametrizată.
În continuare se prezintă pe baza interogării exemplificate în figura 4.5 utilizarea
criteriului parametrizat. Se presupune necesitatea ca la rularea interogării, ce prezintă
lista studenților, să fie afișat un mesaj care solicită introducerea anului de studiu dorit
ca element de filtrare.
Pentru ralizarea acestui tip de interogare se intră în modul de vizualizare Design
View al interogării iar în câmpul Criteria aferent câmpului din baza de date ce se
dorește a fi filtrat se adaugă un text între paranteze pătrate, ex: [Introduceți anul de
studiu:]
Figura 4.9 – Interogare cu filtru parametrizat
În figura anterioară se observă ferastra cu titlul “Enter Parameter Value” care după
mesajul de a introduce un an de studiu așteaptă într-un câmp de input o valoare după
care se vor filtra valorile câmpului anstudiu. Rezultatul interogării prezentate în
figura 4.9 după introducerea valorii “2” este expus în figura 4.10.

Figura 4.10 – Rezultatul interogării parametrizate cu filtru pe câmpul anstudiu


Schimbarea proprietăților de relaționare
Tipul de legătură ce este stabilit între două tabele sau proprietatea de relaționare
determină direcția prioritară de interogare. Direcția stabilită ca fiind una standard
este cea indicată prin stabilirea cheilor primare respectiv a cheilor străine dintre două
tabele ce sunt relaționate. Pe acest considerent se evidențiază în mod standard, ca
rezultat al unei interogări de tip selecție, liste al căror valori extrase din cel puțin două
tabele relaționate ca având în ambele sensuri câte un corespondent cu o semnificație
complementară. Acest tip de relaționare este unul de afișare al valorilor ca rezultat al
unei intersecții dintre două mulțimi conform teoriei algebrei relaționale.
Principalele tipuri conform algebrei relaționale ce specifică direcția de relaționare și
starea de echivalență sau non-echivalență sunt cele prezente în specificațiile SQL și
denumite INNER JOIN, LEFT JOIN respectiv RIGHT JOIN. In funcție de limbajul
SQL utilizat mai poartă și denumire diferite precum Left si Right OUTER JOIN.
În continuare sunt prezentate exemple ce prezintă diferențele funcționale ale tipurilor
diferite de relaționare. Se prezintă un exemplu pentru echivalență și unul pentru non-
echivalență.
Astfel ca prim exemplu se propune relizarea unei interogări ce prezintă din baza de
date a studenților facultățile și specializările aferente utilizând algebra relațională de
echivalență între cele două tabele.
a) Deschidem în modul Design interogarea exemplificată în figura 4.4 formată
din tabelele facultati si specializari
b) În partea superioară a ferestrei QBE efectuăm dublu-click pe linia ce
relaționează cele două tabele fapt ce va genera deschiderea unei ferestre
suplimentare (Join Properties) evidențiate în figura 4.11

Figura 4.11 – Tipuri de JOIN


c) Din fereastra de proprietăți identificăm trei posibilități prin care configurăm
algebra relațională pe baza căreia vom restricționa sau lărgi rezultatul
interogării
d) Dacă alegem prima variantă precum cea prezentată în figura 4.11 vom avea
o relaționare de echivalență totală astfel încât rezultatul final al interogării va
include doar înregistrări ce au valori în comun.
e) Rularea interogării prezente va avea un rezultat asemănător celei din figura
4.12

Figura 4.12 – Interogare cu echivalență totală între tabele – INNER JOIN


Pentru un al doilea exemplu vom modifica proprietatea de relaționare ce va fi
prioritar non-echivalentă sau parțial echivalentă.
Astfel vom dori obținerea unei liste prin care să putem identifica facultățile iar doar
acele specializări unde s-a specificat acest fapt nu doar facultățiile ce au specificat
expres și un set de specializări. În acest fel vom putea identifica și facultățile ce nu
au încă alocate nicio specializare. Astfel de interogări au un dublu rol și anume cel al
cărui scop a fost enunțat mai devreme dar și de control pentru identificarea
neconcordanțelor.
a) Edităm aceeași interogare iar în fereastra de setare a proprietăților de
relaționare vom selecta a doua variantă ce specifică faptul că vor fi evidențiate
prioritar înregistrările din tabela facultăți iar din tabela specializări doar cele
care au valori corespondente

Figura 4.13 – modificarea proprietății de relaționare


b) Rularea interogării generează un rezultat în care se pot identifica mai multe
valori din partea tabelei facultăți și mai puține din partea tabelei specializări
în figura 4.14

Figura 4.14 – Rezultatul interogării cu modificarea proprietății de relaționare


O astfel de interogare în care proprietatea este una diferită de INNER JOIN
evidențiază prioritar înregistrările din tabela spre care este indicată prioritatea și din
cealaltă tabelă se completează cu valori doar unde există disponibil. Acolo unde nu
există disponibil se completează automat cu valori NULL.
De menționat este că modificarea tipului de relaționare va genera valori nu doar utile
ca și semnificație funcțuioanlă din cerințele impuse de aplicație DAR rezultatul final
este important și în identificarea inconsistențelor datelor introduse. Practic observăm
în exemplul anterior că avem facultăți ce nu au atribuite și specializări fapt ce va
genera ca aceste facultăți să nu apară în aplicație ca posibile valori de aplicat la
înmatriculara studenților.
Dacă am fi utilizat în figura 4.13 varianta a treia rezultatul este unul în mare parte de
control. Iar dacă din rularea unei astfel de interogări am fi depistat exact contrariul
rezultatului obținut în figura 4.14, adică specializări ce nu au specificate facultăți ar
fi însemnat faptul că am descoperit o gravă inconsistență în baza de date. Această
inconsistență ar fi generată de setrea tipului de relaționare încă de la proiectarea bazei
de date prin care specificăm prin perechea formată din tabela facultăți având cheie
primară câmpul idfac și tabela specializări având cheie externă câmpul idfac ce
specifică în consecință în mod clar că o facultate poate avea mai multe specializări și
nimic mai mult. Astfel în consecință, identificarea unor specializări ce nu aparțin nici
unei facultăți ar fi o încalcare a definiției bazei de date principale. DAR, identificarea
unor astfel de rezultate sunt utile totuși în scopul depanării bazei de date ca parte a
unui proces de identificare a problemelor posibile.

4.2 Interogări de tip Crosstab


Interogările de tip încrucișat (Crosstab) se referă la generarea unor liste al căror
înregistrări capătă un sens specific dacă două seturi de valori ce sunt relaționate se
intersectează iar al cărui rezultat fiind unul agregat din care rezultă cel mult o valoare.
Operațiile ce pot fi aplicate pentru obținerea unei valori agregate sunt cele specifice
funcțiilor de tip SQL Aggregate Functions.
Funcțiile specifice de tip SQL Aggregate Functions sunt:
- AVG – returnează valoarea medie din lista de valori selectată
- COUNT – returnează numărul de valori din lista de valori selectată
- MAX – returnează valoarea maximă din lista de valori selectată
- MIN – returnează valoarea minimă din lista de valori selectată
- StDev – returnează estimarea valorii dispersiei fata de medie dintr-o lista de
valori selectată
- SUM – returnează suma valorilor cifrice din lista de valori selectată
- COUNT – returnează numărul de valori din lista de valori selectată
- VAR – returnează estimarea valorii variației dintr-o lista de valori selectată

Pentru realizarea unei astfel de interogări ne propunem realizarea unei liste ce


prezintă pe linii ca valoare numele unor societăți comericale; pe coloane ca valoare
datele calendaristice pentru care s-au emis facturi de către acele societăți al căror
nume este stabilit ca fiind pe linii; iar valoarea ce va fi considerată ca rezultat al
intersecției dintre valorile de pe linii cu cele de pe coloane să reprezinte numărul
facturilor regăsite strict în contextul dat.
Pașii necesari realizării unei interogări de tip crosstab pentru exemplul propus sunt:
a) se pornește realizarea interogării prin Create > Query Design
b) în primă fază a realizării interogării avem un Query de tip Select pentru care
este necesară modificarea tipului de Query în unul de tip Crosstab.
Modificarea se realizează din Design > Query Type > Crosstab
c) odată modificat tipul de interogare se observă modificarea câmpurilor
disponibile în partea de jos a ferestrei QBE prin adăugarea câmpului Crosstab
d) pentru exemplul dat au fost adăugate tabelele Furnizor și Factura din care au
fost selectate cele trei câmpuri necesare pentru crosstab și definit rolul în
crostab:
d. a. Denumire furnizor – Row Heading (valorile vor fi distribuite pe
linii)
d. b. Data factură – Column Heading (valorile vor fi distribuite pe
coloane)
d. c. Numar factura – Value (valoarea rezultată din intersecția valorilor
enumerate mai sus); la acest câmp s-a selectat și funcția SQL
Aggregate COUNT pentru numărarea valorilor eferente contextului
dat
e) Fereastra QBE înainte de a rula interogarea crosstab se prezintă ca în figura
4.15

Figura 4.15 – Ferastra QBE pentru interogarea de tip Crosstab


f) Fereastra rezultată după rularea interogării Crosstab se prezintă ca în figura
4.16
Figura 4.16 – Ferastra rezultată după rularea interogării de tip Crosstab
Acest exemplu poate fi extrapolat ca funcționalitate în orice listă a cărei necesitate
este aceea de a avea niște valori rezultate din intersecția a altor valori și al cărui
rezultat capătă sens. Un alt tip de exemplu ce se poate enunța este presupunând
existența unei baze de date pentru o instituție de învățământ. Se presupune existența
unor tabele de studenți, discipline și note. Dacă am rula o selecție obișnuită de tip
SELECT lista ar fi una ce prezintă valori în mod alăturat și anume Nume student,
Titlu Disciplină și Notă, iar acest lucru s-ar multiplica pe verticală pentru completarea
tuturor notelor pentru toți studenții, dar în acest mod am avea o listă ce prezintă într-
un mod neoptimizat valori din cauza repetării numelui fiecărui student. Realizând un
crosstab pentru problema enunțată putem avea distribuite numele studenților pe linii,
titlurile disciplinelor pe coloane, iar la intersecția acestora nota.