Sunteți pe pagina 1din 54

CAPITOLUL 6.

SELECTAREA DATELOR DIN TABELELE BAZEI DE DATE


6.1. Comanda SELECT Pentru a selecta datele din una sau mai multe tabele se utilizeaz comanda SELECT a carei sintaxa este: SELECT [ALL | DISTINCT] {[nume-tabela.]* | expr [sinonim], expr [sinonim],} FROM nume-tabel [@ legatur][sinonim], nume-tabel [@ legatur][sinonim], [WHERE conditie] [ CONNECT BY conditie [START WITH conditie] ] [ GROUP BY { expr, expr.. | CUBE ( expr, expr.. ) | ROLLUP ( expr, expr ) } ] [HAVING conditie] [ {UNION | INTERSECT | MINUS} SELECT] [ ORDER BY {expr | numr-poziie} [ASC | DESC] {expr | numar-pozitie}[ASC | DESC], [ FOR UPDATE OF nume-col, nume-col,[NOWAIT] ]; Clauzele comenzii trebuie utilizate n ordinea specificat n sintax, excepie fcnd clauzele CONNECT BY, START WITH, GROUP BY i HAVING (care pot fi specificate n orice ordine). Clauzele ORDER BY i FOR UPDATE OF pot fi schimbate ntre ele. Clauza ALL determin afiarea tuturor rndurilor rezultate n urma cererii, spre deosebire de clauza DISTINCT care determin eliminarea duplicatelor, afind doar rndurile distincte. Utilizarea caracterului asterisc (*) are ca efect selectarea tuturor coloanelor din tabela specificat prin clauza FROM, n ordinea n care au fost definite la creare. n situaia final, fiecare expresie formulat n comand devine un nume de coloan. Totodat, orice sinonim, dac este specificat, este folosit n scopul etichetrii expresiei precedente din tabela afiat. Dac sinonimul conine blancuri sau caractere speciale cum sunt + i -, trebuie incluse ntre apostrofuri. Pentru a evita ambiguitatea, n cazul n care tabelele conin coloane cu acelai nume, este necesar calificarea coloanelor cu numele tabelei .

Identificarea tabelelor n care trebuie cutate datele corespunztoare coloanelor specificai se face prin specificarea numelor lor dup clauza FROM. n locul numelor de tabele se pot folosi sinonimele acestora. Clauza WHERE specific o condiie care este folosit pentru a selecta rndurile. Clauza CONNECT BY indic faptul c rndurile formeaz o structur arborescent. Prin aceast clauz sunt definite relaiile necesare pentru a conecta rndurile tabelei ntr-un arbore. Operatorul PRIOR folosit naintea uneia din cele dou pri ale condiiei, definete nodul printe iar n cealalt parte nodul fiu. Clauza START WITH, prin specificarea unei condiii care trebuie satisfcut, stabilete rndul folosit ca rdcin a arborelui. Dac se omite, comanda SELECT va returna o serie de arbori ncepnd cu fiecare rnd selectat. Existena clauzei CONNECT BY ntr-o comand SELECT permite utilizarea pseudocoloanei LEVEL, care returneaz valoarea 1 pentru nodul rdcin, 2 pentru fiii nodului rdcin, 3 pentru nepoi etc. Clauzele GROUP BY i HAVING determin afiarea unor informaii sintetice despre grupuri de rnduri care au aceeai valoare n una sau mai multe coloane. Aceste coloane sunt, n general, funcii de grup. ROLLUP activeaz o comanda SELECT pentru a calcula mai multe niveluri de subtotaluri dintr-un grup specificat de dimensiuni. Calculeaz de asemenea i un total general. ROLLUP este o extensie simpl a clauzei GROUP BY, deci sintaxa este foarte uor de folosit. Extensia ROLLUP este foarte eficient i nu ngreuneaz o cerere. Rolul extensiei ROLLUP este foare clar: creaz subtotaluri care pornesc de la cel mai detaliat nivel pn la un total general dup gruparea care a fost precizat n clauza ROLLUP. CUBE acioneaz asupra unui grup specificat de coloane i creaz subtotaluri pentru toate combinaiile posibile ntre acestea. Dac sa specificat de exemplu: CUBE (timp,regiune, department), rezultatul va include toate valorile care ar fi incluse ntr-un ROLLUP plus combinaii adiionale. Pentru a combina rezultatele a dou comenzi SELECT ntr-un singur rezultat, se folosesc operatorii UNION, INTERSECT i MINUS. UNION returneaz rezultatele obinute de la fiecare cerere n parte, INTERSECT returneaz doar rezultatele comune celor dou cereri iar MINUS returneaz rezultatele obinute de la prima cerere i care nu apar n urma celei de a doua selecii.

Pentru a putea folosi aceste clauze este necesar ca numrul i tipul coloanelor selectate de fiecare comand SELECT s fie aceleai, lungimile lor putnd fi diferite. Dac sunt combinate mai mult de dou comenzi SELECT, ele vor fi evaluate de la stnga la dreapta. Pentru a schimba ordinea de evaluare pot fi folosite parantezele. Totodat, cei trei operatori impun utilizarea cuvntului DISTINCT n toate comenzile SELECT. Clauza ORDER BY specific ordinea n care trebuie returnate rndurile distincte ale unei tabele. Clauza FOR UPDATE determin blocarea rndurilor selectate ale tabelei astfel nct acestea nu vor mai putea fi actualizate de ali utilizatori pn la deblocarea lor cu una din comenzile COMMIT sau ROLL BACK. Comanda SELECT ... FOR UPDATE trebuie urmat de una sau mai multe comenzi UPDATE ... WHERE. Dac se folosete clauza NOWAIT, selecia este considerat terminat chiar dac rndurile selectate de FOR UPDATE nu pot fi blocate deoarece alt utilizator lucreaz cu ele.

6.2. Utilizarea clauzei FROM Pentru a selecta una sau mai multe tabele i pentru a specifica, eventual, identificatorul proprietarului i legtura cu reeaua se folosete secvena: SELECT ... FROM [ident-proprietar] tabela [@LINK],...; Exemple: 1) S se selecteze toate coloanele din tabela SALARIAI. SQL> SELECT * FROM SALARIAI; sau SQL> SELECT ALL FROM SALARIATI;
MARCA 1111 1222 1000 3500 2500 3700 2650 NUME AVRAM ION BARBU DAN COMAN RADU DAN ION VLAD VASILE MANU DAN VLAD ION FUNCT VNZATOR VNZATOR EF DEP VNZATOR EF DEP VNZATOR VNZATOR CODD SALA 100000 21200 120000 20750 130000 35000 160000 24500 160000 36500 160000 27500 120000 25060 VENS 1000 2000 2500 3550 1500 2500 3500 CODS 1000 1000 1000 2500 2500 2500 1000

7 records selected.

2) S se selecteze coloanele MARCA, NUME, SALA, VENS din tabela SALARIAI. SQL> SELECT MARCA,NUME,SALA,VENS 2 FROM SALARIAI;
MARCA NUME 1111 AVRAM ION 1222 BARBU DAN 1000 COMAN RADU 3500 DAN ION 2500 VLAD VASILE 3700 MANU DAN 2650 VLAD ION SALA 21200 20750 35000 24500 36500 27500 25060 VENS 1000 2000 2500 3550 1500 2500 3500

7 records selected. 3) S se selecteze coloana NUME din tabela SALARIAI SQL> SELECT NUME 2 FROM SALARIAI;
NUME AVRAM ION BARBU DAN COMAN RADU DAN ION VLAD VASILE MANU DAN VLAD ION

7 records selected. 4) S se selecteze coloana FUNCT din tabela SALARIAI n variantele utilizrii i neutilizrii clauzei DISTINCT. SQL> SELECT FUNCT AFIARE_FUNCTIE 2 FROM SALARIAI;
AFISARE_FUNCTIE VNZATOR VNZATOR SEF DEP VNZATOR SEF DEP VNZATOR VNZATOR

7 records selected. SQL>SELECT DISTINCT FUNCT 2 AFIARE_DISTINCT_FUNCTIE 3 FROM SALARIAI;

AFISARE_DISTINCT_FUNCTIE VNZATOR EF DEP

2 records selected. 6.3 Utilizarea operatorilor n formularea condiiilor de selecie din clauza WHERE Operatorii SQL*Plus (Anexa2) pot aprea n orice parte a unei comenzi i au ntietate fa de orice alt tip de operatori. Operatorii aritmetici i logici sunt utilizai pentru formularea condiiilor de selecie. Exemple: 1) S se selecteze toate nregistrrile privind salariaii al cror salariu este mai mare de 15000 u.m.: SQL> SELECT * FROM SALARIATI 2 WHERE SALA>15000 ;
MARCA 1111 1222 1000 3500 2500 3700 2650 NUME AVRAM ION BARBU DAN COMAN RADU DAN ION VLAD VASILE MANU DAN VLAD ION FUNCT VNZATOR VNZATOR EF DEP VNZATOR EF DEP VNZATOR VNZATOR CODD SALA 100000 21200 120000 20750 130000 35000 160000 24500 160000 36500 160000 27500 120000 25060 VENS 1000 2000 2500 3550 1500 2500 3500 CODS 1000 1000 1000 2500 2500 2500 1000

7 records selected. 2) S se selecteze coloanele MARCA i NUME, precum i veniturile totale (SALA+VENS) pentru angajaii care au un salariu mai mare dect 35.000 u.m. SQL> SELECT MARCA, NUME, SALA+VENS 2 FROM SALARIAI 3 WHERE SALA>35000 ;
MARCA NUME 2650 VLAD VASILE SALA + VENS 38000

1 record selected 3) S se selecteze coloanele NUME, FUNCT i SALA pentru salariaii care au fncia de vnztor. SQL> SELECT NUME, FUNCT FROM SALARIAI 2 WHERE FUNCT=VNZATOR ;
NUME AVRAM ION FUNCT VNZATOR SALA 21200

BARBU DAN DAN ION MANU DAN VLAD ION

VNZATOR VNZATOR VNZATOR VNZATOR

20750 24500 27500 25060

5 records selected. 4) S se selecteze coloanele MARCA, NUME, CODD din tabela SALARIAI, pentru salariaii al cror venit suplimentar depete salariul. SQL> SELECT MARCA, NUME, CODD 2 FROM SALARIAI 3 WHERE VENS>SALA ; no records selected 5) S se selecteaze i afieze cmpurile MARCA, NUME, SALARIU pentru salariaii ale cror venituri suplimentare sunt mai mari de 1.500 u.m. i lucreaz n subordinea superiorului cu Codul 1000. SQL> SELECT MARCA, NUME, SALA 2 FROM SALARIAI 3 WHERE VENS>1500 4 AND CODS=1000 ;
MARCA 1222 1000 2650 NUME BARBU DAN COMAN RADU VLAD ION SALA 20750 35000 25060

3 records selected 6) S se afieze toate coloanele pentru salariaii cu funcia vnztor, care au salariul mai mare ca 20.000 u.m. i lucreaz n subordinea superiorului cu Codul 1000. SQL> SELECT * FROM SALARIAI 2 WHERE FUNCT =VANZATOR 3 AND SALA>20000 4 AND CODS=1000 ;
MARCA 1111 1222 2650 NUME AVRAM ION BARBU DAN VLAD ION FUNCT VNZATOR VNZATOR VNZATOR CODD SALA 100000 21200 120000 20750 120000 25060 VENS 1000 2000 3500 CODS 1000 1000 1000

3 records selected. 7) S se afieze coloana NUME i SALA pentru angajaii care au salariul mai mic ca 30.000 u.m. SQL> SELECT NUME FROM SALARIAI

WHERE SALA<30000 ;
SALA 21200 20750 24500 27500 25060

NUME AVRAM ION BARBU DAN DAN ION MANU DAN VLAD ION

5 records selected. 8) S se selecteze nregistrrile pentru care funcia este SEF DEP sau salariul este mai mare dect 35.000 u.m. SQL> SELECT MARCA, CODS FROM SALARIAI 2 WHERE FUNCT='SEF DEP' OR SALA>35000 ;
MARCA 1000 2500 NUME COMAN RADU VLAD VASILE FUNCT CODD EF DEP 130000 EF DEP 160000 SALA 35000 36500 VENS 2500 1500 CODS 1000 2500

