You are on page 1of 11

Cap.

Elemente de SQL (Structured Query Language)

este unul dintre cele mai puternice limbaje structurate pentru interogarea bazelor de date relationale, devenind un standard pentru o gama din ce in ce mai larga de SGBD-uri;
permite o comunicare complexa si rapida a utilizatorului cu bazele de date, in functie de cerintele si restrictiile acestora.

instructiuni de definire a datelor ce permit stabilirea structurii unei baze de date:


CREATE TABLE, ALTER TABLE, DROP TABLE, etc; instructiuni de manipulare a datelor in sensul adaugarii, modificarii si stergerii de inregistrari din tabelele componente ale unei baze de date: INSERT, UPDATE, DELETE; instructiuni de selectie a datelor ce permit consultarea bazelor de date: SELECT; instructiuni de procesare a tranzactiilor COMMIT, ROLLBACK precum si instructiuni privind controlul accesului la date GRANT, REVOKE.

I. CREATE TABLE

CREATE TABLE <tabela> ( <camp1> <tip1> [<restrictii_camp1>], <camp2> <tip2> [<restrictii_camp2>], <campn> <tipn> [<restrictii_campn>] [, <restrictii_tabela>] )

Private Sub Creare_Click()


DoCmd.RunSQL "create table stud (nrleg integer not null primary key, nume text(30), adr text(40))" DoCmd.RunSQL "create table discipl (codd byte not null primary key, dend text(30))" DoCmd.RunSQL "create table note (nrleg integer not null references stud (nrleg), codd byte not null,nota byte, foreign key(codd) references discipl(codd))"

End Sub
Obs. 1.Tabela note este o tabela fiu atat pentru tabela stud, cat si pentru tabela discipl. 2. La nivelul comenzii CREATE TABLE legatura dintre doua tabele reprezinta o restrictie la nivel de camp sau la nivel de tabela in cadrul tabelei fiu.

Private Sub Creare_Click()


DoCmd.RunSQL "create table produse (codpr integer primary key, denpr text(30), stoc integer)" DoCmd.RunSQL "create table clienti (codcl integer, dencl text(30), primary key(codcl))" DoCmd.RunSQL "create table facturi (nrfact integer primary key, datfact date, codcl integer references clienti(codcl))" DoCmd.RunSQL "create table liniifact (nrfact integer references facturi(nrfact), pozfact byte, codpr integer references produse(codpr), cant integer, pret integer, primary key(nrfact,pozfact))"

End Sub

ALTER TABLE, DROP TABLE

ADD <camp_nou>
ALTER TABLE <tabela> ALTER <modificare_proprietate_campi> DROP <campi>

DROP TABLE <tabela>

DoCmd.RunSQL "alter table produse add um text(5)" DoCmd.RunSQL "alter table produse alter stoc byte" DoCmd.RunSQL "alter table produse drop um"

II. INSERT, UPDATE, DELETE


INSERT INTO <tabela> [(<lista_campuri>)] VALUES (<lista_valori>)

UPDATE <tabela> SET <campi> = <vali> [, ] [WHERE <cond>]

DELETE FROM <tabela> [WHERE <cond>]

III. SELECT
3.1 Interogari simple SELECT * <lista_campuri> FROM <tabela> [WHERE <cond>] (*)

Obs. La executarea frazelor SELECT cu ajutorul metodei RunSQL a obiectului DoCmd se adauga, in sintaxa comenzii, clauza INTO <tabela_rezultat>.

Ex. Sa se selecteze un anumit produs (se va preciza codul acestuia):


DoCmd.RunSql select codpr,denpr,stoc into f from produse where codpr=3

Sub sel_prod() vcodpr = InputBox("Cod produs: ") DoCmd.RunSQL "select codpr,denpr,stoc into f from produse1 where codpr = " & vcodpr End Sub

Ex. Se selecteaza un produs, specificat prin codul sau, informatiile aferente se vor memora in tabela f si se va deschide aceasta tabela. Dupa inspectarea vizuala a acesteia, se va raspunde la intrebarea Doriti o corectare a stocului afisat (d/n) cu d sau n. Daca s-a tastat caracterul d (sau caracterul D), se va specifica noul stoc (vstoc) si se va executa o comanda UPDATE corespunzatoare. Se poate deschide apoi tabela produse pentru a verifica modificarea efectuata.

