Sunteți pe pagina 1din 10

Florin Radulescu - Baze de date (note de curs)

STUD

SQL - 4

MATR
---1456
1325
1645
3145
2146
3251
2215
4311
3514
1925
2101
4705

SUBCERERI

F. Radulescu. Curs: Baze de date Limbajul SQL

SPEC si BURSA

O subcerere este o cerere SELECT inclus


ntr-o alt cerere SQL.
Astfel de construcii se folosesc n cazul n
care rezultatul dorit nu se poate obine cu o
singur parcurgere a datelor.
Exemplu: pentru a afla cine este studentul cu
cel mai mare punctaj sunt necesare dou
parcurgeri ale tabelei STUD:
 prima calculeaz punctajul maxim iar
ulterior
 a doua afieaz datele dorite despre
studentul sau studenii cu acel punctaj.

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
3

PARCURGERI

F. Radulescu. Curs: Baze de date Limbajul SQL

SUBCERERILE APAR:
n expresiile logice din clauzele WHERE i
HAVING
n clauza ORDER BY a unei cereri SELECT;
valoarea returnat de subcerere pentru
fiecare linie a rezultatului va determina
ordinea de afiare a acestora.
n clauza SELECT; valoarea returnat de
subcerere va fi prezent n rezultatul final.
n clauza FROM; n acest caz ele sunt
asimilate unor tabele temporare din care se
calculeaz rezultatul cererii care le include.

Cum o cerere SELECT specific o


singur parcurgere a datelor rezult c
pentru rezolvarea problemei sunt
necesare dou astfel de cereri, prima
(subcererea) furniznd datele necesare
pentru a doua (cererea principal).

F. Radulescu. Curs: Baze de date Limbajul SQL

F. Radulescu. Curs: Baze de date Limbajul SQL

OBIECTIV

CODS NUME
DOMENIU
----- ---------- --------------11 MATEMATICA STIINTE EXACTE
21 GEOGRAFIE UMANIST
24 ISTORIE
UMANIST

F. Radulescu. Curs: Baze de date Limbajul SQL

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

F. Radulescu. Curs: Baze de date Limbajul SQL

Florin Radulescu - Baze de date (note de curs)

SUBCERERI IN EXPRESII LOGICE

 n acest caz valoarea ntoars de subcerere poate fi


folosit ca oricare alta n comparaii care includ
operatorii obinuii: <, <=, >, >=, = i <>.
 Exemplu: studentul cu cel mai mare punctaj:
subcererea ntoarce valoarea maxim a punctajului
din tabela STUD iar cererea care o include numele
studentului sau studenilor care au acel punctaj i
valoarea acestuia:
SELECT NUME, PUNCTAJ
FROM STUD
WHERE PUNCTAJ =
(SELECT MAX(PUNCTAJ) FROM STUD)

 Rezultatul unui SELECT, dac este nevid,


este ntotdeauna o tabel. Din punct de
vedere al modului de folosire al unei
subcereri exist ns diferene n funcie de
forma rezultatului acesteia:
1. Subcereri care ntorc o singur valoare
2. Subcereri care ntorc o coloan
3. Subcereri care ntorc o tabel.
 n continuare este prezentat modul de
utilizare pentru fiecare tip n parte
F. Radulescu. Curs: Baze de date Limbajul SQL

REZULTAT

F. Radulescu. Curs: Baze de date Limbajul SQL

REGULI PENTRU SUBCERERI (1)


Subcererea trebuie s fie ntotdeauna n
partea dreapt a comparaiei, ca n exemplul
de mai sus.
Subcererea se pune obligatoriu ntre
paranteze.
Deoarece rezultatul este folosit pentru
calculele cererii principale, ordinea valorilor
returnate nu este important. De aceea
subcererile nu pot conine clauza ORDER BY.

Rezultatul obinut este:


NUME
PUNCTAJ
---------- ------FLOREA
3230

F. Radulescu. Curs: Baze de date Limbajul SQL

REGULI PENTRU SUBCERERI (2)


Dac subcererea ntoarce mai multe linii se
semnaleaz eroarea ORA-01427: single-row

