57

Click here to load reader

Proiect Baze de Date

Embed Size (px)

Citation preview

Page 1: Proiect Baze de Date

PROIECT BAZE DE DATE

Crearea unei baze de date pentru firma de construcţii de mobilier „MOB.CR”

Coordonator: Lect. univ. dr. Anda Belciu Student:Carabulea Roxana-Elena An II

Seria A Grupa 1018 CSIE

2012-2013

Page 2: Proiect Baze de Date

I.Descrierea problemei

Pentru buna funcţionare a unei firme este necesară o bază de date care să ţină evidenţa tuturor activităţilor care au loc în cadrul firmei respective.

O bază de date este un ansamblu de colecţii de date aflate în interdependenţă, împreună cu dicţionarul de date care conţine descrierea datelor şi a legăturilor dintre ele, fapt ce asigură interdependenţa datelor faţă de aplicaţii.

Activitatea firmei „MOB.CR” se desfăşoară astfel: furnizorii aprovizionează magazia cu materiale pe baza unor facturi, materialele sunt stocate în magazie şi mai apoi vândute clienţilor.În urma achiziţionării unui material, fiecare client va primi un bon.

Pentru accesul rapid la informaţiile legate de aceste activităţi am realizat o bază de date.Am pus accentul pe subiectele mai importante ale procesului economic, ajungând astfel la următoarele tabele: „FurnizoriCR”, „FacturiCR”, „MagazieCR”, „BonuriCR”, „Conţinut_facturăCR”, „Conţinut_bonCR”, „MaterialeCR”.

Legăturile dintre tabele

Asocierile dintre mulţimile de entităţi se stabilesc în funcţie de modul în care se desfăşoară activitatea modelată. Pentru aceasta, în continuare sunt explicate legăturile dintre tabele:

a) între tabelele FurnizoriCR şi FacturiCR există o legătură 1 la m: un furnizor poate emite mai multe facturi, iar o factură poate fi emisă de un singur furnizor. Cheia primară din tabela „părinte” (cheia primară este Cod_furnizor, iar tabela părinte este FurnizoriCR) se adaugă în tabela „copil” (FacturiCR) ca şi cheie externă(Cod_furnizor). Cele două trebuie să fie de acelaşi tip.

b) între tabelele FacturiCR şi MaterialeCR există o legătura de tip mulţi la mulţi: o factură poate conţine mai multe materiale, iar un material poate fi inclus în mai multe facturi. De aceea se adaugă o tabelă suplimentară Conţinut_facturăCR care va conţine cheile primare ale tabelelor iniţiale care vor fi trecute ca şi cheie secundară în tabela Conţinut_facturăCR. Cheia primară a acestei tabele va fi una compusă din Nr_factură şi Cod_material.

c) între tabelele MagazieCR şi BonuriCR există o legătură de tip 1 la m: o magazie emite mai multe bonuri de consum, iar un bon poate fi emis de la o singură magazie. Cheia primară Cod_magazie din tabela „părinte” MagazieCR va deveni cheie externă în tabela „copil” BonuriCR.

d) Între tabelele BonuriCR şi Materiale CR există o legătură de tip mulţi la mulţi: într-un bon de consum pot fi cuprinse mai multe materiale, iar un material poate fi pe mai multe bonuri. De aceea se introduce o tabelă suplimentară Conţinut_bonCR care va conţine cheile primare ale tabelelor iniţiale care vor fi trecute ca şi chei externe în tabela Conţinut_bonCR. Cheia primară a acestei tabele va fi una compusă din Nr_bon şi Cod_material.

Pentru crearea şi definirea tipului de date din tabel am folosit comenzile de definire a datelor (LDD): CREATE, ALTER şi DROP.

II.Crearea tabelelor

1.Creaţi tabela „FurnizoriCR” conform machetei următoare:

Nume coloană Cod_furnizorCR Denumire_furnizorCR

Adresă_furnizorCR Email_furnizorCR

BancaCR ContCR

Tipul restricţiei Primary keyTip dată Number Char Char Varchar2 Char Char

Page 3: Proiect Baze de Date

Lungime 5 50 50 30 30 13

CREATE TABLE FurnizoriCR(Cod_furnizorCR NUMBER(5) CONSTRAINT cod_fz_pk PRIMARY KEY,Denumire_furnizorCR CHAR(50) NOT NULL,Adresa_furnizorCR CHAR(50), Email_furnizorCR VARCHAR2(30) CONSTRAINT ck_mail UNIQUE,BancaCR CHAR(30),ContCR CHAR(13)) ;

Pentru câmpul „Denumire_furnizorCR” am adăugat restricţia NOT NULL, iar pentru câmpul „Email_furnizorCR” am adăugat restricţia UNIQUE.

