Documente Academic
Documente Profesional
Documente Cultură
INTEROGAREA
BAZELOR DE DATE
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.
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
4. n afara jonciunii naturale, frazele SQL pot implementa att echi-jonciunea ct i thetajonciunea cu ajutorul clauzei INNER JOIN.
74
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
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