Lab 03
Lab 03
1. TABELELE INITIALE
Crearea tabelelor se regaseste in script.
2. INSERARE DE DATE
Popularea tabelelor cu date se face se realizeaza
in ordinea „parinti” „copii”.
Trebuie respectata ordinea si tipul campurilor.
BEGIN
....
....
Pentru a adauga datele mai rapid, instructiunile au fost
incadrate intr-o procedura.
Instructiunile se regasesc in script.
END;
/
3. SELECT din 2 tabele
sau
In cazul interogarilor care contin grupari, campurile alese trebuie sa aiba valori cat mai omogene care sa permita
realizarea gruparilor. Daca se utilizeaza un astfel de camp, este necesara utilizarea unei functii de grupare pentru
acel camp.
Obs: disparitia campului cu valori eterogene nrfact, a dus la posibiltatea realizarii gruparilor pe fiecare client.
De asemenea s-a schimbat si indexul coloanei de grupare.
Daca se chiar doreste utilizarea si a campului nrfact, trebuie sa folosim o functie de grupare, de exemplu COUNT.
Observatii
- Filtrarea din clauza WHERE actioneaza inaintea gruparii datelor iar filtrarea din clauza HAVING actioneaza
dupa ce se fac gruparile si calculele pe grupuri;
- Prin utilizarea variantei JOIN, clauza WHERE ramane doar pentru filtrarea datelor inaintea gruparii;
- Exista situatii in care conditia de filtrare se poate aplica atat inante de grupare cat si dupa grupare, si anume
atunci cand acesta conditie se refera la un camp care nu este „afectat” de operatiunile de grupare si/sau de
calcul de grup
6. Subinterogare
Sa se calculeze media valorilor tuturor facturilor, indiferent de client.
Sa se afiseze apoi o situatie descrescatoare a facturilor care depasesc aceasta medie.
SELECT AVG(valoare)
FROM facturi_DEF;
- Rotunjirea valorii
SELECT ROUND(AVG(valoare),2) AS medie_facturi
FROM facturi_DEF;
OBS: Functiile de tip SUM, COUNT, AVG se pot folosi si fara GROUP BY, dar numai singure, fara campuri simple,
si, in aceasta situatie, calculul se face pentru toate valorile campului respectiv.
Cele doua interogari se pot combina, rezultatul primeia fiind folosit pentru filtrare in cea de-a doua.
SELECT clienti_DEF.codcl, dencl, valoare
FROM clienti_DEF,facturi_DEF
WHERE clienti_DEF.codcl=facturi_DEF.codcl AND valoare>(SELECT ROUND(AVG(valoare),2) AS medie_facturi
FROM facturi_DEF)
ORDER BY valoare DESC;
SELECT clienti_DEF.codcl, dencl, valoare
FROM clienti_DEF,facturi_DEF
WHERE clienti_DEF.codcl=facturi_DEF.codcl AND valoare>(SELECT AVG(valoare)
FROM facturi_DEF)
ORDER BY valoare DESC;
SELECT clienti_DEF.codcl, dencl, valoare
FROM clienti_DEF INNER JOIN facturi_DEF ON clienti_DEF.codcl=facturi_DEF.codcl
WHERE valoare>(SELECT AVG(valoare)
FROM facturi_DEF)
ORDER BY valoare DESC;
Observatii
- atunci cand rezultatul unei subinterogari este folosit ca si criteriu de filtrare (in WHERE sau in HAVING), acest
rezultat trebuie sa fie unic, nu un tabel cu una sau mai multe coloane; cand subinterogarea este folosita in
clauza FROM, atunci rezultatul subinterogarii trebuie sa fie un tabel
- in subinterogare nu este necesara redenumirea campului, rotunjirea valorii, etc intrucat rezultatul (AVG)
este folosit doar pentru comparare, nu este si afisat.
- cand este utilizat JOIN pentru legatura, in WHERE ramane doar filtrarea realizata pe baza subinterogarii.