Primul sl ultimul nume de angajat in ordine alfabetica.
SELECT MIN(nume)[ MAX(nume) FROM angajati;
10.11.2008
curs - BAZE DE DATE.
12
1. Functll de grup
o COUNT(*) intoarce numarul de randurl dintr-un tabel care satisfac criteriul de selectie, incluzand randurlle duplicat ~i randurlle contlnand valori nule.
o Daca clauza WH ERE este lntrodusa,
at unci COUNT(*) returneaza nurnarul de randuri care satisfac conditia din clauza WHERE.
10.11.2008
curs BAZE DE DATE
2
1. Functll de grup
o in contrast, functla COUNT(expr) i'ntoarce nurnarul de valori nenule din coloana speclflcata de expr.
o COUNT(DISTINCT expr) returneaza numarul de valori distincte, nenule din coloana specificate de expr.
10,11,2008
OJ rs - BAZE DE DATE
13
1. Functii de grup
Exemplul5
Numarul anqajatllor care iau comision din departamentul 30.
SELECTCOUNT(comision} FROM angajati
WHERE nr~dept = 30;
m.i r.zuna
OJr;; - BAZE DE DATE.
15
1. Functii de grup
Exemplul7
Comisionul mediu in departamentul 30 (iqnorand sau nu valorile nule).
SELECT AVG(comision), AVG(NVL(camision,O))
FROM angajati
WHERE nr jiept = 30;
10,11,2008
OJ rs BAZE DE DATE
17
1. Functll de grup
Exemplul4
Numarul anqajatllor din departamentul cu id-ul 30.
SELECT COUNT(*) FROM angajati WHERE nr jiept = 30;
10.11.2008
curs - BAZE DE DATE
14
1. Functll de grup
Exemplul6
Numarul de departamente din firma (varianta lncorecta sl varianta corecta),
SELECT COUNT(nr~dept), COUNT(DISTINCT nr jiept)
FROM angajati;
10.11.2008
curs - BAZE DE DATE.
16
Limbajul SQL
1. Functii referltoare la mai multe inregistrari (Functii de grup)
2. Clauza GROUP BY
3. Excluderea grupurilor (clauza HAVING)
4. Imbricarea functiilor de grup
10.11.2008
curs BAZE DE DATE
18
3
2. Clauza G ROU P BY
Pana acum toate functllle de grup au fast aplicatelntregii tabele.
Pentru a putea lm pi:irti tabela in grupuri mai mici se foloseste clauza GROUP BY.
Folosirea acesteia returneaza inforrnatii sumare despre fiecare grup.
10,11,2008
OJ rs - BAZE DE DATE
19
2. Clauza G ROU P BY
Exemplul8
Salariul medlu pe fiecare departamento
SELECT nr_dept, AVG(salariu) FROM angajati
GROUP BY nr _dept;
m.i r.zuna
OJr;; - BAZE DE DATE.
21
2. Clauza G ROU P BY
Gruparea dupa mai multe co/Dane.
Cateodata este necesara obtinerea de rezultate pentru grupuri in alte grupuri.
Atunci In dreptul clauzei GROUP BY vorn intalnl mal multe coloane.
10,11,2008
OJ rs BAZE DE DATE
23
2. Clauza GROUP BY
~ Folosind GROUP BY nu se pot extrage §i coloane individuale, ci doar coloane ce raman identice in tot grupul.
~ Folosind WHERE se pot exclude randuri, inaintea imparti rii lor ingrupuri.
~ Nu pot fi folosite al iasuri de coloane in clauza GROUP BY.
~ Implicit, randurile sunt sortate crescator dupa coloana (coloanele) specificate in GROUP BY. ~ Acest lucru poate fi schimbat folosind ORDER BY.
10.11.2008
curs - BAZE DE DATE
20
2. Clauza GROUP BY
Exemplul9
Salariul mediu pe fiecare departament, iar rezultatele ordonate dupa salariul mediu pe departamento
SELECT nr_dept, AVG(salariu) FROM angajati
GROUP BY nr_dept
ORDER BY AVG(salariu);
10.11.2008
curs - BAZE DE DATE.
22
2. Clauza GROUP BY
plul 10
Salariul mediu pe fiecare departament, iar rezultatele ordonate dupa salariul mediu pe departamento
SELECT nr _dept, functie, SUM(salariu) FROM angajati
GROUP BY nr_dept, functie;
10.11.2008
curs BAZE DE DATE
24
4
Limbajul SQL
1. Func~ii referitoare la mai multe inregistrari (Funct]] de grup)
2. Clauza GROUP BY
3. Excluderea grupurilor (clauza HAVING)
4. Imbricarea functiilor de grup
10,11,2008
OJ rs - BAZE DE DATE
25
3. Excluderea grupurilor (clauza HAVI NG)
Exemplul 11
Salariul mediu pe fiecare departament unde acesta depaseste 3000$.
SELECT nr_dept, AVG(salariu) FROM angajati
HAVING AVG(salariu) > 3000 GROUP BY nr_dept;
m.i r.zuna
OJr;; - BAZE DE DATE.
27
3. Excluderea grupurilor (clauza HAVI NG)
Exemplul13
Salariul total pe fiecare functie, fara a lua in calcul MANAGERII, excluzand functiile cu suma salariilor sub 6000$ cu ordonare dupa total.
SELECT functie, SUM(salariu) FROM angajati
WHERE functie! ='MANAGER' GROUP BY functie
HAVING SUM(salariu) > 6000 ORDER BY SUM(salariLi);
10,11,2008
OJ rs BAZE DE DATE
29
3. Excluderea grupurilor (clauza HAVING)
Clauza HAVING functloneaza in mare ca sl clauza WHERE, dlferenta fiind ca HAVING este folosit pentru a exclude anumite grupuri din rezultat, nu randurl cum facea WHERE.
Clauza HAVING poate fi folosita inalnte de GROUP BY, insa este mai logic sa fie folosita dupa.
Ordinea executlel va rarnane aceeasi,
10.11.2008
curs - BAZE DE DATE
26
3. Excluderea grupurilor (clauza HAVING)
Exemplul 12
Salariul maxim pe fiecare departament unde acesta depaseste 3000$.
SELECT nr_dept, MAX(salariu) FROM angajati
HAVING AVG(salariu) > 3000 GROUP BY nr _dept;
10.11.2008
curs - BAZE DE DATE.
28
Limbajul SQL
1. Func~ii referltoare la mai multe inregistrari (Func~ii de grup)
2. Clauza G ROU P BY
3. Excluderea grupurilor (clauza HAVING)
4. Imbricarea functiilor de grup
10.11.2008
curs BAZE DE DATE
30
5
Ordinea de executie a functiilor de grup
Serverul Oracle executa functiile de grup intr-o anu mita ordine:
~ Selectia randurilor ce respects clauza WHERE ~ Gruparea randurilor obtinute, respectand clauza GROUP BY
~ Calcularea rezultatelor functi ilor de grup pentru fiecaregrup in parte
~ Eliminarea grupurilor ce nu respects clauza HAVING
~ Ordonarea rezultatelor respectand clauza GROUP BY.
10,11,2008
OJ rs - BAZE DE DATE
31
4. Imbricarea functiilor de grup Functiile de grup pot fi imbricate cu a adancirne de 2.
Exemplul 14
Salariul mediu maxim.
SELECT MAX(AVG(salariu)) FROM angajati
GROUP BY nr_clept;
m.i r.zuna
OJr;; - BAZE DE DATE.
33
Ordinea de executie a functiilor de grup
o Ordinea de executie are 0 irnportanta foarte mare, deoarece are un impact' direct asupra vitezei.
o Cu cat mai multe inreqistrari pot fi eliminate utilizand clauza WHERE; cu atat mai putin va dura gruparea si operatiile ce urrneaza.
o Daca 0 cerere SQL este conceputa sa elirnine lnreqistrari/qrupuri doar folosind clauza HAVING, atunci ar fi bine de lncercat daca este posibil si prin clauza WHERE. De obicei, totusi, aceasts rescriere nu va fi posibila,