2 records selected. 9) S se selecteze datele despre salariaii care au funcia de vnztor i nu lucreaz n subordinea superiorului cu codul 1000, SQL> SELECT * FROM SALARIAI 2 WHERE FUNCT=VANZATOR 3 AND CODS!=l000;
MARCA 3500 3700 NUME DAN ION MANU DAN FUNCT VNZATOR VNZATOR CODD SALA 160000 24500 160000 27500 VENS 3550 2500 CODS 2500 2500

2 records selected. 10) S se selecteze toi salariaii care lucreaz n subordinea superiorului cu codul 1000 precum i cei care au salariul mai mic de 26.000 u.m. sau funcia de vnztor. SQL> SELECT * FROM SALARIAI 2 WHERE FUNCT=VNZATOR 3 OR SALA< 26000 AND CODS=1000 ;
MARCA 1111 1222 3500 2650 NUME AVRAM ION BARBU DAN DAN ION VLAD ION FUNCT VNZATOR VNZATOR VNZATOR VNZATOR CODD SALA 100000 21200 120000 20750 160000 24500 120000 25060 VENS 1000 2000 3550 3500 CODS 1000 1000 2500 1000

4 records selected 11) S se selecteze MARCA i NUMELE pentru nregistrrile care conin date despre angajaii a cror funcie este cea de ef de depozit sau

care au un salariu de 35.000 u.m. i lucreaz n subordinea superiorului cu codul 1000. SQL> SELECT MARCA, NUME 2 FROM SALARIAI 3 WHERE FUNCT=SEF DEP OR 4 (SALA=35000 AND CODS=1000) ;
MARCA 1000 2500 NUME COMAN RADU VLAD VASILE

2 records selected. 12) S se selecteze datele salariailor care lucreaz n subordinea superiorului cu marca 1000 i au funcia ef de depozit sau salariul n valoare de 35.000 u.m. SQL> SELECT * FROM SALARIAI 2 WHERE (FUNCT=SEF DEP OR SALA=35000) 3 AND CODS=1000 ;
MARCA 1000 NUME COMAN RADU FUNCT CODD SALA EF DEP 130000 35000 VENS 2500 CODS 1000

1 record selected. 13) S se afieze valorile coloanelor MARCA, NUME, FUNCT privind angajaii care lucreaz n subordinea superiorului cu marca 1000 i au funcia de ef de depozit sau de vnztor. SQL> SELECT MARCA,NUME,FUNCT, CODS 2 FROM SALARIAI 3 WHERE (FUNCT=SEF DEF OR 4 FUNCT=VANZATOR') 5 AND CODS=1000 ;
MARCA 1111 1222 1000 2650 NUME AVRAM ION BARBU DAN COMAN RADU VLAD ION FUNCT VNZATOR VNZATOR EF DEP VNZATOR CODS 1000 1000 1000 1000

4 records selected. 14) S se selecteze coloanele MARCA, NUME, FUNCT pentru salariaii care au funcia de ef depozit sau pentru cei care lucreaz n subordinea superiorului cu marca 1000 i au funcia de vnztor. SQL> SELECT MARCA,NUME,FUNCT, CODS 2 FROM SALARIAI 3 WHERE FUNCT='SEF DEP'

4 5
MARCA 1111 1222 1000 2500 2650

OR (FUNCT=VNZATOR AND CODS=1000) ;


NUME AVRAM ION BARBU DAN COMAN RADU VLAD VASILE VLAD ION FUNCT VNZATOR VNZATOR EF DEP EF DEP VNZATOR CODS 1000 1000 1000 2500 1000

5 records selected. 15) S se selecteze toate datele privind angajaii ce nu au funcia de vnztor. SQL> SELECT * FROM SALARIAI 2 WHERE NOT (FUNCT= VANZATOR) ;
MARCA NUME 1000 COMAN RADU 2500 VLAD VASILE FUNCT EF DEP EF DEP CODD SALA 130000 35000 160000 36500 VENS 2500 1500 CODS 1000 2500

2 records selected. 16) S se selecteze valorile coloanelor MARCA, NUME, FUNCT, SALA+VENS pentru angajaii care au salariul cuprins ntre 24.500 i 36.000 u.m. SQL>SELECT MARCA, NUME, FUNCT, SALA+VENS 2 FROM SALARIAI 3 WHERE SALA BETWEEN 24500 AND 36000 ;
MARCA 1000 3500 3700 2650 NUME COMAN RADU DAN ION MANU DAN VLAD ION FUNCT EF DEP VNZATOR VNZATOR VNZATOR SALA+VENS 37500 28050 30000 28560

4 records selected. 17) S se selecteze cmpurile NUME, FUNCT, SALA+VENS pentru salariaii care au salariul mai mic dect 24500 i mai mare dect 36000. SQL> SELECT NUME, FUNCT, SALA+VENS 2 FROM SALARIAI 3 WHERE SALA NOT BETWEEN 24500 AND 36000 ;
NUME AVRAM ION BARBU DAN VLAD VASILE FUNCT VNZATOR VNZATOR EF DEP SALA+VENS 22200 22750 38000

3 records selected.

18) S se selecteze cmpurile MARCA, NUME i FUNCT pentru salariaii care lucreaz n depozitul cu codurile 130000 sau 160.000. SQL> SELECT MARCA, NUME, FUNCT 2 FROM SALARIAI 3 WHERE CODD IN (130000,160000) ;
MARCA 1000 3500 2500 3700 NUME COMAN RADU DAN ION VLAD VASILE MANU DAN FUNCT EF DEP VNZATOR EF DEP VNZATOR

4 records selected 19) S se selecteze cmpurile MARCA, NUME, SALA, VENS pentru salariaii care au alt funcie dect cea de vnztor. SQL> SELECT MARCA, NUME, SALA, VENS 2 FROM SALARIAI 3 WHERE FUNCT NOT IN (VNZATOR) ;
MARCA 1000 2500 NUME COMAN RADU VLAD VASILE FUNCT SALA EF DEP 35000 EF DEP 36500 VENS 2500 1500

2 records selected Operatorul LIKE face posibil realizarea unor cereri de regsire a nregistrrilor ce conin un cmp a crui valoare este comparat cu un ir de caractere dat. Pentru a evalua expresiile logice n care apar iruri de caractere se poate folosi clauza LIKE n urmtoarea secven: SELECT ... WHERE coloan LIKE ir ; Avantajul unei viteze mari de regsire ca urmare a indexrii este pierdut n momentul n care se caut ntr-o coloan indexat un ir care ncepe cu - sau %. Aceste caractere speciale suplinesc unul, respectiv mai multe caractere. Exemple: 1) S se selecteze coloanele NUME i FUNCT precum i veniturile totale pentru salariaii al cror nume ncepe cu litera C. SQL> SELECT NUME, FUNCT, SALA+VENS 2 FROM SALARIAI 3 WHERE NUME LIKE 'C% ;
NUME FUNCT SALA+VENS

COMAN RADU

EF DEP 37500

1 record selected 2) S se selecteze coloanele NUME, FUNCT, SALA+VENS pentru salariaii al cror nume se termin cu litera N. SQL> SELECT NUME,FUNCT, SALA+VENS 2 FROM SALARIAI 3 WHERE NUME LIKE %N' ;
NUME AVRAM ION BARBU DAN DAN ION MANU DAN VLAD ION FUNCT VNZATOR VNZATOR VNZATOR VNZATOR VNZATOR SALA+VENS 22200 22750 28050 30000 28560

5 records selected 3) S se selecteze coloanele MARCA, NUME, MARCA, FUNCT pentru salariaii al cror nume este format din nou caractere (inclusiv spaiu), pe ultima poziie fiind N. SQL> SELECT NUME, MARCA, FUNCT, SALA+VENS 2 FROM SALARIAI 3 WHERE NUME LIKE _ _ _ _ _ _ _ _N ;
MARCA 1111 1222 NUME AVRAM ION BARBU DAN FUNCT VNZATOR VNZATOR

2 recors selected 4)S se selecteze salariaii al cror nume are pe poziia a treia litera M. SQL> SELECT NUME, FUNCT 2 FROM SALARIAI 3 WHERE NUME LIKE _ _M%' ;
NUME COMAN RADU FUNCT EF DEP

1 record selected 5) S se selecteze salariaii al cror nume are o lungime de nou caractere. SQL> SELECT NUME 2 FROM SALARIAI 3 WHERE NUME LIKE '_ _ _ _ _ _ _ _ _';
MARCA 1111 1222 NUME AVRAM ION BARBU DAN NS

2 recors selected Regsirea unor nregistrri ce conin cmpuri cu valori nule se face cu ajutorul operatorului NULL. Exemple: 1) S se selecteze datele pentru salariaii ce nu au venit suplimentar. SQL> SELECT MARCA, NUME, FUNCT 2 FROM SAI.ARIATI 3 WHERE VENS IS NULL ;
MARCA 3770 NUME CARMEN ANCA FUNCT VNZATOR CODD 130000 SALA 26500 VENS 4000 CODS

1 record selected 2) S se selecteze toate datele salariaiilor care sunt ef depozit i al cror cmp VENS (venituri suplimentare) nu conine valoarea NULL. SQL> SELECT * FROM SALARIATI WHERE 2 VENS IS NOT NULL AND FUNCT IS SEF DEP ;
MARCA 1000 2500 NUME COMAN RADU VLAD VASILE FUNCT EF DEP EF DEP CODD SALA 130000 35000 160000 36500 VENS 2500 1500 CODS 1000 2500

2 records selected 6.4.Ordonarea liniilor rezultate n urma unei cereri Limbajul SQL*Plus are posibilitatea ordonrii cresctoare sau descresctoare a liniilor rezultate n urma unei cereri. Aceast operaie se realizeaz prin intermediul secvenei: SELECT ... FROM ... WHERE ... ORDER BY {expr | numr-poziie} [ASC | DESC], ; unde: expr reprezint o expresie care face referire la una sau mai multe coloane; numr-poziie este un numr care identific poziia coloanei din comanda SELECT, dup care se dorete sortarea. Utilizarea operatorului de tipul UNION, INTERSECT sau MINUS impune prezena argumentului numr-poziie. ASC sau DESC precizeaz modul

de ordonare ascendent, respectiv descendent. n cazul n care clauzele ORDER BY i DISTINCT sunt utilizate mpreun, clauza ORDER BY trebuie s se refere la coloane care n-au fost menionate n comanda SELECT. Exemple: 1) S se selecteze toate coloanele tabelei SALARIAI privind salariaii care sunt vnztori i pentru care marca superiorului este 1000. Afiarea s se fac dup valorile coloanei MARCA, descresctor. SQL>SELECT * FROM SALARIAI 2 WHERE CODS=1000 3 AND FUNCT=VNZATOR 4 ORDER BY MARCA DESC ;
MARCA 2650 1222 1111 NUME VLAD ION BARBU DAN AVRAM ION FUNCT VNZATOR VNZATOR VNZATOR CODD SALA 120000 25060 120000 20750 100000 21200 VENS 3500 2000 1000 CODS 1000 1000 1000

3 records selected 2) S se selecteze cresctor dup salariu, angajaii cu funcia vnztor pentru care marca superiorului este 1000. SQL>SELECT * FROM SALARIAI 2 WHERE CODS=1000 3 AND FUNCT='VNZATOR' 4 ORDER BY SALA ;
MARCA 1222 1111 2650 NUME BARBU DAN AVRAM ION VLAD ION FUNCT VNZATOR VNZATOR VNZATOR CODD 120000 100000 120000 SALA 20750 21200 25060 VENS 2000 1000 3500 CODS 1000 1000 1000

3 records selected. 3) S se selecteze cresctor, dup salariu, coloanele MARCA, NUME, SALA, VENS, SALA+VENS pentru acei salariai cu funcia de vnztor i pentru care marca superiorului este 1000 SQL> SELECT MARCA, NUME, SALA, VENS 2 FROM SALARIAI 3 WHERE CODS=1000 AND FUNCT='VNZATOR' 4 ORDER BY SALA ;
MARCA 1222 1111 2650 NUME BARBU DAN AVRAM ION VLAD ION SALA 20750 21200 25060 VENS 2000 1000 3500 SALA+VENS 22750 22200 28560