subquery returns more than one row.


Dac subcererea nu ntoarce nici o linie,
comparaia n care e implicat se evalueaz la
FALS.
O cerere poate conine una sau mai multe
subcereri, acestea putnd fi pe acelai nivel
sau incluse una n alta.
F. Radulescu. Curs: Baze de date Limbajul SQL

O VALOARE

11

F. Radulescu. Curs: Baze de date Limbajul SQL

10

ALTI OPERATORI
n afar de operatorii uzuali de
comparaie, n cazul acestui tip de
subcereri se pot folosi i operatorii
BETWEEN, LIKE i IS NULL.
Exemplele urmtoare reprezint cereri
valide coninnd i BETWEEN sau LIKE.
Folosirea lui IS NULL pentru o subcerere
este relevant doar n cazul subcererilor
corelate prezentate ntr-un alt
subcapitol.
F. Radulescu. Curs: Baze de date Limbajul SQL

12

Florin Radulescu - Baze de date (note de curs)

SUBCERERI IN BETWEEN

SUBCERERI IN LIKE
Afiarea acelorai date ca mai sus pentru
studenii avnd un nume care nu ncepe cu
aceeai liter cu a studentului cu punctaj
maxim:

Afiarea numelui i punctajului pentru


studenii avnd un punctaj egal cu cel mediu
+/- 30%. Se folosete operatorul BETWEEN
avnd ca parametri dou subcereri:
SELECT NUME, PUNCTAJ
FROM STUD
WHERE PUNCTAJ BETWEEN
(SELECT AVG(PUNCTAJ) FROM STUD)*0.7 AND
(SELECT AVG(PUNCTAJ) FROM STUD)*1.3;
F. Radulescu. Curs: Baze de date Limbajul SQL

13

SELECT NUME, PUNCTAJ


FROM STUD
WHERE NUME NOT LIKE SUBSTR(
(SELECT NUME FROM STUD
WHERE PUNCTAJ = (SELECT MAX(PUNCTAJ)
FROM STUD)
) , 1, 1) || '%';
F. Radulescu. Curs: Baze de date Limbajul SQL

14

SUBCERERI IN LIKE (2)

ERORI (1)

Exist dou niveluri de imbricare:


Subcererea de nivel 2 ntoarce valoarea
maxim a punctajului.
Subcererea de nivel 1 ntoarce numele
studentului cu acel punctaj.
n cererea principal este decupat prima
liter a acestui nume, folosind funcia
SUBSTR(rezultat, 1, 1) i este concatenat cu
caracterul % pentru a forma un ablon folosit
apoi de condiia NOT LIKE.

Subcererea ntoarce mai multe valori.


n acest caz nu vom obine un rezultat
ci mesajul de eroare menionat anterior:

F. Radulescu. Curs: Baze de date Limbajul SQL

F. Radulescu. Curs: Baze de date Limbajul SQL

15

SELECT NUME, PUNCTAJ


FROM STUD
WHERE PUNCTAJ = (SELECT PUNCTAJ FROM
STUD);

16

ERORI (2)

O COLOANA

Subcererea nu ntoarce nici o valoare.


n acest caz vom obine un rezultat vid
(fr nici o linie), condiia evalundu-se
la FALS:

n acest caz valorile coloanei ntoarse


de subcerere sunt asimilate unei
mulimi.
Condiia trebuie s foloseasc
operatorul IN sau negatul acestuia NOT
IN i nu operatori de comparaie.

SELECT NUME, PUNCTAJ


FROM STUD
WHERE PUNCTAJ =
(SELECT MAX(PUNCTAJ) FROM STUD WHERE
CODS = 100)

F. Radulescu. Curs: Baze de date Limbajul SQL

17

F. Radulescu. Curs: Baze de date Limbajul SQL

18

Florin Radulescu - Baze de date (note de curs)

EXEMPLU

REZULTAT

Cererea din exemplul urmtor afieaz lista


