Sunteți pe pagina 1din 15

CAPITOLUL 9.

CREAREA CERERILOR ACCESS UTILIZND LIMBAJUL SQL


9.1. Limbajul SQL caracterizare general SQL (Structured Query Language) reprezint un limbaj standard pentru lucrul cu baze de date relaionale. Prima standardizare s-a realizat n 1986 de ctre American National Standards Institute (ANSI). De atunci a fost considerat un standard internaional de ctre International Organization for Standardization (ISO) i International Electrotechnical Commission (IEC). A fost de asemenea adoptat standard federal pentru prelucrarea informaiei (Federal Information Processing Standard - FIPS) de ctre guvernul federal american. Utilizarea unui limbaj standard pentru lucrul cu baze de date este adecvat n toate cazurile n care este necesar schimbul de date ntre sisteme folosind baze de date. De aceea, toate sistemele de gestiune cu baze de date relaionale vor prezenta ca facilitate lucrul cu SQL. SQL este un limbaj declarativ i ofer un mod de lucru interactiv. SQL prezint urmtoarele componente: Limbajul de Definire a Datelor (DDL - Data Definition Language) care include comenzi permind crearea, modificarea sau tergerea definiiei (schemei) unei baze de date sau tabele. Exemple de comenzi: CREATE TABLE, CREATE VIEW; Limbajul de Manipulare a Datelor (DML Data Manipulation Language) permite interogarea i modificarea datelor stocate n tabele. Limbajul include toi operatorii aritmetici, predicate pentru realizarea comparaiilor inclusiv la nivelul irurilor, operaii de sintetizare (min, max, count, sum etc), clauze pentru lucrul la nivelul grupurilor de nregistrri (GROUP BY, HAVING). Exemple de comenzi: SELECT; INSERT; UPDATE; DELETE. Limbajul pentru controlul datelor (DCL Data Control Language) asigur securitatea i confidenialitatea bazei de date. Exemple de comenzi: GRANT (acordare de drepturi), REVOKE (anularea drepturilor). Prin aceste comenzi, utilizatorii cu drepturi de acces la baza de date primesc sau li se anuleaz privilegii asupra tabelelor sau view-urilor. Privilegiile vizeaz dreptul de consultare sau actualizare a tabelelor. Concluzionnd, prin intermediul SQL se poate realiza interogarea, actualizarea i gestionarea bazelor de date relaionale. Interfaa QBE permite definirea cu uurin a cererilor Access, oferind utilizatorilor un mediu prietenos de lucru. Pentru fiecare interogare, Access construiete o comand SQL echivalent. Cunoscnd limbajul SQL se pot creea sau edita cereri simple sau complexe. 9.2 Limbajul de Manipulare a Datelor: consultarea datelor Construirea unei cereri SQL se realizeaz utiliznd blocul de cerere SQL cu urmtoarea sintax: SELECT [DISTINCT] * / list atribute FROM list tabele [WHERE criteriu-de-cutare]

[GROUP BY atribut-de grupare] [HAVING criteriu-de-grupare] [ORDER BY criteriu-de-ordonare [ASC/DESC]]; unde: list atribute * list tabele DISTINCT WHERE specific numele atributelor ale clor valori vor fi returnate; specific toate atributele; specific sursa de date, n spe tabelele care vor fi consultate; returneaz valori distincte; nu se vor afia valori redundante n diferite tupluri; permite precizarea criteriului de selecie; vor fi returnate doar valorile care rspund criteriului precizat prin expresie; permite precizarea criteriului de selecie pe grupuri de atribute; precizeaz atributul n funcie de care are loc sortarea rezultatului returnat de cerere; ASC/DESC precizeaz ordonare cresctoare (este implicit), respectiv descresctoare.

HAVING ORDER BY

Apreciem necesare cteva precizri cu privire la regulile sintactice care trebuie urmate i anume: - Cuvintele scrise cu majuscule, respectiv clauzele blocului de cerere, sunt cuvinte rezervate, deci trebuie folosite aa cum sunt precizate n sintax; Elementele scrise cu minuscule reprezint nume-utilizator definind atribute, expresii; - Elementele sintactice cuprinse n paranteze drepte sunt opionale fiind utilizate n funcie de criteriile de selecie/ordonare dorite. Elementele sintactice necuprinse n paranteze drepte sunt obligatorii n orice comand SQL; - Referirea la nume de cmpuri formate din cuvinte compuse impune precizarea numelui atributului ntre paranteze drepte. Exemplu: [Numr Factur]; Blocul de cerere se ncheie ntotdeauna cu caracterul ;.

