Cu ajutorul interogării (query) se pot selecta / modifica / şterge / adăuga informaţii din unul sau mai multe surse (tabele sau alte interogări), folosind condiţii logice.
În urma interogării rezultă un set de date dinamic (engl: Dynaset) care conţine doar câmpurile specificate ale înregistrărilor din tabelul/tabelele specificate şi care satisfac condiţiile/criteriile specificate.
Denumirea de "Set dinamic" se referă la faptul că:
- orice modificare a datelor în tabelele specificate în interogare implică o modificare corespunzătoare a rezultatului interogării (la o nouă executare a ei)
- orice modificare în setul dinamic are ca rezultat modificarea în tabelele respective (cu condiţia respectării integrităţii datelor).
Seturile de date dinamice nu sunt memorate; ele se formează din nou de fiecare dată când executăm o interogare.
Dacă în tabelele bazei de date intervin modificări, rezultatele executării a două interogări identice pot fi diferite.
Tipuri de interogări
Interogările pot fi clasificate astfel:
1. interogări simple sau de selecţie (folosind condiţii logice);
2. interogări pentru actualizare - modifică datele din tabele
- delete query (interogare de ştergere înregistrări pe baza criteriilor specificate),
- update query (interogare de modificare a câmpurilor) şi
- append query (interogare de adăugare înregistrări).
3. interogări încrucişate sau bidimensionale.
Caractere speciale în cadrul unei interogări
Exemple:
- începe cu propr = Like "propr*"
- conţine propr = Like "*propr*"
- numele conţine o literă greşită = Like "Adri?n"
- clienţi care încep cu literele A-H = Like "[a-h]*"
Sintaxa unei interogări
SELECT [domeniu] lista_selectie
FROM nume_tabela1, nume_tabela2,...
[WHERE criteriul_de_selectie]
[ORDER BY câmpuri_criteriu [ASC|DESC]]
[GROUP BY câmp_de_grupare
[HAVING criteriul_de_ grupare]]
unde
domeniu permite stabilirea modalitaţii de manipulare a înregistrărilor din baza de date asupra căreia se efectuează selecţia şi poate fi:
- ALL:
permite includerea tuturor înregistrarilor ce îndeplinesc condiţiile impuse. Cum frazele SELECT tabela si SELECT ALL tabela au practic acelasi rezultat, calificativul ALL este destul de rar utilizat;
- DISTINCT: are ca efect eliminarea înregistrărilor care conţin duplicate în câmpurile selectate astfel se va afişa doar o apariţie a datei multiple;
- DISTINCTROW are în vedere înregistrările duplicate în ansamblul lor, nu numai pe cele care au câmpuri duplicate.
Lista_selectie cuprinde toate câmpurile care vor apărea în tabela cu rezultatele interogării. Câmpurile adăugate în rândul Field din grila Query a machetei grafice QBE, care au marcată caseta de validare Show, sunt aceleaşi cu cele menţionate în lista de selecţie.
În scrierea interogărilor de selecţie simple SQL ACCESS este posibilă şi folosirea funcţiilor totalizatoare. Cele mai importante funcţii din această categorie sunt:
COUNT : returnează numărul de înregistrări care respectă condiţiile stabilite prin clauza WHERE,
SUM : redă suma tuturor valorilor dintr-un câmp; operează numai cu valori numerice,
AVG : calculează valoarea medie a unui câmp numeric,
MAX : permite determinarea celei mai mari valori dintr-un câmp,
MIN : duce la obţinerea celei mai mici valori a unui câmp ramâne valabilă şi aici restricţia privind clauza WHERE.
În cadrul listei de selecţie se pot defini şi alias-uri. Acestea reprezintă un pseudonim (nume) asociat unui câmp astfel: câmp AS alias
Clauza FROM specifică numele tabelei sau tabelelor care vor forma suportul interogării. Dacă în lista_selectie se includ câmpuri din mai multe tabele, în faţa numelui acestora trebuie precizată tabela din care fac parte. Asa cum arătam la regulile de sintaxă, pentru separarea numelor de tabele, se utilizeaza semnul , (virgulă). Trebuie să precizăm faptul că în cadrul acestei clauze se pot menţiona pe lângă tabele, ca surse de informaţii pentru interogările SQL, şi interogări care au fost deja create.
Clauza WHERE face interogările mai selective, specificând faptul că vor fi afişate numai înregistrările care îndeplinesc criteriul descris. Parametrul criteriul de selecţie este o expresie care conţine un operator de tip text (şir) sau numeric, în funcţie de tipul câmpului. Clauza WHERE este opţională şi nu operează cu funcţii totalizatoare. În cadrul condiţiei din clauza WHERE apar pot fi utilizaţi operatorii : AND, OR, NOT, IN, BETWEEN, LIKE. Apelând la aceştia, este posibilă construirea unor condiţii mai complexe.
Clauza ORDER BY este utilizată atunci când se doreşte ca rezultatele interogării să fie ordonate în mod crescător (ASC) sau descrescător (DESC). Sortarea este opţională şi se poate realiza după unul sau mai multe câmpuri_criteriu (definite drept chei de sortare). Componenta BY a clauzei nu poate să lipsească atunci când se doreşte sortarea rezultatelor interogării SQL ACCESS !
Clauza GROUP BY precizează câmpul sau câmpurile pe baza cărora se va efectua gruparea înregistrărilor. În acelaşi timp, prin intermediul acestei clauze, se pot executa funcţiile agregate descrise în lista de selecţie pentru fiecare dintre grupări (constituite pe baza câmpurilor de grupare). Echivalentul acestei clauze în macheta grafica QBE de construcţie a interogării îl reprezintă rândul Total.
Clauza HAVING se referă la criteriul care va fi aplicat câmpului-definit ca argument al funcţiei agregat. Altfel spus, când se foloseşte clauza GROUP BY şi este necesară şi o condiţie, se va utiliza clauza HAVING. Spre deosebire de WHERE, care acţioneaza înainte de a se efectua gruparea înregistrărilor, HAVING va opera după definirea acesteia. De remarcat faptul că se admite utilizarea unei funcţii agregat care nu apare în lista de selecţie, precum şi apelarea la mai multe criterii de grupare.
O facilitate deosebit de importantă a limbajului SQL o reprezintă posibilitatea de a grupa şi folosi date din tabele diferite. Operaţiile de asociere induse de clauza JOIN au ca rezultat producerea tuturor combinaţiilor posibile, pentru conţinutul informaţional al fiecărei tabele. Noile înregistrări care rezultă în urma joncţiunii vor deveni disponibile pentru selecţiile ulterioare. La o asociere pot participa mai mult de două tabele.
Principala modalitate de realizarea a joncţiunii este sintetizată de următoarea sintaxă:
SELECT [domeniu] lista_selectie
FROM nume_tabela1 {INNER|LEFT OUTER|RIGHT OUTER} JOIN nume_tabela2
ON criteriul_de_asociere
[{INNER|LEFT OUTER|RIGHT OUTER} JOIN nume_tabela3
ON criteriul_de_asociere]...
[WHERE criteriul_de_selectie]
[ORDER BY câmpuri_criteriu [ASC|DESC]]
Semnificaţia elementelor de sintaxă descrise mai sus este următoarea:
INNER, LEFT OUTER, RIGHT, OUTER se referă la tipurile de joncţiuni (INNER JOIN, internă de tip echivalent, LEFT OUTER JOIN, externă de stânga, RIGHT OUTER JOIN, externă de dreapta).
De remarcat faptul că SQL ACCESS acceptă scrierea interogărilor externe fără specificarea explicită a lui OUTER,
JOIN specifică tabela care va fi asociată (nume_tabela2, nume_tabela3...) tabelei precizate în clauza FROM, iar
ON criteriul de asociere arată relaţia dintre câmpurile pe care se bazează jonctiunea.
Unul se afla în tabela asociată, iar celălalt există într-o altă tabela din lista cu numele tabelelor. Expresia criteriul_de_asociere conţine un operator de comparaţie (=,<,>,<>,<=,>=) şi va returna valorile logice TRUE sau FALSE.
Joncţiunile tip INNER JOIN determină o asociere a înregistrărilor din tabele, astfel încât să rezulte un număr total de înregistrări egal cu produsul numărului de înregistrări din fiecare tabelă.
Joncţiunile externe (OUTER) sunt de două tipuri: de stânga (LEFT OUTER JOIN) şi de dreapta (RIGHT OUTER JOIN), fiind destul de puţin utilizate. Echivalentul QBE al acestor categorii de joncţiuni este alegerea opţiunilor 1, 2 sau 3, din caseta Join Properties.
Instrucţiunile pentru manipularea datelor
Cele mai importante instructiuni sunt: INSERT, UPDATE si DELETE.
Comanda INSERT se foloseste pentru adaugarea de înregistrări într-un tabel. Prin această interogare de adăugare nu se pot insera date dintr-un tabel în el însuşi; operaţia ar fi totusi posibilă printr-o selectare prealabilă a datelor iniţiale într-un tabel temporar, urmată de modificarea şi readucerea lor în tabelul de la care s-a plecat.
Sintaxa comenzii este următoarea:
INSERT INTO nume_tabela (câmp1, câmp2...)
VALUES (valoare1,valoare2...
În acest caz se adaugă o înregistrare într-un tabel, menţionându-se câmpurile şi valorile asociate acestora. Ca particularitate se remarcă inserarea unei singure înregistrări la un moment dat. Prima forma a lui INSERT se utilizează pentru operaţii simple care presupun lucrul cu un număr redus de înregistrări. După lansarea în execuţie a interogării apare un mesaj de avertizare privind adăugarea noii înregistrări în baza de date şi caracterul ireversibil al acestei operaţii.
În cadrul acestui tip de inserare a datelor trebuie să se respecte următoarele reguli:
- valorile menţionate în clauza VALUES vor avea aceeaşi natură cu câmpurile specificate în clauza INTO,
- mărimea valorii corespunzătoare fiecărui câmp va fi mai mică decât dimensiunea câmpului,
- nu va fi obligatorie specificarea denumirii câmpurilor, deoarece SQL ACCESS va asocia listei de valori câmpurile în ordinea din structura înregistrării (prima valoare se va introduce în primul câmp, a doua valoare, în al doilea câmp s.a.m.d.)
- dacă un câmp are definiţia NOT NULL, va fi obligatorie introducerea unei valori pentru acesta.
Comanda DELETE are următoarea sintaxă:
DELETE FROM nume_tabela [WHERE criteriul_de_stergere]
se materializează în interogarea-acţiune de ştergere parţială sau totală a înregistrărilor din tabele. Astfel se va şterge doar conţinutul tabelului nu şi aceasta (pentru eliminarea tabelei se va apela la instrucţiunea DROP TABLE).
Comanda UPDATE are următoarea sintaxă:
UPDATE nume_tabela
SET nume_câmp1 = valoare1 [,nume_câmp2 = valoare2]...
[WHERE criteriul_de_actualizare]
Aceasta are atât scopul de a insera noi înregistrari, cât şi de a modifica valorile câmpurilor din înregistrările existente. Ca şi în cazul instrucţiunii INSERT, se va urmări dacă în câmpul cu valori de actualizat sunt permise numai valori unice. Atunci când se doreste actualizarea datelor din mai multe câmpuri se foloseşte virgula ca separator între câmpuri şi valorile acestora. Se pot utiliza mai multe condiţii WHERE apelând la operatorul logic AND pentru a limita actualizarea la înregistrări mai bine specificate.
Cereri de interogare imbricate
Scrierea unei interogări în cadrul alteia duce la apariţia unei subinterogări; setul de rezultate obţinut de la o interogare va constitui argument pentru o alta. Utilizatorul poate astfel să creeze legături între mai multe interogări SQL ACCESS, pe baza unor câmpuri unice, cu rol de căutare în structura tabelelor. Subinterogările înlocuiesc interogările imbricate din versiunile precedente, cu performanţe mult îmbunătăţite.
Cea mai simplă subinterogare are sintaxa urmatoare:
SELECT * FROM Tabela1
WHERE Tabela1.nume_ câmp =
(SELECT nume_câmp FROM Tabela2 WHERE criteriul_de_selectie)
Tabela1 şi Tabela2 vor avea un câmp comun (nume_câmp) care va reprezenta de fapt câmpul de legătură ce stă la baza construirii subinterogăarii. Clauza SELECT din subinterogare va avea acelaşi număr de câmpuri şi de natură similară cu cele din clauza WHERE a interogării externe.