tuturor studenilor de la specializarea cu
codul 21 care sunt tutori ai altor studeni.
Pentru a fi tutor, matricola studentului trebuie
s aparin mulimii valorilor aflate pe
coloana TUTOR din tabela STUD calculat cu
ajutorul subcererii:
SELECT NUME, CODS
FROM STUD
WHERE MATR IN (SELECT TUTOR FROM STUD)
AND CODS = 21;
F. Radulescu. Curs: Baze de date Limbajul SQL

19

NOT IN

Observaie: NOT IN returneaz


ntotdeauna valoarea fals n cazul n
care mulimea conine valori nule.
F. Radulescu. Curs: Baze de date Limbajul SQL

20

n astfel de cazuri este necesar eliminarea


acestor valori din rezultat prin adugarea unei
condiii suplimentare de tip IS NOT NULL:

SELECT NUME, CODS


FROM STUD
WHERE MATR NOT IN (SELECT TUTOR FROM
STUD) AND CODS = 21;

deoarece subcererea ntoarce o coloan


care conine i valori nule.
21

SUBCERERI CU GROUP BY

SELECT NUME, CODS


FROM STUD
WHERE MATR NOT IN
(SELECT TUTOR FROM STUD
WHERE TUTOR IS NOT NULL)
AND CODS = 21;

F. Radulescu. Curs: Baze de date Limbajul SQL

22

SUBCERERI CU GROUP BY (2)

 n exemplul urmtor subcererea folosete o clauz


GROUP BY pentru a genera punctajele maxime
pentru fiecare specializare. Cererea principal
afieaz studenii care au un punctaj egal cu vreuna
dintre valorile returnate:
SELECT NUME, PUNCTAJ, CODS
FROM STUD
WHERE PUNCTAJ IN
(SELECT MAX(PUNCTAJ)
FROM STUD
GROUP BY CODS);

F. Radulescu. Curs: Baze de date Limbajul SQL

NUME
CODS
---------- ----STANCA
21
ALEX
21

NOT IN cont.

Din aceast cauz pentru a obine lista


studenilor de la aceast specializare
care nu sunt tutori nu se poate folosi
cererea:

F. Radulescu. Curs: Baze de date Limbajul SQL

Rezultatul va conine datele pentru doi


studeni:

SELECT NUME, PUNCTAJ, CODS


FROM STUD
WHERE PUNCTAJ IN
(SELECT MAX(PUNCTAJ)
FROM STUD
GROUP BY CODS);

 ntmpltor, rezultatul conine chiar studenii cu cel


mai mare punctaj pentru fiecare specializare.
 n cazul general ns rezultatul poate conine i
studeni care nu au punctajul maxim la specializarea
lor dar egal cu maximul unei alte specializri.
23

F. Radulescu. Curs: Baze de date Limbajul SQL

24

Florin Radulescu - Baze de date (note de curs)

SOME/ANY SI ALL

EXEMPLE (1)

Este posibil folosirea operatorilor de


comparaie uzuali (<, >, =, etc.) n
conjuncie cu o cerere care ntoarce o coloan
dac aceasta este prefixat cu unul din
operatorii SOME, ANY i ALL.
Semnificaia lor este urmtoarea:
 SOME i ANY: condiia este adevrat dac
mcar o valoare dintre cele returnate de
subcerere verific comparaia respectiv.
 ALL: condiia este adevrat dac toate
valorile returnate de subcerere verific
comparaia respectiv.

Lista studenilor care au un punctaj mai mare


dect al vreunui student de la specializarea
cu cod 11:

F. Radulescu. Curs: Baze de date Limbajul SQL

F. Radulescu. Curs: Baze de date Limbajul SQL

25

SELECT NUME, PUNCTAJ


FROM STUD
WHERE PUNCTAJ >
SOME(SELECT PUNCTAJ FROM STUD
WHERE CODS = 11);

nlocuirea lui SOME cu ANY duce la obinerea


aceluiai rezultat, cei doi operatori efectund
aceeai operaie

EXEMPLE (2)

O TABELA

Lista studenilor care au un punctaj mai


mare dect al tuturor studenilor de la
specializarea 11:

n cazul n care subcererea ntoarce un