9.3 Blocuri de cereri SQL Fiind creat o cerere n modul de lucru QBE poate fi vizualizat comanda SQL cernd trecerea n modul de lucru SQL. Cererea se poate deschide n mod Design sau VIEW, iar din

maneta ferestrei se selecteaz modul de lucru dorit din meniul Results, n cazul nostru SQL (figura 9.1).

Figura 9. 1. Solicitarea trecerii n mod SQL Rezultatul va fi reprezentat de afiarea blocului de cerere SQL (figura 9.2):

Figura 9. 2. Bloc de cerere SQL Meniul Query Type (figura 9.3) ofer posibilitatea utilizrii unor tipuri de interogri specifice SQL i anume: Union Interogarea combin cmpuri corelate, din tabele multiple, ntr-un singur cmp.

Pass-through Data Definition

Interogarea trimite comanda SQL direct ctre un server de baze de date SQL; Interogarea care creaz, terge sau modific tabele, respectiv creaz indexuri ntr-un tabel din baza de date.

Figura 9. 3 Interogri specifice SQL 9.3.1 Blocuri de cereri simple Acestea permit vizualizarea tuplurilor coninute ntr-un tabel i returnarea valorii unor cmpuri calculate. Exemple: 1. Dac se dorete afiarea datelor stocate n tabelul MarfuriFacturat, comanda SQL va fi: SELECT * FROM MarfuriFacturate; Rezultatul cererii este cel prezentat n figura 9.4:

Figura 9. 4 Lista datelor din tabelul MarfuriFacturate 2. Dac dorim s tim ce facturi au fost emise, cererea SQL va trebui s returneze numai valorile pentru cmpul Numar Factura. Cererea SQL va fi: Select [Numar Factura] From MarfuriFacturate;

Rezultatul cererii este prezentat n figura 9.5: Figura 9. 5 Afiarea numrului facturilor 3. Deoarece mai multe tupluri ale tabelului consultat au prezentat aceeai valoare a numrului facturii putem solicita prin cererea SQL s se afieze valori neredundante, acest fapt impunnd utilizarea clauzei DISTINCT: SELECT DISTINCT NrFact FROM MarfuriFacturate; Rezultatul cererii este prezentat n figura 9.6:

Figura 9. 6 Afiarea numrului de factur o singur dat 4. Dac se dorete afiarea codurilor mrfurilor pentru care cantitile facturate sunt mai mari de 10 uniti i preurile sunt n intervalul [20, 50] cererea SQL va fi: SELECT CodMarfa, CantitateFact, PretFact FROM MarfuriFacturate WHERE CantitateFact>10 AND PretFact Between 20 And 50;

Figura 9. 7 Afiarea informaiilor solicitate prin cererea anterioar

Selectarea tuplurilor pentru care trebuiau ndeplinite criteriile precizate pentru atributele CantitateFact i PretFact a impus utilizarea clauzei WHERE i a expresiilor pentru precizarea criteriilor de selecie. Fiind precizate dou criterii de selecie a fost necesar utilizarea operatorului logic AND. 5. Dac dorim s cunoatem numele furnizorilor care au conturi deschise la BCR, atunci n acest caz clauza Select va avea precizat doar atributul NumeFz iar criteriul de selecie va fi precizat n clauza WHERE pe atributul ContBancar (care reine codul IBAN), precizndu-se (prin utilizarea operatorului LIKE) ca n componena contului s apar irul de caractere RNCB (codul BCR n cadrul codului IBAN, indiferent de numrul i tipul caracterelor care l preced i respectiv urmeaz). Cererea SQL va fi: SELECT NumeFz FROM Furnizori WHERE ContBancar Like "*RNCB*";

Figura 9. 8 Afiarea numelui furnizorilor 6. Dac dorim s obinem o list a mrfurilor ordonate dup numele acestora, atunci aceast cerin impune utilizarea clauzei ORDER. Fiind solicitat sortarea ascendent, nu este necesar precizarea sensului ordonrii (ascendent fiind implicit), ] cererea SQL va fi: SELECT CodMarfa, DenMarfa, UM, Calitate FROM Marfuri ORDER BY DenMarfa;

Figura 9. 9 Ordonarea mrfurilor dup denumire

7. Dac se solicit s tim numrul de produse pe fiecare calitate, vom consulta tabelul Marfuri, iar cererea SQL este urmtoarea: SELECT Calitate, Count(Calitate) AS [Numar marfuri] FROM Marfuri GROUP BY Calitate; Rezultatul cererii este prezentat n figura urmtoare:

Figura 9. 10 Numrul de produse dup calitate Observaie. Numrarea mrfurilor pe fiecare calitate a impus utilizarea clauzei GROUP BY, pentru gruparea tuplurilor dup valoarea atributului Calitate i aplicarea funciei Count() pentru numrarea tuplurilor din fiecare grup. Pentru ca antetul coloanei care returneaz valoarea funciei Count() s fie explicit, am precizat prin clauza AS titlul dorit pentru coloan i anume Numar marfuri. Pentru aceeai cerin se poate utiliza i urmtoarea cerere SQL: SELECT Marfuri.Calitate, Count(*) AS [Numar Produse] FROM Marfuri GROUP BY Marfuri.Calitate; 8. Dac dorim s cunoatem n ce an a fost emis factura cu numrul 114 cerere SQL este urmtoarea: SELECT Nrfact, Year([Facturi]![Datafact]) AS [An facturare] FROM Facturi WHERE Nrfact=114;

Figura 9. 11 Anul n care a fost emis factura nr. 114 Afiarea anului emiterii facturii cu numrul 114 a impus utilizarea n clauza SELECT a funciei YEAR() aplicat atributului Datafact. Pentru c informaia solicitat se referea strict la factura 114, clauza WHERE a precizat acest criteriu.

9. Dac se cere s cunoatem numele furnizorilor din urmtoarele localiti: Bucureti, Ploieti, Braov, atunci n acest caz, cererea va preciza n clauza SELECT doar atributul Numele Furnizorului, iar n clauza WHERE vom utiliza operatorul IN pentru a preciza mulimea valorilor admise pentru atributul localitate: SELECT NumeFz FROM Furnizori WHERE Localitate in ("Bucuresti", "Ploiesti", "Brasov");

Figura 9. 12 Afiarea numelui furnizorilor din Bucureti,Ploieti sau Braov 10. Dac dorim s calculm valoarea pentru fiecare marf facturat, cerere SQL este: SELECT NrFact, CodMarfa, [PretFact]*[CantitateFact] AS Valoare FROM MarfuriFacturate;

Figura 9. 13 Rezultatul calculrii valorii mrfurilor facturate n cererea SQL s-a inclus pe ultima coloan expresia de calcul, precizndu-se antetul dorit pentru coloan i anume Valoare. 9.3.2 Blocuri SQL complexe Blocurile complexe presupun extragerea datelor din mai multe tabele i utilizarea unori structuri complexe n corpul cererii. Blocuri de cerere utiliznd mai multe surse de date

Aceste blocuri de cereri vor preciza n clauza FROM mai multe tabele drept surs de date precum i tipul de compunere folosit. Cel mai utilizat tip de compunere este Inner Join care permite compunerea tuplurilor, din mai multe tabele, urmare a valorilor egale existente n atributele precizate drept cmpuri de compunere. Exemple: 1. Dorim s cunoatem furnizorii pentru care facturile emise au avut scadena n luna martie: SELECT Furnizori.NumeFz, Facturi.Nrfact, Month([DataScad]) AS Luna FROM Furnizori INNER JOIN Facturi ON Furnizori.CodFz = Facturi.CodFz WHERE Month([DataScad])=3;

Figura 9. 14 Furnizori cu facturi avnd scadena n luna martie Observaie. n exemplul de mai sus, clauza FROM a precizat ca tip de compunere Inner Join, compunerea realizndu-se dup valorile egale ale atributelor CodFz din tabelul Furnizori i respectiv Facturi. Un aspect pe care dorim s-l precizm este cel referitor la calificarea atributelor. n cazul n care sursa de date este reprezentat de mai multe tabele i sau cereri calificarea este obligatorie, fiind astfel precizat sursa de date pentru fiecare atribut la care face referire cererea. Pentru expresia utilizat n clauza WHERE se remarc utilizarea funciei Month() aplicat atributului DataScad, returnnd numrul lunii. 2. Dac se solicit s cunoatem Facturile pentru care nu s-au ntocmit chitane clauza FROM va utiliza un Left Join: SELECT Facturi.Nrfact, Facturi.Datafact, Chitanta.NrChit FROM Facturi LEFT JOIN Chitanta ON Facturi.Nrfact = Chitanta.NrFact WHERE Chitanta.NrChit is null; Tipul de Join folosit, Left Join va compune toate tuplurile din tabelul Facturi i doar tuplurile din tabelul Chitanta cu valori egale pe cmpul comun Nrfact. Aceata nsemn c, n cazul facturilor pentru care nu s-au ntocmit chitane, atributul NrChit nu va prezenta valori. De aceea clauza WHERE a precizat drept criteriu de selecie is null (nu exist valori) pe atributul NrChit.

