CAPITOLUL 6
Functii de grup
Acest capitol explica cum informatiile concise pot fi obtinute pen-
tru grupuri de siruri folosind functiile de grup.
Vom discuta cum puteti divide sirurile dintr-o tabela in seturi mai
mici si cum sa specificati criteriile de cautare intr-un grup de
siruri.
Functiile de grup se aplica unui set de siruri.Ele intorc rezultate
bazate pe grupuri de siruri , spre deosebire de un rezultat pe sir
care e returnat de functii singulare.De regula , toate sirurile din
tabela sunt tratate ca un grup.Clauza GROUP BY din cadrul lui SELECT e
folosita pentru a imparti sirurile in grupuri mai mici.
Functiile de grup sunt listate mai jos:
Valoare returnata
AVG({DISTINCT/ALL})
valoarea medie a lui n, ignorind valorile nule.
COUNT({DISTINCT/ALL} expr*)
nr. de siruri unde expresia e evaluata la altceva decit NULL.
(*) face ca COUNT sa numere toate sirurile selectate, incluzind
duplicatele si sirurile cu NULL.
MAX({DISTINCT/ALL}expr)
maximul valorilor expr.
MIN({DISTINCT/ALL}expr)D
minimul valorilor expresiei expr.
STDDEV({DISTINC/ALL}n)
deviatia standard a lui n , ignorind valorile nule.
SUM({DISTINC/ALL}n)
suma valorilor lui n , ignorind valorile nule.
VARIANCE({DISTINCT/ALL}n)
variatia lui n , ignorind valorile nule.
Toate functiile de deasupra opereaza pe un nr. de siruri (de ex., o
intreaga tabela) si sunt cunoscute ca functii de grup sau agregate.
DISTINCT face ca functia de grup sa considere doar valorile(nedupli-
cate).
ALL considera fiecare valoare , incluzind si toate duplicatele.
Implicit este ALL.
Tipul datelor argumentelor poate fi CHAR,NUMBER sau DATA unde expr e
listata.
Toate fuctiile de grup cu exceptia lui COUNT(*) ignora valorile nule.
Folositi NVL ca de obicei pentru a include null.
FUNCTII DE GRUP
Folosirea functiilor de grup
Pentru a calcula salriul mediu al tuturor angajatilor, introducem :
SELECT AVG(SAL)
FROM EMP;
AVG(SAL)
--------
2073.21429
Notati ca liniile din tabela EMP sint considerate ca un singur grup.
O functie de grup poate fi aplicata pe un subset de linii din tabela
prin folosirea clauzei WHERE.
Pentru a gasi salariul minim cistigat de un functionar, introducem :
SELECT MIN(SAL)
FROM EMP
WHERE JOB = 'CLERK';
MIN(SAL)
--------
800
Pentru a numara angajatii din departamentul 20, introducem :
SELECT COUNT(*)
FROM EMP
WHERE DEPTNO = 20;
COUNT(*)
--------
5
Clauza GROUP BY
Clauza GROUP BY poate fi folosita pentru a imparti liniile dintr-o
tabela in grupuri mai mici. Functiile de rup pot fi folosite pentru a
intorece informatii sumare pentru fiecare grup.
Pentru a calcula salariul mediu pentru fiecare functie diferita,
introducem:
SELECT JOB, AVG(SAL)
FROM EMP
GROUP BY JOB;
JOB AVG(SAL)
------- -----------
ANALYST 3000
CLERK 1037.5
MANAGER 2758.33333
PRESIDENT 5000
SALESMAN 1400
Excluderea liniilor cind folosim GROUP BY
Liniile pot fi excluse mai intii cu o clauza WHERE, inainte de a le
imparti in grupuri.
Pentru a determina salariul mediu pentru fiecare functie in afara de
manager, introducem :
SELECT JOB, AVG(SAL)
FROM EMP
WHERE JOB != 'MANAGER'
GROUP BY JOB;
JOB AVG(SAL)
------- -----------
ANALYST 3000
CLERK 1037.5
PRESIDENT 5000
SALESMAN 1400
Solutii
1.
SELECT MIN(SAL) MINIMUM
FROM EMP;
2.
SELECT MAX(SAL), MIN(SAL), AVG(SAL)
FROM EMP;
3.
SELECT JOB,
MAX(SAL) MAXIMUM,
MIN(SAL) MINIMUM
FROM EMP
GROUP BY JOB;
4.
SELECT COUNT(*) MANAGERS
FROM EMP
WHERE JOB = 'MANAGER';
5.
SELECT JOB,
AVG(SAL) AVSAL,
AVG(SAL * 12 + NVL(COMM, 0)) AVCOMP
FROM EMP
GROUP BY JOB;
6.
SELECT MAX(SAL) - MIN(SAL) DIFFERENCE
FROM EMP;
7.
SELECT DEPTNO, COUNT(*)
FROM EMP
GGROUP BY DEPTNO
HAVING COUNT(*) > 3;
8.
SELECT EMPNO
FROM EMP
GROUP BY EMPNO
HAVING COUNT(*) > 1;
9.
SELECT MGR, MIN(SAL)
FROM EMP
GROUP BY MGR
HAVING MIN(SAL) >= 1000
ORDER BY MIN(SAL);
BogSoft 1999