3 records selected. 4) S se selecteze coloanele MARCA, NUME, CODD, VENS ordonate cresctor dup codul depozitului i veniturile suplimentare. SQL> SELECT MARCA,NUME,CODD,VENS 2 FROM SALARIAI 3 WHERE FUNCT='VNZATOR' 4 ORDER BY CODD, VENS ;
MARCA 1111 1222 2650 3700 3500 NUME AVRAM ION BARBU DAN VLAD ION MANU DAN DAN ION CODD 100000 120000 120000 160000 160000 VENS 1000 2000 3500 2500 3550

5 records selected 6.5. Selecii din mai multe tabele Operaia prin care se selecteaz i se grupeaz coloanele din tabele diferite, n scopul obinerii unor informaii coerente, poart numele de jonciune (JOIN). Pentru a realiza o jonciune i pentru a preciza corespondena ntre rndurile tabelelor, se utilizeaz urmtoarea secven: SELECT ... FROM nume-tab1, nume-tab2, ... WHERE condiie ; unde: condiie reprezint orice expresie care compar cmpurile diferitelor tabele.Vor fi selectate rndurile pentru care condiia este ndeplinit. n condiie poate fi folosit operatorul (+) care simuleaz existena unor rnduri vide n tabelele pentru care nu se gsesc corespondene. Exemple: 1) Din tabela COMENZI (creat anterior de utilizator, pe structura NrCom, DataCom, CodP, Cant, PreMax, PretMin, Pret(pltit), s se selecteze codul produsului, cantitatea i diferena dintre valoarea mrfurilor comandate la preul maxim i cel efectiv negociat (pentru un cmp definit DIFERENTA). Ordonarea s se fac ascendent dup CODP. SQL> SELECT COMENZI.CODP,CANT, 2 PRETMAX*CANT-PRET*CANT DIFERENTA

3 4 5
CODP 13333 14444 16686

FROM COMENZI,PRETURI WHERE PRETURI.CODP=COMENZI.CODP ORDER BY COMENZI.CODP ;


CANT DIFERENTA 4 8000 6 3000 15 75000

3 records selected. 2) S se afieze din tabela COMENZI codul produsului, diferena dintre valoarea mrfurilor comandate la preul maxim i cel efectiv negociat (pentru DIF_MAX), diferena dintre valoarea mrfurilor comandate la preul minim i cel efectiv negociat (pentru DIF_MIN) selectate dup criteriul egalitii EQUI-JOIN (JOIN pe condiie de egalitate). Liniile vor fi ordonate cresctor dup valoarea total a comenzii. SQL> SELECT COMENZI.CODP, 2 PRETMAX*CANT-*PRET*CANT DIF_MAX, 3 PRETMIN*CANT-PRET*CANT DIF_MIN 4 FROM COMENZI.PRETURI 5 WHERE PRETURI.CODP=COMEN2I.CODP 6 ORDER BY PRET*CANT;
CODP 14444 13333 16666 DIF_MAX 3000 8000 75000 DIF_MIN 0 -4000 -15000

3 records selected. 3) S se afieze cmpurile CODP, DENP, STOC i CANT, utiliznd criteriul egalitii OUTER-JOIN, pe cmpul comun CODP (se afieaz datele despre acele produse pentru care exist comenzi dar nu sunt n tabela Produse). Liniile vor fi ordonate cresctor dup cmpul CODP. SQL> SELECT COMENZI.CODP, DENP, STOC, CANT 2 FROM PRODUSE, COMENZI 3 WHERE COMENZI.CODP=PRODUSE.CODP (+) 4 ORDER BY COMENZI.CODP ;
CODP 13333 14444 16666 DENP CANAPEA A7 SCAUN D4 PLACAJ 2/2 STOC 6 36 100 CANT 4 6 15

3 records selected. 4) S se afieaze n modul distinct (far a se repeta aceleai linii), Codul depozitului i funciile care conin valori nule n cmpul veniturilor

suplimentare. Selectarea s se fac pe criteriul egalitii pe cmpul comun CODD i n condiiile n care acel depozit exist. SQL> SELECT DISTINCT DEPOZITE.CODD, NUME, FUNCT 2 FROM SALARIATI, DEPOZITE 3 WHERE SALARIATI.CODD=DEPOZITE.CODD (+) 4 AND VENS IS NULL;
CODD 130000 NUME CARMEN ANCA FUNCT VNZATOR

1 record selected. 5) S se afieze n modul distinct codul depozitului i funciile care conin valori nule n cmpul veniturilor suplimentare. Selectarea se face pe criteriul egalitii n cmpul comun CODD i n condiiile n care acel depozit exist. Liniile vor fi ordonate descresctor dup codul depozitului (din tabela SALARIAI). Se va aduga n tabela salariai un nou tuplu cuprinznd datele vnztorului Alexe Ioan, cod depozit 160000 i fr venituri suplimentare, pentru eficiena ordonrii. SQL> SELECT DISTINCT DEPOZTTE.CODD.FUNCT 2 FROM SALARIATLDEPOZITE 3 WHERE SALARIATLCODD=DEPOZITE.CODD(+) 4 AND VENS IS NULL 5 ORDER BY SALARIATI.CODD DESC
CODD 160000 130000 NUME ALEXE IOAN CARMEN ANCA FUNCT VNZTOR VNZATOR

2 records selected ntr-o cerere se pot nlocui numele de tabele sau coloane prin etichete. 6) S se selecteze cmpurile NUME, FUNCT, DEND din tabelele DEPOZITE (pentru care este utilizat numele D), CodD, DenD, Capac, NrSal, i SALARIAI (pentru care este utilizat numele S). Liniile vor fi ordonate cresctor dup cmpul NUME. SQL> SELECT NUME, FUNCT, D.CODD, DEND 2 FROM DEPOZITE D, SALARIAI S 3 WHERE D.CODD=S.CODD 4 ORDER BY NUME
NUME ALEXE IOAN AVRAM ION BARBU DAN FUNCT VNZATOR VNZATOR VNZATOR CODD 160000 100000 120000 DEND SPORT MOBILA ALIMENTAR

CARMEN ANCA COMANRADU DAN ION DORU DAN FRINCU ION RADU IOANA SANDU ION VLAD ION VLAD VASILE

VNZATOR SEF DEP VNZATOR SEF DEP SEF DEPR VNZATOR VNZATOR VNZATOR SEF DEP

130000 130000 160000 130000 160000 130000 130000 120000 160000

AUTO AUTO SPORT AUTO SPORT AUTO AUTO ALIMENTAR SPORT

13 records selected. Pentru a pune n eviden posibilitatea schimbrii denumirilor de tabele, n exemplele care urmeaz se va folosi, cu preponderen, adresarea prin calificare. 7) S se selecteze, n condiiile redenumirii tabelelor COMENZI cu CONTRACT i PRODUSE cu COS, a coloanelor CODP, CANT, PRE din CONTRACT i coloanelor DENP, STOC din COS. S fie selectate doar cmpurile care au unitatea de msur "buc. Liniile vor fi ordonate cresctor dup valorile comenzilor. SQL> SELECT CONTRACT.CODP,CONTRACT.CANT, 2 CONTRACT.PRET, DENP, COS.STOC 3 FROM COMENZI CONTRACT, PRODUSE COS 4 WHERE CONTRACT.CODP=COS.CODP 5 AND UM='BUC 6 ORDER BY CONTRACT.CANT*COS.PRET
CODP 14444 13333 CANT 6 4 PRE 4500 80000 DENP SCAUN D4 CANAPEA A STOC 36 76

2 records selected. 8) S se selecteze, n condiiile redenumirii tabelelor COMENZI cu CONTRACT i PRODUSE cu COS, a coloanelor CODP, CANT, PRE din CONTRACT i a coloanelor DENP, STOC din COS. Vor fi selectate doar cmpurile care au unitatea de msur buc iar liniile vor fi ordonate cresctor dup valorile comenzilor. La afiare se ve extrage o coloan numit 'DIFERENA' care s reflecte stocul rmas n urma onorrii comenzii. SQL> SELECT CONTRACT.CODP, 2 CONTRACT.CANT,CONTRACT.PRET, 3 DENP, COS.STOC, 4 COS.STOC-CONTRACT.CANT DIFERENA 5 FROM COMENZI CONTRACT,PRODUSE COS 6 WHERE CONTRACT.CODP=COS.CODP 7 AND UM=BUC'

8
CODP 14444 13333

ORDER BY CONTRACT.CANT * CONTRACT.PRET


CANT 6 4 PRE 4500 80000 DENP SCAUN D4 CANAPEA A7 STOC DIFERENA 36 30 6 2

2 records selected. 9) Din tabela COMENZI (definit prin etichetele T1 i T2) s se selecteze CODP, CODC, n condiiile n care valoarea comenzii este mai mare ca 50.000 u.m. (JOIN-ul unei tabele pe ea nsi). SQL> SELECT DISTINCT T1.CODP, T2.CODC 2 FROM COMENZI T1,COMENZI T2 3 WHERE Tl.CANT * T2.PRET >60000
CODP 13333 14444 16666 22222 CODC 121111 121111 121111 121111

4 records selected 10) S se selecteze campurile CODP,.DENP, PRE, PRETMAX, PRETM1N pentru produsele al cror pre (negociat) este cuprins ntre preul maxim i preul minim. Ordonarea s se fac cresctor dup cmpul CODP. SQL> SELECT PRODUSE.CODP, DENP, 2 COMENZI.PRET, 3 PRETMIN,PRETMAX 4 FROM PRODUSE, PRETURI, COMENZI 5 WHERE COMENZI.PRET BETWEEN PRETMIN AND PRETMAX 6 ORDER BY PRODUSE.CODP
CODP 13333 14444 16666 DENP CANAPEA A7 SCAUN D4 PLACAJ 2/2 PRE PRETMIN PRETMAX 80000 79000 82000 4500 4500 5000 25000 24000 30000

3 records selected. 6.6. Realizarea cererilor incluse Subcererile reprezint cereri incluse n clauzele unor comenzi SQL. Rndurile selectate de o subcerere nu sunt afiate, ele fiind utilizate n continuare de o comand SQL.

Dac subcererea este folosit n partea dreapt a unei expresii logice sau a unei expresii de atribuire, ea va returna o singur valoare sau o coloan de valori. Compunerea valorii rezultate cu cea din stnga expresiei se face n conformitate cu operatorul care face legtura ntre cele dou pri. n cazul n care subcererea este folosit pentru a specifica valori n comenzi ca INSERT, CREATE TABLE, UPDATE, ea va returna cte o valoare pentru fiecare coloan specificat n comand. Clauze ca ORDER BY, FOR nu pot fi folosite n subcereri. Subcererile apar, n general, n urmtoarele comenzi: COPY [FROM nume-utilizator/parol@baz-de-date] [TO nume-utilizator/parol@baz-de-date] {APPEND | CREATE | INSERT | REPLACE} Tabel (col1,col2,) USING cerere;; CREATE TABLE tabel AS cerere ; INSERT INTO tabel | [(col1,col2,)] [VALUES (val1,val2,...) | cerere]; UPDATE tabel [sinonim] SET (col1, col2, ) = (cerere) [WHERE condiie]; Exist si subcereri corelate cu cererile din comanda principal, care apar doar n clauza WHERE a comenzii SELECT. Ele pot utiliza sinonime pentru tabela precizat n comanda SELECT i sunt evaluate cte o dat pentru fiecare rnd selectat n comanda principal. Subcererile corelate pot apare n formule ca: 1). SELECT coloana1, coloana2,... FROM tabela1, tabela2 tab2,... WHERE coloana1 IN (SELECT coloana1 FROM tabela1 WHERE condiie) .... ;

2) SELECT coloana1, coloana2,... FROM tabela1 tab1, tabela2 tab2,... WHERE coloana2 IN (SELECT funcie (coloan) FROM tabela2 tab2 WHERE tab2.coloana=coloana) .... ; Exemple: 1) S se selecteze cmpurile NUME i FUNCT ale salariailor cu funcia identic cu a lui RADU IOANA. SQL> SELECT NUME, FUNCT, FUNCIE 2 FROM SALARIAI 3 WHERE FUNCT= 4 (SELECT FUNCT FROM SALARIAI 5 WHERE NUME='RADU IOANA');
NUME AVRAM ION BARBU DAN DAN ION MANU DAN VLAD ION SANDU ION CARMEN ANA RADU IOANA ALEXE IOAN FUNCIE VNZATOR VNZATOR VNZATOR VNZATOR VNZATOR VNZATOR VNZATOR VNZATOR VNZATOR

