Sunteți pe pagina 1din 37

Capitolul 3

FUNCTII STATISTICE SI GRUPURI

F. Radulescu. Curs: Baze de date Limbajul SQL

STUD
MATR ---1456 1325 1645 3145 2146 3251 2215 4311 3514 1925 2101 4705 NUME AN GRUPA DATAN LOC TUTOR PUNCTAJ CODS ------- -- ------ --------- ---------- ----- ------- ---GEORGE 4 1141A 12-MAR-82 BUCURESTI 2890 11 VASILE 2 1122A 05-OCT-84 PITESTI 1456 390 11 MARIA 3 1131B 17-JUN-83 PLOIESTI 1400 11 ION 1 2112B 24-JAN-85 PLOIESTI 3251 1670 21 STANCA 4 2141A 15-MAY-82 BUCURESTI 620 21 ALEX 5 2153B 07-NOV-81 BRASOV 1570 21 ELENA 2 2122A 29-AUG-84 BUCURESTI 2146 890 21 ADRIAN 3 2431A 31-JUL-83 BUCURESTI 450 24 FLOREA 5 2452B 03-FEB-81 BRASOV 3230 24 OANA 2 2421A 20-DEC-84 BUCURESTI 4311 760 24 MARIUS 1 2412B 02-SEP-85 PITESTI 3514 310 24 VOICU 2 2421B 19-APR-84 BRASOV 4311 1290 24

F. Radulescu. Curs: Baze de date Limbajul SQL

SPEC si BURSA
CODS ----11 21 24 NUME ---------MATEMATICA GEOGRAFIE ISTORIE DOMENIU --------------STIINTE EXACTE UMANIST UMANIST

TIP PMIN PMAX SUMA -------------------- ----- ----- ----FARA BURSA 0 399 BURSA SOCIALA 400 899 100 BURSA DE STUDIU 900 1799 150 BURSA DE MERIT 1800 2499 200 BURSA DE EXCEPTIE 2500 9999 300
F. Radulescu. Curs: Baze de date Limbajul SQL 3

OBIECTIV
Pn acum fiecare linie a rezultatului era calculat dintr-o linie a unei tabele din baza de date sau a produsului cartezian al unor tabele. n unele cazuri este ns necesar calculul unor valori statistice pornind de la toate liniile parcurgerii curente sau ale unor grupuri de linii care au aceleai valori pentru o list de expresii.
F. Radulescu. Curs: Baze de date Limbajul SQL 4

OBIECTIV cont.
Rezultatul contine valori care caracterizeaz ansamblul din care provine i poate con ine: Valori ale unor func ii statistice (MIN, MAX, AVG, SUM, COUNT, STDDEV, VARIANCE). Constante (numerice, ir de caractere sau dat calendaristic). n categoria constantelor sunt incluse i pseudocoloanele puse la dispozi ie de sistem cum este SYSDATE. Valori ale expresiilor dup care s-a fcut gruparea, n cazul n care aceasta este prezent n cerere.
F. Radulescu. Curs: Baze de date Limbajul SQL 5

REZULTAT
Rezultatul unei cereri SELECT care con ine func ii statistice are: O singur linie n cazul n care cererea nu con ine clauza de grupare GROUP BY Un numr de linii egal cu numrul de grupuri formate pe baza criteriilor de grupare din GROUP BY, dac aceast clauz exist i nu este nso it de clauza HAVING. Un numr de linii egal cu numrul de grupuri formate pe baza criteriilor de grupare din GROUP BY care ndeplinesc condi ia de grup din HAVING, dac ambele clauze sunt prezente n cerere. Numrul de coloane al rezultatului este ca i nainte egal cu numrul expresiilor aflate pe clauza SELECT.
F. Radulescu. Curs: Baze de date Limbajul SQL 6

FUNCTII STATISTICR
MIN si MAX valoare minima si maxima SUM si AVG suma si medie COUNT numarare STDDEV si VARIANCE deviatia standard si varianta