rezultat care are mai multe coloane
acesta este asimilat cu o mulime de
linii i se poate folosi operatorul IN n
urmtorul mod:

SELECT NUME, PUNCTAJ


FROM STUD
WHERE PUNCTAJ >
ALL(SELECT PUNCTAJ FROM STUD
WHERE CODS = 11);

F. Radulescu. Curs: Baze de date Limbajul SQL

WHERE (lista_de_expresii) IN (subcerere)

27

REGULI

F. Radulescu. Curs: Baze de date Limbajul SQL

28

REGULI - cont
4. Tipurile elementelor corespondente trebuie
s fie aceleai sau convertibile automat unul
la cellalt (sistemul Oracle face conversia
automat ntre tipurile ir de caractere i
numere/date calendaristice).
5. Condiia este adevrat dac rezultatul
subcererii conine mcar o linie format din
valorile expresiilor din list.
6. Dac rezultatul subcererii este vid ntreaga
condiie este evaluat la fals.

1. Lista de expresii trebuie ncadrat de


paranteze rotunde.
2. Numrul de coloane din rezultatul
subcererii trebuie s fie egal cu
numrul de expresii din list.
3. Corespondena ntre valorile
expresiilor din list i coloanele
rezultatului este poziional.
F. Radulescu. Curs: Baze de date Limbajul SQL

26

29

F. Radulescu. Curs: Baze de date Limbajul SQL

30

Florin Radulescu - Baze de date (note de curs)

EXEMPLU

OBSERVATIE

 Pentru a afla care sunt studenii cu cel mai mare


punctaj de la fiecare specializare, cererea este
urmtoarea:
SELECT NUME, PUNCTAJ, CODS
FROM STUD
WHERE (CODS, PUNCTAJ) IN
(SELECT CODS, MAX(PUNCTAJ)
FROM STUD
GROUP BY CODS);
 Codiia va fi adevrat dac punctajul studentului
este egal cu un punctaj maxim ntors de subcerere i
n acelai timp codul specializrii este al celei pentru
care s-a calculat maximul respectiv.

Observaie: Din cauza faptului c dou valori


nule nu sunt egale ntre ele un cuplu de tipul
(NULL, valoare) nu va fi considerat egal cu el
nsui.
Din acest motiv, cererea urmtoare nu va
returna date despre studenii care nu au un
tutor asociat (au o valoare nul pe aceast
coloan) dei n aparen condiia ar trebui s
fie adevrat pentru orice student al
specializrii avnd codul 11:

F. Radulescu. Curs: Baze de date Limbajul SQL

31

EXEMPLU

MATR NUME
CODS TUTOR
----- ---------- ----- ----1325 VASILE
11 1456

dei rezultatul subcererii (executat separat)


este urmtorul:
MATR NUME
CODS TUTOR
----- ---------- ----- ----1456 GEORGE
11
1325 VASILE
11 1456
1645 MARIA
11
33

SUBCERERI PE HAVING

F. Radulescu. Curs: Baze de date Limbajul SQL

34

EXEMPLE (1)

Expresiile logice coninnd subcereri se pot


folosi i pe clauza HAVING n acelai mod ca
mai sus.
n acest caz ns condiiile vor conine doar
elementele care pot s apar ntr-o astfel de
clauz: constante, expresiile dup care se
face gruparea i funcii statistice.
n continuare sunt prezentate cteva
exemple:
F. Radulescu. Curs: Baze de date Limbajul SQL

32

REZULTATE

SELECT MATR, NUME, CODS, TUTOR


FROM STUD
WHERE (MATR, NUME, CODS, TUTOR) IN
(SELECT MATR, NUME, CODS, TUTOR
FROM STUD
WHERE CODS = 11);

F. Radulescu. Curs: Baze de date Limbajul SQL

F. Radulescu. Curs: Baze de date Limbajul SQL

Afiarea codului numeric i a punctajulelor


minim i maxim doar pentru specializrile
care au un punctaj MEDIU peste media
calculat la nivelul ntregii tabele STUD:
SELECT CODS, MIN(PUNCTAJ), MAX(PUNCTAJ)
FROM STUD
GROUP BY CODS
HAVING AVG(PUNCTAJ) >
(SELECT AVG(PUNCTAJ) FROM STUD);