9 records selected. 2) S se selecteze, n modul distinct, valorile timpurilor MARCA, SALA, NUME, CODS ale angajailor care au salariul mai mare dect unul dintre subordonaii superiorului cu codul 1000. Rezultatele sunt cerute ordonate descresctor, dup valorile cmpului SALA. SQL> SELECT DISTINCT MARCA, SALA, NUME, CODS 2 FROM SALARIATI 3 WHERE SALA> ANY 4 (SELECT SALA FROM SALARIAI 5 WHERE CODS=1000) 6 ORDER BY SALA DESC;
MARCA 2500 3755 2550 1000 8700 8770 8755 8760 SALA 36500 36500 36000 35000 27500 26500 25700 25600 NUME VLAD VASILE DORU DAN FRINCU ION COMAN RADU MNU DAN CARMEN ANA ALEXE IOAN SANDU ION CODS 2500 4000 2500 1000 2500 4000 2500 4000

8650 8600 1111

25060 24500 21200

VLAD ION DAN ION AVRAM ION

1000 2500 1000

11 records selected. 3) S se selecteze valorile cmpurilor MARCA, NUME, SALA, CODS ale angajailor care au salariul mai mare dect al oricrui salariat din subordinea angajatului cu codul 1000. Datele s fie ordonate descresctor dup valorile cmpului MARCA. SQL> SELECT MARCA, NUME, SALA, CODS 2 FROM SALARIAI 3 WHERE SALA>ALL 4 (SELECT SALA FROM SALARIAI 5 WHERE CODS=1000) 6 ORDER BY MARCA DESC;
MARCA 3755 2550 2500 NUME DORU DAN FRINCU ION VLAD VASILE SALA 36500 36000 36500 CODS 4000 2500 2500

3 records selected. 4) S se selecteze cmpurile CODD, DEND, NRSAL pentru acele depozite care au numrul de salariai mai mare ca 5 i codul cuprins n intervalul 100000 i 130000. SQL> SELECT CODD, DEND, NRSAL 2 FROM DEPOZITE 3 WHERE NRSAL>5 AND CODD IN 4 (SELECT CODD FROM DEPOZITE 5 WHERE CODD BETWEEN 100000 AND 130000);
CODD 120000 DEND NRSAL ALIMENTAR 11

1 record selected. 5) S se selecteze CODD, DEND, NRSAL pentru acele depozite care au numrul de salariai mai mare ca 5 i codul n afara intervalului 100000 i 130000. SQL> SELECT CODD.DEND,NRSAL 2 FROM DEPOZITE 3 WHERE NRSAL>5 AND CODD NOT IN 4 (SELECT CODD FROM DEPOZITE 5 WHERE CODD BETWEEN 100000 AND 130000);
CODD 140000 DEND NRSAL TEXTILE 7

1 record selected. 6) S se selecteze urmtoarele informaii: marca, funcia i veniturile totale ale salariailor care au funcia i salariul lui VLAD VASILE. SQL> SELECT MARCA, NUME, SALA+VENS 2 FROM SALARIAI 3 WHERE (FUNCT, SALA)= 4 (SELECT FUNCT,SALA FROM SALARIAI 5 WHERE NUME=' VLAD VASILE ');
MARCA 1500 3755 NUME VLAD VASILE DORU DAN SALA+VENS 38000 42000

2 records selected. 7) S se selecteze MARCA, NUME, SALA+VENS pentru acei angajai care au funcia lui VLAD VASILE sau salariul mai mare sau egal cu cel pe care l are RADU IOANA. Ordonarea este cresctoare dup valorile cmpului NUME. SQL> SELECT MARCA, NUME, SALA+VENS 2 FROM SALARIAI 3 WHERE FUNCT IN 4 (SELECT FUNCT FROM SALARIAI 5 WHERE NUME='VLAD VASILE') 6 OR SALA>= 7 (SELECT SALA FROM SALARIATI 8 WHERE NUME=RADU IOANA) 9 ORDER BY NUME ;
NUME FUNCT ALEXE IOAN VNZATOR AVRAM ION VNZATOR BARBU DAN VNZATOR CARMEN ANCA VNZATOR COMANRADU SEF DEP DAN ION VNZATOR DORU DAN SEF DEP FRINCU ION SEF DEP MANU DAN VNZATOR RADU IOANA VNZATOR SANDU ION VNZATOR VLAD ION VNZATOR VLAD VASILE SEF DEP SALA+VENS 22200 22750 22200 23456 37500 24850 42000 73000 30000 23750 25600 28560 38000

13 records selected. Dac se dorete evitarea afirii valorilor NULE ale cmpului sum venituri totale (SALA+VENS), atunci se va proceda astfel:

SQL> SELECT MARCA, NUME, SALA+VENS 2 FROM SALARIAI 3 WHERE FUNCT IN 4 (SELECT FUNCT FROM SALARIAI 5 WHERE NUME='VLAD VASILE') 6 OR SALA>= 7 (SELECT SALA FROM SALARIATI 8 WHERE NUME=RADU IOANA) 9 AND VENS IS NOT NULL 10 ORDER BY NUME ; 8) S se selecteze cmpurile NUME i CODD ale angajailor cu codul superiorului 1000 i care au aceeai Funcie cu DORU DAN. S se afieze numai salariaii pentru care exist coresponden de CODD n tabelele DEPOZITE i SALARIAI. Datele s fie ordonate cresctor dup valorile cmpurilor CODD i NUME. SQL> SELECT NUME, DEPOZITE.CODD 2 FROM SALARIATI, DEPOZITE 3 WHERE CODS = 1000 4 AND DEPOZITE.CODD=SALARIATI.CODD 5 AND FUNCT IN 6 (SELECT FUNCT FROM SALARIAI 7 WHERE NUMEs'DORU DAN') 8 ORDER BY DEPOZITE.CODD, NUME;
NUME COMAN RADU CODD 130000

1 record selected. 9) S se selecteze cmpurile MARCA, NUME, CODD, DEND, SALA+VENS pentru angajaii care au salariul mai mare dect media salariilor realizate n depozitul din care fac ei parte. SQL> SELECT MARCA, NUME, SALARIATI.CODD, 2 DEND, SALA+VENS 3 FROM SALARIATI, DEPOZITE 4 WHERE SALA> 5 (SELECT AVG(SALA) FROM SALARIAI 6 WHERE SALARIATI.CODD=DEPOZITE.CODD) 7 AND DEPOZITE.CODD=SALARIATI.CODD 8 ORDER BY MARCA;
NUME CODD COMAN RADU 130000 DEND AUTO SALA+VENS 37500

VLAD VASILE 160000 FRINCU ION 160000 DORU DAN 130000

SPORT SPORT AUTO

38000 73000 42000

6.7. Utilizarea expresiilor, funciilor, variabilelor sistem i pseudocoloanelor n selectarea datelor Expresiile aritmetice pot fi utilizate n comenzile de selectare a datelor. Ele se construiesc cu ajutorul operatorilor aritmetici, numelor de coloane i constantelor. Exemple: 1) S se selecteze cmpurile CODD, CODP, CODC, precum i CANT*PRET denumit ca valoare total, din tabela COMENZI, pentru toate nregistrrile al cror cod de depozit este 100000. SQL> SELECT CODD, CODP, CODC, CANT*PRET 2 FROM COMENZI, DEPOZITE 3 WHERE CODD=100000 ;
CODD 100000 100000 100000 100000 CODP 13333 14444 16666 22222 CODC 121111 121111 121111 121111 VALOARE TOTAL 320000 27000 375000 282000

4 records selected 2) S se selecteze codurile produselor i data pn la care preurile sunt admise, pentru produsele din tabela COMENZI care au preul negociat mai mare dect preul mediu stabilit. SQL> SELECT DISTINCT PRETURI.CODP, DATASF 2 FROM PRETURI, COMENZI 3 WHERE COMENZI.PRET > PRETMIN+PRETMAX)/2
CODP 14444 11111 12222 16666 13333 DATASF 01-NOV-05 30-AUG-05 30-SEP-05 01-NOV-05 01-GCT-05

5 records selected. 3) S se afieze numele, marca, raportul VENS/SALA i veniturile totale pentru efii de depozite. Ordonarea datelor s fie fcut cresctor dup valorile raportului menionat. SQL> SELECT NUME, MARCA, VENS/SALA, VENS+SALA

2 3 4
NUME FRINCU ION DORU DAN COMAN RADU VLAD VASILE

FROM SALARIATI WHERE FUNCT='SEF DEP' ORDER BY VENS/SALA DESC ;


MARCA 2550 3755 1000 2500 VENS/SALA 1.0277777777777778 .15068493150684932 .07142857142857143 .0410958904109589 VENS+SALA 73000 42000 37500 38000

4 records selected 4) S se selecteze numele, codul depozitului, venitul total lunar i anual prognozat din tabela SALARIAI, pentru vnztori. Ordonarea s fie fcut cresctor dup valorile cmpului NUME. SQL> SELECT NUME,CODD, SALA+VENS, (SALA+VENS)*12 2 FROM SALARIAI 3 WHERE FUNCT='VNZATOR' 4 ORDER BY NUME;
NUME ALEXE IOAN AVRAM ION BARBU DAN CARMEN ANCA DAN ION MANU DAN RADU IOANA SANDU ION VLAD ION CODD 160000 100000 120000 130000 160000 160000 130000 130000 120000 SALA+VENS 26500 22200 22750 26500 24850 30000 23750 25600 28560 (SALA+VENS)*12 318000 266400 273000 318000 298200 360000 285000 307200 342720

9 records selected O expresie aritmetic n care un operand este nul (valoarea NULL) are o valoare nul (NULL). De aceea, de multe ori, construirea corect a expresiilor aritmetice presupune transformarea valorii NULL ntr-o alt valoare, eventual nul fa de operaia aritmetic (cum ar fi, de exemplu, zero la adunare, unu la nmulire etc.). Se presupune c n cmpul VENS s-au introdus i valori NULL. Pentru astfel de valori, expresia SALA+VENS are valoarea NULL, indiferent ce valoare are SALA, ceea ce matematic nu este corect. De aceea, pentru exemplul anterior, se recomand ca valoarea NULL a cmpului VENS s fie transformat n zero (fiind o sum) naintea evalurii expresiei aritmetice.

Exemple: 1) S se selecteze coloanele NUME, MARCA, VENS, SALA+VENS din tabela SALARIAI, n condiiile n care codul superiorului este 1000. SQL> SELECT NUME, MARCA,VENS, SALA+VENS 2 FROM SALARIATI 3 WHERE CODS= 1000 ;
NUME MARCA AVRAM ION 1111 BARBU DAN 1222 COMAN RADU 1000 VLAD ION 2650 VENS 1000 2000 2500 SALA+VENS 22200 22750 36000

Deoarece venitul suplimentar al salariatului VLAD ION este NULL, venitul lui total (SALA+VENS) a rezultat tot NULL. Utiliznd funcia NVL, ca n exemplul de mai jos, VENITUL_TOTAL este acum calculat corect (pentru toi salariaii). SQL> SELECT NUME, 2 SALA+NVL(VENS,0) VENIT_TOTAL 3 FROM SALARIAI 4 ORDER BY NUME ;
NUME ALEXE IOAN AVRAM ION BARBU DAN CARMEN ANCA COMAN RADU DAN ION DORU DAN FRINCU ION MANU DAN RADU IOANA SANDU ION VLAD ION VLAD VASILE VENIT_TOTAL 25700 22200 22750 26500 35000 24850 42000 73000 30000 23750 25600 28560 38000

13 records selected. n capul de tabel, rezultat n urma cererilor, apar numele coloanelor din baza de date. n locul acestora pot fi afiate etichete de coloan declarate n comenzile de definire a tabelelor. Sintaxa de declarare este: SELECT coloana1 nume-etichet1, coloana2 nume-etichet2, ;

