Sunteți pe pagina 1din 42

5.

SQL n acest capitol vor fi prezentate pe larg comanda de interogare a datelor SELECT, comenzile de manipulare a datelor INSERT, UPDATE, DELETE, precum i comanda TRUNCATE. 5.1. Comanda SELECT Interogarea datelor stocate n baza de date este considerat cea mai important facilitate a unui SGBD. n SQL ea se realizeaz prin intermediul comenzii SELECT. Comanda SELECT este folosit doar pentru interogarea datelor, ea neputndu-le modifica. Aa cum am vzut mai nainte, comanda SELECT implementeaz toi operatorii algebrei relaionale. O instruciune SELECT cuprinde n mod obligatoriu cuvntul cheie FROM. Cu alte cuvinte, sintaxa minimal pentru comanda SELECT este: SELECT atribute FROM obiect Dup cuvntul cheie SELECT se specific lista atributelor ce urmeaz a fi returnate ca rezultat al interogrii, iar dup cuvntul FROM se precizeaz obiectele (tabele, vederi, sinonime) din care se vor selecta aceste atribute. 5.1.1. Atributele comenzii SELECT In lista de atribute pot aprea: toate coloanele din tabel sau vedere (in ordinea n care au fost definite n comanda CREATE TABLE/CREATE VIEW) prin utilizarea semnului *: SQL> SELECT * FROM profesor;
COD --100 101 102 103 104 105 106 NUME --------GHEORGHIU MARIN GEORGESCU IONESCU ALBU VOINEA STANESCU PRENUME --------TEFAN VLAD CRISTIANA VERONICA GHEORGHE MIRCEA MARIA DATA_NAST --------ll-AUG-46 19-APR-45 30-OCT-51 15-NOV-65 05-DEC-69 GRAD ---PROF PROF CONF ASIST LECT ASIST ASIST EF --100 100 102 100 100 103 SALARIU PRIMA ------- ----3000 3500 2500 2800 200 1500 2200 2500 1200 150 1200 600 COD_CATEDRA ----------10 20 30 10 20 10 20

numele coloanelor separate prin virgul. Acestea vor aprea n rezultatul interogrii n ordinea n care sunt specificate:

SQL> SELECT nume, prenume, salariu FROM profesor; NUME --------GHEORGHIU MARIN GEORGESCU IONESCU PRENUME ------TEFAN VLAD CRISTIANA VERONICA SALARIU ------3000 2500 2800 1500

ALBU VOINEA STANESCU

GHEORGHE MIRCEA MRIA

2200 1200 1200

atribute rezultate din evaluarea unor expresii. Aceste expresii pot conine nume de coloane, constante, operatori sau funcii. 5.1.2. Operatori aritmetici

Operatorii aritmetici pot fi folosii pentru a crea expresii avnd tipul de date numeric sau date calendaristice. Operatorii aritmetici sunt + (adunare), - (scdere ), * (nmulire), / (mprire). Ordinea de preceden a operatorilor poate fi schimbat cu ajutorul parantezelor. De exemplu dac n tabela profesor ne intereseaz s calculm impozitul aferent salariilor, tiind c acesta este de 38%, putem scrie urmtoarea interogare: SQL> SELECT nume, salariu, salariu*0.38 FROM profesor; NUME SALARIU ---------GHEORGHIU 3000 MARIN 2500 GEORGESCU 2800 IONESCU 1500 ALBU 2200 VOINEA 1200 STANESCU 1200 SALARIU*0.38 -----------1140 950 1064 570 836 456 456

5.1.3. Aliasuri de coloane Pentru exemplul anterior observm c n momentul afirii rezultatelor, se mai utilizeaz numele coloanelor ca antet. Cnd acest lucru poate face dificil nelegerea rezultatelor, se poate schimba antetul prin atribuirea altor nume coloanelor (numite 'alias'-uri ale coloanei). Acest lucru se realizeaz specificnd alias-ul dup numele coloanei. In cazul n care alias-ul conine spaii sau caractere speciale cum ar fi + sau -, acesta se va specifica ntre ghilimele. In exemplul de mai jos alias-ul "DATA NATERE" conine spaii deci este specificat ntre ghilimele n timp ce alias-ul impozit nu conine spaii sau caractere speciale deci nu trebuie specificai obligatoriu intre ghilimele. SQL> SELECT nume, data_nast "DATA NATERE", salariu, salariu*0.38 impozit FROM profesor; NUME ---GHEORGHIU MARIN GEORGESCU IONESCU ALBU VOINEA DATA NATERE -----------ll-AUG-46 19-APR-45 30-OCT-51 15-NOV-65 SALARIU ------3000 2500 2800 1500 2200 1200 IMPOZIT ------1140 950 1064 570 836 456

STANESCU

05-DEC-69

1200

456

5.1.4. Operatorul de concatenare Operatorul de concatenare, notat | |, permite legarea coloanelor cu alte coloane, expresii aritmetice sau valori constante pentru a crea o expresie de tip ir de caractere. De exemplu, pentru a combina codul, numele si prenumele unui profesor, separate printr-un spaiu, se folosete urmtoarea interogare: SQL> SELECT cod || ' ' || nume || ' ' || prenume detalii FROM profesor; DETALII ------100 GHEORGHIU TEFAN 101 MARIN VLAD 102 GEORGESCU CRISTIANA 103 IONESCU VERONlCA 104 ALBU GHEORGHE 105 VOINEA MIRCEA 106 STANESCU MRIA 5.1.5. Convertirea valorilor Null cu ajutorul funciei NVL Dac la o nregistrare pentru o anumit coloan valoarea este necunoscut sau neaplicabil, atunci aceasta este Null. Aceast valoare nu trebuie confundat cu zero sau irul de caractere format dintr-un spaiu. Aa cum am vzut n exemplele de pn acum, dac o anumit valoare este Null, nu se va afia nimic. Pentru expresiile aritmetice, dac una dintre valorile componente este Null, atunci i rezultatul expresiei este Null. De exemplu, pentru a calcula salariul total, ce reprezint suma dintre coloanele salariu i prima putem folosi interogarea: SQL> SELECT nume, salariu, prima,salariu+prima "SALARIU TOTAL" FROM profesor; NUME ---GHEORGHIU MARIN GEORGESCU IONESCU ALBU VOINEA STANESCU SALARIU ------3000 2500 2800 1500 2200 1200 1200 PRIMA ----3500 200 2500 150 600 SALARIU TOTAL ------------6500 3000 4700 1350 1800

Observm ca pentru acele nregistrri care au avut valoarea Null n cmpul prima expresia ce calculeaz salariul total returneaz tot valoarea Null. Pentru a obine un rezultat diferit de Null, valorile Null trebuiesc convertite ntr-un numr (n cazul de fa 0) nainte de a aplica operatorul aritmetic. Aceast convertire se poate realiza prin intermediul funciei NVL. Funcia NVL are dou argumente. Dac valoarea primului argument nu este Null, atunci NVL ntoarce aceast valoare; altfel, ea intoarce valoarea celui de-al doilea argument. Cele dou argumente pot avea orice tip de date. Dac tipurile de date

ale celor dou argumente difer, Oracle ncerc s converteasc, al doilea argument la tipul de date al primului. De exemplu, pentru a putea calcula salariul total al tuturor cadrelor didactice, trebuie s convertim valoarea Null din coloana prima a tabelei professor n valoarea 0 folosind NVL (prima, 0): SQL> SELECT nume, salariu, prima, salariu+NVL(prima,0)"SALARIU TOTAL" FROM profesor; NUME ---GHEORGHIU MARIN GEORGESCU IONESCU ALBU VOINEA STANESCU SALARIU ------3000 2500 2800 1500 2200 1200 1200 PRIMA ----3500 200 2500 150 600 SALARIU TOTAL ------------6500 2500 3000 1500 4700 1350 1800

5.1.6. Prevenirea selectrii nregistrrilor duplicate O comand SELECT care nu cuprinde cuvntul cheie DISTINCT va afia toate nregistrrile care rezult din interogare, indiferent dac unele dintre ele sunt identice. De exemplu, interogarea de mai jos va returna urmtoarele rezultate: SQL> SELECT grad FROM profesor; GRAD ---PROF PROF CONF ASIST LECT ASIST ASIST In cazul folosirii cuvntului cheie DISTINCT nregisrarile duplicat sunt eliminate, afindu-se numai prima apariie a valorilor cmpurilor specificate n lista de atribute. De exemplu: SQL> SELECT DISTINCT grad FROM profesor; GRAD ---ASIST CONF LECT PROF

Dac lista de atribute conine mai multe coloane, operatorul DISTINCT va afecta toate coloanele selectate. Urmtorul exemplu va afia toate combinaiile de valori care sunt diferite pentru coloanele grad i cod_catedra. SQL> SELECT DISTINCT grad, cod_catedra FROM profesor; GRAD COD_CATEDRA ---- ----------ASIST 10 ASIST 20 CONF 30 LECT 20 PROF 10 PROF 20 5.1.7. Clauza ORDER BY In mod normal, n urma interogrii nregistrrile rezultate apar n aceeai ordine n care au fost introduse n baza de date. Pentru a modifica ordinea de afiare se utilizeaz clauza ORDER BY, care sorteaz nregistrrile dup valorile din una sau mai multe coloane. Aceast clauz este urmat de numele coloanelor dup care se va face sortarea. De asemenea, este posibil s se identifice coloana dintr-o clauz ORDER BY folosind n locul numelui coloanei un numr ordinal ce reprezint poziia coloanei n rezultat (de la stnga la dreapta). Aceast facilitate face posibil ordonarea rezultatului interogrii n funcie de un atribut al clauzei SELECT care poate fi o expresie complex, fr a mai rescrie acea expresie. Nu exist nici o limit a numrului de coloane n funcie de care se poate face sortarea. Nu este obligatoriu ca ordinea de sortare s se fac n funcie de o coloan care s fie afiat, dar n acest caz nu se mai poate folosi numrul de ordine al coloanei n loc de numele acesteia, nregistrrile vor fi sortate mai nti in funcie de primul cmp specificat dup clauza ORDER BY, apoi, nregistrile care au aceeai valoare n acest prim cmp sunt sortate n funcie de valoarea celui de-al doilea cmp specificat dup clauza ORDER BY, s.a.m.d. De exemplu, pentru a sorta ascendent nregistrarile n funcie de impozitul pe salariu folosim interogarea: SQL> SELECT nume, salariu*0.38 FROM profesor ORDER BY salariu*0.38; care este echivalent cu: SQL> SELECT nume, salariu*0.38 FROM profesor ORDER BY 2; NUME ---VOINEA STANESCU IONESCU ALBU SALARIU*0.38 ----------456 456 570 836

MARIN GEORGESCU GHEORGHIU

950 1064 1140

nregistrrile sunt sortate n mod implicit n ordine ascendent (opiunea ASC), afiarea n ordine descendent fcndu-se prin utilizarea opiunii DESC. Observai c n momentul sortrii valoarea Null este considerat cea mai mare, deci dac sortarea este ascendent este trecut pe ultima poziie si dac sortarea este descendent este trecut pe prima poziie. De exemplu: SQL> SELECT grad, prima FROM profesor ORDER BY grad, prima DESC; GRAD ---ASIST ASIST ASIST CONF LECT PROF PROF PRIMA ----600 150 200 2500 3500