Page 4: Proiect Baze de Date

2.Creaţi tabela „MagazieCR” după următoarea machetă:

Nume coloană Cod_magazieCR Denumire_magazieCR GestionarCRTipul restricţiei Primary keyTip dată Number Char CharLungime 5 50 20

CREATE TABLE MagazieCR(Cod_magazieCR NUMBER(5) CONSTRAINT cod_magazie_pk PRIMARY KEY,Denumire_magazieCR CHAR(50) NOT NULL,GestionarCR CHAR(20)) ;

3.Creaţi tabela „FacturiCR” după următoarea machetă:

Nume Număr_facturăCR Data_facturăCR Cod_furnizorCRTipul restricţiei Primary key Foreign keyTip dată Number Date Number

Page 5: Proiect Baze de Date

Lungime 5 5

CREATE TABLE FacturiCR(Numar_facturaCR NUMBER(5) CONSTRAINT Nr_fact_pk PRIMARY KEY,Data_facturaCR DATE,Cod_furnizorCR NUMBER(5) CONSTRAINT fk_cod_fz REFERENCES FurnizoriCR(Cod_furnizorCR)) ;

4.Creaţi tabela „BonuriCR” după următoarea machetă:

Nume Număr_bonCR Data_bonCR Cod_magazieCRTipul restricţiei Primary key Foreign keyTip dată Number Date NumberLungime 3 5

CREATE TABLE BonuriCR(Numar_bonCR NUMBER(3) CONSTRAINT nr_bon_pk PRIMARY KEY,Data_bonCR DATE,Cod_magazieCR NUMBER(5) CONSTRAINT cod_mag_fk REFERENCES MagazieCR(Cod_magazieCR)

Page 6: Proiect Baze de Date

) ;

5.Creaţi tabela „MaterialeCR” după următoarea machetă:

Nume Cod_materialeCR Denumire_materialeCR Unitate_de_masuraCRTipul restricţiei Primary keyTip dată Number Char NumberLungime 5 50 3

CREATE TABLE MaterialeCR(Cod_materialeCR NUMBER(5) CONSTRAINT cod_materiale_pk PRIMARY KEY,Denumire_materialeCR CHAR(50) NOT NULL,Unitate_de_masuraCR NUMBER(3)) ;

Page 7: Proiect Baze de Date

6.Creaţi tabela „Conţinut_facturăCR” după următoarea machetă:

Nume Număr_facturăCR Cod_materialeCR Cantitate_intratăCRTipul restricţiei Foreign Key Foreign KeyTip dată Number Number NumberLungime 5 5 5

CREATE TABLE Continut_facturaCR(Numar_facturaCR NUMBER(5) CONSTRAINT fk_nr_fact REFERENCES FacturiCR(Numar_facturaCR),Cod_materialeCR NUMBER(5) CONSTRAINT fk_cod_mat REFERENCES MaterialeCR(Cod_materialeCR),Cantitate_intrataCR NUMBER(5)) ;ALTER TABLE Continut_facturaCRADD CONSTRAINT nr_fact_cod_mat_pr PRIMARY KEY(Numar_facturaCR, Cod_materialeCR);

Page 8: Proiect Baze de Date

Pentru acest tabel cheia primară va fi una compusă din Număr_facturăCR şi Cod_materialCR.

7.Creaţi tabela „Conţinut_bonCR” după următoarea machetă:

Nume Număr_bonCR Cod_materialeCR Cantitate_ieşităCRTipul restricţiei Foreign key Foreign keyTip dată Number Number NumberLungime 3 5 5

CREATE TABLE Continut_bonCR(Numar_bonCR NUMBER(3) CONSTRAINT fk_nr_bon REFERENCES BonuriCR(Numar_bonCR),Cod_materialeCR NUMBER(5) CONSTRAINT fk_cod_mat_1 REFERENCES MaterialeCR(Cod_materialeCR),Cantitate_iesitaCR NUMBER(5)) ;ALTER TABLE Continut_bonCRADD CONSTRAINT nr_bon_cod_mat_1_pk PRIMARY KEY(Numar_bonCR, Cod_materialeCR);

Page 9: Proiect Baze de Date

II.Aplicaţii asupra tabelelor folosind comenzi de definire a datelor(DDL)

Structura tabelelor poate fi modificată ulterior, lucru care se realizează cu ajutorul comenzii ALTER. În continuarea voi da exemple de câteva modificări pe care le-am efectuat asupra tabelelor.

1.Adăugaţi coloana „CNP” în tabela „FurnizoriCR” având tipul Varchar2(13) și apoi ștergeti-o.

ALTER TABLE FurnizoriCR ADD (CNP VARCHAR2(13));ALTER TABLE FurnizoriCR DROP COLUMN CNP;

