Sunteți pe pagina 1din 58

Capitolul 4

SUBCERERI

F. Radulescu. Curs: Baze de date Limbajul SQL

STUD
MATR ---1456 1325 1645 3145 2146 3251 2215 4311 3514 1925 2101 4705 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

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

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
F. Radulescu. Curs: Baze de date Limbajul SQL 3

OBIECTIV
O subcerere este o cerere SELECT inclus ntr-o alt cerere SQL. Astfel de construc ii se folosesc n cazul n care rezultatul dorit nu se poate ob ine 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 studen ii cu acel punctaj.
F. Radulescu. Curs: Baze de date Limbajul SQL 4

PARCURGERI
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

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.
F. Radulescu. Curs: Baze de date Limbajul SQL 6

SUBCERERI IN EXPRESII LOGICE


Rezultatul unui SELECT, dac este nevid, este ntotdeauna o tabel. Din punct de vedere al modului de folosire al unei subcereri exist ns diferen e n func ie 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 7

O VALOARE
n acest caz valoarea ntoars de subcerere poate fi folosit ca oricare alta n compara ii care includ operatorii obinui i: <, <=, >, >=, = 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 studen ilor care au acel punctaj i valoarea acestuia: SELECT NUME, PUNCTAJ FROM STUD WHERE PUNCTAJ = (SELECT MAX(PUNCTAJ) FROM STUD)
F. Radulescu. Curs: Baze de date Limbajul SQL 8

REZULTAT
Rezultatul ob inut este:
NUME PUNCTAJ ---------- ------FLOREA 3230

F. Radulescu. Curs: Baze de date Limbajul SQL

REGULI PENTRU SUBCERERI (1)


Subcererea trebuie s fie ntotdeauna n partea dreapt a compara iei, 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 con ine clauza ORDER BY.
F. Radulescu. Curs: Baze de date Limbajul SQL 10

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, compara ia n care e implicat se evalueaz la FALS. O cerere poate con ine una sau mai multe subcereri, acestea putnd fi pe acelai nivel sau incluse una n alta.
F. Radulescu. Curs: Baze de date Limbajul SQL 11

ALTI OPERATORI
n afar de operatorii uzuali de compara ie, n cazul acestui tip de subcereri se pot folosi i operatorii BETWEEN, LIKE i IS NULL. Exemplele urmtoare reprezint cereri valide con innd 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

SUBCERERI IN BETWEEN
Afiarea numelui i punctajului pentru studen ii 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

SUBCERERI IN LIKE
Afiarea acelorai date ca mai sus pentru studen ii avnd un nume care nu ncepe cu aceeai liter cu a studentului cu punctaj maxim:
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)


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 func ia SUBSTR(rezultat, 1, 1) i este concatenat cu caracterul % pentru a forma un ablon folosit apoi de condi ia NOT LIKE.
F. Radulescu. Curs: Baze de date Limbajul SQL 15

ERORI (1)
Subcererea ntoarce mai multe valori. n acest caz nu vom ob ine un rezultat ci mesajul de eroare men ionat anterior:
SELECT NUME, PUNCTAJ FROM STUD WHERE PUNCTAJ = (SELECT PUNCTAJ FROM STUD);

F. Radulescu. Curs: Baze de date Limbajul SQL

16

ERORI (2)
Subcererea nu ntoarce nici o valoare. n acest caz vom ob ine un rezultat vid (fr nici o linie), condi ia evalundu-se la FALS:
SELECT NUME, PUNCTAJ FROM STUD WHERE PUNCTAJ = (SELECT MAX(PUNCTAJ) FROM STUD WHERE CODS = 100)

F. Radulescu. Curs: Baze de date Limbajul SQL

17

O COLOANA
n acest caz valorile coloanei ntoarse de subcerere sunt asimilate unei mul imi. Condi ia trebuie s foloseasc operatorul IN sau negatul acestuia NOT IN i nu operatori de compara ie.

F. Radulescu. Curs: Baze de date Limbajul SQL

18

EXEMPLU
Cererea din exemplul urmtor afieaz lista tuturor studen ilor de la specializarea cu codul 21 care sunt tutori ai altor studen i. Pentru a fi tutor, matricola studentului trebuie s apar in mul imii 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

REZULTAT
Rezultatul va con ine datele pentru doi studen i:
NUME CODS ---------- ----STANCA 21 ALEX 21