Sub sel_prod()
vcodpr = InputBox("Cod produs: ") DoCmd.RunSQL "select codpr,denpr,stoc into f from produse where codpr = " & vcodpr DoCmd.OpenTable "f" vopt = InputBox("Doriti o corectare a stocului afisat (d/n):") DoCmd.Close If vopt = "D" Or vopt = "d" Then vstoc = InputBox("Stoc nou") DoCmd.RunSQL "update produse set stoc =" & vstoc & " where codpr = " & vcodpr DoCmd.OpenTable "produse" End If

End Sub

Ex. Formulati diferite conditii in clauza WHERE Sa se selecteze produsul p7: DoCmd.RunSQL "select * into g1 from produse where denpr = 'p7 "

Sa se selecteze facturile din luna ianuarie: DoCmd.RunSQL "select * into g2 from facturi where datfact > #01/01/2007# and datfact < #31/01/2007#"
Sa se selecteze facturile din produsele 2, 7, 10, 16 si 25. se va utiliza operatorul IN: DoCmd.RunSQL "select * into g3 from liniifact where codpr in (2,7,10,16,25) Sa se selecteze produsele ale caror denumiri incep cu prod DoCmd.RunSQL "select * into g4 from produse where denpr like 'prod* Sa se afiseze clientii ale caror denumiri respecta sablonul ?c???: DoCmd.RunSQL "select * into g5 from clienti1 where dencl like '?c???' Sa se afiseze produsele ce au stocul cuprins intre 25 si 47 (incluzand cele doua limite). Se va utiliza operatorul BETWEEN DoCmd.RunSQL "select * into g6 from produse1 where stoc between 25 and 47"

3.2 Jonctiunea tabelelor


SELECT * <lista_campuri>

FROM <tabela1> INNERLEFTRIGHT JOIN <tabela2>


ON <tabela1>.<campi> = <tabela2>.campj> [WHERE <cond>]
jonctiunea naturala a tabelelor

(*)

Ex. 1. Sa se afiseze toate facturarile, dar sa apara si denumirea produselor facturate DoCmd.RunSQL "select produse.codpr, denpr, cant, pret, cant*pret into f1 from produse inner join liniifact on produse.codpr=liniifact.codpr" 2. Sa apara si produsele din care nu s-a facturat nimic !!! (jonctiune externa spre stanga) DoCmd.RunSQL "select produse.codpr, denpr, cant, pret, cant*pret into f2 from produse left join liniifact on produse.codpr=liniifact.codpr"

3. Sa se afiseze o lista cu toti clientii, iar in dreptul celor care au facturi sa apara si
informatiile aferente acestora. Se va utiliza RIGHT JOIN

DoCmd.RunSQL "select clienti.codcl,dencl,nrfact,datfact into f3


from facturi right join clienti on facturi.codcl= clienti.codcl" 4. Sa se afiseze facturarile produsului p3 DoCmd.RunSQL select nrfact, cant, pret into f4 from liniifact inner join produse on liniifact.codpr= produse.codpr where denpr = p3

3.3 Clauzele GROUP BY si HAVING


1. GROUP BY permite formarea de grupuri de inregistrari, pe baza valorilor comune ale unui camp sau combinatii de campuri. Atunci cand se doreste acest lucru, se include in sintaza frazei SELECT (*). 2. Clauza HAVING va limita afisarea grupurilor formate la acelea care indeplinesc o anumita conditie. 3. De regula, gruparea inregistrarilor presupune efectuarea unor operatii la nivelul grupurilor formate se utilizeaza functiile agregate: COUNT, SUM, AVG, MAX, MIN. Obs. Functiile agregate se pot utiliza si in frazele de tip (*).

Ex. 1. Sa se afiseze valorile totale ale facturilor inregistrate. DoCmd.RunSQL "select nrfact,sum(cant*pret) into h1 from liniifact group by nrfact" 2. Sa se afiseze numarul total de facturi inregistrate

DoCmd.RunSQL "select count(nrfact) into h2 from facturi"


3. Sa se afiseze valoarea totala a facturii cu nr. 11 DoCmd.RunSQL "select sum(cant*pret) into h3 from liniifact where nrfact=11" 4. Sa se determine numarul de facturari ale fiecarui produs DoCmd.RunSQL "select codpr,count(codpr) into h4 from liniifact group by codpr" Obs. Se vor afisa doar produsele care au mai mult de 3 facturari. DoCmd.RunSQL "select codpr,count(codpr) into h4 from liniifact group by codpr having count(codpr)>3"

You might also like