Sunteți pe pagina 1din 43

S considerm acum componentele GROUP BY i

HAVING.
Componenta GROUP BY are forma:
GROUP BY grup1, ..., grupp, unde grupj sunt fie
cmpuri ce apar n lista expresiilor de ieire, fie
sunt numere naturale cuprinse ntre 1 i q (numrul
total al coloanelor de ieire), ce reprezint numere
de coloane.
Folosirea cuvntului ALL ce urmeaz cuvntului
SELECT nseamn considerarea tuturor liniilor
rezultate n urma interpretrii componentei
WHERE, iar folosirea lui DISTINCT nseamn
eliminarea liniilor duplicate.
1
2
m
t
t
M
t

1
1 m
v ,..., v
1
1 1
1
,...,
m
C C
1
i 1 i
C t | t M, grup t v
S notm cu M mulimea acestor linii. Fie
, unde t
j
sunt liniile de ieire, 1 j m.
Se evalueaz grup
1
pentru toi t
j
, 1 j m, fie grup
1
(t
j
) valoarea
lui grup
1
pentru linia t
j
. Fie M
1
={ grup
1
(t
j
), 1 j m}=
. Se mparte mulimea de linii M n clase, notate
cte o clas pentru fiecare valoare v
i
din M
1
, 1 i m
1
, anume:
Deci clasa
1
i
C
este format din toate liniile lui M ce au aceeai valoare v
i
pentru cmpul grup
1
.
Exemplul 6. Pentru tabela VANZARI ne intereseaz pentru
fiecare valoare a cmpului MARCAV, care este valoarea de
vnzare respectiv.
SELECTA.MARCAV,
SUM(A.CANTV*B.PRET) AS SUMA;
FROM VANZARI A, PRODUS B;
WHEREA.CODPV=B.CODP;
GROUP BY A.MARCAV;
INTO DBF F1
Fie urmtorul coninut al tabelei VANZARI:
t
1
100 S1 P1 10
t
2
200 S2 P2 15
t
3
100 S3 P3 12
t
4
200 S3 P3 10
t
5
100 S2 P2 5
1 1
1 1 3 5 2 2 4
t , t , t , t , t C C
1
1
C
2
1
C
Fie tabela PRODUS coninnd nregistrrile:
(P1, DEN1, 1), (P2, DEN2, 2), (P3, DEN3 , 3)
Atunci M=(t
1
, t
2
, t
3
, t
4
, t
5
), M
1
={100, 200}, m
1
= 2,
Pentru clasa
se calculeaz suma dintre CANTV i PRET,
rezultnd 10*1 + 12*3 + 5*2 = 56, iar pentru
avem: 15*2 + 10*3 = 60.
1
i
C
1
j
C
1
1 1
1
,...,
m
C C
Rezultatul comenzii va consta din 2 linii:
1
100 56
2 200 60
Evident dac i
sunt dou clase diferite (i j), atunci rezult c v
i
v
j
, deci
clasele sunt disjuncte. Avem i faptul c ele sunt nevide, deci
este o partiie a lui M
1
,...,
j
j j
m
C C
j
s
C
Procedm inductiv. Presupunem c, dup considerarea lui
grup
j
, s-a obinut o partiie a lui M n clasele
(j <p).
Fie acum considerarea lui grup
j+1
. Fiecare clas
se rafineaz conform grupului grup
j+1
exact n aceeai
manier cum M s-a rafinat conform grupului grup
1
.
j
s
C
1
,...,
s
s s
p
T T
1 2
1 1 2 2
1 1 1
,..., , ,..., , ,...,
j j
m
j
m m
p p p
T T T T T T
1
1 1
1
,...,
j
j j
m
C C
1
1
j
m
j s
s
m p
1
,...,
p
p p
m
C C
Fie rafinarea obinut astfel a lui prin grup
j+1
notat
1 s m
j
. Atunci rafinarea lui Mn clase considernd grup
1
, ...,
grup
j+1
va fi:
. Fie aceste clase renotate prin:
unde
Astfel, dup considerarea tuturor grupurilor grup
1
,..., grup
p
,
obinem rafinarea lui M n clasele
Rezult urmtoarea proprietate a acestor clase:
Toate uplele unei clase au aceleai valori pentru cmpurile
grup1, ..., grupp, ceeace se exprim prin:
p
j
C
1 p
grup ,...,grup
1 p
grup ,...,grup
( t
1
, t
2
) {t
1
, t
2
t
1
[ ] = t
2
[
]}, pentru orice j, 1 j m
p
,
parantezele [, ] reprezentnd proiecia. Dou uple din
clase distincte au vectori de valori distinci pentru 1 p
grup ,...,grup
Expresiile de ieire ale comenzii SELECT: exp1, ..., expq
pot conine funcii de grupare: COUNT, MIN, MAX, SUM,
VAR, ce se vor aplica asupra claselor definite de
componenta GROUP BY
In acest caz, rezult c numrul de uple ale tabelei de ieire
este egal cu numrul de clase, deci mp.
Exemplul 7. S se afieze pentru fiecare valoare a
cmpului MARCAV din VANZARI, numrul de vnzri
realizate:
SELECT A.MARCAV, COUNT(*) AS NRV;
FROM VANZARI A;
GROUP BY A.MARCAV;
INTO DBF F1
n cazul cnd fraza SELECT are componenta HAVING
<expresie logic
2
>, atunci <expresie logic
2
> poate conine
funcii de grupare i deci se evalueaz pentru fiecare clas
p
j
C , 1 j m
p
.
Dac rezultatul este .T., atunci se produce o linie la ieire
format din valorile exp
1
, ..., exp
q
pentru clasa respectiv
p
j
C
Altfel, se ignor aceast clas.
Exemplul 8. Ne intereseaz pentru fiecare MARCAV din
VANZARI, numrul de vnzri realizate, dar numai cele care
au cel puin 3 vnzri
SELECT A.MARCAV, COUNT(*) AS NRV;
FROM VANZARI A;
GROUP BY A.MARCAV;
HAVING COUNT(*) >= 3;
INTO DBF F1
Componenta UNION. Forma general:
UNION [ALL]
Select
1 2
exp ,exp ,...,exp
q
from ...
Fie M mulimea de linii returnat de comanda SELECT
iniial i M' mulimea de linii returnat de aceast comand
SELECT din UNION. Atunci se realizeaz reuniunea M M'.
De aici, rezult c cele dou comenzi SELECT trebuie s
aib acelai numr de coloane (q) i exp
j
trebuie s aib acelai
tip cu
j
exp , j 1, q
Pot exista mai multe componente UNION intr-o comand
SELECT SQL. Dac dorim ordonarea la ieire a
nregistrrilor, atunci utilizm componenta ORDER BY g1,
..., gs, n care gi sunt expresii de ieire ale comenzii.
n cazul utilizrii de componente UNION i GROUP BY,
atunci ultima comand SELECT din UNION va trebui s
conin GROUP BY i n acest caz gj sunt numere de
coloan ale tabelei de ieire. Fr cuvntul ALL din UNION
se elimin duplicatele n M M'. Utilizarea lui ALL n UNION
pstreaz toate liniile din M i M'. Folosirea cuvntului
NONCONSOLE interzice afiarea rezultatelor pe ecran.
Clauza NOWAIT implic derularea ieirii interogrii pe ecran,
fr a se atepta umplerea unui ecran. Cuvntul PLAIN
implic eliminarea numelor de coloane din afiarea
rezultatului interogrii.
Join interior i exterior n VISUAL FOX i ORACLE
Sintactic n componenta FROM a frazei SELECT putem avea:
FROM <baza1> ! <tabela1> <alias1>
INNER
LEFT OUTER
RIGHT OUTER
FULL OUTER
[JOIN]
<baza2> ! <tabela2> <alias2> ON <expresiejoin>
<baza1> i <baza2> sunt nume de baze de date, iar
<tabela1>, <tabela2> sunt nume de tabele existente respectiv
n cele dou baze. Subcomponenta <alias1> va defini aliasul
temporar al tabelei <tabela1>, similar pentru <alias2>.
<expresiejoin> este o expresie logic format cu cmpurile
celor dou tabele, variabile sau constante. Fie date
urmtoarele coninuturi ale celor dou tabele: <tabela1> = (I1,
..., Im), iar <tabela2> = (J1, ..., Jp). Fie <expresiejoin>(Ij, Jl),
1 j m, 1 l p, evaluarea expresiei <expresiejoin> pentru
perechea de nregistrri Ij, Jl.
n cazul INNER JOIN (join interior) se consider toate
perechile (Ij, Jl) cu proprietatea c <expresiejoin>(Ij, Jl)=.T.,
comanda SELECT respectiv va considera n continuare
numai aceste perechi.
n cazul LEFT OUTER JOIN (join exterior stng) se vor
considera perechile (Ij, Jl) ca n cazul join-ului interior i n
plus, pentru fiecare Ij din <tabela1>, ce are proprietatea c nu
exist Jl n <tabela2>, astfel nct <expresiejoin>(Ij, Jl) = .T.,
se va considera o pereche de forma (Ij, J0) unde J0 este o
nregistrare vid corespunztoare tabelei <tabela2> (toate
cmpurile au valoarea NULL).
n cazul RIGHT OUTER JOIN (join exterior drept) se
consider perechile (Ij, Jl), ca n cazul join-ului interior, n plus
pentru fiecare Jl din <tabela2>, cu proprietatea c nu exist
Ij <tabela1>, astfel nct <condiiejoin> (Ij, Jl) = .T., se va
considera perechea (I0, Jl), unde I0 este o nregistrare vid
corespunztoare tabelei <tabela1>.
n cazul FULL OUTER JOIN se consider perechile de
nregistrri definite att de joinul exterior stng, ct i cele
definite de joinul exterior drept.
Exemplul 9. Fie tabela PERSONAL1 cu cmpurile MARCA i
NUME i tabela VANZAR cu cmpurile MARCAV (marca
persoanei ce vinde), CODPV (codul produsului vndut).
Considerm urmtoarele nregistrri pentru cele dou tabele:
PERSONAL1
VANZAR
MARCA NUME MARCAV CODPV
100 A 100 P1
200 B 100 P2
300 C 100 P3
400 D 300 P1
500 E 300 P2
350 P1
350 P2
Considerm urmtoarele interogri:
a) S se afieze persoanele i codurile de produse
vndute de acestea.
SELECT A.MARCA, A.NUME, B.CODPV;
FROM PERSONAL1 A INNER JOIN VANZAR B;
ON A.MARCA = B.MARCAV
Rezultatul:
MARCA
NUME CODPV
100 A P1
100 A P2
100 A P3
300 C P1
300 C P2
b) S se afieze persoanele i codurile de produs vndute. n
plus pentru o persoan ce nu are vnzri s apar n rezultat cu
codul produs vndut NULL (afiarea pe ecran se va face cu
spaii).
SELECT A.MARCA, A.NUME, B.CODPV;
FROM PERSONAL1 A LEFT OUTER JOIN VANZAR B;
ON A.MARCA = B.MARCAV
Rezultatul este cel de la punctul a) la care se adug
nregistrrile:
200
B
400 D
500 E
c) S se afieze persoanele i codurile de produse vndute. n
plus, pentru o vnzare cu proprietatea c MARCAV nu apare
n PERSONAL1 s se afieze spaii
SELECT A.MARCA, A.NUME, B.CODPV;
FROM PERSONAL1 A RIGHT OUTER JOIN VANZAR B;
ON A.MARCA = B.MARCAV
Rezultatul este cel de la punctul a) la care se adug
nregistrrile:
P1
P2
d) In cazul in care folosim FULL OUTER JOIN ntre cele
dou tabele, atunci rezultatul va fi format din liniile de la a),
la care se adaug cele n plus de la b) i c).
Considerarea valorii NULL
Cuvntul rezervat NULL semnific valoarea nedefinit (un
cmp nu este iniializat). El poate s apar n comanda
CREATE TABLE, ce are forma:
CREATE TABLE <nume tabel> (cimp
1
tip
1
NULL
NOT NULL
, ...)
Apariia NOT NULL pentru cimp1 specific faptul c toate
nregistrrile trebuie s fie definite pentru cimp1, deci cimp1
trebuie s aib valoare pentru toate nregistrrile, iar NULL
cazul contrar. tip1 este tipul atributului cimp1
Cuvntul NULL poate s apar n expresii aritmetice ca
operand, rezultatul este evaluat la NULL. De asemenea, el
poate apare n expresii logice ca operand. Aceste expresii
au forma:
<operand
1
>
IS
IS NOT
<operand
2
>, unde <operand
1
> sau
<operand
2
> este cuvntul NULL.
Rezult de aici considerarea, pe lng
valorile de adevr TRUE, FALSE i a
unei alte valori, notat UNKNOWN.
Ca un exemplu, expresia <cimp is NULL> evaluat pentru o
nregistrare I are valoarea .T., dac avem cmp(I) este
nedefinit i .F. altfel.
Expresia <cimp = NULL> are valoarea UNKNOWN, indiferent
dac avem cimp(I) este definit sau nedefinit. Valoarea
UNKNOWN, notat pe scurt U, este considerat ntre valorile
TRUE(.T.) i FALSE(.F.).
Conjuncia i disjuncia a 2 valori logice se definete astfel:
X Y X AND Y X OR Y
.T. .T. .T. .T.
.T. U U .T.
.T. .F. .F. .T.
U .T. U .T.
U U U U
U .F. .F. U
.F. .T. .F. .T.
.F. U .F. U
.F. .F. .F. .F.
Negaia este definit ca mai jos:
x NOT x
.T. .F.
U U
.F. .T.
Funciile de grupare (SUM, MIN, MAX, COUNT, AVG) nu
consider expresiile cu valoarea NULL. Dac o expresie
aritmetic sau relaional are pentru vectorul
1
...
h
v
un operand cu valoarea NULL, atunci expresia are valoarea
NULL.
Prelucrarea arborescenelor cu SELECT SQL ORACLE
Considerm tabela PERSONAL cu atributele MARCA,
NUME, SALARIU, SECTIE, MARCASEF, n care MARCA
este cheie unic, iar MARCASEF este marca persoanei,
ef direct al persoanei respective.
Pentru o persoan care nu are ef direct se poate lua drept
valoare pentru MARCASEF valoarea zero (dac toate
valorile cmpului MARCA sunt strict pozitive) sau putem
lsa necompletat cmpul MARCASEF (deci va avea
valoarea NULL).
Fie urmtorul coninut al tabelei PERSONAL:
MARCA NUME SALARIU SECTIE MARCASEF
10 P 4000 1 0
20 S1 1500 1 10
30 S2 2000 2 10
40 S3 1700 3 10
50 T1 1600 1 20
60 T2 1800 1 20
70 T3 1500 2 30
80 T4 2000 3 40
90 T5 1900 3 40
100 T6 1850 3 40
110 F1 1400 1 60
120 F2 1450 1 60
130 F3 1500 2 70
140 F4 1550 3 90
150 F5 1600 3 90
160 F6 1500 3 90
Coninutul acestei tabele se poate reprezenta ca o
arborescen n maniera urmtoare: Fie I i I' cu proprietatea
c MARCASEF(I) = MARCA(I'). Atunci definim un arc de la
nregistrarea I' la nregistrarea I. Dac pentru nregistrarea I
avem MARCASEF(I) = 0, atunci I este rdcin. Deoarece
MARCA este cheie unic, rezult c pentru I, dac exist
nodul imediat predecesor, atunci acesta este unic. Pentru
exemplul considerat, rezult arborescena:
P
S1

S2

S3

T1

T2

T3

T4

T5

T6

F4 F6 F1

F2

F3

F5
Se remarc faptul c ordinea nregistrrilor din PERSONAL nu
are importan n definirea arborescenei. Mai mult, o tabel poate
defini mai multe arborescene, atunci cnd exist mai multe
rdcini (nregistrri cu MARCASEF = 0).
La modul general, fie tabela F cu nregistrrile F= (I1, ..., Im) i
cimp1 cheie unic pentru F, iar cimps un cmp ce reprezint
identificatorul efului direct al lui cimp1. Fie Ij i Ih dou
nregistrri din F cu proprietatea cimps(Ih) = cimp1(Ij). Atunci Ij
este eful direct al lui Ih. Dac avem cimps(Ih) = 0, atunci Ih nu
are efi. Toate nregistrrile Ih cu cimps(Ih) =0 vor fi rdcini de
arborescene.
Mai general, putem avea o expresie E1 format din cmpuri ale
lui F cu proprietatea E1 cheie unic i o expresie Es, format,
de asemenea, cu cimpuri ale lui F, ale crei valori reprezint eful
direct al nregistrrii respective. Pentru nregistrrile Ij i Ih cu
proprietatea Es(Ih) = E1(Ij), Ij va fi eful direct al lui Ih (i este unic
deoarece E1 este cheie unic). n mulimea de arborescene vom
avea un arc de la Ij la Ih. Dac pentru Ih, avem Es(Ih) = 0, atunci
Ih nu are ef direct.
Pentru astfel de tabele, ce reprezint mulimi de
arborescene, se pot cere urmtoarele interogri:
a) S se gseasc toate persoanele ce nu au efi,
b) Pentru o persoan s se gseasc toi subordonaii si
(direci i indireci),
c) Pentru o persoan s se gseasc toi efii ierarhici,
d) Pentru o persoan s se gsesc suma salariilor
pentru fiecare secie a mulimii subordonailor si,
e) Pentru o persoan s se gseasc salariul maxim pe
mulimea subordonailor si,
f) Pentru o persoan s se listeze mulimea
subordonailor si pe nivele ale arborescenei cu rdcina
persoana respectiv.
Rezult c, ntr-o astfel de interogare, trebuie s
precizm dou elemente:
I) Nodul sau nodurile de plecare ale cutrii n cadrul
arborscenelor. Acest lucru se va face cu componenta:
START WITH <condiie>
Dac F = (I1, ..., Im), atunci se evalueaz <condiie>
pentru Ij, 1 j m i nodurile de plecare vor fi toate acelea
pentru care <condiie> este adevrat. S notm cu
<condiie>(Ij) evaluarea respectiv. S notm prin
MSTART mulimea nodurilor de plecare care va fi:
MSTART = {Ij | 1 j m, <condiie>(Ij) = TRUE}.
II) Sensul de parcurgere al pdurii poate fi:
a) de la rdcin spre nodurile terminale, sau
b) de la nodurile terminale spre rdcin
1 p
I ,..., I
i
I
i 1, p
i
I i 1, p
Acest sens va fi specificat de componenta CONNECT BY
pentru sensul a): CONNECT BY PRIOR E
1
= E
2
, iar n cazul
particular al cmpurilor cimp
1
i cimp
s
prin: CONNECT BY
PRIOR cimp
1
= cimp
s
.
Pentru parcurgerea n sensul b) se va specifica
componenta:
CONNECT BY E
1
= PRIOR E
2
, respectiv n cazul
particular al lui cimp
1
i cimp
s
prin: CONNECT BY cimp
1
=
PRIOR cimp
s
.
Semantica considerrii componentei CONNECT este
urmtoarea:
n cazul a) fie I
j
nregistrarea curent. Fie v
1
= cimp
1
(I
j
) i
v
2
= cimp
s
(I
j
). Se caut toate nregistrrile
, cu proprietatea cimp
s
( ) = v
1
,
Aceasta nseamn c
sunt toi subordonaii direci ai lui Ij. Dac p=0 (nu exist
nregistrri cu proprietatea specificat), atunci Ij este nod
terminal.
n cazul b) dac Ij este nregistrarea curent i v2 =
cimps(Ij), se caut Ih, astfel nct s avem: cimp1(Ih)= v2.
Dac exist, atunci Ih este unic (este eful direct pentru Ij),
dac nu exist Ih, atunci Ij nu are ef.
Exemple:
1) S se afieze toi subordonaii persoanei cu numele 'P'.
SELECT A.MARCA, A.NUME, A.SALARIU,
A.SECTIE, A.MARCASEF
FROM PERSONAL A
CONNECT BY PRIOR A.MARCA = A.MARCASEF
START WITH A.NUME = 'P'
n absena componentei ORDER afiarea se realizeaz
ntr-un mod standard (pe nivele), iar n cazul unui nivel de la
stnga la dreapta.
2) S se afieze toi subordonaii persoanei cu numele
'S1', inclusiv acesta.
SELECT A.MARCA, A.NUME, A.SALARIU,
A.SECTIE, A.MARCASEF
FROM PERSONAL A
CONNECT BY PRIOR A.MARCA = A.MARCASEF
START WITH A.NUME = 'S1'
n ORACLE exist pseudocoloana cu numele LEVEL, o
variabila ce are ca valori numere de nivel relative n cadrul
unei interogri SELECT.
n exemplul 1) pentru linia lui P, LEVEL = 0, pentru linia
lui S1, S2, S3, LEVEL are valoarea 1, etc.
Pseudocoloana LEVEL poate fi folosit n comanda
SELECT pentru afiarea nivelului relativ al liniei respective.
3) Aceiai interogare ca la 2):
SELECT LEVEL,A.MARCA, A.NUME, A.MARCASEF
FROM PERSONAL A
CONNECT BY PRIOR A.MARCA = A.MARCASEF
START WITH A.NUME = 'S1'
Vom obine ca rezultat:
0
20 S1 10
1 50 T1 20
1 60 T2 20
2 110 F1 60
2 120 F2 60
4) S se gseasc efii ierarhici ai lui T3.
SELECT LEVEL,A.MARCA, A.NUME, A.MARCASEF
FROM PERSONAL A
CONNECT BYA.MARCA = PRIOR A.MARCASEF
START WITHA.NUME = 'T3'
Rezultatul comenzii va fi:
0
70 T3 30
1 30 S2 10
2 10 P 0
n cadrul sensului a) (de la rdcin spre noduri terminale) se
furnizeaz toate subarborescenele cu rdcinile nodurile de
plecare (situate n mulimea M
START
). Dac dorim s eliminm
noduri din aceste arborescene, vom putea utiliza componenta
WHERE a comenzii SELECT.
5) S se afieze toi subordonaii lui S3, cu excepia celor cu
marca ntre 90 i 100 inclusiv.
SELECT A.MARCA, A.NUME, A.MARCASEF
FROM PERSONAL A
CONNECT BY PRIOR A.MARCA = A.MARCASEF
START WITH A.NUME = 'S3'
WHERE (A.MARCA < 90) OR (A.MARCA >100)
Rezultatul comenzii va fi:
0
40 S3 10
1 80 T4 40
2 140 F4 90
2 150 F5 90
2 160 F6 90
Componenta CONNECT BY poate conine AND<condiie
3
>.
n acest caz, dac I
j
este o nregistrare furnizat obinuit de
CONNECT BY PRIOR E
1
= E
2
sau CONNECT BY E
1
=
PRIOR E
2
, atunci se evalueaz <condiie
3
> pentru I
j
, notat
<condiie
3
>(I
j
). Dac <condiie
3
>(I
j
)=.F., atunci din rezultat se
elimin I
j
i subarborescena cu rdcina I
j
. Cnd
<condiie
3
>(I
j
) = .T., I
j
se trateaz n mod obinuit.
6) S se afieze toi subordonaii lui S3, cu excepia lui T5 i a
tuturor subordonailor lui T5.
SELECT A.MARCA, A.NUME, A.MARCASEF
FROM PERSONAL A
CONNECT BY PRIOR A.MARCA = A.MARCASEF AND
(A.NUME ! = 'T5')
START WITH A.NUME = 'S3'
7) Folosind CONNECT cu AND i componenta WHERE
putem elimina att subarborescene ct i noduri.
S se afieze toi subordonaii lui 'P', cu excepia lui 'T3' i a
tuturor subordonailor lui 'T3', precum i cu excepia lui 'T5'
i a tuturor subordonailor lui 'T5' i cu excepia nodurilor
corespunztoare lui 'T1' i 'T6'.
SELECT A.MARCA, A.NUME, A.MARCASEF
FROM PERSONAL A
CONNECT BY (PRIOR A.MARCA = A.MARCASEF)
AND
(A.NUME ! = 'T3') AND(A.NUME!='T5')
START WITH A.NUME = 'P'
WHERE (A.NUME ! = 'T1') AND (A.NUME!= 'T6')
n sistemul ORACLE exist funcia LPAD cu sintaxa:
LPAD (expc, expN), unde expc este o expresie de tip
caracter, iar expN este o expresie numeric. Fie h valoarea
lui expN i s valoarea lui expc. Funcia d ca rezultat
concatenarea lui s de h ori. Folosind aceast funcie putem
afia indentat nregistrrile pe nivele:
8)
SELECT LPAD('',20*LEVEL),LEVEL,A.MARCA, A.NUME
FROM PERSONAL A
START WITH A.NUME = 'T5'
Rezultatul:
0 90 T5
1 140 F4
1 150 F5
1 160 F6
Fraza SELECT poate conine componenta GROUP BY
i funcii de grupare:
9) S se afieze pentru subordonaii lui 'P', suma
salariilor pe fiecare nivel din arborescena cu rdcina P.
SELECT LEVEL, SUM(A.SALARIU)
FROM PERSONAL A
CONNECT BY PRIOR A.MARCA = A.MARCASEF
START WITH A.NUME = 'P'
GROUP BY LEVEL
ORDER BY LEVEL
10) S se afieze pentru toi subordonaii lui 'S1', suma
salariilor din fiecare secie.
SELECT A.SECTIE, SUM(A.SALARIU)
FROM PERSONAL A
CONNECT BY PRIOR A.MARCA = A.MARCASEF
START WITH A.NUME = 'S1'
GROUP BY A.SECTIE
ORDER BY A.SECTIE
Specificm ordinea considerrii n cadrul comenzii SELECT
din ORACLE, a componentelor CONNECT, START, WHERE,
GROUP, ORDER, HAVING.
I) Definirea nodurilor de plecare cu ajutorul componentei
START.
II) Definirea sensului de parcurgere a) sau b) prin
componenta CONNECT BY i cuvntul PRIOR.
III) Definirea subarborescenelor cu rdcinile gsite la
punctul I).
IV) Eliminarea subarborescenelor din III) utiliznd
AND<condiie3> n componenta CONNECT.
V) Se parcurg arborescenele rmase n urma lui IV).
VI) Se elimin nodurile din arborescenele de la V) care nu
satisfac <condiie2> din componenta WHERE <condiie2>.
VII) Liniile obinute se grupeaz n clase, folosind
componenta GROUP BY i se calculeaz pentru fiecare clas
o linie la ieire.
VIII) Dac exist componenta HAVING, se elimin o parte
din aceste linii.
IX) Dac exist ORDER, se ordoneaz liniile de ieire
conform specificaiilor din ORDER.

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