Sunteți pe pagina 1din 6

71

INTEROGAREA
BAZELOR DE DATE

3.1. Elemente de SQL


Procesul prin care se pot obine diverse informaii dintr-o baz de date se numete interogare, iar
formularea acesteia se realizeaz cu ajutorul unei fraze SELECT.

1. Pentru definirea unei interogri de selecie simple se poate utiliza urmtoarea sintax a instruciunii
SELECT:
SELECT [ALL | DISTINCT] [<alias1>.]<cmp1> [,[<alias2>.] <cmp2>...]
FROM <tabela1> [,<tabela2> ...]
[WHERE <expl1>]
[ORDER BY [<aliasi>.]<cmpi>]]
[INTO <destinaie>]
Jonciunea prezint o importan fundamental n elaborarea i utilizarea bazelor de date relaionale,
fiind operatorul ce permite "nlnuirea" relaiilor i obinerea de informaii prin consultarea simultan a mai
multor tabele. Prin comanda SELECT de mai sus se efectueaz jonciunea natural a tabelelor <tabela1>
i <tabela2>. Cmpul comun al acestora constituie cheia primar a primei tabele i cheie strin n
<tabela2>, iar condiia <expl1> este de forma <tabela1>.<cmp_comun> = <tabela2>.<cmp_comun>.
n plus, pentru realizarea jonciunii naturale, atributele de legtur trebuie s aib nume identic (i domeniu
compatibil). Jonciunea natural presupune de asemenea eliminarea unuia dintre cele dou atribute de
legtur din rezultatul interogrii, constituind informaie redundant. In mod implicit, rezultatul interogrii
este afiat ntr-o fereastr BROWSE, dar poate fi dirijat spre o tabel distinct (INTO TABLE <tabela3>) sau
poate fi o variabil-tablou (INTO ARRAY <tablou1>). Pentru a elimina tuplurile identice din tabela rezultat
se va introduce clauza DISTINCT n sintaxa instruciunii SELECT. Ordinea de afiare a rezultatului cererii
de interogare poate fi impus prin intermediul clauzei ORDER BY.
Pentru exemplificare, considerm situaia prezentat n figura 3.1, ntre tabelele "materiale" i
"operaii" fiind definit o relaie permanent de tipul 1:n pe baza valorilor cmpului cod.

Fig. 3.1 Definirea unei interogri simple

72

O interogare de selecie simpl (jonciune natural) se poate obine cu ajutorul urmtoarei fraze
SELECT:
select materiale.cod, materiale.denumire, operatii.data, operatii.cantitate;
from materiale, operatii;
where materiale.cod = operatii.cod;
order by materiale.cod

2. n cadrul frazelor SELECT pot apare operatorii AND, OR, NOT, IN, IS NULL, BETWEEN i
LIKE, cu ajutorul acestora fiind posibil o construcie mai amnunit a interogrilor SQL precum i o
cretere a complexitii acestora. n SQL, pentru comparare, n afara clasicilor operatori ">", "", "<", "",
"=", "", mai pot fi definii i ali operatori BETWEEN, LIKE, IN, IS NULL.
Considerm cteva exemple de utilizare a acestor operatori n definirea unor interogri simple ale
bazei de date din figura 3.1.
select materiale.cod, materiale.denumire, operatii.data_op, operatii.cantitate;
from materiale, operatii ;
where materiale.cod=operatii.cod and ;
operatii.data_op between {^2001-11-11} and {^2001-11-15};
order by materiale.denumire

n ceea ce privete operatorul LIKE, acesta se folosete pentru a compara un atribut de tip ir de
caractere cu un literal (constant de tip ir de caractere). Rezultatul evalurii unui predicat ce conine
operatorul IN este True, dac valoarea lui <expr1> este egal cu una din valorile <expr2>, <expr3>, ...,
<exprn>:
<expr1> IN (<expr2>, <expr3>, ..., <exprn>)
select materiale.cod, materiale.denumire, operatii.data_op, operatii.cantitate;
from materiale, operatii ;
where materiale.cod=operatii.cod and ;
materiale.denumire like "d2" and operatii.cantitate in (100, 564, 700);
order by operatii.data_op