35

F. Radulescu. Curs: Baze de date Limbajul SQL

36

Florin Radulescu - Baze de date (note de curs)

EXEMPLE (2)

EXEMPLE (3)

Afiarea codului i a punctajului mediu pentru


specializarea cu cel mai mare punctaj mediu
(functii statistice imbricate in subcerere):

 Afiarea codului i a punctajului maxim pentru toate


specializrile n afara celei/celor cu cel mai mic punctaj maxim.
Pentru ca o specializare s apar n rezultat punctajul su
maxim trebuie s fie mai mare dect al vreunei alte specializri.
Subcererea ntoarce lista punctajelor maxime iar comparaia
dorit se face folosind operatorul ANY:

SELECT CODS, AVG(PUNCTAJ)


FROM STUD
GROUP BY CODS
HAVING AVG(PUNCTAJ) =
(SELECT MAX(AVG(PUNCTAJ))
FROM STUD
GROUP BY CODS);
F. Radulescu. Curs: Baze de date Limbajul SQL

SELECT CODS, MAX(PUNCTAJ)


FROM STUD
GROUP BY CODS
HAVING AVG(PUNCTAJ) >
ANY (SELECT AVG(PUNCTAJ)
FROM STUD
GROUP BY CODS);

37

SUBCERERI PE FROM

n cazul n care subcererea este implicat ntr-un


join se pot folsi aliasuri de tabel pentru a
dezambigua numele coloanelor rezultatului su.
Cererea anterioar se poate rescrie i astfel:

SELECT NUME, SUMA


FROM (SELECT *
FROM STUD, BURSA
WHERE PUNCTAJ BETWEEN PMIN AND PMAX
AND CODS = 11
AND SUMA IS NOT NULL);
39

JOIN CU SUBCERERI

SELECT NUME, SUMA


FROM (SELECT * FROM STUD WHERE CODS = 11) S11,
(SELECT * FROM BURSA WHERE SUMA IS NOT NULL) B
WHERE S11.PUNCTAJ BETWEEN B.PMIN AND B.PMAX;

F. Radulescu. Curs: Baze de date Limbajul SQL

40

REZULTAT VID

Folosirea aliasurilor de tabel este obligatorie


n cazul n care tabelele implicate n join au
coloane cu acelai nume. n exemplul se
afieaz numele studenilor i numele
specializrii pentru specializarea cu codul 11:
SELECT ST.NUME, SP.NUME
FROM STUD ST,
(SELECT * FROM SPEC WHERE CODS = 11) SP
WHERE ST.CODS = SP.CODS;
F. Radulescu. Curs: Baze de date Limbajul SQL

38

JOIN DE SUBCERERI

n cazul n care o subcerere apare pe clauza


FROM ea va fi tratat ca o tabel temporar.
Cererea urmtoare afieaz numele
studenilor bursieri de la specializarea cu
codul 11.

F. Radulescu. Curs: Baze de date Limbajul SQL

F. Radulescu. Curs: Baze de date Limbajul SQL

n cazul n care o subcerere aflat pe clauza


FROM nu ntoarce nici o linie nu se
semnaleaz o eroare dar cererea care o
include va returna un rezultat vid, inclusiv n
cazul unui produs cartezian.
Subcererea din exemplul urmtor nu
returneaz linii deoarece specializarea cu
codul 100 nu exist:
SELECT ST.NUME, SP.NUME
FROM STUD ST,
(SELECT * FROM SPEC WHERE CODS = 100) SP
WHERE ST.CODS = SP.CODS;

41

F. Radulescu. Curs: Baze de date Limbajul SQL

42

Florin Radulescu - Baze de date (note de curs)

REZULTAT VID (2)

SUBCERERI CORELATE

 O astfel de subcerere poate participa ns la un join


extern:
SELECT ST.NUME, SP.NUME
FROM STUD ST, (SELECT * FROM SPEC WHERE
CODS = 100) SP
WHERE ST.CODS = SP.CODS(+);
 sau:

