Sunteți pe pagina 1din 27

Limbajul SQL-Oracle

Agregarea datelor

Clauze în SELECT Descriere

grupează liniile în scopul identificării valorilor comune


GROUP BY coloane_grupare grupurilor (valori agregate calculate prin funcţii de grup)

restricţionează grupurile create prin clauza GROUP BY


HAVING condiţie pe baza unei condiţii asupra funcţiilor de grup

1
Limbajul SQL-Oracle
Agregarea datelor
SELECT id_departament Departament, COUNT(id_angajat)
"NR.ANGAJATI"
FROM angajati
WHERE id_departament IS NOT NULL
GROUP BY id_departament
HAVING COUNT(id_angajat)>2;

DEPARTAMENT NR.ANGAJATI
----------- -----------
30 6
50 45
60 5
80 34
90 3
100 6 2
Rezolvaţi!

Afişaţi angajaţii care au salariul mai mare decât salariul mediu.

3
Rezolvaţi!
Ce rezultat va produce următoarea interogare SQL?

SELECT id_departament Departament, id_functie Functie,


COUNT(id_angajat) "NR.ANGAJATI"
FROM angajati
WHERE id_departament IS NOT NULL
GROUP BY id_departament, id_functie
ORDER BY id_departament;

4
Limbajul SQL-Oracle
Agregarea datelor

Operatori Descriere

ROLLUP creează subtotaluri

creează subtotaluri pentru fiecare combinaţie posibilă de


CUBE dimensiuni

GROUPING SET defineşte grupuri multiple într-o singură cerere

5
Limbajul SQL-Oracle
Agregarea datelor

SELECT id_departament Departament, id_functie Functie,


COUNT(id_angajat) "NR.ANGAJATI"
FROM angajati
WHERE id_departament IS NOT NULL
GROUP BY ROLLUP(id_departament, id_functie)
ORDER BY id_departament;

6
Rezultat
DEPARTAMENT FUNCTIE NR.ANGAJATI
----------- ---------- -----------
10 AD_ASST 1
10 1
20 MK_MAN 1
20 MK_REP 1
20 2
30 PU_CLERK 5
30 PU_MAN 1
30 6
40 HR_REP 1
40 1
50 SH_CLERK 20
50 ST_CLERK 20
50 ST_MAN 5
50 45
...................................
106
7
Limbajul SQL-Oracle
Agregarea datelor

SELECT id_departament Departament, id_functie Functie,


COUNT(id_angajat) "NR.ANGAJATI"
FROM angajati
WHERE id_departament IS NOT NULL
GROUP BY CUBE(id_departament, id_functie)
ORDER BY id_departament;

8
Rezultat
DEPARTAMENT FUNCTIE NR.ANGAJATI
----------- ---------- -----------
..................................
30 PU_CLERK 5
30 PU_MAN 1
30 6
40 HR_REP 1
40 1
50 SH_CLERK 20
50 ST_CLERK 20
50 ST_MAN 5
50 45
AD_PRES 1
AD_VP 2
FI_ACCOUNT 5
HR_REP 1
IT_PROG 5
...................................
106 9
Limbajul SQL-Oracle
Agregarea datelor

Funcţii Descriere Rezultat


1 – dacă a avut loc o grupare de
identifică liniile agregate produse tip ROLLUP sau CUBE
GROUPING prin utilizarea operatorilor NUMBER
ROLLUP sau CUBE 0 – dacă nu a avut loc o grupare
de tip ROLLUP sau CUBE

10
Limbajul SQL-Oracle
Agregarea datelor

SELECT GROUPING(id_functie) Verificare, id_departament


Departament, id_functie Functie,
COUNT(id_angajat) "NR.ANGAJATI"
FROM angajati
WHERE id_departament IS NOT NULL
GROUP BY ROLLUP(id_departament, id_functie)
ORDER BY id_departament;

11
Rezultat

