17
Exemplul 1. Sa se creeze tabela firme si tabela agenti in care sa fie precizate restrictiile de integritate. CREATE TABLE firme (codfirma NUMBER(2) CONSTRAINT PKey_firme PRIMARY KEY, denfirma VARCHAR2(20) NOT NULL, loc VARCHAR2(20), zona VARCHAR2(15) CONSTRAINT FZONA_CK check (zona IN ('Moldova','Ardeal','Banat','Muntenia','Dobrogea','Transilvania'))); CREATE TABLE agenti (codagent VARCHAR2(3) CONSTRAINT pk_agent PRIMARY KEY, numeagent VARCHAR2(25) NOT NULL, dataang DATE DEFAULT SYSDATE, datanast DATE, functia VARCHAR2(20), codfirma NUMBER(2), CONSTRAINT FK_agenti FOREIGN KEY (codfirma) REFERENCES firme(codfirma)); Exemplul 2. Sa se creeze tabela fosti_agenti pe baza tabelei agenti si care va contine doar o parte din coloanele tabelei initiale (codagent, numeagent, functia, codfirma) CREATE TABLE fosti_agenti AS SELECT codagent, numeagent, functia, codfirma FROM agenti; Exemplul 4 4.1 Sa se redenumeasca tabela agenti cu personal ALTER TABLE agenti RENAME TO personal; sau RENAME agenti TO personal; 4.2 Sa se adauge coloanele email si varsta in tabela personal ALTER TABLE personal ADD (email VARCHAR2(10), varsta NUMBER(2)); 4.3 Sa se modifice tipul de date al coloanei email ALTER TABLE personal MODIFY (email VARCHAR2(30)); 4.4 Sa se stearga coloana email ALTER TABLE personal DROP COLUMN email; 4.5 Sa se inactiveze coloana functia ALTER TABLE personal SET UNUSED COLUMN functia; 4.6 Sa se stearga coloanele inactive ALTER TABLE personal DROP UNUSED COLUMNS; 4.7 Sa se adauge o restrictie pe coloana varsta ALTER TABLE personal ADD CONSTRAINT check_varsta CHECK (varsta>18 and varsta<60);

Documentbd

  • Upload
    silica

  • View
    213

  • Download
    1

Embed Size (px)

DESCRIPTION

proiect

Citation preview

Page 1: Documentbd

Exemplul 1. Sa se creeze tabela firme si tabela agenti in care sa fie precizate restrictiile de integritate.CREATE TABLE firme(codfirma NUMBER(2) CONSTRAINT PKey_firme PRIMARY KEY,denfirma VARCHAR2(20) NOT NULL,loc VARCHAR2(20),zona VARCHAR2(15) CONSTRAINT FZONA_CK check (zona IN ('Moldova','Ardeal','Banat','Muntenia','Dobrogea','Transilvania')));

CREATE TABLE agenti(codagent VARCHAR2(3) CONSTRAINT pk_agent PRIMARY KEY,numeagent VARCHAR2(25) NOT NULL,dataang DATE DEFAULT SYSDATE,datanast DATE,functia VARCHAR2(20),codfirma NUMBER(2),CONSTRAINT FK_agenti FOREIGN KEY (codfirma) REFERENCES firme(codfirma));

Exemplul 2. Sa se creeze tabela fosti_agenti pe baza tabelei agenti si care va contine doar o parte din coloanele tabelei initiale (codagent, numeagent, functia, codfirma)CREATE TABLE fosti_agentiASSELECT codagent, numeagent, functia, codfirma FROM agenti;Exemplul 4 4.1 Sa se redenumeasca tabela agenti cu personal ALTER TABLE agenti RENAME TO personal;sauRENAME agenti TO personal;4.2 Sa se adauge coloanele email si varsta in tabela personal ALTER TABLE personalADD (email VARCHAR2(10),varsta NUMBER(2));

4.3 Sa se modifice tipul de date al coloanei email ALTER TABLE personalMODIFY (email VARCHAR2(30));

4.4 Sa se stearga coloana email ALTER TABLE personalDROP COLUMN email;

4.5 Sa se inactiveze coloana functiaALTER TABLE personalSET UNUSED COLUMN functia;

4.6 Sa se stearga coloanele inactiveALTER TABLE personalDROP UNUSED COLUMNS;4.7 Sa se adauge o restrictie pe coloana varstaALTER TABLE personalADD CONSTRAINT check_varsta CHECK (varsta>18 and varsta<60);

4.8 Sa se dezactiveze restrictia anterioaraALTER TABLE personalDISABLE CONSTRAINT check_varsta;

4.9 Sa se stearga restrictia anterioaraALTER TABLE personalDROP CONSTRAINT check_varsta;Exemplul 5. 5.1 Sa se stearga tabela fosti_agentiDROP TABLE fosti_agenti;

5.2 Sa se recupereze tabela fosti_agenti

Page 2: Documentbd

FLASHBACK TABLE fosti_agenti TO BEFORE DROP;

Exemplul 6. Sa se stearga inregistrarile tabelei personalTRUNCATE TABLE personal;

