Sunteți pe pagina 1din 33

Cursul

11
Limbaje relationale pentru descrierea si manipularea
datelor. Standardul SQL (continuare)
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 pe


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

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?

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;

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

ROLLUP creează subtotaluri

creează subtotaluri pentru fiecare


CUBE
combinaţie posibilă de dimensiuni

defineşte grupuri multiple într-o singură


GROUPING SET
cerere

8
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;

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

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;

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

Funcţii Descriere Rezultat


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

15
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;

16
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

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!

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


categorie, precum şi numărul total de produse

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

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);

23
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;

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

returnează o singură coloană rezultat; pot fi utilizate ca


Ø  subcereri scalare
26
orice expresie care apare într-o comandă SQL
Limbajul SQL-Oracle
Interogarea datelor. Subcereri.
SELECT id_angajat, nume
FROM angajati
WHERE id_functie = (SELECT id_functie FROM angajati
WHERE UPPER(nume)='KING')
AND UPPER(nume)!='KING';
ORA-01427: single-row subquery returns more than one row

SELECT id_angajat, nume


FROM angajati
WHERE id_functie IN (SELECT id_functie FROM angajati
WHERE UPPER(nume)='KING')
AND UPPER(nume)!='KING';
27
Limbajul SQL-Oracle
Interogarea datelor. Subcereri.
Operatori de comparaţie utilizaţi în cadrul subcererilor multiple-row:
Operatori Descriere
•  compară cu o listă de valori
IN
•  verifică dacă valoarea căutată se regăseşte în listă
NOT •  utilizat cu operatorul IN
•  utilizat în combinaţie cu operatorii de comparaţie (=, <)
ANY •  verifică dacă valoarea căutată îndeplineşte condiţia de comparaţie cu
oricare dintre liniile returnate de subcerere

SOME •  la fel ca operatorul ANY

•  utilizat în combinaţie cu operatorii de comparaţie (=, <)


ALL •  verifică dacă valoarea căutată îndeplineşte condiţia de comparaţie cu
toate liniile returnate de subcerere

28
Limbajul SQL-Oracle
Interogarea datelor. Cereri ierarhice.
Nod rădăcină

Nivel 1

Nivel 2

Nivel 3

Nivel 4

Nod Nod frunză

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

Alte concepte utilizate:


PRIOR - utilizat în cadrul CONNECT BY pentru stabilirea direcţiei în care va fi traversată
ierarhia

LEVEL - pseudo-coloană care identifică valoarea corespunzătoare nivelului din ierarhie


(LEVEL 1 corespunde nodului rădăcină, LEVEL 2 indică nivelul copil relativ la rădăcină etc.)

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;

LEVEL ID_ANGAJAT ANGAJAT


---------- ---------- ----------
1 110 Chen
2 108 Greenberg
3 101 Kochhar
4 100 King
Bibliografie si lecturi
recomandate
—  Ion Lungu, Adela Bâra, Constanţa Bodea, Iuliana
Botha, Vlad Diaconiţa, Alexandra Florea, Anda
Velicanu, Tratat de baze de date. Organizare,
proiectare şi implementare, Editura ASE

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

  • Test 1-Barem
    Test 1-Barem
    Document9 pagini
    Test 1-Barem
    Stefanica Daniel
    Încă nu există evaluări
  • Grile FMO
    Grile FMO
    Document114 pagini
    Grile FMO
    Başchir Camelia
    Încă nu există evaluări
  • Grile FMO
    Grile FMO
    Document114 pagini
    Grile FMO
    Başchir Camelia
    Încă nu există evaluări
  • Diagrama
    Diagrama
    Document1 pagină
    Diagrama
    Stefanica Daniel
    Încă nu există evaluări
  • T80 - Protectia BD
    T80 - Protectia BD
    Document23 pagini
    T80 - Protectia BD
    Andreea Matei
    Încă nu există evaluări
  • T12-Crearea BD PDF
    T12-Crearea BD PDF
    Document23 pagini
    T12-Crearea BD PDF
    Aitul
    Încă nu există evaluări
  • BAZE DE DATE c12
    BAZE DE DATE c12
    Document33 pagini
    BAZE DE DATE c12
    Stefanica Daniel
    Încă nu există evaluări
  • BAZE DE DATE c9
    BAZE DE DATE c9
    Document26 pagini
    BAZE DE DATE c9
    Stefanica Daniel
    Încă nu există evaluări
  • BAZE DE DATE c11
    BAZE DE DATE c11
    Document12 pagini
    BAZE DE DATE c11
    Stefanica Daniel
    Încă nu există evaluări
  • BAZE DE DATE c10
    BAZE DE DATE c10
    Document28 pagini
    BAZE DE DATE c10
    Stefanica Daniel
    Încă nu există evaluări
  • BAZE DE DATE C6si7
    BAZE DE DATE C6si7
    Document39 pagini
    BAZE DE DATE C6si7
    Stefanica Daniel
    Încă nu există evaluări
  • BAZE DE DATE c8
    BAZE DE DATE c8
    Document39 pagini
    BAZE DE DATE c8
    Stefanica Daniel
    Încă nu există evaluări
  • BAZE DE DATE c5
    BAZE DE DATE c5
    Document26 pagini
    BAZE DE DATE c5
    Stefanica Daniel
    Încă nu există evaluări
  • BAZE DE DATE c4
    BAZE DE DATE c4
    Document35 pagini
    BAZE DE DATE c4
    Stefanica Daniel
    Încă nu există evaluări
  • BAZE DE DATE c3
    BAZE DE DATE c3
    Document13 pagini
    BAZE DE DATE c3
    Stefanica Daniel
    Încă nu există evaluări
  • BAZE DE DATE c2
    BAZE DE DATE c2
    Document16 pagini
    BAZE DE DATE c2
    Stefanica Daniel
    Încă nu există evaluări