Notaiile pentru coloane cu etichete au fost utilizate i n exemplele anterioare, cum ar fi cele pentru Diferena, Valoare Total sau Diferen MIN sau MAX etc. Exemplu: S se selecteze denumirea depozitelor, codul acestora i numrul de salariai ce i desfoar activitatea n cadrul lor, ordonate cresctor dup denumire. SQL> SELECT DEND PROFILUL, 2 CODD CODUL, 3 NRSAL NUMR DE SALARIAI 4 FROM DEPOZITE 5 ORDER BY DEND;
PROFILUL ALIMENTAR AUTO MOBILA SPORT TEXTILE CODUL 120000 130000 100000 160000 140000 NUMR DE SALARIAI 11 5 3 4 7

Funciile aritmetice sunt utilizate n cererile de selecie. Exemple: 1) S se afieze codul, denumirea i cantitatea - ridicat la ptrat, pentru produsele cu unitatea de msur BUC. SQL> SELECT CODP, CODUL, 2 DENP, DENUMIRE, 3 POWER (CANT,2) CANT_PATRAT 4 FROM PRODUSE 5 WHERE UM='BUC 6 ORDER BY CODP ;
CODUL 14444 11111 12222 13333 DENUMIRE CANT_PATRAT SCAUN D4 1296 MESE 15/20 49 FOTOLIU A3 144 CANAPEA A7 36

4 records selected. 2) S se selecteze n modul distinct cmpurile CODP, DENP, CODC.DENC i s se calculeze cmpul [(CANT*PRET)/2], rotunjit la dou zecimale. SQL> SELECT DISTINCT 2 COMENZI.CODP, DENP, 3 COMENZI.CODC, DENC,

4 ROTUNJIRE 5 6 7
CODP 13333 16666 14444

ROUND ( (COMENZI.CANT*COMENZI.PRET)/2,2 ) FROM COMENZI, CLIENTI, PRODUSE WHERE COMENZI.CODP = PRODUSE.CODP AND COMENZI.CODC = CLIENTI.CODC;
DENP CANAPEA A7 PLACAJ 2/2 SCAUN D4 CODC 121111 121111 121111 DENC UNIT-2 UNIT-2 UNIT-2 ROTUNJIRE 160000 187500 13500

3 records selected. Funciile caracter opereaz asupra irurilor de caractere. Ele se utilizeaz pentru transformarea literelor mari n mici sau invers, extragerea unui subir dintr-un ir, ncepnd cu o anumit poziie, selectarea cuvintelor care se pronun asemntor cu un ir dat etc. Exemple: 1) S se afieze o situaie final prin care s fie redate cmpurile NUME i MARCA angajatului, reunite ntr-un cmp comun denumit INFORMAIE, iar cmpul venituri totale anuale s fie denumit VENIT_ANUAL. Selecia este cerut pentru angajaii cu codul superiorului egal cu 1000. SQL>SELECT NUME || - || MARCA INFORMAIE 2 (SALA+VENS)*12 VENIT_ANUAL 3 FROM SALARIAI 4 WHERE CODS =1000;
INFORMAIE AVRAM ION - 1111 BARBU DAN - 1222 COMAN RADU - 1000 VLAD ION - 2650 VENIT_ANUAL 266400 273000 450000 342720

4 records selected. 2) S se selecteze cmpurile NUME i FUNCT din tabela SALARIAI i s se atribuie un cod de clasificare fiecrei funcii. Codul este format dintr-o singur cifr i are valorile: 1 pentru vnztor, 2 pentru director, 3 pentru restul funciilor. SQL> SELECT NUME, FUNCT, 2 DECODE(FUNCT, VNZATOR,l ,DIRECTOR,2,3) 3 CLASIFIC_FUNCT 4 FROM SALARIAI 5 ORDER BY FUNCT, NUME ;
NUME FUNCT CLASIFIC_FUNCT

COMAN RADU DORU DAN FRINCU ION VLAD VASILE ALEXE IOAN AVRAM ION BARBU DAN CARMEN ANCA DAN ION MANU DAN RADU IOANA SANDU ION VLAD ION

SEF DEP SEF DEP SEF DEP SEF DEP VNZATOR VNZATOR VNZATOR VNZATOR VNZATOR VNZATOR VNZATOR VNZATOR VNZATOR

3 3 3 3 1 1 1 1 1 1 1 1 1

13 records selected 3) S se afieze salariul i veniturile suplimentare ale tuturor angajailor, cu specificarea numelui numai pentru salariaii vnztori. Pentru restul angajailor s se afieze mesajul: *** Nu intereseaz ***. Ordonarea s se fac dup funcie, n mod descresctor. SQL> SELECT DECODE 2 ( 3 FUNCT,VNZATOR, NUME, ***Nu intereseaz*** 4 ) NUMELE, 5 SALA, NVL (VENS, 0) 6 FROM SALARIAI 7 ORDER BY FUNCT DESC;
NUMELE AVRAM ION BARBU DAN DAN ION MANU DAN VLAD ION SANDU ION CARMEN ANCA RADU IOANA ALEXE IOAN *** Nu intereseaz *** *** Nu intereseaz *** *** Nu intereseaz *** *** Nu intereseaz *** SALA 21200 20750 24500 27500 25060 25600 26500 20750 25700 35000 36500 36000 36500 VENS 1000 2000 350 2500 3500 0 0 3000 0 2500 1500 37000 5500

13 records selected. 4) S se afieze primele 5 caractere din NUME, MARCA i primul caracter din funcie, pentru toi angajaii. SQL> SELECT SUBSTR (NUME, l, 5) 5_din_Nume, 2 MARCA, Marca_Sal, 3 SUBSTR (FUNCT, 1, 1) 1_din_Funcie 4 FROM SALARIAI;

5_din_Nume AVRAM BARBU COMAN DAN I VLAD MANU FRINC VLAD DORU SANDU CARME RADU ALEXE

Marca_Sal 1111 1222 1000 3500 2500 3700 2550 2650 3755 3760 3770 1680 3755

1_din_Funcie V V S V S V S V S V V V V

13 records selected. 5) S se selecteze i afieze numele, funcia i salariul total pentru toi angajaii care au numele terminat cu litera N. Situaia trebuie aib urmtoarea form: Persoana_cu_Funcia SALA+VENS NUME SALARIAT - funcie SQL> SELECT NUME || - || Persoana_cu_Funcia, 2 SALA+VENS SAL_TOTAL 3 FROM SALARIAI 4 WHERE 5 UPPER (NUME) LIKE %N
Persoana_cu_Funcia AVRAM ION-vnztor BARBU DAN- vnztor DAN ION- vnztor MNU DAN- vnztor FRINCUION-sefdep VLAD ION- vnztor DORUDAN-sefdep SANDU ION- vnztor ALEXE lOAN-vnzator SAL_TOTAL 22200 22750 24850 30000 73000 28560 42000 25600

LOWER

(FUNCT)

5) S se selecteze cmpurile CODC, DENC, STR i NR din tabela CLIENI, pentru clienii cu cifra 1 pe prima poziie a contului lor. SQL> SELECT CODC, DENC, STR, NR 2 FROM CLIENI WHERE 3 INSTR (CONT,'1',1)=1 ;
CODC 121111 211111 DENC UNIT-1 UNIT-2 STR Moilor Dorobani NR 104 18

6) S se afieaze numele i marca acelor angajai al cror nume se pronun asemntor cu DORU DAN. SQL> SELECT NUME, MARCA 2 FROM SALARIAI 3 WHERE SOUNDEX (NUME) = SOUNDEX (DORU DAN) ;
NUME DORU DAN DORU DANIEL MARCA 3755 5565

2 records selected. 7) S se selecteze din tabela SALARIAI coloanele NUME i MARCA, pentru angajaii a cror funcie este asemntoare fonetic cu irul de caractere: 'vnztor'. SQL> SELECT NUME, MARCA 2 FROM SALARIAI 3 WHERE SOUNDEX (FUNCT)= SOUNDEX (VNZATOR)
NUME AVRAM ION BARBU DAN DAN ION MANU DAN MARCA 1111 1222 3500 3700

4 records selected. 8) S se selecteze constanta NUMELE SI CODUL CLIENILOR: i valorile cmpurilor DENC, CODC pentru clienii din strada Calea Moilor i cu un cod mai mare ca 100000. SQL> SELECT "NUMELE SI CODUL CLIENILOR:" , 2 DENC, CODC 3 FROM CLIENI 4 WHERE STR LIKE MOILOR% 5 AND CODC> 100000 ;
NUMELE I CODUL CLIENILOR: NUMELE I CODUL CLIENILOR: DENC UNIT-2 CODC 121111

Pentru afiarea cmpurilor de tip dat calendaristic sau pentru calcule n care sunt implicate aceste cmpuri, exist funcii specifice. Exemple: 1) S se selecteze n modul distinct codurile i denumirile produselor, precum i a datei pn la care preurile actuale sunt admise. Ordonarea s se fac cresctor dup valorile cimpului CODP. SQL> SELECT DISTINCT PRODUSE.CODP,

2 3 4 5
CODP 11111 12222 13333 15555 16668 14444

PRODUSE.DENP.DATASF FROM PRETURI,PRODUSE WHERE PRODUSE.CODP=PRETURI.CODP ORDER BY PRETURI.CODP ;


DENP MESE 15/20 FOTOLIU A3 CANAPEA A7 BIROU C6X4 PLACAJ 2/2 SCAUN D4 DATASF 30-AUG-05 30-SEP-05 01-OCT-05 01-OCT-05 01-NOV-05 01-NOV-05

6 records selected. 2) S se selecteze cmpurile CODP i DATASF scriindu-se codul pe un rnd i data pe urmtorul. Data va fi scris sub forma LL/ZZ-AA : Se vor folosi operatorul TRUNC care asigur trecerea la rndul urmtor, funcia TO_CHAR (expr [fmt] ) care efectueaz conversia cmpului dat expr ntr-un ir de caractere n formatul specificat n [fmt]; comanda COLUMN care definete un alt format de afiare a coloanei DATASF. SQL> COLUMN DATASF FORMAT A21 TRUNC SQL> SELECT CODP, 2 TO_CHAR (DATASF, MM/DD-YY) DATASF 3 FROM PRETURI;
CODP 11111 12222 13333 15555 16666 14444 DATASF 08/30-05 09/30-05 10/01-05 10/01-05 11/01-05 11/01-05

6 records selected. 3) S se selecteze coloanele CODP, DATASF la produsele cu codul mai mare ca 13333, afind ziua i luna n litere iar anul cu patru cifre. SQL> COLUMN DATASF FORMAT A26 SQL> SELECT CODP, 2 TO_CHAR (DATASF, DAY MONTH YYYY) DATASFRIT 3 FROM PRETURI 4 WHERE CODP>13333 ;
CODP 15555 16666 14444 DATASFRIT THURSDAY OCTOBER SUNDAY NOVEMBER SUNDAY NOVEMBER 2005 2005 2005

3 records selected 4) S se selecteze CODP, DATASF la produsele cu codul mai mare ca 13333, afind luna n litere i pentru an ultimele dou cifre. SQL> SELECT CODP, 2 TO_CHAR (DATASF, DAY MONTH YY) DATASFRIT 3 FROM PRETURI WHERE CODP> 13333 ;
CODP 15555 16666 14444 DATASFRIT THURSDAY OCTOBER SUNDAY NOVEMBER SUNDAY NOVEMBER 05 05 05

3 records selected 5) S se selecteze coloanele CODP, DATASF la produsele cu codul mai mare ca 13333, afind ziua n cifre, luna n litere i anul cu patru cifre. SQL> SELECT CODP, 2 TO_CHAR (DATASF, DD MONTH YYYY) DATASFRIT 3 FROM PRETURI 4 WHERE CODP> 13333 ;
CODP 15555 16666 14444 DATASFRIT 01 OCTOBER 01 NOVEMBER 01 NOVEMBER 2005 2005 2005

3 records selected 6) S se selecteze coloanele CODP, DATASF la produsele cu codul mai mare ca 13333, afind primele trei litere de la zi, luna n litere i anul cu patru cifre. SQL> SELECT CODP, 2 TO_CHAR (DATASF, DY MONTH YYYY) DATASFRIT 3 FROM PRETURI 4 WHERE CODP> 13333 ;
CODP 15555 16666 14444 DATASFRIT THU OCTOBER SUN NOVEMBER SUN NOVEMBER 2005 2005 2005