Exemplul 7. Sa se vizualizeze toate tabelele utilizatorului curentSELECT * FROM USER_TABLES;

Exemplul 8. Sa se vizualizeze denumirea tabelelor, restrictiile si tipul acestora pentru utilizatorul curentSELECT TABLE_NAME, CONSTRAINT_TYPE, CONSTRAINT_NAME FROM USER_CONSTRAINTS;

Exemplu 1. Sa creeze tabela salariati pe baza tabelei angajati fara a prelua si inregistrarile (doar structura) si sa se adauge un nou angajatCREATE TABLE salariati AS SELECT * FROM angajati WHERE 2=3;INSERT INTO salariati (id_angajat, nume, salariul) VALUES (207, 'Ionescu', 4000);INSERT INTO salariati (id_angajat, nume, salariul) VALUES (207, 'Poppescu', 4200);SELECT * FROM salariati;

Exemplul 2. Sa se adauge in tabela salariati toti angajatii din tabela angajati care lucreaza in departamentele 20, 30 si 50. Si sa se finalizeze tranzactia (salvarea modificarii).INSERT INTO salariati SELECT * FROM angajati WHERE id_departament IN (20, 30, 50);SELECT * FROM salariati;COMMIT;

Exemplul 3. Sa se adauge in tabela salariati un angajat ale carui date sunt introduse de utilizator de la tastaturaINSERT INTO salariati (id_angajat, nume, data_angajare, salariul)VALUES ('&id_angajat','&nume', TO_DATE('&data_angajare', 'mon dd, yyyy'), '&salariul');

Exemplul 4. Sa se creasca cu 100 salariul angajatilor din tabela salariati care au salariul mai mic decat 3000: UPDATE salariatiSET salariul=salariul+100WHERE salariul<3000 AND comision IS NULL;SELECT * FROM salariati;

Exemplul 5. Sa se actualizeze salariul angajatilor al caror manager are id = 122 cu salariul angajatului cu id = 125. UPDATE salariatiSET salariul=(SELECT salariul FROM salariati WHERE id_angajat=125)WHERE id_manager=122;

Exemplul 6. Sa se actualizeze salariul si comisionul angajatilor din tabela salariati cu salariul si comisionul anagajatului cu id_angajat = 167 din tabela angajati, doar pentru angajatii care au salariul mai mic decat salariul angajatului cu id = 173 din tabela angajati si care lucreaza in departamentul 50.

UPDATE salariati SET (salariul, comision)=(SELECT salariul, comision FROM angajati WHERE id_angajat=167) WHERE salariul < (SELECT salariul from angajati WHERE id_angajat = 173) AND id_departament =50;

Exemplul 7. Sa se stearga angajatii din tabela salariati care au id_manager egal cu 122 sau 123.DELETE FROM salariatiWHERE id_manager IN (122, 123);

Exemplul 8. Sa se sterga angajatii din tabela salariati angajati inainte de anul 1999. DELETE FROM salariatiWHERE data_angajare<TO_DATE('01-01-1999','DD-MM-YYYY');

Exemplul 9. Sa se sterga toti angajatii din tabela salariati. Sa se anuleze tranzactia.DELETE FROM salariati;

SELECT * FROM salariati;

ROLLBACK;SELECT * FROM salariati;

Page 3: Documentbd

Exemplul 10. Sa se actualizeze tabela salariati astfel incat toti salariatii din tabela salariati sa aiba salariile egale cu cei din tabela angajati, iar pentru cei care nu sunt in tabela salariati sa se adauge valorile coloanelor (id_angajat, nume, salariul) din tabela sursa agajati. Sa se numere inregistrarile din cele doua tabele si sa se explice diferenta. Sa se finalizeze tranzactia.

MERGE INTO salariati USING angajati ON (salariati.id_angajat = angajati.id_angajat)WHEN MATCHED THEN UPDATE SET salariati.salariul=angajati.salariulWHEN NOT MATCHED THENINSERT (id_angajat, nume, salariul) VALUES (angajati.id_angajat, angajati.nume, angajati.salariul);SELECT COUNT (*) FROM salariati;SELECT COUNT (*) FROM angajati;COMMIT;

Sa se selecteze toti angajatii din tabela salariati.

SELECT * FROM salariati;

Sa se selecteze coloanele id_angajat, nume, prenume si id_functie din tabela salariati.

SELECT id_angajat, nume, prenume, id_functie FROM salariati;

Sa se selecteze numai angajatii care fac parte din categoria functionar (al caror id_functie contine „CLERK”).

SELECT * FROM salariatiWHERE upper(id_functie) LIKE '%CLERK%';

Sa se selecteze comenzile incheiate de salariatul cu id_angajat = 161.

SELECT * FROM comenziWHERE id_angajat = 161ORDER BY nr_comanda; Sa se selecteze toate comezile care au fost lansate online dupa 1 ianuarie 2000.

SELECT * FROM comenziWHERE LOWER(modalitate) LIKE '%online%' AND data > TO_DATE('01.01.2000','DD.MM.YYYY');