Se observ c n exemplul de mai sus nregistrrile au fost mai nti sortate ascendent (specificaie implicit) n funcie de gradul didactic, nregistrrile cu acelai grad au fost apoi ordonate n funcie de cel de-al doilea criteriu de sortare, adic n funcie de prima primit cu specificaia explicit de sortare descendent. 5.1.8. Clauza WHERE Clauza WHERE se folosete pentru a regsi nregistrri ce corespund unei anumite condiii evaluat cu valoarea de adevr True, adic pentru a realiza anumite restricii de selecie. Astfel, clauza WHERE corespunde restriciilor operatorilor din algebra relaional. Cu alte cuvinte, dac o clauz ORDER BY este o clauz de sortare, clauza WHERE este o clauz de filtrare Dac nu se specifica o clauz WHERE, interogarea va ntoarce ca rezultat toate rndurile din tabel. Alturi de clauza FROM care este obligatorie, WHERE este cea mai folosit clauz a comenzii SELECT. Din punct de vedere sintactic, clauza WHERE este opional, dar atunci cnd este introdus urmeaz ntotdeauna imediat dup clauza FROM: SELECT atribute FROM obiect WHERE condiie Datorit existentei valorii Null, n SQL o condiie poate lua att valorile True i False ct i valoarea Necunoscut (despre acest lucru se va discuta mai n detaliu n seciunile urmtoare). O comand SELECT cu clauza WHERE va returna toate nregistrrile pentru care condiia are valoarea True. Condiia clauzei WHERE poate cuprinde numele unor coloane, constante, operatori de comparaie sau operatori logici (NOT, AND, OR). Operatorii de comparaie se pot mpri n dou categorii: operatori relaionali i operatori SQL. Toi aceti operatori sunt trecui n revist n continuare.

5.1.9. Operatori relaionali Operatorii relaionali sunt: = egal > mai mare >= mai mare sau egal <> i != diferit < mai mic <= mai mic sau egal

Cele dou valori care sunt comparate trebuie s aparin unor tipuri de date compatibile. De exemplu, pentru a selecta toate cadrele didactice care nu aparin catedrei cu codul 10 folosim urmtoarea interogare: SQL> SELECT nume, prenume FROM profesor WHERE cod_catedra <>10; NUME ---MARIN GEORGESCU ALBU STANESCU PRENUME ------VLAD CRISTIANA GHEORGHE MARIA

irurile de caractere i data calendaristic trebuiesc incluse ntre apostrofuri. De exemplu, pentru a selecta numai acele cadre didactice care au gradul didactic de profesor vom utiliza urmtoarea interogare: SQL> SELECT nume, prenume FROM profesor WHERE grad ='PROF'; NUME ---GHEORGHIU MARIN PRENUME ------TEFAN VLAD

In cazul irurilor de caractere, literele mici sunt diferite de literele mari. De exemplu, urmtoarea interogare nu va returna nici o nregistrare: SQL> SELECT nume, prenume FROM profesor WHERE grad='prof'; Toi operatorii de comparaie pot fi folosii att pentru valori numerice ct i pentru iruri de caractere sau date calendaristice. De exemplu, pentru a afla toate cadrele didactice care s-au nscut nainte de l Ianuarie 1960 folosim interogarea: SQL> SELECT nume,prenume, data_nast FROM profesor WHERE data_nast<'Ol-JAN-65';

NUME ---GHEORGHIU MARIN GEORGESCU

PRENUME ------TEFAN VLAD CRISTIANA

DATA_NAST --------ll-AUG-46 19-APR-45 30-OCT-51

In cazul irurilor de caractere ordonarea se face dup codul ASCII al acestora. De exemplu, pentru a afla toate cadrele didactice ale cror nume sunt n ordinea alfabetic dup litera 'M' se poate folosi interogarea. SQL> SELECT nume, prenume FROM profesor WHERE nume>='M'; NUME ---MARIN VOINEA STANESCU PRENUME ------VLAD MIRCEA MARIA

Trebuie remarcat c interogarea de mai sus este corect numai n cazul n care numele angajailor ncepe cu o liter mare, literele mici fiind n urma celor mari. Exist posibilitatea de a compara valoarea unei coloane cu valoarea altei coloane pentru aceeai nregistrare. De exemplu, dac dorim s selectm acele cadre didactice care au primit prim mai mare dect salariul de baz vom avea: SQL> SELECT nume, prenume, salariu, prima FROM profesor WHERE salariu<prima; NUME PRENUME SALARIU PRIMA -------------------GHEORGHIU TEFAN 3000 3500 ALBU GHEORGHE 2200 2500 5.1.10. Operatori SQL Exist patru tipuri de operatori SQL, care pot opera cu toate tipurile de date: 1. BETWEEN. . .AND. . . 2. IN 3. LIKE 4. IS NULL Operatorul BETWEEN...AND... Operatorul BETWEEN. . .AND. . . permite specificarea unui domeniu mrginit de dou valori ntre care trebuie s se afle valoarea testat. Domeniul de valori specificat este un interval nchis iar limita inferioar trebuie specificat prima. Astfel, dac dorim selectarea acelor cadre didactice care au salariul ntre 2000 i 3000 vom folosi comanda:

SQL> SELECT nume, prenume, salariu FROM profesor WHERE salariu BETWEEN 2000 AND 3000; NUME ---GHEORGHIU MARIN GEORGESCU ALBU PRENUME SALARIU ------------TEFAN 3000 VLAD 2500 CRISTIANA 2800 GHEORGHE 2200

Operatorul IN Operatorul IN permite specificarea unei liste ele valori, valoarea testat trebuind s se afle printre valorile acestei liste. De exemplu, dac dorim selectarea cadrelor didactice care au gradul de confereniar, lector sau asistent vom utiliza comanda: SQL> SELECT nume, prenume, grad FROM profesor WHERE grad IN (CONF, 'LECT', 'ASIST'); NUME ---GEORGESCU IONESCU ALBU VOINEA STANESCU PRENUME ------CRISTIANA VERONICA GHEORGHE MIRCEA MARIA GRAD ---CONF ASIST LECT ASIST ASIST

Operatorul LIKE Operatorul LIKE permite specificarea unui anumit model de ir de caractere cu care trebuie s se potriveasc valoarea testat. Acest operator se folosete n mod special atunci cnd nu se tie exact valoarea care trebuie cutat. Pentru a construi modelul dup care se face cutarea pot fi folosite dou simboluri: % semnific orice secven de zero sau mai multe caractere - semnific orice caracter (care apare o singur data) De exemplu, urmtoarea comand SELECT va re turna toate cadrele didactice al cror nume ncepe cu litera 'G': SQL> SELECT nume, prenume FROM profesor WHERE nume LIKE 'G%'; NUME ---GHEORGHIU TEFAN PRENUME ------GEORGESCU CRISTIANA

Dac dorim selectarea acelor cadre didactice al cror nume are litera 'O' pe a doua poziie, indiferent de lungimea cuvntului, vom avea: SQL> SELECT nume, prenume FROM profesor WHERE nume LIKE '_0%'; NUME ---IONESCU VOINEA PRENUME ------VERONICA MIRCEA

O problem intervine atunci cnd irul conine caracterele % sau _ (de exemplu irul 'J_James') deoarece aceste caractere au semnificaie predefmit. Pentru a schimba interpretarea acestor caractere se folosete opiunea ESCAPE. De exemplu, pentru a cuta toate titlurile de carte care ncep cu caracterele 'J_' se poate folosi interogarea: SQL> SELECT titlu FROM carte WHERE titlu LIKE 'J/__% ' ESCAPE '/'; In exemplul de mai sus opiunea ESCAPE identific caracterul '/' ca fiind caracterul "escape". Deoarece in modelul folosit pentru LIKE acest caracter precede caracterul '_' acesta din urm va fi interpretat ca o simpl liter, fr alt semnificaie. Avantajul unei viteze mari de regsire ca urmare a indexrii este pierdut n momentul n care se caut un ir de caractere care ncepe cu _ sau % ntr-o coloan indexat. Operatorul IS NULL Operatorul IS NULL testeaz dac o valoare este Null. Pentru a vedea utilitatea acestui operator s considerm urmtoarele interogri: SQL> SELECT nume, prenume FROM profesor WHERE prima = NULL; SQL> SELECT nume, prenume FROM profesor WHERE prima <> NULL; Amndou aceste interogri nu vor returna nici o nregistrare. Aceste lucru pare surprinztor la prima vedere deoarece ne-am fi ateptat ca prima interogare s returneze toate cadrele didactice care nu au primit prim, iar a doua toate cadrele didactice care au primit prim. In SQL ns, orice condiie care este format dintr-un operator de comparaie care are unul dintre termeni valoarea Null va avea ca rezultat valoarea Necunoscut, diferit de valoarea True (pentru care se face filtrarea). Pentru compararea cu Null se folosete operatorul special IS NULL. Deci pentru a afla cadrele didactice care nu au primit prim se folosete interogarea: SQL> SELECT nume, prenume FROM professor WHERE prima IS NULL;

NUME ---MARIN IONESCU

PRENUME ------VLAD VERONICA

La fel, pentru a afla cadrele didactice ale cror dat de natere nu se cunoate vom folosi urmtoarea interogare: SQL> SELECT nume, prenume FROM profesor WHERE data_nast IS NULL; NUME ---IONESCU VERONICA PRENUME ------ALBU GHEORGHE

5.1.11. Operatorii logici Negarea operatorilor n unele cazuri suni mai uor de cutat nregistrrile care nu ndeplinesc o anumit condiie. Acest lucru se poate realiza folosind operatorul NOT. Operatorul NOT se poate folosi pentru negarea unei expresii logice (de exemplu expresii de tipul NOT coloana = . . . ) sau pentru negarea operatorilor SQL n modul urmtor: NOT BETWEEN AND NOT IN NOT LIKE IS NOT NULL De exemplu, pentru a selecta cadrelor didactice al cror nume nu ncepe cu litera 'G' se folosete interogarea: SQL> SELECT nume, prenume FROM profesor WHERE nume NOT LIKE 'G%'; NUME ---MARIN IONESCU ALBU VOINEA STANESCU PRENUME ------VLAD VERONICA GHEORGHE MIRCEA MARIA

Pentru a selecta cadrele didactice care au primit prima se folosete interogarea: SQL> SELECT nume, prenume FROM profesor WHERE prima IS NOT NULL; NUME ---PRENUME -------

GHEORGHIU GEORGESCU ALBU VOINEA STANESCU

TEFAN CRISTIANA GHEORGHE MIRCEA MARIA

