0% au considerat acest document util (0 voturi)
23 vizualizări6 pagini

Lab 03

Documentul prezintă instrucțiuni SQL pentru selectarea, filtrarea, gruparea și subinterogarea datelor din două tabele relaționale. Sunt explicate joncțiunile interne și externe, grupările de date, filtrarea după grupări și utilizarea subinterogărilor.

Încărcat de

Supremusx
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
23 vizualizări6 pagini

Lab 03

Documentul prezintă instrucțiuni SQL pentru selectarea, filtrarea, gruparea și subinterogarea datelor din două tabele relaționale. Sunt explicate joncțiunile interne și externe, grupările de date, filtrarea după grupări și utilizarea subinterogărilor.

Încărcat de

Supremusx
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
Sunteți pe pagina 1/ 6

Laborator 3

Instructiunea SELECT. Jonctiuni, filtrari, grupari, subinterogare.

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

SELECT nrfact, valoare, datafact


FROM facturi_DEF
ORDER BY valoare;
SELECT codcl, valoare, datafact
FROM facturi_DEF
ORDER BY codcl;
- trecerea la informatii din 2 tabele..aparitia campului dencl
SELECT nrfact, dencl, valoare, datafact
FROM clienti_DEF,facturi_DEF
WHERE clienti_DEF.codcl=facturi_DEF.codcl
ORDER BY valoare;
SELECT nrfact, dencl, valoare, datafact
FROM clienti_DEF INNER JOIN facturi_DEF ON clienti_DEF.codcl=facturi_DEF.codcl
ORDER BY 3;
SELECT codcl, dencl, valoare, datafact
FROM clienti_DEF,facturi_DEF
WHERE clienti_DEF.codcl=facturi_DEF.codcl
ORDER BY 1;
Obs: campul codcl apare in ambele tabele;
de aceea trebuie precizat tabelul
SELECT clienti_DEF.codcl, dencl, valoare, datafact
FROM clienti_DEF,facturi_DEF
WHERE clienti_DEF.codcl=facturi_DEF.codcl
ORDER BY 1;
- filtrare numerica si doua criterii de ordonare; al doilea criteriu intervine doar la egalitatea valorilor
referitoare la primul criteriu
SELECT clienti_DEF.codcl, dencl, valoare, datafact
FROM clienti_DEF,facturi_DEF
WHERE clienti_DEF.codcl=facturi_DEF.codcl AND valoare>=2000
ORDER BY 1,3;

sau

SELECT clienti_DEF.codcl, dencl, valoare, datafact


FROM clienti_DEF INNER JOIN facturi_DEF ON clienti_DEF.codcl=facturi_DEF.codcl
WHERE valoare>=2000
ORDER BY 1,3;
4. Jonctiunea externa
Se doreste ca lista sa cuprinda si clientul care nu are facturi..clientul cu codul 50. Pentru a face acest lucru, este
necesar ca in conditia de legatura sa punem semnul (+) la tabela mai „saraca” din punct de vedere al valorilor posibile
ale cheii de legatura (codcl), adica la tabela copil.

SELECT clienti_DEF.codcl, dencl, valoare


FROM clienti_DEF,facturi_DEF
WHERE clienti_DEF.codcl=facturi_DEF.codcl(+)
ORDER BY 1;

Pentru a obtine ACELASI REZULTAT, in cazul utilizarii lui JOIN,


se va utiliza LEFT JOIN sau RIGHT JOIN care apar in clauza FROM
Aici insa trebuie avut grija la ordinea tabelelor !!!!!

Intrucat trebuie inclusi TOTI clientii, conexiunea este la stanga.

SELECT clienti_DEF.codcl, dencl, valoare


FROM clienti_DEF LEFT JOIN facturi_DEF ON clienti_DEF.codcl=facturi_DEF.codcl
ORDER BY 1; clienti facturi
left

Daca in clauza FROM inversam tabelele, conexiunea va fi la dreapta.


De asemenea am adaugat si NVL care inlocuieste null cu valoarea dorita
Am redenumit noul camp.

SELECT clienti_DEF.codcl, dencl, NVL(valoare,0) AS Val


FROM facturi_DEF RIGHT JOIN clienti_DEF ON facturi_DEF.codcl=clienti_DEF.codcl facturi clienti
ORDER BY 1; right
- Daca se doreste adaugarea si a unei conditii de filtrare, aceasta se pune tot in clauza WHERE alaturi de
conditia de legatura, sau ramane ca o clauza WHERE, in cazul in care conditia de legatura se realizeaza in
FROM prin una din variantele de JOIN.

SELECT clienti_DEF.codcl, dencl, valoare


FROM clienti_DEF,facturi_DEF
WHERE clienti_DEF.codcl=facturi_DEF.codcl(+) AND valoare>=2000
ORDER BY 1;
SAU
SELECT clienti_DEF.codcl, dencl, valoare
FROM clienti_DEF LEFT JOIN facturi_DEF ON clienti_DEF.codcl=facturi_DEF.codcl
WHERE valoare>=2000
ORDER BY 1;
Obs: clientul cu codul 50 nu mai apare intrucat exista conditia de filtrare aplicata valorii.
5. Grupari informatiilor din 2 tabele

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.

Exemplu: sa se afiseze totalul valoric al facturilor fiecarui client.

SELECT nrfact, clienti_DEF.codcl, dencl, SUM(valoare)


FROM clienti_DEF,facturi_DEF
WHERE clienti_DEF.codcl=facturi_DEF.codcl(+)
GROUP BY nrfact, clienti_DEF.codcl, dencl
ORDER BY 2;