Page 10: Proiect Baze de Date

2.Modificaţi tabela „FurnizoriCR” astfel încât câmpul „Email_furnizorCR” să fie de tipul popescu @ yahoo.com sau ionescu @ gmail.com etc.

ALTER TABLE FurnizoriCR ADD CONSTRAINT verif_mail CHECK (Email_furnizorCR LIKE '%@%.%');

3. În tabela „Conţinut_facturăCR” adăugaţi restricţia de integritate „verif_cantintrata” astfel încât numerele introduse în câmpul „Cantitate_intratăCR” să fie cuprinse între 10 şi 500.

ALTER TABLE Continut_facturaCR ADD CONSTRAINTS verif_cantintrata CHECK (Cantitate_intrataCR BETWEEN 10 AND 500);

Page 11: Proiect Baze de Date

4.În tabela „FurnizoriCR” redenumiţi câmpul „Adresa_furnizorCR” în „Domiciliu_furnizorCR”.

ALTER TABLE FurnizoriCR RENAME COLUMN Adresa_furnizorCR TO Domiciliu_furnizorCR;

5. Modificaţi tabela „MagazieCR” astfel încât câmpul „GestionarCR” să fie de tipul CHAR(50).

ALTER TABLE MagazieCR MODIFY (GestionarCR CHAR(50));

Page 12: Proiect Baze de Date

6. Dezactivaţi restricţia de integritate verif_cantintrata.

ALTER TABLE Continut_facturaCR DISABLE CONSTRAINT verif_cantintrata;

7. În tabela „Magazie” adăugaţi câmpul „Adresa_magazieCR” de tip CHAR(50).

ALTER TABLE MagazieCR ADD (adresa_magazieCR CHAR(50));

Page 13: Proiect Baze de Date

8. Ştergeţi câmpul „adresa_magazieCR”.

ALTER TABLE MagazieCR DROP COLUMN adresa_magazieCR;

Page 14: Proiect Baze de Date

IV.Aplicaţii folosind comenzi de manipulare a datelor(DML)

1.Inseraţi date în tabelul FurnizoriCR.

INSERT INTO FurnizoriCRVALUES (1, 'Popescu Marcel', 'Bucuresti', '[email protected]', 'BCR', 398765);

INSERT INTO FurnizoriCRVALUES(4, 'Mircea Daniela', 'Constanta', '[email protected]', 'BRD', 764321);

INSERT INTO FurnizoriCRVALUES(11, 'Bucataru Mihaela', 'Baia-Mare', '[email protected]', 'BT', 237634);

INSERT INTO FurnizoriCRVALUES(23, 'Pavel Cosmis', 'Iasi', '[email protected]', 'BCR', 567234);

INSERT INTO FurnizoriCRVALUES(14, 'Popoiu Sorina', 'Timisoara', '[email protected]', 'BT', 956521);

INSERT INTO FurnizoriCRVALUES(29, 'Dumitru Ion', 'Hunedoara', '[email protected]', 'BRD', 743199);

INSERT INTO FurnizoriCRVALUES(12, 'Popa Flavia', 'Iasi', '[email protected]', 'BCR', 123456);

INSERT INTO FurnizoriCRVALUES(13, 'Florescu Damian', 'Bucuresti', '[email protected]', 'BRD', 876256);

INSERT INTO FurnizoriCRVALUES(22, 'Dimitrie Vasile', 'Baia Mare', '[email protected]', 'BT', 876321);

INSERT INTO FurnizoriCRVALUES(24, 'Mardare Ionela', 'Constanta', '[email protected]', 'BCR', 590231);

Page 15: Proiect Baze de Date

2.Inseraţi date în tabelul MagazieCR

ALTER TABLE MagazieCR ADD(Salariul_gestionarCR NUMBER(10));

ALTER TABLE MagazieCR ADD(Dataangajare_gestionarCR DATE);

ALTER TABLE MagazieCR ADD(id_gestionarCR NUMBER(2));

INSERT INTO MagazieCRValues(2, 'Kappa', 'Popa Ion', 3000, to_date('17-06-1991', 'dd-mm-yyyy'), 1);

INSERT INTO MagazieCRValues(11, 'Terra', 'Anton Mircea', 2100, to_date('02-11-1995', 'dd-mm-yyyy'), 2);

INSERT INTO MagazieCRValues(13, 'Euro', 'Ilie Dan', 1900, to_date('23-01-2000', 'dd-mm-yyyy'), 3);

INSERT INTO MagazieCRValues(15, 'Kondo', 'Marinescu Cristi', 2500, to_date('11-03-1994', 'dd-mm-yyyy'), 4);

INSERT INTO MagazieCRValues(18, 'Main', 'Criscu Mihai', 1500, to_date('20-07-1999', 'dd-mm-yyyy'), 5);