n exemplele anterioare subcererea se


execut o singur dat dup care rezultatul
su este folosit pentru evaluarea care o
include.
Exist ns posibilitatea ca rezultatul
subcererii s fie dependent de valorile de pe
linia curent a parcurgerii definite de cerere.
n acest caz se spune c avem o subcerere
corelat.

SELECT ST.NUME, SP.NUME


FROM STUD ST
FULL OUTER JOIN (SELECT * FROM SPEC
WHERE CODS = 100) SP
ON (ST.CODS = SP.CODS);
F. Radulescu. Curs: Baze de date Limbajul SQL

43

F. Radulescu. Curs: Baze de date Limbajul SQL

44

SELECT NUME, CODS, PUNCTAJ -- CALCUL REZULTAT


FROM STUD S
WHERE PUNCTAJ > (SELECT AVG(PUNCTAJ) FROM STUD WHERE CODS = S.CODS);

SUBCERERI CORELATE (2)


 Descrierea modului de evaluare n astfel de situaii va
fi fcut pe baza urmtorului exemplu care afieaz
date despre studenii care au un punctaj peste media
celor din specializarea lor.
 Deoarece i cererea i subcererea lucreaz pe aceeai
tabel, se folosete aliasul de tabel S pentru a
specifica parcurgerea principal (cea din cerere).
SELECT NUME, CODS, PUNCTAJ
FROM STUD S
WHERE PUNCTAJ > (SELECT AVG(PUNCTAJ) FROM
STUD WHERE CODS = S.CODS);

 Pentru fiecare linie a tabelei STUD valoarea de pe


coloana CODS - codul specializrii - va fi transmis
subcererii (S.CODS).
 Se execut subcererea care calculeaz punctajul
mediu pentru studenii de la specializarea respectiv
(AVG i condiia CODS = S.CODS).
 Rezultatul subcererii este folosit n cerere pentru a
filtra sau nu linia curent (condiia PUNCTAJ >
rezultat subcerere).
 Teoretic subcererea nu se mai execut o singur dat
ci pentru fiecare linie din parcurgerea specificat de
cererea n care este inclus.

F. Radulescu. Curs: Baze de date Limbajul SQL

F. Radulescu. Curs: Baze de date Limbajul SQL

45

EXEMPLU

OBSERVATII

 Numele, codul i numrul total de studeni pentru


specializrile la care este nmatriculat cel puin un
student de anul 1. :
SELECT SP.NUME, ST.CODS, COUNT(*)
FROM STUD ST, SPEC SP
WHERE ST.CODS = SP.CODS
GROUP BY SP.NUME, ST.CODS
HAVING 1 <= (SELECT COUNT(*)
FROM STUD
WHERE CODS = ST.CODS AND
AN = 1);
F. Radulescu. Curs: Baze de date Limbajul SQL

46

 n cazul n care subcererea corelat se afl pe clauza


WHERE ea poate primi valoarea de pe orice coloan
a tabelei/produsului cartezian din cererea
nconjurtoare.
 n cazul n care subcererea corelat este pe clauza
HAVING poate primi doar coloanele/expresiile dup
care s-a facut gruparea.
 Subcererile corelate pot returna o valoare, o coloan
sau o tabel, ca i cele necorelate. n cazul n care
returneaz o coloan sau o tabel se poate folosi
operatorul IN. Sunt permii de asemenea operatorii
SOME/ANY i ALL.
47

F. Radulescu. Curs: Baze de date Limbajul SQL

48

Florin Radulescu - Baze de date (note de curs)

OPERATORUL EXISTS

EXEMPLU

Acest operator testeaz dac subcererea


primit ca argument ntoarce un rezultat
nevid. Sintaxa sa este:
EXISTS(subcerere)

Lista specializrilor unde exist cel


puin un student de anul 1:

Returneaz valorea logic ADEVARAT dac


subcererea are un rezultat nevid i FALS dac
rezultatul e vid (nici o linie).
n cazul acestui operator nu este important
coninutul rezultatului subcererii ci doar
existena sau absena sa.
F. Radulescu. Curs: Baze de date Limbajul SQL