VERIFICARE DEPARTAMENT FUNCTIE NR.ANGAJATI


---------- ----------- ---------- -----------
0 10 AD_ASST 1
1 10 1
0 20 MK_MAN 1
0 20 MK_REP 1
1 20 2
.............................................
1 106

12
Limbajul SQL-Oracle
Agregarea datelor
SELECT
NVL(DECODE(GROUPING(l.oras),1,UPPER(t.denumire_tara),
INITCAP(t.denumire_tara)),'TOTAL GENERAL')
denumire_tara,
l.oras, COUNT(d.id_departament) Nr_departamente
FROM departamente d, locatii l, tari t
WHERE d.id_locatie=l.id_locatie
AND l.id_tara=t.id_tara
GROUP BY ROLLUP(t.denumire_tara,l.oras);

13
Rezultat

DENUMIRE_TARA ORAS NR_DEPARTAMENTE


----------------------------- ---------------------- ---------------
Canada Toronto 1
CANADA 1
Germany Munich 1
GERMANY 1
United Kingdom London 1
United Kingdom Oxford 1
UNITED KINGDOM 2
United States Of America Seattle 21
United States Of America Southlake 1
United States Of America South San Francisco 1
UNITED STATES OF AMERICA 23
TOTAL GENERAL 27

14
Limbajul SQL-Oracle
Agregarea datelor
SELECT l.oras Oras, d.id_departament Departament,
a.id_functie Functie, COUNT(a.id_angajat) "NR.ANGAJATI"
FROM angajati a, departamente d, locatii l
WHERE a.id_departament IS NOT NULL
AND a.id_departament=d.id_departament
AND d.id_locatie=l.id_locatie
GROUP BY GROUPING SETS ((),(l.oras),
(l.oras, d.id_departament),
(l.oras, d.id_departament, a.id_functie))
ORDER BY l.oras, d.id_departament;

15
Rezultat
ORAS DEPARTAMENT FUNCTIE NR.ANGAJATI
------------------------------ ----------- ---------- -----------
Oxford 80 SA_REP 29
Oxford 80 SA_MAN 5
Oxford 80 34
Oxford 34
Seattle 10 AD_ASST 1
Seattle 10 1
Seattle 30 PU_MAN 1
Seattle 30 PU_CLERK 5
Seattle 30 6
Seattle 90 AD_VP 2
Seattle 90 AD_PRES 1
Seattle 90 3
Seattle 100 FI_MGR 1
Seattle 100 6
Seattle 100 FI_ACCOUNT 5
Seattle 110 AC_MGR 1
Seattle 110 AC_ACCOUNT 1
Seattle 110 2
Seattle 18
106
SELECT l.oras Oras, d.id_departament Departament, a.id_functie
Functie, COUNT(a.id_angajat) "NR.ANGAJATI"
FROM angajati a, departamente d, locatii l
WHERE a.id_departament IS NOT NULL
AND a.id_departament=d.id_departament
AND d.id_locatie=l.id_locatie
GROUP BY l.oras, d.id_departament, a.id_functie
UNION ALL
SELECT l.oras Oras, d.id_departament Departament, NULL,
COUNT(a.id_angajat) "NR.ANGAJATI"
.......
GROUP BY l.oras, d.id_departament
UNION ALL
SELECT NULL, NULL, NULL, COUNT(a.id_angajat) "NR.ANGAJATI"
FROM angajati a, departamente d, locatii l
WHERE a.id_departament IS NOT NULL
AND a.id_departament=d.id_departament
17
AND d.id_locatie=l.id_locatie;
Limbajul SQL-Oracle
Agregarea datelor

CUBE(a,b,c)=GROUPING SETS((a,b,c),(a,b),(a,c),(b,c),(a),(b),(c),())

ROLLUP(a,b,c)=GROUPING SETS((a,b,c),(a,b),(a),())

18
Rezolvaţi!

Afişaţi numărul de produse din fiecare categorie, precum şi


numărul total de produse