INSERT INTO MagazieCRValues(20, 'Cargo', 'Damian Cosmin', 1600, to_date('20-09-1994', 'dd-mm-yyyy'), 6);

INSERT INTO MagazieCRValues(21, 'Dingo', 'Carpone Mircea', 2000, to_date('23-02-1994', 'dd-mm-yyyy'), 7);

INSERT INTO MagazieCRValues(23, 'Marko', 'Cozma Aurel', 2300, to_date('14-05-1997', 'dd-mm-yyyy'), 8);

Page 16: Proiect Baze de Date

INSERT INTO MagazieCRValues(24, 'Alka', 'Chiciura Andrei', 3100, to_date('01-01-1992', 'dd-mm-yyyy'), 9);

INSERT INTO MagazieCRValues(25, 'Blake', 'Gherea Flavian', 2650, to_date('07-09-2001', 'dd-mm-yyyy'), 10);

3.Inseraţi date în tabelul FacturiCR

INSERT INTO FacturiCRVALUES(23, to_date('14-06-2009', 'dd-mm-yyyy'), 1);

INSERT INTO FacturiCRVALUES(34, to_date('21-05-2008', 'dd-mm-yyyy'), 11);

INSERT INTO FacturiCRVALUES(36, to_date('19-09-2010', 'dd-mm-yyyy'), 23);

Page 17: Proiect Baze de Date

INSERT INTO FacturiCRVALUES(46, to_date('23-10-2009', 'dd-mm-yyyy'), 12);

INSERT INTO FacturiCRVALUES(15, to_date('18-01-2010', 'dd-mm-yyyy'), 13);

INSERT INTO FacturiCRVALUES(14, to_date('15-06-2009', 'dd-mm-yyyy'), 22);

INSERT INTO FacturiCRVALUES(16, to_date('07-07-2007', 'dd-mm-yyyy'), 11);

INSERT INTO FacturiCRVALUES(19, to_date('24-05-2009', 'dd-mm-yyyy'), 24);

INSERT INTO FacturiCRVALUES(21, to_date('19-06-2010', 'dd-mm-yyyy'), 22);

INSERT INTO FacturiCRVALUES(30, to_date('10-10-2010', 'dd-mm-yyyy'), 23);

Page 18: Proiect Baze de Date

4.Inseraţi date în tabelul BonuriCR

INSERT INTO BonuriCRVALUES(50, to_date('19-09-2010', 'dd-mm-yyyy'), 15);

INSERT INTO BonuriCRVALUES(52, to_date('16-07-2011', 'dd-mm-yyyy'), 20);

INSERT INTO BonuriCRVALUES(44, to_date('15-08-2009', 'dd-mm-yyyy'), 11);

INSERT INTO BonuriCRVALUES(49, to_date('23-06-2010', 'dd-mm-yyyy'), 13);

INSERT INTO BonuriCRVALUES(48, to_date('02-06-2011', 'dd-mm-yyyy'), 2);

INSERT INTO BonuriCRVALUES(55, to_date('06-11-2011', 'dd-mm-yyyy'), 11);

INSERT INTO BonuriCRVALUES(56, to_date('14-11-2009', 'dd-mm-yyyy'), 21);

INSERT INTO BonuriCRVALUES(57, to_date('28-01-2010', 'dd-mm-yyyy'), 20);

INSERT INTO BonuriCRVALUES(58, to_date('19-10-2011', 'dd-mm-yyyy'), 21);

INSERT INTO BonuriCRVALUES(59, to_date('22.02.2009', 'dd-mm-yyyy'), 15);

Page 19: Proiect Baze de Date

5.Inseraţi date în tabelul MaterialeCR

ALTER TABLE MaterialeCR MODIFY (unitate_de_masuraCR VARCHAR2(20));

INSERT INTO MaterialeCRValues(12345, 'Rigips', 'kg');

INSERT INTO MaterialeCRValues(25647, 'Folie aluminiu', 'mm');INSERT INTO MaterialeCRValues(63219, 'Adeziv structurali', 'g');

INSERT INTO MaterialeCRValues(95412, 'Ciment', 'm^3');

INSERT INTO MaterialeCRValues(10762, 'Caramida', 'm^2');

Page 20: Proiect Baze de Date

INSERT INTO MaterialeCRValues(20978, 'Nisip', 'm^3');

INSERT INTO MaterialeCRValues(14523, 'BCA', 'm^2');

INSERT INTO MaterialeCRValues(25678, 'Boltzari', 'm^2');

INSERT INTO MaterialeCRVALUES(15402, 'Tigla acoperis', 'm^2');

INSERT INTO MaterialeCRValues(45609, 'Polistiren', 'mm');

Page 21: Proiect Baze de Date