Sa se selecteze id_angajat, nume, prenume, id_manager, id_departament din tabela angajati si denumire_departament din tabela departamente si sa se realizeze jonctiunea dintre cele doua tabele.

SELECT a.id_angajat, a.nume, a.prenume, a.id_manager, a.id_departament, d.denumire_departament FROM angajati a, departamente dWHERE a.id_departament=d.id_departament;

Să se afişeze id_angajat, prenume, id_functie si salariul pentru angajatii care nu lucreaza in departamentul IT_PROG si al caror salariu este mai mic decat oricare dintre salariile angajatilor care lucreaza in departamentul IT_PROG:

SELECT id_angajat, prenume, id_functie, salariul FROM angajatiWHERE salariul < ANY (SELECT salariul FROM angajatiWHERE id_functie = 'IT_PROG') AND id_functie <> 'IT_PROG'ORDER BY salariul DESC;

Să se afişeze id_angajat, prenume, id_functie si salariul pentru angajatii care nu lucreaza in departamentul IT_PROG si al caror salariu este mai mic decat fiecare dintre salariile angajatilor care lucreaza in departamentul IT_PROG:

SELECT id_angajat, prenume, id_functie, salariul FROM angajatiWHERE salariul < ALL(SELECT salariul FROM angajati WHERE id_functie = 'IT_PROG') AND id_functie <> 'IT_PROG' ORDER BY salariul DESC;

Page 4: Documentbd

Sa se selecteze comenzile incheiate de angajati (in clauza WHERE se va preciza conditia de legatura dintre tabele).

SELECT a.*, c.*FROM angajati a, comenzi cWHERE a.id_angajat= c.id_angajat;

Sa se selecteze comenzile incheiate de angajatul Greene numai in luna noiembrie.

SELECT angajati.*, comenzi.*FROM angajati, comenziWHERE angajati.id_angajat=comenzi.id_angajatAND lower(comenzi.data) like '%nov%'AND upper(angajati.nume) = 'GREENE';

Sa se calculeze valoarea fiecarui produs (valoare = cantitate * pret) si sa se afiseze denumirea produsului, pretul, cantitatea si valoarea.

SELECT produse.denumire_produs, rand_comenzi.cantitate, rand_comenzi.pret,rand_comenzi.cantitate * rand_comenzi.pret AS ValoareFROM produse, rand_comenziWHERE produse.id_produs= rand_comenzi.id_produs;

Sa se selecteze numai produsele cu valoarea cuprinsa intre 1000 si 2000.

SELECT produse.denumire_produs, rand_comenzi.cantitate, rand_comenzi.pret,rand_comenzi.cantitate * rand_comenzi.pret AS ValoareFROM produse, rand_comenziWHERE produse.id_produs= rand_comenzi.id_produsAND rand_comenzi.cantitate * rand_comenzi.pret BETWEEN 1000 AND 2000;

Să se afişeze id-ul produsului, denumirea produsului şi cantitatea chiar daca nu au fost comandateSELECT p.id_produs, p.denumire_produs, rc.cantitate, rc.pretFROM produse p, rand_comenzi rcWHERE p.id_produs = rc.id_produs (+);

Să se afişeze numele fiecarui angajat şi numele sefului direct superior:

SELECT a.nume||' lucreaza pentru: '||m.numeFROM angajati a, angajati mWHERE a.id_manager=m.id_angajat;

Sa se selecteze angajatii care sunt in acelasi departament cu angajatul Smith.

SELECT * FROM angajatiWHERE id_departament IN(SELECT id_departament FROM angajati WHERE upper(nume)= 'SMITH');

Să se afişeze produsele care au preţul unitar cel mai mic:

SELECT p.denumire_produs, rc.pretFROM produse p, rand_comenzi rcWHERE p.id_produs = rc.id_produsAND rc.pret=(SELECT MIN(rand_comenzi.pret) FROM rand_comenzi);

SELECT a.id_angajat, a.id_functie, c.nr_comandaFROM angajati a, comenzi cWHERE a.id_angajat = c.id_angajatFOR UPDATE;

Sa se afiseze cu litere mari denumirea departamentelor din locatia 1700:SELECT id_departament, UPPER(denumire_departament)FROM departamenteWHERE id_locatie=1700;

Page 5: Documentbd

Sa se afiseze salariatii al caror nume incepe cu litera s

SELECT id_angajat, nume FROM angajati WHERE nume like 's%';SELECT id_angajat, nume FROM angajati WHERE nume like upper('s%');

Sa se afiseze toti angajatii cu numele Smith utilizand functiile INITCAP, UPPER, LOWER

SELECT id_angajat, nume FROM angajati WHERE INITCAP(nume) = 'Smith';SELECT id_angajat, nume FROM angajati WHERE UPPER(nume) = 'SMITH';SELECT id_angajat, nume FROM angajati WHERE LOWER(nume) = 'smith';

Să se afişeze denumirea produsului şi stocul disponibil

SELECT 'Produsul: ' || INITCAP(denumire_produs) || ' are pretul_minim ' || pret_min produs_pret_minimFROM produse;