73

3. Pe lng interogrile simple, SQL permite definirea unor cereri de interogare complexe
formulate cu ajutorul clauzelor GROUP BY i HAVING, putnd s implementeze i diferitele tipuri de
jonciuni JOIN precum i combinaiile UNION, INTERSECT, MINUS. Frazele SELECT aferente pot
s conin i funcii predefinite de tip COUNT, SUM, AVG, MAX, MIN figura 3.2.
SELECT [ALL | DISTINCT] <funcie1> ([<alias1>.]<cmp1>)
[,<funcie2> ([<alias2>.] <cmp2>)...]
FROM <tabela1> [,<tabela2> ...]
[WHERE <expl1>]
GROUP BY [<aliasi>.]<cmpi> [,[<aliasj>.]<cmpj>...]
[HAVING <expl2>]
[ORDER BY [<aliasi>.]<cmpi>]]
[INTO <destinaie>]
Clauza GROUP BY precizeaz cmpul sau cmpurile pe baza crora se va efectua gruparea
nregistrrilor. Funciile <funcie1>, <funcie2>,... vor fi recalculate la nivelul fiecrei grupri. Clauza
HAVING permite introducerea unor restricii care sunt aplicate grupurilor de tupluri, deci nu tuplurilor
"individuale" ca i clauza WHERE.
select materiale.cod, materiale.denumire, sum(operatii.cantitate) ;
from materiale,operatii;
where materiale.cod=operatii.cod;
group by operatii.cod

Fig. 3.2 O cerere de interogare complex


Grupurilor definite prin clauza GROUP BY de mai sus li se aplic o restricie n ceea ce
privete data cnd au fost efectuate operaiile de intrare/ieire de material. Un material va fi afiat,
doar dac toate operaiile sale de intrare/iesire au avut loc ntr-un anumit interval precizat (HAVING).
select materiale.cod, materiale.denumire, sum(operatii.cantitate) ;
from materiale,operatii;
where materiale.cod=operatii.cod;
group by operatii.cod ;
having operatii.data_op between {^2001-11-01} and {^2001-11-14}

4. n afara jonciunii naturale, frazele SQL pot implementa att echi-jonciunea ct i thetajonciunea cu ajutorul clauzei INNER JOIN.

74

SELECT [ALL | DISTINCT] <funcie1> ([<alias1>.]<cmp1>)


[,<funcie2> ([<alias2>.] <cmp2>)...] | *
FROM <tabela1> INNER JOIN <tabela2> ON <expl1>
[ INNER JOIN <tabela3> ON <expl2> ...]
[WHERE <expl3>]
GROUP BY [<aliasi>.]<cmpi> [,[<aliasj>.]<cmpj>...]
[HAVING <expl4>]
[ORDER BY [<aliasi>.]<cmpi>]]
[INTO <destinaie>]
Jonciunea tabelelor <tabela1> i <tabela2> se realizeaz pe baza criteriului de asociere <expl1>.
Vor fi concatenate acele tupluri (nregistrri) din cele dou tabele care satisfac condiia de join <expl1>.
Condiia de join se va formula pentru cmpul de legtur al tabelelor. Echi-jonciunea tabelelor presupune
utilizarea unui operator de tip egalitate "=" n criteriul de selecie <expl1>, iar theta-jonciunea a unui
operator relaional oarecare.
Condiii suplimentare de filtare a nregistrrilor tabelei rezultat pot fi specificate prin intermediul
clauzei WHERE <expl3>. n fraza SELECT se poate utiliza caracterul "*" pentru a referi toate cmpurile
din structura tabelelor supuse operaiei de jonciune.
Pentru exemplificare, considerm situaia prezentat n figura 3.3, ntre tabelele "materiale" i
"operaii" fiind definit o relaie permanent de tipul 1:n pe baza valorilor cmpului cod i cod_material. O
interogare de selecie complex se poate obine cu ajutorul urmtoarei fraze SELECT:
select materiale.cod, materiale.denumire,;
sum(operatii.cantitate), sum(operatii.cantitate)*materiale.pret;
from materiale inner join operatii on materiale.cod = operatii.cod_material;
group by materiale.cod
order by materiale.cod