Figura 9. 15 Facturile pentru care nu s-au ntocmit chitane

3. Dac se cere lista facturilor emise de furnizorul SC MUNTENIA SA pentru produsul banane, ] cererea SQL va fi: SELECT Facturi.Nrfact, Facturi.Datafact FROM Marfuri INNER JOIN ((Furnizori INNER JOIN Facturi ON Furnizori.CodFz = Facturi.CodFz) INNER JOIN MarfuriFacturate ON Facturi.Nrfact = MarfuriFacturate.NrFact) ON Marfuri.CodMarfa = MarfuriFacturate.CodMarfa WHERE Furnizori.NumeFz="SC Muntenia SA" AND Marfuri.DenMarfa="banane";

Figura 9. 16 Lista facturilor emise de furnizorul SC Muntenia SA pentru produsul banane Dei atributele pentru cerere se regsesc n structura a trei tabele i anume: Marfuri, Furnizori i Facturi, a fost necesar precizarea n clauza WHERE i a tabelului MarfuriFacturate pentru a putea lega tabelul Marfuri de restul tabelelor. Fiind precizate patru tabele drept surs de date a fost necesar construirea de trei compuneri (INNER JOIN). 9.3.3 Blocuri de cereri opernd pe grupuri de nregistrri Se cere s cunoatem valoarea minim i maxim pltit pentru fiecare furnizor: SELECT Furnizori.NumeFz, Min(Chitanta.SumaPl) AS [valoare minima], Max(Chitanta.SumaPl) AS [valoare maxima] FROM Furnizori INNER JOIN (Facturi INNER JOIN Chitanta ON Facturi.Nrfact = Chitanta.NrFact) ON Furnizori.CodFz = Facturi.CodFz GROUP BY Furnizori.NumeFz;

Figura 9. 17 Valoarea minim i maxim pltit pentru fiecare furnizor Determinarea valorii minime i maxime pentru sumele achitate pe fiecare furnizor a necesitat gruparea tuplurilor dup furnizori (clauza Group By) i aplicarea funciilor Min i Max pe atributul SumaPl la nivelul grupurilor de nregistrri obinute prin grupare. 9. 4 Utilizarea subcererilor Realizarea unor cutri complexe n baza de date impune realizarea unor cereri imbricate. Cererea inclus ntr-o alt cerere se numete subcerere. Exemple 1. Dac se cere s cunoatem facturile pentru care s-au emis chitane ale cror valori sunt egale cu oricare dintre chitanele emise pentru furnizorul SC Muntenia SA:

SELECT Facturi.Nrfact, Chitanta.NrChit, Furnizori.NumeFz FROM Furnizori INNER JOIN (Facturi INNER JOIN Chitanta ON Facturi.Nrfact = Chitanta.NrFact) ON Furnizori.CodFz = Facturi.CodFz WHERE chitanta.SumaPl= ANY (SELECT chitanta.SumaPl FROM Furnizori INNER JOIN (Facturi INNER JOIN Chitanta ON Facturi.Nrfact = Chitanta.NrFact) ON Furnizori.CodFz = Facturi.CodFz Where Furnizori.NumeFZ="SC MUNTENIA SA");

Figura 9. 18 Facturile pentru care s-au emis chitane ale cror valori sunt egale cu oricare dintre chitanele emise pentru furnizorul SC Muntenia SA Observaie. n exemplu de mai sus, la execuia cererii prima dat se execut subcererea pentru ca valorile returnate de aceasta s fie utilizate n clauza WHERE a cererii principale. Se remarc utilizarea operatorului ANY pentru a se cuta egalitatea cu oricare dintre valorile returnate de subcerere. 2. Dac vrem s cunoatem numele furnizorului pentru care chitana emis are valoarea cea mai mare, cererea SQL va fi: SELECT Furnizori.NumeFz FROM Furnizori INNER JOIN (Facturi INNER JOIN Chitanta ON Facturi.Nrfact = Chitanta.NrFact) ON Furnizori.CodFz = Facturi.CodFz Where Chitanta.SumaPl= (select max(Chitanta.SumaPl) From Chitanta);

Figura 9. 19 Numele furnizorului pentru care chitana emis are valoarea cea mai mare Subcererea va returna valoarea maxim achit astfel nct cererea principal va putea returna numele furnizorului pentru care suma achitat este egal cu cea determinat prin subcerere. UNION O cerere UNION combin rezultatele a dou sau mai multe cereri sau tabele. Fiind date tabelele Furnizori i Furnizori Noi avnd stocate urmtoarele tupluri:

Figura 9. 20 Tabelul Furnizori

Figura 9. 21 Tabelul Furnizori Noi Se dorete afiarea reunit a tuplurilor din tabele, respectiv tabelul Furnizori i tabelul Furnizori Noi, cererea SQL va fi: Table Furnizori UNION Table [Furnizori Noi]; Rezultatul este afiat n figura 9.22.

Figura 9. 22 Afiarea reunit a tuplurilor din tabelele Furnizori i Furnizori Noi 9.5 Limbajul de Manipulare a Datelor: modificarea datelor a) Introducerea de tupluri noi ntr-un tabel: Sintaxa comenzii este: INSERT INTO nume-tabel (nume _col1, nume _col2,...) VALUES (val1, val2...); Exemplu: INSERT INTO FACTURA1 VALUES (2, "toma",02/02/2010);

S-a introdus n tabelul FACTURA1 un tuplu, fiind precizate valorile pentru cele trei atribute din structura tabelului. Urmare a lansrii n execuie a comenzii vei fi atenionat asupra faptului c se va introduce acest tuplu n tabel (figura 9.23).

Figura 9. 23 Mesaj de atenionare cu privire la adugarea unui tuplu n tabel b) Modificarea datelor. Comanda UPDATE permite modificarea valorilor pentru unul sau mai multe atribute n unul sau mai multe tupluri ale unei tabele. Sintaxa este: UPDATE nume_tabel SET nume_col1 = {expresie1 | ( SELECT ...) }, nume _col2 = {expresie2 | ( SELECT ...) } [WHERE criteriu]; Exemplu: UPDATE FACTURA1 SET Datafact=DataFact+3 Where Nrfact=4; Comanda va modifica valoarea atributului DataFact (se adaug 3 zile) pentru tuplul avnd pentru atributul Nrfact valoarea 4. n urma executrii comenzii va fi afiat un mesaj de atenionare asupra modificrii valorii unui tuplu, cerndu-se confirmarea modificrii (figura 9.24).

Figura 9. 24 Mesaj de atenionare urmare a iniierii unui operaii de modificare c) tergerea tuplurilor.

Comanda DELETE permite tergerea tuplurilor, care ndeplinesc un anumit criteriu, dintr-un tabel. Sintaxa este: DELETE FROM nume_tabel WHERE criteriu; DELETE FROM FACTURA1 WHERE Nrfact=11; Comanda din exemplul de mai sus va terge tuplul pentru care atributul Nrfact are valoarea 11. Urmare a executrii acestei comenzi se va afia un mesaj de atenionare care solicit confirmarea sau anularea aciunii iniiate (figura 9.26).

Figura 9. 25 Mesaj de atenionare asupra iniierii unei operaii de tergere a unui tuplu 9.6 Limbajul de Descriere a Datelor Acesta conine comenzi pentru crearea tabelelor, tergere tabelelor i modificarea schemei unui tabel, dup cum urmeaz: a) Crearea unui tabel. Sintaxa comenzii de creare a unui tabel este: CREATE TABLE nume_tabel (nume_col1 TYPE1,[NOTNULL/ PRIMARY KEY/FOREIGN KEY] nume _col2 TYPE2,[.../.../...]; Exemplu: CREATE TABLE Factura1(nrfact number constraint nrfact primary key, client text (20), datafact date not null); Comanda va crea tabelul FACTURA1 avnd n structur atributele: nrfact (tip numeric cu rol de cheie primar), client (atribut de tip text lungime 20 de caractere), datafact (atribut de tip dat calendarisctic).

b) tergerea unui tabel. Sintaxa comenzii de tergere a unui tabel este: DROP TABLE nume_tabel; Exemplu: DROP TABLE FACTURA1; c) Modificarea schemei unui tabel, care se realizeaz prin comenzi de: Adugarea uneia sau mai multe coloane: Sintaxa este: ALTER TABLE nume_tabel ADD (nume_col1 TYPE1, nume _col2 TYPE2, ...); Exemplu: ALTER TABLE FACTURA ADD Comanda Number; Comanda adaug atributul Comanda avnd tip numeric. Urmare a executrii comenzii n tabelul FACTURA s-a adugat o nou coloan, reprezentat de atributul Comand. tergerea unei coloane: Sintaxa: ALTER TABLE nume_tabel DROP nume_col; Exemplu: ALTER TABLE FACTURA DROP Comanda; Urmare a executrii comenzii s-a ters atributul Comanda din tabelul FACTURA. Not: Atunci cnd se procedeaz la tergerea unor coloane dintr-un tabel trebuie s se in seama de restriciile de integritate existente.

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