Capitolul 4 SUBCERERI. F. Radulescu. Curs: Baze de date - Limbajul SQL

Similar documents
CERERI SELECT PE O TABELA

CERERI SELECT PE MAI MULTE TABELE

INTEROGĂRI ÎN SQL SERVER

Titlul lucrării propuse pentru participarea la concursul pe tema securității informatice

Structura și Organizarea Calculatoarelor. Titular: BĂRBULESCU Lucian-Florentin

Funcţii grup şi clauzele GROUP BY, HAVING. Operatorii ROLLUP şi CUBE.

Metrici LPR interfatare cu Barix Barionet 50 -

Subiecte Clasa a VI-a

REVISTA NAŢIONALĂ DE INFORMATICĂ APLICATĂ INFO-PRACTIC

Procesarea Imaginilor

2. Setări configurare acces la o cameră web conectată într-un router ZTE H218N sau H298N

Reflexia şi refracţia luminii. Aplicaţii. Valerica Baban

Versionare - GIT ALIN ZAMFIROIU

Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic

Mecanismul de decontare a cererilor de plata

ISBN-13:

Ghid identificare versiune AWP, instalare AWP şi verificare importare certificat în Store-ul de Windows

Lucrarea de laborator nr. 4

Arbori. Figura 1. struct ANOD { int val; ANOD* st; ANOD* dr; }; #include <stdio.h> #include <conio.h> struct ANOD { int val; ANOD* st; ANOD* dr; }

Textul si imaginile din acest document sunt licentiate. Codul sursa din acest document este licentiat. Attribution-NonCommercial-NoDerivs CC BY-NC-ND

GHID DE TERMENI MEDIA

ARBORI AVL. (denumiti dupa Adelson-Velskii si Landis, 1962)

D în această ordine a.î. AB 4 cm, AC 10 cm, BD 15cm

The First TST for the JBMO Satu Mare, April 6, 2018

