Baze de Date-Licenta - Rezolvari - v3-1
Baze de Date-Licenta - Rezolvari - v3-1
Baze de Date-Licenta - Rezolvari - v3-1
- entitate
• Entitatea este un obiect sau un concept, care este semnificativ pentru modelul real analizat. O
entitate poate fi dependentă (slabă), existenţa sa depinzând de altă entitate sau independentă (tare), caz
în care ea nu depinde de existenţa altei entităţi.
Entitatea poate fi persoană, loc, concept, activitate etc. Prin urmare, ea poate fi un obiect cu existenţă
fizică, reală sau poate fi un obiect cu existenţă conceptuală, abstractă.
- relație
• Relaţia (asocierea) este o comunicare între două sau mai multe entităţi. O valoare a unei relaţii
este o comunicare între valorile entităţilor pe care le leagă.
Relaţia exprimă un raport care există între aceste entităţi. Gradul unei relaţii este dat de numărul de
entităţi participante într-o relaţie (de exemplu, relaţie binară, ternară, cvadruplă, n-ară).
- atribut
• Atributul este o proprietate descriptivă a unei entităţi sau a unei relaţii. De exemplu, numele ,
genul unei film, sunt atribute al entităţii FILM.
Atributele pot fi simple (pretul de închiriere a unui film), compuse (de exemplu, numele filmului), cu valori
multiple (de exemplu, limbile în care e tradus un film), derivate (de exemplu, vârsta unei persoane se
obţine din data naşterii).
Regula 1 – regula gestionării datelor. Un SGBD relaţional trebuie să fie capabil să gestioneze o bază de
date numai prin posibilităţile sale relaţionale.
Regula 2 – regula reprezentării informaţiei. Într-o bază de date relaţională, informaţia este reprezentată
la nivel logic sub forma unor tabele ce poartă numele de relaţii.
Regula 3 – regula accesului garantat la date. Fiecare valoare dintr-o bază de date relaţională trebuie să
poată fi adresată în mod logic printr-o combinaţie formată din numele relaţiei, valoarea cheii primare şi
numele atributului.
Regula 4 – regula reprezentării informaţiei necunoscute. Un sistem relaţional trebuie să permită
utilizatorului definirea unui tip de date numit „null“ pentru reprezentarea unei informaţii necunoscute la
momentul respectiv.
Regula 5 – regula dicţionarelor de date. Asupra descrierii bazelor de date (informaţii relative la relaţii,
vizualizări, indecşi etc.) trebuie să se poată aplica aceleaşi operaţii ca şi asupra datelor din baza de date.
Regula 6 – regula limbajului de interogare. Trebuie să existe cel puţin un limbaj pentru prelucrarea bazei
de date.
Regula 7 – regula de actualizare a vizualizării. Un SGBD trebuie să poată determina dacă o vizualizare poate
fi actualizată şi să stocheze rezultatul interogării într-un dicţionar de tipul unui catalog de sistem.
Regula 8 – regula limbajului de nivel înalt. Regulile de prelucrare asupra unei relaţii luată ca întreg sunt
valabile atât pentru operaţiile de regăsire a datelor, cât şi asupra operaţiilor de inserare, actualizare şi
ştergere a datelor.
Regula 10 – regula independenţei logice a datelor. Programele de aplicaţie trebuie să fie transparente la
modificările de orice tip efectuate asupra datelor. Regula 11 – regula independenţei datelor din punct de
vedere al integrităţii. Regulile de integritate trebuie să fie definite într-un sublimbaj relaţional, nu în
programul de aplicaţie.
Regula 12 – regula independenţei datelor din punct de vedere al distribuirii. Distribuirea datelor pe mai
multe calculatoare dintr-o reţea de comunicaţii de date, nu trebuie să afecteze programele de aplicaţie.
Regula 13 – regula versiunii procedurale a unui SGBD. Orice componentă procedurală a unui SGBD trebuie
să respecte aceleaşi restricţii de integritate ca şi componenta relaţională.
1) structurile de date. O bază de date relaţională (BDR) reprezintă un ansamblu de relaţii, prin care se
reprezintă date şi legăturile dintre ele. Structurile sunt definite de un limbaj de definire a datelor (Data
Definition Language). Datele în modelul relațional sunt structurate în relații (tabele) bidimensionale;
7. Precizati care sunt restrictiile de integritate minimală ale modelului relaţional, apoi enunţaţi aceste
restricţii.
• Pentru această definiţie, voi folosi două atribute arbitrare, denumite „A" şi „B". Atributul B este
dependent funcţional de atributul A dacă în nici un moment nu există mai mult de o valoare a atributului
B asociată cu o valoare dată a atributului A. In primul rând, a spune că atributul B este funcţional
dependent de atributul A înseamnă şi că atributul A determină atributul B sau că A este un determinant
(identificator unic) pentru atributul B.
9.Definiţi următoarele noţiuni:
- atribut simplu (atomic)
• atribut care nu mai poate fi descompus in altea tribute
- atribut compus
• atribut care poate fi descompus in doua sau mai multe atribute atomice
- forma normală 2?
O relaţie este în a doua formă normală 2 dacă îndeplineşte următoarele criterii:
• Relaţia este în prima formă normală.
• Toate atributele non-cheie sunt dependente funcţional de identificatorul unic (cheia
primară), luat ca întreg.
- forma normală 3?
O relaţie este în a treia formă normală dacă îndeplineşte următoarele două criterii:
• Relaţia este în a doua formă normală.
• Nu există dependenţe tranzitive (cu alte cuvinte, toate atributele non-cheie depind
numai de identificatorul unic).
• cuvinte cheie (key words) - dintre care fac parte comenzile (SELECT, UPDATE, INSERT etc),
operatorii (AND, OR, NOT, LIKE), clauzele (WHERE, SET, VALUES etc);
• identificatori (identifier) - sunt elementele care denumesc tabela, coloana sau alt obiect al BD.
SQL face diferenţa între literele mari şi mici, deci este „case-sensitive”; identificatorul care conţine
ghilimele se numeşte identificator delimitat;
• constante (literali) - reprezintă şiruri de caractere (‘ ‘), numere întregi, numere reale (ex. 3.5; 4.;
.001; 5e2), constanta NULL, constante de tip logic (1 pentru TRUE şi 0 pentru FALSE);
• caractere speciale - cum ar fi (;) care semnifică terminarea comenzilor; (.) care semnifică virgula
zecimală; sau (*) care simbolizează operatorul de înmulţire.
12. Operatori SQL.
@ valoarea absolută
! factorial
• operatori de comparaţie:
A IS NULL
A IS NOT NULL
A LIKE model_şir
• operatori logici:
Operatorii logici sunt legaţi prin cuvintele cheie AND, OR, NOT şi returnează o valoare logică TRUE,
FALSE sau NULL.
• operatori relaţionali:
UNION (reuniune)
INTERSECT (intersecţie)
MINUS (diferenţă)
Funcțiile pe un sigur rând (funcţii scalare) - realizează operații asupra unui singur rând și returnează un
singur rezultat pentru fiecare rând. Funcțiile pe un sigur rând cuprind următoarele tipuri de funcții:
• funcții de tip caracter - acceptă argumente de tip caracter și întorc rezultate de tip caracter (CHR,
CONCAT, INITCAP, LOWER, LPAD, LTRIM, REPLACE, RPAD, RTRIM, SUBSTR, UPPER etc.) sau numeric (ASCII,
INSTR, LENGTH);
• funcții de tip numeric (de calcul trigonometric: sin, cos, tg, ctg etc.; de calcul al logaritmului: ln, log, lg;
de calcul al puterilor: pow; de rotunjire: floor, ceil etc.) - acceptă argumente de tip numeric și întorc
rezultate de tip numeric;
• funcții de conversie (TO_CHAR, TO_NUMBER, TO_DATE, CAST) - fac conversia dintr-un tip de dată în
altul;
Funcţiile scalare - primesc unul sau mai multe argumente şi returnează valoarea calculată sau NULL în caz
de eroare. Argumentele funcţiilor pot fi constante sau valori ale atributelor specificate prin numele
coloanelor corespunzătoare.
Funcțiile pe mai mutle rânduri (funcții de grup) - lucrează cu grupuri de rânduri pentru a returna un
singur rezultat pentru fiecare grup. Aceste funcții sunt cunoscute cu denumirea de funcții de grup. Toate
funcţiile de grup, mai puţin COUNT(*) ignoră valorile NULL.
Majoritatea funcţiilor de grup acceptă opţiunile: DISTINCT (determină luarea în calcul numai a valorilor
distincte ale rândurilor din cadrul grupului) şi ALL (este implicit și determină luarea în calcul a tuturor
valorilor grupului de rânduri).
Comanda fundamentală a standardului SQL este SELECT, aceasta permiţând interogarea unei baze de date.
Componentele interogării se numesc clause.
Clauzele SELECT şi FROM sunt obligatorii. SELECT specifică datele care se selectează, iar clauza FROM specifică
relaţiile din care se selectează. Restul clauzelor sunt opţionale.
16. Sintaxa generală instructiunii INSERT
• Instrucţiunea SQL INSERT este folosită pentru inserarea noilor rânduri de date în tabele.
Instrucţiunea are două forme de bază: una în care valorile coloanelor sunt specificate chiar în instrucţiune
şi alta în care valorile sunt selectate dintr-un tabel sau o vizualizare, folosind o subinterogare.
Instrucţiunea INSERT care foloseşte o clauză VALUES poate crea un singur rând la fiecare rulare, deoarece
valorile pentru rândul de date respective sunt specificate chiar în instrucţiune.
Sau:
• Instrucţiunea UPDATE este folosită pentru actualizarea datelor din coloanele unui tabel (sau ale
unei vizualizări). Sintaxa generală a instrucţiunii UPDATE:
UPDATE nume_tabel_sau_vizualizare
SET nume_coloana = expresie
[nume_coloana = expresie...]
[ WHERE conditie];
• Instrucţiunea DELETE şterge unul sau mai multe rânduri dintr-un tabel. Instrucţiunea poate să
folosească şi o vzualizare, dar numai dacă aceasta se bazează pe un singur tabel (ceea ce înseamnă că
instrucţiunile DELETE nu pot fi folosite pentru vizualizări care conţin uniuni). În instrucţiunile DELETE nu
sunt referite niciodată coloane, doarece instrucţiunea şterge rânduri întregi de date, inclusiv toate valorile
datelor (toate coloanele) din rândurile afectate. Dacă vreţi să ştergeţi o singură valoare din rândurile
existente, folosiţi instrucţiunea UPDATE pentru a înlocui valorile respective cu valori nule (presupunând
că valorile nule sunt permise în acele coloane).
Comenzi pentru crearea relaţiilor de bază: in cadrul acestor comenzi se precizează numele relaţiei precum
şi numele şi tipul atributelor.
Exemplu:
ADD CONSTRAINT CK_SUMA_DEPOZIT_CLIENT CHECK (SUMA_DEPOZIT_CLIENT >= 0
OR SUMA_DEPOZIT_CLIENT IS NULL);
Exemplu:
ALTER TABLE Customer DROP CONSTRAINT restrictia_unu;
• O tranzacţie în baza de date este un set de comenzi pe care utilizatorul bazei de date vrea sa le
trateze ca pe o unitate funcţionala de tip „totul sau nimic”, întelegând prin aceasta că intreaga tranzactie
trebuie sa reuseasca sau sa esueze. Comenzile pentru cotrolul tranzacţiilor (Transaction Control
Commands ) nu respectă cu exactitate sintaxa instrucţiunilor SQL , dar a fecteaza puternic
comportamentul instructiuunilor SQL incluse în tranzacţii.
23. Care sunt modificările pe care le implică execuţia unei comenzi COMMIT? Dar ROLLBACK?
Comanda COMMIT este comanda tranzacțională utilizată pentru salvarea modificărilor invocate de o
tranzacție la baza de date. Comanda COMMIT salvează toate tranzacțiile din baza de date de la ultima
comandă COMMIT sau ROLLBACK.
Sintaxa pentru comanda COMMIT este commit; (doar atat)
Comanda ROLLBACK este comanda tranzacțională utilizată pentru a anula tranzacțiile care nu au fost
deja salvate în baza de date. Această comandă poate fi utilizată numai pentru anularea tranzacțiilor de la
emiterea ultimei comenzi COMMIT sau ROLLBACK.
Sintaxa pentru ROLLBACK:
ROLLBACK; (sau daca se doreste revenirea la un punct de restore, varianta de jos)
ROLLBACK TO SAVEPOINT_NAME;
numai utilizatorii autorizaţi pot efectua operaţii corecte asupra bazei de date. Pentru acestea, există
unei politici de securitate. Pentru a accesa un obiect, un utilizator trebuie să aibă privilegiile
necesare. Privilegiile pot fi acordate direct unui utilizator sau pot fi grupate în roluri, care la
Exemplu: Un forum de discuții are utilizatori grupați pe roluri ca: administrator, moderator,
membru. Fiecare rol poate avea privilegii diferite: administratorul poate configura baza de
date (modifică schema, adaugă tabele, configurează interfața); moderatorul poate valida,
Reluarea unor acțiuni în cazul apariţiei unei defecțiuni hard sau soft presupune recuperarea ultimei
stări coerente a bazei de date. În funcţie de defecţiunea care a determinat întreruperea lucrului,
restaurarea bazei de date se realizează automat de SGBD sau manual, adică necesită intervenţie
umană.
Copiile bazei de date - pot fi realizate automat de sistem la anumite intervale de timp sau la comanda
administratorului bazei de date, ori de câte ori este nevoie şi de obicei pe un alt suport magnetic decât
cele pe care rezidă baza de date. Aceste copii pot fi utilizate doar în situaţia în care prelucrările
efectuate între momentul realizării copiilor şi cel al apariţiei unei defecţiuni pot fi reluate. Acest lucru
este posibil doar dacă prelucrările sunt efectuate într-o secvenţă cunoscută iar timpul necesar pentru
reprocesarea nu este foarte mare. Durata mare de execuţie pentru astfel de copii face ca anumite
SGBD-uri să recurgă la copii ale jurnalelor bazei de date. Volumul datelor care vor fi copiate în acest
caz va fi mai mic, iar procesul de restaurare va implica într-o măsură mai mică intervenţia umană.
Jurnalul tranzacţiilor - este un fişier special întreţinut de SGBD, în care sunt memorate informaţiile
• datele introduse;
Jurnalul imaginilor înregistrărilor din baza de date - se deosebeşte de jurnalul tranzacţiilor prin aceea
Afiseaza ID-ul, numele si prenumele studentilor din localitatea „Craiova” care sunt nascuti in
iulie 1993
Va afisa ID-ul, titlul, textierul, compozitorul, genul si durata pentru toate melodiile al caror
textier este cunoscut (diferit de NULL).
Afiseaza numele, functia si salariul angajatului care are salariul mai mare decat al oricarui
programator IT.
Afiseaza id-ul si numele angajatilor care sunt sefi, o singura data (SELECT DISTINCT selecteaza
doar valorile unice din rezultate).
Adauga in tabela SALARIATI doua coloane noi: cod_functie de tip Number(2) si email de tip
Char(25).
Nimic, pentru ca cele 2 argumente sunt coloane in SALARIATI, iar comanda este de eliminare de
restrictii (constraints). E posibil sa fie o eroare si comanda pe care intentiona sa o puna sa fie
DROP COLUMN (cod_functie, email);, caz in care se eliminau cele 2 coloane din tabel.
36. Se dau următoarele tabele:
TABLOU (id_tablou#, titlu, data_crearii, valoare, cod_pictor)
PICTOR (id_pictor#, nume, prenume, data_nasterii)
Ce va determina execuția comenzii următoare?
SELECT nume
FROM pictor, tablou
WHERE id_pictor = cod_pictor
GROUP BY nume
HAVING SUM(valoare) > = 200000;
Afiseaza numele pictorilor care au tablouri cu o valoare totala mai mare sau egala cu 200.000
Afiseaza numele clientilor si id-urile si numele agentilor care au lucrat cu acei clienti(daca exista)
FROM tablou t2
WHERE t1.cod_pictor = t2.cod_pictor)
Afiseaza numele si prenumele pictorilor care au tablouri cu valoare mai mare de 50.000
41. Se dau următoarele două tabele:
OPERA_ARTA(id_opera#, titlu, data_creare, nume_autor, pret, cod_gen)
GEN(id_gen#, denumire, descriere)
Ce va determina execuția comenzii următoare?
UPDATE opera_arta
SET pret = pret * 0.5
WHERE cod_gen IN (SELECT id_gen
FROM gen
WHERE denumire NOT IN (‘pictura’, ‘sculptura’));
Reduce pretul la jumatate pentru operele de arta care NU SUNT picturi sau sculpturi.
Observatie: Stocul curent nu poate fi mai mic decat 1. Ce va determina execuția comenzii următoare?
SELECT d.denumire
FROM produs p, depozit d
WHERE p.cod_depozit = d.id_depozit
GROUP BY d.denumire
HAVING COUNT(*) >= 1000;
43. Dacă în tabelul ANGAJAT sunt menținute informații despre angajați, respectiv despre departamentul
și jobul pe care lucrează în prezent, iar în tabelul ISTORIC_ANGAJAT informații despre departamentele și
joburile pe care au lucrat aceștia în trecut, atunci ce va determina execuția comenzii următoare?
SELECT id_angajat, cod_departament, cod_job
FROM angajat
INTERSECT
SELECT id_angajat, cod_departament, cod_job
FROM istoric_angajat;
Teorie: The SQL INTERSECT operator is used to return the results of 2 or more SELECT statements.
However, it only returns the rows selected by all queries or data sets. If a record exists in one query
and not in the other, it will be omitted from the INTERSECT results.
44. Se dau următoarele trei tabele:
FACTURA (id_factura#, data_emitere)
CONTINE (cod_factura#, cod_produs#, cantitate)
PRODUS(id_produs#, denumire, pret_unitar)
Observație: Facturile conțin produsele vândute. Ce va determina execuția comenzii următoare?
SELECT id_factura, SUM(cantitate*pret_unitar)
FROM contine c, produs p, factura f
WHERE c.cod_produs = p.id_produs
AND c.cod_factura = f.id_factura
AND TO_CHAR(data_emitere,’YYYY’) =TO_CHAR(sysdate,’YYYY’)
GROUP BY id_factura;
Afiseaza id-ul + denumirea proiectelor si numele tuturor angajatilor care au lucrat la proiectele
terminate pana la data curenta
Table proiecte:
Rezultatul querry-ului:
Comanda din enunt e fara paranteza de la final (cu rosu), caz in care da eroare.
Mareste salariile angajatilor care lucreaza in IT cu 10% si face o rotunjire a rezultatului la a 2-a
zecimala.
48. Se dau următoarele două tabele:
EMP (empno#, ename, job, mgr, hiredate, sal, comm, deptno)
DEPT (deptno#, dname, loc)
Ce va determina execuția comenzii următoare?
SELECT mgr, MIN(sal)
FROM emp
WHERE mgr IS NOT NULL
GROUP BY mgr
HAVING MIN(sal) > 3000
ORDER BY MIN(sal) DESC;
Table EMP
Querry result:
Am modificat salariul lui Alex (care il are ca manager pe Andrei) la 2900. Rezultatul este acum
Afiseaza anii in care s-au facut angajari si numarul de persoane angajate in anii respectivi.
50. Se dă următorul tabel: DATE_PERSOANA(CNP, nume, prenume, nr_telefon, simbol_judet)
Ce va determina execuția comenzii următoare?
SELECT CONCAT('Numele: ',nume) AS numele,
CONCAT('Anul: ', '19',SUBSTRING(CNP,2,2), ' , ' ,
'Luna:',SUBSTRING(CNP,4,2), ', ' ,
'Ziua: ',SUBSTRING(CNP,6,2))
AS data_nasterii
FROM DATE_PERSOANA
Scrieți comanda care șterge din tabelul SALARIATI coloanele cod_fuctie și email.
ALTER TABLE SALARIATI
DROP COLLUMN (cod_functie, email);
-- Vezi ex 35, unde se cerea efectul comenzii --
52. Se dă următorul tabel: ANGAJATI(id_angajat#, nume, data_angajarii, salariu, functia, id_sef). Scrieți
comanda care obține numărul de angajați care au șef.
SELECT COUNT(*) id_angajat
from ANGAJAT
where Id_sef is NOT NULL;
53. Se dă următorul tabel: SALARIATI (id_angajat#, nume, prenume, cnp, data_angajarii, salariu,
cod_fuctie). Scrieți comanda care afișează numele salariaților care câștigă mai mult decât salariul
mediu pe companie, în ordine crescătoare a salariului.
SELECT nume, prenume
FROM SALARIATI
WHERE salariu > avg(salariu)
ORDER BY salariu ASC;
SELECT p.*
FROM scoala s
natural join profesor p
WHERE p.datan < (SELECT datan
FROM profesor pr
WHERE pr.cod_prof = s.cod_director);