Fig. 3.3 O cerere de interogare complex ( INNER JOIN)

5. Cele trei tipuri de jonciune prezentate (theta, echi, natural) prezint ca extensie, jonciunea
extern. Ideea de baz a jonciunii externe const n a include n rezultat i nregistrri dintr-o tabel (sau din
ambele tabele), care prezint valori ale cmpului de legtur ce nu se regsesc n cealalt tabel. Dac
celelalte tipuri de jonciune sunt comutative, n cazul jonciunii externe trebuie specificat din care tabel se
extrag liniile fr corespondent n cellalt tabel. De aceea, exist jonciune extern la stnga i jonciune
extern la dreapta. La acestea se adaug jonciunea extern total, care reprezint reuniunea celor dou.

75

SELECT [ALL | DISTINCT] <funcie1> ([<alias1>.]<cmp1>)


[,<funcie2> ([<alias2>.] <cmp2>)...] | *
FROM <tabela1>
LEFT | RIGHT | FULL [OUTER] JOIN <tabela2> ON <expl1>
[LEFT | RIGHT | FULL [OUTER] JOIN <tabela3> ON <expl2> ...]
[WHERE <expl3>]
GROUP BY [<aliasi>.]<cmpi> [,[<aliasj>.]<cmpj>...]
[HAVING <expl4>]
[ORDER BY [<aliasi>.]<cmpi>]]
[INTO <destinaie>]
Prin jonciunea extern sunt adugate n tabela rezultat i nregistrrile din cele dou tabele, care nu au
participat la join. Acestea sunt completate cu valori nule pentru cmpurile tabelei din stnga join-ului (LEFT
JOIN), respectiv pentru cmpurile tabelei din dreapta join-ului (RIGHT JOIN).
select materiale.cod, materiale.denumire, sum(operatii.cantitate);
from materiale left join operatii on materiale.cod = operatii.cod_material
group by materiale.cod
order by materiale.cod

n exemplul de mai sus este implementat o jonciune extern la stnga a tabelelor "materiale" i
"operatii". n rezultatul de interogrii astfel definite, va fi inclus i ultimul material din tabela printe, chiar
dac nu exist nici o nregistrare corespunztoare n tabela fiu.

6. Operatorii asambliti - reuniune, intersecie i diferen prezint operatori SQL dedicai i pot
opera numai cu tabele unicompatibile.
<fraz_SELECT1> UNION [ALL] <fraz_SELECT2>
Pentru exemplificare, considerm situaia prezentat n figura 3.4, ntre tabelele "materiale",
"operaii_11" i "operaii_12" fiind definite dou relaii permanente de tipul 1:n pe baza valorilor cmpului
cod i cod_material. Lista (se va memora ntr-o tabel distinct) cu toate operaiile se poate obine n felul
urmtor:
select materiale.cod,materiale.denumire,;
operatii_11.data_op,operatii_11.cantitate;
from materiale left join operatii_11 on materiale.cod = operatii_11.cod_material;
union all ;
select materiale.cod,materiale.denumire,;
operatii_12.data_op,operatii_12.cantitate;
from materiale left join operatii_12 on materiale.cod = operatii_12.cod_material;
into table lista
n tabela rezultat cmpurile "data_op" i "cantitate" pot avea valori nule. n aceast situaie cmpul
numeric "cantitate" va fi completat cu 0, iar "data_op" cu { }.

76

update lista;
set cantitate = 0, set data_op = {} where lista.cantitate is null

Fig. 3.4 Utilizarea operatorilor asambliti n definirea unei interogri

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