Sunteți pe pagina 1din 43

Ene Marius-Andrei Proiect Baze de Date

Grupa 142

Adăpost de Animale

1) Introducere
Exemplele din acest capitol se referă la proiectarea unui model de date ce
furnizează informații despre un adăpost de animale .
Vom prezenta adăpostul, acesta este locuința mai multor animale cum ar fi:
câini, pisici, păsări, hamsteri, castori, porcușori de guineea si chiar reptile (șerpi,
gușteri, șopârle) etc.

2) Modelul de date respectă anumite reguli de


funcționare
• Animalele pot fi adoptate sau nu la un moment dat; acest lucru se verifica prin
câmpul cod_adoptant. Daca acesta este NULL, înseamnă că animalul nu este
adoptat.
• Emailul trebuie întotdeauna sa fie de forma: %@%.%
• Un adăpost trebuie sa se afle la o singura locație, într-o locație se poate afla
un adăpost.
• Un adăpost poate fi vizitat de mai mulți vizitatori (sau niciunul).
• Un adăpost poate fi finanțat de mai multe asociații (sau doar de una).
• Un adăpost trebuie sa aibă un angajat, mai mulți angajați pot lucra la un
adăpost.
• Un angajat îngrijește un animal, mai multe animale pot fi îngrijite de mai mulți
angajați.
• Nu pot exista 2 adăposturi in aceeași locație.
• Un animal trebuie să aibă o fișă medicală, o fișa medicală aparține unui singur
animal (adică fiecare animal are o fișă proprie).
• Un adoptant poate adopta un animal, mai mulți adoptanți pot adopta mai
mule animal.
• Un animal consuma un tip de mâncare, mai multe animale pot consuma mai
multe tipuri de mâncare.
• Toate adăposturile se afla într-o singură țară (România).
• In entitatea fisa, daca animalul nu a suferit de nimic se va trece NULL. Daca
este bolnav sau sufera de ceva se va trece data de cand au inceput
simptomele.
• Daca un animal a fost adoptat fisa lui medicala va ramane in adapost.
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

3) Entități

Pentru modelul de date referitor la adăpostul de animale, structurile LOCATIE,


ADAPOST, VIZITATOR, ASOCIATIE, ANGAJAT, ANIMAL, HRANA, CUSCA,
FISA MEDICALA, ADOPTANT reprezintă entități.
Adapost = entitate ce oferă o locuință mai multor animale diferite câini, pisici,
hamsteri etc; cheia primara id_adapost.
Asociatie = afacere independenta ce finanteaza un adapost; cheia primara
id_asociatie.
Locatie = entitate ce se refera la zona unde este pozitionat adapostul; cheia primara
id_locatie.
Vizitator = persoana fizica independenta care viziteaza adapostul, poate petrece timp
cu animalele facand diferite activitati jucandu-se, citindu-le etc; cheia primara
id_vizitator.
Angajat = pesoana fizica, care se ocupa fie cu ingrijirea animalelor (veterinar) fie cu
ingrijirea adapostului (ingrijitor); cheia primara id_angajat.
Animal = animal care se afla in grija adapostului, pot fi animale diferite; cheia primara
id_animal.
Fisa Medicala = entitate care ofera informatii despre santatatea animalelor; cheia
primara id_fisa.
Hrana = entitate ce reprezinta tipurile de mancare pe care o consuma animalele, pot fi
diferite si de la producatori diferiti; cheia primara id_hrana.
Adoptant = persoana fizica independenta care poate adopta un animal, trebuie sa aiba
varsta mai mare de 18 ani; cheia primara id_adoptant.

4) Relații

ADAPOST_se_afla_intr-o_LOCATIE = relatie care leagă entitățile ADAPOST si


LOCATIE reflectând legătura dintre acestea (unde se afla adapostul). Ea are
cardinalitatea minima 1:0 si cardinalitatea maxima 1:1.
ASOCIATIE_finanteaza_ADAPOST = relație care leagă entitățile ASOCIATIE și
ADAPOST, reflectând legătura dintre acestea (afacerea independenta ce
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

sponsorizează adăpostul). Ea are cardinalitatea minimă 1:0 și cardinalitatea maximă


1:M.
VIZITATOR_viziteaza_ADAPOST = relație care leagă entitățile VIZITATOR și
ADAPOST, reflectând legătura dintre acestea (o persoana poate vizita un adăpost). Ea
are cardinalitatea minima 1:0 și cardinalitatea maxima 1:M.
ANGAJAT_lucreaza_ADAPOST = relație care leagă entitățile ANGAJAT și
ADAPOST, reflectând legătura dintre acestea (un adăpost are mai mulți angajați,
veterinar, Îngrijitor). Ea are cardinalitatea minima 1:1 și cardinalitatea maximă 1:M.
ANIMAL_are_FISA_MEDICALA = relație care leagă entitățile ANIMAL și
FISA_MEDICALA, reflectând legătura dintre acestea (un animal are o fișa medicală
cu informații despre el). Ea are cardinalitatea 1:1.
CUSCA_gazduieste_ANIMAL = relație care leagă entitățile CUSCA și ANIMAL,
reflectând legătura dintre acestea (un (sau mai multe) animal(e) este plasat într-o
cușcă). Ea are o cardinalitate minima 1:1 și o cardinalitate maximă 1:M.
ADOPTANT_adopta_ANIMAL = relație care leagă entitățile ADOPTANT și
ANIMAL, reflectând legătura dintre acestea (un adoptant (sau mai mulți) adoptă un
animal (sau mai multe)). Ea are o cardinalitate minimă 1:1 și o cardinalitate maximă
M:M.
ANIMAL_consuma_MANCARE = relație care leagă entitățile ANIMAL și
MANCARE, reflectând legătura dintre acestea (animalele consumă mâncare). Ea are
cardinalitatea minimă 1:1 și cardinalitatea maximă M:M.
ANGAJAT_ingrijeste_ANIMAL = relație care leagă entitățile ANGAJAT și
ANIMAL, reflectând legătura dintre acestea (angajatul are grija de animale). Ea are
cardinalitatea minimă 1:1 si cardinalitatea maximă M:M.

5) Atribute

Entitatea ANIMAL are ca atribute:


id_animal = variabilă de tip întreg, care nu poate fi nulă si reprezintă id-ul unui
animal.
tip_animal = variabilă de tip șir de caractere, de lungime maximă 10, care reprezintă
tipul unui animal.
greutate = variabilă de tip întreg, care reprezintă greutatea unui animal.
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

sex = variabilă de tip șir de caractere, de lungime maximă 1, care reprezintă sexul
unui animal.
descriere = variabilă de tip șir de caractere, de lungime maximă 50, care descrie
situația animalului (dacă a fost abandonat, donat, etc)
id_adoptant = variabilă de tip întreg, care reprezintă id-ul persoanei care a adoptat
animalul. Atributul trebuie să corespundă la o valoare a cheii primare din tabelul
ADOPTANT. (Daca e null înseamnă că animalul nu a fost adoptat).
id_mancare = variabilă de tip întreg, nu poate fi nula și care reprezintă id-ul mâncării
pe care o consumă animalul. Atributul trebuie sa corespunda la o valoare a cheii
primare din tabelul MANCARE.
data_inmatriculare = variabilă de tip dată calendaristica, care reprezintă data in care
animalul a fost adus la adapost.
id_angajat = variabila de tip intreg, care reprezinta id-ul angajatului care se ocupa de
ingrijirea animalului. Atributul trebuie sa corespunda la o valoare a cheii primare din
tabelul ANGAJAT. (Daca e null inseamna ca nu are nevoie de ingrijiri medicale);