Să se afişeze id_client, numele clientilor concatenată cu sexul acestora şi lungimea prenumelui, nivel_venituri numai pentru clientii cu venituri in categoria F: 110000 – 129999

SELECT id_client, CONCAT(nume_client,sex), LENGTH(prenume_client), nivel_venituri FROM clientiWHERE SUBSTR(nivel_venituri,1,1)='F';

Să se afişeze numărul 45,923 rotunjit la două zecimale si rotunjit la numar intreg.Sa se aplice si functia TRUNC.

SELECT ROUND(45.923,2), ROUND(45.923,0) FROM DUAL;SELECT TRUNC(45.923,2), TRUNC(45.923,0) FROM DUAL;Să se afişeze perioada de timp corespunzătoare (în săptămâni) între data încheierii comenzii şi data curentă:

SELECT nr_comanda, (SYSDATE-data)/7 saptamaniFROM comenzi;

Afisati data curenta (se selecteaza data din tabela DUAL):SELECT SYSDATE data_curenta FROM DUAL;

Să se afişeze comenzile, data încheierii comenzilor, numărul de luni între data curentă şi data încheierii, următoarea zi de vineri după data încheierii, ultima zi din luna din care face parte data încheierii, precum şi data corespunzătoare după 2 luni de la data încheierii comenzii

SELECT nr_comanda, data,round(MONTHS_BETWEEN(sysdate, data)) luni,NEXT_DAY(data, 'FRIDAY'),LAST_DAY(data)ADD_MONTHS(data,2),FROM comenzi;

Să se afişeze comenzile incheiate in luna trecuta:SELECT nr_comanda, data FROM comenziWHERE round(MONTHS_BETWEEN(sysdate, data))=1;

SELECT nr_comanda, data FROM comenziWHERE round(MONTHS_BETWEEN(sysdate, data))=171;

Să se afişeze comenzile incheiate in 2000. Se va rotunji data încheierii la prima zi din luna corespunzătoare dacă data încheierii este în prima jumatate a lunii sau la prima zi din luna următoare:

SELECT nr_comanda, data, ROUND(data, 'MONTH') FROM comenziWHERE data LIKE '%-00%';

Să se afişeze comenzile si data încheierii in formatul initial si in format “MM/YY”

SELECT nr_comanda, data, TO_CHAR(data, 'MM/YY') data_incheierii_comenzii FROM comenzi;

Page 6: Documentbd

Să se afişeze comenzile incheiate intre 15 ianuarie si 15 decembrie 1999.

SELECT nr_comanda, dataFROM comenziWHERE data BETWEEN TO_DATE( 'January 15, 1999', 'Month dd,YYYY') AND TO_DATE( 'December 15, 1999', 'Month dd,YYYY');

Sa se afiseze comenzile incheiate in anii 1997 si 1998.

SELECT nr_comanda, data FROM comenzi

WHERE EXTRACT(YEAR FROM data) IN (1997, 1998);

Sa se afiseze comenzile incheiate in lunile iulie si august.

SELECT nr_comanda, data FROM comenziWHERE EXTRACT(MONTH FROM data) IN (7,8);

NVLNVL(comision,0)NVL(data_angajarii,'01-JAN-97')NVL(id_functia,'Nu_exista_functia')

Sa se calculeze veniturile anuale ale angajatilorSELECT nume, salariul*12 + salariul*12*NVL(comision,0) venit_anualFROM angajati;

NVL2Sa se afiseze angajatii care au comision (1) si pe cei care nu au comision (0).SELECT nume, NVL2(comision, 1, 0)FROM angajati;

NULLIFSa se afiseze lungimea numelui, lungimea prenumelui, daca acestea sunt egale sa se returneze nul ca rezultat, iar daca nu sunt egale se va returna lungimea numelui.

SELECT nume, length(nume), prenume, length(prenume), NULLIF(length(nume), length(prenume)) rezultatFROM angajati;

COALESCESa se afiseze id-ul managerului fircarui angajat, daca acesta este nul, se va afisa comisionul, iar daca si acesta este nul se va afisa –

SELECT nume, prenume, coalesce(id_manager,commission,-1)FROM angajati;Să se afişeze valoarea maximă, valoarea medie, valoarea minimă şi valoarea totală a produselor comandate:

SELECT AVG(rc.cantitate * rc.pret), MAX(rc.cantitate * rc.pret), MIN(rc.cantitate * rc.pret), sum(rc.cantitate * rc.pret)FROM rand_comenzi rc;

Să se afişeze data primei comenzi încheiate şi data celei mai vechi comenzi încheiate:

SELECT MIN(data), MAX(data)FROM comenzi;

Să se afişeze numărul de produse al căror pret_min>350:

SELECT COUNT(*) nr_produseFROM produseWHERE pret_min>350;

Page 7: Documentbd

Sa se afiseze numarul de salarii (distincte) din tabela angajati.

SELECT COUNT (salariul) FROM angajati; 107SELECT COUNT (DISTINCT salariul) FROM angajati 58

Să se afişeze numărul total de comenzi incheiate:

SELECT COUNT(nr_comanda) nr_comenzi FROM comenzi;

Să se afişeze pe cate comenzi apare produsul cu codul 3124:

SELECT COUNT(nr_comanda) produse_comandate_id_produsFROM rand_comenzi WHERE id_produs = 3124;

Să se afişeze cantitatea medie vândută din fiecare produs. Sa se ordoneze după cantitate (se utilizeaza functia AVG() si clauza GROUP BY pentru gruparea datelor in functie de id_ul produsului, iar ordonarea se realizeaza cu ajutorul functiei ORDER BY).

SELECT id_produs, ROUND(AVG(cantitate),2) medie_produseFROM rand_comenziGROUP BY id_produsORDER BY medie_produse;

Să se afişeze produsele şi cantitatea medie vândută numei pentru acele produse a căror cantitate medie este mai mare de 25 (conditia se specifica in clauza HAVING si nu in clauza WHERE deoarece este utilizata functia de grup AVG si conditia este AVG(cantitate)>25).

SELECT id_produs, ROUND(AVG(cantitate),1) medie_produseFROM rand_comenziGROUP BY id_produsHAVING ROUND(AVG(cantitate),1)>25;Sa se calculeze valoarea totala a fiecarei comenzi si sa se sorteze descrescator in functie de valoare:

SELECT comenzi.nr_comanda, SUM(rand_comenzi.cantitate * rand_comenzi.pret) total_comandaFROM comenzi, rand_comenziWHERE rand_comenzi.nr_comanda=comenzi.nr_comandaGROUP BY comenzi.nr_comandaORDER BY total_comanda DESC;

Sa se afiseze numai comenzile care au valoarea cuprinsa intre 1000 si 3000 (conditia va fi mentionata in clauza HAVING deoarece se utilizeaza functia de grup SUM):

SELECT comenzi.nr_comanda, SUM(rand_comenzi.cantitate * rand_comenzi.pret) total_comandaFROM comenzi, rand_comenziWHERE rand_comenzi.nr_comanda=comenzi.nr_comandaGROUP BY comenzi.nr_comandaHAVING SUM(rand_comenzi.cantitate * rand_comenzi.pret) BETWEEN 1000 AND 3000ORDER BY total_comanda DESC;Exercitii:

Sa se selecteze din tabela angajaţi numai angajatii care au salariul cuprins intre 8000 si 10000.Select * from angajati where salariul between 8000 and 10000;

Sa se selecteze din tabela angajatinumai angajatii care au functiaSA_REP.Select * from angajati where id_functie = 'SA_REP';

Sa se selecteze angajatii care sunt in acelasi departament cu angajatul Smith.SELECT * FROM angajati WHERE id_departament IN(SELECT id_departament FROM angajati WHERE upper(nume)= 'SMITH');

Page 8: Documentbd

Să se afişeze produsele care au preţul unitar cel mai mic:SELECT p.denumire_produs, rc.pret FROM produse p, rand_comenzi rcWHERE p.id_produs = rc.id_produsAND rc.pret=(SELECT MIN(rand_comenzi.pret) FROM rand_comenzi);

Modificati conditia de sus astfel incat sa fie selectati si cei care au in denumirea functiei atributul ACCOUNT.Select * from angajati where id_functie = 'SA_REP' OR id_functie LIKE '%ACCOUNT%';

Sa se selecteze toti angajatii pentru care a doua litera din e-mail este A, B sau C.Select * from angajati where email like '_A%' or email like '_B%' or email like '_C%';

Sa se selecteze toti angajatii care au numarul de telefon format din al doilea grup de cifre din 123 (de exemplu: 515.123.4569)Select * from angajati where telefon like '%.123.%';

Sa se selecteze toti angajatii angajati inainte de 1ianuarie 2000 (data_angajare).Select * from angajati where data_angajare<to_date('01.01.2000', 'DD.MM.YYYY');

Modificati conditia de mai sus astfel incat sa afisati numai salariatii angajati in ianuarie 2000.Select * from angajati where extract(year from data_angajare) = 2000;

Sa se selecteze numele, salariul,functia angajatilor şi denumirea departamentului pentru cei care lucreaza în departamentul IT.

Select a.nume, a.salariul, a.id_functie, d.denumire_departament from angajati a, departamente dwherea.id_departament = d.id_departament and denumire_departament like '%IT%';

Modificati conditia de mai sus astfel incat sa fie selectati toti angajatii din departamentele care au in denumire specificatia IT, indifferent daca acestea au sau nu angajati.

Select a.nume, a.salariul, a.id_functie, d.denumire_departamentfromangajati a, departamente d where a.id_departament(+) = d.id_departamentanddenumire_departament like '%IT%';

Sa se selecteze numele, salariul,departamentul si denumirea functiei angajatiilor care au functia de Programmer (denumire_functie din functii).Select a.nume, a.salariul, a.id_functie, f.denumire_functiefrom angajati a, functii f where a.id_functie=f.id_functieand denumire_functie like '%Programmer%';

Modificati conditia de mai sus astfel incat sa afisati toti angajatii cu functii de Manager (de exemplu Finance Manager sau Purchasing Manager etc).