Not: Negarea unei expresii logice care are valoarea Necunoscut va avea tot valoare Necunoscut. De exemplu, o expresie de genul NOT coloana = NULL va avea valoarea Necunoscut, urmtoarea interogare nereturnnd deci nici o nregistrare: SQL> SELECT nume, prenume FROM profesor WHERE NOT prima = NULL; Condiii multiple de interogare (operatorii AND i OR) Operatorii AND i OR pot fi utilizai pentru a realiza interogri ce conin condiii multiple. Expresia ce conine operatorul AND este adevrat atunci cnd ambele condiii sunt adevrate iar expresia ce conine operatorul OR este adevrat atunci cnd cel puin una din condiii este adevrat. In aceeai expresie logic se pot combina operatorii AND i OR dar operatorul AND are o preceden mai mare dect operatorul OR, deci este evaluat mai nti. n momentul evalurii unei expresii, se calculeaz mai nti operatorii n ordinea precedenei, de la cel cu precedena cea mai mare pn la cel cu precedena cea mai mic. Dac operatorii au preceden egal atunci ei sunt calculai de la stnga la dreapta. Precedena operatorilor, pornind de la cea mai mare la cea mai mic este urmtoarea: toi operatorii de comparaie si operatorii SQL >, <, <=, >=, =, BETWEEN. . .AND. . ., IN, LIKE, IS NULL; operatorul NOT; operatorul AND; operatorul OR. Pentru a schimba prioritatea operatorilor se folosesc parantezele. In exemplele de mai jos se observ modul de evaluare a expresiei n funcie de precedena operatorilor, precum i modul n care parantezele pot schimba acest lucru. SQL> SELECT nume, prenume, salariu, cod_catedra FROM profesor WHERE salariu>2000 AND cod_catedra=10 OR cod_catedra=20; este echivalent cu: SQL> SELECT nume, prenume, salariu, cod_catedra FROM profesor WHERE (salariu>2000 AND cod_catedra=10) OR cod catedra=20; NUME PRENUME SALARIU COD-CATEDRA <>,

---GHEORGHIU MARIN ALBU STNESCU

------TEFAN VLAD GHEORGHE MARIA

------3000 2500 2200 1200

----------10 20 20 20

dar este diferita de: SQL> SELECT nume, prenume, salariu, cod_catedra FROM profesor WHERE salariu>2000 AND (cod_catedra=10 OR cod catedra=20); NUME ---GHEORGHIU MARIN ALBU PRENUME ------TEFAN VLAD GHEORGHE SALARIU ------3000 2500 2200 COD-CATEDRA ----------10 20 20

5.1.12. Funcii Funciile sunt o caracteristic important a SQL si sunt utilizate pentru a realiza calcule asupra datelor, a modifica date, a manipula grupuri de nregistrri, a schimba formatul datelor sau pentru a converti diferite tipuri de date. Funciile se clasific n dou tipuri: 1. Funcii referitoare la o singur nregistrare: funcii caracter; funcii numerice; funcii pentru data calendaristic si or; funcii de conversie; funcii diverse. 2. Funcii referitoare la mai multe nregistrri: funcii totalizatoare sau funcii de grup. Diferena dintre cele dou tipuri de funcii este numrul de nregistrri pe care acioneaz: Funciile referitoare la o singur nregistrare returneaz un singur rezultat pentru fiecare rnd al tabelului, pe cnd funciile referitoare la mai multe nregistrri returneaz un singur rezultat pentru fiecare grup de nregistrri din tabel. O observaie importanta este faptul c dac se apeleaz o funcie SQL ce are un argument egal cu valoarea Null, atunci n mod automat rezultatul va avea valoarea Null. Singurele funcii care nu respect aceast regul sunt: CONCAT, DECODE, DUMP, NVL i REPLACE. In continuare vom exemplifica i prezenta, la modul general, cele mai importante funcii. 5.1.13. Funcii referitoare la o singur nregistrare Sunt funcii utilizate pentru manipularea datelor individuale. Ele pot avea unul sau mai multe argumente i returneaz o valoare pentru fiecare rnd rezultat n urma interogrii. Funcii caracter Aceste funcii au ca argumente date de tip caracter i returneaz date de tip VARCHAR2, CHAR sau NUMBER.

Cele mai importante funcii caracter sunt: CONCAT- returneaz un ir de caractere format prin concatenarea a dou iruri; LOWER - modific toate caracterele n litere mici; UPPER - modific toate caracterele n litere mari; LENGTH - returneaz numrul de caractere dintr-un anumit cmp; REPLACE - caut intr-un ir de caractere un subir iar dac l gsete l va nlocui cu un alt ir de caractere; SUBSTR - returneaz un subir de caractere avnd o anumit lungime ncepnd cu o anumit poziie; TRANSLATE - caut ntr-un prim ir de caractere fiecare dintre caracterele specificate ntr-un al 2-lea ir, caracterele gsite fiind nlocuite de cele specificate ntr-un al 3-lea ir. Exemplu de utilizare a funciei LENGTH: SQL> SELECT LENGTH (nume) FROM profesor; LENGTH(NUME) -----------9 5 9 7 4 6 8 Spre deosebire de alte funcii, funciile caracter pot fi imbricate pn la orice adncime. Dac funciile sunt imbricate ele sunt evaluate din interior spre exterior. Pentru a determina, de exemplu, de cte ori apare caracterul 'A' n cmpul nume vom folosi interogarea: SQL> SELECT nume, LENGTH (nume)-LENGTH (TRANSLATE (nume,'DA','D')) FROM profesor; NUME ---GHEORGHIU MARIN GEORGESCU IONESCU ALBU VOINEA STANESCU 'A' --0 1 0 0 1 1 1

Not: n exemplul de mai sus, funcia TRANSLATE (nume, 'DA', 'D') va cuta n coloana nume primul caracter (caracterul 'D') din cel de-al doilea argument al funciei (irul de caractere 'DA') i l va nlocui cu primul caracter (adic tot cu caracterul 'D') din cel de-al treilea argument al funciei (irul de caractere 'D'), apoi va cuta cel de-al doilea caracter, adic caracterul 'A', i l va terge din cmpul nume deoarece acesta nu are caracter

corespondent n cel de-al treilea argument al funciei. Am folosit acest artificiu deoarece irul de caractere vid este echivalent cu valoarea Null, deci funcia TRANSLATE (nume, 'A', ' ') ar fi nlocuit toate valorile cmpului nume cu valoarea Null. Funcii numerice sau aritmetice Aceste funcii au ca argumente date numerice i returneaz tot valori numerice. Marea majoritate a acestor funcii au o precizie de 38 de zecimale (COS, EXP, LN, LOG, SIN SQRT, TAN au ns o precizie de 36 de zecimale). Dintre cele mai importante funcii amintim: ROUND - rotunjete valorile la un anumit numr de poziii zecimale; TRUNC - trunchiaz valorile la un anumit numr de poziii zecimale; CEIL - returneaz cel mai mic ntreg mai mare sau egal cu o anumit valoare; FLOOR - returneaz cel mai mare ntreg mai mic sau egal cu o anumit valoare; SIGN - returneaz valoarea -l dac valoarea argumentului primit este mai mic dect 0, returneaza valoarea l dac valoarea argumentului primit este mai mare dect 0 i 0 dac valoarea argumentului primit este egal cu 0; SQRT - returneaz rdcina ptrat a argumentului primit; ABS - returneaz valoarea absolut a argumentului primit; POWER - returneaz valoarea unui numr ridicat la o anumit putere; MOD - returneaz restul mpririi a dou numere; - alte funcii matematice cum ar fi: LOG, SIN, TAN, COS, EXP, LN. Funcii pentru dat calendaristic i or In Oracle datele de tip dat calendaristic sunt reprezentate sub un format numeric reprezentnd: ziua, luna, anul, ora, minutul, secunda i secolul. Oracle poate manevra date calendaristice de la l ianuarie 4712 . Cr pn la 31 decembrie 4712 d. Cr. Modul implicit de afiare i introducere este sub forma: DD-MON-W (ex. '31-Dec-99'). Aceasta categorie de funcii opereaz pe valori de tip dat calendaristic, rezultatul returat fiind tot de tip data calendaristic, excepie fcnd funcia MONTHS BETWEEN care retureaz o valoare numeric. Cele mai des ntlnite funcii sunt: ADD_MONTH - returneaz o dat calendaristic format prin adugarea la data calendaristic specificat a unui anumit numr de luni; LAST_DAY - ntoarce ca rezultat ultima zi a unei luni specificate; MONTHS_ BETWEEN returneaz numrul de luni dintre dou date calendaristice specificate; NEXT_DAY - returneaz prima data calendaristic ulterioar datei calendaristice specificate; SYSDATE - ntoarce ca rezultat data calendaristic a sistemului. Asupra datelor calendaristice se pot realiza operaii aritmetice, cum ar fi scderea sau adunarea, modul lor de funcionare fiind ilustrat n tabelul de mai jos: Tip Operaie Tip operand Tip Descriere operand rezultat data +/numr data Adaug/scade un numr de zile la o dat calendaristic data +/numr/24 data Adaug/scade un numr de ore la o dat calendaristic

data data

+/+/-

numr/ 1440 numr/86400

data data

Adaug/scade un numr de minute la o dat calendaristic Adaug/scade un numr de secunde la o data calendaristic Descriere

Tip Operaie Tip operand Tip operand rezultat data _ data

Scade dou date calendaristice rezultnd diferena n numr de zile. Dac al doilea numr operand este mai mare dect primul zile numrul de zile rezultat este reprezentat de o valoare negativ

De asemenea, mai exist funciile ROUND i TRUNC care rotunjesc, respectiv trunchiaz data calendaristic. Aceste funcii sunt foarte folositoare atunci cnd se dorete compararea datelor calendaristice care au ora diferit. Exemplul urmtor rotunjete data de natere a cadrelor didactice n funcie de an: SQL> SELECT ROUND(data nast,'YEAR') 'DATA' FROM profesor; DATA ---0l-JAN-47 0l-JAN-45 01-JAN 52 0l-JAN-66 0l-JAN-70 Funcii de conversie In general expresiile nu pot conine valori aparinnd unor tipuri de date diferite. De exemplu, nu se poate nmuli 3 cu 7 i apoi aduna "ION". Prin urmare se realizeaz anumite conversii, care pot fi implicite sau explicite. Conversiile implicite se realizeaz n urmtoarele cazuri: atribuiri de valori unei coloane (folosind comenzile INSERT sau UPDATE) sau atribuirilor de valori unor argumente ale unei funcii; evaluri de expresii. Pentru atribuiri, programul Oracle efectueaz n mod implicit urmtoarele conversii de tip: VARCHAR2 sau CHAR la NUMBER VARCHAR2 sau CHAR la DATE VARCHAR2 sau CHAR la ROWI D NUMBER, DATE sau ROWI D la VARCHAR2 Conversia la atribuire reuete in cazul n care Oracle poate converti tipul valorii atribuite la tipul destinaiei atribuirii. Pentru evaluarea expresiilor, se realizeaz n mod implicit urmtoarele conversii de tip: VARCHAR2 sau CHAR la NUMBER VARCHAR2 sau CHAR la DATE

VARCHAR2 sau CHAR la ROWI D De exemplu, pentru urmtoarea interogare se realizeaz conversia n mod implicit a constantei de tip CHAR, '10', la tipul NUMBER. SQL> SELECT salariu + '10' FROM profesor; SALARIU+'10' -----------3010 2510 2810 1510 2210 1210 1210 Pentru conversiile explicite de tip, SQL pune la dispoziie mai multe funcii de conversie, de la un anumit tip de dat la altul, dup cum este artat n tabelul de mai jos.
Tip convertit Tip iniial
CHAR

CHAR

NUMBER TO_NUMBER

DATE TO_DATE TO_DATE(nr,J)

RAW HEXTORAW

ROWID CHARTOROWID

NUMBER DATE RAW RAWID

TO_CHAR TO_CHAR RAWTOHEX RAWIDTOCHAR

TO_DATE(dat,J) -