3 records selected 7) S se selecteze cmpurile CODP, DATASF la produsele cu codul mai mare ca 13333, afind ziua n litere, luna n cifre i anul cu patru cifre.

SQL>SELECT CODP, 2 TO_CHAR (DATASF, DATASFRIT 3 FROM PRETURI 4 WHERE CODP> 13333 ;
CODP 15555 16668 14444 DATASFRIT THURSDAY 10 2005 SUNDAY 11 2005 SUNDAY 11 2005

DAY

MM

YYYY)

3 records selected. 8) S se selecteze cmpurile CODP, DATASF la produsele cu codul mai mare ca 13333, afind primele trei litere pentru zi i lun i ultimele dou cifre de la an. SQL>SELECT CODP, 2 TO_CHAR (DATASF, DY-MON-YY) DATASFRIT 3 FROM PRETURI 4 WHERE CODP>13333 ;
CODP 15555 16666 14444 DATASFRIT THU-OCT-05 SUN-NOV-05 SUN-NOV-05

3 records selected. 9) S se selecteze cmpurile CODP, DATASF pentru produsele cu codul mai mare dect 13333, afindu-se primele trei litere de la zi, luna n litere i ultimele dou cifre de la an. SQL>SELECT CODP, 2 TO_CHAR (DATASF, DY-MONTH-YY) DATASFRIT 3 FROM PRETURI 4 WHERE CODP>13333 ;
CODP DATA SFRIT 16556 THU-OCTOBER -05 16666 SUN-NOVEMBER -05 14444 SUN-NOVEMBER -05

3 records selected. 10) S se selecteze coloanele CODP, DATASF pentru toate produsele, afind ziua n cifre urmate de sufixul -th, primele trei litere ale lunii i ultimele dou cifre ale anului, desprite prin liniu. SQL>SELECT CODP,

2 TO CHAR DATASFRIT 3 FROM PRETURI ;


CODP 11111 12222 13333 16555 16666 14444 DATASFRIT 30TH-AUG-05 30TH-SEP- 05 01ST-OCT- 05 01ST-OCT- 05 01ST-NOV- 05 01ST-NOV- 05

(DATASF,

DDth-MON-YY)

6 records selected. 11) S se selecteze din tabela PRETURI valorile cmpurilor CODP i DATASF. Data de sfrit (DATASF) s se prezinte nsoit de timpul intern, exprimat n diverse forme de afiare. SQL>SELECT CODP, 2 TO_CHAR (DATASF, DDth-MON-YY HH:MIPM) DATASFRIT 3 FROM PRETURI ;
CODP 11111 12222 13333 15555 16666 14444 DATASFRIT 30TH-AUG-05 30TH-SEP-05 01ST-OCT-05 01ST-OCT-05 01ST-NOV-05 01ST-NOV-05 12:00AM 12:00AM 12:00AM 12:00AM 12:00AM 12:00AM

6 records selected. Sau : SQL> SELECT CODP, 2 TO_CHAR (DATASF, DATASFRIT 3 FROM PRETURI ;
CODP 11111 12222 13333 15555 16666 14444 DATASFRIT 30TH-AUG-05 30TH-SEP-05 01ST-OCT-05 01ST-OCT-05 01ST-NOV-05 01ST-NOV-05 12:00 12:00 12:00 12:00 12:00 12:00

DDth-MON-YY

HH:MI)

6 records selected. 12) S se afieze cmpurile CODP, DATASF i data de sfrit a valabilitii unui pre (considerat la o distan de 90 de zile fa de DATASF).

SQL> SELECT CODP, DATASF, DATASF+90 2. FROM PRETURI;


CODP 11111 12222 13333 15555 16666 14444 DATASF DATASF+90 30-AUG-05 28-NOV-05 30-SEP-05 29-DEC-05 01-OCT-05 30-DEC-05 01-OCT-05 30-DEC-05 01-NOV-05 30-JAN-06 01-NOV-05 30-JAN-06

6 records selected 13) S se selecteze codul produsului, data maxim admis de practicare a unui pre i data curent pentru acele produse care ndeplinesc condiia ca DATASF+10 s fie mai mare dect SYSDATE. SQL>SELECT CODP, DATASF, 2 SYSDATE DATA_CURENT 3 FROM PRETURI 4 WHERE DATASF+10 > SYSDATE ;
CODP 12222 13333 15555 16666 14444 DATASF 30-SEP-05 01-OCT-05 01-OCT-05 01-NOV-05 01-NOV-05 DATA_CURENT 13-SEP-05 13-SEP-05 13-SEP-05 13-SEP-05 13-SEP-05

5 records selected. 14) S se selecteze codul produsului, data de sfrit, data curent, valorile expresiilor TRUNC(DATASF+90) - TRUNC (SYSDATE) i DATASF+90. Selecia s se realizeze pentru produsele cu codul mai mare ca 13333 i data de sfrit plus 90 de zile mai mare dect data curent. SQL>SELECT CODP, DATASF, 2 SYSDATE DATA_CURENTA, 3 TRUNC(DATASF+90)-TRUNC(SYSDATE) DIFERENA 4 DATASF+90 DATA_90 5 FROM PRETURI 6 WHERE DATASF+90 > SYSDATE 7 AND CODP>13333 ;
CODP 15555 16666 14444 DATASF 01-OCT-05 01-NOV-05 01-NOV-05 DATA_CURENTA DIFERENTA DATA_90 02-OCT-05 89 30-DEC-05 02-OCT-05 120 30-JAN-06 02-OCT-05 120 30-JAN-06

3 records selected.

Operaiile de calcul cu data calendaristic sunt posibile n cadrul unei comenzi de selecie. Structura afirii cmpurilor rezultate se poate stabili prin comanda COLUMN. 15) S se selecteze i afieze coloanele CODP, DATASF, RDATE i RSDATE (utiliznd funciile NEXT_DAY i LAST_DAY). SQL>COLUMN DATASF FORMAT A21 SQL>COLUMN RDATE FORMAT A21 SQL>COLUMN RSDATE FORMAT A20 SQL>SELECT CODP, TO_CHAR (DATASF, DAY MON - YY) DATASFRIT TO_CHAR (NEXT_DAY (DATASF+90, VINERI), DAY MON - YY) RDATE TO_CHAR (LAST_DAY (DATASF+90), DAY MON YY) RSDATE FROM PREURI ;
CODP 11111 12222 DATASF WEDNESDAY AUG-05 FRIDAY SEP-05 RDATE VINERI NOV-05 VINERI DEC-05 RSDATE WEDNESDAY NOV-05 SATURDAY DEC-05

2 records selected O operaie posibil de realizat este i cea de a aduna algebric un numr de luni la o dat calendaristic: funcia ADD_MONTHS (d,n), care adun n luni la data d. 16) S se afieze codul produsului, data de sfrit i a unui nou termen de valabilitate a unui pre dat, calculat prin adugarea a trei luni. S se selecteze doar produsele al cror cod este mai mic dect 13333, iar data de sfrit este mai mare dect data curent plus trei luni. SQL>SELECT CODP, DATASF, 2 ADD_MONTHS (DATASF,3) RDATE 3 FROM PRETURI 4 WHERE 5 DATASF > SYSDATE+90 6 AND CODP<13333 ;
CODP 11111 12222 DATASF 30-AUG-05 30-SEP-05 RDATE 30-NOV-05 30-DEC-05

2 records selected

17) S se selecteze codul, denumirea produselor i data de sfrit, pentru acele produse care ndeplinesc urmtoarele condiii: data de sfrit este cuprins n intervalul: 30/Aug/05 - l/Oct/05; preurile sunt mai mari ca 30.000 u.m.. Datele s se ordoneze cresctor dup codul produsului. SQL>SELECT DISTINCT PRODUSE.CODP, DENP, DATASF 2 FROM PRETURI, PRODUSE 3 WHERE 4 DATASF BETWEEN 30-AUG-05 AND 01-OCT-05 5 AND PRET > 30000 6 AND PRODUSE.CODP=PRETURI.CODP 7 ORDER BY PRODUSE.CODP ;
CODP 12222 13333 15555 DENP FOTOLIU A3 CANAPEA A7 BIROU C6X4 DATASF 30-SEP-05 01-OCT-05 01-OCT-05

3 records selected 6.8.Utilizarea funciilor de grupare i a clauzei GROUP BY n selectarea datelor Rezultatele obinute n urma selectrilor pot fi grupate cu ajutorul clauzei GROUP BY. Secvena utilizat pentru aceast operaie este: SELECT GROUP BY tabel.coloana1, tabel.coloan2, HAVING condiie ; Prin parcurgerea secvenei se obine cte un rnd pentru nregistrrile care au aceleai valori n coloanele specificate n clauza GROUP BY. Prezena clauzei HAVING determin obinerea acelor grupuri care ndeplinesc condiiile specificate. Este de reinut faptul c GROUP BY i HAVING trebuie s fie declarate dup clauzele WHERE, CONNECT BY i START WITH, n cazul cnd acestea exist n comand. Exemple: 1) S se selecteze din tabela PRETURI valorile din coloana DATASF i s se contorizeze numrul apariiilor acestora.

SQL> SELECT TO_CHAR (DATASF, DATA - DD MON YYYY) 2 DATA_MAXIMA, 3 COUNT (*) NUMAR_PRODUSE 4 FROM PRETURI 5 GROUP BY TO_CHAR (DATASF, DATA - DD MON YYYY);
DATA MAXIMA DATA - 01 NOV 2005 DATA - 01 OCT 2005 DATA - 30 AUG 2005 DATA - 30 SEP 2005 NUMAR_PRODUSE 2 2 1 1

2) S se selecteze i afieze valoarea medie zilnic a comenzilor ce trebuie onorate n perioada 01-30 Iulie 2005 SQL> SELECT AVG (CANT*PRET) MEDIA 2 FROM COMENZI 3 WHERE 4 DATAL >01-JUL-05AND DATAL < 30-JUL-05 ;
MEDIA 25100

3) S se afieze valoarea total a salariilor i veniturilor suplimentare pentru salariaii cu funcia vnzator. SQL> SELECT SUM (SALA) TOTAL_SAL , 2 SUM (VENS) TOTAL_VEN 3 FROM SALARIAI 4 WHERE FUNCT = VNZATOR;
TOTAL_SAL TOTAL_VEN 268560 14750

4) S se afieze media anual a veniturilor totale (SALA+VENS) pentru salariaii cu funcia vnztor. SQL> SELECT AVG (SALA+VENS)*12 MEDIA_ANUALA FROM SALARIAI WHERE FUNCT=VNZATOR;
MEDIA_ANUALA 308147

5) S se afieze valoarea maxim i minim a salariului precum i diferena max-min. Selecia se face din tabela SALARIAI.

SQL> SELECT MAX (SALA) MAX_SAL, 2 MIN (SALA) MIN_SAL, 3 MAX (SALA)-MIN (SALA) DIF_MAX_MIN 4 FROM SALARIAI ;
MAX_SAL 45000 MIN_SAL 24250 DIF_MAX_MIN 25750

6) S se determine lungimea maxim a irurilor de caractere din coloana DENP a tabelei PRODUSE. SQL>SELECT MAX (LENGTH (DENP)) LUNG_MAX_DENP 2 FROM PRODUSE ;
LUNG_MAX_DENP 10

7) S se selecteze coloanele NUME, PUNCT, SALA+VENS din tabela SALARIAI pentru angajaii care au salariul egal cu salariul maxim. SQL> SELECT NUME, FUNCT, SALA+VENS 2 FROM SALARIAI 3 WHERE SALA = 4 (SELECT MAX (SALA) FROM SALARIAI) ;
NUME ION ION FUNCT DIRECTOR SALA+VENS 85000

1 record selected 8) S se selecteze coloanele DENP, CODP, CODD din tabela PRODUSE pentru care stocul existent este mai mare sau egal cu cantitatea comandat. SQL> SELECT DENP, CODP, CODD 2 FROM PRODUSE 3 WHERE STOC >= 4 (SELECT SUM (CANT) FROM COMENZI );
DENP PLACAJ 2/2 SCAUN D4 CANAPEA A7 CODP 166666 144444 133333 CODD 100000 100000 100000

9) S se afieze numrul de valori nenule nregistrate n coloana VENS din tabela SALARIAI. SQL> SELECT COUNT (VENS) 2 FROM SALARIAI ;
COUNT (VENS) 11

