Sunteți pe pagina 1din 4

EXEMPLE

1. Se consideră tabelele ANGAJAŢI şi DEPARTAMENTE cu structurile:


ANGAJAŢI (ID, NUME, PRENUME, DATA_ANGAJARE, SALARIU, ID_DEP)
DEPARTAMENTE (ID, DENUMIRE)
a. Să se creeze tabelele şi să se introducă câte 6 articole care să corespundă cerinţelor
următoare;
create table ANGAJATI (ID number(5), NUME varchar2(20), PRENUME varchar2(20),
DATA_ANGAJARE date, SALARIU number(5), ID_DEP number(2));
create table DEPARTAMENTE (ID number(2), DENUMIRE varchar2(20));
ALTER TABLE angajati add CONSTRAINT pk_angajati PRIMARY KEY (ID);
ALTER TABLE departamente add CONSTRAINT pk_departamente PRIMARY KEY (ID);
ALTER TABLE angajati add CONSTRAINT fk_angajati FOREIGN KEY (ID_DEP) references
departamente(ID);
insert into departamente values (1,'Contabilitate');
insert into departamente values (2,'Marketing');
insert into departamente values (3,'Relatii cu publicul');
insert into angajati values (100,'Ionescu','Maria',sysdate-330,1000,1);
insert into angajati values (200,'Popescu','Andrei',sysdate-30,900,1);
insert into angajati values (300,'Mihai','Vlad',sysdate-500,1200,3);
insert into angajati values (400,'Stefan','Ioana',sysdate,600,3);
insert into angajati values (500,'Miron','Matei',sysdate-300,400,2);
b. Salariul persoanelor angajate de cel puţin 10 luni se măreşte cu 10%. Actualizaţi tabela
ANGAJAŢI;
update angajati set salariu=salariu*1.1 where months_between(sysdate,data_angajare)>=10;
select * from angajati;
c. Să se adauge un nou angajat care să lucreze în acelaşi departament cu angajatul cu numele Y
(Y citi de la tastatură);
insert into angajati values (:ID,:nume,:prenume,to_date(:data_angajare,'dd-mm-yyyy'),:salariu,
(select id_dep from angajati where nume=:nume_angajat_dat and
prenume=:prenume_angajat_dat));
d. Departamentul cu denumirea D (D citit de la tastatură) s-a desfiinţat. Actualizaţi cele două
tabele, ştergând departamentul şi angajaţii care lucrează în acest departament;
alter table angajati drop constraint fk_angajati;
ALTER TABLE angajati add CONSTRAINT fk_angajati FOREIGN KEY (ID_DEP) references
departamente(ID) on delete cascade;
delete departamente where denumire=:D;
e. Să se afişeze toţi angajaţii din departamentul cu denumirea X (X citit de la tastatură);
Informaţiile vor fi afişate în formatul “Angajatul ….. lucrează în departamentul ….”.
select 'Angajatul ' || a.nume || ' ' || a.prenume || ' lucrează în departamentul ' || d.denumire
from angajati a,departamente d where d.id=a.id_dep;
f. Să se afişeze salariul maxim pentru fiecare departament. Rezultatele vor fi afişate în
formatul “Salariul maxim din departamentul ….. este …..”. Coloana rezultată va avea aliasul
SALARII.
select 'Salariul maxim din departamentul ' || x.d_denumire || ' este ' , max(x.s_departament)
from (select d.denumire as d_denumire, a.salariu as s_departament from angajati a,
departamente d where d.id=a.id_dep) x group by x.d_denumire;
2. Se consideră tabelele: TURIŞTI şi EXCURSII cu structurile:
TURIŞTI (COD, NUME, SEX, COD_EXC)
EXCURSII (COD , DESTINAŢIE , DATA_INCEPUT, DATA_SFARSIT, PRET)
a. Să se creeze tabelele şi să se introducă câte 6 articole care să corespundă cerinţelor
următoare;
create table TURISTI (COD varchar2(20) , NUME varchar2(100) , SEX varchar2(1) , COD_EXC
number(3));
create table EXCURSII (COD number(3) , DESTINATIE varchar2(20), DATA_INCEPUT date,
DATA_SFARSIT date, PRET number(5));
ALTER TABLE TURISTI add CONSTRAINT pk_TURIsTI PRIMARY KEY (cod);
ALTER TABLE excursii add CONSTRAINT pk_excursii PRIMARY KEY (cod);
ALTER TABLE turisti add CONSTRAINT fk_turisti FOREIGN KEY (cod_exc) references
excursii(cod);
insert into excursii values (192 , 'Vatra Dornei' , sysdate+14 , sysdate+21 , 100);
insert into excursii values (194 , 'Bucegi' , sysdate+30 , sysdate+45 , 500);
insert into excursii values (5 , 'Predeal' , sysdate+5 , sysdate+12 , 400);
insert into excursii values (7 , 'Predeal' , sysdate-90 , sysdate-80 , 750);
insert into excursii values (10 , 'Predeal' , sysdate-40 , sysdate-30 , 650);
insert into excursii values (12 , 'Predeal' , sysdate+300 , sysdate+310 , 600);
insert into turisti values ( '19242342' , 'Popescu H.' , 'M' , 5);
insert into turisti values ( '19234342' , 'Ionescu F.' , 'F' , 5);
insert into turisti values ( '1923987948' , 'Horia F.' , 'F' , 10);
insert into turisti values ( '23090954' , 'x' , 'F' , 192);
insert into turisti values ( '23894729' , 'Vasilescu F.' , 'M' , 192);
b. Să se afişeze destinaţiile în ordine alfabetică. Fiecare destinaţie va fi afişată o singură dată;
select * from excursii order by destinatie;
c. Excursiile care vor avea loc la Predeal în lunile de iarnă s-au ieftinit cu 100 lei. Actualizaţi
tabela EXCURSII;
update excursii set pret=pret-100 where data_inceput>=sysdate and to_char(data_inceput,
'mm') in ('01' , '02' , '12');
d. Ştergeţi din tabelă turistul cu numele X (X citit de la tastatură);
delete from turisti where nume=:x;
e. Câţi turişti au ales destinaţia ‘Vatra Dornei’?
select count(*) from turisti,excursii where turisti.cod_exc=excursii.cod and
excursii.destinatie='Vatra Dornei';
f. Afişaţi turiştii care au participat la excursii cu durata mai mare de 7 zile. Informaţiile vor fi
afişate în formatul: „Turistul …. a participat la excursia ….în perioada …. - ….”.
select 'Turistul '|| turisti.nume || ' a participat la excursia ' || excursii.destinatie || ' în
perioada '|| excursii.data_inceput || '-' || excursii.data_sfarsit from turisti,excursii where
turisti.cod_exc=excursii.cod and excursii.data_inceput<sysdate and excursii.data_sfarsit-
excursii.data_inceput>7;
3. Se consideră tabela TESTE cu structura:
DENUMIRE, DISCIPLINA, TIP, CLASA, PROFIL, DURATA
Tipul poate fi: clasic, grilă, combinat.
a. Să se creeze tabela şi să se introducă 10 articole care să corespundă cerinţelor următoare;
create table TESTE (DENUMIRE varchar2(100), DISCIPLINA varchar2(30), TIP varchar2(10),
CLASA number(2), PROFIL varchar2(100), DURATA number(3));
insert into teste values ('test_while', 'Informatica', 'combinat', 9, 'matematică-informatică',
50);
insert into teste values ('test_for', 'Informatica', 'grilă', 9, 'matematică-informatică, intensiv
informatică', 10);
insert into teste values ('test_grafuri', 'Informatica', 'grilă', 11, 'matematică-informatică,
intensiv informatică', 10);
insert into teste values ('test_integrale', 'Matematică', 'clasic', 12, 'matematică-informatică',
100);
insert into teste values ('test_genetica', 'Biologie', 'clasic', 12, 'matematică-informatică', 30);
insert into teste values ('test_animalia', 'Biologie', 'grilă', 9, 'matematică-informatică', 25);
insert into teste values ('Componentele calculatorului', 'Informatica', 'grilă', 9, 'matematică-
informatică', 15);
b. Afișați pe ecran denumirile testelor de la disciplina Informatica, de tip grila care se pot
da elevilor de clasa a IX-a, indiferent de profil;
select * from teste where DISCIPLINA='Informatica' and CLASA=9 and TIP='grilă';
c. Ștergeți din baza de date testele cu durata mai mare de 60 minute.
delete from teste where durata>60;
d. Afișați testele de la profilul Matematica-informatica, grupate alfabetic pe discipline si
descrescător după durata testului.
select * from teste where PROFIL='matematică-informatică' order by lower(DISCIPLINA)
asc, DURATA desc;
e. Modificați durata testului “Componentele calculatorului” la 40 min si tipul acestuia in
test grila.
update teste set DURATA=40, TIP='grila' where DENUMIRE='Componentele calculatorului';
f. Afişaţi disciplina / disciplinele cu cele mai multe teste.
select disciplina from teste group by disciplina having count(*)=(select max(t) from (select
count(*) as t from teste group by DISCIPLINA));
4. Se consideră tabela ABONATI cu structura:
NUME, CNP, MIN_INCLUSE, MIN_UTILIZATE, VALOARE, ACHITAT, RETEA.
a. Să se creeze tabela şi să se introducă 10 articole care să corespundă cerinţelor următoare;
create table abonati (NUME varchar2(100), CNP varchar2(20), MIN_INCLUSE number(5),
MIN_UTILIZATE number(5), VALOARE number(10), ACHITAT number(1), RETEA varchar2(50));
insert into abonati values('Ionescu','1234',1000,550,NULL,1,'orange');
insert into abonati values('Popescu','1235',2000,1150,NULL,0,'orange');
insert into abonati values('Andrei','1236',100,100,NULL,0,'vodafone');
insert into abonati values('Cezar','1237',500,0,NULL,1,'vodafone');
insert into abonati values('Cezar2','1238',500,750,NULL,0,'vodafone');
b. Să se afişeze pentru fiecare abonat valoarea facturii pe care trebuie să o achite cunoscând
că minutele suplimentare costă cu 10% mai mult decât minutele incluse şi că tariful unui
minut inclus este de 0,25 lei;
update abonati set valoare=case when min_incluse>min_utilizate then 0.25*min_incluse
else 0.25*min_incluse+(min_utilizate-min_incluse)*0.275 end;
c. Afişaţi abonaţii care sunt restanţi;
select nume,cnp,valoare as "valoare factura" from abonati;
select * from abonati where achitat=0;
d. Să se afişeze abonaţii cu valoarea facturată cea mai mare;
select * from abonati where valoare=(select max(valoare) from abonati);
e. Pentru abonatul a cărui CNP s-a introdus de la tastatură să se indice dacă a achitat;
select nume, case when achitat=1 then 'achitat' else 'neachitat' end from abonati where
cnp=:cnp;
f. Să se afişeze valoarea obţinută din încasări pentru fiecare reţea
select retea,sum(valoare) from abonati group by retea;

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