Cele mai uzuale funcii sunt: TO_ CHAR - convertete un numr sau o dat calendaristic ntr-un ir de caractere; T0_ NUMBER - convertete un ir de caractere alctuit din cifre ntr-o valoare numeric; T0_ DATE - convertete un ir de caractere sau un numr ce reprezint o dat calendaristic la o valoare de tip dat calendaristic. De asemenea poate converti o dat calendaristic la un numr ce reprezint data calendaristic Iulian. Pentru a realiza conversia, aceste funcii folosesc anumite mti de format. Urmtorul exemplu va prelua data i ora curent a sistemului din funcia SYSDATE i o va formata ntr-o dat scris pe litere ce va conine i ora n minute i secunde: SQL> SELECT TO_CHAR(SYSDATE,'DD MONTH YYYY HH24:MI:SS') data FROM dual; DATA ---------------------------17 MAY 2000 17:03:38 Funcii diverse Acestea sunt n general funcii care accept ca argumente orice tip de dat. Cele mai utilizate sunt: DECODE - Aceasta este una dintre cele mai puternice funcii SQL. Practic, aceasta faciliteaz interogrile condiionate, acionnd ca o comand 'if-then-else1 sau 'case' dintr-

un limbaj procedural. Pentru fiecare nregistrare se va evalua valoarea din coloana testat i se va compara pe rnd cu fiecare valoare declarat n cadrul funciei. Dac se gsesc valori egale, atunci funcia va returna o valoare aferent acestei egaliti, declarat tot n cadrul funciei. Se poate specifica ca, n cazul n care nu se gsesc valori egale, funcia s ntoarc o anumit valoare. Dac acest lucru nu se specific funcia va ntoarce valoarea Null. GREATEST - returneaz cea mai mare valoare dintr-o list de valori; LEAST -returneaz cea mai mic valoare dintr-o list de valori; VSIZE - returneaz numrul de bytes pe care este reprezentat intern o anumit coloan; USER - returneaz numele utilizatorului curent al bazei de date; DUMP - returneaz o valoare ce conine codul tipului de dat, lungimea n bytes, precum si reprezentarea intern a unei expresii. Exemplul urmtor utilizeaz funcia DECODE pentru a returna o cretere a salariului cadrelor didactice cu grad de profesor, confereniar i lector, restul salariilor rmnnd nemodificate: SQL> SELECT nume, grad, salariu, DECODE(grad,'PROF',salariu*1.2,CONF,salariu*1.15, 'LECT', salariu*1.1, salariu) "Salariu modificat" FROM profesor; NUME ---GHEORGHIU MARIN GEORGESCU IONESCU ALBU VOINEA STANESCU GRAD SALARIU ---- ------PROF 3000 PROF 2500 CONF 2800 ASIST 3500 LECT 2200 ASIST 1200 ASIST 1200 Salariu modificat -----------------3600 3000 3220 1500 2420 1200 1200

5.1.14. Functii referitoare la mai multe nregistrari Aceste funii se mai numesc si funcii totalizatoare sau funcii de grup. Spre deosebire de funciile referitoare la o singur nregistrare, funciile de grup opereaz pe un set ele mai multe nregistrri i returneaz un singur rezultat pentru fiecare grup. Dac nu este utilizat clauza GROUP BY, ce grupeaz nregistrrile dup un anumit criteriu, tabela este considerat ca un singur grup si se va returna un singur rezultat. COUNT - determin numrul de nregistrri care ndeplinesc o anumit condiie; MAX - determin cea mai mare valoare dintr-o coloan; MIN - determin cea mai mic valoare dintr-o coloan; SUM - returneaz suma tuturor valorilor dintr-o coloan; AVG - calculeaz valoarea medie a unei coloane; STDDEV - determin abaterea sau deviaia standard a unei coloane numerice; VARIANCE - returneaz dispersia, adic ptratul unei deviaii standard pentru o coloan numeric. De exemplu: SQL> SELECT MIN(salariu.),MAX(salariu),AVG(salariu),COUNT(*) FROM profesor;

MIN(SALARIU) -----------1200

MAX(SALARIU) -----------3000

AVG(SALARIU) -----------2057.1429

COUNT(*) -------7

Toate funciile de mai sus, cu excepia funciei COUNT, opereaz asupra unei coloane sau unei expresii, care este specificat ca parametri al funciei. In cazul funciei COUNT, argumentul acesteia nu conteaz, de obicei utilizndu-se ca argument simbolul *. Not: Toate funciile de mai sus ignor valorile Null, excepie fcnd funcia COUNT. Pentru a include n calcule i nregistrrile cu valoarea Null se poate folosi funcia NVL. Dac nu este utilizat clauza GROUP BY, n lista de atribute ale comenzii SELECT nu pot apare funcii de grup alturi de nume de coloane sau alte expresii care iau valori pentru fiecare nregistrare n parte. De exemplu, urmtoarea interogare va genera o eroare: SQL> SELECT nume, KIN(salariu) FROM profesor; ERROR at line 1: ORA-00937: not a single-group group function 5.1.15 Pseudo-coloana ROWNUM ROWNUM este o pseudo-coloan care numeroteaz rndurile selectate de o interogare. Astfel, pentru primul rnd selectat pseudo-coloana ROWNUM are valoarea l, pentru al doilea rnd are valoarea 2, s.a.m.d. De exemplu, pentru a limita rndurile selectate de o interogare la maxim 5, se folosete urmtoarea comand: SELECT* FROM profesor WHERE ROWNUM<6; Deoarece pscudo-coloana ROWNUM numeroteaz rndurile selectate, valorile sale vor trebui s nceap tot timpul cu 1. Deci dac n exemplul de mai sus condiia ar fi ROWNUM > 6 sau ROWNUM = 6 interogarea nu ar selecta nici un rnd deoarece n acest caz condiia ar fi ntotdeauna fals. Pentru primul rnd accesat de interogare ROWNOM va avea valoarea l, condiia nu este ndeplinit i deci rndul nu va fi selectat. Pentru al doilea rnd accesat de interogare ROWNUM va avea din nou valoarea l, condiia nu este ndeplinit nici n acest caz i deci nici acest rnd nu va fi selectat, .a.m.d. Prin urmare nici unul din rndurile accesate nu vor satisface condiia coninut de interogare. Pseudo-coloana ROWNUM se poate folosi att n condiia unor comenzi UPDATE sau DELETE ct i pentru a atribui valori unice unei coloane, ca n exemplul de mai jos: UPDATE vnzri SET cod = ROWNUM; Valoarea pseudo-coloanei ROWNUM este atribuit unui rnd nainte ca acesta s fie sortat datorit unei clauze ORDER BY, de aceea valorile pseudo-coloanei nu reprezint ordinea de sortare. De exemplu: SQL> SELECT nume, prenume, FROM profesor ORDER BY salariu; ROWNUM

NUME ---VOINEA STANESCU IONESCU ALBU MARIN GEORGESCU GHEORGHIU

PRENUME ROWNUM -----------MIRCEA 6 MARIA 7 VERONICA 4 GHEORGHE 5 VLAD 2 CRISTIANA 3 TEFAN 1

5.1.16. Clauza GROUP BY Clauza GROUP BY este utilizat pentru a mpri din punct de vedere logic un tabel n grupuri de nregistrri. Fiecare grup este format din toate nregistrrile care au aceeai valoare n cmpul sau grupul de cmpuri specificate n clauza GROUP BY. Unele nregistrri pot fi excluse folosind clauza WHERE nainte ca tabelul s fie mprit n grupuri. Clauza GROUP BY se folosete de obicei mpreun cu funciile de grup, acestea returnnd valoarea calculat pentru fiecare grup n parte. In cazul folosirii clauzei GROUP BY, toate expresiile care apar n lista atributelor comenzii SELECT trebuie s aib o valoare unic pentru fiecare grup, de aceea orice coloan sau expresie din aceast list care nu este o funcie de grup trebuie s apar n clauza GROUP BY. SQL> SELECT grad, AVG (salariu) FROM profesor GROUP BY grad; GRAD ---ASIST CONF LECT PROF AVG(SALARIU) ----------1300 2800 2200 2750

SQL> SELECT grad, MAX(salariu) FROM profesor WHERE prima IS NOT NULL GROUP BY grad; GRAD ---ASIST CONF LECT PROF MAX(SALARIU) -----------1200 2800 2200 3000

Urmtoarea interogare va genera o eroare deoarece n lista atributelor comenzii SELECT exist o coloan (nume) care nu apare n clauza GROUP BY: SQL >SFLECT nume, MIN (salariu) FROM profesor GROUP BY grad;

ERROR at line 1: ORA-00979: not a GROUP BY expression Comanda de mai sus este invalid deoarece coloana nume are valori individuale pentru fiecare nregistrare, n timp ce MIN (salariu) are o singuri valoare pentru un grup. Clauza GROUP BY permite apelarea unei funcii de grup n alt funcie de grup. In exemplul urmtor, funcia AVG retumeaz salariul mediu pentru fiecare grad didactic, iar funcia MAX remrneaz maximul dintre aceste salarii medii. SQL> SELECT MAX(AVG(salariu)) FROM profesor GROUP BY grad; 5.1.17. Clauza HAVING Clauza HAVING este tot o clauz de filtrare ca i clauza WHERE. Totui, n timp ce clauza WHERE determin ce nregistrri vor fi selecionate dintr-un tabel, clauza HAVING determin care dintre grupurile rezultate vor fi afiate dup ce nregistrrile din tabel au fost grupate cu clauza GROUP BY. Cu alte cuvinte, pentru a exclude grupuri de nregistrri se folosete clauza HAVING iar pentru a exclude nregistrri individuale se folosete clauza WHERE. Clauza HAVING este folosit numai dac este folosit i clauza GROUP BY. Expresiile folosite ntr-o clauz HAVING trebuie s aib o singur valoare pe grup. Atunci cnd se folosete clauza GROUP BY, clauza WHERE se utilizeaz pentru eliminarea nregistrrilor ce nu se doresc a fi grupate. Astfel, urmtoarea interogare este invalid deoarece clauza WHERE ncearc s exclud giupuri de nregistrri i nu anumite nregistrri: SQL> SELECT grad, AVG(salariu) FROM profesor WHERE AVG(salariu)>2000 GROUP BY grad; ERROR: ORA-00934: group function is not allowed here Pentru a exclude gradul didactic pentru care media de salariu nu este mai mare dect 2000 se folosete urmtoarea comand SELECT cu clauza HAVING: SQL> SELECT grad, AVG(salariu) FROM profesor GROUP BY grad HAVING AVG(salariu)>2000; GRAD ---CONF LECT PROF AVG(SALARIU) -----------2800 2200 2750

Urmtoarea interogare exclude nti cadrele didactice care nu au salariu mai mare dect 2500 dup care exclude gradul didactic pentru care media de salariu nu este mai mare dect 2800.