10) S se selecteze din tabela SALARIAI coloanele NUME, FUNCT, SALA+VENS pentru efii de depozite care au salariul mai mare sau egal cu jumtate din salariul maxim. SQL>SELECT NUME, FUNCT, SALA+NVL (VENS,0) 2 FROM SALARIAI 3 WHERE SALA >= 4 (SELECT MAX (SALA)/2 FROM SALARIAI) 5 AND FUNCT= SEF DEP ;
NUME FUNCT COMAN RADU SEF DEP VLAD VASILE SEF DEP FRINCU ION SEF DEP DORU DAN SEF DEP PAUL STEFAN SEF DEP SALA+NVL(VENS,0) 37500 38000 73000 42000 40600

11) S se afieze numrul de produse distincte care au ca unitate de msur BUC SQL>SELECT COUNT(DISTINCT CODP) NR_PROD 2 FROM PRODUSE 3 WHERE UM = BUC;
NR_PROD 5

12) S se afieze numrul de subordonai ai salariatului cu marca 2500. SQL> SELECT COUNT(*) NR_SUBORD FROM SALARIAI WHERE CODS=2500;
NR_SUBORD 3

13) S se afieze valoarea medie a salariilor i valoare medie a veniturilor suplimentare pentru fiecare depozit fie utiliznd comanda SELECT de mai multe ori, fie clauza GROUP BY o singur dat. Folosind comanda SELECT: Pentru salariaii depozitului 100000 (codd=100000) SQL> SELECT AVG(SALA), AVG(VENS) FROM SALARIAI WHERE CODD = 100000;
AVG(SALA) AVG(VENS)

33100

20500

Pentru salariaii depozitului 120000 (codd=120000) SQL>SELECT AVG(SALA), AVG(VENS) 2 FROM SALARIAI 3 WHERE CODD = 120000;
AVG(SALA) 2402.5 AVG(VENS) 1975

Pentru salariaii depozitului 130000 (codd=130000) SQL> SELECT AVG(SALA), AVG(VENS) 2 FROM SALARIAI 3 WHERE CODD = 130000;
AVG(SALA) 28870 AVG(VENS) 2750

Pentru salariaii depozitului 160000 (codd=160000) SQL> SELECT AVG(SALA), AVG(VENS) 2 FROM SALARIAI 3 WHERE CODD = 160000;
AVG(SALA) 30866.7 AVG(VENS) 9390

Folosind clauza GROUP BY: SQL> SELECT CODD, AVG(SALA), AVG(VENS) 2 FROM SALARIAI 3 WHERE CODD = 160000; 4 GROUP BY CODD ;
CODD 100000 120000 130000 160000 AVG(SALA) 33100 24202.5 28870 30866 AVG(VENS) 20500 1975 2750 9390

14) S se calculeze media salariului pentru fiecare grup de angajai care au acelai superior. SQL> SELECT CODS, AVG(SALA) 2 FROM SALARIAI 3 GROUP BY CODS ;

CODS 1000 2500 2550 3755 4000 7000 8000

AVG (SALA) 22336.7 27083,3 25500 26600 26050 35750 4500

15) S se calculeze media salariului anual prognozat pentru salariaii care au acelai superior i nu au funcia de ef depozit. SQL> SELECT CODS,AVG(SALA)*12 MEDIE_SAL_ANUAL 2 FROM SALARIAI 3 WHERE FUNCT NOT IN ('SEF DEP') 4 GROUP BY CODS ;
CODS 1000 2500 2550 3755 4000 8000 MEDIE_SAL_ANUAL 268040 271500 306000 319200 312600 540000

16) S se calculeze i afieze valoarea medie a comenzilor pentru fiecare depozit. SQL> SELECT AVG (CANT*PRET) VAL_MEDIE, 2 DEPOZITE.CODD COD_DEP 3 FROM COMENZI, DEPOZITE 4 WHERE COMENZI.CODD=DEPOZITE.CODD 5 GROUP BY DEPOZITE.CODD ;
VAL_MEDIE 251000 COD_DEP 100000

17) S se calculeze i afieze valoarea medie a comenzilor pe produse. SQL> SELECT AVG (CANT*PRET) VAL_MEDIE, 2 PRODUSE.CODP COD_PROD 3 FROM PRODUSE, COMENZI 4 WHERE COMENZI.CODP=PRODUSE.CODP 5 GROUP BY PRODUSE.CODP ;
VAL_MEDIE 320000 27000 375000 COD_PROD 133333 144444 166666

18) S se determine media salariului anual pentru fiecare funcie dac exist mai mult de doi salariai angajai pe aceeai funcie. Se vor afia funcia, numrul de salariai cu uncia respectiv i media calculat. SQL> SELECT FUNCT FUNCIE, 2 COUNT(*) NR_SAL, 3 AVG(SALA)*12 MEDIE_SAL 4 FROM SALARIAI 5 GROUP BY FUNCT 6 HAVING COUNT(*)>2 ;
FUNCIE SEF DEP VNZATOR NR_SAL 5 11 MEDIE_SAL 429600 292975

2 records selected. 19) S se selecteze codurile superiorilor (CODS) care au doi sau mai muli subordonai. SQL> SELECT CODS 2 FROM SAIARIATI 3 WHERE FUNCT=VNZATOR 4 GROUP BY CODS 5 HAVING COUNT(*)>=2 ;
CODS 1000 2500 2550 3755 4000

5 records selected. 20) S se selecteze codurile superiorilor care au media veniturilor suplimentare ale subordonailor mai mare dect 10% din salariul mediu. Se vor afia codurile superiorilor i media veniturilor totale anuale ale subordonailor. SQL> SELECT CODS, 2 AVG (SALA+NVL (VENS,0) )*12 MED_VEN_TOT_AN 3 FROM SALARIAI 4 GROUP BY CODS 5 HAVING AVG (VENS) > AVG (SALA)*0.10;
CODS 2500 7000 8000 MED_VEN_TOT_AN 486400 474300 1020000

21) S se selecteze funciile pentru care salariile medii sunt mai mari dect salariul mediu al unui vnztor. Se vor afia funciile i salariile medii pentru fiecare funcie. SQL> SELECT FUNCT, AVG(SALA) MEDIE_SAL 2 FROM SALARIAI 3 GROUP BY FUNCT 4 HAVING AVG (SALA) > 5 (SELECT AVG(SALA) FROM SALARIAI 6 WHERE FUNCT= VNZATOR );
FUNCT DIRECTOR SEF DEP MEDIE_SAL 45000 35800

22) S se afieze numrul salariailor din depozitul cu codul 100000 i s se determine ci dintre ei au venituri suplimentare. SQL> SELECT COUNT (*) NR_SALARIAI_DEP_100000, 2 COUNT(VENS) NR_SAL_VEN_SUPL 3 FROM SALARIAI 4 WHERE CODS=100000 ;
NR_SALARIAI_DEP_100000 4 NR_SAL_VEN_SUPL 3

23) S se determine numrul salariailor din depozitul cu codul 100000 precum i suma i media veniturilor lor suplimentare. SQL> SELECT SUM (NVL (VENS,0)) SUMA_VEN_SUPL, 2 COUNT (NVL (VENS,0)) NR_SAL, 3 AVG (NVL (VENS,0)) MEDIA_VEN_SUPL 4 FROM SALARIAI 5 WHERE CODS=100000 ;
SUMA_VEN_SUPL 9000 NR_SAL MEDIA_VEN_SUPL 4 2250

24) Pentru a afla numrul de angajai i salariul mediu anual n toate combinaiile posibile de departamente i funcii, se va folosi urmtoarea cerere: SELECT DECODE(GROUPING(nume_dept), Departamentele', nume_dept) AS nume_dept, 1, 'Toate

DECODE(GROUPING(functia), 1, 'Toate Functiile', functia) AS functia, COUNT(*) "Total Angajati", AVG(sal) * 12 "Sal Mediu" FROM ang, dept WHERE dept.nume_dept = emp.nume_dept GROUP BY CUBE (nume_dept, functia);
Nume dept. functia total angajati sal mediu --------------- --------- ---------- ---------- --------------------------------CONTABILITATE FUNCTIONAR 1 15600 CONTABILITATE MANAGER 1 29400 CONTABILITATE PRESEDINTE 1 60000 CONTABILITATE Toate Functiile 3 35000 CERCETARE ANALYST 2 36000 CERCETARE FUNCTIONAR 2 11400 CERCETARE MANAGER 1 35700 CERCETARE Toate Functiile 5 26100 VANZARI FUNCTIONAR 1 11400 VANZARI MANAGER 1 34200 VANZARI VANZATOR 4 16800 VANZARI Toate Functiile 6 18800 Toate Departamentele ANALYST 2 36000 Toate Departamentele FUNCTIONAR 4 12450 Toate Departamentele MANAGER 3 33100 Toate Departamentele PRESEDINTE 1 60000 Toate Departamentele VANZATOR 4 16800 Toate Departamentele Toate Functiile 14 24878.5714

6.9. Operaii pe tabele structurate arborescent Limbajul SQL*Plus permite explorarea structurilor arborescente existente n baza de date. Operaia se realizeaz cu ajutorul clauzelor START WITH i CONNECT BY din comanda SELECT. SELECT FROM CONNECT BY [PRIOR] col1 = [PRIOR] col2 START WITH col = valoare ;

Exemple: 1) S se afieze cmpurile NUME, FUNCT, CODS, MARCA din tabela SALARIAI. Datele s fie ordonate cresctor dup codul superiorului. SQL>SELECT NUME, FUNCT, CODS, MARCA FROM SALARIATI ORDER BY CODS;
NUME AVRAM ION BARBU DAN COMAN RADU VLAD ION AILENEI FLORIN DAN ION DARIAN GEO FRINCU ION RADU ION VLAD VASILE ALEXE IOAN MANU DAN DORU DAN CARMEN ANCA PAUL TEFAN SANDU ION ION ION FUNCT VNZTOR VNZTOR SEF DEP VNZTOR VNZTOR VNZTOR VNZTOR SEF DEP VNZTOR SEF DEP VNZTOR VNZTOR SEF DEP VNZTOR SEF DEP VNZTOR DIRECTOR CODS 1000 1000 7000 1000 2500 2500 2500 2500 2500 7000 3755 3755 7000 4000 7000 4000 7000 MARCA 1111 1222 1000 2650 2553 3500 2554 2550 1680 2500 3759 3700 3755 3770 4000 3760 7000

2) S se selecteze NUMELE, MARCA, codul superiorului i codul depozitului pentru subordonaii direci i indireci ai salariatului cu numele DORU DAN. SQL> SELECT NUME, MARCA, CODS, CODD 2 FROM SALARIATI 3 CONNECT BY PRIOR MARCA = CODS 4 START WITH NUME = DORU DAN;
NUME DORU DAN MANU DAN ALEXE IOAN MARCA 3755 3700 3759 CODS 7000 3755 3755 CODD 130000 160000 160000

3 records selected 3) S se afieze cmpurile MARCA, NUME, FUNCT, CODS, CODD din tabela SALARIAI, ordonate cresctor dup marca i codul superiorului, pentru subordonaii direci i indireci ai salariatului cu numele VLAD VASILE. SQL> SELECT MARCA, NUME, FUNCT, CODS, CODD 2 FROM SALARIATI 3 CONNECT BY PRIOR MARCA = CODS 4 START WITH NUME = VLAD VASILE

5 ORDER BY MARCA, CODS;


MARCA 1680 2500 2550 2553 2554 2556 7000 NUME RADU ION VLAD VASILE FRINCU ION AILENEI FLORIN DARIAN GEOR DAN ION ION ION FUNCT VNZTOR SEF DEP SEF DEP VNZTOR VNZTOR VNZTOR DIRECTOR CODS 2500 7000 2500 2550 2550 2500 7000 CODD 2553 3500 2554 2550 2500 2500 7000

