Documente Academic
Documente Profesional
Documente Cultură
9-10
Formularea interogrilor pe baze de date n Access
Sumar
Scurt cuvnt nainte despre interogarea bazelor de date Limbajul de cereri SQL i corespondena n modul Query Design view Realizarea operaiilor de adugare i tergere Lucrare aplicativ propus spre rezolvare Evidena angajailor unei societi comerciale
Pentru reintrare n zona de structur a unei interogri pentru viitoare posibile modificri ale acesteia se selecteaz interogarea dorit i se acioneaz opiunea .
b) varianta SQL: SELECT * FROM Facultate; Exemplu: Se cere o list cu cmpurile CodStud, Specializare i Media din tabela Student.
b) varianta SQL: SELECT CodStud, Specializare, An FROM Student; Alias de coloan n cazul n care clauza SELECT conine expresii, numele coloanelor din rezultat sunt date de acestea. Dac se dorete ca n rezultat coloana respectiv s aib alt nume, acesta se poate specifica cu AS nume_nou. Exemplu: Afiarea numelui studentului cu denumirea Nume Student, a iniialei tatlui Inititiala tata i a prenumelui cu denumirea Prenume Student din tabela DatePersonale.
b) varianta SQL: SELECT Nume AS [Nume student], Init AS [Initiala tatalui], Prenume AS [Prenume student] FROM DatePersonale; Constante (literali) Dac n lista SELECT se gsesc i constante, atunci pe acele coloane toate liniile rezultatului vor conine valorile respective. Exemplu: Selectarea numelui studentului, textul este nscut la data de i data naterii din tabela DatePersonale.
b) varianta SQL: SELECT Nume, 'este nascut la' AS [Text], DataNast FROM DatePersonale;
4
b) varianta SQL: SELECT CNP, Nume, Prenume, DataNast FROM DatePersonale ORDER BY Nume, Prenume;
2.4 Operatori
Operatorul BETWEEN Sintaxa: BETWEEN valoare_initiala AND valoare_finala Operatorul BETWEEN indic o plaj de valori incluznd valorile din capetele acestuia, cele indicate. Este un operator derivat, astfel de condiii putnd fi scrise folosind >=, AND, <= i a fost introdus pentru ca cererile s fie mai apropiate de exprimarea n limba englez. Exemplu: Afiarea codului facultii, media, specializarea, pentru studenii care au media cuprins ntre 8 i 9 inclusiv.
5
b) varianta SQL: SELECT CodFac, Media, Specializare FROM Student WHERE Media BETWEEN 8 AND 9; Operatorul IN Sintaxa: IN (v1,v2,...vk) Operatorul IN indic apartenena la o mulime de valori (v1,v2,...vk). Este de asemenea un operator derivat, dar este foarte util pentru simplificarea scrierii cererilor n cazul n care mulimea conine un numr mare de valori. Exemplu: Afiarea codului facultii, codul studentului, specializarea, bursa pentru studenii care au codul facultaii 1 sau 3.
SELECT CodFac, CodStud, Specializare, Bursa FROM Student WHERE CodFac IN (1,3); Operatorul LIKE Sintaxa: LIKE sablon Operatorul LIKE a fost introdus pentru a se putea testa potrivirea valorii unei expresii cu un ablon. ablonul poate conine caractere care vor fi cutate aa cum este i caracterul special: * nsemnnd orice ir de caractere (inclusiv unul vid). Exemplu: Afiarea codul studentului, numelui, prenumelui, data naterii pentru studenii al cror nume ncepe cu litera A, folosind tabela DatePersonale.
6
SELECT CodStud, Nume, Prenume, DataNasterii FROM DatePersonale WHERE Prenume LIKE A*;
AS AS AS AS AS
[Numar studenti], [Media minima], [Media maxima], [Media generala], [Valoare totala burse]
Sintaxa: GROUP BY coloana1 [, coloana2] Exemplu: Se cere o situaie cuprinznd numrul total de studeni, media general i cuantumul total al burselor pe fiecare specializare n parte din cele existente.
SELECT Specializare, Avg(Media) AS [Media generala], Sum(Bursa) AS [Valoare burse] FROM Sudent GROUP BY Specializare;
Exemplu: S se refac exemplul anterior, aprnd n lista rezultat doar acei studeni a cror medie depete nota 8.
SELECT Specializare, Avg(Media) AS [Media generala], Sum(Bursa) AS [Valoare burse] FROM Sudent GROUP BY Specializare HAVING Media>=8;
n modul QBE Design View opiunile LEFT JOIN, respectiv, RIGHT JOIN, se aleg din fereastra Join Properties. Pentru a ajunge aici se d dublu click pe relaie n cadrul interogrii.
Opiunea 1 este cea implicit (INNER JOIN); opiunea 2 este echivalent opiunii LEFT JOIN, iar, opiunea 3 implic RIGHT JOIN.
b) varianta SQL: SELECT [Id ang], Nume, Prenume, Functia, [Data incad], [Sal incad] FROM Angajati ORDER BY Nume, Prenume; Ex. 1 b: Acelai enun ca n exerciiul anterior, dar, ntr-o alt form de reprezentare a interogrii. a) varianta Query Design view QBE:
11
b) varianta SQL: SELECT Angajati.* FROM Angajati ORDER BY Nume, Prenume; Ex. 2: S se refac prima interogare, astfel nct s apar n list doar acei angajai care sunt de profesie inginer.
SELECT Angajati.* FROM Angajati WHERE Functia='ING' ORDER BY Nume, Prenume; Ex. 3 a: S se refac prima interogare, astfel nct n list s apar acei angajai al cror nume ncepe cu litera P.
SELECT Angajati.* FROM Angajati WHERE Nume Like 'P*' ORDER BY Nume, Prenume;
12
Ex. 3 b: Se va reface interogarea anterioar, astfel nct n list vor aprea toi acei angajai al cror nume conine grupul de litere op. a) varianta Query Design view:
b) varianta SQL: SELECT Angajati.* FROM Angajati WHERE Nume Like '*op*' ORDER BY Nume, Prenume; Ex. 4: Se cere o list: id-ul de angajat, numele, prenumele, functia, data incadrrii n funcie, vechimea n munc i salariul cu care este ncadrat fiecare angajat. a) varianta Query Design view:
b) varianta SQL: SELECT [Id ang], Nume, Prenume, Functia, [Data incad], Int((Date()-[Data incad])/365) AS [Vechime in munca], [Sal incad] FROM Angajati; Ex. 5: S se modifice interogarea 4, astfel nct, n list s apar denumirea complet a funciei angajailor i nu doar codul acesteia.
13
SELECT [Id ang], Nume, Prenume, Functii.Functia, [Data incad], Int((Date()-[Data incad])/365) AS Vechime, [Sal incad] FROM Functii INNER JOIN Angajati ON Functii.[Cod fct] = Angajati.Functia; Ex. 6: Se cere o situaie similar celei precedente, doar c, n acest caz se cer acei angajai care sunt de profesie inginer sau muncitor, au vechime de pn n 4 ani n cmpul muncii, iar, salariul este peste media pe economie (considerm aceast medie ca fiind 1250 lei).
SELECT Angajati.[Id ang], Angajati.Nume, Angajati.Prenume, Functii.Functia, Angajati.[Data incad], Int((Date()-[Data incad])/365) AS [Vechime in munca], Angajati.[Sal incad] FROM Functii INNER JOIN Angajati ON Functii.[Cod fct] = Angajati.Functia WHERE Int((Date()-[Data incad])/365)<4 AND Angajati.[Sal incad]>=1250 AND (Angajati.Functia='ing' Or Angajati.Functia='mct') ORDER BY Angajati.Functia; Ex. 7: Se va reface enunul anterior, astfel nct, va exista posibilitatea afirii unei liste a acelor angajai care sau au sub 4 ani vechime, sau au salariul peste medie i sunt de profesie inginer sau muncitor.
SELECT Angajati.[Id ang], Angajati.Nume, Angajati.Prenume, Functii.Functia, Angajati.[Data incad], Int((Date()-[Data incad])/365) AS [Vechime in munca], Angajati.[Sal incad] FROM Functii INNER JOIN Angajati ON Functii.[Cod fct] = Angajati.Functia WHERE (Angajati.[Sal incad]>=1250 AND (Angajati.Functia='ing' Or Angajati.Functia='mct')) OR Int((Date()-[Data incad])/365)<4
14
ORDER BY Angajati.Functia; Ex. 8: O list cu numrul de angajai, maximul salarial, media salarial general i valoarea total a fondului de salarii.
SELECT Count([Id ang]) AS [Numar angajati], Max([Sal incad]) AS [Maxim salarial], Min([Sal incad]) AS [Minim salarial], Avg([Sal incad]) AS [Media salariala], Sum([Sal incad]) AS [Fond salarii] FROM Angajati; Ex. 9: Aceleai cerine ca n interogarea anterioar, dar, situaia se cere a se obine pe fiecare funcie n parte. Astfel de cereri se numesc cereri de totalizare sau de grupare i se activeaz prin butonul .
SELECT Functii.Functia, Count(Angajati.[Id ang]) AS [Numar angajati], Max(Angajati.[Sal incad]) AS [Maxim salarial], Min(Angajati.[Sal incad]) AS [Minim salarial], Sum(Angajati.[Sal incad]) AS [Fond salarii] FROM Functii INNER JOIN Angajati ON Functii.[Cod fct] = Angajati.Functia GROUP BY Functii.Functia; Ex. 10: S se refac interogarea anterioar astfel nct n list s apar i acele funcii existente n nomenclatorul de funcii, dar, pentru care nu sunt nregistrai angajai. Se va face o sortare descresctoare dup fondul de salarii.
15
SELECT Functii.Functia, Count(Angajati.[Id ang]) AS [Numar angajati], Max(Angajati.[Sal incad]) AS [Maxim salarial], Min(Angajati.[Sal incad]) AS [Minim salarial], Sum(Angajati.[Sal incad]) AS [Fond salarii] FROM Functii LEFT JOIN Angajati ON Functii.[Cod fct] = Angajati.Functia GROUP BY Functii.Functia; Ex. 11: Date complete (Id ang, Nume, Prenume, Data nast, CI, Adresa, Functia (n denumirea sa complet), studiile aferente respectivei funcii, Data incad i Sal incad). Lista se va da n ordine alfabetic a angajailor.
SELECT Angajati[Id ang], Nume, Prenume, [Data nast], CI, Adresa, Functii.Functia, Studii FROM Functii INNER JOIN (Angajati INNER JOIN [Date personale] ON Angajati.[Id ang] = [Date personale].[Id ang]) ON [Cod fct] = Angajati.Functia ORDER BY Nume, Prenume; Ex. 12: Aceleai cerine ca la interogarea anterioar, dar cerinele s fie pentru o anumit categorie de funcie, ce va fi dat de la tastatur n momentul rulrii interogrii (ca parametru).
16
SELECT Angajati[Id ang], Nume, Prenume, [Data nast], CI, Adresa, Functii.Functia, Studii FROM Functii INNER JOIN (Angajati INNER JOIN [Date personale] ON Angajati.[Id ang] = [Date personale].[Id ang]) ON [Cod fct] = Angajati.Functia WHERE Functii.Functia=[Introduceti o functie:] ORDER BY Nume, Prenume; Ex. 13: Aceleai cerine ca la interogarea precedent, dar, pentru un anumit angajat dat prin codul su de la tastatur (ca parametru).
SELECT Angajati[Id ang], Nume, Prenume, [Data nast], CI, Adresa, Functii.Functia, Studii FROM Functii INNER JOIN (Angajati INNER JOIN [Date personale] ON Angajati.[Id ang] = [Date personale].[Id ang]) ON [Cod fct] = Angajati.Functia WHERE Angajati.[Id ang]=[Dati un cod de angajat:] ORDER BY Nume, Prenume; Ex. 14: Se cere o list cu toi copii salariailor, i anume: codurile angajailor, numele lor de familie, iniiala prenumelui angajatului (ca si tat de copii) i prenumele copiilor.
SELECT [Id ang] AS [Cod angajat], Nume AS [Nume familie], LEFT(Prenume,1)+'.' AS [Intiala tata], [Copii angajati].Prenume AS [Prenume copil] FROM Angajati INNER JOIN [Copii angajati] ON Angajati.[Id ang] = [Copii angajati].[Cod ang];
17
Ex. 15: O situaie cu angajaii din firm (codul, numele i prenumele lor) cu numrul de copii ai fiecruia i suma total obinut din alocaiile acestora, n cazul angajailor ce au copii.
SELECT [Id ang], Nume, Prenume, Count([Cod ang]) AS [Numar copii] Sum(Alocatie) AS [Valoare din alocatii] FROM Angajati INNER JOIN [Copii angajati] ON Angajati.[Id ang] = [Copii angajati].[Cod ang] GROUP BY [Id ang], Nume, Prenume; Observaie: Dac se dorete o situaie care s includ o list complet, cu toi angajaii, indiferent c acetia au sau nu copii, se modific interogarea anterioar astfel nct n loc de INNER JOIN se va scrie LEFT JOIN. Ex. 16: Interogri de modificare. Toate salariile de ncadrare ale angajailor se mresc cu 10%.
UPDATE Angajati SET [Sal incad] = [sal incad]+[sal incad]*10/100; sau UPDATE Angajati SET [Sal incad] = [sal incad]*1.1; Ex. 17: Toate salariile de ncadrare ale sufer modificri cu un anumit procent dat de la tastatur.
18
UPDATE Angajati SET [Sal incad] = [sal incad]+[sal incad]*[Introduceti un procent de modificare salariala:]/100; Ex. 18: Toate salariile unei anumite categorii de angajai se modific cu un anumit procent. Categoria de funcii i procentul de modificare se dau de la tastatur.
UPDATE Angajati SET [Sal incad] = [sal incad]+[sal incad]*[Introduceti un procent de modificare salariala:]/100 WHERE Functia=[Introduceti o categorie de functii:]; Ex. 19: Salariul unui anumit angajat, dat prin codul su se modific cu un anumit procent.
UPDATE Angajati SET [Sal incad] = [sal incad]+[sal incad]*[Introduceti un procent de modificare salariala:]/100 WHERE [Id ang]=[Introduceti un cod angajat:]; Ex. 20: Interogri de tergere. Se terg din baza de date acei angajai care au mplinit vrsta de pensionare, adic 60 de ani. Indicaie: Aceast interogare presupune tergerea tuturor angajailor care au ndeplinit respectivul criteriu, mpreun cu datele lor personale i copii lor. Pentru aceasta trebuie intrat n relaia realizat pe baza de date. Apoi, se alege relaia ntre tabelele Angajati si Date personale i se realizeaz tergere n cascad pe cele dou tabele, prin bifarea opiunilor Enforce Referential Integrity, i ulterior Cascade Delete Related Records. Operaiunea anterior se repet n mod similar i pentru tabelele Angajati i Copii angajati.
19
DELETE Angajati.* FROM Angajati INNER JOIN [Date personale] ON Angajati.[Id ang] = [Date personale].[Cod ang] WHERE Int((Date()-[Data nast])/365)>=60; Observaie: n cazul interogrilor de modificare, respectiv, tergerea setarea unui astfel de tip de interogare se face n modul Query Design view prin click dreapta pe zona de lucru a interogrii i selectarea opiunii Update Query pentru cea de modificare, respectiv, Delete Query pentru cea de tergere.
Acelai lucru se mai poate realiza i folosind meniul Query, activ dup deschiderea unei interogri, i comutarea din opiunea interogri de selecie i forma implicit de interogare, n varianta de interogare modificare, sau , pentru interogri de tergere. , care este de altfel , pentru interogri de
20