Observa ie: NOT IN returneaz ntotdeauna valoarea fals n cazul n care mul imea con ine valori nule.
F. Radulescu. Curs: Baze de date Limbajul SQL 20

NOT IN
Din aceast cauz pentru a ob ine lista studen ilor de la aceast specializare care nu sunt tutori nu se poate folosi cererea:
SELECT NUME, CODS FROM STUD WHERE MATR NOT IN (SELECT TUTOR FROM STUD) AND CODS = 21;

deoarece subcererea ntoarce o coloan care con ine i valori nule.


F. Radulescu. Curs: Baze de date Limbajul SQL 21

NOT IN cont.
n astfel de cazuri este necesar eliminarea acestor valori din rezultat prin adugarea unei condi ii suplimentare de tip IS NOT NULL:
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
n exemplul urmtor subcererea folosete o clauz GROUP BY pentru a genera punctajele maxime pentru fiecare specializare. Cererea principal afieaz studen ii 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

23

SUBCERERI CU GROUP BY (2)


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

ntmpltor, rezultatul con ine chiar studen ii cu cel mai mare punctaj pentru fiecare specializare. n cazul general ns rezultatul poate con ine i studen i care nu au punctajul maxim la specializarea lor dar egal cu maximul unei alte specializri.
F. Radulescu. Curs: Baze de date Limbajul SQL 24

SOME/ANY SI ALL
Este posibil folosirea operatorilor de compara ie uzuali (<, >, =, etc.) n conjunc ie cu o cerere care ntoarce o coloan dac aceasta este prefixat cu unul din operatorii SOME, ANY i ALL. Semnifica ia lor este urmtoarea: SOME i ANY: condi ia este adevrat dac mcar o valoare dintre cele returnate de subcerere verific compara ia respectiv. ALL: condi ia este adevrat dac toate valorile returnate de subcerere verific compara ia respectiv.
F. Radulescu. Curs: Baze de date Limbajul SQL 25

EXEMPLE (1)
Lista studen ilor care au un punctaj mai mare dect al vreunui student de la specializarea cu cod 11:
SELECT NUME, PUNCTAJ FROM STUD WHERE PUNCTAJ > SOME(SELECT PUNCTAJ FROM STUD WHERE CODS = 11);

nlocuirea lui SOME cu ANY duce la ob inerea aceluiai rezultat, cei doi operatori efectund aceeai opera ie
F. Radulescu. Curs: Baze de date Limbajul SQL 26

EXEMPLE (2)
Lista studen ilor care au un punctaj mai mare dect al tuturor studen ilor de la specializarea 11:
SELECT NUME, PUNCTAJ FROM STUD WHERE PUNCTAJ > ALL(SELECT PUNCTAJ FROM STUD WHERE CODS = 11);

F. Radulescu. Curs: Baze de date Limbajul SQL

27

O TABELA
n cazul n care subcererea ntoarce un rezultat care are mai multe coloane acesta este asimilat cu o mul ime de linii i se poate folosi operatorul IN n urmtorul mod:
WHERE (lista_de_expresii) IN (subcerere)

F. Radulescu. Curs: Baze de date Limbajul SQL

28

REGULI
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. Coresponden a ntre valorile expresiilor din list i coloanele rezultatului este pozi ional.
F. Radulescu. Curs: Baze de date Limbajul SQL 29

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. Condi ia este adevrat dac rezultatul subcererii con ine mcar o linie format din valorile expresiilor din list. 6. Dac rezultatul subcererii este vid ntreaga condi ie este evaluat la fals.
F. Radulescu. Curs: Baze de date Limbajul SQL 30

EXEMPLU
Pentru a afla care sunt studen ii 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); Codi ia 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.
F. Radulescu. Curs: Baze de date Limbajul SQL 31

OBSERVATIE
Observa ie: 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 studen ii care nu au un tutor asociat (au o valoare nul pe aceast coloan) dei n aparen condi ia ar trebui s fie adevrat pentru orice student al specializrii avnd codul 11:
F. Radulescu. Curs: Baze de date Limbajul SQL 32

EXEMPLU
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

33

REZULTATE
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
F. Radulescu. Curs: Baze de date Limbajul SQL 34

SUBCERERI PE HAVING
Expresiile logice con innd subcereri se pot folosi i pe clauza HAVING n acelai mod ca mai sus. n acest caz ns condi iile vor con ine doar elementele care pot s apar ntr-o astfel de clauz: constante, expresiile dup care se face gruparea i func ii statistice. n continuare sunt prezentate cteva exemple:
F. Radulescu. Curs: Baze de date Limbajul SQL 35