Entitatea ADOPTANT are ca atribute:


id_adoptant = variabilă de tip întreg, care nu poate fi nulă și reprezintă id-ul
adoptantului.
nume = variabilă de tip șir de caractere, de lungime maximă 15, nu poate fi null și
care reprezintă numele adoptantului.
prenume = variabilă de tip șir de caractere, de lungime maximă 20, nu poate fi null și
care reprezintă prenumele adoptantului.
strada = variabilă de tip șir de caractere, de lungime maximă 25 care reprezintă strada
unde locuiește adoptantul.
oras = variabilă de tip șir de caractere, de lungime maximă 20 care reprezintă orașul
unde locuiește adoptantul.
numar = variabilă de tip întreg, care reprezintă numărul locuinței adoptantului.
email = variabilă de tip șir de caractere, de lungime maximă 30 care reprezintă adresa
de e-mail a adoptantului.
telefon = variabilă de tip șir de caractere, de lungime maximă 10 care reprezintă
numărul de telefon al adoptantului.

Entitatea MANCARE are ca atribute:


Ene Marius-Andrei Proiect Baze de Date
Grupa 142

id_mancare = variabila de tip întreg, care nu poate fi nulă si reprezintă id-ul mâncării.
tip_mancare = variabilă de tip șir de caractere, de lungime maximă 10, care reprezintă
tipul mâncării.
pret = variabilă de tip întreg, nu poate fi nulă și care reprezintă prețul unui aliment.
brand = variabilă de tip șir de caractere, de lungime maximă 15, care reprezintă
brand-ul unui aliment (cine l-a produs).

Entitatea ANGAJAT are ca atribute:


id_angajat = variabilă de tip întreg, care nu poate fi nulă, și care reprezintă id-ul unui
angajat.
nume = varibilă de tip șir de caractere, de lungime maximă 20, care reprezintă numele
angajatului.
prenume = variabilă de tip șir de caractere, de lungime maximă 20, care reprezintă
prenumele angajatului.
salariu = variabilă de tip real, care reprezintă salariul angajatului.
functie = variabilă de tip șir de caractere, de lungime maximă 20, care reprezintă
funcția ocupată de un angajat. Atributul poate lua valorile Veterinar, Îngrijitor,
Contabil.
data_angajarii = variabilă de tip dată calendaristică, care reprezintă data angajării
unui angajat.
strada = variabilă de tip șir de caractere, de lungime maximă 25 care reprezintă strada
unde locuiește adoptantul.
oras = variabilă de tip șir de caractere, de lungime maximă 20 care reprezintă orașul
unde locuiește adoptantul.
numar = variabilă de tip întreg, care reprezintă numărul locuinței adoptantului.
email = variabilă de tip șir de caractere, de lungime maximă 30 care reprezintă adresa
de e-mail a adoptantului.
id_adapost = variabilă de tip întreg, nu poate fi nulă și care reprezintă id-ul
adăpostului la care lucrează angajatul. Atributul trebuie să corespundă la o valoare a
cheii primare din tabelul ADAPOST.

Entitatea ASOCIATIE are ca atribute:


id_asociatie = variabila de tip întreg, care nu poate fi nulă, și care reprezintă id-ul unei
asociații.
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

denumire = variabila de tip șir de caractere, de lungime maximă 30, care reprezintă
numele asociației.
telefon = variabilă de tip șir de caractere, de lungime maximă 10 care reprezintă
numărul de telefon al adoptantului.
strada = variabilă de tip șir de caractere, de lungime maximă 25 care reprezintă strada
unde se afla asociația.
oras = variabilă de tip șir de caractere, de lungime maximă 20 care reprezintă orașul
unde se află asociația.
numar = variabilă de tip întreg, care reprezintă numărul de pe stradă a asociației.
suma_donata = variabilă de tip întreg, care reprezintă suma pe care asociatia o
doneaza adapostului.
id_adapost = variabilă de tip întreg, nu poate fi nulă și care reprezintă id-ul
adăpostului pe care-l finanțează asociația. Atributul trebuie să corespundă la o valoare
a cheii primare din tabelul ADAPOST.

Entitatea FISA_MEDIACALA are ca atribute:


id_fisa = variabilă de tip întreg, care nu poate fi nula, și care reprezintă id-ul fișei unui
animal.
id_animal = variabilă de tip întreg, nu poate fi nulă și care reprezintă id-ul animalului
corespunzător fișei medicale. Atributul trebuie să corespundă la o valoare a cheii
primare din tabelul ANIMAL.
data = variabilă de tip dată calendaristică, care reprezintă data realizării fișei
animalului.
tratament = variabilă de tip șir de caractere, de lungime maximă 30 care reprezintă
tratamentul prescris unui animal bolnav (daca nu este bolnav se inițializează cu
NULL).
simptome = variabilă de tip șir de caractere, de lungime maximă 30 care reprezintă
simptomele unui animal (daca nu sunt simptome se inițializează cu NULL).
detalii = variabilă de tip șir de caractere, de lungime maximă 50 care reprezintă
detaliile despre animal (daca a fost bolnav înainte, rănit etc dacă nu a avut nimic, se
inițializeaza cu NULL).

Enitatea LOCATIE are ca atribute:


id_locatie = variabilă de tip întreg, nu poate fi nulă și care reprezinta id-ul locației
unde se afla adapostul.
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

judet = variabila de tip sir de caractere, de lungime maxima 20 care reprezinta judetul
in care se afla adapostul.
strada = variabilă de tip șir de caractere, de lungime maximă 25 care reprezintă strada
unde se afla adăpostul.
oras = variabilă de tip șir de caractere, de lungime maximă 20 care reprezintă orașul
unde se află adăpostul.
numar = variabilă de tip întreg, care reprezintă numărul de pe stradă al adăpostului.
id_adapost = variabilă de tip întreg, nu poate fi nulă și care reprezintă id-ul
adăpostului din locația curentă. Atributul trebuie să corespundă la o valoare a cheii
primare din tabelul ADAPOST.

Entitatea VIZITATOR are ca atribute:


id_vizitator = variabilă de tip întreg, care nu poate fi nula, și care reprezintă id-ul
vizitatorului.
nume = variabilă de tip șir de caractere, de lungime maximă 20, care reprezintă
numele vizitatorului.
prenume = variabilă de tip șir de caractere, de lungime maximă 20, care reprezintă
prenumele vizitatorului.
telefon = variabilă de tip șir de caractere, de lungime maximă 10 care reprezintă
numărul de telefon al vizitatorului.
id_adapost = variabilă de tip întreg, nu poate fi nulă și care reprezintă id-ul
adăpostului pe care-l viziteaza vizitatorul. Atributul trebuie să corespundă la o valoare
a cheii primare din tabelul ADAPOST.

Entitatea ADAPOST are ca atribute:


id_adapost = variabilă de tip întreg, care nu poate fi nula, și care reprezintă id-ul
adăpostului.
denumire = variabila de tip șir de caractere, de lungime maximă 30, care reprezintă
numele adăpostului.
telefon = variabilă de tip șir de caractere, de lungime maximă 10 care reprezintă
numărul de telefon al adăpostului.
email = variabilă de tip șir de caractere, de lungime maximă 30 care reprezintă adresa
de e-mail a adapostului.
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

Relatia ANGAJAT_ingrijeste_ANIMAL are ca atribute:


id_ingrijire = variabila de tip intreg, care reprezinta id-ul ingrijirii animalului de catre
un angajat. Atributul nu poate fi null.
id_animal = variabila de tip intreg, care reprezinta id-ul animalului. Atributul nu
poate fi null.
id_angajat = variabila de tip intreg, care reprezinta id-ul angajatului. Atributul nu
poate fi null
data_ingrijire = variabilă de tip dată calendaristică, care reprezintă data ingrijirii unui
animal.

