Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Doar rabdarea si perseverenta in invatare aduce rezultate bune.stiinta, numere naturale, teoreme, multimi, calcule, ecuatii, sisteme




Biologie Chimie Didactica Fizica Geografie Informatica
Istorie Literatura Matematica Psihologie

Sql


Index » educatie » » informatica » Sql
» Crearea grupurilor de date: Clauza GROUP BY


Crearea grupurilor de date: Clauza GROUP BY


Crearea grupurilor de date: Clauza GROUP BY

In exemplele anterioare, toate functiile pe grup au tratat tabela de date ca un grup mare de informatii. Uneori este nevoie ca tabela sa fie impartita in grupuri mai mici. Acest lucru se poate realiza folosind clauza GROUP BY intr-o comanda SELECT, astfel:

SELECT coloane, functii_pe _grup(coloana)

FROM tabele

[WHERE conditii]

[GROUP BY expresia_de_ grupare]



[ORDER BY lista_de_coloane];

unde:

expresia_de_grupare: specifica coloanele ale caror valori vor determina gruparea randurilor.

Utilizand clauza WHERE, putem exclude randuri inaintea impartirii lor pe grupuri. Nu putem utiliza aliasul coloanei in clauza GROUP BY, ci doar numele coloanei. Implicit rindurile sunt ordonate crescator dupa numele coloanelor incluse in lista clauzei GROUP BY. Ordinea de sortare poate fi modificata utilizand clauza ORDER BY.

Afisam numarul departamentului si media aritmetica a salariului pe departament.

SELECT deptno, AVG(sal)

FROM emp

GROUP BY deptno;

Cand utilizam clauza GROUP BY, trebuie sa includem in clauza GROUP BY toate coloanele din lista SELECT care nu sunt incluse in functiile pe grup (in exemplu de mai sus coloana deptno).

OBS: Coloanele din clauza GROUP BY nu trebuie neaparat sa fie incluse in lista coloanelor SELECT.

Afisam media aritmetica a salariului pe departament, fara sa afisam numarul departamentului.

SELECT AVG(sal)

FROM emp

GROUP BY deptno;

Afisam numarul departamentului si media aritmetica a salariului grupat pe departament in ordine crescatoare a mediei aritmetice a salariului pe departament.

SELECT deptno, AVG(sal)

FROM emp

GROUP BY deptno

ORDER BY AVG(sal);

OBS: Putem folosi functiile pe grup in clauza ORDER BY, ca in exemplu de mai sus.

Uneori este nevoie sa afisam rezultatele unui grup din interiorul unui alt grup. Acest lucru se realizeaza specificand in clauza GROUP BY lista de coloane. In clauza GROUP BY pot fi specificate mai multe coloane.

Sa se afiseze suma totala a salariului pe fiecare job in cadrul fiecarui departament.

SELECT deptno, job, SUM(sal)

FROM emp

GROUP BY deptno, job;

In acest exemplu, prima data randurile vor fi grupate dupa numarul departamentului, iar in cadrul departamentului dupa job. Functia SUM se aplica pe fiecare departament in parte si va calcula suma pe job in cadrul fiecarui departament.

Nu putem folosi clauza WHERE pentru a restrictiona grupurile. Vom exemplifica acest lucru prin urmatorul exemplu:

SELECT deptno, AVG(sal)

FROM emp

WHERE AVG(sal) > 2000

GROUP BY deptno;

OBS: Acest exemplu are o eroare la clauza WHERE AVG(sal) > 2000 deoarece nu se poate utiliza clauza WHERE impreuna cu clauza GROUP BY. Acest exemplu poate fi corectat prin inlocuirea clauzei WHERE cu clauza HAVING.

Vom utiliza clauza HAVING intr-o instructiune SELECT pentru a specifica care dintre grupuri vor fi afisate. Sintaxa instructiunii SELECT va fi:

SELECT coloane, functii_pe _grup(coloana)

FROM tabele

[WHERE conditii]

[GROUP BY expresia_de_ grupare]

[HAVING BY conditie_de_ grupare]

[ORDER BY lista_de_coloane];

unde:

conditie_de_grupare specifica conditia de restrictionare a grupurilor.

Cand se utilizeaza clauza HAVING intr-o instructiune SELECT se vor executa urmatorii pasi:

se vor grupa randurile.

se vor aplica functiile pe grup.

se vor afisa grupurile care respecta conditia din clauza HAVING.

Clauza HAVING poate precede clauza GROUP BY, dar este recomandat sa plasam clauza GROUP BY inainte deoarece este mult mai logic. Grupurile sunt formate si functiile pe grup sunt calculate inainte ca, clauza HAVING sa fie aplicata grupurilor din lista SELECT.

Se cere sa se afiseze salariul total lunar pentru fiecare functie (job), pentru care salariul total este mai mare decat 10 000, ordonat dupa salariul total lunar.

SELECT job, SUM(sal) SUMA_SALAR

FROM emp

GROUP BY job

HAVING SUM(sal) > 10.000

ORDER BY SUM(sal);

OBS: Functiile pe grup pot fi incuibate doar maxim 2 adancimi. De exemplu, pentru a afla maximul salariului mediu pe depatament, vom scrie secventa urmatoare:

SELECT MAX(AVG(sal))

FROM emp

GROUP BY deptno;

Ordinea de evaluare a clauzelor este:

clauza WHERE

clauza GROUP BY

clauza HAVING

Clauza ORDER BY este plasata ultima.





Politica de confidentialitate





Copyright © 2024 - Toate drepturile rezervate