SQL> SELECT grad, AVG(salariu) FROM profesor WHERE salariu > 2500 GROUP BY grad HAVING AVG(salariu) > 2800; GRAD ---PROF AVG(SALARIU) ----------3000 5.1.18. Regasirea datelor din doua sau mai multe tabele O jonciune este o interogare care regsete nregistrri din dou sau mai multe tabele. Capacitatea de a realiza o jonciune intre dou sau mai multe tabele reprezint una dintre cele mai puternice faciliti ale unui sistem relaional. Legtura dintre nregistrrile tabelelor se realizeaz prin existena unor cmpuri comune caracterizate prin domenii de definiie compatibile (chei primare sau strine). Pentru realizarea unei jonciuni se folosete comanda SELECT, preciznd n clauza FROM numele tabelelor utilizate, iar n clauza WHERE criteriul de compunere. Produsul a dou sau mai multe tabele. In cazul n care n interogare se specific mai multe tabele i nu este inclus o clauz WHERE, interogarea va genera produsul cartezian al tabelelor. Acesta va conine toate combinaiile posibile de nregistrri din tabelele componente. Astfel, produsul cartezian a dou tabele care conin 100, respectiv 50 de nregistrri va avea dimensiunea de 5.000 de nregistrri. De exemplu, s considerm tabela CATEDRA cu urmtoarele 4 nregistrri: COD_CATEDRA ----------10 20 30 40 NUME ---------INFORMATICA ELECTRONICA AUTOMATICA FINANE PROFIL -----TEHNIC TEHNIC TEHNIC ECONOMIC

Atunci urmtoarea interogare va genera produsul cartezian al tabelelor, adic va avea ca rezultat 7 x 4 = 28 de rnduri ce vor conine toate combinaiile posibile de nregistrri din cele dou tabele: SOL> SELECT * FROM profesor, catedra; Dac n lista de atribute ale comenzii SELECT sunt specificate coloanele selectate, atunci numele acestora trebuie s fie unice n cadrul tuturor tabelelor. Dac exist un nume de coloan care apare n mai mult de un tabel, atunci, pentru evitarea ambiguitii, trebuie specificat i tabelul din care face parte coloana n cauz. De exemplu, n urmtoarea interogare pentru coloanele cod_catedra i nume trebuie specificate tabelele din care fac parte:

SQL> SELECT profesor.nume, prenume, catedra.cod_catedra, catedra.nume FROM profesor, catedra; NUME ---GHEORGHIU MARIN GEORGESCU IONESCU ALBU VOINEA STANESCU GHEORGHIU MARIN GEORGESCU IONESCU ALBU VOINEA STANESCU GHEORGHIU MARIN GEORGESCU IONESCU ALBU VOINEA STANESCU GHEORGHIU MARIN GEORGESCU IONESCU ALBU VOINEA STANESCU PRENUME ------TEFAN VLAD CRISTIANA VERONICA GHEORGHE MIRCEA MARIA TEFAN VLAD CRISTIANA VERONICA GHEORGHE MIRCEA MARIA TEFAN VLAD CRISTIANA VERONICA GHEORGHE MIRCEA MARIA TEFAN VLAD CRISTIANA VERONICA GHEORGHE MIRCEA MARIA COD CATEDRA ----------10 10 10 10 10 10 10 20 20 20 20 20 20 20 30 30 30 30 30 30 30 40 40 40 40 40 40 40 NUME ---INFORMATICA INFORMATICA INFORMATICA INFORMATICA INFORMATICA INFORMATICA INFORMATICA ELECTRONICA ELECTRONICA ELECTRONICA ELECTRONICA ELECTRONICA ELECTRONICA ELECTRONICA AUTOMATICA AUTOMATICA AUTOMATICA AUTOMATICA AUTOMATICA AUTOMATICA AUTOMATICA FINANE FINANE FINANE FINANE FINANE FINANE FINANE

In general, pentru a scurta textul comenzii, n astfel de cazuri se folosesc de obicei alias-uri pentru numele tabelelor, care pot fi folosite n interogare. Astfel interogarea de mai sus se mai poate scrie: SQL> SELECT p.nume, prenume, c.cod_catedra, c.nume FROM profesor p,catedra c; In general, produsul cartezian este rar folosit, avnd o utilitate practic redus. Jonciuni Pentru a realiza o jonciune ntre doua sau mai multe tabele se utilizeaz clauza WHERE a interogrilor pe aceste tabele, n funcie de criteriul de compunere, se disting mai multe tipuri de jonciuni:

jonciuni echivalente (EQUI-JOIN) sau jonciuni interne (INNER JOIN) 2. jonciuni neechivalente 3. jonciuni externe (OUTER JOIN) 4. autojonciuni
1.

1. Jonciunile echivalente O echijonciune conine operatorul egalitate (=) n clauza WHERE, combinnd nregistrrile din tabele care au valori egale pentru coloanele specificate. De exemplu, pentru a afia cadrele didactice i numele catedrei din care acestea fac parte se combin nregistrrile din cele dou tabele pentru care codul catedrei este acelai. SQL> SELECT p.nume, p.prenume, c.nume NUME CATEDRA FROM profesor p, catedra c WHERE p.cod catedra=c.cod catedra; NUME ---GHEORGHIU IONESCU VOINEA MARIN ALBU VLAD GHEORGHE PRENUME ------TEFAN VERONICA MIRCEA STANESCU GEORGESCU MARIA CRISTIANA NUME CATEDRA -----------INFORMATICA INFORMATICA INFORMATICA ELECTRONICA ELECTRONICA ELECTRONICA AUTOMATICA

2. Jonciuni neechivalente Jonciunile neechivalente sunt acelea care nu folosesc n clauza WHERE operatorul egal. Operatorii cei mai utilizai n cazul jonciunilor neechivalente sunt: <, >, <=, >=, <>, BETWEEN...AND.... Pentru a exemplifica un astfel de tip de jonciune considerm tabela gradsal ce conine pragul minim i pragul maxim al salariului dintr-un anumit grad de salarizare: GRAD SALARIZARE --------------1 2 3 4 5 PRAG MIN -------500 1501 2001 2501 3501 PRAG MAX -------1500 2000 2500 3500 10000

Evident, ntre tabelele profesor si gradsal nu are sens definirea unei jonciuni echivalente deoarece nu exist o coloan din tabela profesor creia s-i corespund o coloan din tabela gradsal. Exemplul urmtor ilustreaz definirea unei jonciuni neechivalente care evalueaz gradul de salarizare a cadrelor didactice, prin ncadrarea salariului acestora ntr-un interval stabilit de pragul minim si pragul maxim: SQL> SELECT p.nume, p.grad, p.salariu, g.grad_salarizare FROM profesor p, gradsal g WHERE p.salariu BETWEEN g.prag_min AND g.prag_max;

NUME ---IONESCU VOINEA STANESCU MARIN ALBU GHEORGHIU GEORGESCU

GRAD ---ASIST ASIST ASIST PROF LECT PROF CONF

SALARIU ------1500 1200 1200 2500 2200 3000 2800

GRAD SALARIZARE --------------1 1 1 3 3 4 4

3. Jonciuni externe Dac ntr-o jonciune de tipul celor prezentate pn acum una sau mai multe nregistrri nu satisfac condiia de compunere specificat n clauza WHERE, atunci ele nu vor aprea n rezultatul interogrii. Aceste nregistrri pot apare ns dac se folosete jonciunea extern. Jonciunea extern returneaz toate nregistrrile care satisfac condiia de jonciune plus acele nregistrri dintr-un tabel ale cror valori din coloanele dup care se face legtura nu se regsesc n coloanele corespunztoare ale nici unei nregistrri din celalalt tabel. Pentru a realiza o jonciune extern ntre tabelele A i B ce returneaz toate nregistrrile din tabela A se utilizeaz seninul ( + ) n dreapta tabelului B. Pentru fiecare nregistrare din tabela A care nu satisface condiia de compunere pentru nici o nregistrare din tabela B, se va crea n tabela B o nregistrare nul care va fi compus cu nregistrarea din tabela A. Invers, pentru a realiza o jonciune extern ntre tabelele A i B ce returneaz toate nregistrrile din tabela B, se utilizeaz semnul ( + ) in dreapta tabelului A. In interogarea utilizat pentru a exemplifica jonciunea echivalent, se observ c au fost selectate numai catedrele n care exist cadre didactice. Pentru a afia toate catedrele, indiferent dac ele cuprind sau nu cadre didactice, se folosete urmtoarea interogare: SQL> SELECT p.nume, p.prenume, c.nume FROM profesor p, catedra c WHERE p.cod catedra (+) =c. cod c atedra; NUME ---GHEORGIU IONESCU VOINEA MARIN STANESCU ALBU GEORGESCU PRENUME ------TEFAN VERONICA MIRCEA VLAD MARIA GHEORGHE CRISTIANA NUME ---INFORMATICA INFORMATICA INFORMATICA ELECTRONICA ELECTRONICA ELECTRONICA AUTOMATICA FINANE

Se observ c ultima nregistrare (ce corespunde catedrei de finane care nu are n componen nici un cadru didactic) va avea coloanele corespunztoare primului tabel completate cu Null. Folosirea operatorului de jonciune extern are urmtoarele restricii:

1.

2. 3. 4. 5.

Operatorul ( + ) poate fi plasat n oricare parte a condiiei din clauza WHERE, ns nu n ambele pri. Tabelul de partea cruia este amplasat acest operator va crea nregistrri nule care vor fi compuse cu nregistrrile din cellalt tabel care nu satisfac condiia de compunere. Dac tabelele A i B au condiii multiple de jonciune, atunci operatorul (+) trebuie utilizat n toate aceste condiii. Intr-o singur interogare nu se poate realiza o jonciune extern a unui tabel cu mai multe tabele. O condiie care conine operatorul (+) nu poate fi combinat cu o alt condiie ce utilizeaz operatorul IN. O condiie care conine operatorul ( + ) nu poate fi combinat cu o alt condiie prin operatorul OR.

5. Auto-jonciuni Auto-jonciunea reprezint jonciunea unui tabel cu el nsui. Pentru ca rndurile dintr-un tabel s poat fi compuse cu rnduri din acelai tabel, n clauza FROM a interogrii numele tabelului va apare de mai multe ori, urmat de fiecare dat de un alias. De exemplu, pentru a selecta toate cadrele didactice care au un ef direct i numele acestui ef se folosete urmtoarea auto-jonciune: SQL> SELECT p.nume, p.prenume, s.nume, s.prenume FROM profesor p, profesor s WHERE p.sef=s.cod; NUME ---MARIN GEORGESCU ALBU VOINEA IONESCU STANESCU PRENUME ------VLAD CRISTIANA GHEORGHE MIRCEA VERONICA MARIA NUME --------GHEORGHIU GHEORGHIU GHEORGHIU GHEORGHIU GEORGESCU IONESCU PRENUME ------STEFAN STEFAN STEFAN STEFAN CRISTIANA VERONICA

Autojonciunea poate fi folosit i pentru verificarea corectitudinii interne a datelor. De exemplu, este puin probabil s existe dou cadre didactice care au cod diferit dar n schimb au acelai nume, prenume i dat de natere. Pentru a verifica dac exist astfel de nregistrri se folosete interogarea: SQL> SELECT a.nume, a.prenume FROM profesor a, profesor b WHERE a.nume=b.nume AND a.prenume=b.prenume AND a.datanast= b.data-nast AND a.cod<>b.cod 5.1.19. Operatorii pentru mulimi Operatorii de m u l im i combin dou sau mai multe interogri, efectund operaii specifice m u lim ilo r: re u n iu n e , in terse cie , d ife ren . Aceti operatori se mai numesc i operatori verticali deoarece c o m b in a r e a celor dou interogri se facecoloan cu coloan. Din acest