6.Inseraţi date în tabelul Conţinut_facturăCR.

INSERT INTO Continut_facturaCRVALUES(23, 12345, 150);

INSERT INTO Continut_facturaCRVALUES(34, 25647, 200);

INSERT INTO Continut_facturaCRVALUES(36, 63219, 50);

INSERT INTO Continut_facturaCRVALUES(46, 95412, 170);

INSERT INTO Continut_facturaCRVALUES(15, 10762, 100);

INSERT INTO Continut_facturaCRVALUES(14, 20978, 120);

INSERT INTO Continut_facturaCRVALUES(16, 14523, 130);

INSERT INTO Continut_facturaCRVALUES(19, 25678, 80);

INSERT INTO Continut_facturaCRVALUES(21, 15402, 60);

INSERT INTO Continut_facturaCRVALUES(30, 45609, 75);

Page 22: Proiect Baze de Date

7.Inseraţi date în tabelul Conţinut_bonCR.

INSERT INTO Continut_bonCRVALUES(50, 12345, 148);

INSERT INTO Continut_bonCRValues(52, 25647, 195);

INSERT INTO Continut_bonCRVALUES(44, 63219, 47);

INSERT INTO Continut_bonCRVALUES(49, 95412, 170 );

INSERT INTO Continut_bonCRVALUES(48, 10762, 99);

INSERT INTO Continut_bonCRVALUES(55, 20978, 110);

INSERT INTO Continut_bonCRVALUES(56, 14523, 125);

INSERT INTO Continut_bonCRVALUES(57, 25678, 80);

INSERT INTO Continut_bonCRVALUES(58, 15402, 55);

INSERT INTO Continut_bonCRVALUES(59, 45609, 75);

Page 23: Proiect Baze de Date

8.Să se mărească cu 20% salariul gestionarilor al căror nume încep cu litera C.

UPDATE magazieCRSET salariul_gestionarCR=1.2*salariul_gestionarCRWHERE gestionarCR LIKE 'C%';

Page 24: Proiect Baze de Date

9.Să se modifice domiciliul furnizorului cu cod 4 astfel încât să devină egal cu domiciliul furnizorului cu cod 22.

UPDATE furnizoriCRSET domiciliu_furnizorCR=(SELECT domiciliu_furnizorCR FROM furnizoriCR WHERE cod_furnizorCR=22)WHERE cod_furnizorCR=4;

10.Creaţi tabela GestionariCR astfel încât să conţină toate câmpurile din tabela FurnizoriCR.

CREATE TABLE GestionariCRASSELECT * FROM FurnizoriCR;

Page 25: Proiect Baze de Date

11.Să se modifice salariul gestionarului de la magazia MAIN astfel încât să devină egal cu salariul gestionarului cu codul magaziei 13.

UPDATE MagazieCRSET salariul_gestionarCR=(SELECT salariul_gestionarCR FROM MagazieCR WHERE cod_magazieCR=13)WHERE UPPER(denumire_magazieCR)='MAIN';

12. Să se mărească salariul gestionarului care s-a angajat în anul 1991 la 3000.UPDATE magazieCRSET salariul_gestionarCR=3000WHERE EXTRACT (year FROM dataangajare_gestionarCR)<=1991;

Page 26: Proiect Baze de Date

13.Să se afişeze numele şi e-mail-ul furnizorului cu domiciliul în Bucureşti şi ordonaţi alfabetic după nume.

SELECT denumire_furnizorCR, email_furnizorCRFROM FurnizoriCR WHERE domiciliu_furnizorCR LIKE '%Bucuresti%'ORDER BY denumire_furnizorCR;

14. Creați tabela Furnizori_P astfel încât să conțină toate câmpurile din tabela FurnizoriCR doar pentru furnizorii al căror nume începe cu litera ”P”.

CREATE TABLE Furnizori_PASSELECT * FROM FurnizoriCRWHERE denumire_furnizorCR LIKE 'P%';

Page 27: Proiect Baze de Date

15.Să se șteargă furnizorii din tabela Furnizori_P care au codul minim.

DELETE FROM Furnizori_PWHERE cod_furnizorCR=(SELECT MIN(cod_furnizorCR) FROM Furnizori_P);

16.Să se afişeze numele şi domiciliul furnizorilor care nu au emis facturi.

SELECT denumire_furnizorCR, domiciliu_furnizorCRFROM FurnizoriCRWHERE cod_furnizorCR NOT IN (SELECT cod_furnizorCR FROM FacturiCR);

Page 28: Proiect Baze de Date

17. Introduceţi în tabela furnizoriCR o nouă înregistrare care să conţină datele următoare : 27 ‚’Carabulea Roxana’ , ‘Constanţa’, ‘[email protected]’, ‘BCR’, 930227. Apoi ştergeţi-o.