La fereastra de autentificare trebuie executati urmatorii pasi: 1. Introduceti urmatoarele date: Utilizator: - <numarul dvs de carnet> (ex: "9",

Excel Advanced. Curriculum. Școala Informală de IT. Educație Informală S.A.

Aspecte controversate în Procedura Insolvenţei şi posibile soluţii

MS POWER POINT. s.l.dr.ing.ciprian-bogdan Chirila

5.2 Interogări în SQL

Modalitǎţi de clasificare a datelor cantitative

Olimpiad«Estonia, 2003

Auditul financiar la IMM-uri: de la limitare la oportunitate

Dispozitive Electronice şi Electronică Analogică Suport curs 02 Metode de analiză a circuitelor electrice. Divizoare rezistive.

Metoda BACKTRACKING. prof. Jiduc Gabriel

INFORMAȚII DESPRE PRODUS. FLEXIMARK Stainless steel FCC. Informații Included in FLEXIMARK sample bag (article no. M )

Gruparea rezultatelor unei interogări

Laborator 1. Programare declarativă. Programare logică. Prolog. SWI-Prolog

[{CYCLE NOCYCLE}] [{CACHE

9. Memoria. Procesorul are o memorie cu o arhitectură pe două niveluri pentru memoria de program și de date.

Metoda de programare BACKTRACKING

Subinterogari SELECT salariul FROM angajaţi WHERE nume= Ionescu SELECT nume, prenume FROM angajaţi WHERE salariul>s

Reţele Neuronale Artificiale în MATLAB

Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic

Proiectarea bazelor de date. PL/SQL Înregistrări și Colecții # 13. Adrian Runceanu

Semnale şi sisteme. Facultatea de Electronică şi Telecomunicaţii Departamentul de Comunicaţii (TC)

Update firmware aparat foto

Nume şi Apelativ prenume Adresa Număr telefon Tip cont Dobânda Monetar iniţial final

Preţul mediu de închidere a pieţei [RON/MWh] Cota pieţei [%]

Updating the Nomographical Diagrams for Dimensioning the Concrete Slabs

6. Bucle. 6.1 Instrucţiunea while

Proceduri stocate. Crearea procedurilor stocate. Varianta 1 În Management Studio se dă clic pe New Query ca în imaginea de mai jos: Fig.

R O M Â N I A CURTEA CONSTITUŢIONALĂ

F. Radulescu. Curs: Utilizarea bazelor de date, anul IV C5.

În continuare vom prezenta unele dintre problemele de calcul ale numerelor Fibonacci.

Colegiul Național Calistrat Hogaș Piatra-Neamț LIMBAJUL SQL

Interogarea (query), este operaţia prin care se obţin datele

Mods euro truck simulator 2 harta romaniei by elyxir. Mods euro truck simulator 2 harta romaniei by elyxir.zip

MICROSOFT ACCESS 2007 (DE CĂUTAT???)

Propuneri pentru teme de licență

Grafuri bipartite. Lecție de probă, informatică clasa a XI-a. Mihai Bărbulescu Facultatea de Automatică și Calculatoare, UPB

SGBD Access 2010: Query

Documentaţie Tehnică

Proceduri de analizã a datelor

2. Setări configurare acces la o cameră web conectată într-un echipament HG8121H cu funcție activă de router

CAIETUL DE SARCINI Organizare evenimente. VS/2014/0442 Euro network supporting innovation for green jobs GREENET

Vizualizarea documentelor xml

X-Fit S Manual de utilizare

:= 950; BEGIN DELETE FROM

APLICAŢIE INFORMATICĂ PENTRU PREGĂTIREA MISIUNILOR DE NIVEL TACTIC

REVISTA NAŢIONALĂ DE INFORMATICĂ APLICATĂ INFO-PRACTIC

Candlesticks. 14 Martie Lector : Alexandru Preda, CFTe

Evoluția pieței de capital din România. 09 iunie 2018

PROCEDURA PRIVIND DECONTURILE. 2. Domeniu de aplicare Procedura se aplică în cadrul Universităţii Tehnice Cluj-Napoca

Cap.5 Normalizarea relaţiilor

Baza de date: tabele, date. Componentele unei B.D.: tabele, constrangeri, relatii. Entitati ale unei B.D.: formulare, interogari, rapoarte

9. CURSOARE. Obiective. În acest Capitol, vom învăţa despre: Manipularea cursoarelor. Folosirea Cursor FOR Loops şi Nesting Cursors.

earning every day-ahead your trust stepping forward to the future opcom operatorul pie?ei de energie electricã și de gaze naturale din România Opcom

6. Excepţii şi aserţiuni. 6. Excepţii şi aserţiuni

1.1. Noţiuni introductive

Creare baza de data Deschidem aplicaţia Microsoft Access. Lansarea în execuţie a programului se face urmând calea:

ADO.NET - note de curs pentru disciplina "Servere de date"

EN teava vopsita cu capete canelate tip VICTAULIC

Laborator 2. Definirea tablourilor şi a funcţiilor (în linia de comandă) în Matlab 7.0

PROGRAMAREA CALCULATOARELOR ŞI LIMBAJE DE PROGRAMARE (IV)

INTERPRETOARE DE COMENZI

REGULAMENTUL DE ORGANIZARE A PROCESULUI DE ÎNVĂŢĂMÂNT PE BAZA SISTEMULUI DE CREDITE TRANSFERABILE LA UNIVERSITATEA PETROL-GAZE DIN PLOIEŞTI COD: R 10

1. Creaţi un nou proiect de tip Windows Forms Application, cu numele MdiExample.

Platforma Blackboard

ANALIZA FUNCŢIONALĂ, O METODĂ DE MODELARE ÎN PROIECTAREA UTILAJELOR

Tehnologia OLAP. Prep. Daniela-Ioana SANDU, prep. Elena POSDARIE Catedra de Informatica Economica, A.S.E. Bucuresti

Proiectarea bazelor de date # 11. PL/SQL Funcții în PL/SQL (partea a II-a) Adrian Runceanu

Limbajul VHDL. Circuite integrate numerice. Limbajul VHDL

CHAMPIONS LEAGUE 2017 SPONSOR:

Laborator 2 - Statistică descriptivă

INSTRUMENTE DE MARKETING ÎN PRACTICĂ:

Ierarhia memoriilor Tipuri de memorii Memorii semiconductoare Memoria cu unități multiple. Memoria cache Memoria virtuală

UNIVERSITATEA DIN CRAIOVA FACULTATEA DE ELECTROMECANICĂ CATEDRA DE ACŢIONĂRI ELECTRICE. Şef lucrări dr. ing. Cătălin CONSTANTINESCU BAZE DE DATE

PROIECTAREA ALGORITMILOR

STARS! Students acting to reduce speed Final report

HEAPSORT I. CONSIDERAŢII TEORETICE

Transcription:

Capitolul 4 SUBCERERI 1

STUD MATR NUME AN GRUPA DATAN LOC TUTOR PUNCTAJ CODS ---- ------- -- ------ --------- ---------- ----- ------- ---- 1456 GEORGE 4 1141A 12-MAR-82 BUCURESTI 2890 11 1325 VASILE 2 1122A 05-OCT-84 PITESTI 1456 390 11 1645 MARIA 3 1131B 17-JUN-83 PLOIESTI 1400 11 3145 ION 1 2112B 24-JAN-85 PLOIESTI 3251 1670 21 2146 STANCA 4 2141A 15-MAY-82 BUCURESTI 620 21 3251 ALEX 5 2153B 07-NOV-81 BRASOV 1570 21 2215 ELENA 2 2122A 29-AUG-84 BUCURESTI 2146 890 21 4311 ADRIAN 3 2431A 31-JUL-83 BUCURESTI 450 24 3514 FLOREA 5 2452B 03-FEB-81 BRASOV 3230 24 1925 OANA 2 2421A 20-DEC-84 BUCURESTI 4311 760 24 2101 MARIUS 1 2412B 02-SEP-85 PITESTI 3514 310 24 4705 VOICU 2 2421B 19-APR-84 BRASOV 4311 1290 24 2

SPEC si BURSA CODS NUME DOMENIU ----- ---------- --------------- 11 MATEMATICA STIINTE EXACTE 21 GEOGRAFIE UMANIST 24 ISTORIE 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 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 afişează datele dorite despre studentul sau studenţii cu acel punctaj. 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) furnizând datele necesare pentru a doua (cererea principală). 5

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 afişare 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. 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 7

O VALOARE În acest caz valoarea întoarsă de subcerere poate fi folosită ca oricare alta în comparaţii care includ operatorii obişnuiţ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 WHERE PUNCTAJ = (SELECT MAX(PUNCTAJ) ) 8

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

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. 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 putând fi pe acelaşi nivel sau incluse una în alta. 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 următoare reprezintă cereri valide conţinând şi BETWEEN sau LIKE. Folosirea lui IS NULL pentru o subcerere este relevantă doar în cazul subcererilor corelate prezentate într-un alt subcapitol. 12

SUBCERERI IN BETWEEN Afişarea numelui şi punctajului pentru studenţii având un punctaj egal cu cel mediu +/- 30%. Se foloseşte operatorul BETWEEN având ca parametri două subcereri: SELECT NUME, PUNCTAJ WHERE PUNCTAJ BETWEEN (SELECT AVG(PUNCTAJ) )*0.7 AND (SELECT AVG(PUNCTAJ) )*1.3; 13

SUBCERERI IN LIKE Afişarea aceloraşi date ca mai sus pentru studenţii având un nume care nu începe cu aceeaşi literă cu a studentului cu punctaj maxim: SELECT NUME, PUNCTAJ WHERE NUME NOT LIKE SUBSTR( (SELECT NUME WHERE PUNCTAJ = (SELECT MAX(PUNCTAJ) ) ), 1, 1) '%'; 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. 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 WHERE PUNCTAJ = (SELECT PUNCTAJ FROM STUD); 16

ERORI (2) Subcererea nu întoarce nici o valoare. În acest caz vom obţine un rezultat vid (fără nici o linie), condiţia evaluându-se la FALS: SELECT NUME, PUNCTAJ WHERE PUNCTAJ = (SELECT MAX(PUNCTAJ) WHERE CODS = 100) 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. 18

EXEMPLU Cererea din exemplul următor afişează 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 WHERE MATR IN (SELECT TUTOR ) AND CODS = 21; 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. 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 WHERE MATR NOT IN (SELECT TUTOR FROM STUD) AND CODS = 21; deoarece subcererea întoarce o coloană care conţine şi valori nule. 21

NOT IN cont. În astfel de cazuri este necesară eliminarea acestor valori din rezultat prin adăugarea unei condiţii suplimentare de tip IS NOT NULL: SELECT NUME, CODS WHERE MATR NOT IN (SELECT TUTOR WHERE TUTOR IS NOT NULL) AND CODS = 21; 22

SUBCERERI CU GROUP BY În exemplul următor subcererea foloseşte o clauză GROUP BY pentru a genera punctajele maxime pentru fiecare specializare. Cererea principală afişează studenţii care au un punctaj egal cu vreuna dintre valorile returnate: SELECT NUME, PUNCTAJ, CODS WHERE PUNCTAJ IN (SELECT MAX(PUNCTAJ) GROUP BY CODS); 23

SUBCERERI CU GROUP BY (2) SELECT NUME, PUNCTAJ, CODS WHERE PUNCTAJ IN (SELECT MAX(PUNCTAJ) GROUP BY CODS); Întâmplător, 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 specializări. 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 următoarea: SOME şi ANY: condiţia este adevărată dacă măcar o valoare dintre cele returnate de subcerere verifică comparaţia respectivă. ALL: condiţia este adevărată dacă toate valorile returnate de subcerere verifică comparaţia respectivă. 25

EXEMPLE (1) Lista studenţilor care au un punctaj mai mare decât al vreunui student de la specializarea cu cod 11: SELECT NUME, PUNCTAJ WHERE PUNCTAJ > SOME(SELECT PUNCTAJ WHERE CODS = 11); Înlocuirea lui SOME cu ANY duce la obţinerea aceluiaşi rezultat, cei doi operatori efectuând aceeaşi operaţie 26

EXEMPLE (2) Lista studenţilor care au un punctaj mai mare decât al tuturor studenţilor de la specializarea 11: SELECT NUME, PUNCTAJ WHERE PUNCTAJ > ALL(SELECT PUNCTAJ WHERE CODS = 11); 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 următorul mod: WHERE (lista_de_expresii) IN (subcerere) 28

REGULI 1. Lista de expresii trebuie încadrată de paranteze rotunde. 2. Numărul de coloane din rezultatul subcererii trebuie să fie egal cu numărul de expresii din listă. 3. Corespondenţa între valorile expresiilor din listă şi coloanele rezultatului este poziţională. 29

REGULI - cont 4. Tipurile elementelor corespondente trebuie să fie aceleaşi sau convertibile automat unul la celălalt (sistemul Oracle face conversia automată între tipurile şir de caractere şi numere/date calendaristice). 5. Condiţia este adevărată dacă rezultatul subcererii conţine măcar o linie formată din valorile expresiilor din listă. 6. Dacă rezultatul subcererii este vid întreaga condiţie este evaluată la fals. 30

EXEMPLU Pentru a afla care sunt studenţii cu cel mai mare punctaj de la fiecare specializare, cererea este următoarea: SELECT NUME, PUNCTAJ, CODS WHERE (CODS, PUNCTAJ) IN (SELECT CODS, MAX(PUNCTAJ) GROUP BY CODS); Codiţia va fi adevărată dacă punctajul studentului este egal cu un punctaj maxim întors de subcerere şi în acelaşi timp codul specializării este al celei pentru care s-a calculat maximul respectiv. 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 însuşi. Din acest motiv, cererea următoare nu va returna date despre studenţii care nu au un tutor asociat (au o valoare nulă pe această coloană) deşi în aparenţă condiţia ar trebui să fie adevărată pentru orice student al specializării având codul 11: 32

EXEMPLU SELECT MATR, NUME, CODS, TUTOR WHERE (MATR, NUME, CODS, TUTOR) IN (SELECT MATR, NUME, CODS, TUTOR WHERE CODS = 11); 33

REZULTATE MATR NUME CODS TUTOR ----- ---------- ----- ----- 1325 VASILE 11 1456 deşi rezultatul subcererii (executată separat) este următorul: MATR NUME CODS TUTOR ----- ---------- ----- ----- 1456 GEORGE 11 1325 VASILE 11 1456 1645 MARIA 11 34

SUBCERERI PE HAVING Expresiile logice conţinând subcereri se pot folosi şi pe clauza HAVING în acelaşi 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 câteva exemple: 35

EXEMPLE (1) Afişarea codului numeric şi a punctajulelor minim şi maxim doar pentru specializările care au un punctaj MEDIU peste media calculată la nivelul întregii tabele STUD: SELECT CODS, MIN(PUNCTAJ), MAX(PUNCTAJ) GROUP BY CODS HAVING AVG(PUNCTAJ) > (SELECT AVG(PUNCTAJ) ); 36

EXEMPLE (2) Afişarea codului şi a punctajului mediu pentru specializarea cu cel mai mare punctaj mediu (functii statistice imbricate in subcerere): SELECT CODS, AVG(PUNCTAJ) GROUP BY CODS HAVING AVG(PUNCTAJ) = (SELECT MAX(AVG(PUNCTAJ)) GROUP BY CODS); 37

EXEMPLE (3) Afişarea codului şi a punctajului maxim pentru toate specializările în afara celei/celor cu cel mai mic punctaj maxim. Pentru ca o specializare să apară în rezultat punctajul său maxim trebuie să fie mai mare decât al vreunei alte specializări. Subcererea întoarce lista punctajelor maxime iar comparaţia dorită se face folosind operatorul ANY: SELECT CODS, MAX(PUNCTAJ) GROUP BY CODS HAVING AVG(PUNCTAJ) > ANY (SELECT AVG(PUNCTAJ) GROUP BY CODS); 38

SUBCERERI PE FROM În cazul în care o subcerere apare pe clauza FROM ea va fi tratată ca o tabelă temporară. Cererea următoare afişează numele studenţilor bursieri de la specializarea cu codul 11. SELECT NUME, SUMA FROM (SELECT *, BURSA WHERE PUNCTAJ BETWEEN PMIN AND PMAX AND CODS = 11 AND SUMA IS NOT NULL); 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 său. Cererea anterioară se poate rescrie şi astfel: SELECT NUME, SUMA FROM (SELECT * WHERE CODS = 11) S11, (SELECT * FROM BURSA WHERE SUMA IS NOT NULL) B WHERE S11.PUNCTAJ BETWEEN B.PMIN AND B.PMAX; 40

JOIN CU SUBCERERI Folosirea aliasurilor de tabelă este obligatorie în cazul în care tabelele implicate în join au coloane cu acelaşi nume. În exemplul se afişează numele studenţilor şi numele specializării pentru specializarea cu codul 11: SELECT ST.NUME, SP.NUME ST, (SELECT * FROM SPEC WHERE CODS = 11) SP WHERE ST.CODS = SP.CODS; 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 următor nu returnează linii deoarece specializarea cu codul 100 nu există: SELECT ST.NUME, SP.NUME ST, (SELECT * FROM SPEC WHERE CODS = 100) SP WHERE ST.CODS = SP.CODS; 42

REZULTAT VID (2) O astfel de subcerere poate participa însă la un join extern: SELECT ST.NUME, SP.NUME ST, (SELECT * FROM SPEC WHERE CODS = 100) SP WHERE ST.CODS = SP.CODS(+); sau: SELECT ST.NUME, SP.NUME ST FULL OUTER JOIN (SELECT * FROM SPEC WHERE CODS = 100) SP ON (ST.CODS = SP.CODS); 43

SUBCERERI CORELATE În exemplele anterioare subcererea se execută o singură dată după care rezultatul său 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ă. 44

SUBCERERI CORELATE (2) Descrierea modului de evaluare în astfel de situaţii va fi făcută pe baza următorului exemplu care afişează date despre studenţii care au un punctaj peste media celor din specializarea lor. Deoarece şi cererea şi subcererea lucrează pe aceeaşi tabelă, se foloseşte aliasul de tabelă S pentru a specifica parcurgerea principală (cea din cerere). SELECT NUME, CODS, PUNCTAJ S WHERE PUNCTAJ > (SELECT AVG(PUNCTAJ) FROM STUD WHERE CODS = S.CODS); 45

SELECT NUME, CODS, PUNCTAJ -- CALCUL REZULTAT S WHERE PUNCTAJ > (SELECT AVG(PUNCTAJ) WHERE CODS = S.CODS); Pentru fiecare linie a tabelei STUD valoarea de pe coloana CODS - codul specializării - 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ă. 46

EXEMPLU Numele, codul şi numărul total de studenţi pentru specializările la care este înmatriculat cel puţin un student de anul 1. : SELECT SP.NUME, ST.CODS, COUNT(*) ST, SPEC SP WHERE ST.CODS = SP.CODS GROUP BY SP.NUME, ST.CODS HAVING 1 <= (SELECT COUNT(*) WHERE CODS = ST.CODS AND AN = 1); 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 înconjurătoare. Î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 permişi de asemenea operatorii SOME/ANY şi ALL. 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. 49

EXEMPLU Lista specializărilor unde există cel puţin un student de anul 1: SELECT CODS, NUME FROM SPEC WHERE EXISTS (SELECT 1 WHERE SPEC.CODS = CODS AND AN = 1); 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 aceeaşi valoare pentru fiecare dintre liniile supuse sortării. 51

EXEMPLU Ordonarea se face după numărul de studenţi îndrumaţi de fiecare tutor: SELECT NUME, CODS, AN S WHERE CODS = 24 ORDER BY (SELECT COUNT(*) WHERE TUTOR = S.MATR) DESC; 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 aceeaşi valoare) sau corelată. 53

EXEMPLU SELECT NUME, (SELECT COUNT(*) WHERE TUTOR = S.MATR) NUMAR S WHERE CODS = 24 AND 1 <= (SELECT COUNT(*) WHERE TUTOR = S.MATR) ORDER BY (SELECT COUNT(*) WHERE TUTOR = S.MATR) DESC 54

UNION INTERSET si MINUS Sintaxa: Subcerere UNION INTERSECT MINUS Subcerere 55

REGULI Ambele cereri întorc acelaşi număr de coloane. Coloanele corespondente au valori de acelaşi 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 sfârşitul 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 aceeaşi cerere - operand al expresiei. 56

EXEMPLU SELECT NUME, CODS, LOC, PUNCTAJ WHERE CODS = 11 AND PUNCTAJ > 2000 UNION SELECT NUME, CODS, LOC, PUNCTAJ WHERE CODS = 21 AND LOC = 'BUCURESTI' UNION SELECT NUME, CODS, LOC, PUNCTAJ WHERE CODS = 24 AND PUNCTAJ >1500 INTERSECT SELECT NUME, CODS, LOC, PUNCTAJ WHERE PUNCTAJ >= 700 ORDER BY LOC DESC, 4; 57

Sfarsitul capitolului SUBCERERI 58