F. Radulescu. Curs: Baze de date Limbajul SQL

MIN si MAX
Sintaxa func iilor: MIN([ ALL | DISTINCT ] expresie) MAX([ ALL | DISTINCT ] expresie) Descriere: MIN(expresie) ntoarce valoarea minim nenula din lista de valori ale expresiei, fiecare valoare fiind calculat pe baza unei linii din parcurgerea curent. MAX(expresie) ntoarce valoarea maxim nenula din aceeai list. Folosirea cuvintelor cheie ALL (care este implicit) sau DISTINCT nu are n acest caz nici un efect, minimul i maximul fiind acelai dac din list se elimin duplicatele.
F. Radulescu. Curs: Baze de date Limbajul SQL 8

EXEMPLU
SELECT 'MATEMATICA' FACULTATE, MIN(SUMA) MINIM, MAX(SUMA) MAXIM FROM STUD, SPEC, BURSA WHERE STUD.PUNCTAJ BETWEEN PMIN AND PMAX AND STUD.CODS = SPEC.CODS AND SPEC.NUME = 'MATEMATICA'

Rezultatul ob inut va avea o singur linie avnd con inutul:


MATEMATICA 150 300
F. Radulescu. Curs: Baze de date Limbajul SQL 9

SUM
Sintaxa func iei: SUM([ ALL | DISTINCT ] expresie) Descriere: SUM(expresie) ntoarce suma valorilor nenule ale expresiei, fiecare valoare fiind calculat pe baza unei linii din parcurgerea curent. SUM(DISTINCT expresie) face acelai lucru ignornd ns valorile duplicat.
F. Radulescu. Curs: Baze de date Limbajul SQL 10

AVG
Sintaxa func iei: AVG([ ALL | DISTINCT ] expresie) Descriere: AVG(expresie) ntoarce media aritmetic a valorilor nenule ale expresiei. AVG(DISTINCT expresie) ignora valorile duplicat.
F. Radulescu. Curs: Baze de date Limbajul SQL 11

EXEMPLU
Cererea care calculeaza sume si medii ale burselor studentilor de la ISTORIE:
SELECT 'ISTORIE' FACULT, SUM(SUMA) SUM1, SUM(DISTINCT SUMA) SUM2, AVG(SUMA) AVG1, AVG(DISTINCT SUMA) AVG2 FROM STUD, SPEC, BURSA WHERE STUD.PUNCTAJ BETWEEN PMIN AND PMAX AND STUD.CODS = SPEC.CODS AND SPEC.NUME='ISTORIE'

F. Radulescu. Curs: Baze de date Limbajul SQL

12

REZULTAT
FACULT SUM1 SUM2 AVG1 AVG2 ------- ----- ----- ----- ----ISTORIE 650 550 162.5 183.3

Dup cum se observ, suma i media sunt diferite pentru considerarea sau ignorarea valorilor duplicat:
650 = 100 + 100 + 150 + 300 550 = 100 + 150 + 300 162.5 = 650 / 4 183.3 = 550 / 3
F. Radulescu. Curs: Baze de date Limbajul SQL 13

COUNT
Sintaxa func iei: COUNT(*) COUNT([ ALL | DISTINCT] expresie) Descriere: COUNT(*) ntoarce numrul de linii pe baza crora se calculeaz rezultatul => nu se poate aduga DISTINCT sau nu se poate vorbi de valori nule COUNT(expresie) ntoarce numrul de valori nenule ale expresiei. COUNT(DISTINCT expresie) ntoarce numrul de valori nenule i distincte ale expresiei.
F. Radulescu. Curs: Baze de date Limbajul SQL 14

EXEMPLU
Tot pentru ISTORIE se doreste numrului studentilor, numrul de bursieri i numrul de valori diferite ale sumei primite ca burs. Cererea este:
SELECT 'ISTORIE' FACULT,COUNT(*) NRSTUD, COUNT(SUMA) BURSIERI, COUNT(DISTINCT SUMA) BURSE FROM STUD, SPEC, BURSA WHERE STUD.PUNCTAJ BETWEEN PMIN AND PMAX AND STUD.CODS = SPEC.CODS cond.join AND SPEC.NUME='ISTORIE';
F. Radulescu. Curs: Baze de date Limbajul SQL 15