EXEMPLE (1)
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);

F. Radulescu. Curs: Baze de date Limbajul SQL

36

EXEMPLE (2)
Afiarea codului i a punctajului mediu pentru specializarea cu cel mai mare punctaj mediu (functii statistice imbricate in subcerere):
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 37

EXEMPLE (3)
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 compara ia dorit se face folosind operatorul ANY:

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

F. Radulescu. Curs: Baze de date Limbajul SQL

38

SUBCERERI PE FROM
n cazul n care o subcerere apare pe clauza FROM ea va fi tratat ca o tabel temporar. Cererea urmtoare afieaz numele studen ilor bursieri de la specializarea cu codul 11.
SELECT NUME, SUMA FROM (SELECT * FROM STUD, BURSA WHERE PUNCTAJ BETWEEN PMIN AND PMAX AND CODS = 11 AND SUMA IS NOT NULL);
F. Radulescu. Curs: Baze de date Limbajul SQL 39

JOIN DE SUBCERERI
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 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

JOIN CU SUBCERERI
Folosirea aliasurilor de tabel este obligatorie n cazul n care tabelele implicate n join au coloane cu acelai nume. n exemplul se afieaz numele studen ilor 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 41

REZULTAT VID
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;
F. Radulescu. Curs: Baze de date Limbajul SQL 42

REZULTAT VID (2)


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: 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

SUBCERERI CORELATE
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.
F. Radulescu. Curs: Baze de date Limbajul SQL 44

SUBCERERI CORELATE (2)


Descrierea modului de evaluare n astfel de situa ii va fi fcut pe baza urmtorului exemplu care afieaz date despre studen ii 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);

F. Radulescu. Curs: Baze de date Limbajul SQL

45

SELECT NUME, CODS, PUNCTAJ -- CALCUL REZULTAT 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 studen ii de la specializarea respectiv (AVG i condi ia CODS = S.CODS). Rezultatul subcererii este folosit n cerere pentru a filtra sau nu linia curent (condi ia 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 46

EXEMPLU
Numele, codul i numrul total de studen i pentru specializrile la care este nmatriculat cel pu in 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 47

OBSERVATII
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.
F. Radulescu. Curs: Baze de date Limbajul SQL 48

OPERATORUL EXISTS
Acest operator testeaz dac subcererea primit ca argument ntoarce un rezultat nevid. Sintaxa sa este: EXISTS(subcerere) 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 con inutul rezultatului subcererii ci doar existen a sau absen a sa.
F. Radulescu. Curs: Baze de date Limbajul SQL 49

EXEMPLU
Lista specializrilor unde exist cel pu in un student de anul 1:
SELECT CODS, NUME FROM SPEC WHERE EXISTS (SELECT 1 FROM STUD WHERE SPEC.CODS = CODS AND AN = 1);
F. Radulescu. Curs: Baze de date Limbajul SQL 50

SUBCERERI IN ORDER BY
n actualele versiuni ale sistemului Oracle clauza ORDER BY poate con ine o subcerere Aceasta trebuie s returneze o singur valoare i s fie o subcerere corelat. Prezen a 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 51

EXEMPLU
Ordonarea se face dup numrul de studen i ndruma i de fiecare tutor:
SELECT NUME, CODS, AN FROM STUD S WHERE CODS = 24 ORDER BY (SELECT COUNT(*) FROM STUD WHERE TUTOR = S.MATR) DESC;

F. Radulescu. Curs: Baze de date Limbajul SQL

52

SUBCERERI PE SELECT
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.

F. Radulescu. Curs: Baze de date Limbajul SQL

53

EXEMPLU
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 54

UNION INTERSET si MINUS


Sintaxa:
Subcerere UNION | INTERSECT | MINUS Subcerere

F. Radulescu. Curs: Baze de date Limbajul SQL

55

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 folosi i 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 opera ii nu pot con ine clauza ORDER BY. Aceasta poate s fie pus doar la sfritul expresiei i poate con ine nume de coloane din rezultat sau numerele de ordine ale acestora. Rezultatul nu con ine linii duplicat. Acestea sunt eliminate chiar dac provin din aceeai cerere - operand al expresiei.

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 57

Sfarsitul capitolului

SUBCERERI

F. Radulescu. Curs: Baze de date Limbajul SQL

58

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