Documente Academic
Documente Profesional
Documente Cultură
SQL - Data Manipulation Language
SQL - Data Manipulation Language
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
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
4
OBIECTIV
Rezultatul contine valori care caracterizeaz ansamblul din care provine i poate conine: Valori ale unor funcii 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 dispoziie de sistem cum este SYSDATE. Valori ale expresiilor dup care s-a fcut gruparea, n cazul n care aceasta este prezent n cerere.
5
REZULTAT
Rezultatul unei cereri SELECT care conine funcii statistice are: O singur linie n cazul n care cererea nu conine 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 nsoit de clauza HAVING. Un numr de linii egal cu numrul de grupuri formate pe baza criteriilor de grupare din GROUP BY care ndeplinesc condiia 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.
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
MIN si MAX
Sintaxa funciilor: 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.
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'
SUM
Sintaxa funciei: 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.
10
AVG
Sintaxa funciei: AVG([ ALL | DISTINCT ] expresie) Descriere: AVG(expresie) ntoarce media aritmetic a valorilor nenule ale expresiei. AVG(DISTINCT expresie) ignora valorile duplicat.
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'
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
13
COUNT
Sintaxa funciei: 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.
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';
15
REZULTAT
FACULT NRSTUD BURSIERI BURSE ------- ------ -------- ----ISTORIE 5 4 3
ntr-adevr, sunt 5 studeni, doar 4 au bursa nenul i sunt trei valori distincte pentru aceasta: 100, 150 i 300.
16
STDDEV si VARIANCE
Sintaxa funciilor: STDDEV([ ALL | DISTINCT ] expresie) VARIANCE([ ALL | DISTINCT ] expresie) Descriere: Din punct de vedere matematic, deviaia standard d o msura a abaterii fa de medie iar variana este ptratul deviaiei standard. STDDEV(expresie) ntoarce deviaia standard a valorilor nenule ale expresiei. VARIANCE(expresie) ntoarce variana valorilor respective. Cuvntul cheie DISTINCT duce la ignorarea valorilor duplicat.
17
EXEMPLU
SELECT STDDEV(PUNCTAJ), VARIANCE(PUNCTAJ) FROM STUD;
Rezultat:
STDDEV(PUNCTAJ) VARIANCE(PUNCTAJ) --------------- ----------------949.8465 902208.3
18
CLAUZA GROUP BY
n cererile anterioare toate liniile parcurgerii curente formau un grup din care se calculau valorile funciilor statistice. Dac se dorete ns partiionarea 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 ...]
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 mprite n grupuri. Fiecare grup este format din liniile care au aceleai valori (inclusiv valoarea nul) pentru expresiile specificate n GROUP BY. Funciile 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 funcii statistice, pot apare de asemenea i expresiile aflate n GROUP BY deoarece valorile acestora sunt constante la nivelul fiecrui grup n parte.
20
EXEMPLU
List coninnd codurile specializrilor i numrul de studeni nscrii la fiecare, cererea este:
SELECT CODS, COUNT(*) NRSTUD FROM STUD GROUP BY CODS;
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; obinndu-se rezultatul: NUME NRSTUD ---------- -----GEOGRAFIE 4 ISTORIE 5 MATEMATICA 3
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 prezenei lui SPEC.NUME n linia SELECT. Pentru a include n rezultat i numele i codul specializrii clauza GROUP BY trebuie s le conin 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;
23
ALT EXEMPLU
Se doreste pentru fiecare tip de burs valoarea acesteia, valoarea mrit cu 10% i numrul de studeni 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 prezena n SELECT a expresiei SUMA*1.1 este ilegal, dei este evident c doi studeni care au burse egale au i burse mrite cu 10% egale. Sistemul de gestiune nu face astfel de deducii, pentru afiarea datelor cerute fiind necesar adugarea n GROUP BY a expresiei SUMA*1.1.
24
ORDONARE IMPLICITA
Ordinea expresiilor din clauza de grupare are efect asupra prezentrii rezultatului: sistemul Oracle face implicit o sortare n funcie de aceste expresii, ascendent, n ordinea n care ele sunt prezente n cerere, ncepnd ns cu valorile nule.
25
EXEMPLU
SELECT TUTOR,CODS,COUNT(*) FROM STUD WHERE CODS IN (11,24) GROUP BY TUTOR,CODS;
EXEMPLU
SELECT TUTOR,CODS,COUNT(*) FROM STUD WHERE CODS IN (11,24) GROUP BY CODS, TUTOR;
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
29
REZULTAT
Rezultatul obinut este urmtorul:
MEDIE1 -------135
De remarcat c aceast valoare este diferit de media burselor studenilor 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;
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 obinerea de date doar despre specializrile care au studeni 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;
32
EXEMPLU
Pentru cererea anterioara formularea corect este: SELECT CODS, AVG(PUNCTAJ) FROM STUD GROUP BY CODS HAVING AVG(PUNCTAJ) > 1500 Rezultatul va conine doar o linie, celelalte dou grupuri fiind filtrare de condiia din HAVING: CODS AVG(PUNCTAJ) ----- -----------11 1560
34
HAVING SI IMBRICARE
n cazul n care avem funcii statistice imbricate, rezultatul acestora va fi calculat doar pe baza valorilor funciei imbricate aplicat grupurilor care satisfac condiia 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;
36
Bibliografie
1. Hector Garcia-Molina, Jeffrey D. Ullman, Jennifer D. Widom: Database Systems: The Complete Book, Prentice-Hall, Englewood Cliffs, NJ, 2002. F. Rdulescu : Oracle SQL, PL/SQL, Editura Printech, ISBN 973718-203-02005
2.
37