REZULTAT
FACULT NRSTUD BURSIERI BURSE ------- ------ -------- ----ISTORIE 5 4 3

ntr-adevr, sunt 5 studen i, doar 4 au bursa nenul i sunt trei valori distincte pentru aceasta: 100, 150 i 300.

F. Radulescu. Curs: Baze de date Limbajul SQL

16

STDDEV si VARIANCE
Sintaxa func iilor: STDDEV([ ALL | DISTINCT ] expresie) VARIANCE([ ALL | DISTINCT ] expresie) Descriere: Din punct de vedere matematic, devia ia standard d o msura a abaterii fa de medie iar varian a este ptratul devia iei standard. STDDEV(expresie) ntoarce devia ia standard a valorilor nenule ale expresiei. VARIANCE(expresie) ntoarce varian a valorilor respective. Cuvntul cheie DISTINCT duce la ignorarea valorilor duplicat.
F. Radulescu. Curs: Baze de date Limbajul SQL 17

EXEMPLU
SELECT STDDEV(PUNCTAJ), VARIANCE(PUNCTAJ) FROM STUD;

Rezultat:
STDDEV(PUNCTAJ) VARIANCE(PUNCTAJ) --------------- ----------------949.8465 902208.3

F. Radulescu. Curs: Baze de date Limbajul SQL

18

CLAUZA GROUP BY
n cererile anterioare toate liniile parcurgerii curente formau un grup din care se calculau valorile func iilor statistice. Dac se dorete ns parti ionarea acestora n grupuri pentru a calcula valori statistice pentru fiecare grup n parte este necesar folosirea clauzei GROUP BY. Sintaxa acesteia este: GROUP BY expresie1 [, expresie2, expresie 3 ...]
F. Radulescu. Curs: Baze de date Limbajul SQL 19

EFECT
Aceast clauz trebuie s apar n cerere dup cele discutate anterior (SELECT, FROM i WHERE) i are urmtorul efect: Liniile parcurgerii curente (filtrate anterior de WHERE dac aceasta este prezent) sunt mpr ite n grupuri. Fiecare grup este format din liniile care au aceleai valori (inclusiv valoarea nul) pentru expresiile specificate n GROUP BY. Func iile statistice se calculeaz pentru fiecare grup n parte, rezultatul avnd un numr de linii egal cu numrul de grupuri formate. n clauza SELECT, pe lng constante i func ii statistice, pot apare de asemenea i expresiile aflate n GROUP BY deoarece valorile acestora sunt constante la nivelul fiecrui grup n parte.
F. Radulescu. Curs: Baze de date Limbajul SQL 20

EXEMPLU
List con innd codurile specializrilor i numrul de studen i nscrii la fiecare, cererea este:
SELECT CODS, COUNT(*) NRSTUD FROM STUD GROUP BY CODS;

Rezultatul ob inut este:


CODS NRSTUD ----- -----11 3 21 4 24 5
F. Radulescu. Curs: Baze de date Limbajul SQL 21

EXEMPLU cont.
Pentru a avea numele specializarii gruparea se face pe joinul STUD cu SPEC: SELECT SPEC.NUME, COUNT(*) NRSTUD FROM STUD, SPEC WHERE STUD.CODS = SPEC.CODS GROUP BY SPEC.NUME; ob inndu-se rezultatul: NUME NRSTUD ---------- -----GEOGRAFIE 4 ISTORIE 5 MATEMATICA 3
F. Radulescu. Curs: Baze de date Limbajul SQL 22