Relatia ANIMAL_consuma_MANCARE are ca atribute:


id_consum = variabila de tip intreg, care reprezinta id-ul consumului unui produs de
catre un animal. Atributul nu poate fi null.
id_mancare = variabila de tip intreg, care reprezinta id-ul mancarii. Atributul nu poate
fi null.
id_animal = variabila de tip intreg, care reprezinta id-ul mancarii. Atributul nu poate
fi null.

Relatia ADOPTANT_adopta_ANIMAL are ca atribute:


id_cerere = variabilă de tip întreg, care reprezintă id-ul cererii de adoptie a unui
animal. Atributul nu poate fi null.
id_animal = variabila de tip intreg, care reprezinta id-ul mancarii. Atributul nu poate
fi null.
id_adoptant = variabilă de tip întreg, care reprezintă id-ul persoanei care a adoptat
animalul. Atributul nu poate fi null.
data_adoptie = variabilă de tip dată calendaristică, care reprezintă data adoptiei unui
animal.
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

6) Diagrama ER
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

7) Diagrama Conceptuală
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

8) Scheme relaționale

Schemele relaționale corespunzătoare diagramei conceptuale de la punctul 7 sunt


următoarele:
ANIMAL(#id_animal, tip_animal, data_inmatriculare, greutate, sex, descriere,
id_mancare, id_adoptant, id_angajat).
ADOPTANT(#id_adoptant, nume, prenume, strada, oras, numar, email, telefon).
ANGAJAT(#id_angajat, nume, prenume, salariu, functie, data_angajarii, strada,
oras, numar, email, id_adapost).
MANCARE(#id_mancare, tip_mancare, pret, brand).
ASOCIATIE(#id_asociatie, denumire, strada, oras, numar, telefon, suma_donata,
id_adapost).
FISA_MEDICALA(#id_fisa, data, simptome, tratament, detalii, id_animal).
LOCATIE(#id_locatie, judet, strada, oras, numar, id_adapost).
VIZITATOR(#id_vizitator, nume, prenume, telefon, id_adapost).
ADAPOST(#id_adapost, denumire, telefon).
INGRIJESTE(#id_ingrijire, id_animal, id_angajat, data).
CONSUM(#id_consum, id_mancare, id_animal, data, tip_mancare).
CERERE_ADOPTIE(#id_cerere, id_animal, id_adoptant, data).

9) Normalizarea Bazei de Date pana la forma


normala 3
Normalizarea unei baze de date se realizează gradual, prin verificarea relațiilor
după formele normale. Aducerea relațiilor într-o formă normală presupune extragerea
unor atribute din relații și introducerea, pe baza lor, a unor noi relații.
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

FN1
Prima formă normal (FN1) este o formă normală utilizată în normalizarea
bazelor de date. Prima formă normală exclude posibilitatea existenței grupurilor
repetitive cerând ca fiecare câmp într-o bază de date să cuprindă numai o valoare
atomică. De asemenea, prima formă normală cere și ca fiecare înregistrare să fie
definită astfel încât să fie identificată într-un mod unic prin intermediul unei chei
primare.

ADAPOST(NON-FN1)
Id_adapost# Id_angajat#
1007 403, 405, 407
1002 404
Acesta este un exemplu de NON-FN1, întrucât unui atribut ii corespund mai multe
valori, respectiv adăpostului cu id-ul 1007 ii corespunde angajații cu id-ul 403, 405 si
407.

Mai jos exemplificăm normalizarea în forma normală 1 (avem identificator unic


pentru toate intrările din tabel: id_angajat. În plus, au fost introduse și alte atribute ale
entității pentru a continua normalizarea.
ADAPOST(FN1)
Adapost(#id_adapost, denumire_ad, telefon_ad, email_ad, #id_angajat, nume_aj,
prenume_aj, salariu, functie, data_angajarii, strada_aj, oras_aj, numar_aj)

FN2
A doua formă normal (FN2) cere ca toate elementele unei tabele să fie
dependente funcțional de totalitatea cheii primare. Dacă unul sau mai multe elemente
sunt dependente funcțional numai de o parte a cheii primare, atunci ele trebuie să fie
separate în tabele diferite. Dacă tabela are o cheie primară formată din numai un
atribut, atunci ea este automat în FN2 (a 2- a formă normală).
Exemplul de mai sus este unde exemplu NON-FN2, deoarece atributele
denumire_ad, telefon_ad, email_ad nu depind de toata cheia primara, ci doar de
#id_adapost, iar data_angajarii depinde doar de id_angajat. Astfel #id_adapost
determina functional denumire_ad, numar_ad, email_ad, iar id_angajat determina
functional, data_angajarii.
Astfel avem:
{#id_adapost} -> {denumire_ad, numar_ad, email_ad}
{#id_angajat} -> {data_angajarii}
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

{#id_adapost, #id_angajat} -> {nume_aj, prenume_aj, salariu, functie, strada_aj,


oras_aj, numar_aj}

Aplicam regula Casey-Delobel pentru FN2 si obtinem urmatoarele entitati:

ADAPOST(FN3)
adapost(#id_adapost, denumire_ad, numar_ad, email_ad);
ANGAJAT(FN3)
angajat(#id_angajat, data_angajarii)
DETALII_ANGAJARE(FN2)
detalii_angajare(#id_adapost, #id_angajat, nume_aj, prenume_aj, salariu, functie,
strada_aj, oras_aj, numar_aj)

FN3
O relație respectă forma normală FN3, dacă respectă forma normală FN2 și
niciun atribut care nu face parte din cheia primară nu este dependent tranzitiv de cheia
primară. Adică, spre exemplu, dacă atributul Y este dependent funcțional de atributul
X și atributul Z este dependent funcțional de atributul Y, atunci spunem că atributul Z
este dependent tranzitiv de atributul X. Verificarea aplicării corecte a procesului de
normalizare se realizează astfel încât uniunea acestora să producă relația inițială, cu
alte cuvinte, descompunerea este fără pierderi și dependențele se păstrează,
reconstituirea lor făcându-se cu ajutorul operațiilor de tip JOIN, fapt observat și la
modelul proiectat.
In exemplul de mai sus ADAPOST si ANGAJAT sunt in FN3 întrucât sunt în
FN2 și toate atributele depind stric de cheia primară, neexistând niciun caz de
dependență tranzitivă. În relația DETALII_ANGAJARE, atributule nume_aj,
prenume_aj, strada_aj, oras_aj, numar_aj depind direct de cheia primară id_angajat.
Pentru a aduce relatia DETALII_ANGAJARE in FN3 aplicam regula Casey-
Delobel si relatia se descompune in proiectiile DETALII_ANGAJARE1 si
DETALII_ANGAJARE2.

DETALII_ANGAJARE1 (FN3)
detalii_angajare1(#id_adapost, #id_angajat, functie, nume_aj, prenume_aj, strada_aj,
oras_aj, numar_aj)
detalii_angajare2(functie, salariu).
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

10) Crearea tabelelor si inserarea datelor

Crearea tabelei ADOPTANTI:

create table ADOPTANTI (id_adoptant number(5) PRIMARY KEY,


nume_a varchar2(15) not null, prenume_a varchar2(20) not null,
strada_a varchar2(25) not null, oras_a varchar2(20) not null, numar_a number(5) not
null,
email_a varchar2(30), telefon_a varchar2(10), constraint ck2 check (email_a like
'%@%.%'));

INSERT INTO ADOPTANTI values(3000, 'Stoica', 'Marian', 'Trandafirilor',


'Bucuresti', 45, 'stoicam@yahoo.com', '0765872234');
INSERT INTO ADOPTANTI VALUES (3001, 'Stoica', 'Andrei', 'Papadiilor',
'Bucuresti', 43, 'stoicaandrei@yahoo.com','0765850999');
INSERT INTO ADOPTANTI VALUES (3005, 'Sandu', 'Cezara', 'Maracineanu',
'Brasov', 7,'cezarasandu@gmail.com', '0756239871');
INSERT INTO ADOPTANTI VALUES (3012, 'Damian', 'Natalia', 'Gorjului', 'Iasi',
65, 'natalia_damian@gmail.com', '0729987654');
INSERT INTO ADOPTANTI VALUES (3013, 'Dragota', 'Corina', 'Timisorenilor',
'Brasov', 47, 'dragotacorina@gmail.com', '0743933277');
INSERT INTO ADOPTANTI VALUES (3020, 'Dorobat', 'Alexandru', 'Bvd Dacia',
'Bucuresti', 38, 'dorobat@yahoo.com','0720009008');

Crearea tabelei MANCARE:

create table MANCARE(id_mancare number(5) PRIMARY KEY,


Ene Marius-Andrei Proiect Baze de Date
Grupa 142

tip_hrana varchar2(10), pret number(5,2), brand varchar2(15));

INSERT INTO MANCARE VALUES (5000, 'granulata', 20.5, 'Granulli');


INSERT INTO MANCARE VALUES (5001, 'lichida', 30.5, 'Healthy-Pet');
INSERT INTO MANCARE VALUES (5002, 'congelata', 40.5, 'Healthy-Pet');
INSERT INTO MANCARE VALUES (5005, 'uscata', 50.5, 'Your-Pet');
INSERT INTO MANCARE VALUES (5006, 'conservata', 80.5, 'Healthy-Pet');
INSERT INTO MANCARE VALUES (5007, 'gatita', 20.5, 'Your-Pet');
INSERT INTO MANCARE VALUES (5008, 'bio', 30.5, 'Forzza');
INSERT INTO MANCARE VALUES (5009, 'seminte', 30.5, 'Granulli');

Crearea tabelei ADAPOST:

create table ADAPOST(id_adapost number(5) PRIMARY KEY,


denumire_ad varchar2(30), telefon_ad varchar2(10) not null,
email_ad varchar2(30), constraint ck3 check (email_ad like '%@%.%'));

INSERT INTO ADAPOST VALUES (1000, 'Smeura', '0248294466', NULL);


INSERT INTO ADAPOST VALUES (1002, 'Catei Odai', '0214904007',
'cateiodai@gmail.com');
INSERT INTO ADAPOST VALUES (1007, 'Canin Breasta', '0251370070',
'caninbreasta@yahoo.com');
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

INSERT INTO ADAPOST VALUES (1009, 'Bragadiru', '0734301394', NULL);


INSERT INTO ADAPOST VALUES (1012, 'Animal Life', '0777000000',
'lifeforanimals@gmail.com');

Crearea tabelei LOCATIE:

create table LOCATIE(id_locatie number(5) PRIMARY KEY,


judet varchar2(20) not null,
strada_l varchar2(25) not null, oras_l varchar2(20) not null, numar_l number(5) not
null,
id_adapost number(5), constraint fk1 foreign key(id_adapost) references
ADAPOST(id_adapost));

INSERT INTO LOCATIE VALUES (178, 'Sibiu', 'Aleea Artileristilor', 'Sibiu', 47,
1000);
INSERT INTO LOCATIE VALUES (189, 'Ilfov', 'Budislavu', 'Bucuresti', 124,
NULL);
INSERT INTO LOCATIE VALUES (202, 'Olt', 'Crisan', 'Slatina', 14, 1002);
INSERT INTO LOCATIE VALUES (493, 'Arad', 'Bujorului', 'Arad', 2, 1007);
INSERT INTO LOCATIE VALUES (138, 'Oradea', 'Avram Iancu', 'Oradea', 35,
1009);
INSERT INTO LOCATIE VALUES (59, 'Constanta', 'Cantonului', 'Costinesti', 947,
1012);
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

Crearea tabelei VIZITATOR:

create table VIZITATOR(id_vizitator number(5) PRIMARY KEY,


nume_v varchar2(15) not null, prenume_v varchar2(20) not null,
telefon_v varchar2(10),
id_adapost number(5), constraint fk2 foreign key(id_adapost) references
ADAPOST(id_adapost));

CREATE SEQUENCE seq_viz


increment by 1
start with 1
maxvalue 100
nocycle;

INSERT INTO VIZITATOR VALUES(seq_viz.nextval, 'Ene', 'Marius', '0758011741',


NULL);
INSERT INTO VIZITATOR VALUES(seq_viz.nextval, 'Doncea', 'Beatrice',
'023151812 ', 1000);
INSERT INTO VIZITATOR VALUES(seq_viz.nextval, 'Serban', 'Mihai',
'0238722697', 1012);
INSERT INTO VIZITATOR VALUES(seq_viz.nextval, 'Comanescu', 'Ionut',
'0241672762', 1009);
INSERT INTO VIZITATOR VALUES(seq_viz.nextval, 'Ivana', 'Florinel',
'0721750051', 1007);
INSERT INTO VIZITATOR VALUES(seq_viz.nextval, 'Ioana', 'Andreea',
'0722161914', 1002);
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

INSERT INTO VIZITATOR VALUES(seq_viz.nextval, 'Silviu', 'Bogdan',


'0721337234', 1002);
INSERT INTO VIZITATOR VALUES(seq_viz.nextval, 'Ionut', 'Iancu', '0256272281',
1002);
INSERT INTO VIZITATOR VALUES(seq_viz.nextval, 'Petrolu', 'Tiriac',
'0268545604', NULL);
INSERT INTO VIZITATOR VALUES(seq_viz.nextval, 'Nastase', 'Aurel',
'0766297489', 1009);
INSERT INTO VIZITATOR VALUES(seq_viz.nextval, 'Alex', 'Nicoleta',
'0722677541', 1007);
INSERT INTO VIZITATOR VALUES(seq_viz.nextval, 'Maria', 'Predut',
'0253216030', 1012);
INSERT INTO VIZITATOR VALUES(seq_viz.nextval, 'Marinela', 'Stancu',
'0720802619', 1000);
INSERT INTO VIZITATOR VALUES(seq_viz.nextval, 'Stelea', 'Marian',
'0254212504', 1000);
INSERT INTO VIZITATOR VALUES(seq_viz.nextval, 'Ispilante', 'Brusli',
'0264425992', 1000);
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

Crearea tabelei ASOCIATIE:

create table ASOCIATIE(id_asociatie number(5) PRIMARY KEY,


denumire_as varchar2(30),
telefon_as varchar2(10) not null,
strada_as varchar2(25) not null, oras_as varchar2(20) not null, numar_as number(5)
not null,
suma_donata number(10, 2),
id_adapost number(5), constraint fk3 foreign key(id_adapost) references
ADAPOST(id_adapost));

create sequence seq_as


increment by 1
start with 100
maxvalue 150
nocycle;

INSERT INTO ASOCIATIE VALUES (seq_as.nextval, 'Deja-Vu', '0756190594',


'Alexandru Ioan Cuza', 'Slatina', 2, 150.2, 1002);
INSERT INTO ASOCIATIE VALUES (seq_as.nextval, 'Gucci', '0253216030',
'Siretului', 'Sibiu', 46, 3000.5, 1007);
INSERT INTO ASOCIATIE VALUES (seq_as.nextval, 'Enel', '0264425992',
'Gheorghe Doja', 'Timisoara', 1024, 5000, 1012);
INSERT INTO ASOCIATIE VALUES (seq_as.nextval, 'Rompetrol', '0213524416',
'Argesului', 'Cluj-Napoca', 14, 9650, 1000);
INSERT INTO ASOCIATIE VALUES (seq_as.nextval, 'Versace', '0264343735',
'Caprelor', 'Ploiesti', 8, 5410, 1007);
INSERT INTO ASOCIATIE VALUES (seq_as.nextval, 'Google Romania',
'0244325903', 'Albinelor', 'Corabia', 41, NULL, NULL);
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

Crearea tabelei ANGAJAT:

create table ANGAJAT(id_angajat number(5) PRIMARY KEY,


nume_aj varchar2(20) not null, prenume_aj varchar2(20) not null,
salariu number(5, 2), functie varchar2(20) not null,
data_angajarii date default sysdate,
strada_aj varchar2(25) not null, oras_aj varchar2(20) not null, numar_aj number(5)
not null,
id_adapost number(5), constraint fk4 foreign key(id_adapost) references
ADAPOST(id_adapost),
constraint ck8 check (id_adapost is not null))

create sequence seq_aj


increment by 1
start with 400
maxvalue 450
nocycle;

INSERT INTO ANGAJAT VALUES(seq_aj.nextval, 'Abusan', 'Alexandru', 900,


'Ingrijitor', to_date('25-07-2021', 'dd-mm-yyyy'), 'Gorjului', 'Iasi', 65, 1012);
INSERT INTO ANGAJAT VALUES(seq_aj.nextval, 'Borcea', 'Cristian', 999,
'Veterinar', to_date('20-03-2016', 'dd-mm-yyyy'), 'Argesului', 'Cluj-Napoca', 64,
1012);
INSERT INTO ANGAJAT VALUES(seq_aj.nextval, 'Cristea', 'Andrei', 505,
'Veterinar', to_date('21-09-2018', 'dd-mm-yyyy'), 'Maracineanu', 'Brasov', 944, 1009);
INSERT INTO ANGAJAT VALUES(seq_aj.nextval, 'Paraschiv', 'Remus', 800,
'Ingrijitor', to_date('30-08-2010', 'dd-mm-yyyy'), 'Bvd Stefan cel Mare', 'Sibiu', 2,
1007);
INSERT INTO ANGAJAT VALUES(seq_aj.nextval, 'Cercel', 'Mihaela', 400,
'Veterinar', to_date('31-01-2014', 'dd-mm-yyyy'), 'Bvd Lascar Catargiu', 'Bucuresti',
49, 1002);
INSERT INTO ANGAJAT VALUES(seq_aj.nextval, 'Pop', 'Robert', 490, 'Veterinar',
to_date('20-02-2019', 'dd-mm-yyyy'), 'Bvd Urzicii', 'Sibiu', 90, 1007);
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

INSERT INTO ANGAJAT VALUES(seq_aj.nextval, 'Moraru', 'Iulian', 589,


'Veterinar', to_date('14-06-2020', 'dd-mm-yyyy'), 'Aviatorilor', 'Iasi', 47, 1000);
INSERT INTO ANGAJAT VALUES(seq_aj.nextval, 'Ignat', 'Madalina', 740.4,
'Ingrijitor', to_date('20-02-2019', 'dd-mm-yyyy'), 'Bvd Urzicii', 'Sibiu', 90, 1007);
INSERT INTO ANGAJAT VALUES(seq_aj.nextval, 'Negru', 'Irina', 960, 'Ingrijitor',
to_date('13-01-2017', 'dd-mm-yyyy'), 'Bvd Independentei', 'Brasov', 12, 1009);

Crearea tabelei ANIMAL:

create table ANIMAL(id_animal number(5) PRIMARY KEY,


tip_animal varchar2(10) not null,
greutate number(3,2),
sex varchar2(1),
descriere varchar2(50),
id_adoptant number(5), constraint fk6 foreign key(id_adoptant) references
ADOPTANTI(id_adoptant),
id_mancare number(5) not null, constraint fk7 foreign key(id_mancare) references
MANCARE(id_mancare),
data_inmatriculare date)
id_angajat number(5), constraint fk_1 foreign key(id_angajat) references
ANGAJAT(id_angajat);

INSERT INTO ANIMAL VALUES(1000, 'Caine', 5.6, 'M', 'Negru', NULL, 5005,
to_date('13-04-2020', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1001, 'Pisica', 2.3, 'F', 'Alba', 3012, 5006,
to_date('05-02-2021', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1002, 'Canar', 0.5, 'F', 'Culori: galben si verde',
NULL, 5009, to_date('21-08-2020', 'dd-mm-yyyy'));
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

INSERT INTO ANIMAL VALUES(1003, 'Hamster', 0.6, 'M', NULL, 3020, 5008,
to_date('22-08-2020', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1004, 'Papagal', 0.4, 'M', 'Culori:rosu si verde',
3020, 5009, to_date('23-08-2020', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1005, 'Caine', 4.5, 'F', NULL, 3013, 5007,
to_date('22-04-2019', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1006, 'Broasca', 1.6, 'F', NULL, 3005, 5008,
to_date('09-07-2017', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1007, 'Sarpe', 1.6, 'M', 'Maro cu pete galbene',
NULL, 5005, to_date('03-02-2020', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1008, 'Veverita', 1.3, 'F', 'NULL', 3000, 5005,
to_date('17-12-2020', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1009, 'Pisica', 8.6, 'M', 'Gri inchis, cu ochii
negri', 3001, 5001, to_date('28-11-2019', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1010, 'Caine', 7.6, 'F', 'Alb', 3005, 5007,
to_date('23-1-2018', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1011, 'Sarpe', 1.1, 'F', 'Negru, cu dungi gri',
NULL, 5006, to_date('14-04-2021', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1012, 'Canar', 0.3, 'M', 'Maro deschis cu dungi
galbene', NULL, 5009, to_date('28-02-2019', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1013, 'Papagal', 0.7, 'M', 'Are dungi rosii', 3012,
5009, to_date('28-1-2018', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1014, 'Hamster', 0.25, 'F', 'Alb', NULL, 5000,
to_date('20-02-2020', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1015, 'Pisica', 6.6, 'F', 'Alba', 3005, 5000,
to_date('07-05-2019', 'dd-mm-yyyy'));

Am uitat sa adaug coloana id_angajat in entitatea animal cand am creat-o asa ca


am facut un update.

update animal
set id_angajat = 401
where id_animal = 1001;

update animal
set id_angajat = 402
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

where id_animal = 1004;

update animal
set id_angajat = 404
where id_animal = 1005;

update animal
set id_angajat = 405
where id_animal = 1006;

update animal
set id_angajat = 435
where id_animal = 1010;

update animal
set id_angajat = 404
where id_animal = 1014;

update animal
set id_angajat = 407
where id_animal = 1008;

update animal
set id_angajat = 400
where id_animal = 1012;

update animal
set id_angajat = 400
where id_animal = 1015;
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

Crearea tabelei FISA_MEDICALA:

create table FISA_MEDICALA(id_fisa number(5) PRIMARY KEY,


id_animal number(5) not null, constraint fk8 foreign key(id_animal) references
ANIMAL(id_animal),
data_fisa date default sysdate,
tratament varchar2(30),
simptome varchar2(30),
detalii varchar2(50));

INSERT INTO FISA_MEDICALA VALUES(100, 1000, to_date('13-04-2020', 'dd-


mm-yyyy'), NULL, NULL, NULL);
INSERT INTO FISA_MEDICALA VALUES(101, 1001, to_date('17-03-2021', 'dd-
mm-yyyy'), 'Bandaj ocular', 'Leziune', NULL);
INSERT INTO FISA_MEDICALA VALUES(102, 1002, to_date('21-08-2020', 'dd-
mm-yyyy'), NULL, NULL, NULL);
INSERT INTO FISA_MEDICALA VALUES(103, 1003, to_date('22-08-2020', 'dd-
mm-yyyy'), NULL, NULL, NULL);
INSERT INTO FISA_MEDICALA VALUES(104, 1004, to_date('21-01-2021', 'dd-
mm-yyyy'), 'Bandajare', 'Leziune la aripa dreapta', 'Schimbate odata la 2 zile');
INSERT INTO FISA_MEDICALA VALUES(105, 1005, to_date('13-02-2020', 'dd-
mm-yyyy'), 'Compresa sterila', 'Arsura', NULL);
INSERT INTO FISA_MEDICALA VALUES(106, 1006, to_date('10-08-2017', 'dd-
mm-yyyy'), 'Regim Alimentar Corespunzator', 'Intoxicatie', 'O buna igiena
alimentara');
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

INSERT INTO FISA_MEDICALA VALUES(107, 1007, to_date('03-02-2020', 'dd-


mm-yyyy'), NULL, NULL, NULL);
INSERT INTO FISA_MEDICALA VALUES(108, 1008, to_date('12-01-2021', 'dd-
mm-yyyy'), NULL, 'Probleme cu vederea', NULL);
INSERT INTO FISA_MEDICALA VALUES(109, 1009, to_date('28-11-2019', 'dd-
mm-yyyy'), NULL, NULL, NULL);
INSERT INTO FISA_MEDICALA VALUES(110, 1010, to_date('25-02-2019', 'dd-
mm-yyyy'), 'Sterilizare si Bandajare', 'Leziune la piciorul stang', NULL);
INSERT INTO FISA_MEDICALA VALUES(111, 1011, to_date('14-04-2021', 'dd-
mm-yyyy'), NULL, NULL, NULL);
INSERT INTO FISA_MEDICALA VALUES(112, 1012, to_date('28-02-2019', 'dd-
mm-yyyy'), NULL, 'Probleme cu vederea', NULL);
INSERT INTO FISA_MEDICALA VALUES(113, 1013, to_date('28-1-2018', 'dd-
mm-yyyy'), NULL, NULL, NULL);
INSERT INTO FISA_MEDICALA VALUES(114, 1014, to_date('25-02-2020', 'dd-
mm-yyyy'), 'Operatie', 'Plaga deschisa', NULL);
INSERT INTO FISA_MEDICALA VALUES(115, 1015, to_date('07-05-2019', 'dd-
mm-yyyy'), NULL, 'Probleme cu vederea', 'Vedere slaba');

Crearea tabelei CONSUM:

create table CONSUM(id_consum number(5) PRIMARY KEY,


id_mancare number(5), constraint fk9 foreign key(id_mancare) references
MANCARE(id_mancare),
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

id_animal number(5), constraint fk10 foreign key(id_animal) references


ANIMAL(id_animal));

MODIFICARE:

Cod sql:

alter table CONSUM drop primary key;


alter table consum
add primary key (id_consum, id_mancare, id_animal);

insert into CONSUM VALUES(1, 5005, 1000);


insert into CONSUM VALUES(2,5006, 1001);
insert into CONSUM VALUES(3,5009, 1002);
insert into CONSUM VALUES(4,5008, 1003);
insert into CONSUM VALUES(5,5009,10049);
insert into CONSUM VALUES(6,5007,1005);
insert into CONSUM VALUES(7,5008,1006);
insert into CONSUM VALUES(8,5008,1007);
insert into CONSUM VALUES(9,5005,1008);
insert into CONSUM VALUES(10,5001,1009);
insert into CONSUM VALUES(11,5007,1010);
insert into CONSUM VALUES(12,5006,1011);
insert into CONSUM VALUES(13,5009,1012);
insert into CONSUM VALUES(14,5009,1013);
insert into CONSUM VALUES(15,5000,1014);
insert into CONSUM VALUES(16,5000, 1015);
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

Crearea tabelei CERERE_ADOPTIE:

create table CERERE_ADOPTIE(id_cerere number (5),


id_animal number(5), constraint fk11 foreign key(id_animal) references
ANIMAL(id_animal),
id_adoptant number(5), constraint fk12 foreign key(id_adoptant) references
ADOPTANTI(id_adoptant),
data_adoptie date default sysdate);

insert into cerere_adoptie values(1, 1001, 3012, to_date('20-04-2021', 'dd-mm-yyyy'));


insert into cerere_adoptie values(2, 1004, 3020, to_date('12-02-2021', 'dd-mm-yyyy'));
insert into cerere_adoptie values(3, 1005, 3013, to_date('17-05-2021', 'dd-mm-yyyy'));
insert into cerere_adoptie values(4, 1006, 3005, to_date('11-02-2018', 'dd-mm-yyyy'));
insert into cerere_adoptie values(5, 1008, 3000, to_date('15-01-2021', 'dd-mm-yyyy'));
insert into cerere_adoptie values(6, 1010, 3005, to_date('25-01-2020', 'dd-mm-yyyy'));
insert into cerere_adoptie values(7, 1013, 3012, to_date('03-02-209', 'dd-mm-yyyy'));
insert into cerere_adoptie values(8, 1015, 3005, to_date('03-07-2020', 'dd-mm-yyyy'));
insert into cerere_adoptie values(9, 1003, 3020, to_date('31-12-2020', 'dd-mm-yyyy'));
insert into cerere_adoptie values(10, 1009, 3001, to_date('5-02-2021', 'dd-mm-yyyy'));
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

MODIFICARE:

Cod sql:

alter table CERERE_ADOPTIE


add constraint pk10 primary key(id_cerere, id_animal, id_adoptant);

Crearea tabelei INGRIJESTE:

create table INGRIJESTE(id_ingrijire number(5),


id_animal number(5), constraint fk13 foreign key(id_animal) references
ANIMAL(id_animal),
id_angajat number(5), constraint fk14 foreign key(id_angajat) references
ANGAJAT(id_angajat),
data_ingrijire date default sysdate);
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

insert into INGRIJESTE VALUES (1, 1001, 430,to_date('18-03-2021', 'dd-mm-


yyyy'));
insert into INGRIJESTE VALUES (2, 1004, 431,to_date('21-01-2021', 'dd-mm-
yyyy'));
insert into INGRIJESTE VALUES (3, 1005, 433,to_date('15-02-2020', 'dd-mm-
yyyy'));
insert into INGRIJESTE VALUES (4, 1006, 434,to_date('10-08-2017', 'dd-mm-
yyyy'));
insert into INGRIJESTE VALUES (5, 1008, 436,to_date('14-01-2021', 'dd-mm-
yyyy'));
insert into INGRIJESTE VALUES (6, 1010, 435,to_date('25-02-2019', 'dd-mm-
yyyy'));
insert into INGRIJESTE VALUES (7, 1012, 429,to_date('01-03-2019', 'dd-mm-
yyyy'));
insert into INGRIJESTE VALUES (8, 1014, 433,to_date('25-02-2020', 'dd-mm-
yyyy'));
insert into INGRIJESTE VALUES (9, 1015, 429,to_date('08-05-2019', 'dd-mm-
yyyy'));

MODIFICARE:

Cod sql:

alter table INGRIJESTE


add constraint pk11 primary key(id_ingrijire, id_animal, id_angajat);
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

11) Cereri SQL:

1) --Se vor lista in ordine descrescatoare dupa numele adapostului, animalele si


--angajatii care le-au tratat si pentru acestia se va afisa si numele adapostului din care -
-fac parte;
select concat('Animalul cu id-ul:',animal.id_animal)||' din adapostul
'||adapost.denumire_ad||' a fost tratat de '||angajat.nume_aj as subcerere
from animal
inner join angajat on angajat.id_angajat = animal.id_angajat
inner join adapost on adapost.id_adapost = angajat.id_adapost
where animal.id_angajat is not null order by adapost.denumire_ad desc;

2) --Sa se afiseze toti sponsorii adaposturilor


select asociatie.denumire_as, asociatie.suma_donata
from asociatie
inner join adapost on adapost.id_adapost = asociatie.id_adapost;

3) --Sa se afiseze Angajatii care au avut grija de animale si numele adapostului in care
-- lucreaza
select concat(angajat.nume_aj, angajat.prenume_aj) "Nume si prenume",
animal.id_animal, adapost.denumire_ad
from angajat
inner join animal on animal.id_angajat = angajat.id_angajat
inner join adapost on adapost.id_adapost = angajat.id_adapost;

4) --Utilizand clauza WITH: se vor lista in ordine descrescatoare id-ul, numele si


--pretul mancarilor care au pretul mai mare decat media valorilor totale a mancarilor;
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

WITH nume_bt as (select id_mancare, brand, pret


from mancare),
valoare as (select id_mancare, pret
from nume_bt
where nume_bt.pret > (select avg(pret)
from nume_bt)
)
select id_mancare, brand, pret
from nume_bt
where id_mancare in (select id_mancare
from valoare)
order by pret desc;

5) --S[ se afi;eze tipul animalelor in fun?ie de tipul lor astfel:


--Dac? tipul este caine, atunci s? se afi?eze: cel mai bun prieten al omului
-- Dac? tipul este papagal, atunci s? se afi?eze: animal care poate rosti cuvinte
-- Dac? tipul este sarpe, s? se afi?eze: animal relativ periculos
-- Altfel s? se afi?eze:alt tip de animal

select tip_animal, decode(tip_animal, 'Caine', 'Cel mai bun prieten al omului',


'Papagal', 'Animal care poate rosti cuvinte', 'Sarpe',
'Animal periculos', 'Alt tip de animal') as tipuri_de_animale
from animal;

6) ---S? se afi?eze tipul hranei pentru animale în func?ie de pre?ul acesteia, astfel:
-- Dac? pre?ul este < 40, s? se afi?eze: hran? cu pre?uri mici
-- Dac? pre?ul este între 40 ?i 80, s? se afi?eze: hran? cu pre?uri medii
-- Dac? pre?ul este > 80, s? se afi?eze: hran? cu pre?uri mari

select pret, case when pret < 40 then 'Hrana cu preturi mici'
when pret between 40 and 80 then 'Hrana cu preturi medii'
else 'Hrana cu preturi mari'
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

end as tip_de_hrana
from mancare;

7) --Sa se afiseze informatii despre angajatii al caror salariu depasteste


--valoarea medie a salariilor celorlalti angajati, afisandu-se numele adapostului,
--media salariilor acestuia si numarul de angajati care lucreaza la respectivul adapost;
--SUBCERERE SINCRONIZATA;

select nume_aj||''||prenume_aj "Angajati", salariu, ad.id_adapost, ad.denumire_ad,


(select round(avg(aj.salariu))
from angajat aj
where aj.id_adapost = ad.id_adapost) "Salariu Mediu",
(select count(id_angajat)
from angajat ak
where ak.id_adapost = ad.id_adapost) "Numar de angajati",
(select count(id_adapost)
from adapost
where id_adapost = ad.id_adapost) "Numar adaposturi"
from adapost ad join angajat a on (ad.id_adapost = a.id_adapost)
where salariu>(select avg(salariu)
from angajat
where id_adapost = ad.id_adapost);

8) --Sa se afiseze informatii despre angajatii al caror salariu depaseste valoarea medie
--a salariilor celorlalti angjati, afisandu-se numele, prenumele angajatului
--numele adapostului, numarul de angajati si numarul de adaposturi
--SUBCERERE NESINCRONIZATA

select aj.nume_aj||''||aj.prenume_aj "Angajati", aj.salariu, ad.id_adapost,


ad.denumire_ad, round(sal_med)
as Salariu_Mediu, nr_ang as Numar_Angajati, nr_ad as Numar_Adaposturi
from adapost ad, angajat aj, (select adp.id_adapost, avg(salariu) sal_med,
count(id_angajat) nr_ang
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

from angajat ajp, adapost adp


where adp.id_adapost = ajp.id_adapost
group by adp.id_adapost) ang,
(select id_adapost, count(id_adapost) nr_ad
from adapost
group by id_adapost) adap
where ad.id_adapost = aj.id_adapost and aj.id_adapost = ang.id_adapost and
aj.salariu > (select avg(salariu)
from angajat
where id_adapost = ad.id_adapost) and ad.id_adapost = adap.id_adapost;

9) --Sa se afiseze id-ul, tipul animalelor care au fost adoptate, altfel 'Animalul nu a
--fost adoptat';
select id_animal, tip_animal, nvl(to_char(id_adoptant),'Animalul nu a fost adoptat')
"Adoptat"
from animal
order by id_animal desc;

10) --Sa se afiseze data animalului cand s-a imbolnavit si id-ul acestuia, altfel
Animalul nu a fost bolanv;
select a.id_animal, nvl(to_char(f.data_fisa), 'Animalul nu a fost bolnav') as
Sanatos_Bolnav
from animal a, fisa_medicala f
where a.id_animal = f.id_animal;

12) Actualizare/Suprimare:

Observație! Am folosit un update la punctul 10 (am scris greșit codul pentru tabela
ANIMAL si când am observat era foarte mult de modificat așa ca am folosit update,
sper ca nu este nicio problema).
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

-- Sa se adauge in tabelul MANCARE o coloana noua commision_pct si sa se


modifice
--comisionul mancarii cu numele Health -> 0.25, Granulli -> 0.54
alter table MANCARE
add commision_pct number(5,2);

update mancare
set commision_pct = 0.25
where upper(brand) like '%HEALTHY%';

update mancare
set commision_pct = 0.54
where lower(brand) like '%granulli%';

Pentru tabela MANCARE nu am sters coloana adaugata.

--Sa se stearga din tabela fisa_medicala id-ul animalului care a fost adoptat

delete from fisa_medicala


where id_animal in (select id_animal
from animal
where id_adoptant is not null);
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

--Sa se mareasca salariul Veterinarilor din adapostul Smeura sau Bragadiru care au salariul mai mic
decat 800;
update angajat
set salariu = salariu+salariu*0.10
where id_adapost in (select id_adapost
from adapost
where denumire_ad = 'Smeura' or denumire_ad = 'Bragadiru')
and (functie = 'Veterinar' and salariu < 800);

Am dat rollback pentru FISA_MEDICALA si ANGAJAT.

13) Crearea unei secvente:

Observație! Am creeat 3 secvente pe care le-am folosit la punctul 10 pentru tabela


Angajat, Asociatie si Vizitator. Voi scrie doar secventele, FARA INSERT (au fost
facute deja).

Pentru VIZITATOR:
CREATE SEQUENCE seq_viz
increment by 1
start with 1
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

maxvalue 100
nocycle;

Pentru ASOCIATIE:
create sequence seq_as
increment by 1
start with 100
maxvalue 150
nocycle;

Pentru ANGAJAT:
create sequence seq_aj
increment by 1
start with 400
maxvalue 450
nocycle;

16) Operațiile outer-join și division

--Outer-join
select aj.id_angajat, ad.id_adapost, aso.id_asociatie, lol.id_locatie
from adapost ad
full outer join angajat aj on aj.id_adapost = ad.id_adapost
full outer join adapost ada on ada.id_adapost = ad.id_adapost
full outer join asociatie aso on aso.id_adapost = ad.id_adapost
full outer join locatie lol on lol.id_adapost = ad.id_adapost
where id_asociatie is not null and ad.id_adapost is not null and id_angajat is not null
and id_locatie is not null;
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

--Sa se afiseze lista nagajatilor care lucreaza in adapostul sponsorizat de asociatia cu --


-id-ul 101;

select id_angajat, nume_aj


from angajat
where id_adapost in (select id_adapost
from asociatie
where id_asociatie = 101)
minus
select id_angajat, nume_aj
from angajat
where id_adapost not in (select id_adapost
from asociatie
where id_asociatie = 101);

--Sa se obtina id-ul, numele de familie si data angajarii a angajatilor care lucreaza in
--acelasi adapost
-- cu angajatul avand codul 402 si sa se listeze dupa data_angajarii
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

select id_angajat, nume_aj, data_angajarii


from angajat
where id_adapost in (select id_adapost
from angajat
where id_angajat = 402)
and id_angajat != 402
group by id_angajat, nume_aj, data_angajarii
having count(*) = (select count (id_adapost)
from angajat
where id_angajat = 402)
order by data_angajarii;

17) Optimizarea unei cereri

Cerere SQL:
--Sa se afle judetul si orasul adapostului unde lucreaza angajatul cu id-ul 404
select l.judet, l.oras_l
from locatie l join adapost a on (l.id_adapost = a.id_adapost)
join angajat aj on (aj.id_adapost = l.id_adapost)
where aj.id_angajat = 404;

Expresie algebrica:

R1 = SELECT(ANGAJAT, id_angajat = 404)


R2 = PROJECT(R1, id_adapost)
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

R3 = PROJECT(LOCATIE, id_adapost, judet, oras)


R4 = PROJECT(ADAPOST, id_adapost)
R5 = SEMIJOIN(R3, R4)
R6 = SEMIJOIN(R5, R2)
REZULTAT = R7 = PROJECT(R6, judet, oras)

Arbore algebric:

18.a) Realizarea normalizării: BCNF, FN4, FN5


Forma normala Boyce-Codd
O relație este în forma normală Boyce-Codd dacă și numai dacă fiecare
determinant este o cheie candidat.
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

Avem urmatorul exemplu NON-BCNF, cu schema relatională


AUTOR(#id_autor, nationalitate, titlu_carte, gen, nr_pagini), care nu se regaseste in
modelul proiectat.

Autor Nationalitate Titlu_Carte Gen Nr_pagini


William Britanic Comedia Comedie 100
Shakespeare erorilor
Ion Creanga Roman Harap-Alb Basm-Cult 300

Aplicând regula Casey-Delobel, AUTOR(autor, nationalitate, titlu_carte, gen,


nr_pagini) se descompune în AUTOR1(autor, nationalitate)titlu_carte, gen,
nr_pagini), unde cheia candidat titlu_carte devine cheie primară și
AUTOR2(titlu_carte, gen, nr_pagini), unde titlu_carte este cheie externă, astfel
aducându-se relația în forma normala Boyce-Codd, AUTOR3(autor, titlu_carte) unde
autor si titlu carte sunt chei externe.

Autor Nationalitate
William Britanic
Shakespeare
Ion Creanga Roman

Titlu_carte Gen Nr_pagini


Comedie erorilor Comedie 100
Harap-Alb Basm-Cult 300

Autor Titlu_carte
William Comedia erorilor
Shakespeare
Ion Creanga Harap-Alb

Forma normala 4
O relație este în a patra formă normală dacă și numai dacă relația este în BCNF
și nu conține relații m:n independente.
Fie o companie de taxiuri care are mai multi angajati si mai multe masini, de
diferite tipuri. Un angajat poate cunoaste mai multe limbi straine si poate conduce mai
multe masini. In legatura cu sosirea unei delegatii de persoane straine in oras
managerul companiei cere o situatie cu soferii angajati, cunostintele de limbi straine si
masinile de care dispun.
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

Cod_angajat Limba_straina Automobil


A1 Engleza Cielo
A1 Franceza Tico
A1 Italiana Cielo
A2 Spaniola Matiz
A2 Rusa Matiz

Exista dependentele multivaloare “cod_angajat” -> “limba_straina” si cod_angajat


-> “masina”, dar niciuna dintre “limba_straina” si “masina” nu depinde functional de
“cod_angajat”. Astfel obtinem:
ANGAJATI_1(cod_angajat, limba_straina)
ANGAJATI_2(cod_angajat, automobil)

Cod_angajat Limba_straina
A1 Engleza
A1 Franceza
A1 Italiana
A2 Spaniola
A2 Rusa

Cod_angajat Automobil
A1 Cielo
A1 Tico
A2 Matiz

Forma normala 5
O relație este în a cincea formă normală dacă și numai dacă relația este în FN4 și
nu conține dependențe ciclice.
Luand ca exemplu urmatoarele relatii:
Un vanzator poate gestiona mai multe comenzi si un client solicita mai multe
comenzi
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

Relatia de tip 3 precedenta poate fi echivalenta cu 3 relatii de tip 2 doar daca


aceste relatii de tip 2 sunt ciclice, deoarece atunci când sunt efectuate JOIN-urile se va
obține același rezultat.

Cele 3 relații de tip 2 alcătuiesc o diagramă ce conține dependențe ciclice, deci


relația de mai sus este un exemplu de NON-FN5, relația de tip 3 fiind cea care
satisface condițiile FN5.
Ene Marius-Andrei Proiect Baze de Date
Grupa 142

b) Denormalizarea

Denormalizarea este procesul invers de normalizare, unde schema normalizată


este transformată într-o schemă care are informații redundante. Performanța este
îmbunătățită prin Profesor Semestru Georgescu 1 Popescu 1 Marin 2 Tudor 1
Georgescu 2 31 utilizarea redundanței și menținerea consecventă a datelor redundante.
Motivul pentru efectuarea denormalizării este costurile generale generate în
procesorul de interogări de către o structură supra-normalizată.
Denormalizarea poate fi, de asemenea, definită ca metoda de stocare a îmbinării
relațiilor normale de formă superioară ca relație de bază, care se află într-o formă
normală inferioară. Reduce numărul de mese și se complică masa deoarece un număr
mai mare de intrări poate încetini procesul. Un mic exemplu ar fi că denormalizarea
este o soluție pentru a evita un join de dimensiuni mari, dar nu este întocmai potrivită
în toate cazurile de genul.
Luăm în considerare entitatea ANGAJTI, cu cheia primară #id_angajat și cu mai
multe atribute, printre care și salariu. Deși acesta se poate repeta pentru mai mulți
angajați, nu ar fi eficient să se implementeze un tabel separat care să conțină
#id_angajat și salariu, întrucât ar fi necesar încă un join pentru înterogarea salariului
unui angajat căruia îi știm doar id-ul. Astfel, aplicând denormalizarea, se va ajunge la
tabelul ANGAJATI din modelul implementat, care conține #id_angajat, nume,
prenume, salariu, functie, data_angajarii, strada, oras, numar, email.

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