49

SUBCERERI IN ORDER BY

F. Radulescu. Curs: Baze de date Limbajul SQL

50

EXEMPLU

n actualele versiuni ale sistemului


Oracle clauza ORDER BY poate conine
o subcerere Aceasta trebuie s
returneze o singur valoare i s fie o
subcerere corelat.
Prezena unei cereri necorelate pe
aceast clauz nu duce la ordonarea
rezultatului deoarece rezultatul fiind o
constant are aceeai valoare pentru
fiecare dintre liniile supuse sortrii.
F. Radulescu. Curs: Baze de date Limbajul SQL

SELECT CODS, NUME


FROM SPEC
WHERE EXISTS (SELECT 1
FROM STUD
WHERE SPEC.CODS = CODS
AND AN = 1);

Ordonarea se face dup numrul de


studeni ndrumai de fiecare tutor:
SELECT NUME, CODS, AN
FROM STUD S
WHERE CODS = 24
ORDER BY (SELECT COUNT(*) FROM STUD
WHERE TUTOR = S.MATR) DESC;

51

F. Radulescu. Curs: Baze de date Limbajul SQL

52

SUBCERERI PE SELECT

EXEMPLU

Ca i n cazul celor din ORDER BY


aceste subcereri trebuie s ntoarc o
singur valoare.
Subcererea poate fi necorelat (n acest
caz pe coloana respectiv din rezultat
vom avea aceeai valoare) sau corelat.

SELECT NUME, (SELECT COUNT(*)


FROM STUD
WHERE TUTOR = S.MATR) NUMAR
FROM STUD S
WHERE CODS = 24
AND 1 <= (SELECT COUNT(*)
FROM STUD
WHERE TUTOR = S.MATR)
ORDER BY (SELECT COUNT(*)
FROM STUD
WHERE TUTOR = S.MATR) DESC

F. Radulescu. Curs: Baze de date Limbajul SQL

F. Radulescu. Curs: Baze de date Limbajul SQL

53

54

Florin Radulescu - Baze de date (note de curs)

UNION INTERSET si MINUS

REGULI
 Ambele cereri ntorc acelai numr de coloane.
 Coloanele corespondente au valori de acelai tip sau de tipuri
pentru care sistemul poate face automat conversia.
 Operatorii pot fi folosii repetat i succesiv pentru a forma
expresii. n acest caz, dac nu se folosesc paranteze pentru a
schimba ordinea de evaluare, ei se execut n ordinea n care
apar n expresie.
 Capul de tabel al rezultatului este cel dat de prima cerere din
expresie.
 Cererile implicate n aceste operaii nu pot conine clauza
ORDER BY. Aceasta poate s fie pus doar la sfritul expresiei
i poate conine nume de coloane din rezultat sau numerele de
ordine ale acestora.
 Rezultatul nu conine linii duplicat. Acestea sunt eliminate chiar
dac provin din aceeai cerere - operand al expresiei.

Sintaxa:
Subcerere
UNION | INTERSECT | MINUS
Subcerere

F. Radulescu. Curs: Baze de date Limbajul SQL

55

F. Radulescu. Curs: Baze de date Limbajul SQL

56

EXEMPLU
SELECT NUME, CODS, LOC, PUNCTAJ
FROM STUD
WHERE CODS = 11 AND PUNCTAJ > 2000
UNION
SELECT NUME, CODS, LOC, PUNCTAJ
FROM STUD
WHERE CODS = 21 AND LOC = 'BUCURESTI'
UNION
SELECT NUME, CODS, LOC, PUNCTAJ
FROM STUD
WHERE CODS = 24 AND PUNCTAJ >1500
INTERSECT
SELECT NUME, CODS, LOC, PUNCTAJ
FROM STUD
WHERE PUNCTAJ >= 700
ORDER BY LOC DESC, 4;
F. Radulescu. Curs: Baze de date Limbajul SQL

Sfarsitul capitolului

SUBCERERI

57

F. Radulescu. Curs: Baze de date Limbajul SQL

58

10

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