OBSERVATII
Dac n cererea anterioar gruparea s-ar fi fcut dup STUD.CODS sau SPEC.CODS s-ar fi semnalat eroarea: ORA-00979: not a GROUP BY expression din cauza prezen ei lui SPEC.NUME n linia SELECT. Pentru a include n rezultat i numele i codul specializrii clauza GROUP BY trebuie s le con in pe amndou. Grupurile vor fi aceleai dar cererea va fi valid i va putea fi executat: SELECT SPEC.NUME, SPEC.CODS, COUNT(*) NRSTUD FROM STUD, SPEC WHERE STUD.CODS = SPEC.CODS GROUP BY SPEC.NUME, SPEC.CODS;
F. Radulescu. Curs: Baze de date Limbajul SQL 23

ALT EXEMPLU
Se doreste pentru fiecare tip de burs valoarea acesteia, valoarea mrit cu 10% i numrul de studen i beneficiari: SELECT SUMA, SUMA*1.1 BMARITA, COUNT(*) FROM STUD, BURSA WHERE PUNCTAJ BETWEEN PMIN AND PMAX GROUP BY SUMA; Aceast cerere va semnala de asemenea eroare: gruparea se face doar dup SUMA, n consecin prezen a n SELECT a expresiei SUMA*1.1 este ilegal, dei este evident c doi studen i care au burse egale au i burse mrite cu 10% egale. Sistemul de gestiune nu face astfel de deduc ii, pentru afiarea datelor cerute fiind necesar adugarea n GROUP BY a expresiei SUMA*1.1.
F. Radulescu. Curs: Baze de date Limbajul SQL 24

ORDONARE IMPLICITA
Ordinea expresiilor din clauza de grupare are efect asupra prezentrii rezultatului: sistemul Oracle face implicit o sortare n func ie de aceste expresii, ascendent, n ordinea n care ele sunt prezente n cerere, ncepnd ns cu valorile nule.

F. Radulescu. Curs: Baze de date Limbajul SQL

25

EXEMPLU
SELECT TUTOR,CODS,COUNT(*) FROM STUD WHERE CODS IN (11,24) GROUP BY TUTOR,CODS;

REZULTAT: ordonare dupa TUTOR si CODS


TUTOR CODS COUNT(*) ----- ----- -------11 2 24 2 1456 11 1 3514 24 1 4311 24 2
F. Radulescu. Curs: Baze de date Limbajul SQL 26

EXEMPLU
SELECT TUTOR,CODS,COUNT(*) FROM STUD WHERE CODS IN (11,24) GROUP BY CODS, TUTOR;

REZULTAT: ordonare dupa CODS si TUTOR


TUTOR CODS COUNT(*) ----- ----- -------11 2 1456 11 1 24 2 3514 24 1 4311 24 2
F. Radulescu. Curs: Baze de date Limbajul SQL 27

ORDONARE IMPLICITA cont.


Se poate folosi clauza ORDER BY pentru a schimba ordinea implicit. n ea pot fi prezente doar elementele constante la nivel de grup (func ii statistice, expresiile de grupare) sau numrul coloanei din rezultat. n cererea urmtoare ordonarea se face dup coloana a treia din rezultat i, la valori egale pe aceasta, dup valoarea minim a punctajului la nivel de grup, dei acest minim nu este prezent n lista SELECT.
F. Radulescu. Curs: Baze de date Limbajul SQL 28

EXEMPLU
SELECT TUTOR,CODS,COUNT(*) FROM STUD WHERE CODS IN (11,24) GROUP BY CODS, TUTOR ORDER BY 3, MIN(PUNCTAJ); Rezultatul este:
TUTOR CODS COUNT(*) ----- ----- -------3514 24 1 1456 11 1 24 2 4311 24 2 11 2
F. Radulescu. Curs: Baze de date Limbajul SQL 29

IMBRICARE FCT. STATISTICE