Select a.nume, a.salariul, a.id_functie, f.denumire_functiefrom angajati a, functii fwherea.id_functie=f.id_functieand denumire_functie like '%Programmer%';

Sa se selecteze numele, salariul, denumirea departamentului, denumirea functiei angajatiilor din departamentul de vânzări (care contin in denumireSales) si care au functia de Representative sau Manager.

Select a.nume, a.salariul, a.id_functie, d.denumire_departament, f.denumire_functieFrom angajati a, departamente d, functii f where a.id_departament= d.id_departamentanda.id_functie=f.id_functie and d.denumire_departament like '%Sales%' and (f.denumire_functie like '%Representative%' or f.denumire_functie like '%Manager%');

Afisati numele si in ordine crescatoare salariile si in ordine descrescatoare data angajarii pentru salariatii din departamentul vânzări (Sales).

Select a.nume, a.prenume, a.salariul, a.data_angajare, d.denumire_departamentfromangajati a, departamente d where a.id_departament=d.id_departamentand d.denumire_departament like '%Sales%' order by salariul, data_angajare desc;

Sa se selecteze numele, functia, comisionul si departamentul angajatilor care nu au comisionul NULL.

Select nume, id_functie, comision, id_departament from angajati where comision is not null;

Page 9: Documentbd

Afisati numele, comisionul, functia, departamentul angajatilor din departamentul Sales, precum si suma primita prin aplicarea comisionului la volumul vanzarilor (venit) mai mare 90000Euro. Ordonati descrescator dupa acestă valoare folosind aliasul.

Select a.nume, a.comision, a.id_functie, d.denumire_departament, sum(rc.pret*rc.cantitate) from angajati a, departamente d, comenzi c, rand_comenzi rcwhere a.id_departament = d.id_departament and c.nr_comanda=rc.nr_comandaand a.id_angajat = c.id_angajat and d.denumire_departament like '%Sales%'group by a.nume, a.comision, a.id_functie, d.denumire_departamenthaving sum(rc.pret*rc.cantitate) > 90000;

Sa se afiseze angajatii si nivelul ierarhic al acestora pornind de la angajatul cu id-ul 100 (sa se ordoneze in functie de nivelul ierahic).

SELECT id_angajat, nume, id_manager, LEVEL FROM angajatiCONNECT BY PRIOR id_angajat= id_managerSTART WITH id_angajat = 100;**SELECT id_angajat, nume, id_manager, LEVEL FROM angajatiCONNECT BY PRIOR id_angajat= id_managerSTART WITH id_angajat = 100ORDER BY LEVEL;

Afisati angajatii companiei subordonati inregistrarii radacina sub forma de organigrama.

SELECT LEVEL, LPAD(' ', LEVEL)|| nume FROM angajatiCONNECT BY PRIOR id_angajat = id_managerSTART WITH id_angajat= 100;**SELECT LEVEL, LPAD(' ', LEVEL)|| nume FROM angajatiCONNECT BY PRIOR id_angajat = id_managerSTART WITH id_angajat= 100ORDER BY LEVEL;

3. Afisati angajatii companiei subordonati inregistrarii radacina specificand numarul de superiori si toti superiorii sai, id-urile (se utilizeaza clauzele: SYS_CONNECT_BY_PATH, LEVEL-1):

SELECT id_angajat, nume,LEVEL-1 Numar_Superiori, SYS_CONNECT_BY_PATH(id_angajat, '/') ID_SuperioriFROM angajatiSTART WITH id_angajat= 100CONNECT BY PRIOR id_angajat = id_manager;

4. Sa se selecteze angajati si gradul de subordonare numai pentru cei din departamentele 20 si 50:

SELECT id_angajat, nume, id_manager, level FROM angajatiWHERE id_departament IN (20, 50)CONNECT BY PRIOR id_angajat = id_managerSTART WITH id_angajat = 100;

5. Sa se afiseze superiorii angajatilor aflati pe ultimul nivel de subordonare:SELECT nume, LEVEL-1 Numar_Superiori, SYS_CONNECT_BY_PATH(nume, '/') Nume_SuperioriFROM angajatiSTART WITH id_angajat = 100CONNECT BY PRIOR id_angajat = id_managerORDER BY LEVEL desc;

6. Sa se afiseze toti superiorii lui ‘Faviet’:SELECT id_angajat, nume, id_manager, LEVEL FROM angajatiCONNECT BY id_angajat = PRIOR id_managerSTART WITH nume= 'Faviet';

Page 10: Documentbd

7. Sa se afiseze toti subordonatii lui 'De Haan':SELECT id_angajat, nume, id_manager, LEVEL FROM angajatiCONNECT BY PRIOR id_angajat = id_managerSTART WITH nume= 'De Haan'ORDER BY LEVEL;

8. Sa se afiseze toti superiorii lui De Haan:SELECT id_angajat, nume, id_manager, LEVEL FROM angajatiCONNECT BY id_angajat = PRIOR id_managerSTART WITH nume= 'De Haan'ORDER BY LEVEL;