INSERT INTO FurnizoriCRVALUES(27, 'Carabulea Roxana', 'Constanta', '[email protected]', 'BCR', 930227);

Page 29: Proiect Baze de Date

DELETE FROM furnizoriCRWHERE contCR=930227;

18.Să se afişeze numele, domiciliul furnizorilor şi data emiterii facturii

SELECT denumire_furnizorCR, domiciliu_furnizorCR, data_facturaCRFROM FurnizoriCR fu, FacturiCR faWHERE fu.cod_furnizorCR=fa.cod_furnizorCR;

Page 30: Proiect Baze de Date

SAUSELECT denumire_furnizorCR, domiciliu_furnizorCR, data_facturaCRFROM FurnizoriCR NATURAL JOIN FacturiCR ;

19.Să se afişeze numele şi salariul gestionarilor a căror nume incep cu litera „C”.

SELECT gestionarCR, salariul_gestionarCRFROM MagazieCRWHERE UPPER(gestionarCR) LIKE 'C%';

Page 31: Proiect Baze de Date

20.Să se afişeze numele şi salariul gestionarilor angajaţi în anul 1994.

SELECT gestionarCR, salariul_gestionarCRFROM MagazieCRWHERE dataangajare_gestionarCR BETWEEN TO_DATE ('01-01-1994','dd-mm-yyyy') AND TO_DATE ('31-12-1994', 'dd-mm-yyyy');

SAUSELECT gestionarCR, salariul_gestionarCRFROM MagazieCRWHERE EXTRACT (YEAR FROM dataangajare_gestionarCR)=1994;

Page 32: Proiect Baze de Date

21.Calculaţi valoarea totală a salariilor gestionarilor.

SELECT SUM(salariul_gestionarCr)Salariu_totalFROM MagazieCR;

22.Calculaţi media salariilor gestionarilor cu 2 zecimale.

SELECT ROUND(AVG (salariul_gestionarCR),2) Salariu_mediuFROM MagazieCR;

Page 33: Proiect Baze de Date

23.Afişaţi numărul total de gestionari, numele gestionarilor care au salariul între 1500 şi 2000 şi ordonaţi alfabetic după nume.

SELECT gestionarCR, COUNT(gestionarCR) Numar_gestionariFROM MagazieCRWHERE salariul_gestionarCR BETWEEN 1500 AND 2000GROUP BY gestionarCRORDER BY gestionarCR;

24.Afișați numărul total de gestionari, pentru fiecare din următoarele nivele: niv1 cei care au salariul între 1000 și 1999, niv2 salariul între 2000 și 2999 și nivelul 3 salariul între 3000 și 3999.

SELECT 'niv1 sal' AS Niv_sal, COUNT(gestionarCR) Nr_gestionariFROM MagazieCRWHERE salariul_gestionarCR BETWEEN 1000 AND 1999

Page 34: Proiect Baze de Date

UNIONSELECT 'niv2 sal' AS Niv_sal, COUNT(gestionarCR) Nr_gestionariFROM MagazieCRWHERE salariul_gestionarCR BETWEEN 2000 AND 2999UNION SELECT 'niv3 sal' AS Niv_sal, COUNT(gestionarCR) Nr_gestionariFROM MagazieCRWHERE salariul_gestionarCR BETWEEN 3000 AND 3999;

25.Afişaţi numele gestionarului şi data bonului şi numărul gestionarilor care nu au bonuri emise.

SELECT gestionarCR, data_bonCR, numar_bonCRFROM MagazieCR m, BonuriCR bWHERE m.cod_magazieCR=b.cod_magazieCR(+)ORDER BY data_bonCR;

Page 35: Proiect Baze de Date

SAUSELECT gestionarCR, data_bonCR, numar_bonCRFROM BonuriCR b RIGHT OUTER JOIN MagazieCR mON (b.cod_magazieCR=m.cod_magazieCR)ORDER BY data_bonCR;

SAUSELECT gestionarCR, data_bonCR, numar_bonCRFROM MagazieCR m LEFT OUTER JOIN BonuriCR bON (m.cod_magazieCR=b.cod_magazieCR)ORDER BY data_bonCR;

26.Afişaţi gestionarii cu salariul cuprins între 1500 şi 3000.

SELECT gestionarCR, salariul_gestionarCRFROM MagazieCRWHERE salariul_gestionarCR BETWEEN 1500 AND 3000;

Page 36: Proiect Baze de Date

27.Afişaţi furnizorii care aparţin băncilor BRD sau BCR şi ordonaţi invers-alfabetic după nume.

SELECT denumire_furnizorCR, bancaCRFROM FurnizoriCRWHERE BancaCR IN ('BCR','BRD')ORDER BY denumire_furnizorCR DESC;