Func iile statistice se pot imbrica. n acest caz valoarea rezultat se calculeaz pe baza valorilor ntoarse de func ia imbricat pentru fiecare grup n parte. De exemplu, dac se dorete o medie a burselor medii pe specializri, aceasta poate fi calculat cu cererea:
SELECT AVG(AVG(NVL(SUMA, 0))) MEDIE1 FROM STUD, BURSA WHERE PUNCTAJ BETWEEN PMIN AND PMAX GROUP BY CODS;
F. Radulescu. Curs: Baze de date Limbajul SQL 30

REZULTAT
Rezultatul ob inut este urmtorul:
MEDIE1 -------135

De remarcat c aceast valoare este diferit de media burselor studen ilor care este de 133.33 i este calculat de cererea:
SELECT AVG(NVL(SUMA, 0)) MEDIE2 FROM STUD, BURSA WHERE PUNCTAJ BETWEEN PMIN AND PMAX;
F. Radulescu. Curs: Baze de date Limbajul SQL 31

CLAUZA HAVING
Fiecare grup format de GROUP BY are, n cazul cererilor precedente, o linie corespondent n rezultat. Clauzele descrise pn acum nu permit o filtrare la nivel de grup. De exemplu, dac se dorete ob inerea de date doar despre specializrile care au studen i cu un punctaj mediu mai mare dect 1200, cererea urmtoare va semnala eroare:
SELECT CODS, AVG(PUNCTAJ) FROM STUD WHERE AVG(PUNCTAJ) > 1500 GROUP BY CODS;
F. Radulescu. Curs: Baze de date Limbajul SQL 32

CLAUZA HAVING cont.


Eroarea se datoreaz faptului c WHERE poate con ine doar condi ii la nivelul unei linii din parcurgerea curent i nu la nivel de grup. Pentru filtrarea grupurilor este necesar o nou clauz, HAVING, avnd urmtoarea sintax: HAVING conditie_de_grup Condi ia poate fi simpl sau compus. n ea pot fi folosite doar elemente constante la nivel de grup (literali, func ii statistice, etc.).
F. Radulescu. Curs: Baze de date Limbajul SQL 33

EXEMPLU
Pentru cererea anterioara formularea corect este: SELECT CODS, AVG(PUNCTAJ) FROM STUD GROUP BY CODS HAVING AVG(PUNCTAJ) > 1500 Rezultatul va con ine doar o linie, celelalte dou grupuri fiind filtrare de condi ia din HAVING: CODS AVG(PUNCTAJ) ----- -----------11 1560

F. Radulescu. Curs: Baze de date Limbajul SQL

34

HAVING FARA GROUP BY


Aceast clauz poate fi folosit i n absen a lui GROUP BY. n acest caz cererea ntoarce fie o linie, fie nici o linie, n func ie de satisfacerea sau nu a condi iei HAVING de liniile parcurgerii curente. De exemplu, datorit faptului c punctajul mediu pentru ntreaga tabel STUD este mai mic decat 1500, cererea: SELECT AVG(PUNCTAJ) FROM STUD HAVING AVG(PUNCTAJ) > 1500; nu va ntoarce nici o linie de rezultat.
F. Radulescu. Curs: Baze de date Limbajul SQL 35

HAVING SI IMBRICARE
n cazul n care avem func ii statistice imbricate, rezultatul acestora va fi calculat doar pe baza valorilor func iei imbricate aplicat grupurilor care satisfac condi ia din HAVING. De exemplu, urmtoarea cerere va calcula media burselor medii pentru dou specializri (cele cu punctaj mediu peste 1200) i nu pentru toate. Rezultatul va fi 140 i nu 135 ca atunci cnd nu exist HAVING: SELECT AVG(AVG(NVL(SUMA, 0))) MEDIE1 FROM STUD, BURSA WHERE PUNCTAJ BETWEEN PMIN AND PMAX GROUP BY CODS HAVING AVG(PUNCTAJ) > 1200;
F. Radulescu. Curs: Baze de date Limbajul SQL 36

Sfarsitul capitolului

FUNCTII STATISTICE SI GRUPURI

F. Radulescu. Curs: Baze de date Limbajul SQL

37

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