motiv, numrul total de coloane i tipurile de date ale coloanelor coresondente din cele dou interogri trebuie s coincid: Exist urmtorii operatori pentru mulimi : 1. UNION Returneaz rezultatele a dou sau mai multe interogri eliminnd toate nregistrrile duplicat; 2. UNION ALL - Returneaz rezultatele a dou sau mai multe interogri incluznd nregistrrile duplicat; 3. INTERSECT - Returneaz toate nregistrrile distincte gsite n ambele interogri; 4. MINUS - Returneaz toate nregistrrile distincte care se gsesc n prima interogare dar nu n a doua interogare. S considerm de exemplu urmtoarele interogri: SQL> SELECT grad, salariu FROM profesor WHERE cod catedra = 10; GRAD ---PROF ASIST ASIST SALARIU ------3000 1500 1200

SQL> SELECT grad, salariu FROM profesor WHERE cod catedra = 20; GRAD ---PROF LECT ASIST SALARIU ------2500 2200 1200

In continuare exemplificm fiecare dintre operatorii pentru mulimi aplicai acestor interogri: SQL> SELECT grad, salariu FROM profesor WHERE cod_catedra = 10 UNION SELECT grad, salariu FROM profesor WHERE cod_catedra = 20 ORDER BY salariu; GRAD ---ASIST ASIST LECT PROF SALARIU ------1200 1500 2200 2500

PROF

3000

SQL> SELECT grad, salariu FROM profesor WHERE cod_ catedra = 10 UNION ALL SELECT grad, salariu FROM profesor WHERE cod_catedra = 20; GRAD ---PROF ASIST ASIST PROF LECT ASIST SALARIU ------3000 1500 1200 2500 2200 1200

SQL> SELECT grad, salariu FROM profesor WHERE cod_catedra = 10 INTERSECT SELECT grad, salariu FROM profesor WHERE cod_catedra = 20; GRAD ---ASIST SALARIU ------1200

SQL> SELECT grad, salariu FROM profesor WHERE cod catedra = 10 MINUS SELECT grad, salariu FROM profesor WHERE cod catedra = 20; GRAD ---ASIST PROF SALARIU ------1500 3000

Exist urmtoarele reguli de folosire a operatorilor pentru mulimi: interogrile trebuie s conin acelai numr de coloane; coloanele corespondente trebuie s aib acelai tip de dat; n rezultat vor aprea numele coloanelor din prima interogare, nu cele din a doua interogare chiar dac aceasta folosete alias-uri, de exemplu: SQL> SELECT cod

FROM profesor MINUS SELECT ef FROM profesor;

COD

--101 104 105 106 clauza ORDER BY poate fi folosit o singur dat ntr-o interogare care folosete operatori de mulimi; atunci cnd se folosete, ea trebuie poziional la sfritul comenzii; de exemplu:

SQL> SELECT grad, salariu FROM profesor WHERE cod_catedra = 10 UNION SELECT grad, salariu FROM profesor WHERE cod catedra = 20 ORDER BY 2; GRAD ---ASIST ASIST LECT PROF PROF SALARIU ------1200 1500 2200 2500 3000

operatorii pentru mulimi pot fi utilizai n subinterogari; pentru a modifica ordinea de execuie este posibil utilizarea parantezelor, de exemplu:

SQL> SELECT grad FROM profesor WHERE cod-catedra = 10 INTERSECT SELECT grad FROM profesor WHERE cod_catedra = 20 UNION SELECT grad FROM profesor WHERE cod_catedra = 30;

GRAD ---ASIST CONF PROF SQL> SELECT grad FROM profesor WHERE cod_catedra = 10 INTERSECT (SELECT grad FROM profesor WHERE cod_catedra = 20 UNION SELECT grad FROM profesor WHERE cod_catedra = 30); GRAD ---ASIST PROF 5.1.20. Subinterogri i operatorii ANY, ALL, EXISTS O subinterogare este o comand SELECT inclus n alt comand SELECT. Rezultatele subinterogrii sunt transmise celeilalte interogri i pot aprea n cadrul clauzelor WHERE, HAVING sau FROM. Subinterogrile sunt utile pentru a scrie interogri bazate pe o condiie n care valoarea de comparaie este necunoscut. Aceast valoare poate fi aflat folosind o subinterogare. De exemplu: SELECT coloane FROM tabel WHERE coloana = (SELECT coloane FROM tabel WHERE condiie). Subinterogarea, denumit si interogare interioar (inner query), genereaz valorile pentru condiia de cutare a instruciunii SELECT care o conine, denumit interogare exterioar (outer query). Instruciunea SELECT exterioar depinde de valorile generate de ctre interogarea interioar. In general, interogarea interioar se execut prima i rezultatul acesteia este utilizat n interogarea exterioar. Rezultatul interogrii exterioare depinde de numrul valorilor returnate de ctre interogarea interioar. In acest sens, putem distinge: 1. Subinterogri care returneaz un singur rnd; 2. Subinterogri care returneaz mai multe rnduri. Din punct de vedere al ordinii de evaluare a interogrilor putem clasifica subinterogrile n:
1.

Subinterogri simple - n care interogarea interioar este evaluat prima, independent de interogarea exterioar (interogarea interioar se execut o singur dat);

2.

Subinterogri corelate - n care valorile returnate de interogarea interioar depind de valorile returnate de interogarea exterioar (interogarea interioar este evaluat pentru fiecare nregistrare a interogrii exterioare).

Subinterogrile sunt ndeosebi utilizate atunci cnd se dorete ca o interogare s regseasc nregistrri dintr-o tabel care ndeplinesc o condiie ce depinde la rndul ei de valori din aceeai tabel. Not: Clauza ORDER BY nu poate fi utilizat ntr-o subinterogare. Regula este c poate exista doar o singur clauz ORDER BY pentru o comand SELECT i, dac este specificat, trebuie s fie ultima clauz din comanda SELECT. Prin urmare, clauza ORDER BY nu poate fi specificat dect in interogarea cea mai din exterior. Subinterogri care returneaz un singur rand In acest caz condiia, din clauza WHERE sau HAVING a interogrii exterioare utilizeaz operatorii: =, <, <=, >, >=, <> care opereaz asupra unei subinterogri ce returneaz o singur valoare. Interogarea interioar poate conine condiii complexe formate prin utilizarea condiiilor multiple de interogare cu ajutorul operatorilor AND i OR sau prin utilizarea funciilor agregat. Urmtoarea interogare selecteaz cadrele didactice care au salariul cel mai mic. Salariul minim este determinat de o subinterogare ce returneaz o singur valoare. SQL> SELECT nume, prenume, salariu FROM profesor WHERE salariu = (SELECT MIN (salariu) FROM profesor); NUME PRENUME SALARIU ---------------VOINEA MIRCEA 1200 STANESCU MARIA 1200 Procesul de evaluare al acestei interogri se desfoar astfel: Se evalueaz n primul rnd interogarea interioar: Valoarea obinut este MIN ( salariu ) = 1 200 Rezultatul evalurii interogrii interioare devine condiie de cutare pentru interogarea exterioar i anume: SQL> SELECT nume, prenume, salariu FROM profesor WHERE salariu = 1200; n cazul n care interogarea interioar nu ntoarce nici o nregistrare, interogarea exterioar nu va selecta la rndul ei nici o nregistrare. Not: Dac se utilizeaz operatorii: =, <, <=, >, >=, <> n condiia interogrii exterioare, atunci interogarea interioar trebuie n mod obligatoriu s returneze o singur valoare. n caz contrar va aprea un mesaj de eroare, ca n exemplul urmtor: SQL> SELECT nume, prenume, salariu

FROM profesor WHERE salariu = (SELECT MIN (salariu) FROM profesor GROUP BY grad); ERROR: ORA-01427: single-row subquery returns more than one row Subinterogirile pot fi folosite nu numai n clauza WHERE a interogrii exterioare, ci i n clauza HAVING. Urmtoarea interogare afieaz toate gradele didactice pentru care salariul minim este mai mare dect salariul mediu al tuturor cadrelor didactice. SQL> SELECT grad FROM profesor GROUP BY grad HAVING MIN(salariu)>(SELECT AVG(salariu) FROM profesor); GRAD ---CONT LECT PROF Subinterogri care returneaz mai multe rnduri In cazul cnd interogarea ntoarce mai multe rnduri nu mai este posibil folosirea operatorilor de comparaie. In locul acestora se folosete operatorul IN, care ateapt o list de valori i nu doar una. Urmtoarea interogare selecteaz pentru fiecare grad didactic acele persoane care au salariul minim. Salariul minim pentru fiecare grad didactic este aflat printr-o subinterogare, care, evident, va ntoarce mai multe rnduri: SQL> SELECT nume, salariu, grad FROM profesor WHERE (salariu, grad) IN (SELECT MIN (salariu), grad FROM profesor GROUP BY grad) ORDER BY salariu; NUME ---VOINEA STANESCU ALBU MARIN GEORGESCU SALARIU ------1200 1200 2200 2500 2800 GRAD ---ASIST ASIST LECT PROF CONF

Not: Spre deosebire de celelalte interogri de pn acum, interogarea de mai sus compar

perechi de coloane. In acest caz trebuie respectate urmtoarele reguli: coloanele din dreapta condiiei de cutare sunt n paranteze i fiecare coloan este separat prin virgul; coloanele returnate de interogarea interioar trebuie s se potriveasc ca numr i tip cu coloanele cu care sunt comparate n interogarea exterioar; n plus, ele trebuie s fie n aceeai ordine cu coloanele cu care sunt comparate. Alturi de operatorul IN, o subinterogare care returneaz mai multe rnduri poate folosi operatorii ANY, ALL sau EXISTS. Operatorii ANY i ALL sunt prezentai n continuare, iar operatorul EXISTS va fi prezentat n seciunea "Subinterogri corelate". Operatorii ANY i ALL sunt folosii n mod obligatoriu n combinaie cu operatorii relaionali =, ! =, <, >, <=, >=; operatorii IN i EXISTS nu pot fi folosii n combinaie cu operatorii relaionali, dar pot fi utilizai cu operatorul NOT, pentru negarea expresiei. Operatorul ANY Operatorul ANY (sau sinonimul su SOME) este folosit pentru a compara o valoare cu oricare dintre valorile returnate de o subinterogare. Pentru a nelege modul de folosire a acestui operator s considerm urmtorul exemplu ce afieaz cadrele didactice ce ctig mai mult dect profesorii care au cel mai mic salariu: SQL> SELECT nume, salariu, grad FROM profesor WHERE salariu > ANY (SELECT DISTINCT salariu FROM profesor WHERE grad='PROF'); NUME ---GHEORGHIU GEORGESCU SALARIU ------3000 2800 GRAD ---PROF CONF

Interogarea de mai sus este evaluat astfel: dac salariul unui cadru didactic este mai mare dect cel puin unul din salariile returnate de interogarea interioar, acea nregistrare este inclus n rezultat. Cu alte cuvinte, >ANY nseamn mai mare dect minimul dintre valorile returnate de interogarea interioar, <ANY nseamn mai mic ca maximul, iar =ANY este echivalent cu operatorul IN. Not: Opiunea DISTINCT este folosit frecvent atunci cnd se folosete operatorul ANY pentru a preveni selectarea de mai multe ori a unor nregistrri. Operatorul ALL Operatorul ALL este folosit pentru a compara o valoare cu toate valorile returnate de o subinterogare. Considerm urmtorul exemplu ce afieaz cadrele didactice care ctig mai mult dect asistenii cu salariul cel mai mare: SQL> SELECT nume, salariu, grad FROM profesor WHERE salariu > ALL (SELECT DISTINCT salariu FROM profesor WHERE grad='ASIST');

