SQL queries

Page 1

1. Sa se scrie o cerere care face o lista cu toti sefii de departament care au cel putin 2 subalterni cu o vechime mai mare de 20 de ani in companie. create table emp (id number(2) primary key, nume varchar2(30), dept number(2), vechime number(2)); insert into emp values ( 1, 'popescu', 10, 15); insert into emp values ( 2, 'vasile', 10, 25); insert into emp values ( 3, 'dumitru', 20, 3); insert into emp values ( 4, 'ionel', 10, 21); insert into emp values ( 5, 'angela', 20, 6); create table dept (id number(2) primary key, id_sef number(2) references emp(id)); insert into dept values (10, 1); insert into dept values (20, 5); select DISTINCT a.nume from emp a, dept b, emp c where b.id_sef = a.id AND c.dept = b.id AND c.vechime > 20; Rezultat: popescu 2. Să se scrie o cerere sql care face o listă cu șefii de departament care au cei mai mulți angajați care nu au primit niciun comision. alter table emp add comision number(2); insert into emp values (6, 'costin', 10, 12, 10); insert into emp values (7, 'cosmina' , 30, 5, 5); insert into dept values ( 30, 7); create table raport as ( select d.id_sef sef, s.dep dep, s.cnt contor from dept d, (select DISTINCT e.dept dep, count(e.id) cnt from emp e where e.comision is null group by e.dept) s where d.id = s.dep); select r.dep Nr_dep, e.nume, r.contor angajati from raport r, emp e where e.id = r.sef AND r.contor = ( select max(contor) from raport ); Rezultat: popescu


3. Sa se scrie o cerere care face o lista cu distribuitia angajatilor pe grupe de salarizare: grupa 1 - salariatii cu sal mai mici de 1500 grupa 2 – sal mai mari de 1500 Antet: denumire departament, nume, ani vechime, luni vechime, grupa salarizare create table angajati ( nume varchar2(30), data_ang date, salariu number(4), dep number(2) ); insert into angajati values ('shakuka', '10-APR-10', 1900, 10); insert into angajati values ('johny', '01-MAR-11', 2600, 10); insert into angajati values (samir', '01-SEP-01' 1400, 20); insert into angajati values ('habiba', '1-JAN-08', 1000, 20); select dep, nume, (sysdate-data_ang)/365 ani_vechime, months_between(sysdate, data_ang) luni_vechime, '1' grupa from angajati where salariu < 1500 UNION select dep, nume, (sysdate-data_ang)/365 ani_vechime, months_between(sysdate, data_ang) luni_vechime, '2' grupa from angajati where salariu >= 1500;

4. Sa se scrie o cerere care face o lista cu angajatii care au venituri (sal + comm) mai mici decat venitul sefului direct si vechimea mai mare decat vechimea presedintelui companiei (calculata in ani). Antet: nume_subaltern, venit_subaltern, an_vechime_subaltern, nume_sef, venit_sef, an_vechime_presedinte (folosind tabelele definite si alterate anterior) (presedintele va avea ID=1) alter table emp add salariu number(3); update emp set salariu = 800 where id=1; update emp set salariu = 500 where id=2; update emp set salariu = 300 where id=3; update emp set salariu = 700 where id=4; update emp set salariu = 400 where id=5; update emp set salariu = 400 where id=6;


update emp set salariu = 400 where id=7; select a.nume, a.salariu * (1+nvl(a.comision,0)) venit, a.vechime vechime, b.nume sef, c.vechime vechime_pres from emp a, emp b, emp c, dept d where c.id = 1 AND b.id = d.id_sef AND d.id = a.dept ; select a.nume, a.salariu * (1+nvl(a.comision,0)) venit, a.vechime vechime, b.nume sef, b.salariu * (1+nvl(b.comision,0)) venit_sef, c.vechime vechime_pres from emp a, emp b, emp c, dept d where c.id = 1 AND b.id = d.id_sef AND d.id = a.dept AND b.salariu * (1+nvl(b.comision,0)) > a.salariu * (1+nvl(a.comision,0)) AND a.vechime > c.vechime; Rezultat: subalternii sunt Vasile si Ionel 5. O cerere sql care sa listeze angajatii care au salariul mai mare decat salariul mediu pe departamentul din care fac parte, dar numai din departamentul cu cele mai multe salarii peste salariul mediu pe departament. Rezultatul pe tabela emp:

Popescu, Ionel.

Intai scriu media pe fiecare departament: select avg(salariu) avg, dept d from emp group by dept; Pe urma scriu toti angajatii care au salariu mai mare decat aceste medii, pe departamente: create table tt as ( select DISTINCT a.nume, a.dept, t.avg from emp a, (select avg(salariu) avg, dept d from emp group by dept) t where a.salariu > t.avg AND a.dept = t.d); select * from tt; In final, dintre acestia ii aleg pe cei care apartin departamentului cu cele mai multe intrari (in tabelul creat anterior). Selectarea departamentului cu cel mai mare nr de angajati se face: select count(dept), dept from tt having count(dept) = ( select max(count(dept)) from tt group by dept )


group by dept; In fine: select DISTINCT a.nume from emp a, tt, (select count(dept) C, dept D from tt having count(dept) = ( select max(count(dept)) from tt group by dept ) group by dept) new where a.dept = new.D AND tt.avg < a.salariu AND tt.dept = new.D;


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.