19
Rezolvaţi!

Afişaţi numărul total de salariaţi, precum şi numărul de salariaţi


angajaţi în anii 1996, 1997 şi 1998.

20
Limbajul SQL-Oracle
Joncţiuni

Oracle Standard SQL

Joncţiune de egalitate

SELECT t1.a, t2.c SELECT t1.a, t2.c


FROM tabela1 t1, tabela2 t2 FROM tabela1 t1 JOIN tabela2 t2
WHERE t1.b=t2.b; ON t1.b=t2.b;

SELECT t1.a, t2.c


FROM tabela1 t1 NATURAL JOIN tabela2 t2

SELECT t1.a, t2.c


FROM tabela1 t1 JOIN tabela2 t2
USING (b);

21
Limbajul SQL-Oracle
Joncţiuni

Oracle Standard SQL


Joncţiune externă stânga

SELECT t1.a, t2.c SELECT t1.a, t2.c


FROM tabela1 t1, tabela2 t2 FROM tabela1 t1 LEFT JOIN tabela2 t2
WHERE t1.b=t2.b (+); ON t1.b=t2.b;

Joncţiune externă dreapta

SELECT t1.a, t2.c SELECT t1.a, t2.c


FROM tabela1 t1, tabela2 t2 FROM tabela1 t1 RIGHT JOIN tabela2 t2
WHERE t1.b (+)=t2.b; ON t1.b=t2.b;

22
Limbajul SQL-Oracle
Joncţiuni
Oracle Standard SQL
Joncţiune externă completă
SELECT t1.a, t2.c SELECT t1.a, t2.c
FROM tabela1 t1, tabela2 t2 FROM tabela1 t1 FULL JOIN tabela2 t2
WHERE t1.b=t2.b (+) ON t1.b=t2.b;
UNION
SELECT t1.a, t2.c
FROM tabela1 t1, tabela2 t2
WHERE t1.b (+)=t2.b;
Joncţiunea tabelei cu ea însăşi
SELECT t1.a, t2.b SELECT t1.a, t2.b
FROM tabela1 t1, tabela1 t2 FROM tabela1 t1 JOIN tabela1 t2
WHERE t1.a=t2.b; ON t1.a=t2.b;

23
Rezolvaţi!
O relaţie este în forma normală 3 (FN3) dacă:

a) este în forma normală 2 (FN2) şi fiecare atribut non-cheie primară


depinde în mod netranzitiv de cheia primară a relaţiei
b) este în forma normală 1 (FN1) şi fiecare atribut cheie primară
depinde tranzitiv de atributele non-cheie primară
c) este în forma normală 2 (FN2) şi are dependenţe funcţionale
complete
d) este în forma normală 1 (FN1) şi are dependenţe funcţionale
incomplete
e) este în forma normală 2 (FN2) şi are cel puţin o dependenţă
funcţională completă între atributele non-cheie şi cheia primară a
relaţiei

24
Rezolvaţi!
Normalizarea relaţiilor din cadrul bazelor de date relaţionale oferă
posibilitatea:

a) reducerii complexităţii sistemului informatic


b) sporirii calităţii datelor de intrare
c) sporirii vitezei de reacţie a administratorului
d) înlăturării anomaliilor de actualizare
e) verificării corelaţiilor logice dintre atributele relaţiei

25
Rezolvaţi!

Se consideră tabela:
produse (codp number(3), denp varchar2(25), um varchar2(3))

Comanda SQL-Oracle:
SELECT DISTINCT codp, denp FROM produse WHERE codp > 100
ORDER BY denp;
implementează următorii operatori din algebra relaţională:

a) proiecţie şi joncţiune
b) selecţie şi intersecţie
c) selecţie şi reuniune
d) selecţie şi proiecţie
e) ordonare şi selecţie
26
CURSUL 10...

 Limbaje relaţionale pentru definirea şi manipularea


datelor. Limbajul SQL. (continuare)

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