Campul nrfact fiind cheie primara, nu va permite gruparea

SELECT clienti_DEF.codcl, dencl, SUM(valoare)


FROM clienti_DEF,facturi_DEF
WHERE clienti_DEF.codcl=facturi_DEF.codcl(+)
GROUP BY clienti_DEF.codcl, dencl
ORDER BY 1;

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.

SELECT clienti_DEF.codcl, dencl, SUM(valoare), COUNT(nrfact)


FROM clienti_DEF,facturi_DEF
WHERE clienti_DEF.codcl=facturi_DEF.codcl(+)
GROUP BY clienti_DEF.codcl, dencl
ORDER BY 1;

O varianta imbunatatita este urmatoarea

SELECT clienti_DEF.codcl, dencl, SUM(NVL(valoare,0)) AS Totval, COUNT(nrfact) AS Nrfacturi


FROM clienti_DEF LEFT JOIN facturi_DEF ON clienti_DEF.codcl=facturi_DEF.codcl
GROUP BY clienti_DEF.codcl, dencl
ORDER BY 1;

- Combinarea gruparii cu filtrarea


Pronind de la interogarea anterioara, sa se afiseze o situatie a clientilor al caror total valoric al facturilor este de
peste 10000, insa ordonati descrescator dupa totalul facturilor
SELECT clienti_DEF.codcl, dencl, SUM(valoare), COUNT(nrfact)
FROM clienti_DEF,facturi_DEF
WHERE clienti_DEF.codcl=facturi_DEF.codcl(+) AND SUM(valoare)>=10000
GROUP BY clienti_DEF.codcl, dencl
ORDER BY SUM(valoare) DESC;
OBS: criteriul de filtrare pentru grupuri se adauga folosind HAVING, clauza ce se plaseaza dupa GROUP BY
SELECT clienti_DEF.codcl, dencl, SUM(valoare), COUNT(nrfact)
FROM clienti_DEF,facturi_DEF
WHERE clienti_DEF.codcl=facturi_DEF.codcl(+)
GROUP BY clienti_DEF.codcl, dencl
HAVING SUM(valoare)>=10000
ORDER BY SUM(valoare) DESC;

SELECT clienti_DEF.codcl, dencl, SUM(NVL(valoare,0)) AS Totval, COUNT(nrfact) AS Nrfacturi


FROM clienti_DEF LEFT JOIN facturi_DEF ON clienti_DEF.codcl=facturi_DEF.codcl
GROUP BY clienti_DEF.codcl, dencl
HAVING Totval>=10000
ORDER BY SUM(NVL(valoare,0)) DESC;

SELECT clienti_DEF.codcl, dencl, SUM(NVL(valoare,0)) AS Totval, COUNT(nrfact) AS Nrfacturi


FROM clienti_DEF LEFT JOIN facturi_DEF ON clienti_DEF.codcl=facturi_DEF.codcl
GROUP BY clienti_DEF.codcl, dencl
HAVING SUM(NVL(valoare,0))>=10000
ORDER BY Totval DESC;
Obs: -la utilizarea variantei cu JOIN nu avem clauza WHERE intrucat filtrarea cu HAVING se face dupa grupare.
-noua denumire a campului Totval nu se poate utiliza in clauza HAVING, dar se poate utiliza in ORDER
Exista situatii in care filtrarea se poate face atat inaintea gruparii cat si dupa grupare, rezultatul fiind acelasi.
Sa se afiseze o situatie a mediei valorilor facturilor fiecarui client din Timisoara
De asemenea, am revenit si la jonctiunea simpla.

SELECT clienti_DEF.codcl, dencl, localit, AVG(valoare) AS medie_client


FROM clienti_DEF,facturi_DEF
WHERE clienti_DEF.codcl=facturi_DEF.codcl
GROUP BY clienti_DEF.codcl, dencl, localit
ORDER BY dencl;

Se adauga filtrarea doar a clientilor din Timisoara

SELECT clienti_DEF.codcl, dencl, localit, AVG(valoare) AS medie_client


FROM clienti_DEF,facturi_DEF
WHERE clienti_DEF.codcl=facturi_DEF.codcl AND localit='Timisoara'
GROUP BY clienti_DEF.codcl, dencl, localit
ORDER BY dencl;
SELECT clienti_DEF.codcl, dencl, localit, AVG(valoare) AS medie_client
FROM clienti_DEF,facturi_DEF
WHERE clienti_DEF.codcl=facturi_DEF.codcl
GROUP BY clienti_DEF.codcl, dencl, localit
HAVING localit='Timisoara'
ORDER BY dencl;
Aceleasi instructiuni scrise si in cazul legaturii
facuta cu INNER JOIN

SELECT clienti_DEF.codcl, dencl, localit, AVG(valoare) AS medie_client


FROM clienti_DEF INNER JOIN facturi_DEF ON clienti_DEF.codcl=facturi_DEF.codcl
WHERE localit='Timisoara'
GROUP BY clienti_DEF.codcl, dencl, localit
ORDER BY dencl;
SELECT clienti_DEF.codcl, dencl, localit, AVG(valoare) AS medie_client
FROM clienti_DEF INNER JOIN facturi_DEF ON clienti_DEF.codcl=facturi_DEF.codcl
GROUP BY clienti_DEF.codcl, dencl, localit
HAVING localit='Timisoara'
ORDER BY dencl;

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.

SELECT clienti_DEF.codcl, dencl, valoare


FROM clienti_DEF,facturi_DEF
WHERE clienti_DEF.codcl=facturi_DEF.codcl
ORDER BY valoare DESC;

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.

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