Documente Academic
Documente Profesional
Documente Cultură
11
Limbaje relationale pentru descrierea si manipularea
datelor. Standardul SQL (continuare)
Limbajul SQL-Oracle
Agregarea datelor
Clauze în SELECT Descriere
2
Limbajul SQL-Oracle
Agregarea datelor
SELECT id_departament Departament,
COUNT(id_angajat) "NUMAR 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
3
Rezolvaţi!
Afişaţi angajaţii care au salariul mai mare decât salariul mediu din
fiecare departament.
4
Rezolvare
Afişaţi angajaţii care au salariul mai mare decât salariul
mediu.
SELECT *
FROM angajati a
WHERE salariul>(SELECT AVG(salariul)
FROM angajati b where
a.id_departament=b.id_departament);
5
Rezolvaţi!
Ce rezultat va produce următoarea interogare SQL?
6
Rezolvare
DEPARTAMENT FUNCTIE NR.ANGAJATI
----------- ---------- -----------
10 AD_ASST 1
20 MK_MAN 1
20 MK_REP 1
30 PU_CLERK 5
30 PU_MAN 1
40 HR_REP 1
50 SH_CLERK 20
50 ST_CLERK 20
50 ST_MAN 5
7
Limbajul SQL-Oracle
Agregarea datelor
Operatori Descriere
8
Limbajul SQL-Oracle
Agregarea datelor
9
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 10
Limbajul SQL-Oracle
Agregarea datelor
11
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
12
Rollup si Cube
select extract(year
from data)
an,extract(month from
data) luna ,extract(day
from data) zi,count(*)
from comenzi group by
rollup(extract(year
from
data),extract(month
from data),extract(day
from data)) order by 1;
Rollup si cube
select extract(year from data)
an,extract(month from data)
luna ,extract(day from data) zi,count(*)
from comenzi
group by cube(extract(year from
data),extract(month from data),extract(day
from data)) order by 1;
Limbajul SQL-Oracle
Agregarea datelor
15
Limbajul SQL-Oracle
Agregarea datelor
16
Rezultat
17
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!
19
Rezolvare
Afişaţi numărul de produse din fiecare categorie,
precum şi numărul total de produse
SELECT categorie, COUNT(id_produs) "NR.PRODUSE"
FROM produse
GROUP BY ROLLUP(categorie)
ORDER BY categorie;
CATEGORIE NR.PRODUSE
---------------------------------------- ----------
office1 6
office2 20
office3 6
office4 21
software1 7
software2 3
software4 22
...................................................
288
20
First, Last
SELECT id_angajat,
id_departament,
salariul,
MIN(salariul) KEEP (DENSE_RANK FIRST
ORDER BY salariul) OVER (PARTITION BY
id_departament) AS lowest,
MAX(salariul) KEEP (DENSE_RANK LAST
ORDER BY salariul) OVER (PARTITION BY
id_departament) AS highest
FROM angajati
ORDER BY id_departament, salariul;
Dense Rank
SELECT id_departament,nume,salariul,
DENSE_RANK() OVER (PARTITION BY
id_departament ORDER BY salariul)
DENSE_RANK FROM angajati ORDER BY
id_departament,DENSE_RANK, nume;
Limbajul SQL-Oracle
Joncţiuni
Joncţiune de egalitate
23
Limbajul SQL-Oracle
Joncţiuni
Oracle Standard SQL
Joncţiune externă stânga
24
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;
25
Limbajul SQL-Oracle
Interogarea datelor. Subcereri.
Subcerere (cerere imbricată) – comandă SELECT inclusă într-o altă
comandă SQL, care poate returna una sau mai multe linii.
Tipuri de subcereri:
Subcereri Descriere
returnează o singură linie (conţinând valori pentru una sau
Ø subcereri single-row
mai multe coloane)
Ø subcereri multiple-row returnează 0, 1 sau mai multe linii
returnează mai mult de o coloană ca rezultat al unei
Ø subcereri multiple-column
subcereri single-row sau multiple-row
subcereri de oricare dintre tipurile anterioare, care asigură
Ø subcereri corelate legătura dintre tabele, prin referirea de coloane ale cererii
părinte
28
Limbajul SQL-Oracle
Interogarea datelor. Cereri ierarhice.
Nod rădăcină
Nivel 1
Nivel 2
Nivel 3
Nivel 4
29
Limbajul SQL-Oracle
Interogarea datelor. Cereri ierarhice.
Clauze în SELECT Descriere
START WITH identifică nodul rădăcină
defineşte legăturile de tip self-join, precum şi direcţia în care va
CONNECT BY
fi traversată ierarhia
ORDER SIBLINGS BY sortează liniile din cadrul fiecărui nivel ierarhic
SYS_CONNECT_BY_PATH – funcţie care afişează calea către orice nod, pornind de la nodul
rădăcină
CONNECT_BY_ROOT – operator care referă datele din nodul rădăcină
30
Limbajul SQL-Oracle
Interogarea datelor. Cereri ierarhice.
LEVEL ID_ANGAJAT ANGAJAT
---------- ---------- -------------------
SELECT LEVEL, id_angajat, 1 100 King
2 101 Kochhar
LPAD(' ',LEVEL)||nume angajat
3 108 Greenberg
FROM angajati 4 109 Faviet
4 110 Chen
START WITH id_angajat=100 4 111 Sciarra
4 112 Urman
CONNECT BY
4 113 Popp
id_manager=PRIOR id_angajat; 3 200 Whalen
3 203 Mavris
3 204 Baer
3 205 Higgins
4 206 Gietz
2 102 De Haan
3 103 Hunold
4 104 Ernst
4 105 Austin
4 106 Pataballa
4 107 Lorentz
Limbajul SQL-Oracle
Interogarea datelor. Cereri ierarhice.
SELECT LEVEL, id_angajat,
LPAD(' ',LEVEL)||nume angajat
FROM angajati
START WITH id_angajat=110
CONNECT BY
PRIOR id_manager = id_angajat;