9. Sa se afiseze toti subordonatii lui 'De Haan' si care sunt in acelasi departament zona cu 'Chen':SELECT id_angajat, nume, id_manager, id_departament, LEVEL FROM angajatiWHERE id_departament = (SELECT id_departament FROM angajati WHERE nume='Chen')CONNECT BY PRIOR id_angajat = id_managerSTART WITH nume = 'Kochhar'ORDER BY LEVEL;

10. Sa se selecteze toti angajatii din departamentul 100 si subordonatii acestora:SELECT id_angajat, nume, id_manager, id_departament, LEVEL FROM angajatiCONNECT BY PRIOR id_angajat= id_managerSTART WITH id_departament=100ORDER BY LEVEL;

11. Sa se afiseze toti subordonatii lui 'Kochhar' fara cei din departamentul 100.SELECT id_angajat, nume, id_manager, id_departament, LEVEL FROM angajatiWHERE id_departament != 100CONNECT BY PRIOR id_angajat = id_managerSTART WITH nume= 'Kochhar'ORDER BY LEVEL;

12. Sa se afiseze toti subordonatii lui 'Kochhar' si mai putin cei din departamentele 100 si 110.SELECT id_angajat, nume, id_manager, id_departament, LEVEL FROM angajatiWHERE id_departament NOT IN (100,110)CONNECT BY PRIOR id_angajat = id_managerSTART WITH nume= 'Kochhar'ORDER BY LEVEL;

13. Sa se afiseze toti subordonatii lui 'Kochhar' si cei ai lui ‘De Haan’:SELECT id_angajat, nume, id_manager, LEVEL FROM angajatiCONNECT BY PRIOR id_angajat = id_managerSTART WITH nume = 'Kochhar' OR nume= 'De Haan'ORDER BY LEVEL;

14. Sa se afiseze toti subordonatii de pe nivelul 3:SELECT id_angajat, nume, id_manager, LEVEL FROM angajatiWHERE LEVEL=3CONNECT BY PRIOR id_angajat = id_managerORDER BY LEVEL;

15. Sa se afiseze toti subordonatii incepand cu nivelul 3:SELECT id_angajat, nume, id_manager, LEVEL FROM angajatiWHERE LEVEL>=3CONNECT BY PRIOR id_angajat = id_managerORDER BY LEVEL;

16. Sa se afiseze numarul total de angajati subordonati lui 'Steven King' grupati pe departamente:SELECT id_departament, count(*) Total_Angajati from angajatiCONNECT BY PRIOR id_angajat = id_managerSTART WITH id_angajat = 100GROUP BY id_departament;

Page 11: Documentbd

17. Sa se selecteze toti subordonatii angajatilor cu functia CLERK.SELECT id_angajat, nume, id_manager, id_functie FROM angajatiCONNECT BY PRIOR id_angajat = id_managerSTART WITH id_functie LIKE '%CLERK%'ORDER BY LEVEL;

Sa se afiseze produsele comandate impreuna cu cele care nu se regasesc pe nici o comanda.SELECT p.id_produs, p.denumire_produs, rc.cantitate, rc.pretFROM produse p, rand_comenzi rcWHERE p.id_produs = rc.id_produs (+);

Sa se afiseze toti angajatii care au incheiat comenzi, precum si cei care nu au incheiat comenzi.SELECT a.id_angajat, a.nume, c.nr_comanda, c. dataFROM angajati a, comenzi cWHERE a.id_angajat= c.id_angajat (+);

Sa se identifice ierarhia angajatilor responsabili cu vanzarile.SELECT id_angajat, nume, id_functie, LEVEL FROM angajatiCONNECT BY id_angajat = PRIOR id_managerSTART WITH id_functie = 'SA_REP';

Sa se calculeze comisionul agentilor in functie de pozitia (functia) ocupata:0.1% din valoarea comenzilor daca functia este SA_REP0.2% din valoarea comenzilor daca functia este SA_MAN0.3% din valoarea comenzilor daca functia este AD_PRESPentru celelalte functii comisionul va fi 0.SELECT nume, id_functie,CASE WHEN UPPER(id_functie) = 'AD_PRES' THEN 0.3WHEN UPPER(id_functie) = 'SA_MAN' THEN 0.2WHEN UPPER(id_functie) = 'SA_REP' THEN 0.1ELSE 0 END comisionFROM angajati;

Daca se aplica acest comision la valoarea comenzilor (SUM(cantitate*pret)) interogarea devine:SELECT a.nume, a.id_functie,(CASE WHEN UPPER(a.id_functie) = 'AD_PRES' THEN 0.3WHEN UPPER(a.id_functie)= 'SA_MAN' THEN 0.2WHEN UPPER(a.id_functie)= 'SA_REP' THEN 0.1ELSE 0 END)*SUM(r.cantitate*r.pret) valoare_comisionFROM angajati a, comenzi c, rand_comenzi rWHERE a.id_angajat=c.id_angajatAND c.nr_comanda=r.nr_comandaGROUP BY a.nume, a.id_functie;