28.Afişaţi numele furnizorilor care au a doua literă „o”.

SELECT denumire_furnizorCRFROM FurnizoriCRWHERE denumire_furnizorCR LIKE '_o%';

Page 37: Proiect Baze de Date

29. Afişaţi cantitatea totală intrată, denumirea materialului şi unitatea de măsură pentru cantitatea totală mai mare decât 100.

SELECT denumire_materialeCR, unitate_de_masuraCR, SUM(cantitate_intrataCR)FROM continut_facturaCR cf, materialeCR mWHERE cf.cod_materialeCR=m.cod_materialeCRGROUP BY denumire_materialeCR, unitate_de_masuraCRHAVING SUM(cantitate_intrataCR)>100ORDER BY denumire_materialeCR;

30.Calculaţi numărul de gestionari angajaţi înainte de 31.decembrie.2000

SELECT salariul_gestionarCR, gestionarCR, COUNT(gestionarCR)FROM MagazieCRWHERE dataangajare_gestionarCR<TO_DATE('31-12-2000', 'dd-mm-yyyy')GROUP BY salariul_gestionarCR, gestionarCR;

Page 38: Proiect Baze de Date

31.Calculaţi bonusul gestionarilor în funcţie de salariul lor:-6% din salariul dacă salariul >3000-4% din salariul dacă salariul între 2000 şi 3000-2% din salariul dacă salariul între 1600 şi 2000.Pentru celelalte bonus=0.

SELECT gestionarCR, salariul_gestionarCR,CASE WHEN salariul_gestionarCR>3000 THEN 0.06*salariul_gestionarCRWHEN salariul_gestionarCR BETWEEN 2000 AND 3000 THEN 0.04*salariul_gestionarCRWHEN salariul_gestionarCR BETWEEN 1600 AND 2000 THEN 0.02*salariul_gestionarCRELSE 0 END bonusFROM MagazieCR;

Page 39: Proiect Baze de Date

32.Să se afişeze gestionarii care au salariul între 1500 şi 3000 fără cei care au salariul 1600 şi 2000.

SELECT gestionarCR, salariul_gestionarCRFROM MagazieCRWHERE salariul_gestionarCR BETWEEN 1500 AND 3000MINUSSELECT gestionarCR, salariul_gestionarCRFROM MagazieCRWHERE salariul_gestionarCR IN (1600, 2000);

33.Să se afişeze furnizorii cu domiciliul în Bucureşti şi gestionarii care au salariul peste 2000.

SELECT denumire_furnizorCR FROM FurnizoriCR WHERE domiciliu_furnizorCR LIKE 'Bucuresti'UNIONSELECT gestionarCR FROM MagazieCR WHERE salariul_gestionarCR>2000;

Page 40: Proiect Baze de Date

34.Să se afişeze toţi gestionarii angajaţi în 1994 cu salariul mai mare de 2000.

SELECT * FROM magazieCRWHERE EXTRACT (YEAR FROM dataangajare_gestionarCR)=1994INTERSECTSELECT * FROM magazieCR WHERE salariul_gestionarCR>2000;

35.Să se afișeze materialele al căror cod se termină cu cifra 2.

SELECT * FROM MaterialeCRWHERE (SUBSTR(cod_materialeCR, length(cod_materialeCR),1))='2';

Page 41: Proiect Baze de Date

36.Să se afișeze ultima zi a lunii următoare de la data facturării.

SELECT data_facturaCR, LAST_DAY(add_months(data_facturaCR, 1)) AS Ultima_zi FROM FacturiCR;

37.Să se afișeze furnizorii care au același domiciliu cu furnizorul al cărui cod este 4.

SELECT * FROM FurnizoriCRWHERE domiciliu_furnizorCR=(SELECT domiciliu_furnizorCR FROM FurnizoriCR WHERE cod_furnizorCR=4);

38.Să se afle numărul băncii din top la care au cont furnizorii în funcție de banca la care sunt înscriși.Dacă banca este BCR atunci NR1.Dacă banca este BRD atunci NR2.Dacă banca este Raiffeisen Bank, atunci NR3.Pentru celelalte se consideră că nu sunt în TOP3.

Page 42: Proiect Baze de Date

SELECT bancaCR,DECODE(UPPER(bancaCR), 'BCR', 'NR1', 'BRD', 'NR2', 'RaiffeisenBank', 'NR3', 'NOT IN TOP3')NrBanca FROM FurnizoriCR;

SAUSELECT bancaCR,CASE WHEN UPPER(bancaCR)='BCR' THEN 'NR1'WHEN UPPER(bancaCR)='BRD' THEN 'NR2'WHEN UPPER(bancaCR)='RAIFFEISENBANK' THEN 'NR3'ELSE 'NOT IN TOP3'END NrBanca FROM FurnizoriCR;