NUME ---GHEORGHIU MARIN GEORGESCU ALBU

SALARIU ------3000 2500 2800 2200

GRAD ---PROF PROF CONF LECT

Interogarea de mai sus este evaluat astfel: dac salariul unui cadru didactic este mai mare dect toate valorile returnate de interogarea interioar, acea nregistrare este inclus n rezultat. Cu alte cuvinte, >ALL nseamn mai mare ca maximul dintre valorile returnate de interogarea interioar iar <ALL nseamn mai mic ca minimul dintre acestea. Not: Operatorul ALL nu poate fi utilizat cu operatorul = deoarece interogarea nu va ntoarce nici un rezultat cu excepia cazului n care toate valorile sunt egale, situatie care nu ar avea sens. Subinterogri imbricate Subinterogrile pot fi imbricate (utilizate cu alte subinterogri) pn la 255 de nivele, indiferent de numrul de valori returnate de fiecare subinterogare. Pentru a selecta cadrele didactice care au salariul mai mare dect cel mai mare salariu al cadrelor didactice care aparin catedrei de Electronic, vom folosi urmtoarea interogare:
SQL> SELECT nume, prenume, salariu FROM profesor WHERE salariu >(SELECT MAX(salariu) FROM profesor WHERE cod_catedra=(SELECT cod_catedra FROM catedra WHERE nume= 'ELECTRONIC'));

Subinterogri corelate In exemplele considerate pn acum interogarea interioar era evaluat prima, dup care valoarea sau valorile rezultate erau utilizate de ctre interogarea exterioar. Subinterogrile de acest tip sunt numite subinterogri simple. O alt form de subinterogare o reprezint interogarea corelat, caz n care interogarea exterioar transmite repetat cte o nregistrare pentru interogarea interioar. Interogarea interioar este evaluat de fiecare dat cnd este transmis o nregistrare din interogarea exterioar, care se mai numete si nregistrare candidat. Subinterogarea corelat poate fi identificat prin faptul c interogarea interioar nu se poate executa independent ci depinde de valoarea transmis de ctre interogarea exterioar. Dac ambele interogri acceseaz aceeai tabel, trebuie asigurate alias-uri pentru fiecare referire la tabela respectiv Subinterogrile corelate reprezint o cale de a accesa fiecare nregistrare din tabel i de a compara anumite valori ale acesteia cu valori ce depind tot de ea. Evaluarea unei subinterogri corelate se execut n urmtorii pai: 1. Interogarea exterioar trimite o nregistrare candidat ctre interogarea interioar; 2. Interogarea interioar se execut n funcie de valorile nregistrrii candidate; 3. Valorile rezultate din interogarea interioar sunt utilizate pentru a determina dac nregistrarea candidat va fi sau nu inclus n rezultat; 4. Se repet procedeul ncepnd cu pasul l pn cnd nu mai exist nregistrri candidate.

De exemplu pentru a regsi cadrele didactice care ctig mai mult dect salariul mediu din propria catedr, putem folosi urmtoarea interogare corelat: SQL> SELECT nume, prenume, salariu FROM profesor p WHERE salariu>(SELECT AVG(salariu) FROM profesor s WHERE s.cod_catedra = p. cod_catedra); NUME ---GHEORGHIU MARIN ALBU PRENUME ------STEFAN VLAD GHEORGHE SALARIU ------3000 2500 2200

In exemplul de mai sus coloana interogrii exterioare care se folosete n interogarea interioar este p. cod_catedra. Deoarece p. cod_catedra poate avea o valoare diferit pentru fiecare nregistrare, interogarea interioar se execut pentru fiecare nregistrare candidat transmis de interogarea exterioar. Atunci cnd folosim subinterogri corelate mpreun cu clauza HAVING, coloanele utilizate n aceast clauz trebuie s se regseasc in clauza GROUP BY. In caz contrar, va fi generat un mesaj de eroare datorat faptului c nu se pate face comparaie dect cu o expresie de grup. De exemplu, urmtoarea interogare este corect, ea selectnd gradele didactice pentru care media salariului este mai mare dect maximul primei pentru acelai grad: SQL> SELECT grad FROM profesor p GROUP BY grad HAVING AVG (salariu)>(SELECT MAX(prima) FROM profesor WHERE grad = p.grad); grad -----ASIST CONF Operatorul EXISTS Operatorul EXISTS verific dac, pentru fiecare nregistrare transmis de interogarea exterioar, exist sau nu nregistrri care satisfac condiia interogrii interioare, returnnd interogrii exterioare valoarea True sau False. Cu alte cuvinte, operatorul EXISTS cere n mod obligatoriu corelarea interogarii interioare cu interogarea exterioara. Datorita faptului c operatorul EXISTS verific doar existena rndurilor selectate i nu ia n considerare numrul sau valorile atributelor selectate, n subinterogare poate fi specificat orice numr de atribute; n particular, poate fi folosit o constant i chiar simbolul * (dei acest lucru nu este recomandabil din punct de vedere al eficienei). De altfel, EXISTS este singurul operator care permite acest lucru. Urmtoarea interogare selecteaz toate cadrele didactice care au mcar un subordonat: SQL> SELECT cod, nume, prenume, grad FROM profesor p

WHERE EXISTS (SELECT '1' FROM profesor WHERE profesor.ef = p.cod) ORDER BY cod; -------------------------------------cod nume prenume grad -------------------------------------100 GHEORGHIU STEFAN PROF 102 GEORGESCU CRISTIANA CONF 103 IONESCU VERONICA ASIST -------------------------------------La fel ca i operatorul IN, operatorul EXISTS poate fi negat, lund forma NOT EXISTS. Totui, o remarc foarte important este faptul c pentru subinterogari, NOT IN nu este la fel de eficient ca NOT EXISTS. Astfel dac n lista de valori transmis operatorului NOT IN exist una sau mai multe valori Null, atunci condiia va lua valoarea de adevr False, indiferent de celelalte valori din list. De exemplu, urmtoarea interogare ncearc s returneze toate cadrele didactice care nu au nici un subaltern: SQL> SELECT nume, grad FROM profesor WHERE cod NOT IN SELECT ef FROM profesor); Aceast interogri nu va ntoarce nici o nregistrare deoarece coloana ef conine i valoarea Null. Pentru a obine rezultatul corect trebuie s folosim urmtoarea interogare: SQL> SELECT nume, grad FROM profesor p WHERE NOT EXISTS (SELECT '1' FROM profesor WHERE sef=p.cod); +----------+--------+ | nume | grad | +----------+--------+ | MARIN | PROF | | ALBU | LECT | | VOINEA | ASIST | | STANESCU | ASIST | +----------+--------+ n general, operatorul EXISTS se folosete n cazul subinterogrilor corelate si este cteodat cel mai eficient mod de a realiza anumite interogri. Performana interogrilor depinde de folosirea indecilor, de numrul rndurilor returnate, de dimensiunea tabelei i de necesitatea crerii tabelelor temporare pentru evaluarea rezultatelor intermediare. Tabelele temporare generate de Oracle nu sunt indexate, iar acest lucru poate degrada performana subinterogrilor dac se folosesc operatorii IN, ANY sau ALL.

Subinterogrile mai pot aprea i n alte comenzi SQL cum ar fi: UPDATE, DELETE, 1NSERT i CREATE TABLE. Aa cum am vzut, exist n principal dou moduri de realizare a interogrilor ce folosesc date din mai multe tabele: jonciuni i subinterogri. Jonciunile reprezint forma de interogare relationala (n care sarcina gsirii drumului de acces la informaie revine SGRDului) iar subinterogrile forma procedural (in care trebuie indicat drumul de acces la informaie). Fiecare dintre aceste forme are avantajele sale, depinznd de cazul specific in care se aplic. 5.1.21. Operaii pe tabele ce conin informaii do structur arborescent O baz de date relaional nu poate stoca nregistrri n mod ierarhic, dar la nivelul nregistrrii pot exista informaii care determin o relaie ierarhic ntre nregistrri. SQL permite afiarea rndurilor dintr-o tabel innd cont de relaiile ierarhice care apar ntre rndurile tabelei. Parcurgerea n mod ierarhic a informaiilor se poate face doar la nivelul unei singure tabele. Operaia se realizeaz cu ajutorul clauzelor START WITH i CONNECT BY din comanda SELECT. De exemplu, n tabela profesor exist o relaie ierarhic ntre nregistrri datorat valorilor din coloanele cod i ef. Fiecare nregistrare aferent unui cadru didactic conine n coloana ef codul persoanei creia i este direct subordonat. Pentru a obine o situaie ce conine nivelele ierarhice, vom folosi urmtoarea interogare: SQL> SELECT LEVEL, nume, prenume, grad FROM profesor CONNECT BY PRIOR cod=sef START WITH sef IS NULL; LEVEL -----1 2 2 3 4 2 2 NUME ----GHEORGHIU MARIN GEORGESCU IONESCU STANESCU ALBU VOINEA PRENUME ------STEFAN VLAD CRISTIANA VERONICA MARIA GHEORGHE MIRCEA GRAD ---PROF PROF CONF ASIST ASIST LECT ASIST

Explicarea sintaxei i a regulilor de funcionare pentru exemplul de mai sus: Clauza standard SELECT poate conine pseudo-coloana LEVEL ce indic nivelul nregistrrii n arbore (ct de departe este de nodul rdcin). Astfel, nodul rdcin are nivelul l, fiii acestuia au nivelul 2, .a.m.d.; In clauza FROM nu se poate specifica dect o tabel; Clauza WHERE poate aprea n interogare pentru a restriciona vizitarea nodurilor (nregistrrilor) din cadrul arborelui; Clauza CONNECT BY specific coloanele prin care se realizeaz relaia ierarhic; acesta este clauza cea mai important pentru parcurgerea arborelui i este obligatorie; Operatorul PRIOR stabilete direcia n care este parcurs arborele. Dac clauza apare nainte de atributul cod, arborele este parcurs de sus n jos, iar dac apare nainte de atributul sef arborele este parcurs de jos in sus; Clauza START WITH specific nodul (nregistrarea) de nceput a arborelui. Ca punct de start nu se poate specifica un anumit nivel (LEVEL), ci trebuie specificat valoarea;

aceast clauz este opional, dac ea lipsete, pentru fiecare nregistrare se va parcurge arborele care are ca rdcin aceast nregistrare. n sintaxa interogrii de mai sus, pentru a ordona nregistrrile returnate, poate aparea clauza OROER BY, dar este recomandabil s nu o folosim deoarece ordinea implicit de parcurgere a arborelui va fi distrus. Pentru a elimina doar un anumit nod din arbore putem folosi clauza WHERE, iar pentru a elimina o ntreag ramur dintr-un arbore (o anumit nregistrare mpreuna cu fiii acesteia) folosim o condiie compus n clauza CONNECT BY. Urmtorul exemplu elimin doar nregistrarea cu numele 'GEORGESCU', dar nu i fiii acesteia: SQL> SELECT LEVEL, nume, prenume, grad FROM profesor WHERE nume != 'GEORGESCU' CONNECT BY PRIOR cod=sef START WITH ef IS NULL; LEVEL ----1 2 3 4 2 2 NUME ---GHEORGHIU MARIN IONESCU STANESCU ALBU VOINEA PRENUME ------TEFAN VLAD VERONICA MRIA GHEORGHE MIRCEA GRAD ---PROF PROF ASIST ASIST LECT ASIST

