sql queries

5
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

Upload: shaa

Post on 21-Mar-2016

212 views

Category:

Documents


0 download

DESCRIPTION

bd1...sql..oracle...etc

TRANSCRIPT

Page 1: SQL queries

1. Sa se scrie o cerere care face o lista cu toti sefii dedepartament care au cel putin 2 subalterni cu o vechime mai mare de 20de 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 cwhere 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 ewhere e.comision is nullgroup by e.dept) s where d.id = s.dep);

select r.dep Nr_dep, e.nume, r.contor angajatifrom raport r, emp ewhere e.id = r.sef AND r.contor = ( select max(contor) from raport );

Rezultat: popescu

Page 2: SQL queries

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 1500grupa 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' grupafrom angajatiwhere salariu < 1500UNIONselect dep, nume, (sysdate-data_ang)/365 ani_vechime, months_between(sysdate, data_ang) luni_vechime, '2' grupafrom angajatiwhere 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;

Page 3: SQL queries

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_presfrom emp a, emp b, emp c, dept dwhere 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_presfrom emp a, emp b, emp c, dept dwhere 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 dfrom empgroup 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.avgfrom emp a,(select avg(salariu) avg, dept dfrom empgroup by dept) twhere 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), deptfrom tthaving count(dept) = ( select max(count(dept)) from tt group by dept )

Page 4: SQL queries

group by dept;

In fine:select DISTINCT a.numefrom emp a, tt,(select count(dept) C, dept Dfrom tthaving count(dept) = ( select max(count(dept)) from tt group by dept )group by dept) newwhere a.dept = new.D AND tt.avg < a.salariu AND tt.dept = new.D;