39.Să se afișeze denumirea furnizorilor și gestionarii ca produs cartezian.

SELECT f.denumire_furnizorCR, m.gestionarCRFROM furnizoriCR f, magazieCR m;

Page 43: Proiect Baze de Date

SAUSELECT f.denumire_furnizorCR, m.gestionarCR FROM furnizoriCR f CROSS JOIN magazieCR m;

40.Să se realizeze o tabelă virtuală cu toți furnizorii care au domiciliul în București.

CREATE VIEW tabv_bucASSELECT * FROM FurnizoriCRWHERE LOWER(domiciliu_furnizorCR) LIKE 'Bucuresti';

Dacă dorim să o ștergem după folosim: DROP VIEW tabv_buc;

41.Să se realizeze o tabelă virtuală care să conțină materialele care au ca unitate de măsură m^2.Tabela virtuală nu va putea fi actualizată.

Page 44: Proiect Baze de Date

CREATE VIEW tabv_mat_m2ASSELECT * FROM MaterialeCRWHERE unitate_de_masuraCR LIKE 'm^2'WITH READ ONLY;

42.Să se creeze un index pentru facilitarea accesului mai rapid la salariul gestionarilor magaziilor.

CREATE INDEX idx_sal ON MagazieCR(salariul_gestionarCR);

43.Să se creeze un index pentru facilitarea accesului mai rapid la cantitatea ieșită de materiale pe baza bonurilor.

CREATE INDEX idx_cant_out ON Continut_bonCR(cantitate_iesitaCR);

Page 45: Proiect Baze de Date

44.Să se creeze un sinonim ”mag” pentru tabela magazieCR, să se interogheze această tabelă folosind sinonimul dat.

CREATE SYNONYM mag FOR magazieCR;SELECT *FROM mag;

45. Să se creeze un sinonim ”fur” pentru tabela furnizoriCR, să se interogheze această tabelă folosind sinonimul dat. CREATE SYNONYM fur FOR furnizoriCR;SELECT *FROM fur;

Page 46: Proiect Baze de Date

46.Să se creeze o secvență care să aibă valoarea de început 150, să se incrementeze cu pasul 2, să aibă valoarea maximă 250 și să nu cicleze.

OBS: Secvența poate fi folosită pentru a adăuga date în una sau mai multe tabele.

CREATE SEQUENCE secv1START WITH 150INCREMENT BY 2MAXVALUE 250NOCYCLE;

47.Să se creeze o secvență care să aibă valoarea de început 2500, să se incrementeze cu pasul 100, să aibă valoarea maximă 6500 și să cicleze.

Page 47: Proiect Baze de Date

CREATE SEQUENCE secv2START WITH 2500INCREMENT BY 100MAXVALUE 6500CYCLE;

48. Să se modifice pasul de incrementare pentru secvenţa anterioară de la ex 46 la 5:

ALTER SEQUENCE secv1 INCREMENT BY 5;

49. Folosirea unui clustera) creare clusterCREATE CLUSTER cod_furnizorCR_clus (cod_furnizorCR NUMBER(5,0));

Page 48: Proiect Baze de Date

b) creare index cluster

CREATE INDEX cod_furnizorCR_clus_idx ON CLUSTER cod_furnizorCR_clus;

c) creare tabelă în cluster

CREATE TABLE furnizoriCR_2 (cod_furnizorCR NUMBER(5,0), denumire_furnizorCR CHAR(50))CLUSTER cod_furnizorCR_clus (cod_furnizorCR);

Page 49: Proiect Baze de Date

50.Crearea unei tabele partiţionate

a) RANGE

CREATE TABLE gest_partitie(codfurn NUMBER(4),den_furn NUMBER(3) NOT NULL,banca NUMBER(10),termenliv date)PARTITION BY RANGE (termenliv)(PARTITION GEST1 VALUES LESS THAN (to_date('07-jun-2010', 'dd-mon-yyyy')),PARTITION GEST2 VALUES LESS THAN (to_date('29-sep-2012', 'dd-mon-yyyy')),PARTITION GEST3 VALUES LESS THAN (to_date('06-dec-2013', 'dd-mon-yyyy')));

Page 50: Proiect Baze de Date

b) LIST

CREATE TABLE maga_partitie (cod_mag NUMBER(3),denumire_mag VARCHAR2(15),nr_ore NUMBER(30))PARTITION BY LIST (nr_ore)(PARTITION paart1 VALUES (5,7,9),PARTITION paart2 VALUES (10,15,18),PARTITION paart3 VALUES (20,25,28));

c) Inserare date în tabela partiţionată

INSERT INTO maga_partitie VALUES(3,'depozit',20);