Cu functia DECODE cerinta se poate rezolva astfel:SELECT nume, id_functie,DECODE(UPPER(id_functie) , 'AD_PRES' , 0.3,'SA_MAN', 0.2, 'SA_REP' , 0.1, 0) comisionFROM angajati;

Sa se calculeze diferit discountul (DC) pentru clienti astfel: daca clientul a incheiat 1 comanda atunci DC= 10%;daca a incheiat 2 comenzi atunci DC =15%;, daca a incheiat mai mult de 3 comenzi atunci DC =20%.

SELECT cl.nume_client, count(co.nr_comanda) numar_comenzi,CASE WHEN COUNT(co.nr_comanda) = 1 THEN 0.1WHEN COUNT(co.nr_comanda) = 2 THEN 0.15WHEN COUNT(co.nr_comanda)>=3 THEN 0.2ELSE 0 END discountFROM clienti cl, comenzi coWHERE cl.id_client=co.id_clientGROUP BY cl.nume_client;

Page 12: Documentbd

1) Sa se afiseze angajatii care au salariul intre 4999 si 6500 fara cei care au salariul 5000 si 6000.SELECT * FROM angajati WHERE salariul BETWEEN 4999 AND 6500MINUSSELECT * FROM angajati WHERE salariul IN (5000, 6000);

2) Sa se calculeze diferit discountul (DC) pentru clienti astfel:daca clientul a incheiat 1 comanda atunci DC= 10% ;daca a incheiat 2 comenzi atunci DC =15%;daca a incheiat mai mult de 3 comenzi atunci DC =20%.Din acestea sa se elimine inregistrarile incheiate de clientii care incep cu litera M. Ordonati descrescator in functie de numele clientilor.SELECT cl.nume_client, COUNT(co.nr_comanda) numar_comenzi,(CASE WHEN COUNT(co.nr_comanda)=1 THEN 0.1WHEN COUNT(co.nr_comanda)=2 THEN 0.15WHEN COUNT(co.nr_comanda)>=3 THEN 0.2ELSE 0 END) discountFROM clienti cl, comenzi coWHERE cl.id_client=co.id_clientGROUP BY cl.nume_clientMINUSSELECT cl.nume_client, COUNT(co.nr_comanda) numar_comenzi,(CASE WHEN COUNT(co.nr_comanda)=1 THEN 0.1WHEN COUNT(co.nr_comanda)=2 THEN 0.15WHEN COUNT(co.nr_comanda)>=3 THEN 0.2ELSE 0 END) discountFROM clienti cl, comenzi coWHERE cl.id_client=co.id_clientAND cl.nume_client like 'M%'GROUP BY cl.nume_clientORDER BY nume_client;

3) Sa se calculeze distinct comisionul pentru angajati folosind operatorul UNION:Daca au 1 comanda comisionul va fi de 10% din valoare totala a comenzilor;Daca au 2 comenzi comisionul va fi de 20% din valoare totala a comenzilor;Daca au 3 comenzi comisionul va fi de 30% din valoare totala a comenzilor.SELECT a.nume, COUNT(c.nr_comanda) numar_comenzi,0.1* SUM(r.cantitate*r.pret) valoare_comisionFROM angajati a, comenzi c, rand_comenzi rWHERE a.id_angajat=c. id_angajatAND c.nr_comanda=r.nr_comandaGROUP BY a.numeHAVING COUNT(c.nr_comanda)=1UNIONSELECT a.nume, COUNT(c.nr_comanda) numar_comenzi,0.2* SUM(r.cantitate*r.pret) valoare_comisionFROM angajati a, comenzi c, rand_comenzi rWHERE a.id_angajat=c.id_angajatAND c.nr_comanda=r.nr_comandaGROUP BY a.numeHAVING COUNT(c.nr_comanda)=2UNIONSELECT a.nume, COUNT(c.nr_comanda) numar_comenzi,0.3* SUM(r.cantitate*r.pret) valoare_comisionFROM angajati a, comenzi c, rand_comenzi rWHERE a.id_angajat=c.id_angajatAND c.nr_comanda=r.nr_comandaGROUP BY a.numeHAVING COUNT(c.nr_comanda)>=3;

Page 13: Documentbd

4) Sa se selecteze denumirea produselor, valoare totala comandata (SUM(cantitate*pret)) si numarul de comenzi (count(nr_comanda)) pentru produsele comandate de cel putin 3 ori si care au valoarea totala diferita de 1440, 3916.

SELECT p.denumire_produs, SUM(r.cantitate*r.pret) valoare, COUNT(r.nr_comanda) numar_comenziFROM produse p, rand_comenzi rWHERE r.id_produs=p.id_produsGROUP BY p.denumire_produsHAVING COUNT(r.nr_comanda)<=3INTERSECTSELECT p.denumire_produs, SUM(r.cantitate*r.pret) valoare, COUNT(r.nr_comanda) nrcomenziFROM produse p, rand_comenzi rWHERE r.id_produs=p.id_produsGROUP BY p.denumire_produsHAVING SUM(r.cantitate*r.pret) NOT IN (1440, 3916);+