Upload
silica
View
3
Download
0
Embed Size (px)
DESCRIPTION
bd
Citation preview
ACADEMIA DE STUDII ECONOMICE BUCURESTIFACULTATEA DE CIBERNETICA,STATISTICA SI INFORMATICA ECONOMICA
PROIECT - BAZE DE DATE -Student: Ivascu Claudia-Anitta
An.II Seria.C Grupa : 1034
BUCURESTI,2010Initial baza de date avea urmatoarele caracteristici:
ANGAJATI:CODA
NUME
ADRESA : LOC
STR structura de grup DATA_ANG
CODS
FUNCTIE
SAL
CODDEP
DEPARTAMENTE :
CODDEP
DEN_DEP PRODUSE:
CODP
DENP
PRET
STOC CLIENTI:
CODC
DENC
LOC
COMENZI:
NRCOMCODC
DATA_I
DATA_LVAL
RAND_COM
NRCOM
CODP
CANTSe elimina structurile de grup din tabela ANGAJAT. ANGAJATI: CODA
NUME
LOC STR
DATA_ANG
CODS
FUNCTIE
SAL
CODDEP
Datorita faptului ca intre campurile tabelelor nu mai exista dependente de nici un alt fel (functionale, incomplete sau tranzitive) putem considera tabelele ca fiind in FN3.Baza de date contine urmatoarele tabele :
ANGAJATI ( coda number(3) primary key, nume varchar2(30) , loc varchar2(20), str varchar2(10), data_ang date, cods number(3): Angajati , functie varchar2(30), sal number(5),coddep number(3) : Departamente)
DEPARTAMENTE (coddep numbe(3) primary key, den_dep varchar2(30))
PRODUSE (codp varchar2(3) primary key, denp varchar2(30), pret number(5), stoc number(5), coddep numbe(3):Departamente)
CLIENTI (codc number(3) primary key, denc varchar2(50), loc varchar2(20))
COMENZI(nrcom number(5) primary key, data_i date, data_l date, val number (10), codc number(3):Clienti)
RAND_COM (nrcom number(5):Comenzi, codp varchar2(3): Produse, cant number(5))Definirea legaturilor :
Legatura dintre Departamente si Angajati este de tipul 1: m (un angajat apartine unui singur department, un departament are mai multi angajati) Legatura dintre Departamente si Produse este de tipul 1:m ( un produs este oferit de un singur department , un department contine mai multe produse)
Legatura dintre Produse si Comenzi este de tipul m:m , relatie despartita in relatie 1:1( intre Produse si Rand_com) si 1:m (intre Rand_com si Comenzi)
Legatura dintre Clienti si Comenzi este de tipul 1:m ( un client poate face mai multe comenzi insa o comanda este data de un singur client)*Alte rectrictii le vom defini ulterior in cerinte.
SCHEMA CONCEPTUALA ANGAJATICODANUMELOCSTRDATA_ANGCODSFUNCTIESALCODDEP
PRODUSE
CODPDENPPRETSTOCCODDEP
DEPARTAMENTCODDEPDEN_DEP
RAND_COM
NRCOMCODPCANT
COMENZI
NRCOMCODCDATA_IDATA_LVAL
CLIENTI
CODCDENCLOC
CREAREA SI GESTIUNEA TABELELOR
1. Sa se creeze tabelele cu structurile de mai sus.create table angajati (coda number(3) constraint PK_ang primary key, nume varchar2(30), loc varchar2(20),
str varchar2(10),
data_ang date,
cods number(3) references angajati(coda) ,
functie varchar2(30),
sal number(5),
coddep number(3) references departamente(coddep);create table departamente (coddep numbe(3) constraint PK_dep primary key,
den_dep varchar2(30))
create table produse(codp varchar2(3) constraint PK_prod primary key, denp varchar2(30), pret number(5), stoc number(5), coddep numbe(3) references departamente(coddep));create table clienti(codc number(3) constraint PK_cl primary key,
denc varchar2(50),
loc varchar2(20));
create table comenzi(nrcom number(5) constraint PK_com primary key,
data_i date,
data_l date,
val number (10),
codc number(3) references client(codc));
create table rand_com(nrcom number(5) references comenzi(nrcom),
codp varchar2(3) references produse(codp),
cant number(5));
2. Sa se defineasca restrictiile de cheie primara pentru tabela Rand_com (codp si nrcom)
alter table Rand_com add constraint PK_pc primary key (nrcom,codp);
alter table Rand_com
add constraint FK_pc_prod references Produse (codp);
alter table Rand_com on delete set null
add constraint FK_pc_com foreign key (nrcom)
references Comenzi (nrcom) on delete cascade;
3. Sa se adauge restrictia entitatii (NOT NULL) pentru tabela Produse , atributul denp.
alter table Produse
add constraint NN_codp check ("codp" IS NOT NULL);
4. Sa se adauge restrictia de unicitate pentru atributele codc si coda din tabelele Clienti, respective Angajati. alter table Clienti
add constraint Un_cc unique(codc);
alter table Angajati
add constraint Un_ang unique(coda);
5. Sa se marcheze atributul str din tabela Angajati ca atribut neutilizat. alter table Angajati set unused(str); 6. Sa se stearga atributul marcat ca neutilizat. alter table Angajati drop unused columns;ACTUALIZAREA DATELOR1. Scriptul de adaugare de inregistrari :
Delete from Angajati;Insert into Angajati values ( 1, Negrea Dorin, Hunedoara, to_date ('01-03-2000', 'dd-mm-yyyy'), null , Sef Depozit, 1000,009);Insert into Angajati values ( 2, Barbu Mihai, Cluj, to_date ('17-06-2000', 'dd-mm-yyyy'), 1, Functionar Depozit, 800,009);
Insert into Angajati values ( 3, Demea Monica, Iasi, to_date ('21-07-2000', 'dd-mm-yyyy'), null , Sef Vanzari, 1000,006);
Insert into Angajati values ( 4, Vantu Catalin, Deva, to_date ('14-01-2001', 'dd-mm-yyyy'), 3, Functionar Vanzari, 800,006);
Insert into Angajati values ( 5, Marin Ion, Galati, to_date ('02-11-2000', 'dd-mm-yyyy'), 1 , Functionar Depozit, 800,009);
Insert into Angajati values ( 6, Perijoc Daniel, Hunedoara, to_date ('13-09-2001', 'dd-mm-yyyy'), null , Sef Contabilitate, 1000,003);
Insert into Angajati values ( 7, Flore Andreea, Bucuresti, to_date ('17-11-2001', 'dd-mm-yyyy'), 6 , Economist, 900,003);
Insert into Angajati values ( 8, Popescu Ion, Arad, to_date ('01-09-2002', 'dd-mm-yyyy'), 1 , Functionar Depozit, 800,009);
Insert into Angajati values ( 9, Lungu Lucian, Alexandria, to_date ('03-12-2004', 'dd-mm-yyyy'), 3 , Functionar Depozit, 800,009);
Insert into Angajati values ( 10, Munteanu Irina, Bucuresti, to_date ('09-04-2006', 'dd-mm-yyyy'), 1, Functionar Vanzari, 800,006);
Delete from Departamente;
Insert into Departamente values (003, Contabilitate);
Insert into Departamente values (006, Vanzari);
Insert into Departamente values (009, Depozit);
Delete from Produse ;
Insert into Produse values (V44, Vobler, 25 , 300 , 009);Insert into Produse values (L45, Lansete, 400 , 100 , 009);
Insert into Produse values (M46, Mulinete, 150 , 233 , 009);
Insert into Produse values (H47, Huse, 175 , 200 , 009);
Insert into Produse values (CT48, Cort, 1000 , 44 , 006);
Insert into Produse values (B49, Barca, 850 , 15 , 006);
Insert into Produse values (MG50, Minciog, 30 , 400 , 009);
Insert into Produse values (JV51, Juvelnic, 17 , 300 , 009);
Delete from Clienti;
Insert into Clienti values ( 011, Gipo , Bucuresti);Insert into Clienti values ( 012, Rapala , Arad);
Insert into Clienti values ( 013, BibanFish , Cluj);
Insert into Clienti values ( 014, TotalFishing , Bucuresti);
Insert into Clienti values ( 015, CrazyFish , Timisoara);
Insert into Clienti values ( 016, Pescarul , Craiova);
Insert into Clienti values ( 017, Pescarusi , Iasi);
Insert into Clienti values ( 018, Campionii , Tulcea);
Insert into Clienti values ( 019, Schimano , Braila);
Delete from Comenzi;
Insert into Comenzi (nrcom, data_i , data_l, val , codc )values (1000, to_date ('18-05-2000', 'dd-mm-yyyy') , to_date ('20-05-2000', 'dd-mm-yyyy') 450000, 015);Insert into Comenzi (nrcom, data_i , data_l, val , codc )
values (1444, to_date ('23-05-2001', 'dd-mm-yyyy') , to_date ('20-06-2001', 'dd-mm-yyyy') 670000, 011);
Insert into Comenzi (nrcom, data_i , data_l, val , codc )
values (1892, to_date ('12-09-2001', 'dd-mm-yyyy') , to_date ('14-09-2001', 'dd-mm-yyyy') 20000, 014);
Insert into Comenzi (nrcom, data_i , data_l, val , codc )
values (1920, to_date ('03-11-2001', 'dd-mm-yyyy') , to_date ('16-11-2001', 'dd-mm-yyyy') 50000, 017);
Insert into Comenzi (nrcom, data_i , data_l, val , codc )
values (1988, to_date ('11-01-2002', 'dd-mm-yyyy') , to_date ('24-01-2001', 'dd-mm-yyyy') 234900, 019);
Insert into Comenzi (nrcom, data_i , data_l, val , codc )
values (2000, to_date ('03-03-2002', 'dd-mm-yyyy') , to_date ('09-03-2002', 'dd-mm-yyyy') 640000, 018);
Insert into Comenzi (nrcom, data_i , data_l, val , codc )
values (2014, to_date ('15-05-2002', 'dd-mm-yyyy') , to_date ('22-05-2002', 'dd-mm-yyyy') 540000, 014);
Insert into Comenzi (nrcom, data_i , data_l, val , codc )
values (2231, to_date ('01-09-2002', 'dd-mm-yyyy') , to_date ('10-09-2002', 'dd-mm-yyyy') 760000, 012);
Insert into Comenzi (nrcom, data_i , data_l, val , codc )
values (2280, to_date ('18-10-2002', 'dd-mm-yyyy') , to_date ('27-10-2001', 'dd-mm-yyyy') 870000, 017);
Insert into Comenzi (nrcom, data_i , data_l, val , codc )
values (2300, to_date ('07-01-2003', 'dd-mm-yyyy') , to_date ('17-01-2003', 'dd-mm-yyyy') 900000, 019);
Insert into Comenzi (nrcom, data_i , data_l, val , codc )
values (2314, to_date ('14-07-2003', 'dd-mm-yyyy') , to_date ('26-07-2003', 'dd-mm-yyyy') 470000, 015);
Insert into Comenzi (nrcom, data_i , data_l, val , codc )
values (2443, to_date ('09-12-2003', 'dd-mm-yyyy') , to_date ('20-01-2004', 'dd-mm-yyyy') 180000, 014);
Insert into Comenzi (nrcom, data_i , data_l, val , codc )
values (2458, to_date ('19-04-2004', 'dd-mm-yyyy') , to_date ('30-04-2004', 'dd-mm-yyyy') 340000, 012);
Insert into Comenzi (nrcom, data_i , data_l, val , codc )
values (2517, to_date ('15-10-2004', 'dd-mm-yyyy') , to_date ('18-10-2004', 'dd-mm-yyyy') 280000, 013);
Insert into Comenzi (nrcom, data_i , data_l, val , codc )
values (2561, to_date ('18-09-2005', 'dd-mm-yyyy') , to_date ('20-09-2005', 'dd-mm-yyyy') 150000, 011);
Insert into Comenzi (nrcom, data_i , data_l, val , codc )
values (2584, to_date ('14-03-2006', 'dd-mm-yyyy') , to_date ('23-03-2006', 'dd-mm-yyyy') 270000, 017);
Insert into Comenzi (nrcom, data_i , data_l, val , codc )
values (2617, to_date ('07-07-2006', 'dd-mm-yyyy') , to_date ('02-08-2006', 'dd-mm-yyyy') 310000, 018);
Insert into Comenzi (nrcom, data_i , data_l, val , codc )
values (2648, to_date ('24-02-2007', 'dd-mm-yyyy') , to_date ('06-03-2007', 'dd-mm-yyyy') 180000, 016);
Insert into Comenzi (nrcom, data_i , data_l, val , codc )
values (2741, to_date ('11-08-2007', 'dd-mm-yyyy') , to_date ('04-09-2007', 'dd-mm-yyyy') 287500, 015);
Insert into Comenzi (nrcom, data_i , data_l, val , codc )
values (3011, to_date ('12-01-2008', 'dd-mm-yyyy') , to_date ('13-02-2008', 'dd-mm-yyyy') 2125000, 019);
Insert into Comenzi (nrcom, data_i , data_l, val , codc )
values (3344, to_date ('14-07-2008', 'dd-mm-yyyy') , to_date ('13-08-2008', 'dd-mm-yyyy') 480000, 013);
Insert into Comenzi (nrcom, data_i , data_l, val , codc )
values (4529, to_date ('10-05-2009', 'dd-mm-yyyy') , to_date ('15-05-2009', 'dd-mm-yyyy') 620000, 017);
Delete from Rand_com;
Insert into Rand_com(1444, CT48, 670); Insert into Rand_com(1920, L45, 125);
Insert into Rand_com(2014, M46, 3600);
Insert into Rand_com(2280, CT48, 497); Insert into Rand_com(2443, CT48, 180); Insert into Rand_com(2458, MG50, 11334); Insert into Rand_com(2561, M46, 1866); Insert into Rand_com(2617, V44, 12400); Insert into Rand_com(2741, JV51, 16910); Insert into Rand_com(3011, B49, 2500);Comenzile DML1. Sa se adauge in tabela Clienti_buc informatii despre clientii din Bucuresti. Tabela Clienti_buc are aceeiasi structura ca tabela Clienti. create table clienti_buc(codc number(3) constraint PK_cl primary key,
denc varchar2(50),
loc varchar2(20));
insert into client_buc select * from Clienti
where unitcap(loc)= Bucuresti;
2. Sa se utilizeze o singura comanda INSERT pentru a incarca in tabela Istorie_sal codul numele si salariul angajatiilor care au un salariu > 900 , iar in tabela Istorie_functie codul numele si functia angajatiilor care au functia Functionar Depozit.
create table istorie_sal(coda number(3) constraint PK_ang primary key , nume varchar2(30), sal number(5));create table istorie_functie(coda number(3) constraint PK_ang primary key , nume varchar2(30), functie varchar2(30)) ;insert all
when sal>900 then
into istorie_sal values (coda , nume , sal)when functie= Functionar Depozit then
into istorie_functie values(coda, nume, functie)
select coda , nume, sal, functie from Angajati;3. Sa se utilizeze o singura comanda insert pentru a incarca in tabela Istorie_functie codul angajatiilor care au functia Functionar Vanzari, in tabela Istorie_sal codul numele si salariul angajatiilor care au salariu egal cu 900 iar in tabela Rest codul celorlalti angajati.Create table Rest(coda number(3) constraint PK_res primary key);
Delete from Istorie_functie; Delete from Istorie_Sal;Insert first
When functie= Functionar Vanzari then
into istorie_functie values(coda, nume, functie)
when sal=900 then
into istorie_sal values (coda , nume , sal)
else
into rest values(coda)
select coda,nume,functie,sal from Angajati;
Comanda Update :1. Sa se diminueze stocul cu 45 de buc pentru produsul Lanseta.Update Produse
Set stoc=stoc-45
Where denp= Lanseta;
2. Sa se modifice data de livrare si valoarea comenzii 1000 comanda 1000 sa aiba acelasi termen de livrare si valoare cu comanda 1444)Update Comenzi
Set data_l=(select data_l from comenzi
Where nrcom=1444),
Val=(select val from comenzi
Where nrcom=1444)
Where nrcom=1000;
3. Sa se modifice salariul angajatiilor cu functia Functionar Depozit, la 750.
Update Angajati
Set sal=750
Where functia=Functionar Depozit;
Comanda Delete :4. Sa se stearga toti clientii din Bucuresti.
Delete from Clienti
where unitcap(loc)= Bucuresti;
Sa se anuleze comanda anterioara-
Rollback;
Exemple de interogari variateComanda Select :1. Sa se afiseze toate produsele , ordonate crescator dupa denumire.Select * from produse
Order by denp desc;
2. Sa se simuleze o proiectie pe tabela Clienti.
Select distinct loc from client;
3. Sa se simuleze o selectie pe tabela Angajati.
Select * from Angajati
Where coddep= 009 ;
4. Sa se simuleze un produs cartezian intre tabelele Clienti si Comenzi.
Select denc,nrcom from client , comenzi;5. Sa se afiseze comenzile a caror valoare este intre 500000 si 900000.Select nrcom from comenzi
Where val between 500000 and 900000
6. Sa se afiseze codul persoanei , numele concatenate cu codul si lungimea atrubutului nume , numai pentru persoanele a caror nume are a doua litera e.Select coda,concat(coda,nume), length (nume)
From Angajati
Where nume like e%;7. Sa se afiseze numele angajatiilor la care ultima litera din nume este litera n.
Select nume from Angajati
Where substr(nume,-1,1)= n;
8. Sa se afiseze comanda a carei valoare este 620000 si perioada de timp corespunzatoare in saptamani intre data incheierii comenzii si data curenta.
Select nrcom, (sysdate-data_i)/7 sapt from comenzi
Where val= 620000;
9. Sa se afiseze comenzile cu termenul de livrare in luna septembrie.
Select nrcom from comenzi
Where extract (month from data_l)=9;
10. Sa se afiseze numele angajatilor care au o vechime mai mare de 5 ani.
Select nume from Angajati
Where extract(year from sysdate)-extract(year from data_ang)>5;
11. Sa se afiseze pentru toate comenzile , data incheierii comenzii in format MM/YY
Select nrcom, to_char (data_i, MM/YY) data from comenzi;
12. Daca produsul este :
Vobler se va afisa stocul impartit la 10 Huse se va afisa stocul inmultit cu 1.7
Mulineta se va afisa stocul crescut cu 2%. Pentru celelalte produse stocul ramane acelasi
Select codp , stoc,
Case
When denp = Vobler then stoc=stoc/10
When denp = Huse then stoc=stoc*1.7
When denp = Mulinete then stoc=stoc+soc*2%
Else stoc=stoc
End
From Produse;
13. Pentru toate comenzile se adauga 7 luni de la data incheierii comenzii si se afiseaza urmatoarea zi de marti dupa acea data.Select to_char(next_day(add_months(data_i,7), TUESDAY);14. Sa se afiseze pentru fiecare produs , denumirea si valoarea totala a vanzarilor .Select p.denp denumire , sum(p.pret*r.cant) vanzari
From produse p , rand_com r
Where p.codp=r.codp
Grup by p.denp;
15. Pentru toate produsele din nomenclatorul de produse , sa se afiseze denumirea si cantitatea totala vanduta.
Select p.denp denumire , sum (r.cant) cantitate
From produse p , rand_com r
Where p.codp=r.codp(+)
Grup by p.denp;
16. Sa e afiseze produsele care nu s-au vandut.
Select p.denp denumire
From produse p , rand_com r
Where p.codp=r.codp(+) and cant is null
17. Sa se afiseze numele fiecarui angajat si numele sefului direct superior .Select muncitori.nume || lucreaza pentru || sefi.nume
From Angajati muncitori , angajati sefi
Where muncitori.cods=sefi.coda;
18. Sa se afiseze valoarea maxima , valoarea medie , valoarea minima si valoarea totala pentru comenzile cu termen de livrare in septembrie. Select avg(val) , max(val) , min(val) , sum(val)
From comenzi
Where data_l like %09%;
Where extract(month from data_l)=9;
19. Sa se calculeze cantitatea medie vanduta.Select avg(sum(r.cant)) cantitatea medie
From produse p , rand_com r
Where p.codp=r.codp(+) grup by p.denp;20. Sa se afiseze termenul de livrare al ultimei comenzi si termenul de livrare al celei mai vechi comenzi.
Select min(data_l) ultima , max(data_l) veche From comenzi ;
21. Sa se afiseze numarul de produse vandute.Select count(distinct(codp)) from rand_com;
22. Sa se afiseze cantitatea medie vanduta , numai pentru acele produse a caror cantitate medie vanduta este mai mare decat 1000
Select p.denp denumire , avg(r.cant) cant_med
From produse p , rand_com r Where r.codp=p.codp
Group by p.denp Having avg(r.cant)>1000;23. Sa se afiseze persoanele angajate la acelasi department cu Marin Ion.
Select nume from Angajati
Where coddep=(select coddep from Angajati where nume= Marin Ion)And nume < > Marin Ion ;
24. Sa se afiseze produsele care au cantitatea minima vanduta mai mare decat cea corespunzatoare produsului Cort
Select p.denp denumire , min(r.cant) cant_min
From rand_com r , produse p
Where r.codp=p.codp
Group by p.denp
Having min(r.cant)>(select min(cant) from rand_com
where copdp=(select codp from produse where denp= Cort));
25. Sa se afiseze detalii despre angajatii care au acelasi sef si aceeiasi functie cu angajatul care are codul de angajat 2 si 5.
Select coda, functie , cods from Angajati
Where (functie , cods ) in (select functie, cods from angajati where coda in (2,5))
And coda not in (2,5);
26. Sa se afiseze numele , valoarea totala comandata si numarul de comenzi pentru toate produsele care au fost comandate de cel putin 2 ori si a caror valoare totala este diferita de 20000.
Select p.denp , sum(r.cant*p.pret) valoare , count(r.nrcom)From produse p, rand_com r
Where p.codp=r.codp
Having count(r.nrcom)>=2
INTERSECT
Select p.denp , sum(r.cant*p.pret) valoare , count(r.nrcom)
From produse p, rand_com r
Where p.codp=r.codp
Having sum(r.cant*p.pret) < > 20000;
27. Afisati comenzile care au nr comenzii intre 1000 si 2500 eliminandu-le pe cele care au valoarea 640000 sau 760000.
Select * from comenzi
Where nrcom between 1000 and 2500
MINUS
Select * from comenzi
Where val in (640000,760000);
Gestiunea altor obiecte ale bazei de date
Tabele virtuale :1. Sa se creeze o tabela virtuala Ang_2000 care va contine informatii despre persoanele angajate in 2000.Create view Ang_2000 as select * from Angajati
Where extract(year from data_ang)=2000;
2. Sa se strearga angajatul Negrea din aceasta tabela. Delete from Ang_2000 where coda=1;
-sa se anuleze stergerea-
Rollback;
3. Sa se stearga tabela virtual create anterior.
drop view Ang_2000;
Secvente:
4. Sa se creeze o secventa Com_nr care incepe cu valoarea 1000 , pasul de incrementare este 10 , iar valoarea maxima 3300. Secventa se va folosi pentru a asigura unicitatea atributului nrcom din tabela Comenzi.Create sequence Com_nr
Increment by 10 start with 1000
Maxvalue 3300 noncycle
5. Sa se stearga secventa.
Drop sequence Com_nr
Indecsi:
6. Sa se creeze un index pe atributul denc din tabela Clienti.
Create index Cl_den_index on Clienti(denc);7. Sa se stearga indexul.
Drop index Cl_den_index ; Sinonime:
8. Sa se creeze un sinonim public pentru tabela Produse a utilizatorului Student.Create public synonym Prod for Student.Produse;
9. Sa se stearga sinonimul.
Drop synonym Prod;