7 records selected. 4) S se afieze cmpurile MARCA, NUME, FUNCT, CODS, CODD din. tabela SALARIAI, ordonate cresctor dup marca. SQL> SELECT MARCA,NUME,FUNCT,CODS,CODD 2 FROM SALARIAI 3 ORDER BY MARCA;
MARCA 1000 1111 1222 1680 2500 2550 2553 2554 2650 3500 3700 3755 3759 3760 3770 4000 7000 NUME COMAN RADU AVRAM ION BARBU DAN RADU ION VLAD VASILE FRINCU ION AILENEI FLORIN DARIAN GEO VLAD ION DAN ION MNU DAN DORU DAN ALEXE IOAN SANDU ION CARMEN ANA PAUL TEFAN ION ION FUNCT SEF DEP VINZATOR VINZATOR VINZATOR SEF DEP SEF DEP VINZATOR VINZATOR VINZATOR VINZATOR VINZATOR SEF DEP VINZATOR VINZATOR VINZATOR SEF DEP DIRECTOR CODS 7000 1000 1000 2500 7000 2500 2550 2550 1000 2500 3755 7000 3755 4000 4000 7000 7000 CODD 130000 100000 120000 130000 160000 160000 120000 120000 120000 120000 160000 130000 160000 130000 130000 160000 100000

17 records selected. 5) S se selecteze numele, marca, codul superiorului, codul depozitului pentru subordonaii direci i indireci ai salariatului cu numele DORU DAN. SQL> SELECT NUME,MARCA,CODS,CODD 2 FROM SALARIAI 3 CONNECT BY PRIOR MARCA=CODS 4 START WITH NUME='DORU DAN';
NUME DORU DAN MARCA 3755 CODS 7000 CODD 130000

MNU DAN 3700 ALEXE IOAN 3759

3755 3755

160000 160000

3 records selected. 6) S se afieze MARCA, NUME, FUNCT, CODS i CODD ordonate cresctor dup marc i cod superior pentru subordonaii direci i indireci ai salariatului cu numele VLAD VASILE. SQL> SELECT MARCA,NUMEJFUNCT,CODS,CODD 2 FROM SALARIAI 3 CONNECT BY PRIOR MARCA=CODS 4 START WITH NUME='VLAD VASILE' 5 ORDER BY MARCA.CODS
MARCA 1680 2500 2550 2553 2554 3500 NUME RADU ION VLAD VASILE FRINCU ION AILENEI FLORIN DARIAN GEO DAN ION FUNCT VINZATOR SEF DEP SEF DEP VINZATOR VINZATOR VINZATOR CODS 2500 7000 2500 2550 2550 2500 CODD 130000 160000 160000 120000 120000 160000

6 records selected. 7) S se afieze cmpurile NUME i MARCA pentru subordonaii direci i indireci ai salariatului ION ION precum i nivelul lor de subordonare. SQL> SELECT LEVELJWME.MARCA 2 FROM SALARIAI 3 CONNEOT BY PRIOR MARCA=CODS 4 START WITH NUME='ION ION';
LEVEL 1 2 3 3 3 2 3 4 4 3 3 2 3 3 2 3 3 NUME ION ION COMAN RADU AVRAM ION BARBU DAN VLAD ION VLAD VASILE FRINCU ION AILENEI FLORIN DARIAN GEO RADU ION DAN ION DORU DAN MNU DAN ALEXE IOAN PAUL TEFAN SANDU ION CARMEN ANA MARCA 7000 1000 1111 1222 2650 2500 2550 2553 2554 1680 3500 3755 3700 3759 4000 3760 3770

8) S se selecteze cmpurile LEVEL, NUME i MARCA apartinnd subordonailor lui ION ION. Nivelul de subordonare va fi pus n eviden i prin afiarea deplasat a numelor salariailor subordonai fa de numele superiorului corespunztor. SQL> COLUMN ORG.CHART FORMAT A21 SQL> SELECT LEVEL, 2 LPADC ( ,LEVEL*2) || NUME NUME_SI_PRENUME, 3 MARCA 4 FROM SALARIAI 5 CONNECTBY PRIOR MARCA=CODS 6 START WITH NUME='ION ION;
LEVEL 1 2 3 3 3 2 3 4 4 3 3 2 3 3 2 3 3 NUME.SI.PRENUME ION ION COMAN RADU AVRAM ION BARBU DAN VLAD ION VLAD VASILE FRINCU ION AILENEI FLORIN DARIAN GEO RADU ION DAN ION DORU DAN MNU DAN ALEXEIOAN PAUL TEFAN SANDU ION CARMEN ANA MARCA 7000 1000 1111 1222 2650 2500 2550 2553 2554 1680 3500 3755 3700 3759 4000 3760 3770

17 records selected. 9) S se afieze cmpurile LEVEL, NUME, MARCA apartinnd subordonailor salariailor PAUL TEFAN i COMAN RADU, punnd n eviden, prin scriere decalat, modul de subordonare. SQL> SELECT LEVEL, LPAD( ','LEVEL*2) || NUME 3 NUME_SI_PRENUME,MARCA 4 FROM SALARIAI 5 CONNECT BY PRIOR MARCA=CODS 6START WITH NUME='PAUL TEFAN 7 OR NUME='COMAN RADU
LEVEL 1 2 2 2 NUME COMAN RADU AVRAM ION BARBU DAN VLAD ION MARCA 1000 1111 1222 2650

1 2 2

PAUL TEFAN SANDU ION CARMEN ANA

4000 3760 3770

7 records selected.
10) S se afieze cmpurile LEVEL, NUME i MARCA, in structur arborescent, apartinnd salariailor din subordinea celor cu aceeai funcie cu a salariatului COMAN RADU.

SQL> SELECT LEVEL,LPADC ',LEVEL*2) || NUME 2 NUME_SI_PRENUME, MARCA 3 FROM SALARIAI 4 CONNECT BY PRIOR MARCA=CODS 5 START WITH FUNCT IN 6 (SELECT FUNCT FROM SALARIAI 7 WHERE NUMEsCOMAN RADU);
LEVEL 2 3 3 3 2 3 4 4 3 3 2 3 3 2 3 3 NUME_SI_PRENUME COMAN RADU AVRAM ION BARBU DAN VLAD ION VLAD VASILE FR1NCU ION AILENEI FLORIN DARIAN GEO RADU ION DAN ION DORU DAN MNU DAN ALEXEIOAN PAUL TEFAN SANDU ION CARMEN ANA MARCA 1000 1111 1222 2650 2500 2550 2553 2554 1680 3500 3755 3700 3759 4000 3760 3770

11) S se selecteze cmpurile LEVEL, NUME, MARCA, FUNCT, CODD aparinnd subordonailor angajailor care lucreaz n acelai depozit cu RADU ION. SQL> SELECT LEVEL, 2 LPADC (` `,LEVEL*2) || NUME 3 NUME_SI_PRENUME, 4 MARCA,FUNCT,CODD 5 FROM SALARIAI 6 CONNECT BY PRIOR MARCA=CODS 7 START WITH CODD IN 8 (SELECT CODD 9 FROM SALARIAI 10 WHERE NUME='RADU ION')

LEVEL 1 1 2 2 2 1 2 2 1 1

NUME_SI_PRENUME RADU ION COMAN RADU AVRAM ION BARBU DAN VLAD ION DORU DAN MNU DAN ALEXE IOAN CARMEN ANA SANDU ION

MARCA 1680 1000 1111 1222 2650 3755 3700 3759 3770 3760

FUNCT VINZATOR SEF DEP VINZATOR VINZATOR VINZATOR SEF DEP VINZATOR VINZATOR VINZATOR VINZATOR

CODD 130000 130000 100000 120000 120000 130000 160000 160000 130000 130000

10 records selected. 12) S se selecteze cmpurile NUME, MARCA, FUNCT, CODD aparinnd superiorilor salariatului VLAD ION. SQL> SELECT NUME,MARCA,CODS,FUNCT,CODD 2 FROM SALARIAI 3 CONNECT BY MARCA=PRIOR CODS 4 START WITH NUME=`VLAD ION`;
NUME VLAD ION COMAN RADU 1000 ION ION MARCA 2650 7000 7000 CODS 1000 SEF 8000 FUNCT VINZATOR DEP DIRECTOR CODD 120000 130000 100000

3 records selected. 13) S se afieze cmpurile NUME, MARCA, FUNCT aparinnd subordonailor salariatului VLAD VASILE, mai puin datele salariatului AILENEI FLORIN. SQL> SELECT NUME,MARCA,FUNCT 2 FROM SALARIATI 3 WHERE NUME !=AILENEI FLORIN 4 CONNECT BY PRIOR MARCA=CODS 5 START WITH NUME='VLAD VASILE';
NUME VLAD VASILE FRINCU ION DARIAN GEO RADU ION DAN ION MARCA 2500 2550 2554 1680 3500 FUNCT SEF DEP SEF DEP VINZATOR VINZATOR VINZATOR

14) S se afieze o serie de date despre subordonaii salariatului ION ION, mai puin datele despre VLAD VASILE i despre salariaii din subordinea lui. SQL> SELECT MARCA,LEVEL,NUME,PUNCT,CODS 2 FROM SALARIAI

3 4 5
MARCA 7000 1000 1111 1222 2650 3755 3700 3759 4000 3760 3770

CONNECT BY PRIOR MARCA=CODS AND NUME <> 'VLAD VASILE' START WITH NUME='ION ION';
LEVEL 1 2 3 3 3 2 3 3 2 3 3 NUME ION ION COMAN RADU AVRAM ION BARBU DAN VLAD ION DORU DAN MNU DAN ALEXE IOAN PAUL TEFAN SANDU ION CARMEN ANA FUNCT DIRECTOR SEF DEP VINZATOR VINZATOR VINZATOR SEF DEP VINZATOR VINZATOR SEF DEP VINZATOR VINZATOR CODS 8000 7000 1000 1000 1000 7000 3755 3755 7000 4000 4000

11 records selected 15) S se afieze o serie de date ale salariailor subordonai lui ION ION, mai puin datele salariailor COMAN RADU i VLAD VASILE precum i ale subordonailor lui VLAD VASILE. SQL> SELECT MARCA,NUME,LEVEL,FUNCT, 2 CODS.CODD 3 FROM SALARIAI 4 WHERE NUME <> 'COMAN RADU' 5 CONNECT BY PRIOR MARCA=CODS 6 AND NUME != 'VLAD VASILE' 7 START WITH NUME='ION ION'
MARCA 7000 1111 1222 2650 3755 3700 3759 4000 3760 3770 NUME ION ION AVRAM ION BARBU DAN VLAD ION DORU DAN MNU DAN ALEXE IOAN PAUL TEFAN SANDU ION CARMEN ANA LEVEL 1DIRECTOR 3 VINZATOR 3 VINZATOR 3 VINZATOR 2 SEF DEP 3 VINZATOR 3 VINZATOR 2 SEF DEP 3 VINZATOR 3 VINZATOR FUNCT 8000 1000 1000 1000 1000 3755 3755 7000 4000 4000 CODS 100000 100000 120000 120000 130000 160000 160000 160000 130000 130000

10 records selected. 16) S se afieze datele salariailor subordonai direct salariatului ION ION. SQL> SELECT MAJRCA,NUME,LEVEL, 2 FUNCT,CODS,CODD

3 4 5 6

FROM SALARIAI WHERE LEVEL=2 CONNECT BY PRIOR MARCA=CODS START WITH NUME='ION ION'
LEVEL 2 2 2 2 FUNCT SEF DEP SEF DEP SEF DEP SEF DEP CODS 7000 7000 7000 7000 CODD 130000 160000 130000 160000

MARCA NUME 1000 COMAN RADU 2500 VLAD VASILE 3755 DORU DAN 4000 PAUL TEFAN

4 records selected. CAPITOLUL 6. SELECTAREA DATELOR DIN TABELELE BAZEI DE DATE.................................................................................................. 1 6.1. Comanda SELECT......................................................................... 1 6.2. Utilizarea clauzei FROM ............................................................... 3 6.3 Utilizarea operatorilor n formularea condiiilor de selecie din clauza WHERE ..................................................................................... 5 6.3.Ordonarea liniilor rezultate n urma unei cereri............................ 12 6.4. Selecii din mai multe tabele ........................................................ 14 6.5. Realizarea cererilor incluse .......................................................... 18 6.6. Utilizarea expresiilor, funciilor, variabilelor sistem i pseudocoloanelor n selectarea datelor........................................................... 24 6.7.Utilizarea funciilor de grupare i a clauzei GROUP BY n selectarea datelor................................................................................. 38 6.8. Operaii pe tabele structurate arborescent .................................... 46

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