Pentru a elimina toat ramur care conine nregistrarea cu numele 'GEORGESCU' si nregistrrile pentru subordonaii acesteia se folosete urmtoarea interogare: SQL> SELECT LEVEL, nume, prenume, grad FROM profesor CONNECT BY PRIOR cod=sef AND nume != 'GEORGESCU' START WITH ef IS NULL; LEVEL ----1 2 2 2 NUME ---GHEORGHIU MARIN ALBU VOINEA PRENUME ------STEFAN VLAD GHEORGHE MIRCEA GRAD ---PROF PROF LECT ASIST

5.2 Comanda INSERT Aceast comand este utilizat pentru adugarea unor rnduri noi ntr-o tabel creat anterior sau n tabelele de baz ale unei vederi. Comanda INSERT poate fi utilizat in dou moduri: 1. Pentru introducerea datelor ntr-un tabel, cte o nregistrare la un moment dat. In acest caz sintaxa este urmtoarea INSERT INTO tabela [(coloana1, coloana 2)]

VALUES (valoarel, valoare2, .. ) In momentul inserrii datelor, trebuie respectate urmtoarele reguli: Coloanele pot fi specificate n orice ordine, ns trebuie asigurat corespondena ntre coloane si valorile furnizate (coloanei l i corespunde valoarea l, coloanei 2 i corespunde valoarea 2, .a.m.d.) iar coloanelor nespecificate le va fi ataat valoarea Null; n cazul n care coloanele nu sunt specificate explicit, se impune sa fie specificate valori pentru toate coloanele i ordinea acestor valori s coincid cu cea n care coloanele au fost definite la crearea tabelei (dac nu se cunoate ordinea de declarare a coloanelor se poate folosi comanda DESCRIBE nume_tabela care va afia lista coloanelor definite pentru tabela respectiv, tipul, lungimea i restriciile de integritate); Valorile trebuie s aib acelai tip de dat ca i cmpurile in care sunt adugate Dimensiunea valorilor introduse trebuie s fie mai mic sau cel mult egal cu dimensiunea coloanei (un ir de 20 de caractere nu poate fi adugat ntr-o coloan cu dimensiunea de 15 caractere); Valorile introduse trebuie s respecte restriciile de integritate definite la crearea tabelei (de exemplu, cmpuri definite ca NOT NULL sau UNIQUE). Atunci cnd se insereaz valori de tip dat calendaristic n format predefinit (DD-MON-YY), sistemul presupune n mod automat secolul 20, ora 00:00:00 (miezul nopii) Urmtoarea instruciune exemplific introducerea unei noi nregistrri n tabela profesor: SQL>INSERT INTO profesor (cod, nume, prenume, data_nast, ef, salariu, cod_catedra) VALUES (107, 'POPESCU', 'SERGIU',' 09-DEC-71', 100, 1200, 20); Se poate obsera c valorile coloanelor grad i prima, care nu au fost specificate, vor fi Null. In cazul n care nu se specific implicit numele coloanelor, valorile trebuie introduse in ordinea n care au fost definite i nu se poate omite valoarea nici unei coloane. Urmtoarea instruciune va produce acelai efect ca cea de mai sus: SQL> INSERT INTO profesor VALUES (107, 'POPESCU', 'SERGIU', '09-DEC-71', NULL, 100, 1200, NULL, 20); 2. Pentru introducerea datelor ntr-un tabel, prin copierea mai multor nregistrari dintr-un alt tabel sau grup de tabele; aceste nregistrri sunt rezultatul unei comenzi SELECT, n arest caz sintaxa este urmtoarea: INSERT INTO labela [(coloana1, colonna2, ...)] comanda_select i in acest caz trebuie respectate regulile de inserare, singura diferen fiind faptul c valorile noi introduse sunt extrase cu ajutorul unei interogri, acest lucru crend posibilitatea de inserare a mai multor nregistrri n funcie de anumite condiii. De exemplu, pentru a insera n tabela nou_profesor, avnd coloanele cod, nume, prenume si data_nastere, nregistrrile din tabela profesor care au gradul didactic de asistent se poate folosi urmtoarea instruciune: SQL> INSERT data_nastere) INTO nou_profesor(cod, nume, prenume,

SELECT cod, nume, prenume, data nast FROM profesor WHERE grad='ASIST'; 5.3. Comanda UPDATE Comanda UPDATE este folosit pentru a modifica valorile datelor existente ntr-un tabel sau n tabelele de baz ale unei vederi si are urmtoarea sintax general: UPDATE tabela [alias] SET atribuire_coloane,[atribuire_coloane,...] [WHERE condiie]; unde atribuire_coloane poate avea una dintre urmtoarele forme: coloana ={(expresie |(subinterogare)} sau (coloana [,coloana] ...) = (subinterogare) Se observ c exist dou posibiliti de modificare: furnizarea n mod explicit a fiecrei valori sau expresii pentru cmpurile ce trebuiesc modificate; obinerea valorilor cu ajutorul unei subinterogri. Comanda UPDATE modific valorile nregistrrilor n funcie de condiia clauzei WHERE. In lipsa clauzei WHERE, vor fi actualizate toate nregistrrile din tabelul dat. Expresia furnizat ca o nou valoare a unei coloane poate cuprinde valorile curente ale cmpurilor din nregistrarea care este actualizat. De exemplu, pentru a mri salariul cu 20% i prima cu 100 pentru cadrele didactice ce au gradul de asistent, se va folosi urmtoarea comand: SQL> UPDATE profesor SET salariu=salariu*l.2, prima=prima+100 WHERE grad='ASIST'; Pentru a exemplifica actualizarea datelor utiliznd subinterogri presupunem c mai avem o tabel numit prima ce conine sumele de bani primite suplimentar de unele cadre didactice: COD --102 103 102 PRIMA ----100 200 50

Pentru a modifica datele din tabela profesor pe baza datelor din tabela prima se poate folosi urmtoarea comand care conine o subinterogare corelat i o subinterogare mbricat: SQL> UPDATE profesor SET prima=(SELECT SUM(prima) FROM prima a WHERE a.cod=profesor.cod) WHERE cod IN (SELECT cod

FROM prima); O alt posibilitate este ca sumele suplimentare coninute n tabela prima s fie adugate la prima existent n tabela profesor: SQL> UPDATE profesor SET prima=(SELECT SUM (prima) + profesor.prima FROM prima a WHERE a.cod=profesor.cod) WHERE cod IN (SELECT cod FROM prima); S presupunem acum c toi asistenii sunt transferai la catedra din care face parte cadrul didactic cu codul 104 i vor primi acelasi salariu cu acesta: SQL> UPDATE profesor SET(cod_catedra,salariu)=(SELECTcod_catedra, salariu FROM profesor WHERE cod=104) WHERE grad='ASIST'; 5.4. Comanda DELETE Comanda DELETE realizeaz tergerea nregistrrilor dintr-o tabel sau din tabelele de baza ale unei vederi n funcie de o anumit condiie i are urmtoarea sintax general: DELETE FROM tabela [WHERE condiie] Similar comenzii UPDATE, comanda DELETE terge anumite nregistrri n funcie de condiia din clauza WHERE. n lipsa clauzei WHERE vor fi terse toate nregistrrile din tabelul dat. In aceast clauz pot fi incluse i subinterogri. De exemplu urmtoarea comand terge toate nregistrrile pentru care gradul didactic este asistent: SQL> DELETE FROM profesor WHERE grad='ASIST'; Not: Comanda DELETE nu poate fi folosit pentru tergerea valorii unui cmp individual (pentru aceasta folosii comanda UPDATE) ci terge nregistrri complete dintr-un singur tabel, n plus, comanda DELETE terge numai nregistrri din tabel nu i tabelul. Pentru a terge un tabel se folosete comanda DROP TABLE. Un alt aspect important este faptul c, similar comenzilor INSERT i UPDATE, tergerea nregistrrilor dintr-un tabel poate determina apariia unor probleme legate de integritatea referenial. Pentru a evita aceste probleme se pot defini constrngeri de integritate care mpiedic operaiile de inserare, actualizare sau tergere care ar distruge integritatea referenial a datelor. 5.5. Comanda TRUNCATE

Pentru a terge n mod rpid toate nregistrrile dintr-o tabel sau dintr-un cluster se poate folosi comanda TRUNCATE. Comanda TRUNCATE este mult mai rapid dect comanda DELETE din urmtoarele motive: Comanda TRUNCATE este o comand DDL, prin urmare se execut dintr-o singur tranzacie i deci nu folosete segmentul de revenire. Comanda trebuie folosit cu precauie deoarece nu mai poate fi derulat napoi. Comanda TRUNCATE nu declaneaz trigger-ul DELETE Comanda are urmtoarea sintax general: TRUNCATE (TABLE tabe]lCLUSTER cluster} [{DROP|REUSE})STORAGE] unde: Clauza TABLE specific numele unei tabele iar clauza CLUSTER specific numele unui cluster. Dup cum se observ din sintax, aceste dou opiuni sunt alternative, deci nu se poate specifica ntr-o comand TRUNCATE tergerea rndurilor dintr-o tabel i dintr-un cluster n acelai timp. In cazul n care se specific clauza TABLE, tabela la care se refer aceast clauz nu poate face parte dintr-un cluster. Comanda TRUNCATE se poate executa i asupra tabelelor organizate pe index, la trunchierea unei tabele. Oracle terge automat datele din indecii tabelei, n cazul in care se specific clauza CLUSTER, clusterul la care se se refer aceast clauz nu poate fi un cluster hash ci numai un cluster de index. De asemenea, la trunchierea unui cluster, Oracle terge automat datele din indecii tabelelor clusterului. Clauza DROP STORAGE elibereaz spaiul alocat nregistrarilor terse din tabel sau cluster. Clauza REUSE, STORAGE pstreaz spaiul alocat nregistrrilor terse din tabel sau cluster. Acest spaiu care nu a fost dealocat poate fi reutilizat doar la operaii de inserare sau modificare asupra tabelei sau clusterului. Aceste dou opiuni nu modific efectul pe care l are comanda TRUNCATE asupra spaiului eliberat de datele terse din indecii asociai. Opiunea implicit este DROP STORAGE. tergerea nregistrrilor cu ajutorul comenzii TRUNCATE este mult mai avantajoas dect eliminarea tabelului i recrearea lui ulterioar deoarece: Eliminarea tabelului face ca obiectele dependente de acesta s devin invalide, pe cnd n cazul folosirii comenzii TRUNCATE nu se ntmpl acest lucru; Comanda TRUNCATE nu necesit reacordarea de drepturi asupra tabelului aa cum se ntmpl dac acesta a fost eliminat i apoi recreat; Eliminarea tabelului necesit recrearea indecilor, constrngerilor de integritate, declanatoarelor, precum i specificarea parametrilor de stocare. De exemplu, dac un utilizator execut comanda SELECT COUNT (*) FROM nume tabel, iar aceast interogare returneaz dup un interval destul de ndelungat valoarea zero, se recomand trunchierea tabelului cu eliberarea spaiului alocat nregistrrilor terse. ----------------------------------------------------------------------------------------------------------------