Sunteți pe pagina 1din 337

1. Care este forma corecta pentru a adauga constrangeri la nivel de coloana si /sau la nivel de tabel? CREATE TABLE [schema.

]nume_tabel ( nume_coloana tip_de_date, [DEFAULT expr] [constrangere_de_coloana], ... ..[constrangere la nivel de tabel]) CREATE TABLE [schema.]nume_tabel ( nume_coloana tip_de_date [DEFAULT expr], [constrangere_de_coloana] ... ..[constrangere la nivel de tabel]) CREATE TABLE [schema.]nume_tabel ( nume_coloana tip_de_date, [DEFAULT expr], [constrangere_de_coloana], ... ..[constrangere la nivel de tabel]) CREATE TABLE [schema.]nume_tabel ( nume_coloana tip_de_date [DEFAULT expr] [constrangere_de_coloana], ... ..[constrangere la nivel de tabel]) 2. Care este comanda corecta care determina marirea salariul tuturor angajatilor din tabelul salariat cu 5%? UPDATE salariu SET salariu = salariu * 1.05; UPDATE salariat SET salariu = salariu * 1.05; UPDATE salariat SET salariu = 1.05; UPDATE salariat SET salariu = salariu + salariu* 1.05; 3. Care este comanda corecta care insereaza in tabelul TOTALURI(cod_departament, numar_angajati, suma_salarii)? INSERT INTO totaluri SELECT cod_departament, COUNT(*),SUM(salariu) FROM salariat GROUP BY cod_departament; INSERT INTO totaluri SELECT cod_departament, SUM(cod_angajat),SUM(salariu) FROM salariat GROUP BY cod_departament; INSERT INTO totaluri SELECT cod_departament, COUNT(*),SUM(salariu) FROM salariat; INSERT INTO totaluri SELECT cod_departament, COUNT(),SUM(salariu) FROM salariat ORDER BY cod_departament; 4. Care comanda afiseaza numele angajatilor, fara duplicate, care au manager? SELECT DISTINCT nume FROM salariat WHERE manager IS NOT NULL; SELECT DISTINCT nume FROM salariat WHERE manager IS NULL; SELECT nume FROM salariat WHERE manager IS NOT NULL; SELECT DISTINCT nume

FROM salariat WHERE manager != NULL; 5. Care este comanda corecta care pentru fiecare facultate, se insereaza in tabelul SALARII(cod_fac, nr_prof, total_sal_fac) numarul de profesori si suma salariilor pe care facultatea o plateste profesorilor sai? INSERT TO TOTALURI SELECT COD_FAC, COUNT(*) , SUM(SALARIU) FROM PROF ORDER BY COD_FAC; INSERT INTO TOTALURI SELECT COD_FAC, COUNT(*) , SUM(SALARIU) FROM PROF ; INSERT INTO TOTALURI SELECT COD_FAC, COUNT(*) , SUM(SALARIU) FROM PROF GROUP BY COD_FAC; INSERT INTO totaluri SELECT COD_FAC, SUM(COD_PROF),SUM(SALARIU) FROM PROF GROUP BY COD_FAC; 6. Care secventa este corecta pentru a afisa citi angajati nu au o valoare introdusa pe coloana salariu? SELECT COUNT() FROM salariati WHERE SALARIU =0; SELECT COUNT(*) FROM salariati WHERE SALARIU =NULL; SELECT COUNT(*) FROM salariati WHERE SALARIU IS NOT NULL; SELECT COUNT(*) FROM salariati WHERE SALARIU IS NULL; 7. Care este comanda corecta care determina dublarea salariilor cu rotunjire la 2 zecimale a angajatilor care sunt titulari? UPDATE salariat SET salariu=ROUND(salariu*2,2); UPDATE salariat SET salariu=ROUND(salariu*2) WHERE titular =y; UPDATE salariat SET salariu=ROUND(salariu*2,2) WHERE titular =y; UPDATE salariat SET salariu=ROUND(salariu*0.5,2) WHERE titular =y; 8. Care este comanda corecta care afiseaza numele salariatilor care castiga mai mult decat salariul mediu pe companie, in ordine crescatoare a salariului? SELECT nume FROM salariati WHERE salariu >AVG(salariu);

SELECT nume FROM salariati WHERE salariu > (SELECT AVG(salariu) FROM salariati) ORDER BY salariu; SELECT nume FROM salariati WHERE salariu > (SELECT AVG(salariu) FROM salariati ORDER BY salariu); SELECT nume FROM salariati WHERE salariu > (SELECT AVG(salariu) FROM salariati) ORDER BY 1; 9. Ce comanda modifica in tabelul SALARIAT COD _ANG NUME PRENUME DATA_ANG VARSTA EMAIL SALARIU not null numeric de 5 sir de caractere de maxim 20 sir caractere de maxim 20 date, valoare implicita data curent numeric de 2 sir de caractere de dimensiune fixa, de 30 valoare implicita 0 numar de 10 cu 2 zecimale dimensiunea coloanei nume la 30 si pe cea a coloanei salariu la 12 cu 3 zecimale? ALTER TABLE salariat MODIFY nume VARCHAR2(30), salariu NUMBER(12,3); ALTER TABLE salariat MODIFY nume VARCHAR2(30), salariu NUMBER(12,3); ALTER TABLE salariat MODIFY nume VARCHAR2(30), MODIFY salariu NUMBER(12,3);

ALTER TABLE salariat MODIFY (nume VARCHAR2(30), salariu NUMBER(12,3)); 10. Care este comanda corecta care sterge valoarea coloanei salariu pentru angajatii care sunt angajati cu contract de colaborare? DELETE salariu FROM salariati WHERE contract=colaborare; UPDATE salariati SET salariu IS null WHERE contract=colaborare; DROP salariu FROM salariati WHERE contract=colaborare; UPDATE salariati SET salariu=null WHERE contract=colaborare; 11. Care este comanda incorecta care afiseaza numele, salariul si varsta pentru toti salariatii care castiga mai mult de 1000, rezultatul fiind sortat descendent dupa salariu, iar pentru cei care au acelasi salariu in ordine crescatoare dupa nume? SELECT nume, salariu, varsta FROM salariat WHERE salariu>1000 ORDER BY salariu DESC nume ASC; SELECT nume, salariu, varsta FROM salariat WHERE salariu>1000 ORDER BY salariu DESC, nume ASC; SELECT nume, salariu, varsta FROM salariat WHERE salariu>1000 ORDER BY salariu DESC, nume; SELECT nume, salariu, varsta FROM salariat WHERE salariu>1000 ORDER BY 2 DESC, 1 ASC; 12. Actualizarile realizate asupra tabelelor de baza ale unei vizualizari se reflecta totdeauna in vizualizare Adevrat Fals 13. Care este comanda corecta pentru a afisa numele, prenumele si varsta salariatilor, iar pentru cei care au varsta necunoscuta sa apara textul varsta necunoscuta? SE LECT nume, prenume, NVL(varsta, varsta necunoscuta) FROM salariat; SELECT nume, prenume, NVL(TO_CHAR(varsta), varsta necunoscuta) FROM salariat; SE LECT nume, prenume, NVL(CHAR(varsta), varsta necunoscuta) FROM salariat; SE LECT nume, prenume, NVL2(TO_CHAR(varsta), varsta necunoscuta) FROM salariat; 14. Care comanda afiseaza numarul de angajati din fiecare departament?

SE LECT cod_departament, COUNT(*) FROM salariat; SE LECT cod_departament, SUM(cod_ angajat) FROM salariat GROUP BY cod_departament; SELECT cod_ departament, COUNT(*) FROM salariat GROUP BY cod_departament; SE LECT cod_departament, COUNT() FROM salariat GROUP BY cod_departament; 15. Pentru a introduce in tabelul SALARIAT COD _ ANG NUME PRENUME DATA_ ANG VARSTA SALARIU not null numeric de 5 sircaractere de maxim 20 sir caractere de maxim 20 date, valoare implicita data curent numeric de 2 valoare implicita 0 numar de 10 cu 2 zecimale doua coloane: Cod_Funct si Email ce varianta folosim? ALTER TABLE SALARIAT ADD Cod_Funct NUMBER(2), ALTER COLUMN ADD Email char(25); ALTER TABLE SALARIAT ADD Cod_Funct NUMBER(2), ADD Email CHAR(25); ALTER TABLE SALARIAT ADD (Cod_Funct NUMBER(2) , Email CHAR(25)); ALTER TABLE SALARIAT ADD Cod_Funct NUMBER(2), ALTER ADD Email char(25); 16. Ce comanda creeaza tabelul SALARIAT_ 1 care s aiba aceeiasi structura cu tabelul SALARIAT COD _ANG NUME PRENUME DATA_ANG VARSTA EMAIL SALARIU not null numeric de 5 sir de caractere de maxim 20 sir caractere

de maxim 20 date, valoare implicita data curent numeric de 2 sir de caractere de dimensiune fixa, de 30 valoare implicita 0 numar de 10 cu 2 zecimale si sa contina salariatii care au salariu >100? CRE ATE TABLE SALARIAT_1 SE LECT * FROM SALARIAT WHERE SALARIU>100; CREATE TABLE SALARIAT_ 1 AS SELECT * FROM SALARIAT WHERE SALARIU>100; CRE ATE TABLE SALARIAT_1 AS SE LECT FROM SALARIAT WHERE SALARIU>100; CRE ATE TABLE SALARIAT_1 AS SE LECT COD_ANG, SALARIU FROM SALARIAT WHERE SALARIU>100; 17. Pentru a modifica dimensiunea coloanei prenume la 30 si pe cea a salariului la 12 cu 3 zecimale, din tabelul SALARIAT COD _ANG NUME PRENUME DATA_ANG VARSTA EMAIL SALARIU not null numeric de 5 sir de caractere de maxim 20 sir caractere de maxim 20 date, valoare implicita data curent numeric de

2 sir de caractere de dimensiune fixa, de 30 valoare implicita 0 numar de 10 cu 2 zecimale care varienta este corecta? ALTER TABLE SALARIAT MODIFY (prenume VARCHAR2(30) salariu NUMBER(12,3)); ALTER TABLE SALARIAT MODIFY (prenume VARCHAR2(30)), MODIFY(salariu NUMBE R(12,3)); ALTER TABLE SALARIAT MODIFY (prenume VARCHAR2(30) , salariu NUMBER(12,3)); ALTER TABLE SALARIAT ADD (prenume VARCHAR2(30), salariu NUMBER(12,3)); 18. Care este varianta corecta pentru a crea tabelul Salariat, cu caracteristicile de mai jos? COD _ANG NUME PRENUME DATA_ANG VARSTA EMAIL SALARIU not null numeric de 5 sir de caractere de maxim 20 sir caractere de maxim 20 date, valoare implicita data curent numeric de 2 sir de caractere de dimensiune fixa, de 30 valoare implicita 0 numar de

10 cu 2 zecimale CREATE TABLE SALARIAT ( cod_ ang NUMBER(5) NOT NULL, nume VARCHAR2(20), prenume VARCHAR2(20), data_ angajarii DATE DEFAULT SYSDATE, varsta NUMBER(2), email CHAR(50), salariu NUMBER(10,2) DEFAULT 0); CRE ATE TABLE SALARIAT ( cod_ ang NUMBER(5) nume VARCHAR2(20), prenume VARCHAR2(20), data_ angajarii DATE , varsta NUMBER(2), email CHAR(50), salariu NUMBER(10,2) DEFAULT 0); CRE ATE TABLE SALARIAT ( cod_ ang NUMBER(5) NOT NULL, nume VARCHAR2(20), prenume VARCHAR2(20), data_ angajarii DATE, DE FAULT SYSDATE , varsta NUMBER(2), email CHAR(50), salariu NUMBER(10,2), DE FAULT 0); 19. Care varianta este corecta pentru a redenumi tabelul SALARIAT cu numele SALARIATI? RENAME SAL ARIAT TO SALARIATI; RENAME SALARIAT WITH SALARIATI; RENAME TABLE SALARIAT TO TABLE SALARIATI; RENAME TABLE SALARIAT WITH TABLE SALARIATI; 20. Care ste comanda corecta care afiseaza codul departamentelor pentru care salariul minim depaseste 5000$? SELECT cod_departament FROM salariat WHERE MIN(salariu)>5000 GROUP BY cod_departament; SE LECT cod_departament FROM salariat GROUP BY cod_departament HAVING MIN(salariu)>5000; SE LECT cod_departament FROM salariat GROUP BY cod_departament MIN(salariu)>5000; ALTE SUBIECTE TIMISOARA Care este comanda corecta care afiseaza numele si salariul angajatilor condusi direct de Ionescu Mihai? SELECT nume, salariu FROM salariati WHERE cod_sef = (SELECT cod_angajat FROM salariati WHERE nume ='Ionescu' AND prenume ='Mihai' );

SELECT nume, salariu FROM salariati WHERE cod_sef = (SELECT cod_angajat FROM salariati WHERE nume ='Ionescu', prenume ='Mihai' ); SELECT nume, salariu FROM salariati WHERE cod_sef = Ionescu Mihai'; SELECT nume, salariu FROM salariati WHERE cod_sef != (SELECT cod_angajat FROM salariati WHERE nume ='Ionescu' AND prenume ='Mihai' ); Ce comanda sterge din tabelul SALARIAT COD _ANG NUME PRENUME DATA_ANG VARSTA EMAIL SALARIU not null numeric de 5 sir de caractere de maxim 20 sir caractere de maxim 20 date, valoare implicita data curent numeric de 2 sir de caractere de dimensiune fixa, de 30 valoare implicita 0 numar de 10 cu 2 zecimale coloana nume si coloana salariu? ALTER TABLE SALARIAT DROP nume, salariu; ALTER TABLE SALARIAT DROP COLUMN (nume, salariu); ALTER TABLE SALARIAT DROP (nume, salariu); ALTER TABLE SALARIAT DROP COLUMN nume, COLUMN salariu; Care este comanda corecta care afiseaza numele salariatilor care lucreaza in departamentul 3 si au salariul >100 sau care sunt din departamentul 5 si au salariul <200? SELECT nume FROM salariat WHERE (cod_deptartament=3 OR salariu>100) AND (cod_deptartament=5 OR salariu<200); SELECT nume FROM salariat WHERE (cod_deptartament=3 AND salariu>100) OR (cod_deptartament=5 AND salariu<200); SELECT nume FROM salariat WHERE (cod_deptartament=3 AND salariu>100) AND (cod_deptartament=5 AND salariu<200); SELECT nume FROM salariat WHERE (cod_deptartament=3 AND salariu>100) OR (cod_deptartament=5 OR salariu<200); Care dintre urmatoarele comenzi intoarce numarul zilei din luna carespunzator datei curente? SELECT TO_CHAR(SYSDATE,DDD) FROM dual; SELECT TO_CHAR(SYSDATE,DAY) FROM dual; SELECT TO_CHAR(SYSDATE,D) FROM dual; SELECT TO_CHAR(SYSDATE,DD)

FROM dual; Care este comanda corecta care afiseaza numele salariatilor si numele departamentelor in care lucreaza, inclusiv departamentele in care nu lucreaza salariati? SELECT nume_salariat, nume_departament FROM salariati s, departamente d WHERE s.cod_departament = d.cod_departament; SELECT nume_salariat, nume_departament FROM salariati s, departamente d WHERE s.cod_departament(+) = d.cod_departament; SELECT nume_salariat, nume_departament FROM salariati s, departamente d WHERE s.cod_departament = d.cod_departament(+); SELECT nume_salariat, nume_departament FROM salariati s, departamente d WHERE s.cod_departament(+) = d.cod_departament(+); Pentru a insera in tabelul SALARIAT inregistrari, COD _ANG NUME PRENUME DATA_ANG VARSTA EMAIL SALARIU not null numeric de 5 sir caractere de maxim 20 sir caractere de maxim 20 date, valoare implicita data curent numeric de 2 sir de caractere de dimensiune fixa, de 30 valoare implicita 0 numar de 10 cu 2 zecimale care varianta este incorecta? INSERT INTO SALARIAT(COD _ANG, NUME,PRENUME,DATA_ANG,VARSTA,EMAIL, SALARIU) VALUES(5, Ene, Ana, 1/06/2009, 20, INTERZIS PE FORUM CU ADRESE DE EMAIL.com, 2500.50) INSERT INTO SALARIAT(COD _ANG, NUME,PRENUME, VARSTA, EMAIL) VALUES(5, Ene, Ana, 20, INTERZIS PE FORUM CU ADRESE DE EMAIL.com) INSERT INTO SALARIAT(COD _ANG, NUME,PRENUME,VARSTA,EMAIL, SALARIU) VALUES(5, Ene, Ana, 1/06/2009, 20, INTERZIS PE FORUM CU ADRESE DE EMAIL.com) INSERT INTO SALARIAT VALUES(5, Ene, Ana, 1/06/2009, 20, INTERZIS PE FORUM CU ADRESE DE EMAIL.com, 2500.50) Ce comanda creeaza tabelul SALARIAT_1 care s aiba aceeiasi structura cu tabelul SALARIAT COD _ANG NUME PRENUME DATA_ANG VARSTA EMAIL SALARIU not null numeric de 5 sir de caractere de maxim 20 sir caractere de maxim 20 date, valoare implicita data curent numeric de 2 sir de caractere de dimensiune fixa, de 30 valoare implicita 0 numar de 10 cu 2 zecimale si sa contina salariatii care au salariu >100? CREATE TABLE SALARIAT_1 SELECT * FROM SALARIAT WHERE SALARIU>100; CREATE TABLE SALARIAT_1 AS SELECT * FROM SALARIAT WHERE SALARIU>100; CREATE TABLE SALARIAT_1 AS SELECT FROM SALARIAT WHERE SALARIU>100; CREATE TABLE SALARIAT_1 AS SELECT COD_ANG, SALARIU FROM SALARIAT WHERE SALARIU>100;

Care este comanda nu elimina simultan spatiile de la inceputul si sfarsitul coloanei nume? SELECT TRIM(nume) FROM salariat; SELECT RTRIM(LTRIM(nume)) FROM salariat; SELECT LTRIM(RTRIM(nume)) FROM salariat; SELECT LTRIM(nume) FROM salariat; 2. Care este comanda corecta care afiseaza toate functiile pe care nu lucreaza angazatii? A SELECT cod_functie FROM functii WHERE cod_functie IN (select cod_functie FROM salariati WHERE cod_functie IS NOT NULL) B SELECT cod_functie FROM functii WHERE cod_functie NOT IN (select cod_functie FROM salariati WHERE cod_functie IS NULL) C SELECT cod_functie FROM functii WHERE cod_functie NOT IN (select cod_functie FROM salariati) D SELECT cod_functie FROM functii WHERE cod_functie NOT IN (select cod_functie FROM salariati WHERE cod_functie IS NOT NULL) Raspuns D. ALTE TESTE 3-Care este comanda corecta care afiseaza numele cititorilor care au carti nerestituite? SELECT nume_ cititor FROM imprumuta WHERE data_ restituirii = NULL; SE LECT nume_cititor FROM imprumuta WHERE data_ restituirii IS NOT NULL; SELECT nume_ cititor FROM imprumuta WHERE data_ restituirii IS NULL; SE LECT nume_cititor FROM imprumuta WHERE data_ restituirii > SYSDATE; 6-Care comanda nu defineste corect un tabel? CREATE TABLE [schema.]nume_ tabel ( nume_coloana tip_de_date [DEFAULT expr], ...); CREATE TABLE nume_ tabel [(col1, col2...)] AS subcerere; CREATE TABLE [schema.]nume_ tabel ( nume_ coloana tip_de_date, [DEFAULT expr], [constrangere_de_coloana], ...); CREATE TABLE [schema.]nume_ tabel ( nume_coloana tip_de_date [DEFAULT expr] [constrangere_ de_coloana], ... ..[constrangere la nivel de tabel]) 8-Ce comanda creeaza corect tabelul SALARIAT, specificand constrangerile COD _ ANG NUME PRENUME DATA_ANG VARSTA EMAIL SALARIU

cheie primara numeric de 5 not null sir decaractere demaxim 20 sir caractere de maxim 20 date, valoare implicita data curent numeric de 2 unic sir de caractere de dimensiune fixa, de 30 > 0 numar de 10 cu 2 zecimale coloana nume si coloana salariu? CREATE TABLE salariat( cod_ ang NUMBER(5) PRIMARY KEY, nume VARCHAR2(20) NOT NULL, prenume VARCHAR2(20), data_ ang DATE DEFAULT SYSDATE, varsta NUMBER(2), email CHAR(30) UNIQUE, salariu NUMBER(10,2) CHECK (salariu > 0)); CREATE TABLE salariat( cod_ ang NUMBER(5) PRIMARY KE Y, nume VARCHAR2(20) NOT NULL, prenume VARCHAR2(20), data_ ang DATE DEFAULT SYSDATE , varsta NUMBER(2), email CHAR(30) UNIQUE , salariu NUMBER(10,2) > 0)); CREATE TABLE salariat( cod_ ang NUMBER(5) PRIMARY KE Y, nume VARCHAR2(20) NOT NULL, prenume VARCHAR2(20), data_ ang DATE DEFAULT SYSDATE , varsta NUMBER(2), email CHAR(30), salariu NUMBER(10,2) CHECK (salariu > 0)); 9-Care este comanda corecta care afiseaza numele si salariul angajatilor condusi direct de ENE DAN? SELECT nume, salariu FROM salariati WHERE cod_manager = (SELE CT cod_manager FROM salariati WHERE UPPER(nume) ='ENE ' , UPPER(pren) ='DAN' ); SE LECT nume, salariu FROM salariati WHERE cod_manager = (SELE CT cod_ang FROM salariati WHERE nume ='ENE' , pren ='DAN' ); SE LECT nume, salariu FROM salariati (SE LECT cod_ang FROM salariati WHERE UPPER(nume) ='ENE ' AND UPPER(pren) ='DAN' ); SELECT nume, salariu FROM salariati WHERE cod_manager = (SELECT cod_ ang FROM salariati WHERE UPPER(nume) ='ENE' AND UPPER(pren) ='DAN' ); 10. Care este comanda corecta care afiseaza numarul total al cartilor imprumutate in anul 2008? SELECT COUNT() FROM imprumuta WHERE TO_CHAR(data_ imprumutului,yyyy)=2008; SELECT COUNT(*) FROM imprumuta

WHERE TO_CHAR(data_ imprumutului,yyyy)=2008; SE LECT COUNT(*) FROM imprumuta WHERE data_ imprumutului=2008; SE LECT COUNT(*) FROM imprumuta WHERE TO_CHAR(data_ imprumutului,yy)=2008; 14-Care comanda listeaza numele tuturor angajatilor care au a treia litera din nume 'a'? SELECT nume FROM salariat WHERE nume LIKE '_ _a$'; SELECT nume FROM salariat WHERE nume LIKE '%a%'; SELECT nume FROM salariat WHERE nume LIKE '__ a%'; 15-Care este comanda corecta care afiseaza toate departamentele care platesc salariatilor sai o suma mai mare ca 20000? SELECT nume_ departament FROM departament WHERE 20000< (SE LECT sum(salariu) FROM salariat); SE LECT nume_departament FROM departament A WHERE 20000< (SE LECT sum(salariu) FROM salariat B where cod_ departament=cod_departament); SE LECT nume_departament FROM departament WHERE 20000< (SE LECT sum(salariu) FROM salariat where A.cod_ departament=B.cod_departament); SELECT nume_departament FROM departament A WHERE 20000< (SELECT sum(salariu) FROM salariat B where A.cod_departament=B.cod_departament); 18-Care este comanda corecta care afiseaza codul departamentelor, numele departamentelor si suma salariilor pentru fiecare departament? SELECT cod_ departament, nume_departament, SUM(salariu) FROM salariati s, departamente d GROUP BY cod_departament, nume_departament; SE LECT cod_departament, nume_ departament, SUM(salariu) FROM salariati s, departamente d WHERE s.cod_ departament=d.cod_departament GROUP BY cod_departament; SELECT cod_departament, nume_departament, SUM(salariu) FROM salariati s, departamente d WHERE s.cod_departament=d.cod_departament GROUP BY cod_departament, nume_departament; SE LECT cod_departament, nume_ departament, SUM(salariu) FROM salariati, departamente

WHERE s.cod_ departament=d.cod_departament GROUP BY cod_departament, nume_departament; 19-Care este comanda corecta care sa afiseze daca exista angajati care nu lucreaza in departamentul Contractari si al caror salariu coincide cu salariul unui angajat din departamentul Contractari? SELECT nume, salariu, cod_depart FROM salariati WHERE salariu IN (SELECT salariu FROM salariati s, department d WHERE s.cod_depart = d.cod_depart AND nume_depart <> Contractari) AND cod_depart= (SELECT cod_depart FROM department WHERE nume_depart = Contractari); SE LECT nume, salariu, cod_depart FROM salariati WHERE salariu IS IN (SELECT salariu FROM salariati s, department d WHERE s.cod_ depart = d.cod_ depart , nume_ depart = Contractari) AND cod_depart<> (SELECT cod_depart FROM department WHERE nume_depart = Contractari); SE LECT nume, salariu, cod_depart FROM salariati WHERE (salariu) IN (SELECT salariu FROM salariati s, department d WHERE s.cod_ depart = d.cod_ depart AND nume_depart = Contractari) AND cod_depart<> (SELECT cod_depart FROM department WHERE nume_depart = Contractari);

teste fotografii care nu se regasesc mai sus

1.Care este comanda corecta care afiseaza numarul total de carti dintr-o biblioteca pentru fiecare domeniu: SELECT cod_domeniu, COUNT(numar_exemplare) FROM biblioteca GROUP BY cod_domeniu; SELECT cod_domeniu, SUM(numar_exemplare) FROM biblioteca GROUP BY cod_domeniu; SELECT cod_domeniu, SUM(cod_carte) FROM biblioteca GROUP BY cod_domeniu; SELECT cod_domeniu, COUNT(*) FROM biblioteca GROUP BY cod_domeniu; 2.Pentru tabelul salariat cod_depart cod_ang# nume pren salariu cod_funct care este comanda corecta, pentru a modifica salariul la 3000, pentru angajatii care lucreaza in departamentul 10 si au salariul <3000? UPDATE salariat SET salariu=3000 WHERE cod_depart=10 AND salariu<3000; MODIFY salariat SET salariu=3000 WHERE cod_depart=10, salariu<3000; UPDATE salariat SET cod_depart=10 AND salariu<3000 WHERE salariu=3000; MODIFY salariat SET salariu=3000 WHERE cod_depart=10 AND salariu<3000; 3.Care este comanda corecta care listeaza numele ale functiilor care exista in departamentul

30, fara duplicate SELECT DISTINCT nume_functie FROM salariati s, functii f WHERE cod_functie=cod_functie AND cod_departament=30; SELECT DISTINCT nume_functie FROM salariati s, functii f WHERE s.cod_functie=f.cod_functie AND cod_departament=30; SELECT DISTINCT nume_functie FROM salariati, functii f WHERE s.cod_functie=f.cod_functie AND cod_departament=30; SELECT nume_functie FROM salariati s, functii f WHERE s.cod_functie=f.cod_functie AND cod_departament=30; 4.Care este comanda corecta care determina micsorarea salariilro cu 10%, cu rotunjire la 2 zecimale, a angajatilor care sunt titulari UPDATE salariat SET salariu=ROUND(salariu*0.9,2); UPDATE salariat SET salariu=ROUND(salariu*1,1) WHERE titular='N'; UPDATE salariat SET salariu=ROUND(salariu*0.9,2) WHERE titular='N'; UPDATE salariat SET salariu=ROUND(salariu*0.1,2) WHERE titular='Y'; 5.O constrangere de tip PRIMARY KEY poate fi declarata numai la nivel de coloana A/F 6.Efectele unei comenzi DDL pot fi anulate cu o comanda ROLLBACK A/F 7.Efectele unei comenzi DML pot fi anulate cu o comanda ROLLBACK A/F 8.Care este comanda corecta care se afiseaza numele si prenumele pentru toti angajatii cu varsta necunoscuta? SELECT nume, prenume FROM salariat WHERE varsta=NULL; SELECT nume, prenume FROM salariat WHERE varsta IS NULL; SELECT nume, prenume FROM salariat WHERE varsta=0; SELECT nume, prenume FROM salariat WHERE varsta IS NOT NULL; 9.Care este comanda corecta care determina micsorarea salariilro cu 10%, cu rotunjire la 2 zecimale, a angajatilor care NU sunt titulari

UPDATE salariat SET salariu=ROUND(salariu*0.9,2); UPDATE salariat SET salariu=ROUND(salariu*1,1) WHERE titular='N'; UPDATE salariat SET salariu=ROUND(salariu*0.9,2) WHERE titular="N"; UPDATE salariat SET salariu=ROUND(salariu*0.1,2) WHERE titular='Y'; 10.Pot fi eliminate mai multe coloane dintr-un tabel folosind o singura comanda ALTER TABLE ... DROP COLUMN A/F 11.Care este comanda corecta care afiseaza numele si data angajarii pentru salariatii care au fost angajati dupa angajatul avand codul 10, in ordine descrescatoare a numelui? SELECT nume, data_angajarii FROM salariat WHERE data_angajarii > (SELECT data_angajarii FROM salariat WHERE cod_angajat = 10); SELECT nume, data_angajarii FROM salariat WHERE data_angajarii > (SELECT data_angajarii FROM salariat WHERE cod_angajat = 10) ORDER BY nume; SELECT nume, data_angajarii FROM salariat WHERE data_angajarii > (SELECT data_angajarii FROM salariat WHERE cod_angajat = 10) ORDER BY nume DESC; SELECT nume, data_angajarii FROM salariat WHERE data_angajarii > (SELECT * FROM salariat WHERE cod_angajat = 10) ORDER BY nume DESC;

baze_de_date
Probleme pentru examenul de licenta 1.

2.

3.

4.

5.

O baza de date relationala este a. O colectie de date interrelationate gestionate ca o singura b. unitate c. Un produs software furnizat de un producator de baze de date d. O structura de date, cum ar fi un tabel, o vizualizare sau un index Definita unei baze de de este Un Obiect alin acelasi moddatetoti producatorii de software a. O colectie de inregistrari inrudite, stocate ca o singura unitate b. Un produs software furnizat de un producator de baze de date c. O structura, cum ar fi un tabel, o vizualizare sau un index d. O colectie de date interrelationate gestionate ca o singuraunitate Care din urmtoarele baze de date nu este un RDBMS (sistem de gestionare a bazelor de date relatioanale) a. Oracle Database b. MySQL c. Excel Database d. Microsoft SQL Server urmatorul Un sistem RDBMS(sistem de gestionare a bazelor de date relatioanale) nu include serviciu a. Acceptarea unui limbaj de interogare b. Mecanisme de securitate, pentru a impiedica accesul si modificarea neautorizata a datelor c. Mutarea datelor in si din fisiere de date, dupa cum este necesar d. Generarea diagramelor ERD (Entity Relationship Diagram) Componentele unei baze de date relationale nu includ a. Tabele
b. Diagrame c. ERD d. Restrictii

Relatii 6. Printre tipurile de restrictii care pot fi folosite in bazele de date relationale, nu se numara a. NOT NULL b. Relatii c. CHECK d. Cheie primara e. Unicitate 7. Normalizarea nu rezolva a. Anomalia de stergere b. Anomalia de actualizare c. Anomalia de inserare d. Anomalia de creare 8. Un identificator unic (cheie primara) a. Poate fi compus numai dintr-un singur atribut

b. Poate fi compus din atribute concatenate c. Poate fi compus din atribute cu valoarea NULL d. Poate fi compus din zero, unul sau mai multe atribute 9.

10.

11.

12.

13.

Prima forma normala rezolva anomaliile cauzate de Grupurile repetitive si atributele multivaloare Dependentele partiale de cheia primara Dependentele tranzitive Relatiile de tip unu-la-mai-multi A doua forma normala rezolva anomaliile cauzate de a. Grupurile repetitive b. Dependentele partiale de cheia primara c. Grupurile repetitive si atributele multi valoare d. Dependentele tranzitive A treia forma normala rezolva anomaliile cauzate de a. Dependentele partiale de cheia primara b. Grupurile repetitive c. Dependentele tranzitive d. Atributele multivaloare Problemele de dependen tranzitiv a. Sunt rezolvate de a doua form normal b. Sunt rezolvate de prima form normal c. Apar atunci cnd un atribut non-cheie depinde doar de o parte a cheii primare d. Sunt rezolvate de a treia form normal SQL este
a. b. c. d. a. b. c. d. Un limbaj procedural Un limbaj neprocedural

Un limbaj orientat spre obiecte Un limbaj grafic, folosit pentru definirea diagramelor ER si a diagramelor conceptuale 14. Un model de date reprezinta o colectie integrata de concepte care nu descriu a. date b. relatii dintre date
c. date despre echipa realizatoare a modelului d. constrngeri existente asupra datelor sistemului real analizat. 15. Nu este caracteristica a modelului relational a. prezenta tuplurilor identice b. articolele unui domeniu sunt omogene c. toate valorile unui domeniu corespunzatoare tuturor cazurilor nu mai pot fi

descompuse in alte valori (sunt atomice)


d. fiecare coloana defineste un domeniu distinct si nu se poate repeta in cadrul

aceleiasi relatii 16. Modelul relational nu are ca regula de integritate structurala a. Unicitatea cheii. Cheia primara trebuie sa fie unica si minimala. b. Integritatea entitatii. Atributele cheii primare trebuie sa fie diferite de valoarea null.

c. Integritatea referirii. O cheie externa trebuie sa corespunda unei valori a

cheii
d. primare asociate. Integritatea referirii. O cheie externa trebuie sa fie ori null in intregime, ori sa

corespunda unei valori a cheii primare asociate. 17. Relatia m:n devine in modelul relational a. tabel asociativ cu cheia primara formata numai din doua chei externe pentru cele doua tabele asociate b. tabel asociativ cu cheia primara formata din doua chei externe pentru cele doua tabele asociate plus eventuale coloane aditionale
c. chei externe d. entitate independenta 18. Care nu este un concept utilizat

pentru a descrie formal - uzual - fizic

elementele d

baza ale organizarii tabloua. relatie -datelor fisier b. tuplu - linie- inregistrare
c. atribut - coloana - camp d. domeniu - zona- functie 19. Instructiunile SQL nu fac parte din categoria a. Limbajul de interogare a datelor (DQL) b. Limbajul de definire a datelor (DDL - Data Definition Language) c. Limbajul de selectare a datelor (DSL - Data Selection Language) d. Limbajul de manipulare a datelor (DML - Data Manipulation Language) 20. Limbajul de definire a datelor (DDL - Data Definition Language) nu include urmatoarea instructiune a. DELETE b. CREATE c. ALTER d. DROP 21. Limbajul de manipulare a datelor (DML Data Manipulation Language) nu include instructiuniea a. INSERT b. UPDATE c. DELETE d. ALTER 22. Tipurile de date temporale standard nu includ a. DATE b. DATETIME c. TIME d. TIMESTAMP 23. Valorile NULL a. Sunt egale cu alte valori NULL b. Este acelasi lucru ca si spatiile libere c. Sunt intotdeauna permise in mod prestabilit d. Pot fi folosite pentru reprezentarea datelor care lipsesc sau nu sunt

cunoscute 24. Definitia unei coloane din instructiunea CREATE TABLE nu poate include a. Numele tabelului b. O clauza DEFAULT c. O clauza NULL sau NOT NULL

d. Numele coloanei 25.

26.

27.

28.

29.

Sintaxa corecta pentru o restrictie NOT NULL este nume_coloana REFERENCES NOT NULL nume_coloana tip_de_DATA IS NOT NULL nume_coloan tip_de_DATA NOT NULL DEFAULT [NULL | NOT NULL] a Sintaxa corecta pentru o restrictie UNIQUE este a. [CONSTRAINT nume_restrictie] UNIQUE {nume_coloana[,nume b. coloana...]) c. [CONSTRAINT nume_restrictie] UNIQUE (nume_tabel) d. nume_coloana REFERENCES UNIQUE nume_tabel DEFAULT pentru o (nume_coloana) Sintaxa corecta UNIQUErestrictie referentiala asupra unei coloane este a. CONSTRAINT nume_restrictie] REFERENCES nume_tabel b. nume_coloana REFERENCES nume_tabel c. FOREIGN KEY nume_coloana REFERENCES nume_tabel (nume_coloana) d. REFERENCES nume_tabel (nume_coloana) Utilizarile valide ale instructiunii ALTER TABLE nu include a. Adaugarea coloanelor b. Eliminarea unei chei primare c. Redenumirea unui tabel d. Adaugarea unei restrictii Nu este functie SQL standard pentru siruri de caractere a. UPPER
a. b. c. d. b. LENGTH sau LEN c. LOWER d. LIKE

30. Operatorul UNION a. Include randurile duplicate in setul de rezultate b. Combina seturile de rezultate a doua interogari intr-un singur set de

rezultate si elimina randurile duplicate din setul de rezultate c. Combina doua interogari intr-o singura interogare de tip join d. Este numit JOIN in unele implementari SQL 31. O instructiune SQL care contine o functie de agregare a. Nu poate include, in acelasi timp, o clauza GROUP BY si o clauza ORDER BY b. Trebuie sa includa o clauza GROUP BY c. Trebuie sa includa o clauza ORDER BY d. Poate contine si coloane obisnuite si coloane calculate
32. Care este varianta corecta pentru a crea tabelul Salariat, cu caracteristicile de mai jos?
COD _ANG NUME PRENUME DATA_ANG VARST A EMAIL SALARIU

sir sir caractere not null caractere de de maxim 20 numeric de 5 maxim 20

date, numeric valoare de 2 implicita data curent

valoare sir deimplicita caractere de0 de dimensiunenumar de dimensiune 10 fixa, de 30 cu 2 zecimale

a. CREATE TABLE SALARIAT ( cod_ang NUMBER(5) NOT NULL, nume VARCHAR2(20), prenume VARCHAR2(20), data_angajarii DATE DEFAULT SYSDATE, varsta NUMBER(2), email CHAR(50), salariu NUMBER(10,2) DEFAULT 0); b. CREATE TABLE SALARIAT ( cod_ang NUMBER(5) nume VARCHAR2(20), prenume VARCHAR2(20), data_angajarii DATE , varsta NUMBER(2), email CHAR(50), salariu NUMBER(10,2) DEFAULT 0); c. CREATE TABLE SALARIAT ( cod_ang NUMBER(5) , NOT NULL, nume VARCHAR2(20), prenume VARCHAR2(20), data_angajarii DATE , DEFAULT SYSDATE, varsta NUMBER(2), email CHAR(50), salariu NUMBER(10,2) , DEFAULT 0); 33. Pentru a insera in tabelul SALARIAT inregistrari
COD _ANG NUME PRENUME DATA_AN G VARSTA EMAIL SALARIU valoare implicita 0 numar de 10 cu 2 zecimale

not null
numeric de 5

sir sir caractere caractere de de maxim 20 maxim 20

sir de date, caractere numeric de 2 de valoare implicita data dimensiune curent fixa, de 30

care varianta este incorecta? a. INSERT INTO SALARIAT(COD _ANG, NUME, PRENUME, DATA_ANG, VARSTA, EMAIL, SALARIU) VALUES(5, Ene, Ana, 1/06/2009, 20, ea@gmail.com, 2500.50) b. INSERT INTO SALARIAT(COD _ANG, NUME, PRENUME, VARSTA, EMAIL) VALUES(5, Ene, Ana, 20, ea@gmail.com) c. INSERT INTO SALARIAT(COD _ANG, NUME,PRENUME,VARSTA,EMAIL, SALARIU) VALUES(5, Ene, Ana, 1/06/2009, 20, ea@gmail.com) d. INSERT INTO SALARIAT VALUES(5, Ene, Ana, 1/06/2009, 20, ea@gmail.com, 2500.50) 34. Care este varianta corecta pentru a crea tabelul CARTE, cu caracteristicile de mai jos, indicand cheile la nive de coloana? (Tabelele DOMENIU_CARTE si CARTE sunt in relatia 1:M)

CARTE(codc CHAR(5), titlu VARCHAR2(30), autor VARCHAR2(30), pret NUMBER(8,2), nrex NUMBER(3), coddom CHAR(5))
a.

CREATE TABLE

CARTE

(codc CHAR(5) PRIMARY KEY, titlu VARCHAR2(30), autor VARCHAR2(30), pret NUMBER(8,2), nrex NUMBER(3), coddom CHAR(5) NOT NULL) b. CREATE TABLE CARTE (codc CHAR(5) PRIMARY KEY, titlu VARCHAR2(30), autor VARCHAR2(30), pret NUMBER(8,2), nrex NUMBER(3), coddom CHAR(5) NOT NULL REFERENCES DOMENIU(coddom)); c. CREATE TABLE CARTE (codc CHAR(5) , titlu VARCHAR2(30), autor VARCHAR2(30), pret NUMBER(8,2), nrex NUMBER(3), coddom CHAR(5) NOT NULL PRIMARY KEY (codc), FOREIGN KEY (coddom) REFERENCES DOMENIU (coddom));
35. Care este varianta corecta pentru a crea tabelul CARTE, cu caracteristicile de mai jos(codc cheie primara coddom cheie secundara), indicand cheile la nivel de tabel?

CARTE(codc CHAR(5) , titlu VARCHAR2(30), autor VARCHAR2(30), pret NUMBER(8,2), nrex NUMBER(3), coddom CHAR(5))
a.

CREATE TABLE CARTE (codc CHAR(5) PRIMARY KEY, titlu VARCHAR2(30), autor VARCHAR2(30), pret NUMBER(8,2), nrex NUMBER(3), coddom CHAR(5) NOT NULL) b. CREATE TABLE CARTE (codc CHAR(5) PRIMARY KEY, titlu VARCHAR2(30), autor VARCHAR2(30), pret NUMBER(8,2), nrex NUMBER(3),

coddom CHAR(5) NOT NULL REFERENCES DOMENIU(coddom)); c. CREATE TABLE CARTE (codc CHAR(5), titlu VARCHAR2(30), auto VARCHAR2(30), r NUMBER(8,2), pret NUMBER(3), nrex coddom CHAR(5) NOT NULL, PRIMARY KEY (codc), FOREIGN KEY (coddom) REFERENCES DOMENIU 36. Sa se creeze tabelul asociativ imprumuta, a carui structura este data mai jos(codc, codcit si dataim sunt chei primare). Sa se precizeze legatura cu tabelele carte si cititor, aflate in relatia M:M (mai multi la mai multi) a. IMPRUMUTA ( codc CHAR(5), codcit CHAR(5), dataim DATE DEFAULT datare SYSDATE, s DATE, PRIMARY KEY dataef DATE, (codel, codec, dataim), FOREIGN KEY (codc) REFERENCES CARTE (codc), FOREIGN KEY (codcit) REFERENCES CITITOR(codcit)); b. IMPRUMUTA ( codc CHAR(5) PRIMARY KEY, codcit CHAR(5) PRIMARY KEY, dataim DATE DEFAULT SYSDATE PRIMARY KEY, datares DATE, dataef DATE, FOREIGN KEY (codc) REFERENCES CARTE (codc), FOREIGN KEY (codcit) REFERENCES CITITOR(codcit)); c. IMPRUMUTA ( codc CHAR(5) REFERENCES CARTE (codc), codcit CHAR(5) REFERENCES CITITOR(codcit), dataim DATE DEFAULT SYSDATE, datares DATE, dataef DATE, PRIMARY KEY (codel, codec, dataim)); 37. Sa se creeze tabelul CARTE_INFO(codc, titlu, autor) prin copiere din tabelu

CARTE(codc CHAR(5) , titlu VARCHAR2(30), autor VARCHAR2(30), pret NUMBER(8,2), nrex NUMBER(3), coddom CHAR(5)) selectand cartile care au coddom=I a. CREATE TABLE CARTEINFO (codc CHAR(5), titlu VARCHAR2(30), autor VARCHAR2(30), FROM CARTE PRIMARY KEY (codc), FOREIGN KEY (coddom) REFERENCES DOMENIU (coddom));
b.

c.

CREATE TABLE CARTE_INFO (codc CHAR(5) PRIMARY KEY, titlu VARCHAR2(30), autor VARCHAR2(30), FROM CARTE WHERE coddom = I; CREATE TABLE CARTE_INFO AS SELECT codc, titlu, autor FROM CARTE WHERE coddom = I;
COD _ANG NUME PRENUME DATA_AN G VARSTA SALARIU

38.

Pentru a introduce in tabelul SALARIAT


valoare implicita date, 0 valoare numeric de 2 numar de implicita data 10 cu 2 curent zecimale

not null

sircaractere sir caractere numeric de 5 de maxim 20 de maxim 20

doua coloane: Cod_Funct si Email ce varianta

folosim?

a. ALTER TABLE SALARIAT ADD Cod_Funct NUMBER(2), ALTER COLUMN ADD Email char(25); b. ALTER TABLE SALARIAT ADD Cod_Funct NUMBER(2), ADD Email CHAR(25); c. ALTER TABLE SALARIAT ADD (Cod_Funct NUMBER(2) , Email CHAR(25)); d. ALTER TABLE SALARIAT ADD Cod_Funct NUMBER(2), ALTER ADD Email char(25); 39. Ce comanda creeaza tabelul SALARIAT_1 care s aiba aceeiasi structura c tabelul SALARIAT
COD _ANG NUME PRENUME DATA_AN VARST G A date, numeric valoare de 2 implicita data curent EMAIL SALARIU valoare sir de caractere implicita de 0 dimensiune numar de fixa, de 30

sir de sir caractere caractere de de maxim 20 numeric de 5 maxim 20

not null

10 cu 2 zecimale

si sa contina salariatii care au salariu >100?


a. CREATE TABLE SALARIAT_1 SELECT * FROM SALARIAT WHERE SALARIU>100; b. CREATE TABLE SALARIAT_1 AS SELECT * FROM SALARIAT WHERE SALARIU>100; c. CREATE TABLE SALARIAT_1 AS SELECT FROM SALARIAT WHERE SALARIU>100; d. CREATE TABLE SALARIAT_1 AS SELECT COD_ANG, SALARIU FROM SALARIAT WHERE SALARIU>100; 40. Ce comanda sterge din tabelul SALARIAT COD DATA_AN
_ANG NUME PRENUME G VARSTA EMAIL SALARIU valoare implicita 0 numar de 10 cu 2 zecimale sir de caractere de dimensiune fixa, de 30

sir de sir caractere caractere de de maxim 20 numeric de 5 maxim 20

not null

date, valoare numeric implicita de data curent 2

coloana nume si coloana salariu?


a. ALTER TABLE SALARIAT DROP nume, salariu; b. ALTER TABLE SALARIAT DROP COLUMN (nume, salariu); c. ALTER TABLE SALARIAT DROP (nume, d. salariu); ALTER TABLE SALARIAT 41. Ce DROP COLUMN corect tabelul SALARIAT, specificand constrangerile? comanda creeaza nume, COLUMN salariu;
COD _ANG NUME PRENUME DATA_AN G VARSTA EMAIL SALARIU unic sir de date, valoare caractere implicita data numeric de 2 de dimensiun curent e fixa, de 30

not null cheie sir caractere sir de primara caractere de de maxim 20 numeric de 5 maxim 20

> 0 numar de 10 cu 2 zecimale

a. CREATE TABLE salariat( cod_ang NUMBER(5) PRIMARY KEY, nume VARCHAR2(20) NOT NULL, prenume VARCHAR2(20), data_ang DATE DEFAULT SYSDATE, varsta NUMBER(2), email CHAR(30) UNIQUE, salariu NUMBER(10,2) CHECK (salariu > 0));

CREATE TABLE salariat( cod_ang NUMBER(5) PRIMARY KEY, nume VARCHAR2(20) NOT NULL, prenume VARCHAR2(20), data_ang DATE DEFAULT SYSDATE, varsta NUMBER(2), email CHAR(30) UNIQUE, salariu NUMBER(10,2) > 0)); c. CREATE TABLE salariat( cod_ang NUMBER(5) PRIMARY KEY, nume VARCHAR2(20) NOT NULL, prenume VARCHAR2(20), data_ang DATE DEFAULT SYSDATE, varsta NUMBER(2), email CHAR(30), salariu NUMBER(10,2) CHECK (salariu > 0)); 42. Care este comanda corecta prin care se adauga constrangerea de cheie primara tabelului IMPRUMUTA (cod_cititor, cod_carte, data_imprumut, data_restituire)? a. ALTER TABLE IMPRUMUTA ADD PRIMARY KEY cod_cititor, PRIMARY KEY cod_carte, PRIMARY KEY data_imprumut; b. ALTER TABLE IMPRUMUTA ADD PRIMARY KEY cod_cititor, cod_carte, data_imprumut; c. ALTER TABLE IMPRUMUTA ADD CONSTRAINT cp PRIMARY KEY (cod_cititor, cod_carte, d. data_imprumut); ALTER TABLE IMPRUMUTA ADD PRIMARY 43. Pentru tabelul Salariat KEY (cod_cititor, cod_carte, data_imprumut); cod_depart cod_ang# nume pren salariu cod_funct care este comanda corecta, pentru a modifica salariu la 3000, pentru angajatii care lucreaza in departamentu 10 si au salariul<3000? a. UPDATE salariat SET salariu=3000 WHERE cod_depart=10 AND salariu<3000; b. MODIFY salariat SET salariu=3000 WHERE cod_depart=10 , salariu<3000; c. UPDATE salariat SET cod_depart=10 AND salariu<3000 d. WHERE salariu=3000; MODIFY salariat SET salariu=3000 WHERE cod_depart=10 AND salariu<3000; 44. S se insereze n tabelul CARTE toate crile din tabelul CARTE_INFO, presupunnd c tabelul

b.

CARTE_INFO a fost deja creat. a. CREATE TABLE CARTE AS SELECT codc, titlu, autor FROM CARTE_INFO; b. INSERT INTO CARTE SELECT FROM CARTE_INFO; c. CREATE TABLE CARTE

AS SELECT * FROM CARTE_INFO; d. INSERT INTO * CARTE SELECt T FROM CARTE_INFO; 45. Pentru profesorii titulari, sa se maresca cumulul cu 10% si sa se rotunjeasca la 2 zecimale. UPDATE PROF SET CUMUL = ROUND([CUMUL]*1.1,2) WHERE TITULAR="Y"; a. UPDATE PROF SET CUMUL = (CUMUL*1.1) WHERE TITULAR=Y; b. MODIFY PROF SET CUMUL = ROUND(CUMUL*1.1,2) WHERE TITULAR=Y; c. UPDATE PROF SET CUMUL = ROUND(CUMUL*1.1,2 WHERE TITULAR=Y; d. UPDATE PROF SET CUMUL = ROUND(CUMUL*1.1,2); 46. S se modifice pretul cartilor din biblioteca, care se gasesc intr-un numar de exemplare mai mic decat media numarului de exemplare pe biblioteca. Noua valoare a pretului sa fie egala c suma preturilor CARTE a. UPDATE cartilor scrise de BARBU. SET pret = SUM(pret) (SELECT CARTE FROM autor = BARBU) WHERE nrexWHERE < (SELECT AVG(nrex) FROM CARTE); b. MODIFY CARTE SET pret = (SELECT SUM(pret) FROM carte WHERE autor = BARBU) WHERE nrex < (SELECT AVG(nrex) FROM CARTE); c. UPDATE CARTE pret = ( SUM(pret) FROM carte WHERE autor = BARBU) WHERE nrex < ( AVG(nrex) FROM CARTE); d. UPDATE CARTE pret = (SELECT SUM(pret) FROM carte WHERE autor = BARBU and nrex < ( AVG(nrex) FROM CARTE);
47. Pentru tabelele: PROF cod_prof# cod_fac TOTALURI

nume pren

salariu

cod_fuct

cod_fac#

nr_prof

total_sal

care este secventa corecta pentru o instructiune INSERT cu o instructiune SELECT interna, pentru a insera in tabelul TOTALURI, un rand pentru fiecare facultate din tabelul PROF, care sa contina numarul de profesori din facultate si suma salariilor lor? a. INSERT TO TOTALURI SELECT COD_FAC, COUNT(*) , SUM(SALARIU) FROM PROF ORDER BY COD_FAC; b. INSERT INTO TOTALURI SELECT COD_FAC, COUNT(*) AS NR_PROF, SUM(SALARIU) AS TOTAL_SAL FROM PROF ; c. INSERT INTO TOTALURI SELECT COD_FAC, COUNT(*) AS NR_PROF, SUM(SALARIU) AS TOTAL_SAL FROM PROF GROUP BY COD_FAC; 48. Pentru tabelul PROF cod_prof# cod_fac pren salariu care este secventa corecta pentru a modifica salariile cu 10% , care nu contin valori NULL? a. UPDATE PROF SET SALARIU = SALARIU*1.1 WHERE SALARIU NOT NULL; b. UPDATE PROF SET SALARIU = SALARIU*1.1 WHERE SALARIU IS NOT NULL; c. UPDATE PROF SElLECT SALARIU = SALARIU*1.1 WHERE SALARIU <>0; 49. Pentru tabelul PROF cod_prof# cod_fac nume pren salariu cod_funct care este secventa corecta pentru a sterge toate cadrele didactice care sunt profesori consultanti? a. DELETE FROM PROF WHERE b. COD_FUNCT=C; c. DELETE PROF WHERE COD_FUNCT<>C; d. DROP FROM PROF WHERE COD_FUNCT=C; DROP PROF WHERE COD_FUNCT=C; 50. Pentru tabelul: FAC cod_fac# denumire adresa care este secventa corecta pentru o inserare, folosind instructiunea SELECT a. INSERT INTO FAC (COD_FAC, DENUMIRE, ADRESA) SELECT VALUES(MAX(COD_FAC)+1, 'LIMBI', 'ION GHICA') b. INSERT INTO FAC SELECT MAX(COD_FAC)+1, 'LIMBI', 'ION GHICA' FROM FAC; c. INSERT INTO FAC (COD_FAC, DENUMIRE, ADRESA) SELECT MAX(COD_FAC)+1, 'LIMBI', 'ION GHICA' FROM FAC; 51. Pentru tabelul PROF

cod_prof#

cod_fac

nume

pren

salariu

care este secventa corecta pentru a afisa toti profesorii impreuna cu media _ salariu pentru fiecare facultate , rotunjita la doua pozitii zecimale
a. SELECT COD_FAC, ROUND (AVG (SALARIU), 2) AS medie_salariu FROM PROF ORDER BY COD_FAC; b. SELECT COD_FAC, ROUND (AVG (SALARIU, 2) AS medie_salariu FROM PROF GROUP BY COD_FAC; c. SELECT COD_FAC, ROUND (AVG (SALARIU), 2) AS medie_salariu FROM PROF GROUP BY COD_FAC; d. SELECT FROM PROF COD_FAC, ROUND AVG (SALARIU), 2 AS medie_salariu GROUP BY COD_FAC; 52. Pentru

tabelul
cod_prof# cod_fac nume pren salariu

care este secventa corecta pentru a afisa suma salariilor tuturor profesorilor din universitate.
a. SELECT SUM (Salariu) AS Total_Salariu FROM PROF; b. SELECT SUM (Salariu) AS Total_Salariu FROM PROF GROUP BY COD_FAC; c. SELECT SALARIU, SUM (Salariu) AS Total_Salariu FROM PROF; d. SELECT COD_FAC, SUM (Salariu) AS Total_Salariu 53. PentruFROM PROF;

tabelul
cod_prof# cod_fac nume pren salariu

care este secventa corecta pentru a afisa toti profesorii pentru care COD_FAC =1 si salariu>=1200, sau toti profesorii pentru care COD_FAC =3 si salariu < 2000.
a. SELECT COD_FAC, COD_PROF, NUME, SALARIU FROM PROF WHERE (COD_FAC=1 OR SALARIU >1200) AND (COD_FAC =3 OR SALARIU<2000); b. SELECT COD_FAC, COD_PROF, NUME,SALARIU FROM PROF WHERE (COD_FAC=1 AND SALARIU >1200) AND (COD_FAC =3 AND SALARIU<2000);

c. SELECT COD_FAC, COD_PROF, NUME, SALARIU FROM PROF WHERE (COD_FAC=1 AND SALARIU >1200) OR (COD_FAC =3 AND SALARIU<2000); d. SELECT COD_FAC, COD_PROF, NUME,SALARIU FROM PROF WHERE COD_FAC=1 OR SALARIU >1200 OR (COD_FAC =3 OR SALARIU<2000); 54.

Pentru tabelul
PROF cod_prof# cod_fac nume pren salariu

care secventa este corecta pentru a afisa citi profesori nu au o valoare introdusa pe coloana salariu?
a. SELECT COUNT(salariu) FROM PROF WHERE SALARIU =0; b. SELECT COUNT(*) FROM PROF WHERE SALARIU =NULL; c. SELECT COUNT(*) FROM PROF WHERE SALARIU IS NOT NULL; d. SELECT COUNT(*) FROM PROF WHERE SALARIU IS NULL; 55. O uniune (join) fara o clauz WHERE sau o clauza JOIN a. Nu returneaza nici un rand din setul de rezultate b. Reprezinta o uniune interna (inner join) c. Are ca rezultat un produs cartezian d. Reprezinta o uniune externa(outer join) 56. O uniune externa (outer join) nu a. Poate fi scrisa in Oracle SQL folosind un simbol (+) in clauza b. FROM c. Poate fi scrisa in Oracle SQL folosind un simbol (+) in clauza WHERE d. Returneaza toate randurile din unul sau din ambele tabele Poate fi catre 57. Pentru tabelele: stanga, catre dreapta sau completa PROF cod_prof# cod_fac nume pren salariu FAC cod_fac#

denumire

adresa

care este secventa corecta pentru o interogare de uniune interna(inner join) care sa afiseze toti profesorii si denumirile facultatilor la care predau, in ordinea crescatoare a denumirilor a. SELECT NUME, PREN, DENUMIRE FROM FAC, PROF WHERE A.COD_FAC =B.COD_FAC ORDER BY FAC.DENUMIRE;

SELECT NUME, PREN, DENUMIRE FROM FAC, PROF WHERE FAC.COD_FAC=PROF.COD_FAC ORDER BY FAC.DENUMIRE; c. SELECT NUME, PREN, DENUMIRE FROM FAC, PROF WHERE FAC.COD_FAC=PROF.COD_FAC; 58. a. SELECT codc S se obtinapentru fiecare carte, codul sau i numarul de exemplare care nu au fost inca restituite.

b.

FROM IMPRUMUTA WHERE dataef IS NULL GROUP BY codc; b. SELECT COUNT(*) FROM IMPRUMUTA GROUP BY codc; c. SELECT codc, COUNT(*) FROM IMPRUMUTA WHERE BY IS GROUP dataef codc; d. SELECT COUNT(*) FROM IMPRUMUTA WHERE BY GROUP dataef =0 codc; afieze numrul crilor mprumutate cel puin de 59. Care este secventa corecta care s dou ori (pentru fiecare carte mprumutat mai mult dect o dat s se obin numrul de cte o a fost mprumutat). a. SELECT COUNT(COUNT(codel)) FROM imprumuta GROUP BY codcarte b. HAVING COUNT(*)>1; SELECT COUNT(codel) FROM imprumuta GROUP BY codcarte HAVING COUNT(*)>1; c. SELECT COUNT(COUNT(codel)) FROM imprumuta WHERE COUNT(*)>1; d. SELECT COUNT(codel) FROM imprumuta ORDERBY BY codcarte HAVING COUNT(*)>1; 60. Care este secventa corecta care afiseaza pentru fiecare domeniu de carte, numrul crilor din domeniu, media preurilor i numrul total de exemplare
a. SELECT codcarte, COUNT(*), AVG(pret)

FROM

CARTE

GROUP BY codcarte; AVG(pret), SUM(nrex) FROM CARTE GROUP BY codcarte; c. SELECT codcarte, COUNT(*), AVG(pret), SUM(nrex) FROM CARTE GROUP BY codcarte; d. SELECT COUNT(*), AVG(pret), SUM(nrex) FROM CARTE ORDER BY codcarte;
b. SELECT coded, 61. Pentru tabelele: PROF cod_prof#

cod_fac

nume

pren

salariu

FAC cod_fac# denumire adresa care este secventa corecta pentru o interogare de uniune externa catre stanga, care sa afiseze toti profesorii si denumirile facultatilor la care predau a. SELECT NUME, PREN, DENUMIRE FROM FAC PROF LEFT OUTER JOIN ON A.COD_FAC = B.COD_FAC; b. SELECT NUME, PREN, DENUMIRE FROM FAC LEFT OUTER JOIN PROF ON A.COD_FAC = B.COD_FAC; c. SELECT NUME, PREN, DENUMIRE FROM FAC A LEFT OUTER JOIN PROF B ON A.COD_FAC = B.COD_FAC; 62. Pentru tabelele: PROF cod_prof# cod_fac nume pren salariu cod_funct FUNCTII cod_funct# nume_funct care este secventa corecta pentru o subinterogare necorelata, care sa afiseze toate functiile pentru care nu exista profesorii incadrati a. SELECT cod_funct, nume_funct FROM functii WHERE cod_funct NOT IN (SELECT DISTINCT cod_funct FROM b. prof); SELECT cod_funct, nume_funct FROM functii WHERE cod_funct NOT IN FROM prof; c. SELECT DISTINCT cod_funct SELECT cod_funct, nume_funct FROM functii WHERE cod_funct IN (SELECT cod_funct FROM fiecare 63. Care este comanda corecta care pentruprof); facultate, se insereaza in tabelul TOTALURI(cod_fac, nr_prof, total_sal_fac) numarul de profesori si suma salariilor pe care facultatea o plateste profesorilor sai? a. INSERT TO TOTALURI

SELECT COD_FAC, COUNT(*) , SUM(SALARIU) FROM PROF ORDER BY COD_FAC; b. INSERT INTO TOTALURI SELECT COD_FAC, COUNT(*) , SUM(SALARIU) FROM PROF ; c. INSERT INTO TOTALURI SELECT COD_FAC, COUNT(*) , SUM(SALARIU) FROM PROF GROUP BY COD_FAC; d. INSERT INTO TOTALURI SELECT COD_FAC, SUM(COD_PROF), SUM(SALARIU) FROM PROF GROUP BY COD_FAC; 64.

S se obin titlurile i preurile crilor mai scumpe dect cartea avnd titlul Baze de date, al crui autor este Popescu (self join).
a.

SELECT x.titlu, x.pret FROM carte x, y WHERE x.pret < y.pret AND y.titlu = Baze de date AND y.autor = Popescu; b. SELEC x.titlu, x.pret T carte x, carte y FROM x.pret > y.pret y.titlu = Baze de date WHERE AND y.autor = Popescu; c. AND x.titlu, x.pret SELECT carte x, carte y FROM x.pret > y.pret WHERE titlu = Baze de date AND autor = Popescu; d. AND x.titlu, x.pret SELECT carte x, carte y FROM x.pret > y.pret WHERE y.titlu = Baze de date, y.autor = Popescu; 65. PentruAND tabelele PROFESORI(codp, nume, pren, salariu) COPII (codp, nume_c, virsta) care este secventa corecta pentru a afisa profesorii cu copii a. SELECT a.nume, a.pren FROM PROFESORI A WHERE a.codp IN (SELECT DISTINCT codp b. FROM COPII); SELECT a.nume, a.pren FROM PROFESORI A WHERE codp IN (SELECT codp FROM COPII);

c. SELECT a.nume, a.pren

FROM PROFESORI A WHERE a.codp IN COPII; d. SELECT a.nume, a.pren FROM PROFESORI A WHERE a.codp IN DISTINCT codp FROM COPII; 66. Pentru tabelele PROFESORI(codp, nume, pren, salariu) COPII (codp, nume_c, virsta) care este secventa corecta pentru a afisa profesorii fara copii a. SELECT a.nume, a.pren FROM PROFESORI A WHERE codp NOT IN (SELECT codp FROM COPII); b. SELECT a.nume, a.pren FROM PROFESORI A WHERE a.codp NOT IN (SELECT DISTINCT codp FROM c. COPII); SELECT a.nume, a.pren FROM PROFESORI A d. WHERE a.codp NOT IN SELECT codp FROM copii; SELECT a.nume, a.pren FROM PROFESORI A WHERE pentru IS NOT firme, DISTINCT tabele 67. Se considera a.codp actionarii unei(SELECT urmatoarele codpFROM COPII ACTIONARI(nume varchar2(20), cod_act number(5)) ACTIUNI (cod_act number(5), seriain number(8), seriasf number(8), valoar number(8)) (unde seriain si seriasf reprezinta seria de inceput, respectiv de sfarsit al intervalului de actiuni pe care il are un actionar). Care este secventa corecta care afiseaza pentru un actionar (introdus de la tastatura), intervalele seriilor actiunilor sale a. SELECT a.seriain, a.seriasf, b.nume FROM actiuni a, actionari b WHERE a.codact=b.codact AND b. b.nume=&x; SELECT a.seriain, a.seriasf, b.nume FROM actiuni , actionari c. WHERE a.codact=b.codact AND nume=&x; SELECT a.seriain, a.seriasf, b.nume FROM actiuni a, actionari b d. WHERE a.codact=b.codact ; SELECT a.seriain, a.seriasf, b.nume FROM actiuni a, actionari b WHERE pentru actionarii unei firme, tabelul 68. Se considera a.codact=b.codact OR b.nume=&x; ACTIUNI (cod_act number(5), seriain number(8), seriasf number(8), valoar number(8)) (unde seriain si seriasf reprezinta seria de inceput, respectiv de sfarsit al intervalului de actiuni pe care il are un actionar).

Care este secventa corecta care afiseaza suma necesara firmei pentru plata tuturor devidentelor (numrul de actiuni inmultit cu valoarea unei actiuni)? a. SELECT SUM((seriain+seriasf)*valoare)) FROM ACTIUNI; b. SELECT SUM((seriasf-seriasf)*valoare)) FROM ACTIUNI; c. SELECT SUM((seriain-seriasf)*valoare)) FROM ACTIUNI; d. SELECT SUM((seriasfseriain+1)*valoare)) FROM ACTIUNI; 69. Pentru tabelele
Angajat(cod_angajat, nume, pren, ..) Are_functia (cod_angajat, cod_functie, salariu ,..) Functii(cod_functie, ) care este comanda corecta pentru a calcula suma salariilor angajatului ENE ANA, care cumuleaza mai multe functii, in diferite compartimente? a. SELECT COUNT(SALARIU) AS SALARIU_CUMULAT FROM salariat, are_functia WHERE s.cod_salariat=a.cod_salariat AND NUME='ENE' AND PREN='ANA; b. SELECT Sum(SALARIU) AS SALARIU_CUMULAT FROM salariat, are_functia WHERE NUME='ENE' , PREN='ANA; c. SELECT Sum(SALARIU) AS SALARIU_CUMULAT FROM salariat s, are_functia a WHERE s.cod_salariat=a.cod_salariat AND NUME='ENE' AND PREN='ANA; 70. Pentru tabelele: PROF cod_prof# cod_fac nume pren salariu cod_funct FAC cod_fac# denumire adresa care este secventa corecta pentru o subinterogare corelata, care sa afiseze toate facultatile pentru care suma salariile profesorilor este mai mare 10000 a. SELECT DISTINCT DENUMIRE FROM FAC WHERE 10000< (SELECT sum(salariu) FROM PROF WHERE A.COD_FAC=B.COD_FAC); b. SELECT DISTINCT DENUMIRE FROM FAC A WHERE 10000< ( SELECT sum(salariu) FROM PROF B WHERE c. A.COD_FAC=B.COD_FAC); SELECT DISTINCT DENUMIRE FROM FAC A WHERE 10000< SELECT sum(salariu) FROM PROF B WHERE A.COD_FAC=B.COD_FAC; 71. Care este comanda corecta pentru a afisa toti salariatii , in ordine crescatoare dupa nume, care sunt manageri ? a. SELECT DISTINCT sef.nume, angajat.cod_manager FROM salariati sef, salariati angajat

WHERE sef.cod_salariat= angajat.cod_manager ORDER BY sef.nume; b. SELECT DISTINCT sef.nume, angajat.cod_manager FROM salariati sef, salariati angajat WHERE cod_salariat= cod_manager ORDER BY sef.nume; c. SELECT DISTINCT nume, cod_manager FROM salariati sef, salariati angajat WHERE sef.cod_salariat= angajat.cod_manager; d. ELECT DISTINCT nume, cod_manager FROM salariati sef, salariati angajat WHERE cod_salariat= cod_manager ORDER BY sef.nume; 72. Care este comanda corecta care sa afiseze daca exista angajati care nu lucreaza in departamentul Contractari si al caror salariu coincide cu salariul unui angajat din departamentul Contractari? a. SELECT nume, salariu, cod_depart FROM salariati WHERE salariu IN (SELECT salariu FROM salariati , department d WHERE s.cod_depart = d.cod_depart AND nume_depart <> Contractari) AND cod_depart= (SELECT cod_depart FROM department WHERE nume_depart = Contractari); b. SELECT nume, salariu, cod_depart FROM salariati WHERE salariu IS IN (SELECT salariu FROM salariati , department WHERE s.cod_depart = d.cod_depart , nume_depart = Contractari) AND cod_depart<> (SELECT cod_depart FROM department WHERE nume_depart = Contractari); c. SELECT nume, salariu, cod_depart FROM salariati WHERE (salariu) IN (SELECT salariu FROM salariati s, department d WHERE s.cod_depart = d.cod_depart AND nume_depart = Contractari) AND cod_depart<> (SELECT cod_depart FROM 73. Care estedepartment comanda corecta care afiseaza numarul total de carti imprumutate si restituite pentru fiecare citito al unei biblioteci? a. SELECT cod_cititor, COUNT() FROM imprumuta WHERE data_restituirii NOT NULL GROUP BY cod_cititor; b. SELECT cod_cititor, COUNT(*) FROM imprumuta WHERE data_restituirii IS NOT NULL; c. SELECT cod_cititor, COUNT(*) FROM imprumuta GROUP BY cod_cititor; d. SELECT cod_cititor, COUNT(*) FROM imprumuta WHERE data_restituirii IS NOT NULL GROUP BY cod_cititor;

74.

Care este comanda corecta care determina micsorarea salariilor cu 10%, cu rotunjire la 2 zecimale , a angajatilor care nu sunt titulari? a. UPDATE salariat SET salariu=ROUND(salariu*0.9, 2); b. UPDATE salariat SET salariu=ROUND(salariu*1.1) WHERE titular =N; c. UPDATE salariat SET salariu = ROUND(salariu*0.9, 2) WHERE TITULAR=N; d. UPDATE salariat SET salariu=ROUND(salariu+salariu*0.1) WHERE titular =Y; 75. Care este comanda corecta care afiseaza numele si salariul angajatilor condusi direct de ENE DAN? a. SELECT nume, salariu FROM salariati WHERE cod_ang = (SELECT cod_manager FROM salariati WHERE UPPER(nume) ='ENE' , UPPER(pren) ='DAN' ); SELECT nume, salariu b. FROM salariati WHERE cod_manager IN (SELECT cod_ang FROM salariati WHERE nume ='ENE' , pren ='DAN' ); c. SELECT nume, salariu FROM salariati (SELECT cod_ang FROM salariati WHERE UPPER(nume) ='ENE' AND UPPER(pren) ='DAN' ); d. SELECT nume, salariu FROM salariati WHERE cod_manager = (SELECT cod_ang FROM salariati WHERE UPPER(nume) ='ENE' AND UPPER(pren) ='DAN ); 76. Care este comanda corecta care afiseaza numele cititorilor care au carti nerestituite? a. SELECT nume_cititor FROM imprumuta WHERE data_restituirii = NULL; b. SELECT nume_cititor FROM imprumuta WHERE data_restituirii IS NOT NULL; c. SELECT nume_cititor FROM imprumuta WHERE data_restituirii IS NULL; d. SELECT nume_cititor FROM imprumuta WHERE data_restituirii > SYSDATE; 77. Care este comanda corecta care sterge valoarea coloanei salariu pentru angajatii care sunt angajati cu contract de colaborare? a. DELETE salariu FROM salariati WHERE contract=colaborare; b. UPDATE salariati

SET salariu IS null WHERE contract=colaborare; c. DROP salariu FROM salariati WHERE contract=colaborare; d. UPDATE salariati SET salariu=null WHERE contract=colaborare; 78. Care este comanda corecta care afiseaza codul departamentelor, numele departamentelor si suma salariilor pentru fiecare departament? a. SELECT cod_departament, nume_departament, SUM(salariu) FROM salariati s, departamente d GROUP BY cod_departament, nume_departament; b. SELECT cod_departament, nume_departament, SUM(salariu) FROM salariati s, departamente d WHERE s.cod_departament=d.cod_departament GROUP BY cod_departament; c. SELECT cod_departament, nume_departament, SUM(salariu) FROM salariati s, departamente d WHERE s.cod_departament=d.cod_departament GROUP BY cod_departament, nume_departament; d. SELECT cod_departament, nume_departament, SUM(salariu) FROM salariati, departamente WHERE s.cod_departament=d.cod_departament GROUP BY cod_departament, nume_departament; 79. Care este comanda corecta care afiseaza numele salariatilor care castiga mai mult decat salariul mediu pe companie, in ordine crescatoare a salariului? a. SELECT nume FROM salariati WHERE salariu >AVG(salariu); b. SELECT nume FROM salariati WHERE salariu > (SELECT AVG(salariu) FROM salariati) ORDER BY salariu; c. SELECT nume FROM salariati WHERE salariu > (SELECT AVG(salariu) FROM salariati ORDER BY salariu); d. SELECT nume FROM salariati WHERE salariu > (SELECT AVG(salariu) FROM salariati) ORDER BY 1; 80. Care este comanda corecta care afiseaza toate functiile pe care nu lucreaza angajati? a. SELECT cod_functie FROM functii WHERE cod_functie IN (SELECT cod_functie FROM salariati WHERE cod_functie IS NOT NULL); b. SELECT cod_functie FROM functii WHERE cod_functie NOT IN

(SELECT cod_functie FROM salariati WHERE cod_functie IS NULL); c. SELECT cod_functie FROM functii WHERE cod_functie NOT IN (SELECT cod_functie FROM salariati); d. SELECT cod_functie FROM functii WHERE cod_functie NOT IN (SELECT cod_functie FROM salariati WHERE cod_functie IS NOT NULL);

Intrebri i probleme la cursul de Baze de date, anul III, toate formele de nvmnt
PARTEA I. Concepte despre Bazele de date relaionale. Normalizare

Probleme
1. S se normalizeze tabelul CURS_SUDENT Presupunem c tabela Curs_Student conine urmtoarele date: CURS_SUDENT NrMatricol NumeSt PrenumeSt Grupa Cursuri-Nota 458 Predescu Alexandru 114 engleza-7,germana-8 521 Radu George 122 desen-tehnic-10,franceza-7 627 Cristescu Lucian 243 programare-8,engleza-10 746 Irimia Diana 361 analiza numerica-9 782 Tanase Daciela 341 gernana-6,programare-10 982 Bunea Mihaela 114 rezistenta materialelor-8 1204 Dragnea Liviu 412 educatie fizica-10 S1520 Popa Marius 452 analiza numerica-7,engleza-9 Coloana Cursuri conine mult prea multa informaie. S presupunem c am nlocui coloana Cursuri cu dou noi coloane: CURS_SUDENT
NrMatricol 458 521 627 746 782 982 1204 1520 NumeSt Predescu Radu Cristescu Irimia Tanase Bunea Dragnea Popa PrenumeSt Alexandru George Lucian Diana Daciela Mihaela Liviu Marius Grupa 114 122 243 361 341 114 412 452 Curs1 engleza desen tehnic programare analiza numerica germana rezistenta materialelor educatie fizica analiza numerica Nota1 7 10 8 9 6 8 10 7 Curs2 germana franceza engleza programare Nota2 8 7 10 10

engleza

1.1 S se aduc tabela CURS_SUDENT la FN1. Pentru aceasta s se creeeze tabelul CURS_SUDENT modificat corespunztor FN1. Amintim c o tabel este n prima form normal(FN1) dac valorile tuturor atributelor care o compun sunt atomice (indivizibile). n plus, nu trebuie s existe atribute sau grupuri de atribute repetitive. 1.2 S se aduc tabela CURS_SUDENT la FN2. Pentru aceasta s se creeeze tabelele CURS_SUDENT modificat corespunztor FN2 i tabelele SUDENT i CURS, rezultate n urma normalizrii la FN1.

Amintim c o tabel este n FN2, dac este n FN1 i fiecare atribut care nu face parte din cheia primar este dependent de ntreaga cheie primar. Pentru a obine o relaie FN2 se poate aplica regula Casey-Delobel. mulimea atributelor care intervin n dependenele funcionale; reprezint reuniunea determinantului cu restul atributelor lui A. . 1.3 Este tabela CURS_SUDENT realizat la 1.2 n FN3? (Justificai rspunsul) 2. S se aduc tabelul Profesor la FN3 i s se creeze tabela Titlu, rezultat n urma normalizrii PROFESOR IdProf 1 2 3 4 5 6 7 Nume Popescu Marin Dragnea Ion Iosif Irina Ilie Daniel Savu Cristina Cristea George Ene Horia Catedra Matematici Limbi straine Educatie fizica Informatica Limbi straine Fizica Informatica IdTitlu 1 4 3 2 5 6 1 Titlu lector dr. asistent lector conferentiar dr. prepartor profesor dr. lector dr. Salariu 1300 950 1100 1700 680 2150 1300

Amintim c o tabel este n FN3 dac este n FN2 i toate coloanele care nu fac parte din cheia primar sunt mutual independente (depind direct de cheia primar i numai de ea) 3. Tabelele Profesor i Titlu sunt n relaia 1:m (un Titlu corespunde la mai multe cadre didactice). Tabele de mai sus pstreaz regulile de integritate?

Amintim ca regulile de integritate sunt; - unicitatea cheii primare - integritatea entitii valorile cheii primare sa fie diferite de valoarea null(o valoare necunoscuta sau lipsete) - integritatea referenial ) o cheie secundar trebuie s fie null n ntregime sau s corespund unei valori a cheii primare asociate.(in tabela asociat nu trebuie s existe valori fr corespondent).

4. S se determine anomaliile pentru tabelul Avion (Redundan logic, Anomalie la inserie, Anomalie la tergere i Anomalie la modificare). Avion A# 1 2 3 4 5 6 nume AIRBUS AIRBUS AIRBUS CAR B707 B707 capacitate 250 250 250 100 150 150 localitate PARIS PARIS LONDRA PARIS LONDRA LONDRA

Constrngere: toate avioanele cu acelai nume au aceeai capacitate. 5. S se implementeze FN1 pentru tabelul MASINA:

Persoana Eu Tu El noi

Vehicul R25 - W14 - R21 205 R5 - 305 BX - 305 - R12 - R25

6. S se aduc la FN2 tabelul ATASAT_LA, prin spargerea lui n 2 tabele ATASAT_LA _2A i ATASAT_LA_ 2B ATASAT_LA
COD_SALARIAT# S1 S1 S1 S3 S5 JOB_COD PROGRAMATOR PROGRAMATOR PROGRAMATOR VANZATOR INGINER NR_PROIECT# P1 P2 P3 P3 P3 FUNCTIA SUPERVIZOR CERCETATOR AUXILIAR SUPERVIZOR SUPERVIZOR SUM A 60 25 10 60 60

7. Tabelul ATASAT_LA _2A rezultat de la 6. s se aduc la FN3, realiznd tabelele ATASAT_LA _3A i ATASAT_LA _3B

8. Presupunem c un antier poate executa mai multe lucrri de baz i c o lucrare poate fi executat de mai multe antiere. Pentru relaia EXECUTA s se specifice dependenele, realiznd relaia EXECUTA_1! Avem relaiile urmtoare LUCRARE(cod_obiectiv#, cod_lucrare#, nume); SANTIER(nr_santier#, specialitate, sef); EXECUTA(cod_obiectiv#, cod_lucrare#, nr_santier#, conducator, data_inceput, data_sfarsit).

descriere,

functie,

9.S se aduc relaia EXECUTA_1 rezultat de la 8, n FN3 cu regula CaseyDelobel! 10. S se aduc la forma BCNF (Forma normal Boyce-Codd ) INVESTESTE_IN(cod_contractant#, cod_obiectiv#, nr_contract, cota_parte), realizand INVESTESTE_IN _1 i INVESTESTE_IN_2. (Formal, o relaie R este n forma normal Boyce-Codd dac i numai dac pentru orice dependen funcional total X A, X este o cheie (candidat) a lui R.)

Intrebri
Alegei rspunsurile corecte pentru fiecare din urmtoarele ntrebri cu rspunsuri multiple. ntrebrile pot avea mai multe rspunsuri corecte. 1. SQL este a. Un limbaj realizat de Dr. E. F. Codd b. Un limbaj folosit pentru comunicarea cu bazele de date relaionale c. Un limbaj folosit pentru definirea diagramelor ERD d. Folosit pentru definirea i modificarea obiectelor unei baze de date e. Folosit pentru definirea paginilor web

2. O baz de date este a. O structur denumit de date, cum ar fi un tabel, o vizualizare sau un index b. Un produs software furnizat de un productor de baze de date c. O colecie de date interrelaionate gestionate ca o singur unitate d. Definit n acelai mod de toi productorii de software e. Implementat diferit de diferii productori 3. Un sistem de gestionare a bazelor de date este a. O structur, cum ar fi un tabel, o vizualizare sau un index b. O colecie de date interrelaionate gestionate ca o singur unitate c. Un produs software furnizat de un productor de baze de date d. Deseori abreviat sub forma DBMS e. O structur denumit de date, cum ar fi un tabel, o vizualizare sau un index 4. Exemple de sisteme RDBMS sunt a. EXCEL b. MySQL c. PostgreSQL d. Oracle Database e. Microsoft SQL Server 5. Componentele unei baze de date relaionale includ a. Relaii b. Tabele c. Vizualizri de utilizator d. Diagrame ERD e. Restricii

6. Printre tipurile de restricii care pot fi folosite n bazele de date se numr a. NOTNULL b. Relaie c. Cheie primar d. CHECK e. Unicitate 7. Scopul normalizrii este de a rezolva urmtoarele probleme a. Anomalia de inserare b. Performante reduse c. Anomalia de creare d. Anomalia de tergere e. Anomalia de actualizare 8. Procesul de normalizare a. ncepe de la tabele, pentru a ajuta proiectanii s descopere vizualizrile de utilizator b. A fost dezvoltat de Dr. E. F. Codd c. A fost dezvoltat de Oracle d. Este aplicat sistematic fiecrei vizualizri de utilizator 9. Un identificator unic(cheie) a. Trebuie determinat naitea procesului de normalizare b. Poate fi compus dintr-un singur atribut c. Poate fi compus din zero sau mai multe atribute d. Poate fi compus din mai multe atribute concatenate 10. Prima form normal rezolv anomaliile cauzate de a. Dependenele pariale de cheia primar

b. Grupurile repetitive c. Dependenele tranzitive d. Atributele multivaloare e. Relaiile de tip unu-la-mai-muli 11. A doua form normal rezolv anomaliile cauzate de a. Dependenele pariale de cheia primar b. Grupurile repetitive c. Dependenele tranzitive d. Atributele muli valoare e. Relaiile de tip unu-la-mai-muli 12. A treia form normal rezolv anomaliile cauzate de a. Dependenele pariale de cheia primar b. Grupurile repetitive c. Dependenele tranzitive d. Atributele multivaloare e. Relaiile de tip unu-la-mai-muli 13. Pentru aducerea n prima form normal a unei relaii ne-normalizate a. Atributele care depind doar de o parte a cheii sunt eliminate b. Atributele multivaloare sunt mutate ntr-o nou relaie c. Atributele care sunt dependente tranzitiv sunt eliminate d. Grupurile repetitive sunt mutate ntr-o nou relaie e. Identificatorul unic al relaiei originale este copiat n noua relaie 14. Problemele de dependen parial a. Sunt rezolvate de FN2 b. Sunt rezolvate de FN3

c. Pot aprea n relaiile cu chei primare concatenate d. Apar cand un atribut non-cheie depinde doar de o parte a cheii primare e. Apar cand un atribut non-cheie depinde de un alt atribut non-cheie

Partea a_II_a Access 1. 1.Deschideti o aplicatie de baze de date. 2.Creati o baza de date noua in diirectorul My Documents. 3.Creati o tabela cu urmatoarele campuri: Cod_valuta Valuta Curs Number Currency Number

4.In tabela create, stabiliti Cod_valuta ca fiind cheie primara. 5.Creati un formulat nou. 6.Cu ajutorul formularului introduceti urmatoarele 5 inregistrari in tabela: 2 3 1 5 4 euro dolar franc lira
35.000 33.000

7.Creati un filtru de tipul Filter By Selection pentru tabela create. 8.Deschideti tabela create. 9.Mutati atributul 3 inaintea atributului 1 10.Salvati datele si deschideti aplicatia de baze de date.

2.
1.Deschideti baza de date 1.mdb. 2.Utilizati instrumentul de cautare, pentru a gasi in tabela Profesor inregistrarea cu numele Maria. 3.In aceasta inregisrare modificati numele in Alina. 4.Creati o interogare asupra tabelei Profesor, in care afisati toate atributele pentru profesorii cu o vechime mai mare de 15 ani. 5.Rulati interogarea creata. 6.Creati o interogare asupra tabelei Universitate in care afisati doar campurile 1 si 3. 7.Stabiliti atributul Nr_profesori din tabela Catedra ca fiind indexat fara duplicate. 8.Creati un raport asupra tabelei Profesori.

9.Grupati datele din raport dupa atributul Vechime. 10. Salvati modificarile facute si inchideti aplicatia de baze de date . 3. 1.Deschideti o aplicatie de baze de date. 2.Creati o baza de date noua in directorul My Documents. 3.Creati o tabela cu urmatoarele campuri: A B Number (cheie primara) Text

4.Creati o tabela cu urmatoarele campuri: A E Number Date

5.Craeti o legatura intre tabele prin intermediul campului A . 6.Stabiliti atributul E ca fiind indexat fara duplicate. 7.Ctreati un filtr de tipul Filter By Selection pentru prima tabela. 8.Creati o interogare asupra tabelei 2 in care afisati doar canpul 2. 9.Modificati orientarea paginii. 10. Salvati toate datele si inchideti aplicatia de baze de date. 1.Deschideti baza de date 3.mdb. 2.Stergeti tabela Informatii, din baza de date. 3.Deschideti tabela Casete si modificati dimensiunea atributului Nume_film la 100. 4.Deschideti un formular existent. 5.Cu ajutorul formei selectati inregisrarea 3 si modificati Nr_casete la 10. 6.Utilizati comanda Undo pentru a reface operatia anterioara. 7.Modificati lungimea unei coloane in tabela Casete. 8.Utilizati instrumentul de cautare, pentru a gasi intregistrarea cu valoarea Richard Gere pentru atributul Actor. 9.Stergeti aceasta inregistrare. 10. Inchideti aplicatia de baze de date.

4.
1.Deschideti aplicatia de baze de date. 2.Creati o baza de date noua in direcctorul My Documents. Salvati-o cu numele dumneavoastra. 3.Creati o tabela cu urmatoarele campuri: Inregistrare 1 Number-Long Integer

Inregistrare 2 Inregistrare 3

Text- dimensiune 50 Currency

4.Salvati tabela cu numele Numere. 5.Creati un formular nou asupra tabelei Numere. 6.Salvati formularul cu denumirea Formular Numere. 7.Introduceti 2 inregistrari in tabela Numere. cu ajutorul formei create.
Inregistrare 1 100 300

Inregistrare 2 Prima valoare A doua valoare

Inregistrare 3 31 32

8.Utilizati instrum,entul de cautare, pentrua gasi inregistrarea in care campul Inregisrare 3 ia valoare 31. 9.Modificati Prima valoare cu Prima_Valoare. 10.Salvati modificarile facute si inchideti aplicatia de baze de date.

1.Deschideti baza de date cu 4.mdb. 2.Adaugati atributul Adresa_firma tabelei Comenzi. 3.Stergeti tabela Informatii din baza de date. 4.Modificati tipul coloanei Nume_produs in tabela Produs. 5.Creati o interogare asupra tabelei Produs, in caer afisati doar campurile ce au unitatea de masura litrii 6.Creati un raport asupra tabelei Produs. 7.Introduceti in antetul raportului o imagine. 8.Mutati imaginea in partea stanga a antetului. 9.Salvati raportul cu denumirea Raport_Produs. 10.Salvati modificarile facute si inchideti aplicatia de baze de date.

5.
1.Deschideti aplicatia de baze de date. 2.Craeti o baza de date noua cu nmele baza de date pe C:/ 3.In baza de date nou create , construiti o tabela cu urmatorele atribute : Tara Data_curenta Nume_firma Cheie_primara Text-dimensiune 20 Date/Time- Short Date Texe-dimensiune 30 Autonumber

4.Stabiliti atributul Data_curenta ca find indexat cu dupliacte. 5.Mutati atributul Cheie_primara astfel incat sa devina primul atribut din tabela.

6.Creati o regula de validare pentru atributul Cheie_primara, astfel incat sa nu primesca valori mai mari de 256. 7.Introduceti in tabela creata 5 inregistrari. 8.Imprimati toate inregistrarile din tabela. 10.Inchideti aplicatia de baze de date. 1.Deschideti baze de date 5.mdb. 2.Creati un filtru de tipul Filter By Selection pentru tabela Carte. 3.Sortarti datele din tabela Autor in ordine alfabetica dupa numele autorului. 4.Aplicati filtrul creat asupra tabelei Carte. 5.Creati un formular pentru tabela Autor. 6.Cu ajutorul formularului selectati inregistrarea 2 si modificati numele autorului. 7.Stergeti inregisrarea cu nr 1 din tabela. 8.Creati un raport asupra tabelei Carte. 9.Modificati dimensiunea paginii din A4 in Letter. 10.Salvati modificarile facute si inchideti aplicatia de baze de date.

6.
1.Deschideti aplicatia de baze de date. 2.Creati o baza de date noua si salvati-o in directorul My Documents. 3.Utilizati functia Help pentru a cauta informatii despre tabele. 4.Creati o tabela noua si denumiti-o Informatii. 5.Introduce-ti in tabela 3 atribute. 6.In tabela creata stabiliti primul camp ca fiind cheie primara. 7.Creati un raport asupra acestei tabele. 8.Grupati datele din raport in functie de al doilea atribut. 9.Salvati raportul cu numele Raport. 10.Inchideti baza de date creata. 1.Deschideti aplicatia de baze de date. 2.Deschideti baza de date 6.mdb. 3.Stergeti tabela Campuri din baza de date. 4.Modificati lungimea unei coloane in tabela Autor. 5.Creati un formular pentru tabela Autor. 6.Adaugati numele dumneavoastra in antetul formularului creat. 7.Creati o interogare cu date din tabelele Autor si Carte. 8.Salvati interogarea cu numele Query. 9.Rulati interogarea creata. 10.Salvati modificarile facute si inchideti aplicatia de baze de date.

7.
1.Deschideti aplicatia de baze de date. 2.Creati o baza de date noua datele dumneavoastra pe directorul C :

3.Afisati pe ecran bara de instrumente WEB. 4.Creati o tabela cu urmatoarele atribute : COD NUME SUMA Numeric Byte Text dimensiune 15 caractere Currency Euro

5.Creati o noua tabela cu urmatoarele atribute : Nr_Crt Cod Firma Adresa Autonumber Numeric Byte Text dimensiune 20 Text dimensiune 25

6.Stabiliti in prima tabela ca cheie primara COD. 7.Creati o legatura intre cele doua tabele dupa campul COD 8.Salvati modificarile facute 9.Mutati in tabela 2 campul Firma dupa campul Adresa 10.Inchideti aplicatia de baze de date 1.Deschideti o aplicatie de baze de date 2.Deschideti baza de date 7.mdb 3.Modificati lungimea unei coloane in tabela Catedra 4.Cautati inregistrarea cu nr 3 si modificati cod profesor ca fiind egal cu 10 5.Creati o interogare cu date din tabelele Catedra si Profesor. 6.Sortati datele din tabela Profesor in ordine alfabetica dupa Nume_profesor 7.Creati un raport asupra tabelei Universitate. 8.Modificati orientarea paginii. 9.Imprimati toate datele obtinute in raportul anterior creat 10.Salvati toate modificarile facute si inchideti baza de date.

8.
1.Deschideti o aplicatie de baze de date 2.Creati o baza de date noua in directorul C : 3.Creati o tabela in care introduceti 5 campuri.Dintre acestea 2 vor fi de tip Text,2 vor fi numerice si 1 de tip data calendaristica 4.Creati un formular nou asupra tabelei create anterior. 5.Cu ajutorul noului formular introduceti in tabela 5 inregistrari 6.Adaugati numele dumneavoastra in antetul formei. 7.Creati o interogare care sa contina numai campurile 1 si 2 8.Rulati interogarea creata. 9.Imprimati doar inregistrarile selectate din tabela creata 10.Salvati toate datele si inchideti aplicatia de baze de date 1.Deschideti baza de date 8.mdb

2.Deschideti tabela Masini si introduceti urmatorul atribut Nume. 3.Stergeti legatura dintre tabelele Masini si Masini Disponibile 4.Sortati datele din tabela Masini, in ordine crescatoare dupa atributul Masini_disponibile 5.Creati un raport asupra tabelei Masini 6.Introduceti in subsolul raportului numele dvs. 7.Grupati datele din raport dupa atributul Masini_disponibile 8.Modificati dimensiunea paginii din A4 in Letter 9.Imprimati raportul la o imprimanta disponibila 10.Salvati modificarile facute si inchideti apllicatia de baze de date.

9.
1. Deschideti o aplicatie de baze de date. 2. Creati o baza de date noua in directorul My Documents. 3. Creati o tabela cu urmatoarele campuri: Numar_intrare Data_intrare Cantitate_intrata Denumire_produs Number Date Number Text

4. In tabela create stabiliti atributul Numar_Intrare ca fiind cheie primara. 5. Creati un formular nou. 6. Cu ajutorul formularului introduceti 5 inregistrari in tabela. 7. Creati un filtru de tipul Filter Exculding Selection. 8. Deschideti tabela creata in Desing View. 9. Mutati atributul 3 inaintea atributului 1. 10. Salvati datele si inchideti aplicatia de baze de date. 1. Deschideti baza de date 9.mdb. 2. Utilizati instrumentul de cautare, pentru a gasi inregistrarea cu valoarea 2 pentru atributul Cod_caseta din tabela Casete. 3. In aceasta inregistrare modificati numele filmului ca fiind Film5. 4. Creati o interogare asupra tabelei Casete in care afisati doar campurile 1,3,5. 5. Rulati interogarea creata. 6. Creati o interogare asupra tabelei Casete, in care afisati doar campurile pentru care atributul Tip_film are valoarea Actiune. 7. Stabiliti atributul Nume_film ca fiind indexat cu duplicate. 8. Creati un raport asupra tabelei Casete. 9. Grupati datele din raport dupa atributul Cod_imprumut. 10. Salvati modificarile facute si inchideti aplicatiile de baze de date.

10.
1. Deschideti o aplicatie de baze de date. 2. Creati o baza de date noua in directorul My Documents.

3. Creati o tabela denumita Elevi ce va contine urmatoarele campuri: Nume_elevi Data_nasterii Varsta Nr_scoala Text Date Number - Integer Number - Integer

4. Creati o tabela denumita Clasa ce va contine urmatoarele campuri : Nume Clasa Medie Nr_scoala 5. 6. 7. 8. Text Number Number Number - Integer

Creati o legatura intre tabela Elevi si tabela Clasa. stabiliti atributul Nr_scoala ca fiind indexat fara duplicate. Creati un filtru de tipul Filter By Form pentru tabela Elevi. Creati o interogare asupra ambelor tabele in care afisati campurile Nume_elevi, Varsta, Clasa, Media. 9. modificati orientarea paginii. 10. Salvati toate datele si inchideti aplicatia de baze de date.

Deschideti baza de date 10.mdb. Adaugati urmatorul atribut Numar_telefon tabelei Autor. Stergeti tabela Campuri din baza de date. Modificati lungimea coloanei Nume in tabela Autor la 100 de caractere. Creati o interogare asupra tabelei Carte, in care afisati doar cartile ce au codul mai mare de 100. 6. Creati un raport asupra tabelei Autor. 7. Introduceti in antetul raportului o imagine. 8. Mutati imaginea in partea stanga a antetului. 9. Salvati raportul cu denumirea Raport autor. 10. Salvati modificarile facute si inchideti aplicatia de baze de date.

1. 2. 3. 4. 5.

11.
1. Deschideti aplicatia de baze de date. 2. creati o baza de date noua si salvati-o in directorul My Documents. 3. Utilizati functia Help pentru a cauta informatii despre tabele. 4. Creati o tabela noua si denumiti-o Informatii. 5. Introduceti in tabela 3 atribute. 6. in tabela creata, stabiliti primul camp ca fiind cheie primara. 7. Creati un raport asupra acestei tabele. 8. Grupati datele din raport in functie de al doilea atribut. 9. Salvati raportul cu numele de Raport. 10. Inchideti baza de date creata.

1. Deschideti baza de date 11.mdb. 2. Stergeti tabela Informatii din baza da date. 3. Deschideti tabela Produs si modificati dimensiunea atributului Cantitate. 4. Deschideti formularul Produs. 5. Cu ajutorul formularului selectati inregistrarea 3 si modificati Cantitatea la 250. 6. Utilizati comanda Undo pentru a reface operatia anterioara. 7. Modificati lungimea unei coloane in tabela Comenzi. 8. Utilizati instrumental de cautare, pentru a gasi inregistrarea cu Cod_produs 4. 9. Stergeti aceasta inregistrare. 10. Inchideti aplicatia de baze de date.

12.
1. Deschideti aplicatia de baze de date. 2. Creati o baza de date noua in directorul My Documents. Salvati-o cu numele dumneavoastra. 3. Creati o tabela cu urmatoarele campuri: CNP Nume Data Number Double Text dimensiune 50 Date/Time Medium Date

4. Salvati tabela cu numele Persoana. 5. Creati un formular nou asupra tabelei Persoana. 6. Salvati formularul cu denumirea Formular Persoana. 7. Introduceti doua inregistrari in tabela Persoana, cu ajutorul formei create. CNP 102 98 Alina Maria Nume Data 19-Jun-94 18-Feb-2002

8.Utilizati instrumental de cautare, pentru a gasi inregistrarea cu CNP-ul 102. 9. Modificati numele persoanei in Andrei. 10. Salvati modificarile facute si inchideti aplicatia de baze de date. 1. 2. 3. 4. 5. 6. 7. 8. 9. Deschideti baza de date 12.mdb. Adaugati urmatorul atribut Adresa_mail tabelei Profesor. Stergeti tabela De sters din baza de date. Modificati lungimea unei coloane in tabela Profesor. Creati o interogare asupra tabelei Universitate, in care afisati doar campurile care au valoarea atributului Cod_Catedra mai mare decat 100. Creati un raport asupra tabelei Universitate. Introduceti in antetul raportului o imagine. Mutati imaginea in partea stanga a antetului. Salvati raportul cu denumirea Universitate.

10. Salvati modificarile facute si inchideti aplicatia de baze de date.

13.
1. Deschideti aplicatia de baze de date. 2. Creati o baza de date noua cu numele baza de date pe C:\ 3. In baza de date noua creata, construiti o tabela cu urmatoarele atribute : Oras Text dimensiune 20 Data examinarii Date/Time Short Date Text dimensiune 30 Nume Centru Numar curent Autonumber 4. Stabiliti atributul Nume Centru ca fiind indexat cu duplicate. 5. Mutati atributul Numar Curent, astfel incat sa devina primul atribut din tabela. 6. Creati o regula de validare pentru atributul Numar Curent, astfel incat sa nu primeasca valori mai mari de 256. 7. Introduceti in tabela creata 5 inregistrari. 8. Imprimati toate inregistrarile din tabela. 9. Salvati toate datele. 10. Inchideti aplicatia de baze de date. 1. 2. 3. 4. 5. 6. 7. Deschideti aplicatia de baze de date. Deschideti baza de date 13.mdb. Stergeti tabela Informatii din baza de date. Modificati tipul atributului Cantitate, din tabela Produs, din Text in Number. Deschideti formularul Produs. Adaugati numele dumneavoastra in antetul formulaului Produs. Creati o interogare cu date in tabelele Produs si Comenzi in care sa afisati din tabela Produs campurile Nume_produs si Unitate_de_masura, iar din tabela Comenzi campurile Nume_firma si Cantitate_ceruta, pentru acele inregistrari pentru care cod_produs din tabela Produs este egal cu cod_produs din tabela Comenzi.

14.
1. Deschideti aplicatia de baza de date. 2. Creati o baza de date noua si salvati-o in directorul My Documents. 3. Utilizati functia Help pentru a cauta informatii despre tabele. 4. Creati o tabela noua si denumiti-o Informatii. 5. Introduceti in tabele 3 atribute . 6. In tabela creata stabiliti primul camp ca fiind cheie primara . 7. Creati un raport asupra acestei tabele . 8. Grupati datele din raport in functie de al 2-lea atribut . 9. Salvati raportul cu numele Raport. 10. Inchideti baza de date creata . 1. Deschideti baza de date 14.mdb. 2. Deschideti tabela Casete Data_imprumut de tip Date .

imprumutate

si

introduceti

atributul

3. Stergeti legatura dintre tabelele Casete si Casete imprumutate. 4. Sortati datele din tabela Casete in ordine descrescatoare dupa atributul Actor. 5. Creati un raport asupra tabelei Casete . 6. Introduceti in antetul raportului , numele dumneavoastra si data curenta . 7. Grupati datele din raport dupa atributul Tip_film . 8. Modificati dimensiunea paginii din Letter in A4 . 9. Imprimati raportul la o imprimanta disponibila . 10. Salvati modificarile facute si inchideti aplicatia de baza de date .

15.
1. 2. 3. 4. Deschideti aplicatia de baza de date . Creati o baza de date noua cu numele dumneavoastra pe directorul C: Afisati pe ecran bara de instrumente Database . Creati o tabela cu urmatoarele atribute : Numeric Byte Text dimensiune 15 caractere Currency tip Euro

Atribut 1 Atribut 2 Atribut 3

5. Creati o noua tabela cu urmatoarele atribute : Atribut 1 Atribut 4 Atribut 5 Numeric Byte Text dimensiune 20 caractere Text dimensiune 25 caractere

6. Stabiliti in prima tabela ca cheie primara Atribut 1 . 7. Creati o legatura intre cele doua tabele dupa campul Atribut 1. 8. Salvati modificarile facute . 9. Mutati in tabela 2 campul Atribut 5 inaintea campului Atribut 4 . 10.Inchidetai aplicatia de baza de date . 1. Deschideti baza de date 15.mdb. 2. Utilizati instrumentul de cautare , pentru a gasi in tabela Profesor inregistrarea cu numele Maria . 3. In aceasta inregistrare modificati numele in Andreea . 4. Creati o interogare asupra tabelei Profesor , in care afisati toate atributele pentru profesorii cu o vechime mai mare de 15 ani . 5. Rulati interogarea creata . 6. Creati o interogare aspura tabelei Universitatea in care afisati doar campurile 1 si 3 . 7. Stabiliti atributul Nr_profesori din tabela Catedra ca fiind indexat fara duplicitate . 8. Creati un raport asupra tabelei Profesori . 9. Grupati datele din raport dupa atributul Vechime . 10.Salvati modificarile facute si inchideti aplicatia de baza de date .

16.
1. Deschideti o aplicatie de baze de date . 2. Creati o baza de date noua in directorul My Documents . 3. Creati o tabela cu urmatoarele campuri : A B Number (Cheie primara) Text

4. Creati o tabela cu urmatoarele campuri : A E Number Date

5. Creati o legatura intre tabelele prin intermediul campului A . 6. Stabiliti atributul E ca fiind indexat fara duplicitate . 7. Creati un filtru de tipul Filter By Selection pentru prima tabela . 8. Creati o interogare asupra tabelei 2 in care afisati doar campul 2. 9. Modificati orientarea paginii . 10.Salvati toate datele si inchideti aplicatia de baze de date . 1. 2. 3. 4. 5. Deschideti baza de date 16.mdb . Adaugati atributul Adresa_firma tabelei Comenzi . Stergeti tabela Informatii din baza de date . Modificati tipul coloanei Nume_produs din tabela Produs . Creati o interogare asupra tabelei Produs , in care afisati doar campurile ce au unitatea de masura "litri" . 6. Creati un rapot asupra tabelei Produs . 7. Introduceti in antetul raportului o imagine . 8. Mutati imaginea in partea stanga a antetului . 9. Salvati raportul cu denumirea Raport_produs . 10.Salvati modificarile facute si inchideti baza de date .

17.
1. Deschideti o aplicatie de baza de date . 2. Creati o baza de date noua in directorul C : 3. Creati o tabela in care introduceti 5 campuri . Dintre acestea doua vor fi de tip Text ,doua vor fi numerice si unul de tip data calendaristica . 4. Creati un formular nou asupra tabelei create anterior . 5. Cu ajutorul noului formular introduceti in tabela 5 inregistrari . 6. Adaugati numele dumneavoastra in antetul formei . 7. Creati o interogare care sa contina numai campurile 1 si 2 . 8. Rulati interogarea creata . 9. Imprimati doar inregistrarile selectate din tabela creata . 10.Salvati toate datele si inchideti aplicatia de baza de date .

1. Deschideti baza de date 17.mdb 2. Stergeti tabela Date din baza de date . 3. Deschideti tabela Casete imprumutate si modificati tipul atributului Nr_casete_imprumutate ca fiind Integer . 4. Deschideti un formular existent . 5. Cu ajutorul formei selectati intregistrarea 4 si modificati Nr_casete la 15 . 6. Utilizati comanda Undo pentru a reface operatia anterioara . 7. Modificati lungimea unei colane din tabela Produs . 8. Utilizati instrumentul de cautare , pentru a gasi inregistrarea cu valoare Desene animate pentru atributul Tip_film . 9. Stergeti aceasta inregistrare . 10.Inchideti aplicatia de baza de date .

18.
1. Deschideti aplicatia de baze de date . 2. Creati o baza de date noua in directorul My Documents . Salvati-o cu numele dumneavoastra . 3. Creati o tabela cu urmatoarele campuri : CNP Nume Data 4. 5. 6. 7. Number Double Text dimensiune 50 Date/Time Medium Date

Salvati tabela cu numele Persoana . Creati un formular nou asupra tabelei Persoana . Salvati formularul cu denumirea Formular Persoana . Introduceti doua inregistrari in tabela Persoana cu ajutorul formei create . CNP 102 98 Nume Alina Maria Data 19-Jun-94 18-Feb-2002

8. Utilizati instrumentul de cautare pentru a gasi inregistrarea cu CNP-ul 102 . 9. Modificati numele persoanei in Mihai . 10.Salvati modificarile facute si inchideti baza de date . 1. Deschideti aplicatia de baze de date . 2. Deschideti baza de date 22.mdb . 3. Stergeti tabela Campuri din baza de date 4. Modificati lungimea unei coloane in tabela Autor . 5. Creati un formular pentru tabela Autor . 6. Adaugati numele dumneavoastra in antetul formularului creat . 7. Creati o interogare cu date din tabelele Autor si Carte . 8. Salvati interogarea cu numele Query . 9. Rulati interogarea creata . 10.Salvati modificarile facute si inchideti aplicatie de baze de date .

19.
1. Deschideti aplicatia de baze de date . 2. Creati o baza de date noua cu numele baza de date pe C:\ 3. In baza de date nou creata construiti o tabela cu urmatoarele atributre : Oras Data examinarii Nume centru Numar curent Text dimensiune 20 Date/Time Short Date Text dimensiune 30 Autonumber

4. Mutati atributul Numar Curent astfel incat sa devina primul atribut din tabela . 5. Atasati atributului Oras optiunea Indexed with Duplicates . 6. Creati o regula de validare pentru atributul Numar Curent , astfel incat sa nu primeasca valori mai mari de 256 . 7. Introduceti in tabela creata 5 inregistrari . 8. Imprimati toate inregistrarile din tabela . 9. Salvati toate datele . 10.Inchideti aplicatia de baze de date . 1. Deschideti o aplicatie de baze de date . 2. Deschideti baza de date 19.mdb . 3. Modificati lungimea unei coloane in tabela Catedra . 4. Cautati inregistrarea cu nr. 3 si modificati cod profesor ca fiind egal cu 10. 5. Creati o interogare cu date din tabelele Catedra si Profesor 6. Sortati datele din tabela Profesor in ordine alfabetica dupa Nume_profesor 7. Creati un raport asupra tabelei Universitate 8. Modificati orientarea paginii 9. Imprimati toate datele obtinute in raporturi ulterior creat 10. Salvati toate modificarile facute si inchideti baza de date

20.
1. Deschideti aplicatia de baze de date 2. Creati o baza de date noua cu numele dumneavoastra pe C:/ 3. In baza de date nou creata construiti o tabela cu urmatoarele atribute Nume_depozit Data_curenta Nume_material Cod_curent Text-dimensiune 20 Date/Time- Short Date Text- dimensiune 30 Autonumber

4. Stabiliti atributul Data_curenta ca fiind indexat dublicate 5. Mutati atributul Cod_curent astfel incat sa devina primul atribut din tabela 6. Creati o regula de validare pentru atributul Cod_curent, astfel incat sa nu primeasca valori mai mari de 256 7. Introduceti in tabela creata 5 inregistrari

8. Imprimati toate inregistrarile din tabela 9. Salvati toate datele 10. Inchideti aplicatia de baze de date 1. Deschideti baza de date 20.mdb. 2. Utilizati instrumentul de cautare pentru a gasi inregistrarea cu valoarea 2 pentru atributul Cod_caseta din tabela Casetei 3. In aceasta inregistrare modificati numele filmului ca fiind Film interesant 4. Creati o interogare asupra tabelei Casete in care afisati doar campurile 2 si 4 5. Rulati interogarea creata 6. Creati o interogare asupra tabelei Casete, in care afisati doar campurile pentru care atributul Tip_film are valoarea Actiune 7. Stabiliti atributul Nume_film ca fiind indexat cu duplicate 8. Creati un raport asupra tabelei Casete 9. Grupati datele din raport dupa atributul Cod_imprumut 10. Salvati modificarile facute si inchideti aplicatia de baze de date

Partea a_III_a SQL


ntrebri i Probleme
Alegei rspunsurile corecte pentru fiecare din urmtoarele ntrebri cu rspunsuri multiple. ntrebrile pot avea mai multe rspunsuri corecte. 1. SQL este a. Un limbaj orientat spre obiecte b. Un limbaj procedural c. Un limbaj nonprocedural d. Un limbaj declarativ e. Un limbaj standard 2. ntr-un aranjament client/server a. Componentele software DBMS ruleaza pe server b. Componentele software DBMS ruleaza pe client c. Componentele software ale clientului SQL ruleaza pe client d. Componentele software ale clientului SQL ruleaza pe server 3. Un client SQL in linia de comanda a. Necesita un sistem bazat pe ferestre b. Ruleaza pe o mare varietate de platforme client. c. Necesita un browser web pe client. d. Afieaz datele i opiunile de comand folosind caracteristici grafice e. Afieaz rspunsurile la comenzi sub form de mesaje de tip text

4. Un client SQL cu interfata grafica (GUI) a. Necesita un sistem bazat pe ferestre b. Ruleaza pe o mare varietate de platforme client. c. Necesita un browser web pe client. d. Afieaz datele i opiunile de comand folosind caracteristici grafice e. Afieaz rspunsurile la comenzi sub form de mesaje de tip text 5. Un client SQL bazat pe web a. Necesita un sistem bazat pe ferestre b. Ruleaza pe o mare varietate de platforme client. c. Necesita un browser web pe client. d. Afieaz datele i opiunile de comand folosind caracteristici grafice e. Afieaz rspunsurile la comenzi sub form de mesaje de tip text 6. Clienii SQL oferii de Oracle sunt a. iSQL b. Query Analyzer c. iSQL*Plus d. SQL*Plus e. SQLWorksheet 7. Clienii SQL oferii de Microsoft sunt a. iSQL b. Query Analyzer c. iSQL*Plus d. SQL*Plus e. SQLWorksheet 8. Extensiile SQL create de furnizori a. Cresc portabilitatea codului SQL b. Scad portabilitatea codului SQL c. Contribuie la diferenierea produselor oferire de diferii productori d. Au fost bazate pe cererile pieei e. Sunt compatibile ntre implementrile diferiilor productori 9. Instruciunile SQL a. ncep cu un cuvnt cheie reprezentnd o comand b. Se termin cu un cuvnt cheie reprezentnd o comand c. ncep cu un delimitator, cum ar fi caracterul punct i virgul d. Se termin un delimitator, cum ar fi caracterul punct i virgul e. ncep cu o parantez deschis 10. Elementele limbajului SQL includ a. Cuvinte cheie b. Nume ale obiectelor din baza de date c. Operatori

d. Restricii e. Constante 11. Elementele limbajului SQL sunt separate prin a. Virgule b. Exact un spaiu c. Unul sau mai multe spaii d. Linie nou e. Liniue de subliniere 12. Numele obiectelor bazei de date pot include a. Paranteze b. Liniue de subliniere c. Numere d. Litere e. Virgule 13. Instruciunile SQL pot li mprite n urmtoarele categorii a. Limbajul dc definire a datelor (DDI, - Data Definition Language) b. Limbajul dc selectare a datelor (DSL - Dala Selection Language) c. Limbajul dc replicare a datelor (DRL - Dala Replication Language) d. Limbajul pentru controlul datelor (DCL - Data Control Language) e. Limbajul dc manipulare a datelor (DML - Data Manipulation Language) Limbajul de definire a datelor (DDL - Data Definition Language) include urmtoarele instruciuni: a. SELECT b. INSERT c. CREATE d. ALTER e. DELETE Limbajul de interogare a datelor (DQL - Data Query Language) include urmtoarele instruciuni: a. SELECT b. INSERT c. CREATE d. ALTER e. DELETE 16. Limbajul de manipulare a datelor (DML - Data Manipulation Language) include urmtoarele instruciuni: a. SELECT b. INSERT c. CREATE d. UPDATE e. DELETE 15. 14.

Limbajul de definire a datelor - DDL


Alegei rspunsurile corecte pentru fiecare din urmtoarele ntrebri cu rspunsuri multiple. Reinei c ntrebrile pot avea mai multe rspunsuri corecte. 1. Tipurile de date ofer urmtoarele avantaje a. Respect standardele publicate b. Ofer un set de comportamente utile pentru utilizatorii bazei c. Asigur independena fa de date d. Restricioneaz datele din coloane la caractere care au sens n context e. Ajut sistemul DBMS s stocheze mai eficient datele din coloane 2. Tipurile de date pentru caractere a. Sunt mai flexibile dect tipurile de date numerice b. Accept att date cu lungime fix, ct i date cu lungime variabil. c. Necesit ntotdeauna specificarea preciziei i a scalei d. Determin completarea coloanelor pn la lungimea maxim maxim e. Pot stoca iruri de caractere n format specific unei limbi naionale 3. Tipurile de date numerice a. Sunt mai flexibile dect tipurile de date pentru caractere b. Restricioneaz valorile din coloane la numere i simboluri nrudite, cum ar fi virgulele i simbolul dolar c. Necesit ntotdeauna specificarea preciziei i a scalei d. Stocheaz valori exacte sau aproximative e. Sunt potrivite pentru a fi folosite n calcule 4. Tipurile numerice standard includ a. INTEGER b. NUMBER c. FLOAT d. BOOLEAN e. INTERVAL 5. Tipurile de date temporale standard includ a. DATETIME b. DATE c. TIMESTAMP d. TIMEZONE e. TIME 6. Valorile NULL a. Pot fi folosite pentru reprezentarea datelor care lipsesc sau nu sunt cunoscute b. nseam acelai lucru ca i spaiile libere c. Sunt egale cu alte valori NULL d. Nu sunt egale cu alte valori NULL e. Sunt ntotdeauna permise n mod prestabilit 7. Instruciunile DDL includ a. CREATE

b. ALTER c. DELETE d. INSERT e. UPDATE 8. Instruciunea CREATE DATABASE a. Funcioneaz exact la fel n toate sistemele DBMS relaionale b. Specifie ntotdeauna numele bazei de date c. Specifie ntotdeauna numele proprietarului bazei de date d. Poate include parametri specifici productorului e. Funcioneaz la fel cu instruciunea CREATE SCHEMA 9. Definiia unei coloane din instruciunea CREATE TABLE poate include a. Numele tabelului b. Numele coloanei c. restricie la nivel de tabel d. clauz DEFAULT e. O clauz NULL sau NOT NULL 10. Numele unei coloane dintr-un tabel a. Trebuie s fie specificat n instruciunea CREATE TABLE b. Trebuie s fie unic n cadrul bazei de date c. Trebuie s fie unic n cadrul tabelului d. Poate fi folosit ntr-un singur index e. Trebuie s fie specificat n instruciunea ALTER TABLE 11. O restricie la nivel de coloan a. Poate referi una sau mai multe coloane b. Poate fi inclus ntr-o instruciune CREATE TABLE sau ALTER TABLE c. Folosete o sintax identic sau aproape identic cu cea a unei restricii de acelai tip la nivel de tabel d. Poate fi folosit oriunde ar putea fi folosit o restricie la nivel de tabel e. Are o sintax care difer de la un tip de restricie la altul 12. Sintaxa corect pentru clauza DEFAULT este a. DEFAULT (precizie, scal) b. DEFAULT [NULL | NOT NULL] c. DEFAULT (expresie) d. DEFAULT (numecoloan) REFERENCES nametabel (nume_coloan.) e. DEFAULT [UNIQUE | PRIMARY KEY] 13. Sintaxa corect pentru o restricie NOT NULL este a. nume_coloan tip--dedate IS NOT NULL b. nume_coloan tipdedate NOT NULL c. DEFAULT [NULL | NOT NULL] d. CREATE NOT NULL INDEX ON nume_coloan e. numecoloan REFERENCES NOT NULL 14. Sintaxa corect pentru o restricie UNIQUE este a. [CONSTRAINT numerestricie] UNIQUE (nume_coloan) b. [CONSTRAINT numerestricie] UNIQUE (nume_tabel) c. DEFAULT UNIQUE (nume_coloan) d. nume_coloan REFERENCES UNIQUE nume_tabel

e. DEFAULT [UNIQUE | PRIMARY KEY] 15. Sintaxa corect pentru o restricie referenial este a. [CONSTRAINT numerestricie] REFERENCES nume_index b. [CONSTRAINT numerestricie] REFERENCES nume_tabel c. FOREIGN KEY nume_coloan REFERENCES nume_tabel (nume_coloan) d. REFERENCES numetabel (nume_coloan) e. nume_coloan REFERENCES UNIQUE nume_tabel 16. Instruciunea CREATE INDEX a. Poate fi folosit pentru crearea restriciilor de unicitate i cheie primar b. Poate include cuvntul cheie UNIQUE c. Trebuie s refere dou sau mai multe nume de coloane d. Poate include cuvintele cheie ASC sau DESC pentru orice coloan e. Poate specifica ordinea ascendent sau descendent pentru una sau mai multe coloane 17. Instructiunea CREATE VIEW a. Stocheaz o interogare n baza de date b. Poate include cuvntul cheie opional CASCADE c. Poate include cuvntul cheie opional OR REPLACE d. Trebuie s conin o comand DMI, valid e. Trebuie s conin o instruciune SELECT valid 18. Utilizrile valide ale instruciunii ALTER TABLE includ a. Adugarea coloanelor b. Modificarea lungimii sau a preciziei coloanelor c. Redenumirea unui tabel d. Eliminarea unei chei primare e. Adugarea unei chei primare 19. O instruciune ALTER TABLE nu poate fi folosit pentru a. Schimbarea tipului de date al unei coloane la un tip numeric dac n coloana respectiv exist date de alt tip b. Redenumirea unei coloane c. Schimbarea unei restricii din NULL n NOT NULL pentru o coloan care conine valori nule d. Eliminarea unei chei exteme care refer o cheie primar e. Eliminarea unei chei primare dac exist chei exteme care refer cheia primar 20. Instruciunea DROP poate fi folosit pentru a terge a. restricie referenial b. Un index c. Un tabel d. O coloan dintr-un tabel e. O vizualizare

Limbajul de interogare a datelor(DQL)


ntrebri i probleme
1. O instruciune SELECT fr o clauz WHERE a. Selecteaz toate coloanele din tabel sau vizualizare b. Returneaz un mesaj de eroare c. Selecteaz toate rndurile din tabel sau vizualizare d. Afieaz numai definiia tabelului sau a vizualizrii e. Scrie ntotdeauna rezultatele ntr-un fiier jurnal 2. n SQL, ordinea rndurilor din rezultatele interogrii a. Este specificat de clauza SORTED BY b. Poate fi ascendent sau descendent pentru orice coloan c. n mod prestabilit este descendent, dac nu se specific o alt ordine d. Este imprevizibil dac nu este specificat in interogare e. Poate fi specificat numai pentru coloanele din setul de rezultate al interogrii 3. Operatorul BETWEEN a. Specific un domeniu de valori care include i capetele b. Poate fi rescris folosind operatorii <= i NOT <= c. Poate fi rescris folosind operatorii <= i >= d. Selecteaz rndurile adugate n tabel ntr-un anumit interval de timp e. Nu este inclus n standardul ISO/ANSI 4. Operatorul LIKE standard a. Folosete semne de ntrebare drept caractere de nlocuire poziionale b. Folosete liniue de subliniere drept caractere de nlocuire poziionale c. Folosete liniue de subliniere drept caractere de nlocuire nepoziionale d. Folosete simboluri procent drept caractere de nlocuire poziionale e. Folosete simboluri procent drept caractere de nlocuire nepoziionale 5. O instruciune SQL care confine o funcie de agregare a. Poate conine i coloane calculate b. Poate conine i coloane obisnuite c. Trebuie s includ o clauz ORDER BY d. Trebuie s includ o clauz GROUP BY e. Nu poate include, n acelai timp, o clauz GROUP BY i o clauz ORDERBY 6. Cnd operatorii AND i OR sunt combinai n aceeai clauz WHERE a. Sistemul SGBD returneaz un mesaj de eroare b. Operatorul AND are prioritate mai mare dect operatorul OR c. Operatorul AND are prioritate mai mic dect operatorul OR d. Parantezele, sunt obligatorii e. Parantezele sunt opionale

7. Sintaxa corect pentru eliminarea valorilor nule din rezultatele interogrii este a. = NULL b. NOT = NULL c. <>NULL d. IS NULL e. IS NOT NULL 8. Funciile SQL standard pentru iruri de caractere includ a. UPPER b. MIDDLE c. LOWER d. SUBSTR e. EXISTS 9. Funciile, SQL matematice standard includ a. LENGTH b. ROUND c. CAST d. MIN e. ABS 10. Operatorul UNION a. Elimin rndurile duplicate din setul de rezultate b. Include rndurile duplicate n setul de rezultate c. Combin dou interogri ntr-o singur interogare de tip join d. Combin seturile de rezultate a dou interogri ntr-un singur set de rezultate e. Este numit JOIN n unele implementri SQL Scriei instruciunile SQL pentru urmtoarele probleme 1. Gsii toate filmele din tabelul FILM pentru care MPAA_COD_INCHIRIERE are alt valoare dect R". 2. Afiai titlurile i preurile tuturor filmelor pentru care PRET_VANZARE_DVD este cel puin 19.99, dar nu mai mare de 29.99, ordonate cresctor dup pre. 3. Afiai toate filmele pentru care genul (COD_GEN_FILM) este Comdy i categoria MPAA (MPAA _COD_INCHIRIERE) este PG-13, mpreun cu filmele pentru care genul este Drama i categoria este R. 4. 14. Cte nchirieri (tabelul FILM_INCHIRIAT) nu au nici o valoare n coloana LATE_OR_LOSS_FEE? 5. Cte persoane au un nume de familie (NUME_FAMILIE_PERSOANA) care conine litera a", majuscul sau minuscul? 6. Afiai toate titlurile de filme care conin cuvntul the", cu sau fr liter mare.

7. Folosii funcia SUM pentru a afla totalul valorilor din coloana PLATA_INCHIRIAT din tabelul FILM_INCHIRIAT. 8. Afiai primele cinci caractere din numele de familie (NUME_FAMILIE_PERSOANA) din tabelul PERSOANA, dar eliminai toate valorile duplicate din setul de rezultate? 9. Din tabelul FILM, afiai toate genurile (COD_GEN_FILM), mpreun cu media preurilor pentru DVD (PRET_VANZARE_DVD) pentru fiecare gen, rotunjit la dou poziii zecimale. 10. Afiai toate filmele (ID_FILM) care au fost nchiriate (tabelul FILM_INCHIRIAT), cu suma total strns din taxele de nchiriere (PLATA_INCHIRIAT) sau taxele de ntrziere sau pierdere (PLATA_PENALIZARE) pentru filmul respectiv. Sugestie: adunai valorile PLATA_INCHIRIAT i PLATA_PENALIZARE, apoi nsumai (SUM) rezultatul respectiv pentru fiecare valoare ID_FILM. Unele valori din coloana PLATA_PENALIZARE sunt nule, aa c, dac nu avei o funcie care s nlocuiasc valorile nule cu o alt valoare (zero, n acest caz), vei obine valori nule n rezultate. n Oracle, funcia se numete NVL, n Microsoft SQL Server se numete ISNULL, iar n MySQL se numete IFNULL. (Se pare c nu exist o funcie echivalent n D132).

Combinarea datelor din mai multe tabele ntrebri i probleme


l. O subinterogare a. Poate fi folosit pentru a selecta valorile care vor fi aplicate condiiilor din clauza WHERE b. Poate fi corelat sau necorelat c. Reprezint o cale puternic de calculare a coloanelor d. Trebuie s nu fie ncadrate n paranteze e. Permite selectarea flexibil a rndurilor 2. O uniune (join) fr o clauz WHERE sau o clauz JOIN Are ca rezultat un mesaj de eroare Nu returneaz nici un rnd din setul de rezultate Reprezint o uniune extern (outer join) Reprezint o uniune intern (inner join) Are ca rezultat un produs cartezian

a. b. c. d. e.

3. O uniune extern (outer join) a. Poate fi scris n Oracle SQL folosind un simbol (+) n clauza FROM b. Poate fi scris n Microsoft SQL Server folosind operatorul = sau =* n clauza WHERE c. Returneaz toate rndurile doar din unul dintre tabele d. Returneaz toate rndurile din unul sau din ambele tabele

e. Poate fi catre stnga, ctre dreapta sau complet 4. O auto-uniune (self join) a. Nu poate avea niciodat ca rezultat un produs cartezian b. Poate fi o uniune intern sau o uniune extern c. Rezolv relaiile recursive d. Poate folosi o subinterogare pentru a limita i mai mult rndurile selectate e. Implic dou tabele diferite 5. O uniune (Join) a. Combin coloanele din dou sau mai multe tabele n rezultatele unei singure interogri b. Combin rnduri din interogari multiple ntr-un singur set de rezultate c. Este realizat ori de cte ori n clauza FROM sunt specificate mai multe tabele d. Necesit folosirea unei clauze JOIN e. Necesit o list de tabele separate prin virgule n clauza FROM 6. a. b. c. d. e. O uniune de egalitate (equijoin) Este cunoscut i sub numele de uniune extern (outerjoin) Este cunoscut i sub numele de uniune intern (innerjoiti) Este cunoscut i sub numele de auto-uniune (selfjoin) Realizeaz ntotdeauna legarea rndurilor folosind o condiie de egalitate (=) Realizeaz ntotdeauna legarea rndurilor folosind o condiie de inegalitate (<>)

7. Calificatorii numelor de coloane: a. Pot fi nume de tabele b. Pot fi numere care indic poziia relativ a tabelelor dn lista FORM c. Pot fi pseudonime pentru numele de coloane , definite n clauza FORM d. Pot fi pseudonime pentru numele de tabele, definite n clauza FORM 8, O uniune ncruiat este: a. O uniune Natural b. N produs cartezian c. O uniune extern d. O uniune Intern 9. O clauz JOIN folosind cuvntul cheie USING a. Nu poate fi folosit atunci cnd coloanele prin care se face legarea tabelelor au nume diferite b. Nu poate fi folosit atunci cnd coloanele prin care se face legarea tabelelor au aceleai nume c. Definete o uniune intern d. Definete o uniune extern e. Definete o auto-uniune

10. a. b. c. d. e.

O subinterogare corelat Ruleaz mai eficient dect o subinterogare necorelat Ruleaz mai puin eficient dect o subinterogare necorelat Are o interogare intern care refera coloane din interogarea extern Are o interogare extern care refera coloane din interogarea intern Are o interogare intern care nu face nici o referire la coloanele din interogarea extern

Scriei instruciunile SQL pentru urmtoarele probleme:


Afiai numele i identificatorul de client ale tuturor persoanelor decedate (valoarea DATA_MORTII nu este nul) care nc au conturi de client. 2. Afiai numele angajatilor care au conturi de clieni. Folosii uniuni pentru a stabili ce clieni sunt angajai i ce angajai au conturi de clieni. 3. Rescriei interogarea anterioar pentru a folosi subinterogri n loc de uniuni. 4. Afiai numele de familie al fiecarui angajat, mpreun cu numele de familie al efu1ui lor. 5. Afiai numrul de nchirieri pentru fiecare format (DVD i VHS). 6. Afiai numrul de identificare (FILM_ID) i data la care trebuie returnate (DATA_RETURNARII) pentru toate filmele nchiriate i nc nereturnate (coloan RETURNAT_DATA din tabelul FILM_INCH conine valori nule), dar care nu au fost cumprate (coloan DATA_VANZARII din tabelul FILM_COPY conine valori nule). 7. Afiai numarul de identificare i titlul filmelor care nu au fost nchiriate niciodat. 8. Folosind subinterogri pentru a filtra rndurile. Afiai titlul filmelor pentru care n inventar exist o copie VHS (MEDIA_FORMAT = V, iar DATA_VANZARII are valoarea NULL) dar pentru care nu exist copii DVD (MEDIA_FORMAT = D ). 9. Rescriei interogarea anterioar folosind o uniune n local unei subinterogri pentru a gsi filmele n format VHS. 10. Afiai toate filmele pentru care n inventar exist mai multe copii n acelai format. 1.

interogrilor avansate
ntrebri i Probleme
1. Funciile SQL a. Returneaz un set de valori b. Returneaz o singur valoare c. Pot fi folosite n clauza WHERE a unei instruciuni SQL d. Pot fi folosite ca pseudonime pentru numele tabelelor intr-o instr. SQL e. Pot fi folosite n lista de coloane a unei instruciuni SQL 2. Funcia REPLACE a. nlocuiete un nume de tabel cu un nume de vizualizare b. nlocuiete numele unei coloane cu pseudonimul coloanei

3.

4.

5.

6.

7.

nlocuiete un ir de caractere dintr-o coloan cu un alt ir de caractere nlocuiete toate valorile dintr-o coloan cu un alt set de valori nlocuiete toate rndurile dintr-o vizualizare cu rnduri coninnd date dintrun alt tabel Funcia LTRIM a. Elimin spaiile de la sfritul irurilor de caractere b. Elimin spaiile de la nceputul irurilor de caractere c. Poate fi imbricat cu alte funcii d. nlocuiete valorile nule cu alte valori n irurile de caractere e. Elimin spaiile de la nceputul i de la sfritul irurilor de caractere Funcia CHAR a. Este numit CHR n unele implementri SQL b. Este identic cu funcia ASCII n unele implementri SQL c. Returneaz valoarea corespunztoare unui caracter din setul de caractere ASCII d. Returneaz caracterul corespunztor unei valori e. Transform o valoare numeric ntr-un ir de caractere Funcia SIGN a. Returneaz -l daca parametrul furnizat are valoare negativa b. Returneaz 0 dac parametrul furnizat are valoarea zero c. Returneaz +1 dac parametrul furnizat are o valoare pozitiv d. Returneaz 0 dac parametrul furnizat are valoarea NULL e. Returneaz o valoare nul dac parametrul furnizat nu este un numr Funcia CEILING a. Rotunjete un numr prin adugire pn la primul numr ntreg b. Rotunjete un numr prin scdere pn la primul numr ntreg c. Returneaz ntotdeauna un numr ntreg d. Returneaz un numr ntreg sau o valoare nul e. Este numit CEIL n unele implementri SQL Funcia FLOOR a. Rotunjete un numr prin adugire pn la primul numr ntreg b. Rotunjete un numr prin scdere pn la primul numr ntreg c. Returneaz ntotdeauna un numr ntreg d. Returneaz un numr ntreg sau o valoare nul e. Este numit FLR n unele implementri SQL

c. d. e.

8. Expresiile CASE a. Permit executarea condiional a clauzelor dintr-o instruciune SQL b. Exist sub dou forme, respectiv statice i dinamice c. Exista sub dou forme, respectiv cu cutare i fara cautare d. Exist sub dou forme, respectiv simple i cu cautare e. Exist sub dou forme, respectiv standard i cu cautare Scriei instruciunile SQL pentru urmtoarele probleme: 1. Afiai valorile MPAA_RATING_COD din tabelul MPAA_RATING, cu liniuele de desprire nlocuite cu spaii.

2. Folosind funcia CHAR (numit CHR n Oracle), afiai valorile FILM_ID i FILM_TITLU pentru toate filmele care conin apostrofuri (caracterul ASCII 39) n titlu. 3. Aflai valoarea ASCII a semnului de exclamare (!). 4. Aflai preul mediu al filmelor n format DVD (coloana RETAIL_PRET _DVD din tabelul FILM), cu media calculat rotunjit prin adugire la cea mai apropiat sum fr zecimale. 5. Aflai preul mediu al filmelor n format VHS (coloana RETAIL_PRET_VHS din tabelul FILM), cu media calculat rotunjit prin scdere la cea mai apropiat sum fr zecimale. 6. Pentru o baz de date Oracle, generai comenzile SQL pentru eliminarea tuturor restriciilor refereniale aflate n proprietatea utilizatorului curent. Vizualizarea Oracle de tip catalog se numete USER_CONSTRAINTS, iar restriciile refereniale au valoarea 'R' n coloana CONSTRAINT_TYPE. Numele tabelului pe care se bazeaz restricia se afl n coloana TABLE_NAME a vizualizrii. Nu uitai c trebuie s folosii comanda ALTER TABLE pentru eliminarea unei restricii. 7. Pentru o baz de date Microsoft SQL Server, afiai toate restriciile de tip cheie extern. Folosii tabelul de sistem SYSOBJECTS, n care NAME este numele restriciei, iar coloana XTYPE are valoarea 'F' pentru restriciile de tip cheie extern. 8. Scriei o instruciune SQL care afieaz fiecare cont de client (CLIENT_CONT_ID) cu un ir de caractere bazat pe valoarea coloanei COPIL_INCH_ALLOWED_INDIC, care s conin textul Poate fi inchiriat de copii" dac valoarea coloanei este 'Y' i textul Nu poate fi inchiriat de copii" dac valoarea este 'N'. Sugestie: Cel mai bine funcioneaz n acest caz o expresie CASE simpl. 9. Scriei o instruciune SQL care afieaz fiecare film (FILM_ID) i o valoare pentru deceniu, n funcie de valoarea coloanei ANUL_PRODUCERII sau necunoscut), n acest caz v-ar fi de folos o expresie CASE cu cautare. 10. Scriei o instruciune SQL care afieaz fiecare inchiriere a unui film (tabelul FILM_INCH) cu valoarea TAXA_PENALIZAREclasificaa astfel: None (valoare nul sau zero), Minor (valoare < 10) sau Major (valoare > 10) .

Limbajul de manipulare a datelor DML


ntrebri i probleme
1. Limbajul DML include urmtoarele comenzi SQL: a. INSERT b. REMOVE c. UPDATE d. SELECT e. DROP

2. O instruciune DML poate referi a. Coloane din mai multe tabele b. Coloane dintr-un singur tabel c. O vizualizare care conine coloane dintr-un singur tabel d. Coloane ale unei vizualizri bazate pe un singur tabel e. Coloane ale unei vizualizri bazate pe mai multe tabele 3. La formarea unei instruciuni DML, trebuie s tineti seama de urmtoarele restricii a. Restricii refereniale b. Restricii de securitate c. Restricii NOT NULL d. Restricii de unicitate e. Restricii cheie primar 4. O instruciune INSERT cu o clauz VALUES a. Trebuie s aib o list de coloane b. Trebuie s aib o list de valori c. Poate insera rnduri multiple la o singur rulare d. Poate folosi cuvntul cheie NULL pentru a atribui valori nule coloanelor e. Poate include o clauz WHERE 5. O instruciune INSERT cu o comand SELECT imbricat este util pentru a. Gsirea urmtoarei valori pentru o cheie primar atribuit secvenial b. Mutarea rndurilor dintr-un tabel n altul c. Popularea unui tabel de test cu date dintr-un alt tabel d. Eliminarea rndurilor duplicate dintr-un tabel e. Inserarea mai multor rnduri ntr-un tabel cu o singur instruciune 6. O instruciune INSERT cu o comand SELECT imbricat a. Trebuie s aib dou liste de coloane, una n clauza INSERT i una n b. Trebuie s aib o instruciune SELECT intern care retumeaz un singur rnd de date c. Poate folosi cuvntul cheie NULL pentru a atribui valori nule coloanelor d. Poate include o clauz WHERE e. Trebuie s aib n instruciunea SELECT intern o list de coloane care corespunde cu lista de coloane din clauza INSERT sau cu coloanele din tabelul n care sunt inserate datele 7. O instruciune UPDATE fr o clauz WHERE a. Actualizeaz toate rndurile din tabel cu valori nule b. ncearc s actualizeze toate rndurile din tabel c. Eueaz i returneaz o eroare d. terge toate rndurile din tabel e. Are ca rezultat un produs cartezian

8. O instruciune DELETE fr o clauz WHERE a. Actualizeaz toate rndurile din tabel cu valori nule b. Eueaz si returneaz o eroare c. ncearc s tearg toate rndurile din tabel d. Are ca rezultat un produs cartezian e. Trebuie s includ o list de coloane 9. O instruciune UPDATE a. Trebuie s includ o clauz SET b. Trebuie s furnizeze o nou valoare pentru cel puin o coloan c. Trebuie s includ o clauz WHERE d. Poate atribui unei coloane valoarea unei alte coloane e. Poate atribui unei coloane o list de valori derivate dintr-o expresie 10. O instruciune DELETE a. Poate include o list opional de coloane b. Poate include o clauz WHERE opional c. Poate folosi cuvntul cheie FORCE pentru a fora tergerea rndurilor d. Nu poate nclca restriciile refereniale ale tabelului e. Poate avea o instruciune SELECT intern, ca parte a clauzei WHERE 11. Clauza SET dintr-o instruciune UPDATE poate atribui unei coloane o valoare care este a. O constant b. Numele unei alte coloane c. O list de valori d. Orice expresie din care rezult o singur valoare e. Cuvntul cheie NULL 12. Instruciunea SELECT intern a unei instruciuni INSERT poate include a. O clauz WHERE b. O clauz GROUP BY c. Una sau mai multe funcii de agregare d. O uniune a mai multor tabele e. O clauz UNION Scriei instruciuni SQL pentru urmtoarele probleme 13. Folosind o instruciune INSERT cu o clauz VALUES, dar fr list de coloane, inserai n tabelul FILM_GENRE un nou rnd, cu valorile FILM_COD_GEN = TRAIN' i FILM_DESCRIERE_GEN = Training'. 14. Folosind o instruciune INSERT cu o clauz VALUES si o list de coloane, inserai n tabelul FILM un nou rnd, cu urmtoarele valori pentru date:

FILM_ID: FILM_COD_GEN: MPAA_COD_RATING: FILM_NUME:

99 'TRAIN' NR ANGAJAT Training Video

15. Folosind o instruciune INSERT cu o instruciune SELECT intern, inserai n tabelul FILM_LIMBA un rnd pentru limba japonez (COD_LIMBA = 'ja'), asociat cu toate filmele din tabelul FILM. (n prezent, tabelul FILM_LIMBA nu conine nici un rnd pentru limba japonez.) 16. Creai un tabel, numit TOTAL_INCHIRIERE, folosind instruciunea CREATE de mai jos. Folosind o instruciune INSERT cu o instruciune SELECT intern, inserai n tabelul TOTAL_INCHIRIEREun rnd pentru fiecare film din tabelul FILM INCHIRIERE, coninnd numrul total de nchirieri i suma total obinut din nchirierea filmului respectiv. CREATE TABLE TOTAL_INCHIRIERE (FILM_ID INTEGER NOT NULL, NUMBER_OF_INCHIRIERES INTEGER NOT NULL, TOTAL_COST_INCHIRIERES NUMERIC (7, 2) NOT NULL); 17. tergei toate rndurile din tabelul INCHIRIERE TOTAL. 18.tergei rndurile pentru limba japonez, create la ntrebarea 15. 19. Copia 1 a filmului 1 (FILM_ID = 1, NUMAR_COPIE = 1) a fost vndut pe data de 15 ianuarie 2005. actualizai rndul respectiv din tabelul FILM_COPII. 20. Actualizai tabelul FILM astfel nct s cretei cu 10 procente toate preurile pentru formatul VHS (RETAIL_PRET_VHS) care nu conin valori nule.

Partea I Concepte despre bazele de date relationale. Normalizare "1. SQL este a. Un limbaj realizat de Dr. E. F. Codd b. Un limbaj folosit pentru comunicarea cu bazele de date relationale c. Un limbaj folosit pentru definirea diagramelor ERD d. Folosit pentru definirea si modificarea obiectelor unei baze de date e. Folosit pentru definirea paginilor web" Raspuns B, D "2. O baza de date este a. O structura denumita de date, cum ar fi un tabel, o vizualizare sau unindex b. Un produs software furnizat de un producator de baze de date c. O colectie de date interrelationate gestionate ca o singura unitate d. Definita n acelasi mod de toti producatorii de software e. Implementata diferit de diferiti producatori" Raspuns C, E "3. Un sistem de gestionare a bazelor de date este a. O structura, cum ar fi un tabel, o vizualizare sau un index b. O colectie de date interrelationate gestionate ca o singura unitate c. Un produs software furnizat de un producator de baze de date d. Deseori abreviat sub forma DBMS e. O structura denumita de date, cum ar fi un tabel, o vizualizare sau un index" C,D "4. Exemple de sisteme RDBMS sunt a. EXCEL b. MySQL c. PostgreSQL d. Oracle Database e. Microsoft SQL Server" B,C,D,E "5. Componentele unei baze de date relationale includ a. Relatii b. Tabele c. Vizualizari de utilizator d. Diagrame ERD e. Restrictii" A,B,E "6. Printre tipurile de restrictii care pot fi folosite n bazele de date se numara a. NOT NULL b. Relatie c. Cheie primara d. CHECK e. Unicitate" A,C,D,E "7. Scopul normalizarii este de a rezolva urmatoarele probleme a. Anomalia de inserare b. Performante reduse c. Anomalia de creare d. Anomalia de stergere e. Anomalia de actualizare" A,D,E "8. Procesul de normalizare a. ncepe de la tabele, pentru a ajuta proiectantii sa descopere vizualizarile de utilizator b. A fost dezvoltat de Dr. E. F. Codd c. A fost dezvoltat de Oracle d. Este aplicat sistematic fiecarei vizualizari de utilizator"

B,D "9. Un identificator unic(cheie) a. Trebuie determinat naitea procesului de normalizare b. Poate fi compus dintr-un singur atribut c. Poate fi compus din zero sau mai multe atribute d. Poate fi compus din mai multe atribute concatenate" A,D "10. Prima forma normala rezolva anomaliile cauzate de a. Dependentele partiale de cheia primara b. Grupurile repetitive c. Dependentele tranzitive d. Atributele multivaloare e. Relatiile de tip unu-la-mai-multi" B,D "11. A doua forma normala rezolva anomaliile cauzate de a. Dependentele partiale de cheia primara b. Grupurile repetitive c. Dependentele tranzitive d. Atributele multi valoare e. Relatiile de tip unu-la-mai-multi" A "12. A treia forma normala rezolva anomaliile cauzate de a. Dependentele partiale de cheia primara b. Grupurile repetitive c. Dependentele tranzitive d. Atributele multivaloare e. Relatiile de tip unu-la-mai-multi" C "13. Pentru aducerea n prima forma normala a unei relatii ne-normalizate a. Atributele care depind doar de o parte a cheii sunt eliminate b. Atributele multivaloare sunt mutate ntr-o noua relatie c. Atributele care sunt dependente tranzitiv sunt eliminate d. Grupurile repetitive sunt mutate ntr-o noua relatie e. Identificatorul unic al relatiei originale este copiat n noua relatie" B,D,E "14. Problemele de dependenta partiala a. Sunt rezolvate de FN2 b. Sunt rezolvate de FN3 c. Pot aparea n relatiile cu chei primare concatenate d. Apar cand un atribut non-cheie depinde doar de o parte a cheii primare e. Apar cand un atribut non-cheie depinde de un alt atribut non-cheie" A, C, D Partea a_III_a SQL "1. SQL este a. Un limbaj orientat spre obiecte b. Un limbaj procedural c. Un limbaj nonprocedural d. Un limbaj declarativ e. Un limbaj standard" C,D,E "2. ntr-un aranjament client/server a. Componentele software DBMS ruleaza pe server b. Componentele software DBMS ruleaza pe client c. Componentele software ale clientului SQL ruleaza pe client d. Componentele software ale clientului SQL ruleaza pe server" A,C,D

"3. Un client SQL in linia de comanda a. Necesita un sistem bazat pe ferestre b. Ruleaza pe o mare varietate de platforme client. c. Necesita un browser web pe client. d. Afiseaza datele si optiunile de comanda folosind caracteristici grafice e. Afiseaza raspunsurile la comenzi sub forma de mesaje de tip text" B,E "4. Un client SQL cu interfata grafica (GUI) a. Necesita un sistem bazat pe ferestre b. Ruleaza pe o mare varietate de platforme client. c. Necesita un browser web pe client. d. Afiseaza datele si optiunile de comanda folosind caracteristici grafice e. Afiseaza raspunsurile la comenzi sub forma de mesaje de tip text" A,D "5. Un client SQL bazat pe web a. Necesita un sistem bazat pe ferestre b. Ruleaza pe o mare varietate de platforme client. c. Necesita un browser web pe client. d. Afiseaza datele si optiunile de comanda folosind caracteristici grafice e. Afiseaza raspunsurile la comenzi sub forma de mesaje de tip text" B,C,D "6. Clientii SQL oferiti de Oracle sunt a. iSQL b. Query Analyzer c. iSQL*Plus d. SQL*Plus e. SQLWorksheet" C,D,E "7. Clientii SQL oferiti de Microsoft sunt a. iSQL b. Query Analyzer c. iSQL*Plus d. SQL*Plus e. SQLWorksheet" A,B "8. Extensiile SQL create de furnizori a. Cresc portabilitatea codului SQL b. Scad portabilitatea codului SQL c. Contribuie la diferentierea produselor oferire de diferiti producatori d. Au fost bazate pe cererile pietei e. Sunt compatibile ntre implementarile diferitilor producatori" B, C, D "9. Instructiunile SQL a. ncep cu un cuvnt cheie reprezentnd o comanda b. Se termina cu un cuvnt cheie reprezentnd o comanda c. ncep cu un delimitator, cum ar fi caracterul punct si virgula d. Se termina un delimitator, cum ar fi caracterul punct si virgula e. ncep cu o paranteza deschisa" A,D "10. Elementele limbajului SQL includ a. Cuvinte cheie b. Nume ale obiectelor din baza de date c. Operatori d. Restrictii e. Constante" A,B,C,E

"11. Elementele limbajului SQL sunt separate prin a. Virgule b. Exact un spatiu c. Unul sau mai multe spatii d. Linie noua e. Liniute de subliniere" C "12. Numele obiectelor bazei de date pot include a. Paranteze b. Liniute de subliniere c. Numere d. Litere e. Virgule" B,C,D "13. Instructiunile SQL pot li mpartite n urmatoarele categorii a. Limbajul dc definire a datelor (DDl, - Data Definition Language) b. Limbajul dc selectare a datelor (DSL - Dala Selection Language) c. Limbajul dc replicare a datelor (DRL - Dala Replication Language) d. Limbajul pentru controlul datelor (DCL - Data Control Language) e. Limbajul dc manipulare a datelor (DML - Data Manipulation Language)" A,D,E "14. Limbajul de definire a datelor (DDL-Data Definition Language) include urm. instructiuni: a. SELECT b. INSERT c. CREATE d. ALTER e. DELETE" C,D "15. Limbajul de interogare a datelor (DQL - Data Query Language) include urm. instructiuni: a. SELECT b. INSERT c. CREATE d. ALTER e. DELETE" A "16. Limbajul de manipulare a datelor (DML-Data Manipulation Language) include instructiuni: a. SELECT b. INSERT c. CREATE d. UPDATE e. DELETE" B,D,E Limbajul de definire a datelor - DDL "1. Tipurile de date ofera urmatoarele avantaje a. Respecta standardele publicate b. Ofera un set de comportamente utile pentru utilizatorii bazei c. Asigura independenta fata de date d. Restrictioneaza datele din coloane la caractere care au sens n context e. Ajuta sistemul DBMS sa stocheze mai eficient datele din coloane" B,D,E

"2. Tipurile de date pentru caractere a. Sunt mai flexibile dect tipurile de date numerice b. Accepta att date cu lungime fixa, ct si date cu lungime variabila. c. Necesita ntotdeauna specificarea preciziei si a scalei d. Determina completarea coloanelor pna la lungimea maxima maxima e. Pot stoca siruri de caractere n format specific unei limbi nationale" A,B,E "3. Tipurile de date numerice a. Sunt mai flexibile dect tipurile de date pentru caractere b. Restrictioneaza valorile din coloane la numere si simboluri nrudite, cum ar fi virgulele si simbolul dolar c. Necesita ntotdeauna specificarea preciziei si a scalei d. Stocheaza valori exacte sau aproximative e. Sunt potrivite pentru a fi folosite n calcule" D,E "4. Tipurile numerice standard includ a. INTEGER b. NUMBER c. FLOAT d. BOOLEAN e. INTERVAL" A, C "5. Tipurile de date temporale standard includ a. DATETIME b. DATE c. TIMESTAMP d. TIMEZONE e. TIME" B,C,E "6. Valorile NULL a. Pot fi folosite pentru reprezentarea datelor care lipsesc sau nu sunt cunoscute b. nseama acelasi lucru ca si spaNiile libere c. Sunt egale cu alte valori NULL d. Nu sunt egale cu alte valori NULL e. Sunt ntotdeauna permise n mod prestabilit" A,D "7. Instructiunile DDL includ a. CREATE b. ALTER c. DELETE d. INSERT e. UPDATE" A,B "8. Instructiunea CREATE DATABASE a. Functioneaza exact la fel n toate sistemele DBMS relationale b. Specifiea ntotdeauna numele bazei de date c. Specifiea ntotdeauna numele proprietarului bazei de date d. Poate include parametri specifici producatorului e. Functioneaza la fel cu instructiunea CREATE SCHEMA" B,D "9. Definitia unei coloane din instructiunea CREATE TABLE poate include a. Numele tabelului b. Numele coloanei c. restrictie la nivel de tabel d. clauza DEFAULT e. O clauza NULL sau NOT NULL"

B,D,E "10. Numele unei coloane dintr-un tabel a. Trebuie sa fie specificat n instructiunea CREATE TABLE b. Trebuie sa fie unic n cadrul bazei de date c. Trebuie sa fie unic n cadrul tabelului d. Poate fi folosit ntr-un singur index e. Trebuie sa fie specificat n instructiunea ALTER TABLE" A,C "11. O restrictie la nivel de coloana a. Poate referi una sau mai multe coloane b. Poate fi inclusa ntr-o instructiune CREATE TABLE sau ALTER TABLE c. Foloseste o sintaxa identica sau aproape identica cu cea a unei restrictii de acelasi tip la nivel de tabel d. Poate fi folosita oriunde ar putea fi folosita o restrictie la nivel de tabel e. Are o sintaxa care difera de la un tip de restrictie la altul" B,C "12. Sintaxa corecta pentru clauza DEFAULT este a. DEFAULT (precizie, scala) b. DEFAULT [NULL | NOT NULL] c. DEFAULT (expresie) d. DEFAULT (numecoloana) REFERENCES nametabel (nume_coloana.) e. DEFAULT [UNIQUE | PRIMARY KEY]" C "13. Sintaxa corecta pentru o restrictie NOT NULL este a. nume_coloana tip--dedate IS NOT NULL b. nume_coloana tipdedate NOT NULL c. DEFAULT [NULL | NOT NULL] d. CREATE NOT NULL INDEX ON nume_coloana" B "14. Sintaxa corecta pentru o restrictie UNIQUE este a. [CONSTRAINT numerestrictie] UNIQUE (nume_coloana) b. [CONSTRAINT numerestrictie] UNIQUE (nume_tabel) c. DEFAULT UNIQUE (nume_coloana) d. nume_coloana REFERENCES UNIQUE nume_tabel" A "15. Sintaxa corecta pentru o restrictie referentiala este a. [CONSTRAINT numerestrictie] REFERENCES nume_index b. [CONSTRAINT numerestrictie] REFERENCES nume_tabel c. FOREIGN KEY nume_coloana REFERENCES nume_tabel (nume_coloana) d. REFERENCES numetabel (nume_coloana) e. nume_coloana REFERENCES UNIQUE nume_tabel" D "16. Instructiunea CREATE INDEX a. Poate fi folosita pentru crearea restrictiilor de unicitate si cheie primara b. Poate include cuvntul cheie UNIQUE c. Trebuie sa refere doua sau mai multe nume de coloane d. Poate include cuvintele cheie ASC sau DESC pentru orice coloana e. Poate specifica ordinea ascendenta sau descendenta pentru una sau mai multe coloane" B,E "17. Instructiunea CREATE VIEW a. Stocheaza o interogare n baza de date b. Poate include cuvntul cheie optional CASCADE c. Poate include cuvntul cheie optional OR REPLACE d. Trebuie sa contina o comanda DMI, valida e. Trebuie sa contina o instructiune SELECT valida"

A,C,E "18. Utilizarile valide ale instructiunii ALTER TABLE includ a. Adaugarea coloanelor b. Modificarea lungimii sau a preciziei coloanelor c. Redenumirea unui tabel d. Eliminarea unei chei primare e. Adaugarea unei chei primare" A,B,D,E "19. O instructiune ALTER TABLE NU poate fi folosita pentru a. Schimbarea tipului de date al unei coloane la un tip numeric daca n coloana respectiva exista date de alt tip b. Redenumirea unei coloane c. Schimbarea unei restrictii din NULL n NOT NULL pentru o coloana care contine valori nule d. Eliminarea unei chei exteme care refera o cheie primara e. Eliminarea unei chei primare daca exista chei exteme care refera cheia primara" A,C,E "20. Instructiunea DROP poate fi folosita pentru a sterge a. restrictie referentiala b. Un index c. Un tabel d. O coloana dintr-un tabel e. O vizualizare" B,C,E Limbajul de interogare a datelor(DQL) "1. O instructiune SELECT fara o clauza WHERE a. Selecteaza toate coloanele din tabel sau vizualizare b. Returneaza un mesaj de eroare c. Selecteaza toate rndurile din tabel sau vizualizare d. Afiseaza numai definiNia tabelului sau a vizualizarii e. Scrie ntotdeauna rezultatele ntr-un fisier jurnal" C "2. n SQL, ordinea rndurilor din rezultatele interogarii a. Este specificata de clauza SORTED BY b. Poate fi ascendenta sau descendenta pentru orice coloana c. n mod prestabilit este descendenta, daca nu se specifica o alta ordine d. Este imprevizibila daca nu este specificata in interogare e. Poate fi specificata numai pentru coloanele din setul de rezultate al interogarii" BD "3. Operatorul BETWEEN a. Specifica un domeniu de valori care include si capetele b. Poate fi rescris folosind operatorii <= si NOT <= c. Poate fi rescris folosind operatorii <= si >= d. Selecteaza rndurile adaugate n tabel ntr-un anumit interval de timp e. Nu este inclus n standardul ISO/ANSI" A,C "4. Operatorul LIKE standard a. Foloseste semne de ntrebare drept caractere de nlocuire pozitionale b. Foloseste liniute de subliniere drept caractere de nlocuire pozitionale c. Foloseste liniute de subliniere drept caractere de nlocuire nepozitionale d. Foloseste simboluri procent drept caractere de nlocuire pozitionale e. Foloseste simboluri procent drept caractere de nlocuire nepozitionale" B,E

"5. O instructiune SQL care contine o functie de agregare a. Poate contine si coloane calculate b. Poate contine si coloane obisnuite c. Trebuie sa includa o clauza ORDER BY d. Trebuie sa includa o clauza GROUP BY e. Nu poate include, n acelasi timp, o clauza GROUP BY si o clauza ORDER BY" A, B "6. Cnd operatorii AND si OR sunt combinati n aceeasi clauza WHERE a. Sistemul SGBD returneaza un mesaj de eroare b. Operatorul AND are prioritate mai mare dect operatorul OR c. Operatorul AND are prioritate mai mica dect operatorul OR d. Parantezele, sunt obligatorii e. Parantezele sunt optionale" B, E "7. Sintaxa corecta pentru eliminarea valorilor nule din rezultatele interogarii este a. = NULL b. NOT = NULL c. <>NULL d. IS NULL e. IS NOT NULL" E "8. Functiile SQL standard pentru siruri de caractere includ a. UPPER b. MIDDLE c. LOWER d. SUBSTR e. EXISTS" A, C, D "9. Functiile, SQL matematice standard includ a. LENGTH b. ROUND c. CAST d. MIN e. ABS" B,E "10. Operatorul UNION a. Elimina rndurile duplicate din setul de rezultate b. Include rndurile duplicate n setul de rezultate c. Combina doua interogari ntr-o singura interogare de tip join d. Combina seturile de rezultate a doua interogari ntr-un singur set de rezultate e. Este numit JOIN n unele implementari SQL" A, D Combinarea datelor din mai multe tabele "l. O subinterogare a. Poate fi folosita pentru a selecta valorile care vor fi aplicate conditiilor din clauza WHERE b. Poate fi corelata sau necorelata c. Reprezinta o cale puternica de calculare a coloanelor d. Trebuie sa nu fie ncadrate n paranteze e. Permite selectarea flexibila a rndurilor" A,E

"2. O uniune (join) fara o clauza WHERE sau o clauza JOIN a. Are ca rezultat un mesaj de eroare b. Nu returneaza nici un rnd din setul de rezultate c. Reprezinta o uniune externa (outer join) d. Reprezinta o uniune interna (inner join) e. Are ca rezultat un produs cartezian" E "3. O uniune externa (outer join) a. Poate fi scrisa n Oracle SQL folosind un simbol (+) n clauza FROM b. Poate fi scrisa n Microsoft SQL Server folosind operatorul *= sau =* n clauza WHERE c. Returneaza toate rndurile doar din unul dintre tabele d. Returneaza toate rndurile din unul sau din ambele tabele e. Poate fi catre stnga, catre dreapta sau completa (outer join)" a. Poate fi scrisa n Oracle SQL folosind un simbol (+) n clauza FROM B,D,E "4. O auto-uniune (self join) a. Nu poate avea niciodata ca rezultat un produs cartezian b. Poate fi o uniune interna sau o uniune externa c. Rezolva relatiile recursive d. Poate folosi o subinterogare pentru a limita si mai mult rndurile selectate e. Implica doua tabele diferite" B,C,D "5. O uniune (Join) a. Combina coloanele din doua sau mai multe tabele n rezultatele unei singure interogari b. Combina rnduri din interogari multiple ntr-un singur set de rezultate c. Este realizata ori de cte ori n clauza FROM sunt specificate mai multe tabele d. Necesita folosirea unei clauze JOIN e. Necesita o lista de tabele separate prin virgule n clauza FROM" A, C "6. O uniune de egalitate (equijoin) a. Este cunoscuta si sub numele de uniune externa (outerjoin) b. Este cunoscuta si sub numele de uniune interna (innerjoiti) c. Este cunoscuta si sub numele de auto-uniune (selfjoin) d. Realizeaza ntotdeauna legarea rndurilor folosind o conditie de egalitate (=) e. Realizeaza ntotdeauna legarea rndurilor folosind o condiNie de inegalitate (<>)" B,D "7. Calificatorii numelor de coloane: a. Pot fi nume de tabele b. Pot fi numere care indica pozitia relativa a tabelelor din lista FROM c. Pot fi pseudonime pentru numele de coloane , definite n clauza FROM d. Pot fi pseudonime pentru numele de tabele, definite n clauza FROM" e. Rezolva referinte ambigue la coloane A, D, E "8. O uniune ncrusisata este: a. O uniune Naturala b. Un produs cartezian c. O uniune externa d. O uniune Interna" B

"9. O clauza JOIN folosind cuvntul cheie USING a. Nu poate fi folosita atunci cnd coloanele prin care se face legarea tabelelor au nume diferite b. Nu poate fi folosita atunci cnd coloanele prin care se face legarea tabelelor au aceleasi nume c. Defineste o uniune interna d. Defineste o uniune externa e. Defineste o auto-uniune" A, C "10. O subinterogare corelata a. Ruleaza mai eficient dect o subinterogare necorelata b. Ruleaza mai puin eficient dect o subinterogare necorelata c. Are o interogare interna care refera coloane din interogarea externa d. Are o interogare externa care refera coloane din interogarea interna e. Are o interogare interna care nu face nici o referire la coloanele din interogarea externa" B, C Scrierea interogarilor avansate "1. Functiile SQL a. Returneaza un set de valori b. Returneaza o singura valoare c. Pot fi folosite n clauza WHERE a unei instructiuni SQL d. Pot fi folosite ca pseudonime pentru numele tabelelor intr-o instr. SQL e. Pot fi folosite n lista de coloane a unei instructiuni SQL" B, C, E "2. Functia REPLACE a. nlocuieste un nume de tabel cu un nume de vizualizare b. nlocuieste numele unei coloane cu pseudonimul coloanei c. nlocuieste un sir de caractere dintr-o coloana cu un alt sir de caractere d. nlocuieste toate valorile dintr-o coloana cu un alt set de valori e. nlocuieste toate rndurile dintr-o vizualizare cu rnduri conNinnd date dintrun alt tabel" C "3. Functia LTRIM a. Elimina spatiile de la sfrsitul sirurilor de caractere b. Elimina spatiile de la nceputul sirurilor de caractere c. Poate fi imbricata cu alte functii d. nlocuieste valorile nule cu alte valori n sirurile de caractere e. Elimina spatiile de la nceputul si de la sfrsitul sirurilor de caractere" B, C "4. Functia CHAR a. Este numita CHR n unele implementari SQL b. Este identica cu functia ASCII n unele implementari SQL c. Returneaza valoarea corespunzatoare unui caracter din setul de caractere ASCII d. Returneaza caracterul corespunzator unei valori din setul de caractere ASCII e. Transforma o valoare numerica ntr-un sir de caractere " A, D "5. Functia SIGN a. Returneaza -l daca parametrul furnizat are valoare negativa b. Returneaza 0 daca parametrul furnizat are valoarea zero c. Returneaza +1 daca parametrul furnizat are o valoare pozitiva d. Returneaza 0 daca parametrul furnizat are valoarea NULL e. Returneaza o valoare nula daca parametrul furnizat nu este un numar" A, B

"6. Funtia CEILING a. Rotunjeste un numar prin adaugire pna la primul numar ntreg b. Rotunjeste un numar prin scadere pna la primul numar ntreg c. Returneaza ntotdeauna un numar ntreg d. Returneaza un numar ntreg sau o valoare nula e. Este numita CEIL n unele implementari SQL" A, D, E "7. Functia FLOOR a. Rotunjeste un numar prin adaugire pna la primul numar ntreg b. Rotunjeste un numar prin scadere pna la primul numar ntreg c. Returneaza ntotdeauna un numar ntreg d. Returneaza un numar ntreg sau o valoare nula e. Este numita FLR n unele implementari SQL" B, D "8. Expresiile CASE a. Permit executarea conditionala a clauzelor dintr-o instructiune SQL b. Exista sub doua forme, respectiv statice si dinamice c. Exista sub doua forme, respectiv cu cautare si fara cautare d. Exista sub doua forme, respectiv simple si cu cautare e. Exista sub doua forme, respectiv standard si cu cautare" A, D Limbajul de manipulare a datelor DML "1. Limbajul DML include urmatoarele comenzi SQL: a. INSERT b. REMOVE c. UPDATE d. SELECT e. DROP" A, C "2. O instructiune DML poate referi a. Coloane din mai multe tabele b. Coloane dintr-un singur tabel c. O vizualizare care contine coloane dintr-un singur tabel d. Coloane ale unei vizualizari bazate pe un singur tabel e. Coloane ale unei vizualizari bazate pe mai multe tabele" B, C,E "3. La formarea unei instructiuni DML, trebuie sa tineti seama de urmatoarele restrictii a. Restrictii referentiale b. Restrictii de securitate c. Restrictii NOT NULL d. Restrictii de unicitate e. Restrictii cheie primara" A, C D, E "4. O instructiune INSERT cu o clauza VALUES a. Trebuie sa aiba o lista de coloane b. Trebuie sa aiba o lista de valori c. Poate insera rnduri multiple la o singura rulare d. Poate folosi cuvntul cheie NULL pentru a atribui valori nule coloanelor e. Poate include o clauza WHERE" B, D "5. O instructiune INSERT cu o comanda SELECT imbricata este utila pentru a. Gasirea urmatoarei valori pentru o cheie primara atribuita secvential b. Mutarea rndurilor dintr-un tabel n altul c. Popularea unui tabel de test cu date dintr-un alt tabel d. Eliminarea rndurilor duplicate dintr-un tabel

e. Inserarea mai multor rnduri ntr-un tabel cu o singura instructiune" A, C, E "6. O instructiune INSERT cu o comanda SELECT imbricata a. Trebuie sa aiba doua liste de coloane, una n clauza INSERT si una n instructiunea SELECT interna b. Trebuie sa aiba o instructiune SELECT interna care retumeaza un singur rnd de date c. Poate folosi cuvntul cheie NULL pentru a atribui valori nule coloanelor d. Poate include o clauza WHERE e. Trebuie sa aiba n instructiunea SELECT interna o lista de coloane care corespunde cu lista de coloane din clauza INSERT sau cu coloanele din tabelul n care sunt inserate datele" C, D, E "7. O instructiune UPDATE fara o clauza WHERE a. Actualizeaza toate rndurile din tabel cu valori nule b. ncearca sa actualizeze toate rndurile din tabel c. Esueaza si returneaza o eroare d. Sterge toate rndurile din tabel e. Are ca rezultat un produs cartezian" B "8. O instructiune DELETE fara o clauza WHERE a. Actualizeaza toate rndurile din tabel cu valori nule b. Esueaza si returneaza o eroare c. ncearca sa stearga toate rndurile din tabel d. Are ca rezultat un produs cartezian e. Trebuie sa includa o lista de coloane" C "9. O instructiune UPDATE a. Trebuie sa includa o clauza SET b. Trebuie sa furnizeze o noua valoare pentru cel putin o coloana c. Trebuie sa includa o clauza WHERE d. Poate atribui unei coloane valoarea unei alte coloane e. Poate atribui unei coloane o lista de valori derivate dintr-o expresie" A, B, D "10. O instructiune DELETE a. Poate include o lista optionala de coloane b. Poate include o clauza WHERE optionala c. Poate folosi cuvntul cheie FORCE pentru a forta stergerea rndurilor d. Nu poate ncalca restrictiile referentiale ale tabelului e. Poate avea o instructiune SELECT interna, ca parte a clauzei WHERE" B, D, E "11. Clauza SET dintr-o instructiune UPDATE poate atribui unei coloane o valoare care este a. O constanta b. Numele unei alte coloane c. O lista de valori d. Orice expresie din care rezulta o singura valoare e. Cuvntul cheie NULL" A, B, D, E "12. Instructiunea SELECT interna a unei instructiuni INSERT poate include a. O clauza WHERE b. O clauza GROUP BY c. Una sau mai multe functii de agregare d. O uniune a mai multor tabele e. O clauza UNION" A, B, C, D, E

Adevarat / Fals Pentru a fi in a treia forma normala , o relatie trebuie sa nu fie in prima forma normala sau in a doua forma normala: - Adevarat - Fals Pentru a fi in a treia forma normala o relatie nu trebuie sa fie in prima sau a doua forma normala? - Adevarat - Fals Probleme de dependenta tranzitiva apar atunci cand un atribut non-cheie depinde de un alt atribut noncheie - Adevarat - Fals Diagrama ERD este un model de date conceptual de nivel nalt, dependent de platforma hardware utilizat i de tipul de RDBMS (SGBD) ului utilizat - Adevarat - Fals Folosind aplicatia Microsoft Access, se poate administra toata informatia ntr-o singura baza de date (Database)? - Adevarat - Fals Folosing MSAccess se poate administra toata informatia intr-o singura baza de date ? - Adevarat - Fals A doua forma normala nu rezolva anomaliile cauzate de a. Dependentele partiale de cheia primar b. Grupurile repetitive c. Dependentele tranzitive d. Atributele multi valoare e. Relatiile de tip unu-la-mai-multi

A doua form normal rezolv anomaliile cauzate de a. Grupurile repetitive b. Dependentele partiale de cheia primar c. Grupurile repetitive si atributele multivaloare d Dependentele tranzitive A treia forma normala rezolva anomaliile cauzate de : si 4 var de raspuns
a. Dependentele partiale de cheia primar b. Grupurile repetitive c. Dependentele tranzitive d. Atributele multivaloare e. Relatiile de tip unu-la-mai-multi

Atunci cnd se foloseste operatorul + , apare o eroare de tipul Type Mismatch (Nepotrivire de tip) in
cazul cand a. ambii operanzi sunt valori numerice b. ambii operanzi sunt siruri de caractere c. un operand este valoare numerica si celalalt un sir de caractere d. un operand este valoare numerica si celalalt de tipul date/time

Care din urmtoarele baze de date nu este RDBMS


a. Postage SQL b. Oracle Database c. My SQL d. Microsoft SQL Server e. Excel database

Care nu este un concept utilizat pentru a descrie formal-uzual-fizic elementele de baza ale organizarii
datelor a. relatie-tablou-fisier b. tuplu-linie-inregistrare c. atribut-coloana-camp d. domeniu-functie-functie

Care nu este o interogare de actiune?


a. cu actualizare b. cu creeare de tabele c. cu adaugare si stergere d. cu parametru

Care din interogarile cu actiune pot afecta doar campuri izolate?:


a. cu actualizare b.cu adaugare c.cu stergere d.cu creare de tabele

Clinetii SQL oferiti de Microsoft nu sunt:


a. SqLWorsheet b. sql PLUS c. iSql d. Isql PLUS

Campurile calculate intr-un raport se pot introduce in modul Design View:


a. numai in banda Report Footer b. numai in banda Group Footer c. in banda de Detail,Group F.si Report F. d. numai in banda de Detail

Cind se realizeaza un table cu Report View din tabele relationale, informatiile fiind grupate pe parte one
a relatiei si se opteaza pentru SUMMARY OPTION atunci: a. se introduc calculele solicitate in banda de subsol de grup b. se introduc calculele solicitate in banda de detaliu de grup c. se introduc calculele solicitate in benzile de subsol de grup de subsol de raport d. se introduc calculele solicitate in banda de detaliu de grup si subsol de grup

Cate reguli a emis Codd / Modelul relational conceput si dezvoltat de E.F. Codd cuprinde un set de
a. 25 reguli b. 13 reguli c. 100 reguli d 15 reguli

Cand operatorii AND si OR sunt combinati in aceeasi clauza WHERE


a. Operatorul AND are prioritate mai mare decat operatorul OR b. Sistemul DBMS returneaza un mesaj de eroare c. Operatorul AND are prioritate mai mica decat operatorul OR d. Parantezele, sunt obligatorii

Cand operatorii AND i OR sunt combinati in aceeasi clauza WHERE


a. b. c. d. e. Sistemul SGBD returneaza un mesaj de eroare Operatorul AND are prioritate mai mare decat operatorul OR Operatorul AND are prioritate mai mica decat operatorul OR Parantezele, sunt obligatorii Parantezele sunt optionale

Componentele unei baze de date relationale NU includ : a. Relatii b. tabele c. restrictii d. diagrame ERD Componentele unei baze de date relationale nu includ:
a.indexuri b.tabele c.diagrame ERD d.restrictii e.relatii

<!>Criteriul de selectie se poate seta


a. prin intermediul celulei TOTALS + Expression Builder b. prin intermediul celulei Criteria +Expression Builder sau prin tastarea expresiei c. prin intermediul celulei Sort + tastarea expresiei d. prin intermediul celulei TOTALS si Criteria, ambele ambele avand acelasi efect

<!>Criteriul de selectie se poate seta


a. prin intermediul celulei TOTALS + Expression Builder b. prin intermediul celulei Criteria +Expression Builder sau prin tastarea expresiei c. prin intermediul celulei Sort + tastarea expresiei d. prin intermediul celulei TOTALS si Criteria, ambele ambele avand acelasi efect

<!>Calificatorii numelor de coloane NU :


a. rezolva referintele ambigue la coloane b. pot fi nume de tabele c. pot fi pseudonime ptr. numele de coloane, definite in clauza FROM d. pot fi pseudonime pentru numele de tabele, definite in clauza FROM

<!>Calificatorii numelor de coloane NU :


a. rezolva referintele ambigue la coloane b. pot fi nume de tabele c. pot fi pseudonime pentru numele de coloane, definite in clauza FROM d. pot fi pseudonime pentru numele de tabele, definite in clauza FROM

Daca relationarea tabelelor dintr-o interogare s-a facut prin definirea legaturilor implicite (din fereastra Relationships), atunci: a. trebuie refacute legaturile in cadrul interogarii b. acestea sunt ignorate in timpul rularii interogarii c. adaugarea lor intr-o interogare se face impreuna cu relatiile dintre ele d. tabelele nu trebuiesc sa fie legate in interogare

Dac tabelele dintr-o interogare nu sunt legate una de alta fie direct (n interogare), fie indirect (prin
legtur implicit, din fereastra Relationship), Acces afiseaz a. Toate combinatiile de nregistrri (produs cartezian) dintre cmpurile tabelelor b. Numai nregistrrile din prima tabel c. Numai nregistrrile din ultima tabel d. Nu afiseaz nimic

Definitia unei coloane din instructiunea CREATE TABLE nu poate include


a. Numele tabelului sau [/restrictie la nivel de tabel/] b. O clauz DEFAULT c. O clauz NULL sau NOT NULL d Numele coloanei

<!>Din ferestra Relationships la apasarea butonului Join Type se poate selecta modul in care vor fi
extrase datele din tabele, mod care nu poate fi: a. numai acele nregistrari n care cmpurile din legatura coincid b. toate nregistrarile din tabela principala si numai acele nregistrari din tabela corelata n care cmpurile din legatura coincid. c. toate nregistrarile din tabela corelata si numai acele nregistrari din tabela principala n care cmpurile din legatura coincid. d. toate inregistrarile din ambele tabele

<!>Din ferestra Relationships la apasarea butonului Join Type se poate selecta modul in care vor fi
extrase datele din tabele, mod care nu poate fi: a. numai acele nregistrari n care cmpurile din legatura coincid b. toate nregistrarile din tabela principala si numai acele nregistrari din tabela corelata n care cmpurile din legatura coincid. c. toate nregistrarile din tabela corelata si numai acele nregistrari din tabela principala n care cmpurile din legatura coincid. d. toate inregistrarile din ambele tabele

Expresiile nu se utilizeaz n
a. Definirea unui criteriu de selectie b. Crearea unui cmp calculat c. Actualizarea unor nregistrri ntr-o interogare d. Definirea propriettii Validation Text a unei tabele

Functia AVG(Expr):
a. include campuri de valoare NULL in calcul b. poate fi folosita intr-o interogare c. calculeaza media geometrica a datelor din acel camp d. operanzii din Expr nu pot include o functie definita de utilizator.

Functiile SQL matematice standard NU includ :


-ROUND -ABS -CAST -EXP

Functia LTRIM
a. Elimina spatiile de la sfarsitul sirurilor de caractere b. Elimina spatiile de la inceputul sirurilor de caractere c. Poate fi imbricata cu alte functii d. Inlocuieste valorile nule cu alte valori in sirurile de caractere e. Elimina spatiile de la inceputul si de la sfarsitul sirurilor de caractere

Integritatea referintiala este un sistem de reguli folosit de Acces pentru a se asigura ca:
a. relatiile intre tabele sunt valide b. relatiile intre tabele nu se modica c. relatiile intre tabele sunt valide si ca nu se sterg sau modica accidental datele in legatura d. nu sunt definite relatii

Integritatea referential nu se poate seta atunci cnd


a. Cmpurile n relatie au acelasii tip de date b. Tabelele nu apartin aceleasi baze de date Access c. Tabelele apar in aceleasi baze de date Access d. Cmpul n relatie din tabela principal este cheie primar sau are un index unic

In cadrul diagramei entitate-relatie (ERD) care nu este o entitate speciala


a. Entitate dependent b. Entitate tranzitiva c. Subentitate d. Superentitate

Interogariea de tip functie a. poate calcula suma, media, numararea, minimul, maximul, varianta sau deviatia standard pentru unul sau mai multe cmpuri dintr-o tabela in linia Totals, fie pentru toate nregistrarile, fie pe unul sau mai multe grupuri de nregistrari b. poate calcula suma, media, numararea, minimul, maximul, varianta sau deviatia standard pentru unul sau mai multe cmpuri dintr-o tabela in linia Totals, numai pentru toate nregistrarile c. poate calcula suma, media, numararea, minimul, maximul, varianta sau deviatia standard pentru unul sau mai multe cmpuri dintr-o tabela in linia Totals, numai pentru pe un grup de nregistrari d. prin intermediul liniei Criteria nu pot fi afectate rezultatele calcularii. Integritatea referential nu se poate seta atunci cnd
a. Cmpurile n relatie au acelasii tip de date b. Tabelele nu apartin aceleasi baze de date Access c. Tabelele apar in aceleasi baze de date Access d. Cmpul n relatie din tabela principal este cheie primar sau are un index unic

Limbajul DML nu include urmtoarea instructiune SQL


a. INSERT b. UPDATE c. SELECT sau [/CREATE /] d. DELETE

Modelul relational NU are ca regula de integritate structurala :


a. Unicitatea cheii primare b. Intregritatea entitatii.Atributele cheii primare sunt diferite de valoarea NULL c. Integritatea referiirii. O cheie externa trebuie sa corespunda unei valori a cheii primare associate. d. Integritatea referiirii. O cheie externa trebuie sa fie NULL in intregime, ori sa corespunda unei valori a cheii primare asociate

Modelul relaional conceput i dezvoltat de E.F. Codd cuprinde un set de


a. 25 reguli b. 13 reguli c. 100 reguli d. 15 reguli

Nu sunt clientii SQL oferiti de Oracle


a. SQL Worksheet b. My SQL c. SQL*Plus d. iSQL*Plus

Nu se selecteaza intr-o interogare


a. un singur cmp prin executarea unui click pe numele unui cmpului b. un bloc de cmpuri prin click pe primul cmp din bloc, se tine apasata tasta Shift si apoi se executa click pe ultimul cmp din blocul dorit. c. mai multor cmpuri dar nesituate intr-un bloc atunci se executa click pe fiecare dintre ele tinndu-se apasata tot timpul tasta Shift d. toate cimpurile prin dublu-click pe bara de titlu a tabelei sau printr-un singur click pe asterix (*).

Normalizarea nu rezolva anomalia:


a. de creare b. de stergere c. de actualizare d. de inserare

Nu este functie SQL matematica standard:


a. ROUND b. EXP c. ABS d. CAST

Numele unei coloane dintr-un tabel : a. Nu trebuie sa fie in baza de date b. Nu trebuie sa fie in cadrul unui tabel c. Trebuie sa fie specificat in instructiunea ALTER TABLE d. Trebuie sa fie specificat in instructiunea CREATE TABLE sau[/trebuie sa fie unic in cadrul tabelului/] O interogare parametrizat este o interogare
a. n care una sau mai multe valori ale criteriilor de selectie sunt specificate n mod interactive b. n care numai una dintre valorile criteriilor de selectie poate fi specificat c. Care atunci cnd se ruleaz afiseaz o fereastr creat de utilizator d.Care atunci cnd se ruleaz afiseaz o fereastr proprie n care afiseaz un rezultat

O uniune incrucisata(cross join)


a. O uniune Natural b. N produs cartezian c. O uniune extern d. O uniune Intern

O uniune (Join) fara o clauza WHERE sau o clauza JOIN


a. Are ca rezultat un mesaj de eroare b. Nu returneaz nici un rnd din setul de rezultate c. Reprezint o uniune extern (outer join) d. Reprezint o uniune intern (inner join) e. Are ca rezultat un produs cartezian

O uniune de egalitate(equijoin):
a. este cunoscuta si sub numele de auto-uniune(slfjoin) b. este cunoscuta si sub numele de uniune externa(outerjoin) c. realizeaza intotdeauna legarea randurilor folosind o conditie de egalitate(=) d. realizeaza intotdeauna legarea randurilor folosind o conditie de inegalitate(<>)

O cheie Primara nu poate fi setata: U click-dreaptape campul dorit sa fie cheie primarasi din meniul
afisat se apasa Primary Key sau U se selecteaza campul respectiv si se apasa butonul de Primary Key meniul Design View,U se deschide fereastra de definire a unui index caruia i se adreseaza proprietatea Primary la Yes. a. cu click dreapta pe campul dorit sa fie cheie primara si din meniul afisat se apasa Primary Key. b. daca se deschide fereastra de definire a unui index si se creeaza un index caruia i se seteaza proprietatea Primary la Yes. c. din FieldProprerties,Indexed,Yes(No Duplicates) d. daca se selecteaza campul respectiv si se apasa butonul de Primary Key din meniul Design View.

O interogare incrucisata (Crosstab) este realizata dintr-o o interogare de selectie, din care se poate alege a. toate campurile interogarii b. cel mult 3 campuri pentru antet de linii, un camp pentru antet coloana si o functie aplicata valorilor dintr-un camp c. cal putin 3 campuri pentru antet de linii, si mai multe campuri entru antet coloana si o functie aplicata valorilor dintr-un cimp d. nu se poate realiza astfel de interogari

O forma (sau formular) reprezinta modalitatea de a a. modifica date numai dintr-o singura tabela b. modifica, adauga, sterge date din mai multe tabele c. modifica date dintr-o singura interogare d. modifica date dintr-o interogare si un tabel O baza de date este
a. O colectie de date interrelationate gestionate ca o singura unitate b. Un produs software furnizat de un producator de baze de date c. O structura de date, cum ar fi un tabel, o vizualizare sau un index d. Definita in acelasi mod de toti producatorii de software

O forma nu poate fi creata


a. pe baza unei interogari de actiune b. pe baza unui tabel c. pe baza unei interogari d. pe baza mai multor tabele

O forma (sau formular) reprezinta modalitatea de a


a. modifica date numai dintr-o singura tabela b. modifica, adauga, sterge date din mai multe tabele c. modifica date dintr-o singura interogare d. modifica date dintr-o interogare si un tabel

O cheie Primara nu poate fi setata: a. cu click dreapta pe campul dorit sa fie cheie primara si din meniul afisat se apasa Primary Key. b. daca se deschide fereastra de definire a unui index si se creeaza un index caruia i se seteaza proprietatea Primary la Yes. c. din FieldProprerties,Indexed,Yes(No Duplicates) d. daca se selecteaza campul respectiv si se apasa butonul de Primary Key din meniul Design View. O uniune de egalitate(equijoin):
a. este cunoscuta si sub numele de auto-uniune(slfjoin) b. este cunoscuta si sub numele de uniune externa(outerjoin) c. realizeaza intotdeauna legarea randurilor folosind o conditie de egalitate(=) d. realizeaza intotdeauna legarea randurilor folosind o conditie de inegalitate(<>)

O clauza JOIN folosind cuvantul cheie USING a. Nu poate fi folosita atunci cand coloanele prin care se face legarea tabelelor au aceleasi nume b. Nu poate fi folosita atunci cand coloanele prin care se face legarea tabelelor au nume diferite c. Defineste o uniune externa d. Defineste o auto-uniune O interogare cu stergere (Delete Query) poate:
a. sterge doar cimpurile izolate b. sterge un grup de inregistrari dintr-un tabel c. sterge un grup de inregistrari dintr-un table sau din mai multe tabele legate intr-o relatie unula- mai- multi daca stergerile in cascada sunt active d. sterge o inregistrare dintr-un tabel la un moment dat

Operatorul + genereaza eroarea Type Mismatch atunci cand a. ambii operanzi sunt siruri de caractere b. ambii operanzi sunt numere c. un operator este numar si unul sir de caractere d. un operator este numar si unul data O interogare incrucisata (Crosstab) este realizata dintr-o interogare de selectie din care se poate alege:
a. toate campurile interogatorii b. cel mult 3 campuri pt. antet de linii,un camp pt. antet coloana si o functie aplicata valorilor dintr-un camp. c. cel putin 3 campuri pt. antet de linii si mai multe campuri penru antet coloana si o functie aplicata valorilor dintr-un camp. d. nu se poate realiza astfel de interogari.

O instructiune UPDATE trebuie sa includa:


a. o clauza WHERE b. o clauza SET c. o clauza SELECT d. o clauza INSERT

O interogare parametrizata este o interogare


a. in care una sau mai multe valori ale criteriilor de selectie sunt specificate in mod interactiv b. in care numai una dintre valorile criteriilor de selectie poate fi specificata c. care atunci cand se ruleaza afiseaza o fereastra creata de utilizator d. care atunci cand se ruleaza afiseaza o fereastra proprie in care afiseaza un rezultat

O forma (formulare) reprezinta modalitatea de a:


a. modifica date numai dintr-o singura tabela b. modifica, adauga, sterge date din mai multe tabele c. modifica date dintr-o singura interogare d. modifica date dintr-o interogare si un tabel

O interogare MakeQuery nu realizeaza:


a. Realizarea unei copii de siguranta a unei tabele b. Schimbarea ordinii inregistrarilor dintr-o tabela c. Crearea unei tabele pentru exportul intr-o alta baza de date MS Access d. Crearea unei tabele ce va contine numai inregistrari vechi <!>O interogare cu actiune este o interogare care realizeaza modificari asupra: a. unei singure inregistrari dintr-un table b. asupra mai multor inregistrari din una sau mai multe tabele c. unei singure tabele la un moment dat d. mai multor tabele la un moment dat

<!>O interogare cu actiune este o interogare care realizeaza modificari asupra:


a. unei singure inregistrari dintr-un table b. asupra mai multor inregistrari din una sau mai multe tabele c. unei singure tabele la un moment dat d. mai multor tabele la un moment dat

Operatorul BETWEEN
a. Specific un domeniu de valori care include si capetele b. Poate fi rescris folosind operatorii <= si NOT <= c. Selecteaz rndurile adugate n tabel ntr-un anumit interval de timp d. Nu este inclus n standardul ISO/ANSI

Proprietatea Format se foloseste pt:


a. a seta modul in care campurile de tip text sunt afisate b. a stoca datele intr-un anumit format c. a seta modul in care campul de tip numar sunt tiparite d. a seta modul in care datele sunt afisate si tiparite

Proprietatea de Indexare (Indexed)


a. seteaza un index pe un singur cimp b. creaza si seteaza un index pe un cimp al unei tabele c. se foloseste pentru a mari viteza de interogare a unei tabele pe unul sau mai multe campuri d. afecteaza ordinea de stocare (ordinea fizica) a inregistrarilor

Pentru a crea un raport utiliznd generatorul (Report Wizard) avem planul general cu optiunea implicita a. Columnar b. Tabular c. Justified Pentru a introduce cmpuri calculate ntr-un raport se folosete elemente din bara toolbox
a. Label Box Aa b. Text Box ab c. Check d. Combo Box

Pentru aducerea in prima forma normala a unei relatii ne-normalizate se operatie nu se efectueaza ?
a. Grupurile repetitive sunt mutate intr-o noua relatie b. Atributele multivaloare sunt mutate intr-o noua relatie c. Atributele care sunt dependente tranzitiv sunt eliminate d. Identificatorul unic al unei relatii originale este copiat in noua relatie

Pentru a specifica criterii de selectii pentru o interogare, acestea nu se fac


a. numai pentru un camp b. pentru mai multe campuri, daca expresiile pentru criteriile de selectie sunt pe aceeasi linie in tabelul de design, cand Access foloseste operatorul And, adica vor fi returnate numai inregistratile ce indeplinesc toate criteriile c. pentru mai multe campuri, daca expresiile pentru criteriile de selectie sunt in linii diferite ale tabelului de design, cand Access foloseste operatorul Or, adica vor fi returnate numai inregistratile ce indeplinesc cel putin unul din criteriile de selectie d. in celula TOTALS a tabelului de design

Problemele de dependenta partiala nu: a. sunt rezolvate de a 2 forma normala b. sunt rezolvate de a 3 forma normala c. apar atunci cand un atribut non-cheie depinde doar de o parte a cheii primare d. pot aparea numai in relatii cu chei primare concatenate

Pentru realizarea unei interogari cu actualizare nu se efectueaza pasul:


a. se creeeaza o interogare b. se adauga tabelele si se selecteaza campurile ce se doresc actualizate c. se stabilesc criteriile de selectie pt acestea,daca exista atunci se apasa butonul Update Query din meniul Query Type din Toolbar d. in celula Update To (aici cred ca e incompleta)

Problemele de dependenta partiala nu:


a. sunt rezolvate de a 2 forma normala b. sunt rezolvate de a 3 forma normala c. apar atunci cand un atribut non-cheie depinde doar de o parte a cheii primare d. pot aparea numai in relatii cu chei primare concatenate

Pentru realizarea unei interogari cu actualizare nu se efectueaza pasul:


a. se creeeaza o interogare b. se adauga tabelele si se selecteaza campurile ce se doresc actualizate c. se stabilesc criteriile de selectie pt acestea,daca exista atunci se apasa butonul Update Query din meniul Query Type din Toolbar d. in celula Update To (aici cred ca e incompleta)

Pentru a introduce cmpuri calculate ntr-un raport se foloseste din bara toolbox: a. Label Box Aa b. Text Box ab c. Check d. Combo Box Prima forma normala rezolva anomaliile cauzate de
a. Grupurile repetitive si atributele multivaloare b. Dependentele partiale de cheia primara c. Dependentele tranzitive d. Relatiile de tip unu-la-mai-multi

Pentru a specifica criterii de selctie pentru o interogare, aceste nu se fac


a. numai pentru un cimp b. penrtru mai multe cimpuri, daca expresiile pentru criteriile de selectie sunt pe aceeasi linie n tabelul de design, cand Access foloseste operatorul And, adica vor fi returnate numai nregistrarile ce ndeplinesc toate criteriile. c. pentru mai multe criterii pe acelasi camp, expresiile sunt n linii diferite ale tabelului de deisgn cand Access foloseste operatorul Or, adica vor fi returnate acele nregistrari ce ndeplinesc cel putin unul dintre criteriile de selectie. d. in celula TOTALS a tabelului design

Relatia m:n devine in modelul relational: a. tabel asociativ cu cheia primara formata din 2 chei externe pt. cele 2 tabele asociate b. tabel asociativ cu cheia primara formata din 2 chei externe pt. cele 2 tabele asociate plus eventuale coloane aditionale c. chei externe d. entitate independenta

Sintaxa corect pentru o restricie NOT NULL este


a. nume_coloan tip-de-date IS NOT NULL b. nume_coloan tip_de_date NOT NULL c. DEFAULT [NULL | NOT NULL] d. CREATE NOT NULL INDEX ON nume_coloan

Sintaxa corecta pentru o restrictie referentiala este


a. [CONSTRAINT numerestrictie] REFERENCES nume_index b. [CONSTRAINT numerestrictie] REFERENCES nume_tabel c. FOREIGN KEY nume_coloana REFERENCES nume_tabel (nume_coloana) d. REFERENCES numetabel (nume_coloana)

Sintaxa corecta pentru eliminarea valorilor nule din rezultatele interogarii este
a. b. c. d. e. = NULL NOT = NULL <>NULL IS NULL IS NOT NULL

SQL NU este:
a. Un limbaj procedural b. Un limbaj nonprocedural c. Un limbaj declarativ d. Un limbaj standard

Tipurile numerice standard nu includ:


a. INTEGER b. FLOAT c. INTERVAL d. BIGINT

Textul de validare se foloseste


a. pentru a valida datele dintr-un cimp b. impreuna cu Regula de Validare (Validation Rule) si reprezinta mesajul afisat la incalcarea regulei de validare c. impreuna cu Regula de Validare (Validation Rule) si reprezinta mesajul afisat daca nu se incalca regula de validare d. pentru a valida datele dintr-o inregistrare

Un model de date reprezinta o colectie integrata de concepte care nu descriu:


a. date b. relatii dintre date c. date despre echipa realizatoare a modelului d. constrangeri existente asupra datelor sistemului real analizat

Un obiect al bazei de date este


a. O structura denumita de date, cum ar fi un tabel, o vizualizare sau un index b. Un produs software furnizat de un producator de baze de date c. O colectie de date interrelationale gestionate ca o singura unitate d. O colectie de inregistrari inrudite, stocate ca o singura unitate

Un sistem de gestionare a bazelor de date, abreviat sub forma DBMS sau RDBMS sau SGBD este
a. o colectie de inregistrari inrudite, stocate ca o singura unitate b. o colectie de date interrelationate gestionate ca o singura unitate c. o structura de date, cum ar fi un tabel, o vizualizare sau un index d. un produs software furnizat de un producator de baze de date

Un sistem de gestionare a bazelor de date :


a. o structura cum ar fi un tabel b. o colectie de date interrelationate c. un produs softwer furnizat de un producator d. o structura denumita date , cum ar fi un tabel Un cmp calculat ntr-o interogare a. Se efectueaz pe fiecare nregistrare folosind numai un cmp b. Afiseaz rezultatul unei expresii si valoarea este recalculat de fiecare dat cnd o valoare din exprese se schimb c. Se pot folosi numai la afisarea unor rezultate d. Se pot folosi numai la definirea unor criterii de selectie sau pentru a determina asupra cror nregistrri s se execute o actiune

Valorile NULL
a. pot fi folosite pentru reprezentarea datelor care lipsesc sau care nu sunt cunoscute b. nseamn acelai lucru ca i spaiile libere c. sunt egale cu alte valori NULL d. sunt ntotdeauna permise n mod prestabilit

Un identificator unic (cheie) poate fi compus... - am raspuns : poate fi compus din mai multe atribute concatenate Pentru realizarea unor interogari grupate... - am raspuns: se realizeaza o interogare de selectie din tabelele dorite si se selecteaza pentru anumite campuri o functie de celula Total. Daca integritatea referentiala este setata: - am raspuns: nu se poate valoarea unei chei primare in tabela principala, daca acea inregistrare are inregistrari corelate in tabela secuindara. Functia NOW() intoarce:
- am raspuns: data si timpul exact conform cu data si ora sistemului

Prin operatia Export se poate


- am raspuns: exporta dintr-o baza de date access intr-o alta baza de date access

Proprietatea Format se foloseste pentru


- am raspuns: a seta modalitatea in care datele sunt afisate si tiparite

Daca integritatea referentiala este setata


- am raspuns: nu se poate schimba valoarea unei chei primare

In meniul Tools ce apartine database Utilities nu exista


- am raspuns: memo

Problemele de dependenta partiala Nu


- am raspuns: sunt rezolvate de FN3

Relatia m:n devine in mod relational


- am raspuns: tabel asociativ in care o inregistrare din A poate avea mai multe in B si invers

Pentru a crea un raport utilizand report Wizard avem planul general cu optiunea implicita
- am raspuns: tabular

O instructiune Alter Table nu poate fi folosita pentru


- am raspuns: redenumirea unei coloane DDL nu include urmatoarea instructiune - am raspuns: DELETE

Un identificator unic (o cheie primara)


- am raspuns: poate fi compus dintr-un singur atribut

O interogare cu stergere (Delete Query)


- am raspuns : sterge un grup de inregistrari dintr-un tabel sau din mai multe tabele legate printr-o relatie unu la mai multi daca stergerile in cascada sunt active.

Componentele unei baze de date relationale nu includ


- am raspuns : diagrame ERD

O uniune fara clauza WHERE sau o clauza Join


- am raspuns are ca rezultat un produs cartezian

Operatorul BETWEEN
a. Specific un domeniu de valori care include si capetele b. Poate fi rescris folosind operatorii <= si NOT <= c. Selecteaz rndurile adugate n tabel ntr-un anumit interval de timp d. Nu este inclus n standardul ISO/ANSI

O instructiune DELETE nu a. Poate include o list optional de coloane b. Poate include o clauz WHERE optional c. Nu poate nclca restrictiile referentiale ale tabelului d. Poate avea o instructiune SELECT intern, ca parte a clauzei WHERE Functiile SQL standar pt.siruri de caractere NU includ
- Upper -LOWER -... -LIKE - raspuns LIKE

Care este secvena corect pentru a terge toate nregistrrile tabelului TOTALURI - DELETE FROM TOTALURI

Access permite crearea unor relaii logice sub forma unor legri ntre tabele
- temporale (la nivelul interogrilor) i implicite (din fereastra Relationships)

O interogare cu creare de tabele (Make-tables Query) nu realizeaz


- crearea unor tabele pentru exportul ntr-o baz de date MS Access

Pentru realizarea unor interogri grupate


- se selecteaz pentru toate cmpurile o funcie n celula Totals

Un obiect al unei baze de date este


- o structur, cum ar fi un tabel, o vizualizare sau un index Pasii pentru conversia unei baze de date NU sunt: - deschiderea bazei ce urmeaza a fi convertita

O instructiune SELECT fara o clauza WHERE


- va selecta toate randurile din tabel sau vizualizare

Instructiune SQL prin care se cerea sa se stearga toti profesorii din tabel. - DELETE profesori FROM tabel
table cod fac, denumire adresa care este secventa corecta pentru o inserare folosind instructiunea SELECT -INSERT INTO FAC (COD_FAC, DENUMIRE, ADRESA) SELECT VALUES(MAX(COD_FAC)+1, 'LIMBI', 'ION GHICA'); -INSERT INTO FAC SELECT MAX(COD_FAC)+1, 'LIMBI', 'ION GHICA' FROM FAC; -INSERT INTO FAC (COD_FAC, DENUMIRE, ADRESA) SELECT MAX(COD_FAC)+1, 'LIMBI', 'ION GHICA' FROM FAC; table prof cod fac, cod prof,nume, prenume, salariu, cod functie care este secventa corecta , pentru a modifica functia si salariu prof cu (cod_fac=2 cod_prof=1) din lector(cod_funct=3, salariu 2000) la conferentiar(cod_funct=4, salriu=3000)? -UPDATE PROF SET COD_FUNCT=4, SALARIU=3000 WHERE COD_FAC=2 AND COD_PROF=1; -UPDATE PROF SELECT COD_FUNCT=4, SALARIU=3000 WHERE COD_FAC=2 AND COD_PROF=1; -UPDATE PROF SET COD_FAC=2 AND COD_PROF=1 WHERE COD_FUNCT=4, SALARIU=3000;

2 tabele a. ca cel de la nr 12 b.functii cod functii, den functii care este secventa corecta pentru o subinterogare necorelata, care sa afiseze toate functiile pentru care nu exista profesorii incadrati -SELECT cod_funct, nume_funct FROM functii WHERE cod_funct NOT IN (SELECT DISTINCT cod_funct FROM prof) -SELECT cod_funct, nume_funct FROM functii WHERE cod_funct NOT IN SELECT DISTINCT cod_funct FROM prof -SELECT cod_funct, nume_funct FROM functii WHERE cod_funct IN (SELECT cod_funct FROM prof); Pt. tabelul: PROF cod_fac# cod_prof# nume prenume salariu care este secvena corect pt. a insera o nregistrare: INSERT INTO PROF VALUES (4, 3, POPA, DAN, 1234) INSERT INTO PROF VALUES (4, 5, POPA, DAN, 1234) INSERT INTO PROF (cod_prof, nume, prenume, salariu) VALUES (4, 3, POPA, DAN, 1234) Pt. tabelul: PROF cod_fac# cod_prof# nume prenume salariu care este secvena corect pt. a afia toate facultile pt. care COD_FAC=1 i salariu>=1200, sau facultile pt. care COD_FAC=3 i salariu<2000 SELECT COD_FAC, COD_PROF, NUME, SALARIU, FROM PROF WHERE (COD_FAC=1 AND SALARIU>1200) OR (COD_FAC=3 AND SALARIU<2000) Au mai fost 3 variante asemntoare unde erau nlocuite AND cu OR Care nu sunt instructiuni SQL? Limbajul dc replicare a datelor (DRL - Dala Replication Language) Limbajul de manipulare a datelor (DML - Data Manipulation Language) NU include: CREATE Tipurile de date temporale standard NU includ TIMEZONE

Text boxurile unei forme create automat


sint legate direct la mai multe tabele astfel incit orice modificare adusa valorilor din ele se transmite..

O interogare SQL din care trebuie selectati din tabelul PROF profesorii care au codul facultatii (COD_FAC) egal cu 8 a. SELECT FROM PROF WHERE COD_FAC=8; b. SELECT FROM PROF WHERE COD_FAC<>8; c. SELECT FROM PROF WHERE COD_FAC IS 8; (asa imi aduc aminte aici, dar daca nu era IS era tot o balarie)

Pentru tabelul PROF

Cod_fac# | Cod_prof# | Nume | Pren | Salariu Care este secventa corecta pentru a modifica salariile cu 10%, care nu contin valori NULL? a. UPDATE PROF SET SALARIU = SALARIU*1.1 WHERE SALARIU NOT NULL; b. UPDATE PROF SET SALARIU = SALARIU*1.1 WHERE SALARIU IS NOT NULL c. UPDATE PROF SELECT SALARIU = SALARIU*1.1 WHERE SALARIU <> 0;

O cheie primara (Primary Key)


reprezinta un mod unic de identificare a unei nregistrari ntr-o tabela. a. nu este un index b. este un idex creat numai pe un cimp c. este un idex creat pe minimum doua cimpuri

Dac tabelele dintr-o interogare nu sunt legate una de alta fie direct (n interogare), fie indirect (prin
legtur implicit, din fereastra Relationship), Acces afieaz Toate combinaiile de nregistrri (produs cartezian) dintre cmpurile tabelelor Numai nregistrrile din prima tabel Numai nregistrrile din ultima tabel Nu afieaz nimic Textul de validare se foloseste Raspuns: impreuna cu Regula de Validare si reprezinta mesajul afisat la incalcarea regulei de validate Numerele stocate in campuri nenumerice ale unei interogari sunt stocate Raspuns: ca siruri de caractere (celelalte variante erau ca siruri numerice, se pune in fata 0 pt numerele mici si nu se accepta sortarea) Un camp calculat intr-o interogare Raspuns: afiseaza rezultatul unei expresii si valoarea este recalculata de fiecare data cand o valoare din expresie se schimba) Pentru aducerea in prima forma normala a unei relatii ne-normalizate ce operatie nu se efectueaza Raspuns: nu mai tin minte cum era formulat ceva despre atribute dependent tranzitive, oricum era singurul care nu avea legatura cu FN1 O insctructiune SELECT fara o clauza WHERE Raspuns: selecteaza toate randurile din tabel sau vizualizare Tabelul PROF cu coloanele cod_fac, cod_prof, nume, ore, salariu se intreba care este secventa corecta pentru a afisa suma salariilor tuturor profesorilor (de la toate facultatile) Raspuns: SELECT SUM(salariu) AS TotalSalarii FROM PROF GROUP BY

Se dadea tabelul FAC cu campurile cod_fac, denumire si adresa si se intreba care este varianta corecta pentru introducerea unei noi inregistrari Raspuns: INSERT INTO FAC (cod_fac, denumire, adresa) SELECT VALUES (MAX(cod_fac)+1, 'o demunire', 'o adresa'); Utilizarile valide ale instructiunii ALTER TABLE nu include Raspuns: Redenumirea unui tabel Operatorul LIKE Raspuns: Foloseste caracterul procent drept caracter de inlocuire nepozitional O interogare SQL prin care se solicita afisarea rotunjirii mediei salariilor profesorilor, cu 2 zecimale, grupat dupa facultati. Aici a fost ceva ciudat. O varianta era cu SORTED BY, una era cu expresia numerica fara o paranteza si 2 erau identice, si aici ma refer la semne de punctuatie, paranteze, spatii, etc. Aceste 2 variante identice aveau si formatul corect din punctul meu de vedere: SELECT ROUND(AVG(expresie numerica),2)AS salarii FROM prof GROUP BY COD_FAC; Care nu este un concept utilizat pentru a descrie formal-uzual-fizic elementele de baza ale organizarii datelor: raspuns: domeniu- functie-functie Un sistem de gestiune al bazelor de date este: raspuns : un produs software furnizat de un producator de baze de date Numerele stocate in campuri nenumerice ale unei interogari sunt sortate: raspuns: ca siruri de caractere Care nu este restrictie (Tipuri de restrictii) raspuns: relatie ( mai erau variantele primary key, not null, check) Functia NOW() ... raspuns: returneaza data si ora sistemului Eliminarea valorilor nule ... raspuns: IS NOT NULL 57. Instructiunile SQL .... raspuns: incep cu un cuvant cheie si se termina cu caracterul; 58. Intr-un aranjament client server: raspuns: componentele soft ale clientului SQL ruleaza pe client O auto-uniune: raspuns: autouniunea foloseste un singur tabel extensiile procedurale ale limbajului sql includ:java,c++,php, oracle pl/sql pt tabelul ... raspuns INSERT INTO PROF(cod_prof nume, prenume, salariu) NAMES (4,3,POPA,DAN,1234) nu este functie sql standard pt siruri de caractere:upper, lenght, lower, like pt tabelul... raspuns SELECT DISTINCT DENUMIRE FROM FAC WHERE 1000<(SELECT sum(salariu) O uniune join --combina coloanele din doua sau mai multe tabele in rezultatul unei singure interogari

un sistem dbms nu ofera serviciul- - mecanisme de securitate un index poate fi creat pe urmat tipuri-- text number, currency sau date and time daca relationarea tabelelor dintr-o interogare s-a facut prin definirea legaturilor implicite atunci: - adaugarea lor intr-o interogare se face impreuna cu relatiile dintre ele interogarea cu stergere sterge.. daca stergerile in cascada sint active prin operatia de import nu se pot introduce in baza de date - tabele de informare din baze de date in versiuni mai vechi.. prima forma normala rezolva anomaliile - grupuri repetitive si atribute multivaloare integritatea referentiala este un sistem de reguli folosit de acces pt a se asigura ca : relatiile intre tabele sint valide care nu este un concept utilizat pt a descrie formal- uzual- fizic - domeniu-functie- functie text boxurile unei forme create automat - sint legate direct la mai multe tabele astfel incit orice modificare adusa valorilor din ele se transmite.. Numerele stocate in campuri nenumerice ale unei interogari sunt sortate: a.ca siruri de caractere Pentru realizarea unei interogari cu actualizare nu se efectueaza pasul: a)se creeeaza o interogare b)se adauga tabelele si se selecteaza campurile ce se doresc actualizate c)se stabilesc criteriile de selectie pt acestea,daca exista atunci se apasa butonul Update Query din meniul Query Type din Toolbar d) NU.......(aici este o varianta de raspuns care incepe cu NU...si aceasta este cea corecta ) Tabelul PROF cu coloanele cod_fac, cod_prof, nume, ore, salariu se intreba care este secventa corecta pentru a afisa suma salariilor tuturor profesorilor : SELECT SUM(salariu) AS TotalSalarii FROM PROF

Intr-un aranjament client/server NU :


(componentele softwer DBMS ruleaza pe un client )

Definitia unei coloane din instructiunea CREATE TABEL NU poate include : Numele tabelului O uniune Join fara o clauza WHERE sau o clauza JOIN:
Are ca rezultat un produs cartezian

Dac o tabel din baza de date cerut care a fost legat de o tabel extern, se terg
- se terge i legtura sa, nu ns i fiierul extern de care a fost legat

LABORATOR 1 SQL
CERERI MONOTABEL 1. Analizai sintaxa simplificat a comenzii SELECT. Care dintre clauze sunt obligatorii? SELECT { [ {DISTINCT | UNIQUE} | ALL] lista_campuri | *} FROM [nume_schem.]nume_obiect ] [, [nume_schem.]nume_obiect ] [WHERE condiie_clauza_where] [GROUP BY expresie [, expresie ] [HAVING condiie_clauza_having] ] [ORDER BY {expresie | poziie} [, {expresie | poziie} ] ] 2. Gsii eroarea din instruciunea urmtoare. SELECT employee_id, last_name, salary * 12 salariu anual FROM employees; Obs: SALARIU ANUAL este un alias pentru cmpul care reprezint salariul anual. Dac un alias conine blank-uri, el va fi scris obligatoriu ntre ghilimele. Altfel, ghilimelele pot fi omise. Alias-ul apare n rezultat, ca antet de coloan pentru expresia respectiv. Doar cele specificate ntre ghilimele sunt case-sensitive, celelalte fiind scrise implicit cu majuscule. Varianta 1: SELECT employee_id, last_name, salary * 12 salariu_anual FROM employees; Varianta 2: SELECT employee_id, last_name, salary * 12 " Salariu Anual " FROM employees; 3. S se listeze structura tabelelor din schema HR (EMPLOYEES, DEPARTMENTS, JOB_HISTORY, JOBS, LOCATIONS, COUNTRIES, REGIONS), observnd tipurile de date ale coloanelor. Obs: Se va utiliza comanda SQL*Plus DESCRIBE nume_tabel 4. S se listeze coninutul tabelelor din schema considerat, afind valorile tuturor cmpurilor. Obs: Se va utiliza comanda SQL SELECT * FROM nume_tabel; 5. S se obin nc o dat rezultatul cererii precedente, fr a rescrie cererea. Obs: Ultima comand SQL lansat de ctre client este pstrat n buffer-ul SQL. Pentru rularea acesteia se utilizeaz / sau RUN. 6. Listai structura tabelului EMPLOYEES i apoi dai comanda RUN (sau /). Ce observai? Comenzile SQL*Plus sunt pstrate n buffer? DESC employees RUN 1

7. S se afieze codul angajatului, numele, codul job-ului, data angajrii. Salvai instruciunea SQL ntr-un fiier numit p1_14.sql. Obs: Pentru salvarea ultimei comenzi SQL se utilizeaz comanda SAVE. Precizarea extensiei .sql a fiierului nu este obligatorie. SELECT employee_id, last_name, job_id, hire_date FROM employees; SAVE z:\\ p1_14.sql 8. Reexecutai cererea folosind fiierul p1_14.sql. START z:\\ p1_14.sql sau @ z:\\ p1_14.sql 9. Editai fiierul p1_14.sql, adugnd coloanelor cte un alias (cod, nume, cod job, data angajarii). EDIT z:\\ p1_14.sql Cererea se modific astfel: SELECT employee_id cod, last_name nume, job_id " cod job ", hire_date " data angajarii " FROM employees; @ z:\\ p1_14.sql 10. S se listeze, cu i fr duplicate, codurile job-urilor din tabelul EMPLOYEES. SELECT job_id FROM employees; SELECT DISTINCT job_id FROM employees; SELECT UNIQUE job_id FROM employees; Obs. DISTINCT = UNIQUE 11. S se afieze numele concatenat cu prenumele, separate prin spaiu. Etichetai coloana Nume si prenume. Obs: Operatorul de concatenare este ||. irurile de caractere se specific ntre apostrofuri (NU ghilimele, caz n care ar fi interpretate ca alias-uri). SELECT last_name|| ' ' || first_name " Nume si prenume " FROM employees; 12. S se listeze numele i salariul angajailor care ctig mai mult de 10000 $. SELECT last_name, salary FROM employees WHERE salary > 10000; 13. S se modifice cererea anterioar astfel nct s afieze numele i salariul pentru toi angajaii al cror salariu este cuprins ntre 5000$ i10000$. Obs: Pentru testarea apartenenei la un domeniu de valori se poate utiliza operatorul [NOT] BETWEEN valoare1 AND valoare2 SELECT last_name, salary FROM employees WHERE salary BETWEEN 5000 AND 10000; 14. S se creeze o cerere pentru a afia numele angajatului i numrul departamentului pentru angajatul 104. 2

SELECT last_name, department_id FROM employees WHERE employee_id =104; 15. S se afieze numele i salariul pentru toi angajaii din departamentele 10 sau 30, n ordine alfabetic a numelor. Obs: Apartenena la o mulime finit de valori se poate testa prin intermediul operatorului IN, urmat de lista valorilor ntre paranteze i separate prin virgule: expresie IN (valoare_1, valoare_2, , valoare_n) SELECT last_name, salary FROM employees WHERE department_id IN (10, 30) ORDER BY last_name; 16. S listeze numele i salariile angajailor care ctig mai mult de 10000 $ i lucreaz n departamentul 10 sau 30. Se vor eticheta coloanele drept Angajat si Salariu lunar. 17. Care este data curent? Obs: Pseudocoloana care returneaz data curent este SYSDATE. Pentru completarea sintaxei obligatorii a comenzii SELECT, se utilizeaz tabelul DUAL: SELECT SYSDATE FROM dual; Datele calendaristice pot fi formatate cu ajutorul funciei TO_CHAR(data, format), unde formatul poate fi alctuit dintr-o combinaie a urmtoarelor elemente: Element D DD DDD DY DAY MM MON MONTH Y YY, YYY, YYYY YEAR HH12, HH24 MI SS SSSSS Semnificaie Numrul zilei din sptmn (duminic=1; luni=2; smbt=6). Numrul zilei din lun. Numrul zilei din an. Numele zilei din sptmn, printr-o abreviere de 3 litere (MON, THU etc.) Numele zilei din sptmn, scris n ntregime. Numrul lunii din an. Numele lunii din an, printr-o abreviere de 3 litere (JAN, FEB etc.) Numele lunii din an, scris n ntregime. Ultima cifr din an Ultimele 2, 3, respectiv 4 cifre din an. Anul, scris n litere (ex: two thousand four). Orele din zi, ntre 0-12, respectiv 0-24. Minutele din or. Secundele din minut. Secundele trecute de la miezul nopii.

18. S se afieze numele i data angajrii pentru fiecare salariat care a fost angajat n 1987. Se cer 2 soluii: una n care se lucreaz cu formatul implicit al datei i alta prin care se formateaz data. 3

Varianta1: SELECT first_name, last_name, hire_date FROM employees WHERE hire_date LIKE (%87); Varianta 2: SELECT first_name, last_name, hire_date FROM employees WHERE TO_CHAR(hire_date, YYYY)=1987; Sunt obligatorii ghilimelele de la irul 1987? Ce observai? 19. S se afieze numele i job-ul pentru toi angajaii care nu au manager. SELECT last_name, job_id FROM employees WHERE manager_id IS NULL; 20. S se afieze numele, salariul i comisionul pentru toi salariaii care ctig comisioane. S se sorteze datele n ordine descresctoare a salariilor, iar pentru cei care au acelai salariu n ordine cresctoare a comisioanelor. SELECT last_name, salary, commission_pct FROM employees WHERE commission_pct IS NOT NULL ORDER BY salary DESC, commission_pct ASC; 21. S se listeze numele tuturor angajailor care au a treia litera din nume 'a'. Obs: Pentru a forma mtile de caractere utilizate mpreun cu operatorul LIKE cu scopul de a compara irurile de caractere, se utilizeaz: % - reprezentnd orice ir de caractere, inclusiv irul vid; _ (underscore) reprezentnd un singur caracter. SELECT DISTINCT last_name FROM employees WHERE last_name LIKE '__a%'; 22. Folosind data curent s se afieze urmtoarele informaii: - numele zilei, numrul zilei din sptmn, numrul zilei din luna, respectiv numrul zilei din an; - numrul lunii din an, numele lunii cu abreviere la 3 caractere, respectiv numele complet al lunii; - ora curent (ora, minute, secunde). 23. S se listeze numele departamentelor care funcioneaz n locaia avnd codul 1700 i al cror manager este cunoscut. 24. S se afieze codurile departamentelor n care lucreaz salariai. 25. S se afieze numele i prenumele salariailor angajai n luna mai 1987. 26. S se listeze codurile angajailor care au avut i alte joburi fa de cel prezent. S se ordoneze rezultatul descresctor dup codul angajatului. 27. S se afieze numele i data angajrii pentru cei care lucreaz n departamentul 80 i au fost angajai n luna martie a anului 1997. 28. S se afieze numele joburilor care permit un salariu cuprins ntre 8300$ i 14000$. 29. Care este grila de salarizare pentru un salariu de 10000$? 4

30. S se listeze numele tuturor angajailor care au 2 litere 'L' n nume i lucreaz n departamentul 30 sau managerul lor este 123. 31. S se afieze numele, job-ul i salariul pentru toi salariaii al cror job conine irul 'CLERK' sau 'REP' i salariul nu este egal cu 1000, 2000 sau 3000 $. 32. S se afieze numele, salariul i comisionul pentru toi angajaii al cror salariu este mai mare dect de 5 ori valoarea comisionului (salary*commission_pct*5).

LABORATOR 2 - SQL
FUNCII SQL (single-row) Funciile SQL sunt predefinite n sistemul Oracle i pot fi utilizate n instruciuni SQL. Ele nu trebuie confundate cu funciile definite de utilizator, scrise n PL/SQL. Dac o funcie SQL este apelat cu un argument avnd un alt tip de date dect cel ateptat, sistemul convertete implicit argumentul nainte s evalueze funcia. Dac o funcie SQL este apelat cu un argument null, atunci aceasta returneaz valoarea null. Singurele funcii care nu urmeaz aceast regul sunt CONCAT, NVL i REPLACE. Principalele funcii SQL pot fi clasificate n urmtoarele categorii: Funcii single-row Funcii multiple-row (funcii agregat)

Funciile single-row returneaz cte o linie rezultat pentru fiecare linie a tabelului sau vizualizrii interogate. Aceste funcii pot aprea n listele SELECT, clauzele WHERE, START WITH, CONNECT BY i HAVING. 1. Analizai urmtoarele funcii pentru prelucrarea irurilor de caractere: Semnificaie Exemplu Convertete un ir de caractere LOWER (expresie) LOWER ('AbCdE') = 'abcde' la minuscule. Convertete un ir de caractere UPPER (expresie) UPPER ('AbCdE') = 'ABCDE' la majuscule. Convertete un ir de caractere la un ir care ncepe cu INITCAP (expresie) INITCAP ('AbCdE') = 'Abcde' majuscul i continu cu minuscule. Extrage din expresia de tip ir de caractere, n caractere ncepnd cu poziia m. Dac SUBSTR ('AbCdE', 2, 2) = 'bC' lipsete argumentul n, atunci SUBSTR ('AbCdE', 2) = 'bCdE' SUBSTR (expresie, m[, n]) extrage toate caracterele pn la SUBSTR ('AbCdE', -3,2) = 'Cd' sfritul irului. Dac m este SUBSTR ('AbCdE', -3) = 'CdE' negativ numrtoarea poziiilor ncepe de la sfritul irului de caractere spre nceput. Returneaz numrul de LENGTH (expresie) LENGTH ('AbCdE') = 5 caractere al expresiei. Returneaz poziia la care se gsete a n-a ocurent a INSTR (LOWER('AbC aBcDe'), 'ab', 5, 2) expresiei 'expr1' n cadrul =0 INSTR (expresie, expr1[, m][, n]) expresiei 'expresie', cutarea INSTR (LOWER('AbCdE aBcDe'), 'ab', 5) ncepnd de la poziia m. Daca =7 m sau n lipsesc, valorile implicite sunt 1 pentru ambele. LTRIM (expresie[, expr1]) sau Reversul funciilor LPAD, RTRIM ('abcdeXXXX', 'X') RTRIM (expresie[, expr1]) RPAD. Truncheaz expresia = 'abcde' Funcie

caracter la stnga sau la dreapta LTRIM (' prin eliminarea succesiv a caracterelor din expresia expr1. Implicit, daca lipsete, expr1 este ' ' un spaiu.

abcde') = 'abcde'

TRIM (LEADING 'X' FROM Permite eliminarea caracterelor 'XXXabcdeXXX') = 'abcdeXXX' TRIM (LEADING | TRAILING | specificate (caractere_trim) de TRIM (TRAILING 'X' FROM BOTH caractere_trim FROM la nceputul (leading) , sfritul 'XXXabcdeXXX') = 'XXXabcde' expresie) (trailing) sau din ambele pri, TRIM ( BOTH 'X' FROM dintr-o expresie caracter data. 'XXXabcdeXXX') = 'abcde' TRIM (' abcde ') = 'abcde'

2. S se afieze pentru fiecare angajat din departamentul 20 un ir de caractere de forma "Funcia salariatului {prenume} {nume} este {cod functie}". S se afieze prenumele cu iniiala litera mare, iar numele cu litere mari (Stephen KING), iar codul funciei s se afieze cu litere mici. 3. S se afieze pentru angajatul cu numele 'HIGGINS' codul, numele i codul departamentului. Cum se scrie condiia din WHERE astfel nct s existe sigurana ca angajatul 'HIGGINS' va fi gsit oricum ar fi fost introdus numele acestuia? Cutarea trebuie s nu fie case-sensitive, iar eventualele blank-uri care preced sau urmeaz numelui trebuie ignorate. UPPER(TRIM(last_name))='HIGGINS'; 4. S se afieze pentru toi angajaii al cror nume se termin n 'n', codul, numele, lungimea numelui i poziia din nume n care apare prima data litera 'a'. Asociai aliasuri coloanelor returnate de cerere. SELECT employee_id, last_name, LENGTH(last_name), INSTR(UPPER(last_name), 'A') FROM employees WHERE SUBSTR(last_name,-1)='n'; 5. Analizai urmtoarele funcii aritmetice: Funcie Semnificaie Exemplu

ROUND(1.6) = 2 Returneaz valoarea rotunjit a expresiei ROUND(1.4) = 1 pn la n zecimale. Daca n este negativ sunt ROUND (expresie [, n]) ROUND (1234.56,1) = 1234.6 rotunjite cifre din stnga virgulei. Valoarea ROUND (1230.56, -2) = 1200 implicit pentru n este 0. ROUND (1260.56, -2) = 1300 MOD (m,n) Returneaz restul mpririi lui m la n. MOD (11, 4) = MOD (11, -4) = 3 MOD(-11, 4) = MOD (-11, -4) = -3

6. S se afieze detalii despre salariaii care au lucrat un numr ntreg de sptmni pn la data curent. MOD(ROUND(SYSDATE hire_date), 7)=0; 7. S se afieze numele, salariul i numrul de mii al salariului rotunjit la 2 zecimale pentru cei care nu au salariul divizibil cu 1000.

8. Analizai urmtoarele operaii pe expresii de tip dat calendaristic: Operaie date -/+ number date1 - date2 date +/number/24 Tipul de date al rezultatului Date Number Date Descriere Scade/Adaug un numr de zile dintr-o / la o dat. ntoarce numrul de zile dintre dou date calendaristice. Scade/Adaug un numr de ore la o / dintr-o dat calendaristic.

9. S se afieze data (luna, ziua, ora, minutul si secunda) de peste 10 zile. SYSDATE+10 10. S se afieze numrul de zile rmase pn la sfritul anului. ROUND(TO_DATE(31-DEC-2009)-SYSDATE) 11. a. S se afieze data de peste 12 ore. SYSDATE+12/24 b. S se afieze data de peste 5 minute. SYSDATE+1/288 12. Analizai urmtoarele funcii pentru prelucrarea datelor calendaristice: Funcie SYSDATE Semnificaie Exemplu ntoarce data i timpul curent Returneaz numrul de luni dintre data date1 i data date2. Rezultatul poate fi pozitiv sau negativ dup cum ROUND(MONTHS_BETWEEN date1 este mai recent sau nu fa de (SYSDATE + 31, SYSDATE)) = 1 date2. Zecimalele reprezint pari dintr-o luna! Adaug n luni la o data specificat. Valoarea n trebuie s fie ntreag (pozitiv sau negativ). Returneaz data corespunztoare primei zile a sptmnii specificate (char) care urmeaz dup date. MONTHS_BETWEEN (ADD_MONTHS(SYSDATE, 3), SYSDATE) = 3 NEXT_DAY('15-dec-2006','Monday') = '18-dec-2006' NEXT_DAY ('15-dec-2006',1) = '18-dec-2006'

MONTHS_BETWEEN (date1, date2)

ADD_MONTHS (date, n)

NEXT_DAY (date, char)

13. S se afieze numele angajatului, data angajrii i data negocierii salariului, care a avut loc n prima zi de Luni, dup 6 luni de serviciu. Etichetai aceast coloan Negociere. NEXT_DAY(ADD_MONTHS(hire_date, 6), Monday) 14. Pentru fiecare angajat s se afieze numele i numrul de luni de la data angajrii. Etichetai coloana Luni lucrate. S se ordoneze rezultatul dup numrul de luni lucrate. Se va rotunji numrul de luni la cel mai apropiat numr ntreg. SELECT last_name, ROUND(MONTHS_BETWEEN(SYSDATE, hire_date)) Luni lucrate FROM employees ORDER BY MONTHS_BETWEEN(SYSDATE, hire_date);

SELECT last_name, ROUND(MONTHS_BETWEEN(SYSDATE, hire_date)) Luni lucrate FROM employees ORDER BY Luni lucrate; SELECT last_name, ROUND(MONTHS_BETWEEN(SYSDATE, hire_date)) Luni lucrate FROM employees ORDER BY 2; 15. Analizai urmtoarele funcii de conversie: Obs. Conversiile implicite asigurate de server-ul Oracle sunt: de la VARCHAR2 sau CHAR la NUMBER; de la VARCHAR2 sau CHAR la DATE; de la NUMBER la VARCHAR2 sau CHAR; de la DATE la VARCHAR2 sau CHAR. SELECT last_name FROM employees WHERE TO_CHAR(hire_date,'yyyy')=1994; SELECT last_name FROM employees WHERE hire_date='07-JUN-1994'; SELECT employee_id||' '||last_name||' '||hire_date FROM employees WHERE department_id=10; Conversiile explicite se realizeaz cu ajutorul funciilor de tip TO_{tip} Semnificaie Exemplu Convertete o valoare de tip numeric sau dat TO_CHAR('3') = ' 3' calendaristic, la un ir de caractere conform cu TO_CHAR(-12) = '-12' TO_CHAR formatul specificat sau cu setrile naionale TO_CHAR(sysdate, 'DDMMYYYY') (expr_number_sau specificate (NLS - National Language Support). _date[, format][, = ' 09122004' Daca formatul sau parametrii lipsesc se nlsparameters]) TO_CHAR (sysdate + 365 * 57, utilizeaz formatul i parametrii implicii. 'ddmmyyyy') = ' 25112061' Formatul este case sensitive. TO_NUMBER (expr_char[, format][, nlsparameters]) TO_DATE (expr_char[, format][, nlsparameters]) Convertete o valoare de tip ir de caractere la o valoare numeric conform cu formatul TO_NUMBER ('-12.22', 'S99.99') specificat. Dac formatul sau parametrii lipsesc = -12.22 se utilizeaz formatul i parametrii implicii. Convertete o valoare de tip ir de caractere la o valoare de tip dat calendaristic n TO_DATE ('15-feb-2006','dd-monconformitate cu formatul specificat. Dac yyyy') formatul sau parametrii lipsesc se utilizeaz formatul i parametrii implicii. Funcie

16. S se afieze numele i prenumele pentru toi angajaii care s-au angajat n luna mai.

17. Analizai urmtoarele funcii SQL: Funcie Semnificaie Returneaz expr1 dac aceasta nu este NULL, expr2 n caz contrar. Cele 2 expresii trebuie s aib acelai tip sau expr2 s permit conversia implicit la tipul expresiei expr1. Dac expr1 este nenul atunci returneaz expr2, altfel Returneaz expr3 Exemplu NVL(NULL, 1) = 1 NVL(2, 1) = 2 NVL('c', 1) = 'c' -- face conversie NVL(1, 'c') -- eroare --nu face conversie NVL2 (1, 2, 3) = 2 NVL2 (NULL, 2, 3) = 3

NVL (expr1, expr2)

NVL2 (expr1, expr2, expr3)

18. S se afieze numele angajailor i comisionul. Dac un angajat nu ctig comision, s se scrie Fara comision. Etichetai coloana Comision. NVL(TO_CHAR(commission_pct), Fara comision) 19. S se listeze numele, salariul i comisionul tuturor angajailor al cror venit lunar depete 10000$. salary * NVL(commission_pct, 0) venit_lunar 20. Analizai expresia CASE i funcia DECODE: Funcie/Expresie CASE expr WHEN expr_bool1 THEN return_expr1 [WHEN expr_bool2 THEN return_expr2 ... WHEN expr_booln THEN return_exprn ] [ELSE return_expr] END DECODE (expr, expr_cautare1, expr_rezultat1, [expr_cautare2, expr_rezultat2, .. expr_cautaren, expr_rezultatn, ] [rezultat_implicit]) Semnificaie n funcie de valoarea unei expresii returneaz valoarea primei perechi WHEN .. THEN care se potrivete sau dac nu se potrivete nici una expresia din ELSE. Nu se poate specifica NULL pentru toate expresiile de returnat. (return_expri). Toate expresiile trebuie sa aib acelai tip de date Decodific valoarea expresiei. Dac valoarea expresiei este expr_cautarei atunci e returnat expr_rezultati. Dac nu se potrivete nici o expresie de cutare atunci e returnat rezultat_implicit. Exemplu

DECODE (1, 1, 2, 3) = 2 DECODE (2, 1, 2, 3) = 3 DECODE (3, 1, 2, 3) = 3

21. S se afieze numele, codul funciei, salariul i o coloana care s arate salariul dup mrire. Se tie c pentru IT_PROG are loc o mrire de 10%, pentru ST_CLERK 15%, iar pentru SA_REP o mrire de 20%. Pentru ceilali angajai nu se acord mrire. S se denumeasc coloana "Salariu revizuit". SELECT last_name, job_id, salary, DECODE(job_id, IT_PROG, salary*1.1, ST_CLERK, salary*1.15, SA_REP, salary*1.2, salary ) salariu revizuit FROM employees; SELECT last_name, job_id, salary, CASE job_id WHEN IT_PROG THEN salary* 1.1

WHEN ST_CLERK THEN salary*1.15 WHEN SA_REP THEN salary*1.2 ELSE salary END salariu revizuit FROM employees; SELECT last_name, job_id, salary, CASE WHEN job_id= IT_PROG THEN salary* 1.1 WHEN job_id=ST_CLERK THEN salary*1.15 WHEN job_id =SA_REP THEN salary*1.2 ELSE salary END salariu revizuit FROM employees; 22. S se afieze numele salariatului i codul departamentului n care acesta lucreaz. Dac exist salariai care nu au un cod de departament asociat, atunci pe coloana id_depratment s se afieze: a. textul fara departament; b. valoarea zero. 23. a. S se afieze numele angajailor care nu au manager. b. S se afieze numele angajailor i codul managerilor lor. Pentru angajaii care nu au manager s apar textul nu are sef. 24. S se afieze numele salariatului i: - venitul anual dac are comision; - salariul dac nu are comision. Se va utiliza funcia NVL2. 25. S se afieze numele salariatului, salariul i salariul revizuit astfel: - dac lucreaz de mai mult de 200 de luni atunci salariul va fi mrit cu 20%; - dac lucreaz de mai mult de 150 de luni, dar mai puin de 200 de luni, atunci salariul va fi mrit cu 15%; - dac lucreaz de mai mult de 100 de luni, dar mai puin de 150 de luni, atunci salariul va fi mrit cu 10%; - altfel, salariul va fi mrit cu 5%.

LABORATOR 3 - SQL CERERI MULTITABEL, SUBCERERI Atunci cnd n clauza FROM a unei comenzi SELECT apar mai multe tabele se realizeaz produsul cartezian al acestora. De aceea numrul de linii rezultat crete considerabil, fiind necesar restricionarea acestora cu o clauza WHERE. Atunci cnd este necesar obinerea de informaii din mai multe tabele se utilizeaz condiii de join. Join-ul este operaia de regsire a datelor din dou sau mai multe tabele, pe baza valorilor comune ale unor coloane. Condiiile de corelare utilizeaz de obicei coloanele cheie primar i cheie extern. Pentru claritatea i eficiena accesului la baza de date se recomand prefixarea numelor coloanelor cu numele tabelelor din care fac parte (tabel.coloana). De asemenea, exist posibilitatea de a utiliza aliasuri pentru tabelele din clauza FROM i utilizarea lor n cadrul comenzii SELECT respective (alias.coloana). Aceast identificare (prin 'tabel.coloana' sau 'alias.coloana') este obligatorie atunci cnd se face referin la o coloana ce apare n mai mult de un tabel din clauza FROM. Tipuri de join: equijoin (se mai numete inner join sau simple join) - compunerea a dou tabele diferite dup o condiie ce conine operatorul de egalitate. SELECT last_name, department_name, location_id, e.department_id FROM employees e, departments d WHERE e.department_id = d.department_id; Obs: Numele sau alias-urile tabelelor sunt obligatorii n dreptul coloanelor care au acelai nume n mai multe tabele. nonequijoin - compunerea a dou relaii tabele dup o condiie oarecare, ce NU conine operatorul de egalitate. SELECT last_name, salary, grade_level FROM employees, job_grades WHERE salary BETWEEN lowest_sal AND highest_sal; outerjoin - compunerea extern a dou tabele diferite completnd una dintre relaii cu valori NULL acolo unde nu exist n aceasta nici un tuplu ce ndeplinete condiia de corelare. Relaia completat cu valori NULL este cea n dreptul creia apare (+). Operatorul (+) poate fi plasat n orice parte a condiiei de join, dar nu n ambele pri. Full outer join = Left outer join UNION Right outer join. SELECT last_name, department_name,location_id FROM employees e, departments d WHERE e.department_id(+) = d.department_id; selfjoin - compunerea extern a unui tabel cu el nsui dup o condiie dat. SELECT sef.last_name, angajat.last_name FROM employees sef, employees angajat WHERE sef.employee_id = angajat.manager_id ORDER BY sef.last_name; 1. Pentru fiecare angajat s se afieze numele, codul i numele departamentului. SELECT last_name, e.department_id, department_name FROM employees e, departments d WHERE e.department_id = d.department_id; 2. S se afieze numele angajatului, numele departamentului pentru toi angajaii care ctig comision. 3. S se listeze numele job-urile care exist n departamentul 30. SELECT DISTINCT job_title FROM employees e, jobs j WHERE e.job_id = j.job_id AND department_id = 30;

4. S se afieze numele, job-ul i numele departamentului pentru toi angajaii care lucreaz n Seattle. SELECT last_name, job_id, department_name FROM employees e, departments d, locations s WHERE e.department_id = d.department_id AND d.location_id = s.location_id AND city = Seattle; 5. S se afieze numele, salariul, data angajrii i numele departamentului pentru toi programatorii care lucreaz n America. region_name = Americas job_title = Programmer 6. S se afieze numele salariailor i numele departamentelor n care lucreaz. Se vor afia i salariaii care nu lucreaz ntr-un departament (right outher join). SELECT last_name, department_name FROM employees e, departments d WHERE e.department_id = d.department_id(+); 7. S se afieze numele departamentelor i numele salariailor care lucreaz n ele. Se vor afia i departamentele care nu au salariai (left outher join). 8. S se afieze numele, job-ul, numele departamentului, salariul i grila de salarizare pentru toi angajaii. 9. S se afieze codul angajatului i numele acestuia, mpreun cu numele i codul efului su direct. Se vor eticheta coloanele Ang#, Angajat, Mgr#, Manager. S se salveze instruciunea ntr-un fiier numit p3_9.sql. SELECT a.employee_id Ang#, a.last_name Angajat, b.employee_id Mgr#, b.last_name Manager FROM employees a, employees b WHERE a.manager_id = b. employee_id; 10. S se modifice p3_9.sql pentru a afia toi salariaii, inclusiv pe cei care nu au ef. 11. S se afieze numele salariatului i data angajrii mpreun cu numele i data angajrii efului direct pentru salariaii care au fost angajai naintea efilor lor. Se vor eticheta coloanele Angajat, Data_ang, Manager si Data_mgr. 12. Pentru fiecare angajat din departamentele 20 i 30 s afieze numele, codul departamentului i toi colegii si (salariaii care lucreaz n acelai departament cu el). Se vor eticheta coloanele corespunztor. SELECT a.last_name Angajat, a.department_id Departament, b.last_name Coleg FROM employees a, employees b WHERE a.department_id = b.department_id AND a.employee_id <> b.employee_id AND a.department_id IN (20,30) ORDER BY a.last_name; 13. S se afieze numele i data angajrii pentru salariaii care au fost angajai dup Fay. SELECT last_name, hire_date FROM employees WHERE hire_date > (SELECT hire_date FROM employees WHERE last_name = Fay); sau SELECT a.last_name, a.hire_date FROM employees a, employees b WHERE UPPER(b.last_name)=FAY AND a.hire_date>b.hire_date; 14. Scriei o cerere pentru a afia numele i salariul pentru toi colegii (din acelai departament) lui Fay. Se va exclude Fay. SELECT last_name, salary

FROM employees WHERE last_name <> Fay AND department_id = (SELECT department_id FROM employees WHERE last_name = Fay); 15. S se afieze codul departamentului, codul i numele angajailor care lucreaz n acelai departament cu cel puin un angajat al crui nume conine litera T. S se ordoneze dup codul departamentului. SELECT employee_id, last_name, department_id FROM employees WHERE department_id IN (SELECT DISTINCT department_id FROM employees WHERE UPPER(last_name) LIKE %T%) ORDER BY department_id; 16. S se afieze numele i salariul angajailor condui direct de Steven King. SELECT last_name, salary FROM employees WHERE manager_id = (SELECT employee_id FROM employees WHERE UPPER(last_name) ='KING' AND UPPER(first_name) ='STEVEN' ); 17. S se afieze numele i job-ul tuturor angajailor din departamentul Sales. SELECT last_name, job_id FROM employees WHERE department_id = (SELECT department_id FROM departments WHERE department_name ='Sales'); 18. S se afieze numele angajailor, numrul departamentului i job-ul tuturor salariailor al cror departament este localizat n Seattle. SELECT last_name, job_id, department_id FROM employees WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = (SELECT location_id FROM locations WHERE city = Seattle)); Rezolvai aceast problem utiliznd join-uri. 19. S se afle dac exist angajai care nu lucreaz n departamentul Sales i al cror salariu i comision coincid cu salariul i comisionul unui angajat din departamentul Sales. SELECT last_name, salary, commission_pct, department_id FROM employees WHERE (salary, commission_pct) IN (SELECT salary, commission_pct FROM employees e, departments d WHERE e.department_id = d.department_id AND department_name = Sales) AND department_id <> (SELECT department_id FROM departments WHERE department_name = Sales); 20. Scriei o cerere pentru a afia numele, numele departamentului i salariul angajailor care nu ctig comision, dar al cror manager coincide cu managerul unui angajat care ctig comision.

SELECT last_name, department_name, salary FROM employees e, departments d WHERE e.department_id = d.department_id AND e.manager_id IN (SELECT DISTINCT manager_id FROM employees WHERE commission_pct IS NOT NULL) AND commission_pct IS NULL; 21. Scriei o cerere pentru a afia angajaii care ctig mai mult dect oricare funcionar. Sortai rezultatele dup salariu, n ordine descresctoare. SELECT last_name, salary, job_id FROM employees WHERE salary > (SELECT MAX(salary) FROM employees WHERE job_id LIKE '%CLERK') ORDER BY salary DESC; 22. S se afieze codul, numele i salariul tuturor angajailor care ctig mai mult dect salariul mediu. 23. S se afieze pentru fiecare salariat angajat n luna martie numele su, data angajrii i numele jobului. 24. S se afieze pentru fiecare salariat al crui ctig total lunar este mai mare dect 12000 numele su, ctigul total lunar i numele departamentului n care lucreaz. 25. S se afieze pentru fiecare angajat codul su i numele joburilor sale anterioare, precum i intervalul de timp n care a lucrat pe jobul respectiv. 26. S se modifice cererea de la punctul 25 astfel nct s se afieze i numele angajatului, respectiv codul jobului su curent. 27. S se modifice cererea de la punctul 26 astfel nct s se afieze i numele jobului su curent. 28. S se afieze salariaii care au acelai manager ca i angajatul avnd codul 140. 29. S se afieze numele departamentelor care funcioneaz n America.

LABORATOR 4 - SQL Funcii multiple-row (grup). Gruparea datelor. Aceste tipuri de funcii pot fi utilizate pentru a returna informaia corespunztoare fiecruia dintre grupurile obinute n urma divizrii liniilor tabelului cu ajutorul clauzei GROUP BY. Pot aprea n clauzele SELECT, ORDER BY i HAVING. Server-ul Oracle aplic aceste funcii fiecrui grup de linii i returneaz un singur rezultat pentru fiecare mulime. Exemple de funcii grup: AVG, SUM, MAX, MIN, COUNT etc. Tipurile de date ale argumentelor funciilor grup pot fi CHAR, VARCHAR2, NUMBER sau DATE. Funciile AVG i SUM, opereaz numai asupra valorilor numerice. Funciile MAX i MIN pot opera asupra valorilor numerice, caracter sau dat calendaristic. Toate funciile grup, cu excepia lui COUNT(*), ignor valorile null. COUNT(expresie) returneaz numrul de linii pentru care expresia dat nu are valoarea null. Funcia COUNT returneaz un numr mai mare sau egal cu zero i nu ntoarce niciodat valoarea null. Cnd este utilizat clauza GROUP BY, server-ul sorteaz implicit mulimea rezultat n ordinea cresctoare a valorilor coloanelor dup care se realizeaz gruparea. Absena clauzei GROUP BY conduce la aplicarea funciei grup pe mulimea tuturor liniilor tabelului.
n clauza GROUP BY se trec obligatoriu toate coloanele prezente n clauza SELECT, care nu sunt argument al funciilor grup.

1. S se afieze cel mai mare salariu, cel mai mic salariu, suma i media salariilor tuturor angajatilor. Etichetai coloanele Maxim, Minim, Suma, respectiv Media. S se rotunjeasc rezultatele. SELECT MIN(salary) min, MAX(salary) max, SUM(salary) suma, ROUND(AVG(salary)) media FROM employees; 2. Utiliznd funcia grup COUNT s se determine: a. numrul total de angajai; b. numrul de angajai care au manager; c. numrul de manageri. 3. S se afieze diferena dintre cel mai mare i cel mai mic salariu. Etichetai coloana Diferenta. 4. S se listeze numrul de angajai din departamentul avnd codul 50. 5. Cai angajai din departamentul 80 ctig comision? 6. S se selecteze valoarea medie i suma salariilor pentru toi angajaii care sunt reprezentani de vnzri (SA_MAN, SA_REP). 7. S se selecteze data angajrii primei persoane care a fost angajat de companie. 8. S se afieze numrul de angajai pentru fiecare job. SELECT job_id, COUNT(employee_id) nr_angajati FROM employees GROUP BY job_id; 9. S se afieze minimul, maximul, suma i media salariilor pentru fiecare departament. 10. S se afieze codul departamentului i media salariilor pentru fiecare job din cadrul acestuia. SELECT department_id, job_id, AVG(salary) FROM employees GROUP BY department_id, job_id; 11. a. S se afieze codul departamentelor pentru care salariul minim depete 5000$. SELECT department_id, MIN(salary) FROM employees GROUP BY department_id HAVING MIN(salary)>5000; 1

b. S se modifice cererea anterioar astfel nct s se afieze i oraul n care funcioneaz aceste departamente. 12. S se obin codul departamentelor i numrul de angajai al acestora pentru departamentele care au cel puin 10 angajai. 13. S se obin codul departamentelor i suma salariilor angajailor care lucreaz n acestea, n ordine descresctoare dup sum. Se consider angajaii care au comision i departamentele care au mai mult de 5 angajai. 14. S se obin job-ul pentru care salariul mediu este minim. SELECT job_id FROM employees GROUP BY job_id HAVING AVG(salary) = (SELECT MIN(AVG(salary)) FROM employees GROUP BY job_id); 15. S se afieze cel mai mare dintre salariile medii pe departamente. 16. a. S se afieze codul, numele departamentului i suma salariilor pe departamente. SELECT d.department_id, department_name,a.suma FROM departments d, (SELECT department_id ,SUM(salary) suma FROM employees GROUP BY department_id) a WHERE d.department_id =a.department_id; b. Dai o alt metod de rezolvare a acestei probleme. 17. a. Scriei o cerere pentru a afia numele departamentului, numrul de angajai i salariul mediu pentru angajaii din acel departament. Coloanele vor fi etichetate Departament, Nr. angajati, Salariu Mediu. SELECT department_name Departament, (SELECT COUNT(employee_id) FROM employees WHERE department_id = d.department_id ) Nr. angajati, (SELECT AVG(salary) FROM employees WHERE department_id = d.department_id) Salariu mediu FROM departments d; b. Dai o alt metod de rezolvare pentru problema anterioar. 18. S se creeze o cerere prin care s se afieze numrul total de angajai i, din acest total, numrul celor care au fost angajai n 1997, 1998, 1999 i 2000. Datele vor fi afiate n forma urmtoare: Total 1997 1998 1999 2000 -------------------------------------------------------------50 10 5 25 1 SUM(DECODE(TO_CHAR(hire_date,'yyyy'),1997,1,0))

Operatorii ROLLUP i CUBE


Clauza GROUP BY permite gruparea liniilor selectate dup valorile expresiilor precizate n aceasta. Pentru fiecare grup, va fi returnat o singur linie de informaie. Clauza GROUP BY poate produce grupri superagregat utiliznd extensiile CUBE sau ROLLUP. ROLLUP grupeaz liniile selectate pe baza valorilor primelor n, n - 1, , 0 expresii din specificaia GROUP BY i returneaz o singur linie pentru fiecare grup. ROLLUP creeaz grupri prin deplasarea ntr-o singur direcie, de la dreapta la stnga, de-a lungul listei de coloane specificate n clauza GROUP BY. Apoi, se aplic funcia agregat acestor grupri. Dac sunt specificate n expresii n operatorul ROLLUP, numrul de grupri generate va fi n + 1. Liniile care se bazeaz pe valoarea primelor n expresii se numesc linii obinuite, iar celelalte se numesc linii superagregat.
GROUP BY ROLLUP (expr_1, expr_2, , expr_n) genereaz n+1 tipuri de linii, corespunztoare urmtoarelor grupri: GROUP BY (expr_1, expr_2, , expr_n-1, expr_n) GROUP BY (expr_1, expr_2, , expr_n-1) GROUP BY (expr_1, expr_2) GROUP BY (expr_1) GROUP BY () corespunztor absenei clauzei GROUP BY i deci, calculului funciilor grup din cerere pentru ntreg tabelul.

CUBE grupeaz liniile selectate pe baza valorilor tuturor combinaiilor posibile ale expresiilor specificate i returneaz cte o linie totalizatoare pentru fiecare grup. Acest operator este folosit pentru a produce mulimi de rezultate care sunt utilizate n rapoarte. n vreme ce ROLLUP produce subtotalurile doar pentru o parte dintre combinaiile posibile, operatorul CUBE produce subtotaluri pentru toate combinaiile posibile de grupri specificate n clauza GROUP BY, precum i un total general. Dac exist n coloane sau expresii n clauza GROUP BY, vor exista 2n combinaii posibile superagregat. 19. S se afieze codurile departamentelor n care lucreaz cel puin un angajat, iar pentru fiecare dintre acestea i pentru fiecare manager care lucreaz n departamentul respectiv s se afieze numrul de salariai. De asemenea, s se afieze numrul de salariai pentru fiecare departament indiferent de manager i numrul total de angajai din companie. SELECT department_id, manager_id, COUNT(employee_id) FROM employees WHERE manager_id IS NOT NULL AND department_id IS NOT NULL GROUP BY ROLLUP (department_id, manager_id); department_id manager_id COUNT(employee_id) --------------------------------------------------------------------10 7782 1 10 7839 1 10 2 ----------------------------------------------------------------------20 7566 2 20 7788 1 20 7839 1 20 7902 1 20 5 ----------------------------------------------------------------------30 7698 5 30 7839 1 30 6 ----------------------------------------------------------------------13 3

20. S se afieze codurile departamentelor n care lucreaz cel puin un angajat, iar pentru fiecare dintre acestea i pentru fiecare manager care lucreaz n departamentul respectiv s se afieze numrul de salariai. De asemenea, s se afieze numrul de salariai pentru fiecare departament indiferent de manager, numrul de angajai subordonai unui manager indiferent de departament i numrul total de angajai din companie. SELECT department_id, manager_id, COUNT(employee_id) FROM employees WHERE manager_id IS NOT NULL AND department_id IS NOT NULL GROUP BY CUBE (department_id, manager_id); department_id manager_id COUNT(employee_id) --------------------------------------------------------------------10 7782 1 10 7839 1 10 2 ----------------------------------------------------------------------20 7566 2 20 7788 1 20 7839 1 20 7902 1 20 5 ----------------------------------------------------------------------30 7698 5 30 7839 1 30 6 ----------------------------------------------------------------------7566 2 7698 5 7782 1 7788 1 7839 3 7902 1 ---------------------------------------------------------------------13 21. Pentru fiecare departament, job, respectiv an al angajrii s se afieze numrul de salariai. De asemenea se va afia numrul de angajai: - pentru fiecare departament i job, indiferent de anul angajrii; - pentru fiecare departament, indiferent de job i de anul angajrii; - la nivel de companie. 22. S se afieze suma alocat pentru plata salariilor pe joburi (codul jobului), n cadrul departamentului (codul departamentului). De asemenea, s se afieze valoarea total necesar pentru plata salariilor la nivel de departament, valoarea total necesar pentru plata salariilor la nivel de job, indiferent de departament i valoarea total necesar pentru plata salariilor la nivel de companie. 23. Funcia GROUPING(expresie) ntoarce:
- valoarea 0, dac expresia a fost utilizat pentru calculul valorii agregat - valoarea 1, dac expresia nu a fost utilizat.

24. S se afieze numele departamentelor, titlurile job-urilor i valoarea medie a salariilor, pentru:
- fiecare departament i, n cadrul su pentru fiecare job; - fiecare departament (indiferent de job); - ntreg tabelul. De asemenea, s se afieze i o coloan care indic intervenia coloanelor department_name i job_title n obinerea rezultatului.

25. Modificai cererea anterioar astfel nct s se afieze numele departamentelor, titlurile job-urilor i valoarea medie a salariilor, pentru:
- fiecare departament i, n cadrul su pentru fiecare job; - fiecare departament (indiferent de job); - fiecare job(indiferent de departament); - ntreg tabelul. Cum intervin coloanele n obinerea rezultatului? S se afieze Dept, dac departamentul a intervenit n agregare i Job, dac job-ul a intervenit n agregare. DECODE(GROUPING(department_name), 0, Dept)

26. Utilizai cererea de la punctul 20. a. Eliminai clauza WHERE din aceast cerere. Analizai rezultatul obinut. b. Modificai cererea obinut astfel nct s se identifice dac o valoare null din rezultat este stocat pe una dintre coloanele manager_id sau department_id sau este produs de operatorul CUBE. 27. Clauza GROUPING SETS. Permite obinerea numai a anumitor grupri superagregat. Acestea pot fi precizate prin intermediul clauzei: GROUP BY GROUPING SETS ((expr_11, expr_12, , expr_1n), (expr_21, expr_22, expr_2m), ) 28. S se afieze numele departamentelor, numele job-urilor, codurile managerilor angajailor, maximul i suma salariilor pentru: - fiecare departament i, n cadrul su, fiecare job; - fiecare job i, n cadrul su, pentru fiecare manager; - ntreg tabelul. GROUPING SETS ((department_name, job_title), (job_title, e.manager_id), ());

LABORATOR 5 SQL I. Limbajul de control al datelor (COMMIT, SAVEPOINT, ROLLBACK) II. Limbajul de prelucrare a datelor (LMD). INSERT, UPDATE, DELETE. I. Limbajul de control al datelor (COMMIT, SAVEPOINT, ROLLBACK) Comanda COMMIT permanentizeaz modificrile care au fost realizate de tranzacia curent (o tranzacie este un set de comenzi DML - INSERT, UPDATE, DELETE sau MERGE); comanda suprim toate punctele intermediare definite n tranzacie i elibereaz blocrile tranzaciei. Observaie: Sistemul realizeaz un commit implicit: - la nchiderea normal a unui client Oracle (de exemplu SQL*Plus), - dup fiecare comand LDD (CREATE, ALTER, DROP). Comanda SAVEPOINT marcheaz un punct intermediar n procesarea tranzaciei. n acest mod este posibil mprirea tranzaciei n subtranzacii. Comanda SAVEPOINT are sintaxa: SAVEPOINT nume_pct_intermediar; Comanda ROLLBACK permite renunarea la modificrile efectuate; aceasta determin ncheierea tranzaciei, anularea modificrilor asupra datelor i restaurarea strii lor precedente. Comanda ROLLBACK are sintaxa:ROLLBACK [TO SAVEPOINT nume_punct_salvare]; Observaie: - sistemul realizeaz un rollback implicit dac sistemul se nchide anormal (defeciune hardware sau software, pan de curent etc.); - nici o comanda LDD (CREATE, ALTER; DROP) nu poate fi anulat. 1. Ce efect are urmtoarea secven de instruciuni? CREATE TABLE dept_*** AS SELECT * FROM departments; SELECT * FROM dept_***; SAVEPOINT DELETE FROM a; dept_***;

INSERT INTO dept_*** VALUES (300,Economic,100,1000); INSERT INTO dept_*** VALUES (350,Cercetare,200,2000); SAVEPOINT b;

INSERT INTO dept_*** VALUES (400,Juritic,150,3000); SELECT FROM COUNT(*) dept_***; b;


1

ROLLBACK TO

SELECT FROM

COUNT(*) dept_***; a;

ROLLBACK TO

INSERT INTO dept_*** VALUES (500,Contabilitate,175,1500); COMMIT; SELECT * FROM dept_***; II. Limbajul de prelucrare a datelor (LMD). INSERT, UPDATE, DELETE, MERGE. 1. S se creeze tabele emp_*** i dept_*** (dac nu este deja creat), avnd aceeai structur i date ca i tabelele employees, respectiv departments. 2. S se selecteze toate nregistrrile din cele dou tabele create anterior. 3. tergei toate nregistrrile din cele 2 tabele create anterior. Salvati modificarile. DELETE FROM emp_***; ... COMMIT; 4. S se listeze structura tabelului employees i s se compare cu structura tabelului emp_***. Ce observai? 5. Sintaxa simplificat a comenzii INSERT - pentru inserarea unei singuri linii: INSERT INTO nume_tabel [(col1,col2,...)] VALUES (expresie1, expresie2, ...); - pentru inserarea liniilor rezultat ale unei comenzi SELECT: INSERT INTO nume_tabel [(col1,col2,...)] {comanda_SELECT}; Observatii: lista de coloane (dac este precizat) trebuie s se potriveasc ca numr i tip de date cu lista de expresii; n loc de tabel (nume_tabel), insererea se mai poate face si prin intermediul unei vizualizri; daca se omit coloane n lista de inserare, acestea primesc valoarea NULL sau valoarea implicit. posibile probleme la inserare: - lipsa de valori pentru coloane NOT NULL, - nepotrivirea listei de coloane cu cea de expresii, - valori duplicate ce ncalc o constrngere de unicitate, - nclcarea vreunei constrngeri de integritate referenial, - nclcarea unei constrngeri de tip CHECK, - nepotrivire de tip de date, - valoare prea mare pentru coloana respectiv. dac se folosete expresia DEFAULT, atunci valoarea inserat este NULL sau valoarea implicit setat la nivel de tabel. 6. S se exemplifice cteva din erorile care pot s apar la inserare i s se observe mesajul returnat de sistem. - lipsa de valori pentru coloane NOT NULL (coloana department_name este NOT NULL) INSERT INTO dept_*** (department_id, location_id) VALUES (200, 2000); - nepotrivirea listei de coloane cu cea de expresii
2

INSERT VALUES INSERT VALUES

INTO dept_*** (200, 2000); INTO dept_*** (department_id, department_name,location_id) (200, 2000);

- nepotrivire de tip de date, INSERT INTO dept_*** (department_id, location_id) VALUES (D23, 2000); - valoare prea mare pentru coloan INSERT INTO dept_*** (department_id, location_id) VALUES (15000, 2000); 7. Copiai n tabelul emp_*** salariaii (din tabelul employees) al cror comision depete 25% din salariu. 8. Creai tabele emp1_***, emp2_*** i emp3_*** cu aceeai structur ca tabelul employees. Copiai din tabelul employees: - n tabelul emp1_*** salariaii care au salariul mai mic dect 6000; - n tabelul emp2_*** salariaii care au salariul cuprins ntre 6000 i 10000; - n tabelul emp3_*** salariaii care au salariul mai mare dect 10000. Verificai rezultatele, apoi tergei toate nregistrrile din aceste tabele. Obs. Clauza ALL determin evaluarea tuturor condiiilor din clauzele WHEN. Pentru cele a cror valoare este TRUE, se insereaz nregistrarea specificat n opiunea INTO corespunztoare. CREATE TABLE emp1_*** AS SELECT * FROM employees WHERE 1=0; CREATE TABLE emp2_*** AS SELECT * FROM employees WHERE 1=0; CREATE TABLE emp3_*** AS SELECT * FROM employees WHERE 1=0; INSERT ALL WHEN salary < =6000 THEN INTO emp1_*** WHEN salary > = 6000 AND salary <= 10000 THEN INTO emp2_*** ELSE INTO emp3_*** SELECT * FROM employees; DELETE FROM emp1_***; DELETE FROM emp2_***; DELETE FROM emp3_***; COMMIT; 9. S se creeze tabelul emp0_*** cu aceeai structur ca tabelul employees. Copiai din tabelul employees: - n tabelul emp0_*** salariaii care lucreaz n departamentul 80; - n tabelul emp1_*** salariaii care au salariul mai mic dect 6000; - n tabelul emp2_*** salariaii care au salariul cuprins ntre 6000 i 10000; - n tabelul emp3_*** salariaii care au salariul mai mare dect 10000. Dac un salariat se ncadreaz n tabelul emp0_*** atunci acesta nu va mai fi inserat i n alt tabel (tabelul corespunztor salariului su).

Obs. Clauza FIRST determin inserarea corespunztoare primei clauze WHEN a crei condiie este evaluat TRUE. Toate celelalte clauze WHEN sunt ignorate. Sintaxa simplificat a comenzii DELETE DELETE FROM nume_tabel [WHERE conditie]; 10. tergei toate nregistrrile din tabelele emp_*** i dept_***. Inserai n aceste tabele toate nregistrrile corespunztoare din employees, respectiv departments. Permanentizai modificrile. 11. tergei angajaii care nu au comision. Anulai modificrile. DELETE FROM emp_*** WHERE commission_pct IS NULL; ROLLBACK; 12. Eliminai departamentele care nu au nici un angajat. Anulai modificrile. 13. Eliminai angajaii care nu aparin unui departament valid. Anulai modificrile. 14. Sintaxa simplificat a comenzii UPDATE: UPDATE nume_tabel [alias] SET col1 = expr1[, col2=expr2] [WHERE conditie]; sau UPDATE nume_tabel [alias] SET (col1,col2,...) = (subcerere) [WHERE conditie]; Observatii: - de obicei pentru identificarea unei linii se folosete o condiie ce implic cheia primar; - dac nu apare clauza WHERE atunci sunt afectate toate liniile tabelului specificat. 15. Mrii salariul tuturor angajailor din tabelul emp_*** cu 5%. Anulai modificrile. UPDATE emp_*** SET salary = salary * 1.05; ROLLBACK; 16. Schimbai jobul tuturor salariailor din departamentul 80 care au comision n 'SA_REP'. Anulai modificrile. 17. S se promoveze Douglas Grant la manager n departamentul 20, avnd o cretere de salariu cu 1000$. 18. S se modifice jobul i departamentul angajatului avnd codul 114, astfel nct s fie la fel cu cele ale angajatului avnd codul 205. 19. Schimbai salariul i comisionul celui mai prost pltit salariat din firm, astfel nct s fie egale cu salariul si comisionul directorului. UPDATE emp_*** SET (salary, commission_pct) = (SELECT salary, commission_pct FROM emp_***
4

WHERE manager_id IS NULL) WHERE salary = (SELECT MIN(salary) FROM emp_***); ROLLBACK; 20. Pentru fiecare departament s se mreasc salariul celor care au fost angajai primii astfel nct s devin media salariilor din companie. 21. S se modifice valoarea emailului pentru angajaii care ctig cel mai mult n departamentul n care lucreaz astfel nct acesta s devin iniiala numelui concatenat cu _ concatenat cu prenumele. Anulai modificrile.

LABORATOR 6 SQL - LDD Limbajul de definire a datelor (CREATE, ALTER, DROP) Crearea tabelelor CREATE TABLE [schema.]nume_tabel ( nume_coloana tip_de_date [DEFAULT1 expr], ...); CREATE TABLE nume_tabel [(col1, col2...)] AS subcerere; 1. Creai tabelul salariat_*** avnd urmtoarea structur: Nume cod_ang nume prenume functia sef data_angajarii varsta email salariu Caracteristici NOT NULL Tip NUMBER(4) VARCHAR2(25) VARCHAR2(25) VARCHAR2(20) NUMBER(4) DATE NUMBER(2) CHAR(50) NUMBER(9,2)

Valoare implicit data curent Valoare implicit 0

CREATE TABLE salariat_*** ( cod_ang NUMBER(4) NOT NULL, nume VARCHAR2(25), prenume VARCHAR2(25), functia VARCHAR2(20), sef NUMBER(4), data_angajarii DATE DEFAULT SYSDATE, varsta NUMBER(2), email CHAR(50), salariu NUMBER(9,2) DEFAULT 0); 2. Afiai structura tabelului creat anterior. 3. Se dau urmtoarele valori:
COD _ANG NUME PRENUME FUNCTIA SEF DATA_ANG VARSTA EMAIL SALARIU

1 2 3 4

..... ..... ..... .....

..... ..... ...... ....

director functionar economist functionar

null 1 1 1

........ ......... ......... .........

30 25 45 35

..... ..... ..... ......

5500 0 3000 1000

4. Inserai n tabelul salariat_*** prima nregistrare din tabelul de mai sus fr s precizai lista de coloane n comanda INSERT. 5. Inserai a doua nregistrare folosind o list de coloane din care excludei data_angajarii i salariul care au valori implicite. Observai apoi rezultatul. 6. Inserai nregistrrile 3 i 4. 7. Creai tabelul functionar_*** care s conin funcionarii din tabelul salariat_***, avnd urmtoarele coloane: codul, numele, salariul anual i data angajrii. Verificai cum a fost creat tabelul i ce date conine.

Modificarea tabelelor 8. Adugai o nou coloan tabelului salariat_*** care s conin data naterii. ALTER TABLE salariat_*** ADD (datan DATE); 9. Modificai dimensiunea coloanei nume la 30 si pe cea a salariului la 12 cu 3 zecimale. ALTER TABLE salariat_*** MODIFY (nume VARCHAR2(30), salariu NUMBER(12,3)); 10. Modificai tipul coloanei email la VARCHAR2. 11. Modificai valoarea implicit a coloanei data_angajarii la data sistemului + o zi. 12. Eliminai coloana varsta din tabelul salariat_***. ALTER TABLE salariat_*** DROP COLUMN varsta; Redenumirea i eliminarea tabelelor RENAME nume_tabel TO nume_nou; DROP TABLE nume_tabel; 13. Redenumii tabelul functionar_*** cu funct_***. 14. Recreai tabelul functionar_*** utiliznd tabelul funct_***.. 15. Eliminai tabelul funct_***. Constrngeri Adugarea constrngerilor la crearea tabelului (CREATE TABLE) CREATE TABLE [schema.]nume_tabel ( nume_coloana tip_de_date [DEFAULT expr] [constrangere_de_coloana], ... ..[constrangere la nivel de tabel]) 16. tergei i apoi creai din nou tabelul salariat_*** cu urmtoarea structur. NUME cod_ang nume prenume data_nasterii functia sef data_angajarii email salariu cod_dept TIP NUMBER(4) VARCHAR2(25) VARCHAR2(25) DATE VARCHAR2(9) NUMBER(4) DATE VARCHAR2(20) NUMBER(12,3) NUMBER(4) CONSTRNGERE Cheie primar NOT NULL data_nasterii<data_angajarii NOT NULL Refer ca i cheie extern cod_ang din acelai tabel unic >0 Combinaia NUME + PRENUME s fie unic
2

Observaie: Constrngerile de tip CHECK se pot implementa la nivel de coloan doar dac nu refer o alt coloan a tabelului. DROP TABLE salariat_***; CREATE TABLE salariat_*** ( cod_ang NUMBER(4) PRIMARY KEY, nume VARCHAR2(25) NOT NULL, prenume VARCHAR2(25), data_nasterii DATE, functia VARCHAR2(9) NOT NULL, sef NUMBER(4) REFERENCES salariat_*** (cod_ang), data_angajarii DATE DEFAULT SYSDATE, email VARCHAR2(20) UNIQUE, salariu NUMBER(9,2) CHECK (salariu > 0), cod_dep NUMBER(4), CONSTRAINT const_c_*** CHECK (data_angajarii > data_nasterii), CONSTRAINT const_u_*** UNIQUE (nume,prenume,data_nasterii)); 17. tergei tabelul salariat_***, iar apoi recreai-l implementnd toate constrngerile la nivel de tabel. Observaie: Constrngerea de tip NOT NULL se poate declara doar la nivel de coloan. DROP TABLE salariat_***; CREATE TABLE salariat_*** ( cod_ang NUMBER(4), nume VARCHAR2(25) NOT NULL, prenume VARCHAR2(25), data_nasterii DATE, functia VARCHAR2(9) NOT NULL, sef NUMBER(4), data_angajarii DATE DEFAULT SYSDATE, email VARCHAR2(20), salariu NUMBER(9,2), cod_dep NUMBER(4), CONSTRAINT ccp_*** PRIMARY KEY (cod_ang), CONSTRAINT cce_*** FOREIGN KEY (sef) REFERENCES salariat_*** (cod_ang), CONSTRAINT cu1_*** UNIQUE (email), CONSTRAINT cc1_*** CHECK (data_angajarii > data_nasterii), CONSTRAINT cc2_***CHECK (salariu > 0), CONSTRAINT cu2_*** UNIQUE (nume,prenume,data_nasterii)); 18. Creai tabelul departament_*** care s aib urmtoarea structur. NUME COD_DEP NUME ORAS TIP NUMBER(4) VARCHAR2(20) VARCHAR2(25) CONSTRNGERI Cheie primar Not null

Adugarea constrngerilor ulterior crerii tabelului, eliminarea, activarea sau dezactivarea constrngerilor (ALTER TABLE) - adaug constrngeri ALTER TABLE nume_tabel ADD [CONSTRAINT nume_constr] tip_constr (coloana); - elimin constrngeri ALTER TABLE nume_tabel DROP [CONSTRAINT nume_constr] tip_constr (coloana); - activare/dezactivare constrngere ALTER TABLE nume_tabel MODIFY CONSTRAINT nume_constr ENABLE|DISABLE; sau ALTER TABLE nume_tabel ENABLE| DISABLE nume_constr; 19. Inserai o nou nregistrare n salariat_*** de forma:
cod nume prenume data_n functia sef data_ang email salariu cod_dep

N2

P2

11-JUN1960

economist 1

Sysdate

E2

2000

10

Ce observai? Introducei nregistrarea dar specificnd valoarea NULL pentru coloana sef. 20. ncercai s adugai o constrngere de cheie extern pe cod_dep din salariat_***. Ce observai? ALTER TABLE salariat_*** ADD CONSTRAINT cce2_*** departament_*** (cod_dep);

FOREIGN

KEY

(cod_dep)

REFERENCES

21. Inserai o nou nregistrare n departament_***. Apoi adugai constrngerea de cheie extern definit anterior. cod_dep 10 nume loc Economic Bucuresti

22. Inserai noi nregistrri n salariat_***, respectiv n departament_***. Care trebuie s fie ordinea de inserare?
cod nume prenume data_n functia sef data_ang email salariu cod_dep

N3

P3

11-JUN1967 loc Constanta

jurist

Sysdate

E3

2500

20

cod_dep nume 20 Juritic

23. tergei departamentul 20 din tabelul departament_***. Ce observai? 24. tergei constrngerea cce2_***. Recreai aceast constrngere adugnd opiunea ON DELETE CASCADE. ALTER TABLE salariat_*** DROP CONSTRAINT cce2_***; ALTER TABLE salariat_*** ADD CONSTRAINT cce2_*** FOREIGN KEY (cod_dep) REFERENCES departament_*** (cod_dep) ON DELETE CASCADE; 25. tergei departamentul 20 din tabelul departament_***. Ce observai n tabelul salariat_***? Anulai modificrile.
4

26. tergei constrngerea cce2_***. Recreai aceast constrngere adugnd opiunea ON DELETE SET NULL. ALTER TABLE salariat_*** DROP CONSTRAINT cce2_***; ALTER TABLE salariat_*** ADD CONSTRAINT cce2_*** FOREIGN KEY (cod_dep) departament_*** (cod_dep) ON DELETE SET NULL;

REFERENCES

27. ncercai s tergei departamentul 10 din tabelul departament_***. Ce observai? Consultarea dicionarului datelor Informaii despre tabelele create se gsesc n vizualizrile : USER_TABLES informaii complete despre tabelele utilizatorului curent. ALL_TABLES informaii complete despre tabelele tuturor utilizatorilor. COLS informaii despre coloane. TAB informaii de baz despre tabelele existente n schema utilizatorului curent. Informaii despre constrngeri gsim n : USER_CONSTRAINTS informaii despre constrngerile definite de utilizatorul curent; ALL_CONSTRAINTS informaii despre cosntrngerile definite de toi utilizatorii.

LABORATOR 7 SQL - LDD


Vizualizri. Secvene. Indeci. Sinonime.

Definirea vizualizrilor
Vizualizrile sunt tabele virtuale care sunt construite pe baza unor tabele sau vizualizri, denumite tabele de baz. Ele nu conin date ci sunt ca nite imagini logice asupra datelor din tabelele de baz. Sunt definite de o cerere SQL, de aceea mai sunt denumite i cereri stocate. Avantajele utilizrii vizualizrilor: - restricionarea accesului la date; - simplificarea unor cereri complexe; - prezentarea de diferite imagini asupra datelor. Vizualizrile se pot fi simple sau complexe. Asupra vizualizrilor simple se pot realiza operaii LMD. Asupra vizualizrilor complexe nu sunt posibile operaii LMD n toate cazurile dect dac sunt definii declanatori de tip INSTEAD OF. Caracteristici Numr de tabele de baza Conine funcii Conine grupri de date Simple Un singur tabel Nu Nu Complexe Unul sau mai multe tabele Da Da

Sintaxa simplificat a comenzii CREATE VIEW este: CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW nume_view [(alias, alias, ..)] AS subcerere [WITH CHECK OPTION [CONSTRAINT nume_constr]] [WITH READ ONLY [CONSTRAINT nume_constr]]; - FORCE permite crearea vizualizarea nainte de a defini tabelele de baz; - subcererea poate fi orict de complex dar nu poate conine clauza ORDER BY; - WITH CHECK OPTION permite inserarea i modificarea prin intermediul vizualizrii numai a liniilor ce sunt accesibile vizualizrii; dac lipsete numele constrngerii atunci sistemul asociaz un nume implicit de tip SYS_Cn acestei constrngeri; - WITH READ ONLY asigur c prin intermediul vizualizrii nu se pot executa operaii LMD. Nu se pot realiza operaii LMD n vizualizri ce conin: - funcii grup, - clauza GROUP BY sau HAVING, - cuvntul cheie DISTINCT, - pseudocoloana ROWNUM, - coloane definite de expresii, - coloane NOT NULL din tabelul de baz, care nu sunt incluse n coloanele vizualizrii. - linii ce nu sunt accesibile vizualizrii (n cazul utilizrii clauzei WITH CHECK OPTION). Nu se pot actualiza: - coloane ale cror valori rezult prin calcul sau definite cu ajutorul funciei DECODE, - coloane care nu respect constrngerile din tabelele de baz. Pentru vizualizrile bazate pe mai multe tabele, orice operaie INSERT, UPDATE sau DELETE poate modifica datele doar din unul din tabelele de baz. Acest tabel este cel protejat prin cheie (key preserved). Eliminarea unei vizualizri se face prin comanda DROP VIEW : DROP VIEW nume_viz;

Observaie: Subcererile temporare caracterizate de un alias ce apar n comenzile SELECT, INSERT. UPDATE, DELETE, MERGE se numesc vizualizai inline (de exemplu o subcerere utilizat n clauza FROM a comenzii SELECT). Spre deosebire de vizualizrile propriu-zise acestea nu sunt considerate obiecte ale schemei i sunt entiti temporare. Observaie: Reactualizarea tabelelor implic reactualizarea corespunztoare a vizualizrilor. Reactualizarea vizualizrilor nu implic ntotdeauna reactualizarea tabelelor de baz. 1. S se creeze vizualizarea v_emp_*** care s conin codul i numele salariailor din tabelul emp_***. S se afieze coninutul acesteia. S se insereze o nou nregistrare n aceast vizualizare. Ce observai? S se tearg vizualizarea v_emp_***. CREATE VIEW v_emp_*** (cod, nume) AS SELECT employee_id, last_name FROM emp_***; INSERT INTO v_emp_*** VALUES (400,N1); DROP VIEW v_emp_***; 2. S se creeze vizualizarea v_emp_*** care s conin codul, numele, emailul, data angajrii, salariul i codul jobului salariailor din tabelul emp_***. S se analizeze structura i coninutul vizualizrii. S se insereze o nou nregistrare n aceast vizualizare. S se verifice c noua nregistrare a fost inserat i n tabelul de baz. Observaie: Trebuie introduse neaprat n vizualizare coloanele care au constrngerea NOT NULL n tabelul de baz (altfel, chiar dac tipul vizualizrii permite operaii LMD, acestea nu vor fi posibile din cauza nerespectrii constrngerilor NOT NULL). CREATE VIEW v_emp_*** AS SELECT employee_id, last_name, email, hire_date, salary,job_id FROM emp_***; DESC v_emp_*** SELECT * FROM v_emp_***; INSERT INTO v_emp_*** VALUES (400,N1,E1,SYSDATE,5000,SA_REP); SELECT employee_id, last_name, email, hire_date, salary, job_id FROM emp_***; 3. S se mreasc cu 1000 salariul angajatului avnd codul 400 din vizualizarea creat anterior. Ce efect va avea aceast aciune asupra tabelului de baz? UPDATE SET WHERE v_emp_*** salary=salary+1000 employee_id = 400;

SELECT FROM WHERE

employee_id, last_name, salary emp_*** employee_id = 400;

4. S se tearg angajatul avnd codul 400 din vizualizarea creat anterior. Ce efect va avea aceast aciune asupra tabelului de baz? DELETE FROM v_emp_*** WHERE employee_id = 400; SELECT FROM WHERE employee_id, last_name, salary emp_*** employee_id = 400;

5. a) S se creeze vizualizarea v_emp_dept_*** care s conin employee_id, last_name, hire_date, job_id, department_id din tabelul emp_*** i coloana department_name din tabelul dept_***. CREATE VIEW v_emp_dept_*** AS SELECT employee_id, last_name, email, hire_date, job_id, e.department_id, department_name FROM emp_*** e, dept_*** d WHERE e.department_id =d.department_id; b) S ncerce inserarea nregistrrii (500, 'N2', 'E2',SYSDATE,SA_REP,30, 'Administrativ') n vizualizarea creat anterior. INSERT INTO v_emp_dept_*** VALUES (500, 'N2', 'E2',SYSDATE,SA_REP,30, 'Administrativ'); c) Care dintre coloanele vizualizrii v_emp_dept_*** sunt actualizabile? SELECT FROM WHERE column_name, updatable user_updatable_columns UPPER(table_name) = UPPER('v_emp_dept_***');

d) Adugai tabelului emp_*** constrngerea de cheie extern care refer tabelul dept_***, apoi verificai ce coloane din vizualizarea v_emp_dept_*** sunt actualizabile. ALTER TABLE emp_*** ADD CONSTRAINT cp_emp_*** PRIMARY KEY (employee_id); ALTER TABLE dept_*** ADD CONSTRAINT cp_dept1_*** PRIMARY KEY (department_id); ALTER TABLE emp_*** ADD CONSTRAINT ce_emp1_*** FOREIGN KEY (department_id) REFERENCES dept_***(department_id); SELECT FROM WHERE column_name, updatable user_updatable_columns UPPER(table_name) = UPPER('v_emp_dept_***');

d) Recreai vizualizarea v_emp_dept_***, apoi verificai ce coloane sunt actualizabile.

DROP VIEW v_emp_dept_***; CREATE VIEW v_emp_dept_*** AS SELECT employee_id, last_name, email, hire_date, job_id, e.department_id, department_name FROM emp_*** e, dept_*** d WHERE e.department_id =d.department_id; SELECT FROM WHERE column_name, updatable user_updatable_columns UPPER(table_name) = UPPER('v_emp_dept_***');

f) Inserai o linie prin intermediul acestei vizualizri. Obs. Tabelul ale crui coloane sunt actualizabile este protejat prin cheie. INSERT INTO v_emp_dept_*** (employee_id, last_name,email,hire_date, job_id, department_id) VALUES (500, 'N2', 'E2',SYSDATE,SA_REP,30); g) Ce efect are o operaie de tergere prin intermediul vizualizrii v_emp_dept_***? Comentai. DELETE FROM v_emp_dept_*** WHERE employee_id = 500; SELECT employee_id, last_name, hire_date, job_id, department_id FROM emp_*** WHERE employee_id = 500; SELECT department_id, department_name FROM dept_*** WHERE department_id = 30; 6. S se creeze vizualizarea v_dept_*** care s conine codul i numele departamentului, numrul de angajai din departamentul respectiv i suma alocat pentru plata salariilor. Aceast vizualizare permite actualizri? CREATE VIEW v_dept_*** (cod, nume, nr_angajati, val_salarii) AS SELECT e.department_id, department_name, COUNT(*) nr_angajati, SUM(salary) val_salarii FROM emp_*** e, dept_*** d WHERE e.department_id = d.department_id GROUP BY e.department_id, department_name; 7. a) S se creeze vizualizarea v_emp30_*** care s conin numele, emailul, data angajrii, salariul, codul jobului i codul departamentului celor care lucreaz n departamentul 30. n aceast vizualizare nu se va permite modificarea sau inserarea liniilor ce nu sunt accesibile ei. Dai un nume constrngerii.

CREATE VIEW v_emp30_*** AS SELECT employee_id, last_name, email, hire_date, salary, job_id, department_id FROM emp_*** WHERE department_id=30 WITH CHECK OPTION CONSTRAINT ck_option1_***; b) S se listeze structura i coninutul vizualizrii v_emp30_***. DESCRIBE v_emp30_*** SELECT * FROM v_emp30_***; c) S se ncerce prin intermediul vizualizrii inserarea unui angajat n departamentul 10 i a unui angajat n departamentul 30. INSERT INTO v_emp30_*** VALUES (111, 'N1', 'E1',SYSDATE,1000,SA_REP,10); INSERT INTO v_emp30_*** VALUES (11, 'N11', 'E11',SYSDATE,1000,SA_REP,30); d) S se ncerce prin intermediul vizualizrii modificarea departamentului unui angajat. UPDATE v_emp30_*** SET department_id =20 WHERE employee_id = 11; 8. S se creeze o vizualizare (v_dept_***) asupra tabelului dept_*** s nu permit efectuarea nici unei operaii LMD. Testai operaiile de inserare, modificare i tergere asupra acestei vizualizri. CREATE VIEW v_dept_*** AS SELECT * FROM dept_*** WITH READ ONLY; 9. S se consulte informaii despre vizualizarea v_dept_***. Folosii vizualizarea dicionarului datelor USER_VIEWS (coloanele VIEW_NAME i TEXT). Obs: Coloana TEXT este de tip LONG. n cazul selectrii unei coloane de tip LONG trebuie utilizat comanda SET LONG n pentru a seta numrul de caractere afiate. SET LONG 200 SELECT view_name, text FROM user_views WHERE UPPER(view_name)=UPPER(v_dept_***);

Definirea secvenelor
O secven este un obiect al bazei de date ce permite generarea de numere ntregi unice cu scopul de a fi folosii ca valori pentru cheia primar sau coloane numerice unice. Secvenele sunt independente de tabele. Sintaxa comenzii CREATE SEQUENCE este: CREATE SEQUENCE nume_secven

[INCREMENT BY n] [START WITH valoare_start] [ {MAXVALUE valoare_maxim | NOMAXVALUE} ] [ {MINVALUE valoare_minim | NOMINVALUE} ] [ {CYCLE | NOCYCLE} ] [ {CACHE n | NOCACHE} ]; - INCREMENT BY specific diferena dintre valorile succesive ale secvenei (valoare implicit 1). - START WITH specific primul numr care va fi generat de secven (valoare implicit 1). - MAXVALUE, MINVALUE precizeaz valoarea maxim, respectiv minim pe care o poate genera secvena. Opiunile NOMAXVALUE, NOMINVALUE sunt implicite. NOMAXVALUE specific valoarea maxim de 1027 pentru o secven cresctoare i -1 pentru o secven descresctoare. NOMINVALUE specific valoarea minim 1 pentru o secven cresctoare i -1026 pentru o secven descresctoare. - CYCLE i NOCYCLE specific dac secvena continu s genereze numere dup obinerea valorii maxime sau minime. NOCYCLE este opiunea implicit. - CACHE n precizeaz numrul de valori pe care server-ul Oracle le prealoc i le pstreaz n memorie. n mod implicit, acest numr de valori este 20. Opiunea CACHE pemite accesul mai rapid la valorile secvenei care sunt pstrate n memorie. Aceste valori sunt generate la prima referin asupra secvenei. Fiecare valoare din secven se furnizeaz din secvena memorat. Dup utilizarea ultimei valori prealocate secvenei, urmtoarea solicitare a unei valori determin ncrcarea unui alt set de numere n memorie. Pentru a nu fi prealocate i reinute n memorie astfel de valori, se utilizeaz opiunea NOCACHE. Pseudocoloanele NEXTVAL i CURRVAL permit utilizarea secvenelor. - nume_secv.NEXTVAL returneaz urmtoarea valoare a secvenei, o valoare unic la fiecare referire. Trebuie aplicat cel puin o dat nainte de a folosi CURRVAL; - nume_secv.CURRVAL returneaz valoarea curent a secvenei. Pseudocoloanele NEXTVAL i CURRVAL se pot utiliza n: - lista SELECT a comenzilor ce nu fac parte din subcereri; - lista SELECT a unei cereri ce apare ntr-un INSERT; - clauza VALUES a comenzii INSERT; - clauza SET a comenzii UPDATE. Pseudocoloanele NEXTVAL i CURRVAL nu se pot utiliza: - n lista SELECT a unei vizualizri; - ntr-o comand SELECT ce conine DISTINCT, GROUP BY, HAVING sau ORDER BY; - ntr-o subcerere n comenzile SELECT, UPDATE, DELETE; - n clauza DEFAULT a comenzilor CREATE TABLE sau ALTER TABLE. tergerea secvenelor se realizeaz cu ajutorul comenzii DROP SEQUENCE. DROP SEQUENCE nume_secv; 10. S se creeze o secven care are pasul de incrementare 10 i ncepe de la 10, are ca valoare maxim 10000 i nu cicleaz. CREATE SEQUENCE sec_*** INCREMENT BY 10 START WITH 10 MAXVALUE 10000 NOCYCLE; 11. S se modifice toate liniile din tabelul emp_***, regenernd codul angajailor astfel nct s utilizeze secvena sec_emp***. S se anuleze modificrile. UPDATE emp_*** SET employee_id = sec_emp***.NEXTVAL; ROLLBACK;

12. S se introduc un nou salariat n tabelul emp_*** folosindu-se pentru codul salariatului secvena creat. INSERT INTO emp_*** (employee_id,last_name,email,hire_date,job_id) VALUES(sec_emp***.NEXTVAL,'x','x',sysdate,'x'); 13. S se afieze valoarea curent a secvenei. SELECT sec_***.CURRVAL valoare FROM DUAL; Exerciiu a) Creai o secven pentru generarea codurilor de departamente, seq_dept_***. Secvena va ncepe de la 200, va crete cu 10 la fiecare pas i va avea valoarea maxim 20000, nu va cicla. b) S se selecteze informaii despre secvenele utilizatorului curent (nume, valoare minim, maxim, de incrementare, ultimul numr generat). Se va utiliza vizualizarea user_sequences. c) S se insereze o nregistrare nou n DEPT_*** utiliznd secvena creat. d) S se selecteze valoarea curent a secvenei. e) S se tearg secvena.

Definirea indecilor
Un index este un obiect al unei scheme utilizator care este utilizat de server-ul Oracle pentru a mri performanele unui anumit tip de cereri asupra unui tabel. Indecii: - evit scanarea complet a unui tabel la efectuarea unei cereri; - reduc operaiile de citire/scriere de pe disc utiliznd o cale mai rapid de acces la date i anume pointeri la liniile tabelului care corespund unor anumite valori ale unei chei (coloane); - sunt independeni de tabelele pe care le indexeaz, n sensul c dac sunt teri nu afecteaz coninutul tabelelor sau comportamentul altor indeci; - sunt meninui i utilizai automat de ctre server-ul Oracle; - sunt teri odat cu eliminarea tabelului asociat. Indecii pot fi creai : - automat: la definirea unei constrngeri PRIMARY KEY sau UNIQUE; - manual: cu ajutorul comenzii CREATE INDEX. Se creeaz un index atunci cnd: - o coloan conine un domeniu mare de valori; - o coloan conine un numr mare de valori null; - una sau mai multe coloane sunt folosite des n clauza WHERE sau n condiii de join n programele de aplicaii; - tabelul este mare i de obicei cererile obin mai puin de 2%-4% din liniile tabelului; - tabelul nu este modificat frecvent. Sintaxa comenzii CREATE INDEX: CREATE [UNIQUE] INDEX nume_index ON tabel (coloana1 [, coloana2]); Modificarea unui index se face prin comanda ALTER INDEX. Eliminarea unui index se face prin comanda: DROP INDEX nume_index; 14. S se creeze un index neunic, emp_last_name_idx_***, asupra coloanei last_name din tabelul emp_***. 15. S se creeze indeci unici asupra codului angajatului (employee_id) i asupra combinaiei last_name, first_name, hire_date. 16. Creai un index neunic asupra coloanei department_id din emp_*** pentru a eficientiza joinurile dintre acest tabel i dept_***.

Definirea sinonimelor
Pentru a simplifica accesul la obiecte se pot asocia sinonime acestora. Crearea unui sinonim este util pentru a evita referirea unui obiect ce aparine altui utilizator prefixndu-l cu numele utilizatorului i pentru a scurta numele unor obiecte cu numele prea lung. Comanda pentru crearea sinonimelor este: CREATE [PUBLIC] SYNONYM nume_sinonim FOR obiect; Eliminarea sinonimelor se face prin comanda DROP SYNONYM nume_sinonim; 17. Creai un sinonim public se_*** pentru tabelul emp_***. 18. Creai un sinonim pentru vizualizarea v_dept_***. 19. Utiliznd sinonimele create anterior, afiai informaii depre salarii i despre departamente.

Informaii din dicionarul datelor


Tipuri de vizualizri ale dicionarului datelor: ALL_* - obiecte accesibile utilizatorului curent, DBA_* - obiecte accesibile numai administratorului, USER_* - obiecte ale utilizatorului curent 1. Tabelele utilizatorului curent:
SELECT table_name FROM user_tables ORDER BY table_name;

2. Definiiile i numele constrngerilor:


SELECT FROM WHERE ORDER BY constraint_name, constraint_type, search_condition, table_name user_constraints table_name IN ('EMPLOYEES', 'DEPARTAMENTS) table_name, constraint_name;

3. Coloanele asociate unei constrngeri:


SELECT FROM WHERE ORDER BY constraint_name, column_name user_cons_columns table_name IN ('EMPLOYEES', 'DEPARTAMENTS) table_name, constraint_name;

4. Informaii despre vizualizri:


SELECT FROM view_name user_views;

5. Informaii referitoare la secvene:


SELECT FROM sequence_name, min_value, max_value, increment_by, last_number user_sequences;

6. Informaii referitoare la indeci:

SELECT FROM SELECT FROM SELECT FROM WHERE AND

index_name, table_name user_indexes; index_name user_ind_columns; a.index_name, a.column_name,a.column_position poz, b.uniqueness user_indexes b, user_ind_columns a a.index_name = b.index_name a.table_name = 'EMP_***';

7. Informaii referitoare la sinonime:


SELECT synonym_name, table_owner, table_name FROM user_synonyms;

1. GENERALITI DESPRE BAZE DE DATE


1.1. Introducere Baza de date este un ansamblu structurat de date coerente, fr

redondan inutil, astfel nct acestea pot fi prelucrate eficient de mai muli utilizatori ntr-un mod concurent. Baza de date este o colecie de date persistente, care sunt folosite de ctre sistemele de aplicaii ale unei anumite ntreprinderi. Datele din baza de date persist deoarece, dup ce au fost acceptate de ctre sistemul de gestiune pentru introducerea n baza de date, ele pot fi terse din baz numai printr-o cerere explicit adresat sistemului de gestiune. Aici, termenul de ntreprindere este un cuvnt generic, utilizat pentru a desemna orice organizaie independent, de natur tehnic, comercial, tiinific sau de alt tip. ntreprinderea poate fi, de exemplu, un spital, o banc, o facultate, o fabric, un aeroport etc. Fiecare ntreprindere are regulile proprii de funcionare i conine o mulime de date referitoare la modul su de operare. Datele din baza de date pot fi att integrate, ct i partajate. Noiunea de integrat se refer la faptul c baza de date poate fi considerat ca o unificare a mai multor fiiere, iar prin partajare se nelege c baza de date poate fi partajat concurent ntre diferii utilizatori. Un sistem de gestiune a bazelor de date (SGBD Data Base Management System) este un produs software care asigur interaciunea cu o baz de date, permind definirea, consultarea i actualizarea datelor din baza de date. Toate cererile de acces la baza de date sunt tratate i controlate de ctre SGBD. Organizarea datelor n baze de date constituie o form de centralizare a acestora. Aceasta implic existena unui administrator al bazei de date (DBA Data Base Administrator) care este o persoan sau un grup de persoane ce rspund de ansamblul activitilor (analiz, proiectare, implementare, exploatare, ntreinere etc.) legate de baza de date. Atribuiile unui administrator pot fi grupate n patru mari categorii: atribuii de proiectare, atribuii administrative, atribuii operative i atribuii de coordonare. Concepte ale bazelor de date relaionale n aceast parte se face o prezentare general a conceptelor bazelor de date relaionale. O baz de date relaional este o colecie de informaii interrelaionate gestionate ca o singur unitate.

A ceast definiie este foarte larg, deoarece exist mari diferene ntre concepiile diferiilor productori care pun la dispoziie sisteme de baze de date. De exemplu, Oracle Corporation definete o baz de date ca fiind o colecie de fiiere fizice gestionate de o singur instan (copie) a produsului software pentru baze de date, n timp ce Microsoft definete o baz de date SQL Server ca fiind o colecie de date i alte obiecte. Un obiect al bazei de date este o structur de date denumit, stocat n baz de date, cum ar fi un tabel, o vizualizare sau un index. Exist mari diferene ntre implementrile furnizorilor de baze de date. n majoritatea sistemelor de baze de date, datele sunt stocate n mai multe fiiere fizice, dar n Microsoft Access toate obiectele bazei de date, mpreun cu datele care aparin unei baze de date sunt stocate ntr-un singur fiier fizic.(Un fiier este o colecie de nregistrri nrudite stocate ca o singur untiate de sistemul de operare al calculatorului.) Totui, unul dintre principalele avantaje ale bazelor de date relaionale este faptul c detaliile de implementare fizic sunt separate de definiiile logice ale obiectelor bazei de date, astfel nct majoritatea utilizatorilor bazei de date nu au nevoie s tie unde (i cum) sunt stocate obiectele bazei de date n sistemul de fiiere al calculatorului. Sistem de gestionare a bazei de date (DBMS sau SGBD) Un sistem de gestionare a bazei de date (DBMS database management system) este un produs software furnizat de productorul bazei de date. Produse software precum Microsoft Access, Microsoft SQL Server, Oracle Database,Sybase, DB2,INGRES, MySQL i Postgre SQL fac parte din categoria DBMS sau, mai corect, DBMS relaionale (RDBMS). RDBMS-urile sunt cunoscute i sub numele de SGBD-uri. Ambele prescurtri vor fi folosite n acest expunere. Sistemul DBMS pune la dispoziie toate serviciile de baz necesare pentru organizarea i ntreinerea bazei de date, inclusiv urmtoarele: - Transferarea datelor n i din fiierele fizice de date, n funcie de cerine. - Gestionarea accesului concurenial la date al mai multor utilizatori, inclusiv prevenirea conflictelor care ar putea fi cauzate de actualizrile simultane. - Gestionarea tranzaciilor, astfel nct toate modificrile fcute asupra bazei de date printr-o tranzacie s fie executate ca o singur unitate. Cu alte cuvinte, dac tranzacia reuete, toate

O baz de date relaional este o baz de date care respect modelul relaional, dezvoltat de Dr.E.F.Codd. Modelul relaional prezint datele sub forma familiarelor tabele bidimensionale, similar cu o foaie de calcul tabelar. Spre deosebire de o foaie de calcul tabelar, nu este obligatoriu ca datele s fie stocate ntr-o form tabelar, iar modelul permite i combinarea tabelelor (crearea uniunilor (joining), n terminologia relaional) pentru formarea vizualizarilor, care sunt prezentate tot ca tabele bidimensionale. Flexibilitatea extraordinar a bazelor de date relaionale este dat de posibilitatea de a folosi tabelele independent sau n combinaii, fr nici o ierarhie sau secven predefinit n care trebuie s se fac accesul la date.

Ce este o baz de date relaional ?

modificrile efectuate de tranzacie sunt nregistrate n baz de date; dac tranzacia eueaz, nici una dintre modificri nu este nregistrat n baz de date.Totui, reinei ca unele sisteme RDBMS nu asigur suportul pentru tranzacii. - Accept un limbaj de interogare, care reprezint sistemul de comenzi folosit de utilizator pentru a obine date din baz de date. SQL este principalul limbaj folosit pentru sistemele DBMS relaionale. - Funcii pentru salvarea bazei de date i pentru refacerea bazei de date n urma erorilor. - Mecanisme de securitate pentru mpiedicarea accesului neautorizat la date i modificarea acestora.

ca o baz de date (metabaz de date), contine date despre date, furnizeaz descrierea tuturor obiectelor unei baze de date, starea acestor obiecte, diversele constrngeri de securitate i de integritate etc. Dicionarul poate fi interogat, la fel, ca orice alt baz de date.

Dicionarul datelor (catalog de sistem), structurat i administrat

1.2. Gestiunea bazelor de date


Un sistem de baze de date presupune urmtoarele componente principale, care definesc arhitectura acestuia: baza de date propriu-zis n care se memoreaz datele; sistemul de gestiune a bazei de date, care realizeaz gestionarea i prelucrarea complex a datelor; un dicionar al bazei de date (metabaza de date), ce conine informaii despre date, structura acestora, statistici, documentaie; mijloace hardware (comune sau specializate); reglementri administrative destinate bunei funcionri a sistemului; personalul implicat (utilizatori finali, administratorul datelor, administratorul bazei de date, proiectani, programatori de aplicaii). Se pot identifica patru categorii de persoane implicate n mediul bazelor de date: administratorii de date i baze de date, proiectanii (designeri) de baze de date, programatorii de aplicaii, utilizatorii finali. Administratorul de date (DA) este un manager, nu un tehnician, ce: decide care date trebuie stocate n baza de date; stabilete regulile de ntreinere i de tratare a acestor date dup ce sunt stocate. De exemplu, o reg u l ar putea fi aceea prin care se stabilesc pentru utilizatori privilegii asupra informaiilor din baza de date, cu alte cuvinte o anumit politic de securitate a datelor. Administratorul bazei de date (DBA) este responsabil cu implementarea deciziilor administratorului de date i cu controlul general al sistemului, la nivel tehnic. El este un profesionist n domeniul IT, care: creeaz baza de date real; implementeaz elementele tehnice de control; este responsabil cu asigurarea funcionrii sistemului la performane adecvate, cu monitorizarea performanelor; furnizeaz diverse servicii tehnice etc. Proiectanii de baze de date pot acoperi att aspectul fizic, ct i cel logic al concepiei. Proiectantul de baze de date care abordeaz direcia logic trebuie s posede o cunoatere complet i amnunit a modelului real de proiectat i a regulilor de funcionare ale acestuia. Practic, acesta proiecteaz

conceptual baza de date, iar modelul creat este independent de programele de aplicaii, de limbajele de programare. De asemenea, va proiecta logic baza de date, proiectare care este ndreptat spre un anumit model de date (relaional, orientat obiect, ierarhic etc.). Proiectantul de baze de date fizice preia modelul logic de date i stabilete cum va fi realizat fizic. Acesta trebuie s cunoasc funcionalitile SGBD-ului, avantajele i dezavantajele fiecrei alternative corespunztoare unei implementri. Practic, se face transpunerea modelului logic ntr-un set de tabele supuse unor constrngeri, se selecteaz structuri de stocare i metode de acces specifice, astfel nct s se asigure performane, se iau msuri privind securitatea datelor. Utilizatorii finali sunt cei care acceseaz interactiv baza de date. Aceasta a fost proiectat, implementat, ntreinut pentru a satisface necesitile informaionale ale clienilor. Utilizatorii finali pot fi utilizatori simpli, care nu cunosc nimic despre baza de date, despre SGBD, dar acceseaz baza prin intermediul unor programe de aplicaie. n general, aceast clas de utilizatori alege anumite opiuni din meniul aplicaiei. Exist utilizatori finali sofisticai, care sunt familiarizai cu structura bazei de date. Ei pot utiliza limbaje speciale pentru a exploata posibilitile oferite de baza de date. Programatori de aplicaii sunt responsabili de scrierea programelor aplicaie ce confer funcionalitatea cerut de utilizatorii finali. Programele pot fi scrise n diferite limbaje de programare (C++, PL/SQL, Java etc.).

Cerine minimale care se impun unei baze de date:

asigurarea unei redundane minime n date; furnizarea n timp util a informaiilor solicitate (timpul de rspuns la o interogare); asigurarea unor costuri minime n prelucrarea i ntreinerea informaiei; capacitatea de a satisface, cu aceleai date, necesiti informaionale ale unui numr mare de utilizatori, posibilitatea de adaptare la cerine noi, rspunsuri la interogri neprevzute iniial (flexibilitate); exploatarea simultan a datelor de ctre mai muli utilizatori (sincronizare); asigurarea securitii datelor prin mecanisme de protecie mpotriva accesului neautorizat (confidenialitate);

nglobarea unor faciliti destinate validrii datelor i recuperrii lor n cazul unor deteriorri accidentale, garantarea (att ct este posibil) c datele din baza de date sunt corecte (integritate); posibilitatea de valorificare a eforturilor anterioare i anticiparea nevoilor viitoare (compatibilitate i expandabilitate); permisivitatea, prin ierarhizarea datelor dup criteriul frecvenei acceselor, a unor reorganizri (eventual dinamice) care sporesc performanele bazei. n cadrul unei baze de date putem vorbi de patru niveluri de abstractizare i de percepie a datelor: intern, conceptual, logic i extern. Datele exist doar la nivel fizic, iar celelalte trei niveluri reprezint virtualizri ale acestora. Nivelul fizic (intern) este descris de schema fizic a datelor (bit, octet, adres); Nivelul conceptual este descris de schema conceptual a datelor (articol, nregistrare, zon) i reprezint viziunea programatorilor de sistem asupra datelor; Nivelul logic este descris de una din schemele logice posibile ale datelor i reprezint viziunea programatorului de aplicaie asupra datelor; Nivelul virtual (extern) reprezint viziunea utilizatorului final asupra datelor. Independena datelor cuprinde dou aspecte fundamentale: o modificare a structurii fizice nu va afecta aplicaia i reciproc, modificri ale aplicaiei vor lsa nealterat structura fizic de date. Independena fizic: posibilitatea modificrii schemei fizice a datelor fr ca aceasta s implice modificarea schemei conceptuale, a schemei logice i a programelor de aplicaie. Este vorba despre imunitatea programelor de aplicaie fa de modificrile modului n care datele sunt stocate fizic i accesate. Independena logic: posibilitatea modificrii schemei conceptuale a datelor fr ca aceasta s implice modificarea schemei logice i a programelor de aplicaie. Prin independena logic a datelor se urmrete a se crea fiecrui utilizator iluzia c este singurul beneficiar al unor date pe care, n realitate, le folosete n comun cu ali utilizatori. Independen fa de strategiile de acces permite programului s precizeze data pe care dorete s o acceseze, dar nu modul cum acceseaz aceast dat. SGBD-ul va stabili drumul optim de acces la date.

n limbajele de programare uzuale declaraiile i instruciunile executabile aparin aceluiai limbaj. n lumea bazelor de date, funciile de declarare i de prelucrare a datelor sunt realizate cu ajutorul unor limbaje diferite, numite limbaje pentru baze de date. Limbaje pentru definirea datelor (DDL Data Description Language). Descrierea concret a unui DDL este specific fiecrui sistem de gestiune, dar funciile principale sunt aceleai. La nivel conceptual, DDL realizeaz definirea entitilor i a atributelor acestora, sunt precizate relaiile dintre date i strategiile de acces la ele, sunt stabilite criterii difereniate de confidenialitate i de validare automat a datelor utilizate. Limbaje pentru prelucrarea datelor (DML Data Manipulation Language). Operaiile executate n cadrul unei baze de date presupun existena unui limbaj specializat, n care comenzile se exprim prin fraze ce descriu aciuni asupra bazei. n general, o comand are urmtoarea structur: operaia (calcul aritmetic sau logic, editare, extragere, deschidere-nchidere, adugare, tergere, cutare, reactualizare etc.), criterii de selecie, mod de acces (secvenial, indexat etc.), format de editare. Exist limbaje DML procedurale, care specific cum se obine rezultatul unei comenzi DML i limbaje neprocedurale, care descriu doar datele ce vor fi obinute i nu modalitatea de obinere a acestora. Limbaje pentru controlul datelor (DCL Data Control Language). Controlul unei baze de date se refer la asigurarea confidenialitii i integritii datelor, la salvarea informaiei n cazul unor defeciuni, la obinerea unor performane, la rezolvarea unor probleme de concuren. Limbajele universale nu se utilizeaz frecvent pentru gestionarea unei baze de date, dar exist aceast posibilitate. De exemplu, sistemul Oracle este dotat cu precompilatoare (C, Pascal, ADA, Cobol, PL/1, Fortran) care ajut la incorporarea de instruciuni SQL sau blocuri PL/SQL n programe scrise n alte limbaje, de nivel nalt, numite limbaje gazd. Sistemul de gestiune a bazelor de date interacioneaz cu programele de aplicaie ale utilizatorului i cu baza de date, oferind o mulime de faciliti. Realizarea optim a acestor faciliti este asigurat de obiectivele fundamentale ale unui sistem de gestiune. Cteva dintre aceste obiective vor fi enumerate n continuare. Independena fizic. Obiectivul esenial este acela de a permite realizarea independenei structurilor de stocare n raport cu

structurile de date din lumea real. Se definete mulimea de date indiferent de forma acesteia din lumea real, innd seama doar de a realiza un acces simplu la date i de a obine anumite performane. Independena logic. Grupul de lucru care exploateaz baza de date poate s utilizeze diferite informaii de baz (nu aceleai), pentru ai construi entiti i relaii. Fiecare grup de lucru poate s cunoasc doar o parte a semanticii datelor, s vad doar o submulime a datelor i numai sub forma n care le dorete. Aceast independen asigur imunitatea schemelor externe fa de modificrile fcute n schema conceptual. Prelucrarea datelor de ctre neinformaticieni. Neinformaticienii vd datele independent de implementarea lor i pot exploata aceste date prin intermediul unui sistem de meniuri oferit de aplicaia pe care o exploateaz. Administrarea centralizat a datelor. Administrarea datelor presupune definirea structurii datelor i a modului de stocare a acestora. Administrarea este n general centralizat i permite o organizare coerent i eficace a informaiei. Coerena datelor. Informaia trebuie s satisfac constrngeri statice sau dinamice, locale sau generale. Neredundana datelor. Fiecare aplicaie posed datele sale proprii i aceasta conduce la numeroase dubluri. De asemenea, organizarea nejudicioas a relaiilor poate s genereze redundan n date. Administrarea coerent a datelor trebuie s asigure neduplicarea fizic a datelor. Totui, nu sunt excluse nici cazurile n care, pentru a realiza performane referitoare la timpul de acces la date i rspuns la solicitrile utilizatorilor, s se accepte o anumit redundan a datelor. Partajabilitatea datelor. Aceasta permite ca aplicaiile s partajeze datele din baza de date n timp i simultan. O aplicaie poate folosi date ca i cum ar fi singura care le utilizeaz, fr a ti c alt aplicaie, concurent, le poate modifica. Securitatea i confidenialitatea datelor. Datele trebuie protejate de un acces neautorizat sau ru intenionat. Exist mecanisme care permit identificarea i autentificarea utilizatorilor i exist proceduri de acces autorizat care depind de date i de utilizator. Sistemul de gestiune trebuie s asigure securitatea fizic i logic a informaiei i s garanteze c numai utilizatorii autorizai pot efectua operaii corecte asupra bazei de date.

Sistemele de gestiune a bazelor de date au, din nefericire, i dezavantaje dintre care se remarc: complexitatea i dimensiunea sistemelor pot s creasc considerabil, datorit necesitii extinderii funcionalitilor sistemului; costul, care variaz n funcie de mediu i funcionalitatea oferit, la care se adug cheltuieli periodice de ntreinere; costuri adiionale pentru elemente de hardware; costul conversiei aplicaiilor existente, necesar pentru ca acestea s poat funciona n noua configuraie hardware i software; impactul unei defeciuni asupra aplicaiilor, bazei de date sau sistemului de gestiune. complexitate variabil, iar nivelul real de funcionalitate difer de la produs la produs. n orice moment apar noi necesiti, care cer o nou funcionalitate, astfel nct aceasta nu va putea deveni niciodat static. n general, un SGBD trebuie s includ cel puin cinci clase de module: programe de gestiune a bazei de date (PGBD), care realizeaz accesul fizic la date ca urmare a unei comenzi; module pentru tratarea limbajului de definire a datelor, ce permit traducerea unor informaii (care realizeaz descrierea datelor, a legturilor logice dintre acestea i a constrngerilor la care sunt supuse), n obiecte ce pot fi apoi exploatate n manier procedural sau neprocedural; module pentru tratarea limbajului de prelucrare a datelor (interpretativ, compilativ, generare de programe), care permit utilizatorilor inserarea, tergerea, reactualizarea sau consultarea informaiei dintr-o baz de date; module utilitare, care asigur ntreinerea, prelucrarea, exploatarea corect i uoar a bazei de date; module de control, care permit controlul programelor de aplicaie, asigurarea confidenialitii i integritii datelor, rezolvarea unor probleme de concuren, recuperarea informaiei n cazul unor avarii sau defeciuni hardware sau software etc.

Structura unui sistem de gestiune a bazelor de date este de

10

Modulele PGBD asigur accesul fizic la date ca urmare a unei comenzi. Cum lucreaz aceste module? gsesc descrierea datelor implicate n comand; identific datele i tipul acestora; identific informaii ce permit accesul la structurile fizice de stocare (fiiere, volume etc.); verific dac datele sunt disponibile; extrag datele, fac conversiile, plaseaz datele n spaiul de memorie al utilizatorului; transmit informaii de control necesare execuiei comenzii, n spaiul de memorie al utilizatorului; transfer controlul programului de aplicaie. Prin urmare, din punct de vedere conceptual: utilizatorul lanseaz o cerere de acces; SGBD-ul accept cererea i o analizeaz; SGBD-ul inspecteaz pe rnd, schema intern corespunzatoare utilizatorului, schema conceptual, definiia structurii de stocare i corespondenele corespunztoare; SGBD-ul execut operaiile necesare n baza de date stocat.

1.3. Arhitectura sistemelor de gestiune a bazelor de date


Asigurarea independenei fizice i logice a datelor impune adoptarea unei arhitecturi de baze de date organizat pe trei niveluri: nivelul intern (baza de date fizic); nivelul conceptual (modelul conceptual, schema conceptual); nivelul extern (modelul extern, subschema, vizualizarea). Nivelul central este nivelul conceptual. Acesta corespunde structurii canonice a datelor ce caracterizeaz procesul de modelat, adic structura semantic a datelor fr implementarea pe calculator. Schema conceptual permite definirea tipurilor de date ce caracterizeaz proprietile elementare ale entitilor, definirea tipurilor de date compuse care permit regruparea atributelor pentru a descrie entitile modelului i legturile ntre aceste entiti, definirea regulilor pe care trebuie s le respecte datele etc. Nivelul intern corespunde structurii interne de stocare a datelor. Schema intern permite descrierea datelor unei baze sub forma n care sunt

11

stocate n memoria calculatorului. Sunt definite fiierele care conin aceste date, articolele din fiiere, drumurile de acces la aceste articole etc. La nivel conceptual sau intern, schemele descriu o baz de date. La nivel extern schemele descriu doar o parte din date care prezint interes pentru un utilizator sau un grup de utilizatori. Schema extern reprezint o descriere a unei pri a bazei de date ce corespunde viziunii unui program sau unui utilizator. Modelul extern folosit este dependent de limbajul utilizat pentru prelucrarea bazei de date. Schema extern permite asigurarea unei securiti a datelor. Un grup de lucru va accesa doar datele descrise n schema sa extern, iar restul datelor sunt protejate mpotriva accesului neautorizat sau ru intenionat. Pentru o baz de date particular exist o singur schem intern, o singur schem conceptual, dar exist mai multe scheme externe. n afar de aceste trei niveluri, arhitectura presupune i anumite corespondene dintre acestea: corespondena conceptual-intern definete relaia dintre nivelul conceptual i baza de date stocat, specificnd modul n care nregistrrile i cmpurile conceptuale sunt reprezentate la nivel intern; corespondena extern-conceptual definete relaia dintre o anumit vizualizare extern i nivelul (vizualizarea) conceptual, reprezentnd cheia independenei logice de date; corespondena extern-extern permite definirea unor vizualizri externe n funcie de altele, fr a necesita o definiie explicit a corespondenei cu nivelul conceptual. Arhitectura funcional de referin propus de grupul de lucru ANSI/X3/SPARC este axat pe dicionarul datelor i cuprinde dou pri: prima, permite descrierea datelor (compoziia dicionarului datelor); a doua, permite prelucrarea datelor (interogarea i reactualizarea bazei de date). n fiecare parte se regsesc cele trei niveluri: intern, conceptual i extern. Acestea nu sunt neaprat distincte pentru orice SGBD. Interfeele numerotate din figura 1.1, ce descriu arhitectura de referin a unui SGBD, corespund urmtoarelor transformri: a) Limbaj de descriere a datelor conceptuale, format surs permite administratorului ntreprinderii s defineasc schema conceptual, format surs.

12

Limbaj de descriere a datelor conceptuale, format obiect se obine din compilarea celui precedent i permite aranjarea schemei obiect n dicionarul datelor. c) Limbaj de descriere a datelor conceptuale, format editare permite administratorilor aplicaiilor i a bazelor s consulte schema conceptual pentru a defini reguli de coresponden. d) Limbaje de descriere a datelor externe, format surs permit administratorilor aplicaiilor s defineasc scheme externe corespunznd schemei conceptuale. Deoarece sistemele de gestiune pot suporta mai multe modele externe, pot exista mai multe limbaje de descriere a datelor externe. e) Limbaje de descriere a datelor externe, format obiect corespund formelor compilate ale celor precedente i permit aranjarea schemelor externe (obiect) n dicionarul datelor. f) Limbaj de descriere a datelor interne, format surs permite administratorului bazei de date s defineasc schema intern i regulile de coresponden cu schema conceptual. g) Limbaj de descriere a datelor interne, format obiect corespunde formei compilate a celui precedent i permite aranjarea schemei interne (obiect) n dicionarul datelor. h) Limbaje de prelucrare a datelor externe, format surs permit programatorilor de aplicaii sau utilizatorilor neinformaticieni s manipuleze date externe (view). i) Limbaje de prelucrare a datelor externe, format obiect corespund formelor compilate ale celor precedente. j) Limbaj de prelucrare a datelor conceptuale, format obiect produs de procesorul de transformare extern/ conceptual pentru a manipula datele externe. k) Limbaj de prelucrare a datelor interne, format obiect produs de procesorul de transformare conceptual/intern pentru a gestiona datele interne. l) Limbaj de stocare a datelor, format obiect corespunde interfeei cu sistemul de stocare a datelor. m) Interfaa cu memoria secundar permite efectuarea de intrri/ieiri n/din unitatea de memorie secundar. n) Interfaa de acces la dicionarul datelor permite diverselor procesoare de transformare s acceseze scheme obiect i reguli de coresponden.
b)

13

Procesoarele din figura 1.1 au urmtoarele funcii: procesorul schemei conceptuale compileaz schema conceptual i dac nu sunt erori depune schema compilat n dicionarul datelor; procesorul schemei externe compileaz schemele externe i regulile de coresponden extern i dac nu sunt erori aranjeaz schema compilat i regulile de coresponden n dicionarul datelor; procesorul schemei interne are rol similar pentru schema intern; procesorul de transformare extern/conceptual transform manipulrile externe n manipulri conceptuale i invers, datele conceptuale n date externe; procesorul de transformare conceptual/intern transform manipulrile conceptuale n manipulri interne i invers, datele interne n date conceptuale; procesorul de transformare intern/stocare transform manipulrile interne n primitive ale sistemului de stocare i invers, elibereaz datele stocate ntr-un format corespunztor schemei interne.

14
administrator ntreprindere

a DESCRIERE h PRELUCRARE
administratorul bazei de date

procesor schema conceptual

administratorul aplicaiilor

procesor schema intern

dicionarul datelor

e
procesor schema extern

procesor intern/ alocare

procesor conceptual/ intern

procesor extern/ conceptual

l
sistem de alocare

i
program aplicaii extern

h
programator aplicaie

utilizatori

memorii secundare

Fig. 1.1. Arhitectura de referin a unui SGBD. Gardarin a propus o arhitectur funcional apropiat de arhitectura sistemelor de gestiune actuale care are la baz doar dou niveluri: schema, care corespunde integrrii schemelor interne i conceptuale; vizualizarea, care este o schem extern.

15

Sistemul de gestiune gestioneaz un dicionar de date care este alimentat prin comenzi de definire a schemei i prin comenzi de definire a vizualizrilor. Aceste comenzi, precum i cererile de prelucrare sunt analizate i tratate de un procesor numit analizor. Analizorul realizeaz analiza sintactic i semantic a cererii i o traduce n format intern. O cerere n format intern care face referin la o vizualizare este tradus n una sau mai multe cereri care fac referin la obiecte ce exist n baza de date (modificarea cererilor). n cadrul acestei arhitecturi exist un procesor, numit translator, care realizeaz modificarea cererilor, asigur controlul drepturilor de acces i controlul integritii n cazul reactualizrilor. Componenta cheie a sistemului de gestiune este procesorul optimizor care elaboreaz un plan de acces optim pentru a trata cererea. Acest procesor descompune cererea n operaii de acces elementare i alege o ordine de execuie optimal. De asemenea, evalueaz costul planului de acces naintea execuiei sale. Planul de acces ales i elaborat de optimizor este executat de un procesor numit executor. La acest nivel este gestionat controlul concurenei.

1.4. Evoluia bazelor de date


Istoria bazelor de date i a sistemelor de gestiune a bazelor de date poate fi rezumat n trei generaii: sisteme ierarhice i reea, sisteme relaionale, sisteme avansate (orientate obiect, relaionale orientate obiect, deductive, distribuite, multimedia, multibaze, active, temporale, decizionale, magazii de date etc.). Baze de date ierarhice i reea Pentru modelele ierarhice i reea, datele sunt reprezentate la nivel de articol prin legturi ierarhice (arbore) sau de tip graf. Slaba independen fizic a datelor complic administrarea i prelucrarea acestora. Limbajul de prelucrare a datelor impune programatorului s specifice drumurile de acces la date.

16

Baze de date relaionale A doua generaie de SGBD-uri este legat de apariia modelelor relaionale (1970), care trateaz entitile ca nite relaii. Piaa actual de baze de date este acoperit n majoritate de sisteme relaionale. Bazele de date relaionale sunt caracterizate de: structuri de date simple, intuitive, inexistena pointerilor vizibili pentru utilizator, constrngeri de integritate, operatori aplicai relaiilor care permit definirea, cutarea i reactualizarea datelor. Dezvoltarea unei aplicaii riguroase utilizand o baz de date relaionale necesit cunoaterea a trei niveluri de instrumente, eterogene din punct de vedere conceptual: nivelul instrumentelor grafice (interfaa); nivelul aplicaie, cu limbajele sale de dezvoltare; nivelul SGBD, cu standardul SQL (Structured Query Language) ce permite definirea, prelucrarea i controlul bazei de date. Baze de date orientate obiect Bazele de date relaionale nu folosesc ns obiecte complexe i dinamice, nu realizeaz gestiunea datelor distribuite i nici gestiunea cunotinelor. A treia generaie de SGBD-uri, sistemele avansate, ncearc s depeasc aceste limite ale sistemului relaional. Suportul obiectelor complexe i dinamice i prelucrarea acestora este dificil pentru sistemele relaionale, deoarece tipul datelor este limitat la cteva domenii alfanumerice, iar structura datelor este simpl. Sistemele relaionale nu modeleaz obiecte complexe ca grafuri, liste etc. Un obiect complex poate s fie descompus n relaii, dar apar dificulti att la descompunerea, ct i la refacerea acestuia prin compunere. De asemenea, limbajele modelului relaional permit prelucrarea cu dificultate a obiectelor complexe. Un sistem relaional nu suport obiecte dinamice care incorporeaz att partea de date (informaii) efective, ct i o parte relativ la tratarea acestora. mbinarea tehnicii limbajelor orientate obiect cu a bazelor de date a permis realizarea bazelor de date orientate obiect. Acestea permit organizarea coerent a obiectelor partajate ntre utilizatori concureni. Sistemele de gestiune de baze de date orientate obiect (SGBDOO) prezint o serie de avantaje:

17

realizeaz o modelare superioar a informaiei, furnizeaz posibiliti superioare de deducie (ierarhie de clase, motenire), permit luarea n considerare a aspectelor dinamice i integrarea descrierii structurale i comportamentale, asigur mbuntirea interfeei cu utilizatorul. Cu toate avantajele incontestabile oferite de SGBDOO-uri, impunerea lor pe piaa bazelor de date nu a fost uoar. Cteva motivaii a acestei situaii: absena unei fundamentri teoretice face imposibil definirea unui SGBDOO de referin; gestiunea obiectelor complexe este mai dificil dect accesul la relaii prin cereri SQL; utilizatorii au investit sume uriae n sistemele relaionale i nu le pot abandona cu uurin. Trecerea la noua tehnologie orientat obiect implic investiii mari i nu pstreaz aproape nimic din vechile soluii. Baze de date relaionale orientate obiect Simplitatea modelului relaional, combinat cu puterea tehnologiei orientate obiect a generat un domeniu nou i promitor n lumea bazelor de date, i anume bazele de date relaionale orientate obiect. Construcia unui sistem de gestiune de baze de date relaionale orientate obiect (SGBDROO) trebuie s porneasc de la cele existente. Aceasta se poate realiza n dou moduri: dezvoltnd un sistem relaional prin adugarea caracteristicilor obiectuale necesare sau pornind de la un sistem orientat obiect i adugnd caracteristicile relaionale. Baze de date deductive O relaie este o mulime de nregistrri ce reprezint fapte. Cunotinele sunt aseriuni generale i abstracte asupra faptelor. Cunotinele permit s raionezi, ceea ce permite deducerea de noi fapte, plecnd de la fapte cunoscute. Un SGBD relaional suport o form limitat de cunotine, i anume constrngerile de integritate, iar restul trebuie integrate n programele de aplicaie. Aceasta genereaz probleme deoarece cunotinele trebuie codificate n programe i apare imposibilitatea de a partaja cunotine ntre utilizatori. Totul se complic dac exist un volum mare de fapte.

18

Bazele de date deductive, utiliznd programarea logic, gestioneaz cunotine relativ la baze de date care, n general, sunt relaionale. Bazele de date deductive permit deducerea de noi informaii, plecnd de la informaiile stocate n baza de date. Un SGBD deductiv posed: un limbaj de definire a datelor care permite definirea structurii predicatelor sub form de relaii i constrngeri de integritate asociate; un limbaj de prelucrare a datelor care permite efectuarea reactualizrilor asupra datelor i formularea unor cereri; un limbaj de reguli de deducie care permite ca, plecnd cu predicatele definite anterior, s se specifice cum pot fi construite predicate derivate. Baze de date distribuite Un sistem distribuit este un ansamblu de maini ce sunt interconectate printr-o reea de comunicaie i utilizate ntr-un scop global. Administrarea i prelucrarea datelor distribuite, situate pe diferite calculatoare i exploatate de sisteme eterogene este obiectivul fundamental al bazelor de date distribuite. Bazele de date distribuite sunt sisteme de baze de date cooperante care rezid pe maini diferite, n locuri diferite. Aceast mulime de baze de date este exploatat de utilizator ca i cum ar fi o singur baz de date. Programul de aplicaie care exploateaz o baz de date distribuite poate avea acces la date rezidente pe mai multe maini, fr ca programatorul s cunoasc localizarea datelor. Modelul relaional a rmas instrumentul principal prin care se realizeaz prelucrarea datelor distribuite. Cteva dintre argumentele pentru a justifica aceast afirmaie sunt: bazele relaionale ofer flexibilitate de descompunere n vederea distribuirii; operatorii relaionali pot fi folosii pentru combinaii dinamice ale informaiilor descentralizate; limbajele sistemelor relaionale sunt concise i asigur o economie considerabil a transmiterii datelor. Ele fac posibil, pentru un nod oarecare al reelei, s analizeze intenia unei tranzacii, s o descompun rapid n componente ce pot fi realizate local i componente ce pot fi transportate altor noduri.

19

Calculatoare i maini baze de date Soluia pentru a descentraliza prelucrarea datelor, n scopul evitrii saturrii memoriei i a procesoarelor calculatorului central, a fost apariia calculatoarelor baze de date i a mainilor baze de date. Descentralizarea presupune transferarea unei pri din funciile unui SGBD ctre un calculator periferic (calculator backend) adic deplasarea algoritmilor de cutare i a celor de actualizare a datelor mai aproape de memoria secundar. Acest calculator periferic permite utilizarea optim a resurselor i realizarea paralelismului n tratarea cererilor de informaii. Calculatorul periferic poate fi un calculator clasic, dar cu un software specific de SGBD (calculator baz de date) sau poate fi o main cu hardware specializat n gestiunea bazelor de date (main baz de date). Mainile baze de date sunt nzestrate cu arhitecturi paralele special adaptate pentru gestionarea unui volum mare de date. Tratarea paralel a cererilor permite reducerea timpului total de execuie a acestora. O execuie n paralel solicit, fie descompunerea unui program n module, care pot fi executate n paralel (descompunere funcional), fie descompunerea datelor n subgrupe, astfel nct toate procesoarele s execute acelai lucru, dar pe date diferite. Performanele tratrii paralele depind de modul n care sunt efectuate descompunerile. Multibaze de date Diferite departamente ale unei organizaii mai mari pot folosi diferite sisteme de gestiune. Cu toate c fiecare sistem este dezvoltat pentru a satisface nevoile propriului su departament, informaiile cu care lucreaz pot fi utile i altor departamente. De aceea, pentru ca organizaia s funcioneze bine, trebuie s existe o modalitate global da a vedea datele din fiecare sistem. Exist dou caracteristici ale unor astfel de sisteme care fac acceasarea datelor n acest mediu integrat greoaie, uneori chiar imposibil: autonomie fiecare SGBD are o autonomie complet, ceea ce nseamn c fiecare manager are control deplin asupra sistemului; eterogenitate sistemele pot opera pe diferite platforme, cu diferite modele de date i limbajele de interogare. Una dintre soluiile folosite pentru a depi dificultile ntmpinate n respectarea autonomiei i a eterogenitii este utilizarea sistemelor multibaze de date.

20

Un sistem multibaze de date (SMB) este alctuit din mai multe sisteme de baze de date privite integrat, n care se construiesc una sau mai multe scheme globale pe baza schemelor fiecrei baze de date componente, astfel nct s se poat realiza accesul uniform i integrat la fiecare din bazele de date componente. Fiecare schem global este construit pe baza unui model particular de date. De exemplu, se poate construi o schem global ce are la baz modelul relaional pentru utilizatorii care sunt familiarizai cu acest model, dar se poate construi o schem global bazat pe modelul orientat obiect pentru utilizatorii bazelor de date orientate obiect. Pentru o schem global dat, un sistem multibaze de date const din sistemele componente mpreun cu un sistem front-end, care suport un singur model de date i un singur limbaj de interogare. Principalele sarcini ale sistemului front-end sunt gestionarea schemei globale i procesarea cererilor globale. Un avantaj major al acestui model, fa de altele, este faptul c o singur interogare poate accesa date din mai multe baze de date ntr-un mod integrat, fr s afecteze nici o aplicaie care este scris utiliznd una dintre bazele de date componente. Baze de date cu suport decizional Sistemele informatice, n particular bazele de date, au ajuns la maturitate. Marile companii au acumulat o mare cantitate de informaii din domeniul lor de activitate, pe care le pstreaz n tabele istorice i sunt nefolositoare sistemelor operaionale ale companiei, care funcioneaz cu date curente. Analizate, aceste date ar putea oferi informaii despre tendine i evoluii care ar putea interesa compania. Pentru a putea analiza aceste mari cantiti de date este nevoie de tehnologii i instrumente speciale. Ideea de a analiza colecii de date provenind din sistemele operaionale ale companiei sau din surse externe pentru a le folosi ca suport n procesul de decizie nu aparine ultimului deceniu, dar baze de date care s funcioneze eficient dup aceste criterii au fost studiate i implementate n ultimii ani. Principalul scop al acestor baze de date a fost de a ntmpina nevoile sistemelor operaionale, a cror natur este inerent tranzacional. Sistemele tranzacionale sunt interesate, n primul rnd, s controleze la un moment dat o singur tranzacie. De exemplu, ntr-un sistem bancar, atunci cnd clientul face un depozit, sistemul operaional bancar este responsabil de a nregistra tranzacia ntr-u n tab el al tranzaciilo r i d e a crete nivelul curent al contului clientului, stocat n alt tabel.

21

Un sistem operaional tipic opereaz cu evenimente predefinite i, datorit naturii lor, necesit acces rapid la date. Uzual, fiecare tranzacie opereaz cu cantiti mici de date. De-a lungul timpului, nevoile sistemelor operaionale nu se schimb mult. Aplicaia care nregistreaz tranzacia, ca i cea care controleaz accesul utilizatorului la informaie (partea de raportare a sistemului bancar), nu se modific prea mult. n acest tip de sistem, informaia necesar n momentul n care un client iniiaz o tranzacie trebuie sa fie actual. nainte ca o banc s aprobe un mprumut este nevoie s se asigure de situaia financiar stabil a clientului n acel moment, i nu cu un an nainte. n ultimii ani s-au pus la punct principii i tehnologii noi care s serveasc procesului de analiz i administrare a datelor. O baz de date optimizat n acest scop definete o Data Warehouse (magazie de date), iar principiul pe care l urmeaz este cunoscut sub numele de procesare analitic (OLAP On Line Analytical Processing). Spre deosebire de acesta, principiul pe care se bazeaz sistemele tranzacionale a fost numit procesare tranzacional (OLTP On Line Transactional Processing). Aplicaiile unei Data Warehouse trebuie s ofere rspunsuri unor ntrebri de tipul: Care zi din sptmn este cea mai aglomerat? Ce clieni, cu care avem relaii intense, nu au beneficiat de reduceri de preuri?. O caracteristic a bazelor de date analitice este c interogrile la care acestea trebuie s rspund sunt ad-hoc, nu sunt predefinite, iar baza de date trebuie optimizat astfel nct s fie capabil s rspund la orice fel de ntrebare care poate implica mai multe tabele. n aceast abordare, organele generale de decizie necesit accesul la toate datele organizaiei, oriunde s-ar afla acestea. Pentru o analiz corespunztoare a organizaiei, afacerilor, cerinelor, tendinelor este necesar nu numai accesarea valorilor curente din baza de date, ci i a datelor istorice. Prin urmare, pentru a facilita acest tip specific de analiz a informaiei a fost creat magazia de date, care conine informaii extrase din diverse surse, ntreinute de diverse uniti operative, mpreun cu istoricul i rezumatul tranzaciilor. Sursele de date pentru o magazie cuprind: date operaionale, pstrate n baze de date ierarhice, de prima generaie; date departamentale, pstrate n sisteme de fiiere patentate;

22

date cu caracter personal, pstrate pe staii de lucru i servere personale; sisteme externe (baze de date comerciale, Internet etc.) Data warehouse este o colecie de date: orientate spre subiect (principalele subiecte ale modelului sunt clienii, produsele, vnzrile, n loc de domeniile de activitate), nevolatile (datele nu sunt reactualizate, nlocuite n timp real, ci sunt adugate ca un supliment al bazei), integrate (transpunerea datelor provenite din diverse surse de informaii se face ntr-un format consistent), variabile n timp (concentrarea depozitului de date se face asupra schimbrilor care au loc n timp).
Administrator Depozit de date META-FLUX Sursa 1 Date operationale Utilitare cereri, rapoarte

Metadate Date cu nivel mare de agregare Administrator incarcare date Administrator cereri FLUX Date cu nivel EXTERN mic de agregare FLUX ASCENDENT Date detaliate SGBD

FLUX INTERN

Utilitare OLAP

Utilitare Data mining

Sursa n Date operationale

Administrator Depozit de date Utilitare pentru accesul utilizatorilor finali

Arhive/ date backup

FLUX DESCENDENT

Fig 1.2. Arhitectura unui depozit de date nmagazinarea datelor se concentreaz asupra gestionrii a cinci fluxuri de informaii:

23

fluxul intern, care reprezint procesele asociate extragerii i ncrcrii datelor din fiierele surs n magazia de date; fluxul ascendent, care reprezint procesele asociate adugrii de valoare datelor din magazie, cu ajutorul mpachetrii i distribuirii; fluxul descendent, care reprezint procesele asociate arhivrii, salvrii, refacerii datelor din magazie; fluxul extern, care reprezint procesele asociate punerii la dispoziie a datelor pentru utilizatorii finali; meta-fluxul, care reprezint procesele asociate gestionrii metadatelor (date despre date). n arhitectura depozitului de date intervin cteva componente specifice acestei structuri. Administratorul pentru ncrcarea datelor (componenta front-end) realizeaz toate operaiile asociate cu obinerea (extragerea) i ncrcarea datelor operaionale ntr-un depozit de date. Administratorul depozitului de date realizeaz toate operaiile legate de administrarea datelor din depozit. Operaiile realizate de componenta de administrare a depozitului de date includ: analiza datelor pentru a asigura consistena acestora; transformarea i mutarea datelor surs din structurile temporare de stocare n tabelele depozitului de date; crearea de indeci i vizualizri asupra tabelelor de baz; generarea denormalizrii (dac este necesar); generarea agregrilor; crearea arhivelor i a backup-urilor. Administratorul cererilor (componenta back-end) realizeaz toate operaiile legate de administrarea cererilor utilizator. Aceast component este construit folosind utilitarele de acces la date disponibile utilizatorilor finali, utilitarele de monitorizare a depozitului de date, facilitile oferite de sistemul de baze de date i programele personalizate. n zona ce include date agregate sunt stocate toate agregrile predefinite de date, pe diferite niveluri. Scopul, meninerii acestora, este de a mri performana cererilor care necesit agregri. Datele agregate sunt actualizate permanent, pe msur ce sunt ncrcate noi informaii n depozit. Scopul principal al depozitelor de date este de a oferi informaii necesare utilizatorilor pentru luarea deciziilor strategice de marketing. Aceti utilizatori interacioneaz cu depozitul de date prin diferite utilitare de acces (utilitare pentru rapoarte i cereri,

24

utilitare pentru dezvoltarea aplicaiilor, utilitare pentru procesarea analitic on-line (OLAP), utilitare data mining) etc. Instrumentele de acces pentru utilizatorii finali ai magaziilor de date: prelucrarea analitic on-line; extensiile limbajului SQL; instrumentele de extragere a datelor. Prelucrarea analitic on-line (OLAP) reprezint sinteza, analiza i consolidarea dinamic a unor volume mari de date multidimensionale. Serverele de baze de date OLAP utilizeaz structuri multidimensionale pentru stocarea datelor i a relaiilor dintre date. Aceste structuri pot fi vizualizate prin cuburi de date i cuburi n cadrul cuburilor etc. Fiecare latur a cubului reprezint o dimensiune. Serverele de baze de date OLAP multidimensionale accept operaiile analitice uzuale: consolidarea (gruparea), parcurgerea n jos (inversul consolidrii), tranarea, tierea. OLAP necesit o modalitate de agregare a datelor conform mai multor grupri diferite, n numr foarte mare, iar utilizatorii trebuie s le aib n vedere pe toate. Instrumentele OLAP presupun organizarea informaiei ntr-un model multidimensional care este susinut de o baz de date: multidimensional (MOLAP), n care datele sunt stocate conceptual n celulele unui tablou multidimensional; relaional (ROLAP), proiectat pentru a permite interogri multidimensionale. n acest context, a devenit o necesitate extinderea limbajului SQL prin operaii puternice, necesare pentru rezolvarea noului tip de abordare. Au fost introduse noi funcii numerice (limita inferioar, limita superioar etc.), noi funcii statistice (distribuie, distribuie invers, corelaie etc.), noi operatori de agregare, extensii ale clauzei GROUP BY etc. De exemplu, RISQL (Red Brick Intelligent SQL), proiectat pentru analitii din domeniul afacerilor, permite: ordonare dup rang (pe diferite niveluri - de exemplu, gruparea filialelor n trei categorii pe baza venitului generat n anul precedent), partajarea pieei, compararea anului curent cu cel precedent etc. O alt problem esenial este extragerea datelor i utilizarea acestora pentru luarea de decizii cruciale n domeniul afacerilor. Descoperirea unor noi corelaii, tipare, tendine, prin extragerea unor cantiti mari de date folosind strategia inteligenei artificiale este una din modalitile de rezolvare. Extragerea datelor presupune capacitatea de a construi modele mai degrab previzibile, dect retrospective. Modelarea predictiv utilizeaz

25

informaii pentru a forma un model al caracteristicilor importante ale unui fenomen. Tehnicile asociate operaiilor fundamentale de extragere sunt: modelarea predictiv (clasificarea cu ajutorul unei reele neurale sau al unei inducii de tip arbore i previziunea valorilor, utiliznd tehnici de regresie); segmentarea bazei de date (comasarea demografic i comasarea neural care se deosebesc prin metodele uilizate pentru a calcula distana dintre nregistrri, prin intrrile de date permise); analiza legturilor (descoperirea asocierilor, descoperirea tiparelor, descoperirea secvenelor de timp similare); detectarea deviaiilor (statistici i vizualizri pentru identificarea mprtierii datelor, utiliznd tehnici moderne de vizualizare grafic). n aceast clas pot fi considerate, de exemplu, detectarea fraudelor privind utilizarea crilor de credit, preteniile de despgubire ale asigurailor etc. n concluzie, spre deosebire de un sistem OLTP, Data Warehouse este o baz de date a crei structur este proiectat pentru a facilita analiza datelor. Un sistem de suport decizional urmrete, n primul rnd, obinerea de informaii din baza de date, n timp ce unul OLTP urmrete introducerea de informaii n baza de date. Datorit acestor diferene, structura optim a unei Data Warehouse este radical diferit de cea a unui sistem OLTP. Depozitele de date i sistemele OLTP sunt supuse unor cerine diferite, dintre care cele mai semnificative se refer la operaii, actualizarea datelor, proiectare, operaii tipice i date istorice. Operaii. Depozitele sunt create pentru a permite interogri ad hoc. Ele trebuie s fie suficient de flexibile pentru a putea rspunde interogrilor spontane ale utilizatorilor. Sistemele OLTP suport numai operaii predefinite. Aplicaiile pot fi optimizate sau create special numai pentru acele operaii. Actualizarea datelor. Utilizatorii finali ai unui depozit de date nu fac n mod direct actualizri ale depozitului. n sistemele OLTP, utilizatorii realizeaz, de obicei, n mod individual procedurile de modificare a bazei de date. n acest fel, baza de date OLTP este ntotdeauna la zi i reflect starea curent a fiecrei tranzacii. Proiectare. Depozitele de date folosesc, n mod uzual, scheme denormalizate, n timp ce sistemele OLTP folosesc scheme normalizate pentru a optimiza performanele operaiilor.

26

Operaii tipice. O simpl interogare a depozitului de date poate scana mii sau chiar milioane de nregistrri (de exemplu, cererea Care sunt vnzrile totale ctre toi clienii din luna trecut?), n timp ce o operaie tipic OLTP acceseaz doar o parte mai mic din nregistrri. Date istorice. Depozitele de date stocheaz datele pe o perioad lung de timp, luni sau ani. Acest lucru ofer suport pentru analiza istoric a informaiei. Sistemele OLTP rein date istorice att timp ct este necesar pentru a ndeplini cu succes cerinele tranzaciilor curente. Sistemele OLTP Pstreaz date curente Data Warehouse Pstreaz date istorice Stocheaz date detaliate, agregate uor Stocheaz date detaliate sau puternic Datele sunt dinamice Datele sunt n mare msur statice Prelucrare ad-hoc, nestructurat i Prelucrare repetitiv euristic Nivel nalt de transfer al Nivel mediu sau sczut de transfer al tranzaciilor tranzaciilor Tipar de utilizare previzibil Tipar de utilizare imprevizibil Conduse prin tranzacii Susin deciziile de zi cu zi Deservesc un numr mare de utilizatori Orientate spre aplicaii Conduse prin analiz Susin deciziile strategice Deservesc un numr relativ redus de utilizatori din administraie Orientate spre subiect

Fig. 1.3. OLTP versus Data Warehouse O baz de date OLAP poate fi relaional, dar datorit naturii ei orientate spre dimensiuni, au fost dezvoltate pentru gestionarea acestor baze de date construcii multidimensionale, mai potrivite pentru o raportare flexibil. Spre deosebire de bazele de date relaionale, structura unei baze de date multidimensionale nu implic tabele, linii i coloane, ci obiecte de urmtoarele tipuri: variabile, dimensiuni, niveluri, ierarhii, atribute. Data Warehouse, care cuprinde de obicei informaii despre o ntreag companie, poate fi submprit n baze de date departamentale, numite rafturi de date (Data Marts). De exemplu, poate exista un Data

27

Mart al departamentului financiar, un altul al departamentului vnzri i un altul pentru departamentul marketing. Construcia unei astfel de baze de date poate fi abordat n dou moduri. O prim abordare este de a construi mai nti un schelet al bazei de date la care se lipesc ulterior rafturile de date. Aceasta necesit o analiz prealabil a ntregului i o delimitare a blocurilor componente. Ea cere un timp mai lung de dezvoltare, dar rezultatul este o baz de date unitar. A doua metod este de a construi mai nti rafturi specifice, efortul constnd, n acest caz, n asocierea acestora. Aceast soluie ofer mai rapid, aplicaii funcionale utilizatorilor, dar au de suferit unitatea i portabilitatea aplicaiilor finale. Utilizatorii trebuie s-i schimbe optica asupra bazelor de date pentru a fi capabili s foloseasc puterea i flexibilitatea instrumentelor analitice de care dispun. Instrumentele OLAP au evoluat ca o modalitate de a rezolva interogrile complicate necesare procesului de analiz a datelor. Combinaia ntre bazele de date multidimensionale i instrumentele analitice prietenoase face uoar analiza, sinteza i consolidarea datelor. n ultimii ani, marii productori de sisteme de gestiune a bazelor de date relaionale, precum Oracle, au introdus n produsele lor construcii care s faciliteze accesul la datele din sistemele fundamentale pentru luarea de decizii. Astfel, noile versiuni de SGBD-uri ale firmelor mari prevd o modalitate mai inteligent de a realiza operaia de compunere ntre dou sau mai multe tabele, metode de indexare noi, potrivite pentru marile cantiti de date statice cu care opereaz sistemele Data Warehouse, capacitatea de a detecta i optimiza interogri de un tip special, posibilitatea de a folosi mai multe procesoare pentru a rezolva o interogare. Un sistem Data Warehouse are un efect fundamental asupra utilizatorilor. Ei pot manevra mult mai flexibil sistemul, au posibiliti elevate pentru interogarea datelor, dar ei trebuie s tie cum s prelucreze i s vizualizeze datele i cum s le foloseasc n procesul de decizie. Un efort ce trebuie fcut pentru construirea unui sistem de suport pentru decizii (DSS Decision Support System) const n procesul de descoperire a informaiilor utile din baza de date. Acest proces, numit Data Mining sau Knowledge Discovery in Databases (KDD), proceseaz mari cantiti de date, a cror corelare nu este neaprat evident, n vederea descoperirii de tendine i tipare.

28

1.5. Arhitecturi multi-user pentru sisteme de gestiune a bazelor de date


Arhitecturile uzuale care sunt utilizate pentru implementarea sistemelor de gestiune a bazelor de date multi-user sunt: teleprocesarea, arhitectura fiier-server arhitectura client-server. Teleprocesarea este arhitectura tradiional, ce cuprinde un calculator cu o singur unitate CPU i un numar de terminale care sunt incapabile s funcioneze singure. Terminalele trimit mesaje la programele aplicaie ale utilizatorilor, care la rndul lor, utilizeaz serviciile SGBD. Aceast arhitectur a plasat o greutate teribil asupra calculatorului central, care pe lng rularea programelor de aplicaii i ale SGBD-ului, mai trebuie s preia i din munca terminalelor (de exemplu, formatarea datelor pentru afiarea pe ecran). Arhitectura fiier-server, presupune deja c procesarea este distribuit n reea (de obicei o reea local LAN). Arhitectura cuprinde fiierele cerute de aplicaii i SGBD-ul. Aplicaiile i funciile SGBD sunt executate pe fiecare staie de lucru, solicitnd cnd este nevoie fiiere de pe server-ul de fiiere. Dintre dezavantaje se remarc: existena unui trafic intens pe reea; necesitatea unei copii complete a SGBD-ului pe fiecare staie de lucru; acelai fiier poate fi accesat de mai multe SGBD-uri, ceea ce implic un control complex al integritii, simultaneitii, reconstituirii. Arhitectura client-server se refer la modul n care interacioneaz componentele software pentru a forma un sistem. Exist un proces client, care necesit resurse i un proces server, care ofer resurse. n arhitectura client-server, clientul (front end) emite, prin intermediul reelei locale, o cerere SQL care este executat pe server (backend); acesta trimite ca rspuns ansamblul nregistrrilor rezultat. ntr-o astfel de interaciune mainile sunt eterogene, iar protocoalele de reea pot fi distincte. n contextul bazelor de date, client-ul: administreaz interfaa cu utilizatorul i logica aplicaiei; accept i verific sintaxa intrrilor utilizatorilor; proceseaz aplicaiile; genereaz cerinele pentru baza de date i le trimite server-ului;

29

transmite rspunsul napoi la utilizator. n contextul bazelor de date, server-ul: primete i proceseaz cerinele clienilor pentru baza de date; verific autorizarea; garanteaz respectarea constrngerilor de integritate; efectueaz procesarea interogare-reactualizare i trimite clientului rspunsul; realizeaz optimizarea interogrilor; asigur controlul concurenei dintre mai multi clieni care se ignor (mecanisme de blocare); intreine dictionarul datelor; ofer acces simultan la baza de date; asigur robusteea n cazul defeciunilor; ofer controlul reconstituirii etc. Arhitectura tradiional client-server pe dou etaje (straturi) presupune: client-ul responsabil, n primul rand, de prezentarea datelor ctre client; server-ul responsabil, n primul rand, de furnizarea serviciilor ctre client. Arhitectura client-server pe trei etaje presupune trei straturi, fiecare fiind rulat, potenial, pe o platform diferit. stratul (client) format din interfaa cu utilizatorul, care este rulat pe calculatorul utilizatorului final; stratul (server de aplicaie), ce manevreaz logica aplicaiilor i prelucrrii datelor, i care poate servi mai muli clieni (conectare la celelalte dou straturi se face prin reele locale LAN sau de mare suprafa WAN); stratul (server-ul de baze de date), care se ocup cu validarea datelor i accesarea bazei de date (stocheaz date necesare stratului din mijloc). Arhitectura se potrivete natural mediului Web. Un browser Web acionnd drept client i un server Web fiind server de aplicaie. Middleware este un strat, evident software, ntre aplicaia postului client i server-ul de baze de date, constituit dintr-o interfa de programare a aplicaiilor (API - Application Programming Interface) i un protocol de reea.

30

API descrie tipul de interaciune dintre o aplicaie client i un server la distan, via un protocol de comunicaie i de formatare a datelor. Scopul existenei interfeei de programare a aplicaiilor este de a oferi o interfa unic mai multor server-e de baze de date. Este convenabil ca sistemele de baze de date s fie considerate ca fiind formate dintr-un server (sistemul SGBD nsi) i un set de clieni (aplicaiile). Frecvent, clienii i server-ul pot fi rulate pe calculatoare diferite, realizndu-se un tip simplu de procesare distribuit. n general, fiecare server poate deservi mai multi clieni, iar fiecare client poate accesa mai multe server-e. Dac sistemul ofer transparen total (fiecare client se poate comporta ca i cum ar comunica cu un singur server, de pe un singur calculator) atunci este vorba despre un sistem de baze de date distribuite.

1.6. Tehnologia Web i sistemele SGBD


Internet = o colecie mondial de reele de calculatoare. Intranet = un sit Web sau un grup de sit-uri care aparin unei organizaii, accesibil numai pentru membrii acesteia. Extranet = o reea intranet care este parial accesibil utilizatorilor externi autorizai. Reea Web (World Wide Web) = un sistem bazat pe hipermedii care pune la dispoziie un mijloc simplu, de tip indicare-clic de rsfoire a informaiilor pe Internet, folosind hiperlegturile. HTTP = protocolul utilizat pentru a transfera pagini Web prin intermediul Internetului. HTML = limbajul de formatare a documentelor utilizat n proiectarea majoritii paginilor Web. Adresa URL = ir de caractere alfanumerice care reprezint adresa unei resurse pe Internet i modul n care trebuie accesat resursa. Interfaa de poart comun (CGI) = definete modul n care scripturile comunic cu server-ul Web. Este tehnica de baz de integrare a bazelor de date n reeaua Web. n mediul Web funcioneaz modelul three tier format din: un strat de interfa cu utilizatorul (client), un strat de logic a afacerii i prelucrare a datelor (server de aplicaii), un sistem SGBD (server de baze de date) distribuit pe calculatoare diferite. Avantajele reelei Web ca platform de baze de date: avantagele SGBD;

31

simplitate; independena de platform; interfaa grafic cu utilizatorul; acces transparent n reea; standardizare (HTML standard de facto). Arhitectura de calcul n reea a sistemului Oracle (NCA Network Computing Architecture) se axeaz n principal pe furnizarea extensibilitii pentru mediile distribuite. Arhitectura este construit pe baza tehnologiei CORBA pentru manipularea obiectelor. Este o structur three tier care se bazeaz pe utilizarea de: cartue de software care permit utilizatorilor s adauge funcionaliti individuale n aplicaii (cartuele pot fi construite n Java, C/C++, Visual Basic, SQL i pot fi conectate la oricare din cele 3 straturi); protocoale deschise i interfee standardizate care permit comunicarea ntre cartue (distribuite ntr-o reea) prin intermediul unui program magistral (ICX); clieni extensibili, server-e de aplicaie, server-e de baze de date; dezvoltarea i administrarea integrat a cartuelor. Un cartus utilizeaza un limbaj de definire a interfetelor (IDL) pentru a putea fi identificat de alte obiecte intr-un sistem distribuit. De exemplu, PL/SQL este un astfel de cartus. Arhitectura cu mai multe niveluri (multitier) conine urmtoarele elemente: unul sau mai muli client-i care iniiaz operaii; unul sau mai multe server-e de aplicaii care execut pri ale operaiilor; un server de baze de date care stocheaz datele folosite de operaii. Client-ul, care poate fi un browser Web sau un proces user, iniiaz o cerere pentru a executa o operaie referitoare la informaiile stocate n baza de date. Conectarea la server-ul bazei de date se face printr-unul sau mai multe server-e de aplicaii. Server-ul de aplicaii constituie interfaa dintre client-i i server-ul bazei de date, asigurnd accesul la informaii. De asemenea, el include un nivel adiional pentru securitate. Server-ul de aplicaii i asum identitatea client-ului, atunci cnd execut, pe server-ul de baze de date, operaiile solicitate de acesta. Arhitectura multitier permite folosirea unui server de aplicaii pentru

Arhitectura multitier a sistemului Oracle9i

32

acreditarea client-ului, conectarea la server-ul de baze de date i execuia operaiilor iniiate de client. Privilegiile server-ului de aplicaii sunt limitate pentru a preveni execuia operaiilor nedorite sau inutile n timpul unei operaii client. Server-ul de baze de date pune la dispoziia server-ului de aplicaii informaiile necesare pentru soluionarea operaiilor lansate de ctre client. De asemenea, acesta face distincia ntre operaiile pe care server-ul de aplicaii le cere n favoarea client-ului i cele pe care le solicit n nume propriu.

Oracle9i Developer Suite

HTTP

Clienti HTTP Nivel 1

Oracle9i Application Server Nivel 2

Oracle9i Database Nivel 3

Fig. 1.4. Arhitectura three-tier a sistemului Oracle9i

2 MODELAREA ENTITATE - RELAIE


Pr oiectar ea baz elor de date or ientate obiect M ODELAREA BAZELOR DE DATE

2.1. Preliminarii
Un model este o reprezentare a obiectelor i evenimentelor lumii reale i a asocierilor dintre ele. De fapt, el reprezint o abstracie asupra aspectelor semnificative ale unei ntreprinderi, ale unui sistem real, ignornd proprietile accidentale. Modelul este cel pe care utilizatorii trebuie s-l cunoasc; implementarea unui model este cea pe care utilizatorii nu este necesar s o cunoasc. Diferena dintre model i implementare este, de fapt, un caz special i important al deosebirii uzuale dintre logic i fizic. Modelele se impun prin sintaxa i prin semantica lor i, din acest punct de vedere, exist trei tipuri fundamentale de modele: modele care descriu aspectele statice ale procesului modelat; modele care descriu aspectele dinamice ale procesului modelat; modele care descriu aspectele funcionale ale procesului modelat. Un model de date reprezint o colecie integrat de concepte necesare descrierii: datelor, relaiilor dintre ele, constrngerilor existente asupra datelor sistemului real analizat. Modelarea unei baze de date permite trecerea de la percepia unor fapte din lumea real la reprezentarea lor prin date. Modelul de date trebuie s reflecte fidel fenomene ale lumii reale, s urmreasc evoluia acestei lumi i comunicarea dintre fenomenele lumii reale. Modelul trebuie s asigure conceptele de baz care permit proiectantului bazei de date i utilizatorilor s comunice, fr ambiguiti, cunotinele lor privind funcionarea i organizarea modelului real analizat. Prin urmare, un model de date trebuie s reprezinte datele i s le fac nelese. n esen, modelul de date are trei componente: o mulime de reguli conform crora sunt construite bazele de date (partea structural); o mulime de operaii permise asupra datelor, care sunt utilizate pentru reactualizarea sau regsirea datelor (partea de prelucrare); o mulime de reguli de integritate, care asigur coerena datelor. Abordarea general a problemei modelrii semantice a datelor se face n patru etape.

58

PROIECTAREA BAZELOR DE DATE

Se identific o mulime de concepte semantice care sunt utile n descrierea lumii reale. Se presupune c lumea real (modelul real analizat) este format din entiti care au anumite proprieti, c fiecare entitate are o identitate, c exist legturi, corelaii ntre entiti. Conceptul de corelaie, ca i cel de entitate, este util, n mod intuitiv, la descrierea modelului. Se caut o mulime de obiecte formale, simbolice care sunt utilizate pentru reprezentarea conceptelor semantice anterioare. Se dau reguli de integritate formale i generale (constrngeri) care s reflecte restriciile la care este supus modelul. Se definete o mulime de operatori formali prin care pot fi prelucrate i analizate obiectele formale.

2.2. Modelul entitate-relaie Una dintre cele mai cunoscute abordri ale modelrii semantice (cu siguran una dintre cele mai utilizate) este cea bazat pe modelul entitaterelaie (E/R). Acesta a fost introdus de ctre Peter.P. Chen n 1976 i rafinat de atunci n diverse moduri de ctre acesta i de muli ali cercettori, ca un model de date conceptual, pentru a uura proiectarea bazelor de date. Pentru reprezentarea grafic a modelului sunt utilizate diagramele E/R, care sunt modele neformalizate pentru reprezentarea unui model, unui sistem din lumea real. Diagramele E/R constituie o tehnic de reprezentare a structurii logice a bazei de date, ntr-o manier grafic. Aceste diagrame ofer un mijloc simplu i inteligibil de comunicare a caracteristicilor importante ale designului unei anumite baze de date. Diagrama E/R este un model de date conceptual de nivel nalt, independent de platforma hardware utilizat i de tipul SGBD-ului. Modelul este constituit din concepte care descriu structura bazei de date i tranzaciile de regsire sau reactualzare asociate. Popularitatea modelului E/R ca modalitate de abordare a proiectrii bazelor de date poate fi atribuit n principal tehnicii de realizare a diagramelor E/R. Aceast tehnic, ca i modelul E/R nsui, a evoluat de-a lungul timpului datorit noilor problematici care au aprut n proiectarea bazelor de date. Baza de date poate fi definit ca o mulime de date ce modeleaz un sistem real. Acest sistem este format din obiecte legate ntre ele. Modelul E/R mparte elementele unui sistem real n dou categorii: entiti i relaii (legturi, asocieri) ntre aceste entiti. Entitiile i legturile au anumite caracteristici, numite atribute. Nu trebuie confundat conceptul de relaie, n sensul de asociere, care intervine n definirea diagramei E/R cu conceptul de relaie care este specific modelului relaional.

Modelarea entitate-relaie

59

Studiu de caz Exemplele din acest capitol se refer la proiectarea unui model de date ce furnizeaz informaii despre prezentri de mod, evenimente care reprezint momente importante n lumea caselor de mod. Vom prezenta modelul de date, restriciile pe care trebuie s le respecte i vom ncerca, ntr-o manier didactic, s construim diagrama E/R corespunztoare. Vom considera, n abordarea iniial, anumite situaii care nu sunt optime, n sensul c pot genera redundan, anomalii la reactualizri sau nu permit rezolvarea anumitor interogri asupra modelului. Vom ncerca s artm care sunt deficienele modelului, situaiile care le-au generat i cum pot fi corectate (parial sau total) anomaliile respective. Modelul de date va gestiona informaii legate de organizarea i funcionarea prezentrilor de mod. Exist firme organizatoare care se ocup de buna desfurare a acestor prezentri. O firm organizatoare poate fi contactat prin angajai specializai pe diferite domenii (financiar, social, publicitate, securitate, sisteme de iluminare, coregrafie, sisteme de sonorizare, cazare, primiri/plecri aeroport etc.). Firme specializate sunt angajate pentru soluionarea problemelor legate de securitate, publicitate, asigurri, iar restul problemelor sunt rezolvate cu salariaii proprii ai caselor de mod i a firmei organizatoare. Modalitile de securitate, asigurri, publicitate proprii caselor de mod, modelelor sau ageniilor de modele nu intr n proiectarea modelului. Prezentrile pot fi sponsorizate, considerndu-se doar informaiile referitoare la persoane (fizice sau juridice) care au contribuit efectiv la finanarea prezentrilor de mod. Mai exact, nu sunt inclui sponsorii posibili. La aceste evenimente particip case de mod, care prezint vestimentaii concepute de creatorii casei respective. Creatorii pot fi cei care concep vestimentaia (designeri) sau cei care o realizeaz efectiv, incluznd croitori, lucrtori care se ocup cu broderia sau cu realizarea diverselor accesorii. n cadrul prezentrii de mod, vestimentaiile sunt purtate de manechine care aparin anumitor agenii de modele. Casele de mod angajeaz modele care s le prezinte vestimentaiile cu prilejul acestor evenimente. Modelul de date prezint i un istoric al activitii manechinelor (n cadrul diverselor agenii). Casele de mod angajeaz pentru o prezentare stiliti care se ocup cu machiajul i coafura modelelor. De asemenea, modelul analizeaz informaii legate de localizarea i accesarea firmelor de publicitate, a persoanelor de contact din firmele organizatoare, a caselor de mod, a ageniilor i a modelelor, a sponsorilor, a societilor de asigurare i a firmelor care asigur securitatea evenimentelor. Modelul de date respect anumite restricii de funcionare. Casele de mod pot fi organizatori de prezentri. Chiar dac o cas de mod este organizator, ea apeleaz la serviciile unei firme specializate n organizarea unor astfel de evenimente.

60

PROIECTAREA BAZELOR DE DATE

Un model sau un stilist este angajat (temporar) pentru o prezentare, de o singur cas de mod. O cas de mod poate angaja mai multe modele i mai muli stiliti pentru o prezentare. Orice prezentare de mod are un organizator unic, care poate apela la serviciile altor instituii specializate (securitate, asigurri, publicitate). Pentru organizator s-a considerat un singur cont n/din care se pot face plile. O cas de mod poate avea mai muli designeri, dar un designer poate lucra pentru o singur cas de mod. Pentru contactarea unei persoane fizice sau juridice s-a considerat cte un singur numr de telefon fix, telefon mobil, fax i o singur adres de mail. Pentru localizarea unei persoane fizice sau juridice s-a considerat o singur adres de baz. Sunt luai n considerare doar angajaii firmei de paz i protecie care particip efectiv la asigurarea securitii prezentrilor de mod. Creatorii de accesorii pot fi angajai permaneni ai unei case de mod. Dac pentru anumite vestimentaii sunt necesare accesorii create de specialiti care nu aparin casei de mod, acetia vor fi considerai angajai special pentru evenimentul respectiv. S-a considerat c proprietarul unei case de mod fie este unic, fie, dac sunt mai muli, va fi considerat drept proprietar cel care deine numrul maxim de aciuni. Entitate Entitatea este un obiect sau un concept, care este semnificativ pentru modelul real analizat. O entitate poate fi dependent (slab), existena sa depinznd de alt entitate sau independent (tare), caz n care ea nu depinde de existena altei entiti. 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. Pentru o analiz didactic a problematicii abordate, construirea diagramelor E/R, se vor considera i aspecte ale modelului real analizat, care nu apar n diagrama final. Pentru modelul de date referitor la prezentrile de mod, structurile PUBLICITATE, ORGANIZATOR, PERS_CONTACT, PREZENTARE, SPONSOR, FIRMA_PUB, CASA_MODA, CREATOR, VESTIMENTATIE, MODEL, ACCESORIU, LOCALIZARE, AGENTIE, ISTORIC, FIRMA_SEC, ANGAJAT_SEC,SOCIETATE_ASIG, ANGAJAT_TEMP, INFO_CONTACT, LOCATIE reprezint entiti. Observaii Entitile devin tabele n modelele relaionale. n general, entitile se scriu cu litere mari.

Modelarea entitate-relaie

61

Entitile sunt substantive, dar nu orice substantiv este o entitate. Trebuie ignorate substantivele nerelevante. Cheia primar identific unic o entitate i face distincie ntre valori diferite ale entitii. Aceasta trebuie s fie unic i cunoscut la orice moment. Cheia primar trebuie s fie controlat de administratorul bazei, s nu conin informaii descriptive, s fie simpl, fr ambiguiti, s fie stabil, s fie familiar utilizatorului astfel nct acesta s o poat folosi cu uurin. Pentru fiecare entitate este obligatoriu s se dea o descriere detaliat. Nu pot exista, n aceeai diagram, dou entiti cu acelai nume, sau o aceeai entitate cu nume diferite. Vom prezenta entitile modelului de date, dnd o descriere complet a fiecreia. De asemenea, pentru fiecare entitate se va preciza cheia primar. Toate entitile care vor fi prezentate sunt independente, cu excepia entitilor dependente ACCESORIU, ISTORIC i a subentitii MODEL. ORGANIZATOR = firm (persoan juridic) specializat, care se ocup cu organizarea i buna desfurare a unei prezentri de mod. Ea poate apela la societi specializate pentru rezolvarea problemelor ce apar n organizarea prezentrii de mod sau poate oferi servicii proprii pentru desfurarea optim a evenimentului. Cheia primar a entitii este cod_organizator. PERS_CONTACT = persoan fizic, aparinnd firmei organizatoare, care este responsabil cu un anumit domeniu de activitate specific organizrii prezentrii de mod. Ea poate fi contactat pentru diversele probleme care privesc prezentarea, fiind punctul de legtur dintre direciile din firma organizatoare i cele din societile externe, care se ocup efectiv cu realizarea tuturor problemelor ce apar n organizarea evenimentului. Atributul cod_pers_contact reprezint cheia primar a entitii. SPONSOR = persoan fizic sau juridic ce contribuie financiar sau n alt manier la desfurarea prezentrii de mod. Cheia primar a acestei entiti este cod_sponsor. FIRMA_PUB = persoan juridic ce asigur publicitatea evenimentului. Firma organizatoare poate apela la mai multe firme de publicitate. Cheia primar a acestei entiti este cod_firma_pub. PUBLICITATE = activitatea efectiv de publicitate asigurat de o firm de publicitate. Firmele de publicitate asigur diferite modaliti de realizare a publicitii (pres, televiziune, radio etc.). Cheia primar a acestei entiti este cod_publicitate. FIRMA_SEC = persoan juridic ce asigur securitatea prezentrii de mod. Se consider c o singur firm asigur securitatea evenimentului. Cheia primar a acestei entiti este cod_firma_sec.

62

PROIECTAREA BAZELOR DE DATE

ANGAJAT_SEC = persoan fizic, angajat a unei firme de securitate, care particip efectiv la asigurarea serviciilor de paz i protecie a prezentrilor de mod. Cheia primar a acestei entiti este cod_angajat. SOC_ASIG = persoan juridic responsabil de asigurarea (din punctul de vedere al societii organizatoare) tuturor activitilor pe care le implic prezentarea de mod. Se consider c firma organizatoare apeleaz la o singur societate de asigurri. Modelul de date nu ia n considerare asigurrile fcute de ageniile de modele pentru angajatele sale, asigurrile ncheiate chiar de ctre modele sau asigurrile contractate de casele de mod. Cheia primar a acestei entiti este cod_soc_asig. PREZENTARE = evenimentul efectiv al prezentrii de mod. Modelul de date consider doar prezentri de mod semnificative din lumea caselor de mod. Cheia primar a acestei entiti este cod_prezentare. CASA_MODA = persoan juridic a crei activitate const n crearea de vestimentaii i accesorii pentru aceste vestimentaii. Cheia primar a entitii este cod_casa_moda. CREATOR = persoan fizic, angajat (permanent sau special) a unei case de mod, care creeaz efectiv vestimentaiile sau accesoriile acestora prezentate n cadrul evenimentului respectiv. Cheia primar a entitii este cod_creator. VESTIMENTATIE = vestimentaia conceput i realizat de creatorii unei case de mod. Cheia primar a entitii este cod_vestimentatie. ACCESORIU = entitate dependent de VESTIMENTATIE, care conine informaii referitoare la accesoriile unei anumite vestimentaii. Cheia primar a entitii este compus din cod_accesoriu i cod_ vestimentatie. ANGAJAT_TEMP = persoan fizic, angajat temporar pentru o anumit prezentare de ctre o cas de mod, fie pentru realizarea machiajului i a coafurii modelelor care vor prezenta vestimentaii n cadrul prezentrii (stilist), fie pentru a purta creaiile acesteia la prezentarea respectiv (model). Cheia primar a entitii este cod_angajat_temp. MODEL = subentitate a entitii ANGAJAT_TEMP, ce conine informaii specifice manechinelor. Cheia primar a entitii este cod_angajat_temp. AGENTIE = agenia de modele care se ocup cu gestionarea activitilor (participare la prezentri de mod, contracte pentru reclama diverselor produse etc.) modelelor sale. Cheia primar a entitii este cod_agentie. ISTORIC = entitate dependent de MODEL, care conine istoricul angajrilor unui model la diferite agenii. Cheia primar a entitii este compus din cod_model i data_angajare. LOCALIZARE = identific localizarea unei persoane fizice (sponsor, persoan de contact, model, creator, stilist), juridice (firm de publicitate, securitate, asigurri, organizator, cas de mod, agenie de modele) sau eveniment (prezentare de mod). Cheia primar a entitii este cod_localizare.

Modelarea entitate-relaie

63

LOCATIE = entitate care identific locaia n care se desfoar o anumit prezentare de mod. Cheia primar a entitii este cod_locatie. INFO_CONTACT = identific modalitatea de contact a unei persoane fizice (sponsor, persoan de contact, angajat temporar, creator) sau juridice (firm de publicitate, securitate, asigurri, organizator, cas de mod, agenie de modele). Cheia primar a entitii este cod_info_contact. Relaie Relaia (asocierea) este o comunicare ntre dou sau mai multe entiti. O valoare a unei relaii este o comunicare ntre valorile entitilor pe care le leag. Relaia exprim un raport care exist ntre aceste entiti. Gradul unei relaii este dat de numrul de entiti participante ntr-o relaie (de exemplu, relaie binar, ternar, cvadrupl, n-ar). Existena unei relaii este subordonat existenei entitilor pe care le leag. ntre dou entiti pot exista mai multe relaii. O relaie n care aceeai entitate particip mai mult dect o dat n diferite roluri definete o relaie recursiv. Uneori, aceste relaii sunt numite unare. Observaii n modelul relaional, relaiile devin tabele speciale sau coloane speciale care refer chei primare. Relaiile sunt verbe, dar nu orice verb este o relaie. Pentru fiecare relaie este important s se dea o descriere detaliat. n aceeai diagram pot exista relaii diferite cu acelai nume. n acest caz, ele sunt difereniate de ctre entitile care sunt asociate prin relaia respectiv. Pentru fiecare relaie trebuie stabilit cardinalitatea (maxim i minim) relaiei, adic numrul de tupluri ce aparin relaiei. Asupra entitilor participante ntr-o relaie pot fi impuse constrngeri care trebuie s reflecte restriciile care exist n lumea real asupra relaiilor. O clas de constrngeri, numite constrngeri de cardinalitate, este definit de numrul de nregistrri posibile pentru fiecare entitate participant (raport de cardinalitate). Cel mai ntlnit tip de relaii este cel binar, iar n acest caz rapoartele de cardinalitate sunt, n general, one-to-one (1:1), one-to-many (1:n) sau many-to-many (m:n). De exemplu, n modelul analizat este definit relaia organizeaza care leag entitile ORGANIZATOR i PREZENTARE, relaie care poate fi scris sub forma ORGANIZATOR_organizeaza_PREZENTARE, pentru a percepe mai uor asocierile existente. Relaia are cardinalitatea minim 1:1 i cardinalitatea maxim 1:n. Vom prezenta relaiile modelului de date, dnd o descriere complet a fiecreia. De fapt, denumirile acestor legturi sunt sugestive, reflectnd

64

PROIECTAREA BAZELOR DE DATE

coninutul acestora i entitile pe care le leag. Pentru fiecare relaie se va preciza cardinalitatea minim i maxim. FIRMA_PUB_face_PUBLICITATE = relaie care leag entitile FIRMA_PUB i PUBLICITATE, reflectnd legtura dintre acestea (ce publicitate face o anumit firm de publicitate). Ea are cardinalitatea minim 1:1 (o firm de publicitate trebuie s realizeze cel puin o publicitate i o publicitate trebuie fcut de cel puin o firm de publicitate) i cardinalitatea maxim 1:n (o firm de publicitate poate asigura mai multe publiciti, iar o publicitate poate fi fcut de o singur firm specializat). PUBLICITATE_se_face_PREZENTARE = relaie care leag entitile PUBLICITATE i PREZENTARE, reflectnd legtura dintre acestea (pentru o prezentare, ce publicitate se face). Relaia are cardinalitatea minim 1:1 i cardinalitatea maxim 1:n. ORGANIZATOR_are_PERS_CONTACT = relaie dintre ORGANIZATOR i PERS_CONTACT, reflectnd legtura dintre acestea (ce persoane din firma organizatoare pot fi contactate pentru soluionarea diverselor probleme). Ea are cardinalitatea minim 1:1 i cardinalitatea maxim 1:n. FIRMA_SEC_are_ANGAJAT_SEC = relaie dintre entitile FIRMA_SEC i ANGAJAT_SEC, reflectnd legtura dintre acestea (ce angajai, implicai n aciunea de paz a prezentrilor de mod, au firmele de securitate). Ea are cardinalitatea minim 1:1 i cardinalitatea maxim 1:n. ANGAJAT_SEC_paza_PREZENTARE = relaie de tip many-to-many dintre entitatea PREZENTARE i ANGAJAT_SEC, reflectnd legtura dintre acestea (ce angajai ai firmei de securitate asigur buna desfurare a prezentrilor de mod). Ea are cardinalitatea minim 1:1 i cardinalitatea maxim m:n. SOC_ASIG_asigura_PREZENTARE = relaie dintre entitatea PREZENTARE i SOC_ASIG, reflectnd legtura dintre acestea (ce societate este angajat pentru asigurarea diverselor aspecte din cadrul prezentrii de mod). Ea are cardinalitatea minim 1:1 i cardinalitatea maxim 1:n. CASA_MODA_participa_PREZENTARE = relaie de tip many-to-many dintre entitile CASA_MODA i PREZENTARE (ce case de mod particip la prezentri). Ea arat i dac respectivele case particip, sau nu, ca organizator la prezentari. Relaia are cardinalitatea minim 1:1 i cardinalitatea maxim m:n. CASA_MODA_lucreaza_CREATOR = relaie dintre entitile CASA_MODA i CREATOR (la ce case de mod lucreaz creatorii). Relaia are cardinalitatea minim 1:1 i cardinalitatea maxim 1:n. CREATOR_creeaza_VESTIMENTATIE = relaie dintre entitile CREATOR i VESTIMENTATIE (ce creatori realizeaz vestimentaiile). Relaia are cardinalitatea minim 1:0 i cardinalitatea maxim1:n.

Modelarea entitate-relaie

65

VESTIMENTATIE_are_ACCESORIU = relaie dintre entitile ACCESORIU i VESTIMENTATIE (ce accesorii au vestimentaiile). Relaia are cardinalitatea minim 1:0 i cardinalitatea maxim 1:n. MODEL_prezint_VESTIMENTATIE = relaie ce leag entitile MODEL i VESTIMENTATIE (ce vestimentaii au fost purtate de modele). Relaia are cardinalitatea minim 1:1 i cardinalitatea maxim 1:n. CREATOR_face_ACCESORIU = relaie ce leag entitile CREATOR i ACCESORIU (ce creatori au realizat accesoriile). Relaia are cardinalitatea minim 1:0 i cardinalitatea maxim 1:n. PREZENTARE_prezinta_VESTIMENTATIE = relaie care leag entitile PREZENTARE i VESTIMENTATIE (ce vestimentaii au fost prezentate la evenimentele de mod). Relaia are cardinalitatea minim 1:1 i cardinalitatea maxim 1:n. PREZENTARE_are_LOCATIE = relaie ce leag entitile PREZENTARE i LOCATIE (ce prezentri de mod se desfoar ntr-o locaie). Deoarece ntr-o locaie pot s fie mai multe prezentri, relaia are cardinalitatea minim 1:1 i cardinalitatea maxim n:1. MODEL_lucreaza_AGENTIE = relaie dintre entitile MODEL i AGENTIE (la ce agenie este angajat un model). Relaia are cardinalitatea minim 1:1 i cardinalitatea maxim n:1. MODEL_are_ISTORIC = relaie dintre entitile MODEL i ISTORIC (istoricul activitii unui model, prin diferite agentii). Relaia are cardinaliatea minim 1:0 i cardinalitatea maxim 1:n. ISTORIC_refera_AGENTIE = relaie ce leag entitile ISTORIC i AGENTIE (la ce agenie se refer fiecare nregistrare din istoricul unui model). Relaia are cardinalitatea minim 1:1 i cardinalitatea maxim 1:n. SPONSOR_finanteaza_PREZENTARE = relaie de tip many-to-many dintre entitile SPONSOR i PREZENTARE, reflectnd legtura dintre acestea (ce sponsori finaneaz prezentrile de mod). Relaia are cardinalitatea minim 0:1 i cardinalitatea maxim m:n. PERS_CONTACT_are_LOCALIZARE = relaie ce leag entitile LOCALIZARE i PERS_CONTACT (localizarea unei persoane de contact). innd cont de restriciile impuse modelului, relaia are cardinalitatea minim 1:1 i cea maxim 1:1. O astfel de relaie este definit i pentru entitile FIRMA_PUB, FIRMA_SEC, PREZENTARE, ORGANIZATOR, CASA_MODA, SPONSOR, ANGAJAT_TEMP, SOC_ASIG, CREATOR, LOCATIE i AGENTIE, care sunt legate de entitatea LOCALIZARE, permind astfel localizarea tuturor structurilor modelului. PERS_CONTACT_are_INFO_CONTACT = relaie care leag INFO_CONTACT i PERS_CONTACT (modalitatea de accesare a unei persoane de contact). innd cont de restriciile impuse modelului, relaia are cardinalitatea minim 1:1 i cea maxim 1:1. O astfel de relaie este definit i

66

PROIECTAREA BAZELOR DE DATE

pentru entitile FIRMA_PUB, FIRMA_SEC, ORGANIZATOR, CASA_MODA, SPONSOR, ANGAJAT_TEMP, SOC_ASIG, CREATOR, LOCATIE i AGENTIE, care sunt legate de entitatea INFO_CONTACT, permind astfel accesarea tuturor structurilor modelului. ANGAJAT_TEMP_primeste_la_PREZENTARE_de_la_CASA_MODA = relaie de tip 3 ce leag entitile ANGAJAT_TEMP, PREZENTARE i CASA_MODA, reflectnd cine a fost angajat temporar, de ce cas de mod, pentru ce prezentare. Denumirea acestei relaii va fi primeste. Atribut Atributul este o proprietate descriptiv a unei entiti sau a unei relaii. De exemplu, numele unei case de mod este un atribut al entitii CASA_MODA, iar data la care o cas de mod particip la o prezentare este un atribut al relaiei particip ce leag entitile PREZENTARE i CASA_MODA. Atributele pot fi simple (de exemplu, suma cu care este pltit un model de ctre o cas de mod pentru o prezentare), compuse (de exemplu, adresa unei firme de publicitate), cu valori multiple (de exemplu, numerele de telefon ale unei persoane de contact), derivate (de exemplu, vrsta unei persoane se obine din data naterii). Observaii Trebuie fcut distincia ntre atribut care uzual devine coloan n modelele relaionale i valoarea acestuia, care devine valoare n coloane. Atributele sunt substantive, dar nu orice substantiv este atribut. Fiecrui atribut trebuie s i se dea o descriere complet n specificaiile modelului (exemple, contraexemple, caracteristici). Pentru fiecare atribut trebuie specificat numele, tipul fizic (integer, float, char etc.), valori posibile, valori implicite, reguli de validare, constrngeri, tipuri compuse. n continuare vor fi prezentate, parial, atributele entitilor i relaiilor dnd o descriere a fiecruia, a caracteristicilor i a constrngerilor pe care trebuie s le ndeplineasc. Semnificaia unor atribute a cror denumire nu este semnificativ sau care include mai multe caracteristici dect denumirea va fi comentat pe parcursul lucrrii. Entitatea independent ANGAJAT_TEMP are ca atribute: cod_angajat_temp = variabil de tip ntreg, de lungime maxim 5, care reprezint codul unui angajat temporar. nume = variabil de tip caracter, de lungime maxim 25, care reprezint numele angajatului. prenume = variabil de tip caracter, de lungime maxim 25, care reprezint prenumele angajatului. data_nastere = variabil de tip dat calendaristic, care reprezint data naterii angajatului respectiv. sex = variabil de tip caracter, lund valorile m sau f, de lungime 1, care reprezint sexul angajatului.

Modelarea entitate-relaie

67

nationalitate = variabil de tip caracter, de lungime maxim 12, care reprezint naionalitatea unui angajat temporar. cod_localizare = variabil de tip ntreg, de lungime maxim 5, care reprezint codul localizrii angajatului. Atributul trebuie s corespund la o valoare a cheii primare din tabelul LOCALIZARE. cod_info_acces = variabil de tip caracter, de lungime maxim 5, care reprezint codul informaiei de acces pentru angajatul respectiv. Atributul trebuie s corespund la o valoare a cheii primare din tabelul INFO_CONTACT. tip = variabil de tip caracter, de lungime 10, care reprezint funcia pentru care a fost angajat persoana respectiv. De exemplu, poate s fie model, stilist sau eventual poate lua alte valori. Subentitatea MODEL are ca atribute: cod_angajat_temp = variabil de tip ntreg, de lungime maxim 5, care reprezint codul modelului. cod_agentie = variabil de tip ntreg, de lungime maxim 5, care reprezint codul ageniei la care este angajat n prezent modelul. Atributul trebuie s corespund la o valoare a cheii primare din tabelul AGENTIE. inaltime = variabil de tip numeric, de lungime 3, care reprezint nlimea modelului n centimetri. nr_pantof = variabil de tip numeric (real), care reprezint numrul pe care l poart la pantof modelul respectiv. info = variabil de tip text, care include informaii speciale despre model (dimensiuni, greutate, preferine, elemente confideniale, palmares etc.). Entitatea PUBLICITATE are atributele: cod_publicitate, cod_firma_pub, cod_prezentare, tip, nume, suma, observatii. Atributul tip poate lua valorile radio, televiziune, presa, panouri publicitare etc. Atributul nume este legat de atributul tip n sensul c poate reprezenta numele postului de radio, al celui de televiziune, al publicaiei care face publicitatea. Entitatea FIRMA_PUB are atributele: cod_firma_pub, nume, info, director, observatii, nume_pers_contact, cod_localizare, cod_info_acces. Entitatea ORGANIZATOR are atributele: cod_organizator, denumire, banca, cont, informatii, cod_localizare, cod_info_acces. Entitatea PERS_CONTACT are atributele: cod_pers_contact, cod_organizator, nume, prenume, directie, cod_localizare, cod_info_acces. Entitatea PREZENTARE are atributele: cod_prezentare, denumire, data_start, data_final, cod_organizator, cod_soc_asig, cod_locatie. Entitatea SPONSOR are atributele: cod_sponsor, tip, nume, info, cod_localizare, cod_info_acces. Atributul tip poate lua valorile persoana fizic sau persoana juridic. n primul caz, atributul nume va reprezenta numele i prenumele persoanei fizice, iar n cel de al doilea caz, va reprezenta numele societii.

68

PROIECTAREA BAZELOR DE DATE

Entitatea CASA_MODA are atributele: cod_casa_moda, nume, cifra_afaceri, proprietar, director, istoric, data_creare, cod_localizare, cod_info_acces. Entitatea CREATOR are atributele: cod_creator, nume, prenume, data_nastere, data_angajare, cod_casa_moda, tip, mod_angajare, info, cod_localizare, cod_info_acces. Atributul tip poate lua valorile designer, croitor, broder, creator_accesorii. Atributul mod_angajare poate lua valorile permanent sau special. Entitatea VESTIMENTATIE are atributele: cod_vestimentatie, denumire, valoare, descriere, cod_creator, cod_model, cod_prezentare. Entitatea ACCESORIU are atributele: cod_vestimentatie, cod_accesoriu, tip, descriere, valoare, cod creator. Entitatea AGENTIE are atributele: cod_agentie, nume, data_creare, director, cifra_afaceri, info, cod_localizare, cod_info_acces. Entitatea ISTORIC are atributele: cod_model, data_angajare, data_final, cod_agentie, conditii. Entitatea LOCALIZARE are atributele: cod_localizare, adresa, cod_postal, oras, tara. Entitatea LOCATIE are atributele: cod_locatie, denumire, tip, capacitate, cod_localizare, cod_info_acces. Atributul tip reprezint tipul locaiei respective i poate lua valorile: hotel, esplanad, teatru, mall etc. Entitatea INFO_CONTACT are atributele: cod_info_contact, telefon_mobil, mail, telefon_fix, fax. Entitatea FIRMA_SEC are atributele: cod_firma_sec, nume_firma, tip_servicii, director, observatii, cod_localizare, cod_info_acces. Entitatea ANGAJAT_SEC are atributele cod_angajat, nume, prenume, data_nastere, specializare, nivel, observatii, cod_localizare, cod_firma_sec, cod_info_acces. Entitatea SOC_ASIG are atributele: cod_soc_asig, conditii, suma, director, observatii, nume_pers_contact_firma, cod_localizare, cod_info_acces. Relaia CASA_MODA_participa_PREZENTARE are ca atribute: cod_prezentare = variabil de tip ntreg, de lungime maxim 5, care reprezint codul prezentrii. Atributul trebuie s corespund la o valoare a cheii primare din tabelul PREZENTARE. cod_casa_moda = variabil de tip ntreg, de lungime maxim 5, care reprezint codul casei de mod. Atributul trebuie s corespund la o valoare a cheii primare din tabelul CASA_MODA. tip = variabil de tip caracter, de lungime maxim 15, care reprezint modalitatea n care o cas de mod particip la o prezentare, n sensul c poate fi organizator sau neorganizator.

Modelarea entitate-relaie

69

data = variabil de tip dat calendaristic reprezentnd ziua n care defileaz modelele casei de mod. Atributul nu este multiplu, deoarece s-a presupus c defilarea unei case de mod are loc ntr-o singur zi. Relaia SPONSOR_finanteaza_PREZENTARE are ca atribute: cod_sponsor, cod_prezentare, data_emitere, suma, banca, cont_emitent, cod_ordin_plata. Relaia ANGAJAT_SEC_paza_PREZENTARE are atributele: cod_angajat, cod_prezentare, tip_paza, dotare, observaii. Relaia ANGAJAT_TEMP_primeste_la_PREZENTARE_de_la_CASA_MODA are ca atribute: cod_angajat_temp, cod_casa_moda, cod_prezentare suma, data_achitare, cont, banca. Nu s-au introdus atributele cont i banca la entitatea ANGAJAT_TEMP, deoarece modelul de date nu-i propune s furnizeze informaii complete referitoare la toate conturile i bncile modelelor, stilitilor etc. Se consider doar banca i contul n care casa de mod depune bani pentru prezentarea la care acetia au fost angajai. 2.3. Diagrama entitate- relaie Pentru proiectarea diagramei entitate-relaie au fost stabilite anumite reguli (care nu sunt unice): entitile sunt reprezentate prin dreptunghiuri; relaiile dintre entiti sunt reprezentate prin arce neorientate; atributele care reprezint chei primare trebuie subliniate sau marcate prin simbolul #, plasat la sfritul numelui acestor atribute; cardinalitatea minim este indicat n paranteze, iar cardinalitatea maxim se scrie fr paranteze; nu este necesar s fie specificate, n cadrul diagramei, toate atributele. Vom comenta cteva cazuri speciale de entiti, relaii, atribute i modul lor de reprezentare n cadrul diagramei entitate-relaie. Dependena. Exist entiti, numite entiti dependente care nu pot exista n mod independent. De exemplu, se observ c entitatea ACCESORIU depinde de VESTIMENTATIE, iar LOCATIE depinde de entitatea PREZENTARE. Cheia primar a unei entiti dependente include cheia primar a sursei (cod_vestimentatie) i cel puin o descriere a entitii (cod_accesoriu). Entitatea dependent se deseneaz prin dreptunghiuri cu linii mai subiri. Motenirea atributelor. O subentitate (subclas) este o submulime a unei alte entiti, numit superentitate (superclas). De exemplu, ANGAJAT_TEMP este o superentitate pentru MODEL, iar MODEL este o subentitate pentru ANGAJAT_TEMP. Subentitatea se deseneaz prin dreptunghiuri incluse n superentitate. Exist o relaie

70

PROIECTAREA BAZELOR DE DATE

ntre o subentitate i o superentitate, numit ISA, care are cardinalitatea maxim 1:1 i minim 1:0. Cheile primare, atributele i relaiile unei superentiti sunt valabile pentru orice subentitate. Afirmaia reciproc este fals. De exemplu, un informatician, considerat ca subentitate a entitii PERS_CONTACT, poate avea ca atribute limbajele de programare cunoscute i nivelul de cunoatere a acestora, dar aceste atribute nu sunt semnificative pentru o persoan de contact care coordoneaz asigurarea securitii prezentrii de mod. Cheia primar a subentitii INFORMATICIAN este cod_pers_contact, care este cheia primar a superentitii PERS_CONTACT. Specializare. Dup valorile unor atribute clasificatoare se pot determina clase. Un grup de subentiti reciproc exclusive definete o clas. Clasele se aliniaz n desen vertical. De exemplu, pentru entitatea PUBLICITATE, dup valorile atributului tip, pot fi definite subentitile PANOURI_PUBLICITARE, PRESA, TELEVIZIUNE, RADIO, fiecare avnd atributele sale proprii. Generalizare. Din entiti similare care au mai multe atribute comune se pot crea superentiti. Aceste superentiti conin atributele comune, iar atributele speciale sunt asignate la subentiti. Pentru noile superentiti se introduc chei primare artificiale. De exemplu, din entitile FIRMA_PUB, FIRMA_SEC i SOC_ASIG se poate crea superentitatea FIRMA avnd drept atribute: cod_firma (cheie primar artificial), informaii de accesare, informaii de localizare, director, observatii. ntr-o diagram E/R se pot defini relaii recursive. De exemplu, poate fi definit relaia PERS_CONTACT_supervizeaza_PERS_CONTACT. Unele relaii sunt relative la dou entiti i le numim de tip 2, iar dac relaiile implic mai mult de dou entiti, le vom numi de tip 3. Trei relaii de tip 2 sunt diferite de o relaie de tip 3. Rupnd o relaie de tip 3 n trei relaii de tip 2, poate s apar informaie incorect. Trebuie excluse din model relaiile indirecte pentru c ele pot conduce la redundan n baza de date. Atributele derivabile trebuie eliminate i introduse expresii prin care aceste atribute pot fi calculate. Uneori apare o incertitudine referitoare la faptul c o anumit informaie poate fi considerat o relaie sau un atribut. O relaie poate fi reprezentat ca un atribut, sau putem folosi relaii n loc de atribute. Dac un atribut al unei entiti reprezint cheia primar a unei alte entiti, atunci el refer o relaie. Uneori este greu de stabilit dac informaia analizat reprezint o entitate sau o relaie. Dac exist o incertitudine, se cerceteaz cheia primar. Dac aceast cheie combin cheile primare a dou entiti, atunci se definete o relaie. Cheia primar a relaiei organizeaza

Modelarea entitate-relaie

71

combin atributele cod_organizator i cod_prezentare, care reprezint cheile primare ale entitilor ORGANIZATOR i PREZENTARE. Prin urmare, ORGANIZATOR_organizeaza_PREZENTARE va defini o relaie i nu o entitate. Un atribut indirect este inoportun. El nu descrie real relaia sau entitatea. Prin urmare, atributele indirecte trebuie reasignate. De fapt, un atribut indirect este un caz special de relaie indirect care trebuie eliminat pentru c introduce redundan n date. Exist atribute opionale, a cror valoare este uneori necunoscut, alteori neaplicabil. Aceste atribute trebuie introduse la subentiti. Algoritmul pentru proiectarea diagramei E/R cuprinde urmtoarele etape: 1. identificarea entitilor din cadrul sistemului analizat; 2. identificarea relaiilor (asocierilor) dintre entiti i stabilirea cardinalitii; 3. identificarea atributelor aferente entitilor i asocierilor dintre entiti; 4. stabilirea atributelor de identificare a entitilor, adic stabilirea cheilor. Relaiile reflect legturi naturale care exist ntre componentele sistemului. Aceeai realitate poate fi ns perceput diferit de ctre diveri analiti pentru un acelai sistem, putnd fi obinute modele structurale distincte. O diagram E/R pentru modelul comentat n aceast seciune este reprezentat n figura 2.1. Diagrama este corect, dar este optimizabil. Construirea diagramei conceptuale, obinerea schemelor relaionale i normalizarea acestora vor genera un model relaional care va elimina anumite clase de anomalii ce pot s apar n proiectarea modelului de date. Deficiene ale modelului E/R n proiectarea unui model de date pot aprea diverse probleme datorit unei interpretri eronate a sensului unei relaii. Aceste probleme sunt denumite capcane de conectare. Unele dintre aceste capcane pot s nu fie semnificative pentru modelul particular considerat, n timp ce altele cer restructurarea modelului. Exist dou clase importante de capcane: de ntrerupere i n evantai. O capcan de ntrerupere poate s apar acolo unde modelul sugereaz existena unei relaii ntre entiti, dar nu exist o cale ntre anumite apariii ale entitilor. Aceast capcan poate s apar acolo unde exist o relaie cu participare parial (0 la cardinalitatea minim), care face parte din calea dintre entitile ce sunt legate. O capcan n evantai poate s apar acolo unde modelul ia n considerare o relaie ntre entiti, dar calea dintre anumite apariii ale entitilor este ambigu. Aceste capcane apar cnd dou sau mai multe relaii one_to_many provin din aceeai entitate.

72

PROIECTAREA BAZELOR DE DATE

FIRMA_PUB 1 face M(1) M(1) PUBLICITATE

INFO_CONTACT 1 are 1 are M(1) PERS_CONTACT ORGANIZATOR 1 1 M(1) are 1 organizeaza LOCALIZARE se_face

LOCATIE 1 are are M(1) M(1) M(1) M(1) paza M(1) 1 M(1) finanteaza M(0) ANGAJAT SEC PREZENTARE SPONSOR M(1) 1 M(1) SOC ASIG 1 asigura participa

FIRMA SEC 1

M(1) CASA_MODA prezinta 1 lucreaza M(1) 1 CREATOR 1

primeste

ANGAJAT_TEMP MODEL 1(0) ISA M(1) 1 1 lucreaza_la M(1) are 1 AGENTIE 1 refera M(0) ISTORIC M(1) 1

creeaza prezinta face M(1) M(0) VESTIMENTATIE 1 are M(0) M(0) ACCESORIU

Fig. 2.1. Diagrama E/R. Practic, aceste capcane genereaz situaiile n care, aa cum a fost proiectat modelul de date, el nu poate s rspund la anumite interogri. De exemplu, pentru a afla pentru ce prezentare de mod a fost creat o anumit vestimentaie, a fost necesar introducerea unei legturi ntre entitile PREZENTARE i VESTIMENTATIE, care ns a generat redundan n modelul de date. Modelul E/R extins Conceptele de baz ale modelrii entitate-relaie nu sunt suficiente pentru a reprezenta cerinele aplicaiilor actuale, care sunt mult mai complexe. Au fost propuse, n acest sens, mai multe modele de date semantice. Modelul E/R susinut cu concepte semantice adiionale definete modelul E/R extins (EER).

Modelarea entitate-relaie

73

Acesta include toate conceptele modelului original, mpreun cu conceptele adiionale de specializare, generalizare i categorie. Aceste noi concepte au fost deja nominalizate n acest capitol. Superclasa (superentitatea) este o entitate care include subclase (subentiti) distincte, ce trebuie reprezentate n modelul de date. Subclasa are un rol distinct i, evident, este membr a unei superclase. O subclas, fiind o entitate, poate s posede propriile subclase. O entitate mpreun cu subclasele ei, subclasele acestora i aa mai departe definete o ierarhie de tip (ierarhie de specializare). De exemplu, ANGAJAT_TEMP reprezint o superclas pentru entitatea MODEL. Specializarea este procesul de maximizare a diferenelor dintre membrii unei entiti, prin identificarea caracteristicilor distinctive ale acestora. Specializarea constituie o abordare de sus n jos n definirea unei mulimi de superclase i a subclaselor lor. Pot exista diverse specializri ale aceleiai entiti, bazate pe diferite caracteristici de difereniere. Dac subclasele unei specializri sunt disjuncte, atunci o entitate poate fi membr doar a unei subclase a acesteia (constrngere de disjuncie). O specializare cu participare total specific faptul c fiecare entitate din superclas trebuie s fie membr a unei subclase din specializare (constrngere de participare). De exemplu, specializarea contractelor de angajare poate fi cu participare total dac fiecare angajat din PERS_CONTACT este fie angajat cu contract permanent cu norm ntreag, fie cu contract temporar cu norm incomplet. O specializare cu participare parial specific faptul c nu este necesar ca o entitate s aparin vreunei subclase a acesteia. De exemplu, exist salariai n PERS_CONTACT care nu aparin niciunei subentiti ale acesteia. Generalizarea este procesul de minimizare a diferenelor dintre entiti, prin identificarea caracteristicilor comune ale acestora. Generalizarea reprezint o abordare de jos n sus, care are ca rezultat identificarea unei superclase generalizate din subclasele iniiale. Orice relaie superclas/subclas (inclusiv cele ale unei subclase partajate) dintr-o ierarhie de specializare/generalizare are o singur superclas. Totui, anumite situaii necesit modelarea unei relaii superclas/subclas cu mai mult dect o superclas distinct. n acest caz, subclasa definete o categorie. Categoria este procesul de modelare a unei singure subclase, cu o relaie care implic mai mult dect o singur superclas distinct.

2.4. Modelare orientat pe obiecte cu UML Un limbaj de modelare reprezint o modalitate de a comunica despre un sistem i de a exprima diversele modele produse n cadrul procesului de analiz i dezvoltare a sistemului. Limbajul furnizeaz o notaie care permite reprezentarea unui design.

74

PROIECTAREA BAZELOR DE DATE

Limbajul este format dintr-un set de concepte, principii i reguli de utilizare a acestora, cu scopul de a reprezenta modelele produse n diferite etape de dezvoltare a sistemului. Fr un limbaj de modelare, este dificil colaborarea i comunicarea dintre membrii echipei pe parcursul proiectrii sistemului. Ca orice limbaj, un limbaj de modelare are o sintax i o semantic, iar pentru semantica modelului trebuie aleas sintaxa cea mai expresiv. De cele mai multe ori, un limbaj de modelare este un limbaj grafic (diagramatic). Dac pentru utilizatori, limbajele de modelare uureaz munca de realizare a sistemelor software, pentru realizatorii acestora sarcinile sunt multiple i dificile. Pentru ca un limbaj de modelare s se impun, el trebuie s asigure o bun specificare a conceptelor sale i a modului de reprezentare a acestora. n acest scop, limbajele trebuie s asigure suport pentru modelatori, n vederea rafinrii treptate a soluiei i a captrii semanticii procesului. The Unified Modeling Language (UML) este, aa cum semnific i numele, un limbaj vizual de modelare i de comunicare despre sistem. UML nu este un limbaj de programare, deoarece nu dispune de ntreg sprijinul semantic i vizual pentru a defini un astfel de limbaj. nlocui limbajele de programare. UML este un limbaj pentru modelarea orientat pe obiecte, cu suport pentru modelare vizual, funcionnd ca o modalitate de a comunica i de a exprima cunotine. UML este un limbaj grafic de modelare pentru specificarea, vizualizarea, construcia i documentarea componentelor unui sistem software (pentru ntreprinderi, telecomunicaii, sisteme bancare i financiare, transporturi etc.) sau pentru modelarea organizaional a unor sisteme non-software (din justiie, medicin, afaceri etc.). UML nu este un limbaj de programare, dar modelele exprimate n UML pot fi implementate uor n limbaje de programare orientate pe obiecte (C++, Java, C#) sau n baze de date relaionale. Este posibil nu numai generarea codului dintr-un model UML, dar i ingineria invers, constnd n construirea dintr-un cod dat a unui model UML. UML este un limbaj de modelare pentru documentare, deoarece permite realizarea tuturor documentelor necesare nelegerii modelului i diagramelor utilizate pe tot parcursul ciclului de via al unui proces de realizare a unui sistem. Documentele componentelor sistemului conin specificarea cerinelor, arhitecturii i proiectrii sistemului; elaborarea codului surs, planuri de dezvoltare i de management al proiectului. n concluzie, UML nu este un limbaj de programare vizual, dar este un model de limbaj de modelare vizual; nu este o metodologie, dar este o notaie pentru aceasta; nu este un proces, dar ofer suport complet pentru construcia i dezvoltarea acestuia. Este important de menionat c UML este un limbaj de modelare, i nu o metod. Majoritatea metodelor conin att un limbaj de modelare, ct i un proces. Limbajul de modelare furnizeaz, dup cum am mai subliniat, doar notaia pentru reprezentarea unui design. Procesul cuprinde, ns, paii care trebuie s fie urmai pentru a realiza un design.

Modelarea entitate-relaie

75

UML cuprinde tehnici specifice mai multor metode de dezvoltare (proiectare) i este suficient de logic, de expresiv pentru a putea fi utilizat mpreun cu orice metod sau proces de dezvoltare. Ca orice limbaj, UML are sintaxa i semantica sa. Cu ajutorul alfabetului i al cuvintelor limbajului, se pot scrie propoziii (fragmente din diagrame) despre subiectul de analizat. Propoziiile se pot grupa n paragrafe (diagrame UML). Paragrafele, la rndul lor, se pot grupa n seciuni (moduri de vizualizare) i, n final, seciunile se pot organiza n documente. Documentele UML sunt modelele sistemului. Sintaxa limbajului UML implic diagrame, n timp ce semantica lui se bazeaz pe paradigma orientrii pe obiecte. Din punct de vedere al modelrii orientate pe obiecte, entitile (conceptele) se numesc clase, iar relaiile dintre ele se numesc asocieri. Diagrama este o reprezentare grafic a unei mulimi de elemente, de obicei folosindu-se forme geometrice pentru a reprezenta entiti i linii pentru a reprezenta asocieri. n UML, diagrama este o proiecie a sistemului, reprezentnd o parte a sistemului sau chiar ntregul sistem dintr-un anumit punct de vedere. Acelai element poate aprea n toate diagramele, n cteva diagrame sau n nicio diagram. UML conine 9 tipuri de diagrame, fiecare reflectnd una sau mai multe dintre cele 5 tipuri de vizualizri posibile asupra unui sistem software. Diagrama claselor descrie structura unui sistem n general. n componena ei intr clase, stereotipuri i relaiile dintre acestea. Diagrama obiectelor descrie structura unui sistem la un anumit moment. Acest tip de diagram este o variant a diagramei claselor care, n locul unei clase, prezint mai multe instane ale ei, fiind format din obiecte i legturi dintre ele. Diagrama cazurilor de utilizare descrie funcionalitatea unui sistem, prezentnd actorii externi, cazurile de utilizare identificate numai din punct de vedere al actorilor (comportamentul sistemului, aa cum este perceput de utilizatorii lui), precum i relaiile dintre actori i cazurile de utilizare. Un actor poate fi orice sau oricine interacioneaz cu sistemul (trimite sau recepioneaz mesaje de la sistem sau schimb informaii cu acesta). Actorul are un rol n cadrul unui sistem, nu este un utilizator individual al acestuia i, din acest motiv, el este o entitate (o clas), nu o instan. Un caz de utilizare este iniiat mereu de un actor i furnizeaz o valoare actorului. Diagrama componentelor (diagrama de implementare) descrie structura fizic a codului n termenii componentelor de cod i relaiilor dintre acestea. Diagrama de desfurare (de exploatare) indic arhitectura fizic pe care este implementat sistemul, calculatoarele, nodurile sistemului i conexiunile dintre ele.

76

PROIECTAREA BAZELOR DE DATE

Diagrama secvenelor este o diagram de interaciune, care prezint colaborarea dinamic dintre un numr de obiecte, punnd accentul pe secvenele de mesaje trimise ntre acestea pe msura scurgerii timpului. Diagrama de colaborare este tot o diagram de interaciune, dar care, pe lng interaciunea dintre obiecte (schimbul de mesaje), prezint obiectele i legturile dintre ele. Diagrama de stare descrie ciclul de via al unui element (al obiectelor, subsistemelor i sistemelor), prin specificarea strilor n care se gsete elementul i a evenimentelor care i modific starea. Diagrama de activitate prezint activitile i responsabilitile elementelor sistemului, fiind utilizat pentru modelarea funciilor sistemului. Ea are ca elemente constitutive stri de aciune i mesaje care vor fi trimise sau recepionate ca parte a aciunii realizate. n UML, diagramele fac parte din dou categorii. Diagrame dinamice sau comportamentale descriu comportamentul i interaciunile dintre diverse entiti ale sistemului informatic. Din aceast categorie, fac parte diagramele de secven, colaborare, stare i activitate. Diagrame statice sau structurale - descriu structura, responsabilitile sistemului informatic, componentele executabile ale sistemului, locaiile fizice de execuie i nodurile de stocare a datelor. Din aceast categorie, fac parte diagramele claselor, obiectelor, cazurilor de utilizare, componentelor i diagramele de exploatare. Pe lng structura static i comportamentul dinamic, pentru caracterizarea complet a unui sistem este necesar i funcionalitatea acestuia, care poate fi analizat folosind diagramele cazurilor de utilizare. Din punct de vedere al modelrii sistemelor orientate pe obiecte din perspectiva UML, aspectele statice sunt: clasele i relaiile dintre clase, interfeele, topologia hardware necesar execuiei aplicaiei. Seciunile UML sau modurile de vizualizare sunt grupuri de diagrame care se adreseaz unei anumite mulimi de entiti. Toate diagramele UML pot fi organizate n vizualizri. Fiecare vizualizare este descris folosind un numr de diagrame ce conin informaii referitoare la un anumit aspect particular al sistemului. Exist 5 tipuri importante de vizualizri asupra unui sistem software. Modul de vizualizare structural (logic) al arhitecturii unui sistem se refer la cerinele funcionale ale acestuia, adic prezint serviciile furnizate de sistem utilizatorilor si. Vizualizarea logic trateaz din interior sistemul i descrie att structura intern a acestuia, format din clase, obiecte i relaii, ct i colaborrile, legturile care apar n urma schimbului de mesaje ntre obiecte, pentru a realiza funcionalitatea dorit. Notaia UML este dedicat, n mare parte, reprezentrii

Modelarea entitate-relaie

77

arhitecturii logice (clase, asocieri, obiecte, legturi, generalizri, polimorfism, pachete etc.) Modul de vizualizare a componentelor sistemului (implementare) se concentreaz pe descrierea componentelor care implementeaz sistemul, dependenele care exist ntre ele, resursele alocate acestora, precum i rezolvarea unor probleme legate de reutilizarea, portabilitatea codului i informaii administrative. Modul de vizualizare a cazurilor de utilizare surprinde funcionalitatea sistemului, aa cum este ea perceput de actorii externi care interacioneaz cu sistemul, precum i de utilizatorii acestuia, de diferii membri ai echipei realizatoare sau de ctre alte sisteme. n componena acestui mod intr diagramele cazurilor de utilizare pentru descrierea static a aspectului funcional i ocazional. Se pot folosi i diagrame de activitate pentru a ncapsula latura dinamic a funcionalitii. Modul de vizualizare comportamental este util pentru gestionarea eficient a resurselor, pentru execuii paralele i tratri asincrone ale unor evenimente din sistem, precum i pentru rezolvarea unor probleme legate de comunicare i sincronizare. Modul de vizualizare a desfurrii (mediu) se refer la desfurarea fizic a sistemului, indicnd ce calculatoare i ce tipuri de noduri vor fi folosite pentru implementarea sistemului, cum sunt acestea conectate, precum i ce procese se vor executa n fiecare nod.

UML ofer, pe lng elementele de baz, i unele faciliti care permit organizarea i extinderea diagramelor. Aceste faciliti pot fi simple notaii sau pot fi elemente de extindere a limbajului UML. Dintre facilitile cele mai importante se remarc pachetele, notele, stereotipurile i proprietile. Pachetul reprezint un mecanism de grupare a elementelor de modelare. n UML, un pachet definete un mecanism de organizare a elementelor n grupuri legate semantic. Nota cuprinde ipotezele i deciziile aplicate n timpul analizei i al proiectrii. Notele sunt corespondentul comentariilor din limbajele de programare. Stereotipul este un concept introdus n UML, care permite extinderea elementelor de baz pentru a crea noi elemente. Un stereotip reprezint un neles specific asociat unui element. Proprietatea este un element de extindere UML, care lrgete proprietile i semantica unui element UML. Modelarea unui sistem privete modelarea aspectelor sale funcionale, statice i dinamice. Pentru ca un sistem s aib succes, n primul rnd trebuie ca cerinele sistemului s fie exprimate ntr-o manier care s permit o uoar nelegere, indiferent de nivelul de pregtire informatic a celor implicai n

78

PROIECTAREA BAZELOR DE DATE

proiect, iar n al doilea rnd trebuie ca membrii echipei de dezvoltare s poat asimila cu uurin modificrile care apar pe parcurs n cerine. Aceste condiii sunt rezolvate n diagrama cazurilor de utilizare, care are rolul de a reprezenta n form grafic funcionalitile pe care trebuie s le ndeplineasc sistemul n faza sa final. Pentru crearea modelului cazurilor de utilizare, trebuie identificai actorii, cazurile de utilizare, relaiile dintre actori i relaiile dintre cazurile de utilizare. Realizarea acestor faze presupune discuii ntre utilizatori i analitii de sistem. Cazul de utilizare poate fi privit ca un instrument de stimulare a posibililor utilizatori n exprimarea propriilor puncte de vedere. Adeseori, utilizatorii tiu mai multe dect pot s explice i nu le este uor s se pronune clar cum vor folosi sistemul. Cazurile de utilizare ajut la ndeprtarea acestui impediment. Discuiile iniiale trebuie s duc la descoperirea actorilor i a cazurilor de utilizare care descriu cerinele funcionale n termeni generali i care pot stabili frontierele domeniului studiat. Urmtoarele discuii au ca scop nelegerea, n detaliu, a domeniului studiat, ceea ce duce la evitarea introducerii unor cazuri de utilizare, care ar ngreuna procesul de analiz. Un caz de utilizare este o descriere a unei funcionaliti pe care o ofer sistemul, o colecie de scenarii referitoare la utilizarea unui sistem. Un scenariu descrie o succesiune de evenimente introduse de un actor, care poate fi o persoan, un dispozitiv hardware sau chiar trecerea timpului. Deci, actorii sunt entitile care iniiaz o secven de evenimente (un scenariu). Rezultatul secvenei de evenimente trebuie s fie concretizat n ceva utilizabil de ctre actorul ce a iniiat secvena sau de ctre alt actor. Diagrama cazurilor de utilizare are ca elemente de modelare actorii, cazurile de utilizare, relaiile dintre cazurile de utilizare. Detaliile despre fiecare caz de utilizare pot fi date n documente text sau pot fi folosite tehnici noi, de modelare dinamic, de exemplu diagramele de activitate sau diagramele de interaciune, pentru a specifica secvenele de pai ale cazului de utilizare. Construirea unei diagrame a cazurilor de utilizare are drept obiective: s capteze i s descrie cerinele funcionale ale sistemului, cerine rezultate n urma discuiilor purtate de clieni i/sau utilizatori ai sistemului cu dezvoltatorii acestuia; s ofere o descriere clar i consistent a ceea ce va trebui s fac sistemul, adic folosirea modelului pentru comunicarea cerinelor tuturor persoanelor implicate n construirea sistemului, i s constituie un punct de plecare pentru alte activiti (design, testare i implementare); s constituie o baz pentru realizarea textelor de verificare, ce decid dac funcionalitatea final concord cu cerinele iniiale ale sistemului;

Modelarea entitate-relaie

79

s permit transformarea cerinelor funcionale n viitoare clase i operaii. Diagramele UML pot fi desenate i administrate utiliznd un utilitar CASE (Computer Edit Software Engineering). Aceste utilitare sunt deosebit de utile n cazul unor diagrame complexe. Totui, dac diagrama este prea complicat, atunci este necesar partiionarea ei n mai multe diagrame sau reprezentarea la un nivel superior de abstractizare. Exemple de utilitare CASE care permit realizarea diagramelor UML sunt reprezentate de: Microsoft Office Visio, IBM Rational Rose Professional Data Modeler, Altova UModel, Borland Together, Visual Paradigm for UML, ArgoUML etc. Interesul pentru suportul modelrii bazelor de date cu ajutorul UML a condus la crearea unor profile specifice. Un profil constituie o propunere a unei comuniti i regrupeaz o mulime de elemente UML care se aplic unui context particular i care conserv metamodelul UML. IBM Rational Rose include un astfel de profil adaptat bazelor de date. Exist o diferen ntre un model (de exemplu, modelul conceptual de date) i un formalism (n care este descris un model). Astfel, putem vorbi despre modelarea conceptual a datelor urmnd formalismul entitate-relaie sau formalismul UML. Notaia exprim doar aspectul referitor la reprezentare. Pe lng formalismul entitate-relaie, considerat standardul de facto pentru modelarea datelor, o opiune alternativ este oferit de ctre UML. Acesta include primitive pentru modelarea datelor, iniial concepute pentru reprezentarea structurii claselor unei aplicaii orientate obiect, dar care pot fi folosite pentru specificarea modelului de date al domeniului unei aplicaii. n particular, diagramele de clase UML pot fi utilizate ca alternativ la diagramele entitate-relaie. Diferena major dintre o diagram de clase UML i o diagram entitaterelaie este reprezentat de diferena dintre o clas i o entitate: o clas este o generalizare a noiunii de entitate, care permite proiectantului s specifice nu numai atribute, ci i funcii (numite metode) aplicabile instanelor clasei. Astfel, aceast diferen face ca UML s fie mai general dect modelul entitate-relaie, iar proiectantul poate exploata diagramele de clase UML pentru a realiza aceeai specificaie pe care o poate obine cu ajutorul modelului entitate-relaie.

80

PROIECTAREA BAZELOR DE DATE

Fig. 2.2. Diagrama de clase corespunztoare unei restricii a modelului. Diagramele de clase UML au mai multe caracteristici dect diagramele entitate-relaie, cum ar fi posibilitatea de a specifica reguli de derivare pentru atribute i relaii utiliznd limbajul OCL (Object Constraint Language). Pentru exemplificarea utilizrii formalismului UML, vom considera o restricie a modelului utilizat pe parcursul acestei lucrri i vom construi diagrama de clase corespunztoare. Construcia diagramei a fost realizat cu ajutorul programului Microsoft Visio i este prezentat n figura 2.2 . Din motive de spaiu, a fost redus numrul de atribute precizate pentru fiecare clas din cadrul diagramei.

Modelarea entitate-relaie

81

Prezentm cteva observaii referitoare la construcia acestui model utiliznd o diagram de clase UML. Unele observaii au caracter general, amintind anumite noiuni UML necesare nelegerii construciei modelului. Tabelul urmtor stabilete echivalenele modelului entitate-relaie i al notaiei UML: Entitate-relaie Tip entitate Asociere (relaie) Entitate Cardinalitate Model date conceptual Clas Asociere (relaie) Obiect Multiplicitate de Diagram de clase UML dintre formalismele

Descrierea claselor n UML se divide n trei compartimente care conin respectiv numele clasei, atributele acesteia i signatura metodelor clasei. n cazul reprezentrii unui model relaional de date nu exist metode, deci al treilea compartiment este vid. Cardinalitile din modelul entitate-relaie pro us d e Chen i p multiplicitile din formalismul UML sunt poziionate identic pe axa de reprezentare a relaiei. Asocierile dispun de anumite caracteristici, dintre care se remarc: nume, roluri, clase de asociere. Numele unei asocieri este dat de o form verbal activ sau pasiv. Acest nume este plasat n mijlocul liniei reprezentnd relaia respectiv. De exemplu, asocierea organizeaza dintre clasele Organizator i Prezentare este reprezentat n diagrama de clase prin acest nume plasat pe linia care conecteaz cele dou clase. Numele asocierii poate fi nsoit de un triunghi ndreptat ctre clasa desemnat de forma verbal, cu sco pu l d e a indica sensu l d e citire a relaiei. De exemplu, n cazul asocierii creeaza se precizeaz c relaia se citete dinspre clasa Creator ctre clasa Vestimentatie. Extremitatea unei asocieri poate indica un rol. Acesta descrie modul n care clasele sunt percepute prin intermediul relaiei respective. Un rol este n general desemnat printr-o form nominal sau verbal. De exemplu, asocierea lucreaza dintre clasele Casa_moda i Creator este reprezentat att prin nume, ct i prin rolurile angajat i firma. n UML, asocierile one to one (1:1) au multiplicitatea 0..1 sau 1 la fiecare extremitate; asocierile one to many (1:N) au multiplicitatea * sau 1..* la o extremitate i 0..1 sau 1 la cealalt extremitate; asocierile many to many (N:N) au multiplicitatea * sau 1..* la fiecare extremitate.

82

PROIECTAREA BAZELOR DE DATE

O asociere many to many cu atribute este reprezentat n UML printr-o clas de asociere. Aceasta conine atributele asocierii i este conectat printr-o linie punctat la linia reprezentnd relaia. De exemplu, asocierii dintre clasele Sponsor i Prezentare i este ataat clasa de asociere Finanteaza. ntre clasele Angajat_temp i Model exist o asociere de generalizare, corespunztoare relaiei ISA (is a). Generalizarea este reprezentat printr-o sgeat, al crei vrf este un triunghi gol, dinspre subclas ctre superclas. ntre clasele Vestimentatie i Accesoriu exist o relaie de agregare compus. Agregarea reprezint n UML o asociere care nu este simetric i pentru care o extremitate are un rol predominant fa de cealalt. Aceast asociere privete un singur rol al su. Agregarea aparine mai degrab etapei de concepie detaliat dect celei de modelare. Astfel, ea se va traduce la nivelul codului SQL prin declanatori sau constrngeri. Exist dou forme de agregare: compus i partajat. Compunerea exprim o relaie de apartenen mai puternic, aprnd atunci cnd relaia este de tipul compune sau face parte din. Reprezentarea compunerii se face prin intermediul unui romb plin, poziionat lng clasa care reprezint ntregul. Multiplicitatea extremitii agregat nu poate depi 1. Agregarea partajat presupune c un obiect poate face parte din mai multe agregate, iar ntregul se poate modifica n timp.O astfel de relaie se reprezint prin intermediul unui romb gol, poziionat lng clasa care reprezint ntregul. Relaiile de grade strict mai mari dect 2 sunt reprezentate n UML cu ajutorul unui romb (ca n figura 2.2) sau prin intermediul unei clase cu stereotip. Stereotipurile constituie un mecanism de extensibilitate al UML. Ele permit extinderea vocabularului UML astfel nct s poat fi definite noi elemente ale modelului, derivate din cele existente dar cu proprieti specifice domeniului problemei. Reprezentarea grafic a unui stereotip se face prin plasarea numelui su, ncadrat ntre caracterele << i >> deasupra numelui unui alt element. n exemplul considerat, asocierea primeste este ternar, constituind totodat o clas de asociere. Reprezentarea acestei relaii de gradul 3 prin intermediul unei clase cu stereotip are forma indicat n figura 2.3.

Modelarea entitate-relaie

83

Fig. 2.3. Asociere UML de tipul 3 cu stereotip.

Diagrame entitate-relaie
Diagrama E/R model neformalizat pentru reprezentarea unui sistem din lumea real. Este un model de date conceptual de nivel nalt dezvoltat de Chen (1976) pentru a facilita proiectarea bazelor de date. Modelul de date conceptual este independent de: tipul SGBD-ului; platforma hardware utilizata. Modelul conceptual este constituit din concepte care descriu: structura bazei de date; tranzactii de regasire si reactualizare asociate. semnificativ pentru ceea ce modelm.
DEPARTAMENT SARCINA lucreaza_in conduce apartine_la SALARIAT atasat_la PROIECT

Entitate: persoan, loc, concept, activitate, eveniment care este

Observaii: Entitile devin tabele n modelele relaionale. n general, entitile se scriu cu litere mari. Entitile sunt substantive, dar nu orice substantiv este o entitate. Pentru fiecare entitate este obligatoriu s se dea o descriere detaliat. Nu pot exista, n aceeai diagram, dou entiti cu acelai nume, sau o aceeai entitate cu nume diferite. Cheia primar este un identificator unic n cadrul entitii, fcnd distincie ntre valori diferite ale acesteia.

Cheia primar: trebuie s fie unic i cunoscut la orice moment; trebuie s fie controlat de administratorul bazei; trebuie s nu conin informaii descriptive, s fie simpl, fr ambiguiti; s fie stabil; s fie familiar utilizatorului. Existena unei relaii este subordonat existenei entitilor pe care le leag. Gradul (tipul) unei relatii este dat de numarul entitatilor participante la relatia respectiva. Observaii: n modelul relaional, relaiile devin tabele speciale sau coloane speciale care refer chei primare. Relaiile sunt verbe, dar nu orice verb este o relaie. Pentru fiecare relaie este important s se dea o descriere detaliat. n aceeai diagram pot exista relaii diferite cu acelai nume. n acest caz, le difereniaz entitile care sunt asociate prin relaia respectiv.

Relaie (asociere): o comunicare ntre dou sau mai multe entiti.

Pentru fiecare relaie trebuie stabilit cardinalitatea (maxim i minim) relaiei, adic numrul de tupluri ce aparin relaiei. Se pot afla cardinalitatile cu verbele : poate (cardinalitate maxim) trebuie (cardinalitate minima)

Exemplu: Ci salariai pot lucra ntr-un departament? Muli! n cte departamente poate lucra un salariat? In cel mult unul! Relaia SALARIAT_lucreaza_in_DEPARTAMENT are cardinalitatea maxim many-one (n:1). Exemplu: Ci salariai trebuie s conduc un departament? Cel puin unul! Cte departamente trebuie s conduc un salariat? Zero! Relaia SALARIAT_conduce_DEPARTAMENT are cardinalitatea minim one-zero (1:0).

Atribut: proprietate descriptiv a unei entiti sau a unei relaii.


Atributele pot fi simple, compuse, cu valori multiple, derivate. Observaii: Trebuie fcut distincia ntre tipul atributului (devine coloan n modelele relaionale) i valoarea acestuia (devine valoare n coloane). Atributele sunt substantive, dar nu orice substantiv este atribut. Fiecrui atribut trebuie s i se dea o descriere complet (exemple, contraexemple, caracteristici). Pentru fiecare atribut trebuie specificat numele, tipul fizic (integer, float, char etc.), valori posibile, valori implicite, reguli de validare, tipuri compuse.

Pentru proiectarea diagramei entitate-relaie au fost stabilite anumite reguli (nu sunt unice): 1. entitile sunt reprezentate prin dreptunghiuri; 2. relaiile dintre entiti sunt reprezentate prin arce neorientate; 3. atributele care reprezint chei primare trebuie subliniate sau marcate prin simbolul #, plasat la sfritul numelui acestor atribute; 4. cardinalitatea minim este indicat n paranteze, iar cardinalitatea maxim se scrie fr paranteze; 5. nu trebuie specificate toate atributele.

SALARIAT cod_salariat nume prenume sex salariu


1 M(0)

M(0)

atasat_la data_initiala functia

M(0)

PROIECT nr_proiect descriere buget_alocat


1

conduce
1(0)

lucreaza_in
1

apartine_la

DEPARTAMENT cod_departament nume nr_cladire

SARCINA nr_proiect nr_sarcina data_inceperii stare

Diagrama E/R.

Cazuri speciale de entiti, relaii, atribute i modul lor de reprezentare n cadrul diagramei entitate-relaie.
1.

Entitate dependent nu poate exista n mod independent (SARCINA depinde de PROIECT). Cheia primar a unei entiti dependente include cheia primar a sursei (nr_proiect) i cel puin o descriere a entitii (nr_sarcina). Entitatea dependent se deseneaz prin dreptunghiuri cu linii mai subiri. Motenirea atributelor. Subentitate (subclas) submulime a unei alte entiti, numit superentitate (superclas) (SALARIAT < > PROGRAMATOR). Subentitatea se deseneaz prin dreptunghiuri incluse n superentitate. Exist o relaie ntre o subentitate i o superentitate, numit ISA, care are cardinalitatea maxim 1:1 i minim 1:0. Cheile primare, atributele i relaiile unei superentiti sunt valabile pentru orice subentitate. Afirmaia reciproc este fals. Generalizare. Din entiti similare care au mai multe atribute comune se pot crea superentiti. Aceste superentiti conin atributele comune, iar atributele speciale sunt asignate la subentiti. Pentru noile superentiti se introduc chei primare artificiale. Specializare. Dup valorile unor atribute clasificatoare se pot determina clase. Un grup de subentiti reciproc exclusive definete o clas. Clasele se aliniaz n desen vertical. ntr-o diagram E/R se pot defini relaii recursive. Unele relaii sunt relative la dou entiti i le numim de tip 2, iar dac relaiile implic mai mult de dou entiti, le vom numi de tip 3. Trei relaii de tip 2 sunt diferite de o relaie de tip 3. Rupnd o relaie de tip 3 n trei relaii de tip 2, pot aprea informaii incorecte. Trebuie excluse din model relaiile indirecte deoarece ele pot conduce la redundan n baza de date. Atributele derivabile trebuie eliminate i introduse expresii prin care aceste atribute pot fi calculate. Relaie sau atribut? Dac un atribut al unei entiti reprezint cheia primar a unei alte entiti, atunci el refer o relaie (cod_departament n tabelul SALARIAT). Entitate sau relaie? Se cerceteaz cheia primar. Dac aceasta combin cheile primare a dou entiti, atunci este vorba de o relaie. (cheia primar a relaiei asociat_la combin cod_salariat cu nr_proiect, prin urmare, SALARIAT_asociat la_PROIECT va defini o relaie i nu o entitate).

2.

3.

4.

5. 6.

7.

8.

9.

10.

11.

Un atribut indirect este inoportun. El nu descrie real relaia sau entitatea. Prin urmare, atributele indirecte trebuie reasignate. De fapt, un atribut indirect este un caz special de relaie indirect care trebuie eliminat pentru c introduce redundan n date (numrul cldirii n care lucreaz un salariat este un atribut al entitii DEPARTAMENT i nu este o caracteristic a entitii SALARIAT). Exist atribute opionale, a cror valoare este uneori necunoscut, alteori neaplicabil. Aceste atribute trebuie introduse la subentiti (comisionul pentru deplasare i zona de lucru sunt atribute specifice unui agent teritorial i trebuie introduse la subentitatea AGENT_TERITORIAL). Algoritmul pentru proiectarea diagramei entitate-relaie: 1. identificarea entitilor din cadrul sistemului analizat; 2. identificarea relaiilor dintre entiti i stabilirea cardinalitii; 3. identificarea atributelor aferente entitilor i asocierilor dintre entiti; 4. stabilirea atributelor de identificare a entitilor (stabilirea cheilor).
SALARIAT cod_salariat nume
ISA 1 1(0)

12.

job_cod AGENT_TERITORIAL zona comision PROGRAMATOR limbaj nivel


M(0) atasat_la data_initiala functia

PROIECT nr_proiect descriere M(0) buget_alocat


1

ISA 1 1(0)

apartine_la 1(0) M(1)

1 conduce 1(0)

M(0) lucreaza_in 1

1(0)

casatorit

SARCINA nr_proiect nr_sarcina data_inceperii stare

DEPARTAMENT cod_departament nume nr_cladire

Diagrama E/R.

Modelul EER (modelul E/R extins) = Diagrama E/R + concepte aditionale (subclas, superclas, motenire, specializare, generalizare).

Gestiunea activitilor de mprumut dintr-o bibliotec


S-a presupus (restrictiv) c ntr-o zi un cititor nu poate mprumuta, de mai multe ori, aceeai carte. Modelul prezint anomalii (de exemplu, cheia primar de la entitatea carte)! A fost gndit n aceast manier cu scop pur didactic. Entitile i relaiile care intervin n acest model sunt urmtoarele: 1. CARTE (entitate independent) orice carte care se gsete n inventarul bibliotecii. Cheia primar este atributul codel. 2. CITITOR (entitate independent) orice cititor care poate mprumuta cri. Cheia primar este atributul codec. 3. DOMENIU (entitate independenta) domeniul cruia i aparine o carte. Cheia primar este atributul coded. 4. IMPRUMUTA relaie avnd cardinalitatea m:m care leag entitile CITITOR i CARTE. 5. APARTINE relaie care leag atributele CARTE i DOMENIU. Relaia are cardinalitatea maxim m:1, iar cardinalitatea minim 1:1.

CARTE codel# titlu autor pret nrex

M(1) imprumuta

M(0)

CITITOR codec# nume dep

M(0) apartine

DOMENIU coded# intdom

Gestiunea activitilor de editare dintr-o editur


Se analizeaza activitatea dintr-o editur referitoare la culegerea textelor, realizarea elementelor grafice, machetarea unor publicaii.

SALARIAT cod_salariat# tip nume job


ISA 1 1(0)

M(1) scrie

M(0)

FRAME nr_publicatie# nr_capitol# nr_frame#


M(0) include 1

GRAFICIAN tip

ISA 1 1(0)

TEHNOREDACTOR tip_editor

M(0)

1 realizeaz

CAPITOL nr_publicatie# nr_capitol#


M(1) cuprinde 1

ISA 1 1(0)

REDACTOR_SEF experienta

M(0) coordoneaza

PUBLICATIE nr_publicatie# stil limba

Gestiunea activitilor unei firme de construcii


Baza de date construit prin acest model, furnizeaz informaii legate de obiective de execuie, investitori, executani, antiere, contracte etc. necesare unui manager al unei firme de construcii

8
SANTIER nr_santier# specialitate sef
1 executa

CONTRACTANT cod_contractant# adresa telefon cont banca tip_contractant


executa

M(0)

SUBANTREPENOR nume nume_adm functie_adm


1 ISA 1(0)

LUCRARE
M( cod_obiectiv# 1) cod_lucrare#

adresa
M(1)

INVESTITOR tip_investitor PERS_FIZICA nume prenume bi


investeste_in 1

necesita 1

ISA 1 ISA 1(0)

OBIECTIV_ INVESTITIE M(1) cod_obiectiv# denumire adresa


1 atasat_la

ISA

PERS_JURIDICA tip_juridic nume functie


1

1 incheie

CONTRACT nr_contract# M(1) tip_contract data_avans

Tabelele din cursurile Oracle Education. Tabelele emp, dept, salgrade modeleaz gestiunea salariailor unei firme. Tabelul emp(empno#, ename, job, mgr, hiredate, sal, com, deptno) conine informaii despre salariaii unei firme. Pentru fiecare salariat sunt definite urmtoarele atribute: empno: codul salariatului; ename: numele salariatului; job: funcia; mgr: codul efului; hiredate: data angajrii; sal: salariul; com: comisionul; deptno: codul departamentului n care lucreaz. Tabelul dept (deptno#, dname, loc) conine informaii despre departamentele n care lucreaz salariaii. Atributele sale reprezint: deptno: codul departamentului; dname: numele departamentului; loc: localitatea unde funcioneaz departamentul. Tabelul salgrade(grade#, losal, hisal) conine informaii despre grilele de salarizare. Atributele tabelului au urmtoarea semnificaie: grade: codul grilei de salarizare; losal: limita inferioar a grilei de salarizare; hisal: limita superioar a grilei de salarizare.

Ordonarea informaiilor cu privire la descoperirile de monede antice din Romania


PUNCT
petrecut_in

EVENIMENT

gasita_in

ARTICOL

publicata

MONEDA

stantata_cu

STANTA

inclusa_in

pastrata_la

TEZAUR

MUZEU

STANA (nr_stan, mprat emitent, valoare nominal, an emitere, monetria, legenda de pe avers, legenda de pe revers) == > atribute ale entitii STANTA Completai cardinalitatea!

Evidena colilor de oferi din Romania


SCOALA
cod_scoala#

CLIENT
cod_client#

INSTRUCTOR
cod_instructor#

EXAMEN
cod_examen#

MASINA
cod_masina#

EXAMINATOR
cod_examinator#

Completai relaiile (lucreaza_la, conduce, sustine, asista, instruieste) dintre entiti i specificai cardinalitatea!

10

Campionatele de fotbal ale diferitelor ri


ECHIPA
Cod_echipa# Nume Oras 2 joaca M(1) sustine M(1) SPONSOR Cod_sponsor# Nume

M(1)

MECI
Tara# Nr_etapa# Cod_meci#

M(1) apartine_de 1

ETAPA
Tara Nr_etapa M(1) atasata_la 1

CAMPIONAT
Tara#

11

Modelul relaional
Modelul relaional a fost conceput i dezvoltat de E.F. Codd. El este un model formal de organizare conceptual a datelor, destinat reprezentrii legturilor dintre date, bazat pe teoria matematic a relaiilor. Modelul relaional este alctuit numai din relaii i prin urmare, orice interogare asupra bazei de date este tot o relaie. Caliti: este simplu; riguros din punct de vedere matematic; nu este orientat spre sistemul de calcul. prezentarea datelor n tabele supuse anumitor operaii de tip proiecie, selecie, reuniune, compunere, intersecie etc. un sistem de baze de date ce suport un limbaj de tip SQL Structured Query Language; un sistem de baze de date care respect principiile modelului relaional introdus de E.F. Codd. structura relaional a datelor; operatorii modelului relaional; regulile de integritate care guverneaz folosirea cheilor n model.

Modaliti pentru definirea unui SGBD relaional:

Caracteristicile unui model relaional:

Aceste trei elemente corespund celor trei componente ale ingineriei software: informaie, proces, integritate.

Structura datelor
Definirea noiunilor de domeniu, relaie, schem relaional, valoare null i tabel vizualizare (view). Conceptele utilizate pentru a descrie formal, uzual sau fizic elementele de baz ale organizrii datelor sunt date n urmtorul tabel: Formal relaie tuplu atribut domeniu Uzual tablou linie coloan tip de dat Fizic fiier nregistrare cmp tip de dat

12

Domeniu mulime de valori care poate fi definit fie enumernd elementele componente, fie definind o proprietate distinctiv a domeniului valorilor. Fie D 1 , D 2 , ..., D n domenii finite, nu neaprat disjuncte. Produsul cartezian D 1 D 2 ... D n al domeniilor D 1, D 2, ..., Dn este definit de mulimea tuplurilor (V1 , V2 , ..., Vn ), unde V1 D 1, V2 D 2, ..., Vn Dn . Numrul n definete aritatea tuplului. O relaie R pe mulimile D 1, D2 , ..., D n este o submulime a produsului cartezian D1 D2 ... Dn, deci este o mulime de tupluri. Caracteristicile unei relaii comentat curs! Caracteristicile unei relatii: are o denumire unica; fiecare celula contine o valoare atomica; fiecare atribut are nume unic; toate valorile unui atribut apartin aceluiasi domeniu; ordinea atributelor nu are importanta; nu exista dubluri ale tuplurilor; teoretic, ordinea tuplurilor nu are importanta. Definirea unei relaii se refer la mulimi care variaz n timp. Pentru a caracteriza o relaie este necesar existena un element invariant n timp: structura relaiei (schema relaional). Mulimea numelor atributelor corespunztoare unei relaii R definete schema relaional a relaiei respective. Vom nota schema relaional prin R(A 1, A2, ..., An ). Exemplu! Putem reprezenta o relaie printr-un tabel bidimensional n care fiecare linie corespunde unui tuplu i fiecare coloan corespunde unui domeniu din produsul cartezian. O coloan corespunde de fapt unui atribut. Numrul atributelor definete gradul (aritatea) relaiei, iar numrul de tupluri din relaie definete cardinalitatea relaiei. Exemplu (crearea unui tabel n SQL): CREATE TABLE salariat cod_salariat nume prenume sex salariu sot job_cod cod_departament ( SMALLINT, VARCHAR(25), VARCHAR(20), CHAR(1), INTEGER, SMALLINT, VARCHAR(6), SMALLINT );

13

Cnd se insereaz tupluri ntr-o relaie, de multe ori un atribut este necunoscut sau neaplicabil. Pentru a reprezenta acest atribut a fost introdus o valoare convenional n relaie, i anume valoarea null. Tabelul vizualizare (view, filtru, relaie virtual, vedere) constituie un filtru relativ la unul sau mai multe tabele, care conine numai informaia necesar unei anumite abordri sau aplicaii. Vizualizarea este virtual deoarece datele pe care le conine nu sunt n realitate memorate ntr-o baz de date. Este memorat numai definiia vizualizrii. Vizualizarea nu este definit explicit, ca relaiile de baz, prin mulimea tuplurilor componente, ci implicit, pe baza altor relaii prin intermediul unor expresii relaionale. Stabilirea efectiv a tuplurilor care compun vizualizarea se realizeaz prin evaluarea expresiei atunci cnd utilizatorul se refer la acest tabel. Exemplu (crearea unei vizualizri n SQL): CREATE VIEW programator(nume,departament) AS SELECT nume,cod_departament FROM salariat WHERE job_cod=programator;

de date trebuie s le satisfac.

Reguli de integritate aseriuni pe care datele coninute n baza


Trebuie fcut distincia ntre: regulile structurale inerente modelrii datelor; regulile de funcionare specifice unei aplicaii particulare.

Exist trei tipuri de constrngeri structurale (de cheie, de referin, de entitate) ce constituie mulimea minimal de reguli de integritate pe care trebuie s le respecte un SGBD relaional. Restriciile de integritate minimale sunt definite n raport cu noiunea de cheie a unei relaii. O mulime minimal de atribute ale cror valori identific unic un tuplu ntr-o relaie reprezint o cheie pentru relaia respectiv. Fiecare relaie are cel puin o cheie. Una dintre cheile candidat va fi aleas pentru a identifica efectiv tupluri i ea va primi numele de cheie primar. Cheia primar nu poate fi reactualizat. Atributele care reprezint cheia primar sunt fie subliniate, fie urmate de semnul #. O cheie identific linii i este diferit de un index care localizeaz liniile. O cheie secundar este folosit ca index pentru a accesa tupluri. Un grup de atribute din cadrul unei relaii care conine o cheie a relaiei poart numele de supercheie.

14

Fie schemele relaionale R1(P1, S1) i R2(S1, S2), unde P1 este cheie primar pentru R1, S1 este cheie secundar pentru R1, iar S1 este cheie primar pentru R2. n acest caz, vom spune c S1 este cheie extern (cheie strin) pentru R1. Modelul relaional respect trei reguli de integritate structural. Regula 1 unicitatea cheii. Cheia primar trebuie s fie unic i minimal.

Regula 2 integritatea entitii. Atributele cheii primare trebuie s fie diferite de valoarea null. Regula 3 integritatea referirii. O cheie extern trebuie s fie ori null n ntregime, ori s corespund unei valori a cheii primare asociate.

Proiectarea modelului relaional (exemple curs!)


Transformarea entitilor

Entitile independente devin tabele independente. Cheia primar nu conine chei externe. Entitile dependente devin tabele dependente. Cheia primar a entitilor dependente conine cheia primar a entitii de care depinde (cheie extern) plus unul sau mai multe atribute adiionale. Subentitile devin subtabele. Cheia extern se refer la supertabel, iar cheia primar este aceast cheie extern (cheia primar a subentitii PROGRAMATOR este cod_salariat care este o cheie extern).

Transformarea relaiilor

Relaiile 1:1 i 1:n devin chei externe. Relaia conduce devine coloan n tabelul DEPARTAMENT, iar relaia lucreaza_in devine coloan n tabelul SALARIAT. Simbolul indic plasamentul cheii externe, iar simbolul exprim faptul c aceast cheie extern este coninut n cheia primar. Relaia 1:1 plaseaz cheia extern n tabelul cu mai puine linii. Relaia m:n devine un tabel special, numit tabel asociativ, care are dou chei externe pentru cele dou tabele asociate. Cheia primar este compunerea acestor dou chei externe plus eventuale coloane adiionale. Tabelul se deseneaz punctat.

15

Relaiile de tip trei devin tabele asociative. Cheia primar este compunerea a trei chei externe plus eventuale coloane adiionale.

Transformarea atributelor

Un atribut singular devine o coloan. Atributele multiple devin tabele dependendente ce conin cheia primar a entitii i atributul multiplu. Cheia primar este o cheie extern, plus una sau mai multe coloane adiionale. Entitile devin tabele, iar atributele lor devin coloane n aceste tabele. Ce devin atributele relaiilor? Pentru relaii 1:1 i 1:n, atributele relaiilor vor aparine tabelului care conine cheia extern, iar pentru relaii m:n i de tipul trei, atributele vor fi plasate n tabelele asociative. SALARIAT
cod_salariat#

PROIECT
nr_proiect#

conduce

lucreaza_in

apartine_la

DEPARTAMENT
cod_departament#

SARCINA
nr_proiect# nr_sarcina#

SALARIAT
cod_salariat#

atasat_la
cod_salariat# nr_proiect#

PROIECT
nr_proiect#

TELEFON SALARIAT
cod_salariat# cod_salariat# nr_telefon#

Cele patru tipuri de tabele (independente, dependente, subtabele i asociative) se deosebesc prin structura cheii primare.

16

Tabel Independent Subtabel Dependent Asociativ

Reprezint entitate independent subentitate entitate dependent atribute multiple relaie m:n relaii de tip 3

Cheie primar nu conine chei externe o cheie extern o cheie extern i una sau mai multe coloane adiionale dou sau mai multe chei externe i (opional) coloane adiionale

Diagrama conceptual pentru proiectarea modelului relaional comentat a fost construit din diagrama E/R prin adugarea tabelelor asociative i prin marcarea cheilor externe.

SALARIAT cod_salariat# salariu nume sex

job_cod AGENT_TERITORIAL zona comision PROGRAMATOR limbaj nivel ATASAT_LA cod_salariat# nr_proiect# functie

PROIECT nr_proiect# descriere buget_alocat

apartine_la

conduce

lucreaza_in

casatorit

DEPARTAMENT cod_departament# nume nr_cladire

TELFON cod_salariat# nr_telefon#

SARCINA nr_proiect# nr_sarcina# data_inceperii stare

Schemele relaionale corespunztoare acestei diagrame conceptuale sunt urmtoarele: SALARIAT(cod_salariat#, nume, prenume, sex, job_cod, cod_sot, forma_plata, nr_depart);

17

DEPARTAMENT(cod_departament#, nume, numar_cladire, cod_sal); ATASAT_LA(cod_salariat#, nr_proiect#, functia); PROIECT(nr_proiect#, descriere, buget_alocat); SARCINA(nr_proiect#, nr_sarcina, data_inceperii, stare); AGENT_TERITORIAL(cod_salariat#, zona, comision); PROGRAMATOR(cod_salariat#, limbaj, nivel); TELEFON(cod_salariat#, nr_telefon#).

Gestiunea activitilor unei firme de construcii


CONTRACTANT(cod_contractant#, tip_contractant); adresa, telefon, cont, banca,

SUBANTREPRENOR(cod_contractant#, nume, nr_reg_comert, nume_adm, functie_adm); INVESTITOR(cod_contractant#, tip_investitor); PERS_FIZICA(cod_contractant#, nume, prenume, bi); PERS_JURIDICA(cod_contractant#, tip_juridic, nume, reprez_legal, functie); CONTRACT(nr_contract#, tip_contract, data_incheiere, garantie, val_investitie, durate_executie, cont, banca, perioada, avans, data_avans, cod_contractant); SANTIER(nr_santier#, specialitate, sef); OBIECTIV_INVESTITIE(cod_obiectiv#, denumire, adresa, adc, nr_cert_urb, nr_aut_constr, nr_contract, cod_contractant); LUCRARE(cod_lucrare#, cod_obiectiv#, tip_lucrare, nume, data_inc, data_sf, nr_santier, cod_contractant);

18

CONTRACTANT cod_contractant# adresa telefon cont banca

tip_contractant SUBANTREPENOR nume nume_adm funcie_adm LUCRARE cod_lucrare# executa cod_obiectiv# ANTIER nr_antier# specialitate ef

executa

necesita

INVESTITOR tip_investitor

OBIECTIV_INVESTITIE cod_obiectiv# denumire adresa


investeste_in

PERS_FIZICA nume prenume bi

atasat_la

CONTRACT PERS_JURIDICA tip_juridic nume functie nr_contract# tip_contract data_avans


incheie

19

Gestiunea activitilor de editare dintr-o editur


SALARIAT cod_salariat# nume job GRAFICIAN tip TEHNOREDACTOR tip_editor REDACTOR_SEF experienta coordoneaza TELEFON cod_salariat# nr_telefon# LIMBA cod_salariat# limba_cun# PUBLICATIE nr_publicatie# stil REALIZEAZA cod_salariat# nr_publicatie# nr_capitol# nr_frame# FRAME nr_publicatie# nr_capitol# nr_frame# tip include scrie CAPITOL nr_publicatie# nr_capitol# dimensiune cuprinde

SALARIAT(cod_salariat#, nume, prenume, vechime, salariu, job); GRAFICIAN(cod_salariat#, tip); TEHNOREDACTOR(cod_salariat#, tip_platforma, tip_editor, viteza); REDACTOR_SEF(cod_salariat#, experienta); LIMBA(cod_salariat#, limba_cunos#); TELEFON(cod_salariat#, nr_telefon#); REALIZEAZA(cod_salariat#, nr_frame#, nr_publicatie#, nr_capitol#, data_inc, data_lim); FRAME(nr_frame#, nr_publicatie#, nr_capitol#, tip, dim, format); CAPITOL(nr_publicatie#, nr_capitol#, dimensiune, cod_salariat); PUBLICATIE(nr_publicatie#, stil, beneficiar, autor, cod_salariat, cost, titlu, limba).

20

Algebra relaional
Limbajul de definire a datelor (LDD) precizeaz entitile, relaiile dintre ele, atributele, structura atributelor, cheile, constrngerile, prin urmare definete structura obiectelor bazei de date (schema bazei). Limbajul de prelucrare a datelor (LMD) dintr-o baz de date relaionale cuprinde aspecte referitoare la introducerea, eliminarea, modificarea i cutarea datelor. Introducerea datelor permite adugarea de tupluri la o relaie. Tuplurile pot fi introduse de utilizator sau pot fi obinute din alte relaii existente n baza de date. Eliminarea datelor permite tergerea tuplurilor ce satisfac condiii date. Modificarea datelor permite reactualizarea tuplurilor ce satisfac condiii date cu noi valori ale atributelor sau cu rezultate ale unor operaii aritmetice efectuate asupra unor valori existente. Cutarea datelor permite gsirea tuplurilor sau a unor pri ale tuplurilor ce satisfac condiii date. algebra relaional (filtrele se obin aplicnd operatori specializai asupra uneia sau mai multor relaii din cadrul bazei relaionale); calculul relaional (filtrele se obin cu ajutorul unor formule logice pe care tuplurile rezultatului trebuie s le satisfac).

Modelul relaional ofer dou mulimi de operatori pe relaii:

Algebra relaional a fost introdus de E.F. Codd ca o mulime de operaii formale acionnd asupra unor relaii i avnd ca rezultat alte relaii. Baza teoretic pentru limbajele de interogare relaionale o constituie operatorii introdui de Codd pentru prelucrarea relaiilor. Operatorii modelului relaional definesc operaiile care se pot efectua asupra relaiilor n scopul realizrii funciilor de prelucrare asupra BD. Operatorii sunt numai pentru citire (nu actualizeaza operanzi)!!! Scopul fundamental al algebrei relationale este de a permite scrierea expresiilor relationale. Expresiile servesc ca o reprezentare de nivel superior, simbolic, a inteniilor utilizatorului i pot fi supuse unei diversiti de reguli de transformare (optimizare). Relaiile sunt nchise fa de algebra relaional (operanzii i

21

rezultatele sunt relaii ieirea unei operaii poate deveni intrare pentru alta) posibilitatea imbricrii expresiilor n algebra relaional). Operatorii algebrei relaionale sunt: operatori tradiionali pe mulimi (UNION, INTERSECT, PRODUCT, DIFFERENCE); operatori relaionali speciali (PROJECT, SELECT, JOIN, DIVISION).

Calculul relaional reprezint o adaptare a calculului predicatelor la domeniul bazelor de date relaionale. Ideea de baz este de a identifica o relaie cu un predicat. Pe baza unor predicate iniiale, prin aplicarea unor operatori ai calculului cu predicate (conjuncia, disjuncia, negaia, cuantificatorul existenial i cel universal) se pot defini noi relaii. Calculul relaional p o ae s fie orientat pe tuplu r sau o r t i ientat p e domenii. Echivalena dintre algebra relaional i calculul relaional a fost demonstrat de J.D.Ullman. Aceast echivalen arat c orice relaie posibil de definit n algebra relaional poate fi definit i n cadrul calcului relaional, i reciproc. Operatorii (unari sau binari) algebrei relaionale urmtoarele funcii: PROJECT (proiecie) extrage atributele specificate; DIFFERENCE (diferen) extrage tupluri care apar ntr-o relaie, dar nu apar n cealalt; PRODUCT (produs cartezian) genereaz toate perechile posibile de tupluri, primul element al perechii fiind luat din prima relaie, iar cel deal doilea element din cealalt relaie; UNION (reuniune) reunete dou relaii; INTERSECT (intersecie) extrage tupluri care apar n ambele relaii; DIVISION (diviziune) extrage valorile atributelor dintr-o relaie, care apar n toate valorile atributelor din cealalt relaie; JOIN (compunere) extrage tupluri din mai multe relaii corelate: NATURAL JOIN (compunere natural) combin tupluri din dou relaii, cu condiia ca atributele comune s aib valori identice; SEMI-JOIN (semi-compunere) selecteaz tupluri ce aparin unei singure relaii, care sunt corelate cu tupluri din cea de a doua relaie; realizeaz

SELECT (selecie) extrage tupluri ce satisfac o condiie specificat;

22

-JOIN (-compunere) combin tupluri din dou relaii (nu neaparat corelate), cu condiia ca valorile atributelor specificate s satisfac o anumit condiie; OUTER JOIN (compunere extern) combin tupluri din dou relaii, astfel nct condiiile de corelare s fie satisfcute. Tuplurile din orice relaie care nu satisfac aceste condiii sunt completate cu valori null. Pentru operatorii UNION, INTERSECT i DIFFERENCE, se presupune c sunt aplicai numai la relaii avnd aceeai aritate, iar ordinea (nu numele) atributelor este aceeai.

Operatorul PROJECT
Proiecia este o operaie unar care elimin anumite atribute ale unei relaii producnd o submulime pe vertical a acesteia. Suprimarea unor atribute poate avea ca efect apariia unor tupluri duplicate, care trebuie eliminate. Prin proiecie se construiete dintr-o relaie R, o nou relaie: a) tergnd din R atributele care nu sunt menionate n parametrii proieciei; b) eliminnd dublurile care apar dup tergere. Pentru a reprezenta operatorul proiecie sunt utilizate diferite notaii: A1, ..., Am (R) R[A1 , ..., Am ] unde A1 , A 2 , ..., Am sunt parametrii proieciei relativ la relaia R. Exemplu. S se obin o list ce conine numele, prenumele i sexul angajailor. 1. Proiecie n algebra relaional: Rezultat = PROJECT(SALARIAT, nume, prenume, sex)
2.

PROJECT (R, A1 , ..., Am)

Proiecie cu dubluri n SQL: nume, prenume, sex salariat; DISTINCT nume, prenume, sex salariat;

SELECT FROM
3.

Proiecie fr dubluri n SQL:

SELECT FROM

23

Operatorul SELECT
Selecia (restrictia) este o operaie unar care produce o submulime pe orizontal a unei relaii R. Aceast submulime se obine prin extragerea tuplurilor din R care satisfac o condiie specificat. Sunt utilizate diferite notaii: condiie (R) SELECT(R, condiie) R[condiie] RESTRICT(R, condiie).

Exemplu. S se obin informaii complete despre angajaii de sex masculin.


1.

Selecie n algebra relaional: Selecie n SQL: * salariat sex = m;

Rezultat = SELECT(SALARIAT, sex = m)


2.

SELECT FROM WHERE

Operatorul UNION
Reuniunea a dou relaii R i S este mulimea tuplurilor aparinnd fie lui R, fie lui S, fie ambelor relaii. Sunt utilizate notaiile: RS UNION(R, S) OR(R, S) APPEND(R, S). Exemplu. S se obin lista cu numele persoanelor fizice i a subantreprenorilor. SELECT FROM UNION SELECT FROM nume subantreprenor nume pers_fizica;

24

Operatorul DIFFERENCE
Diferena a dou relaii R i S este mulimea tuplurilor care aparin lui R, dar nu aparin lui S. Diferena este o operaie binar necomutativ care permite obinerea tuplurilor ce apar numai ntr-o relaie. Sunt utilizate diferite notaii: RS DIFFERENCE(R, S) REMOVE(R, S) MINUS(R, S). Exemplu. S se obin lista cu numrul contractului, tipul contractului, valoarea investiiei i durata lucrrii pentru contractele de subantrepriz pentru care valoarea investiiei nu depete 60000$.
1. Diferen n algebra relaional:

R=PROJECT(SELECT(CONTRACT, tip_contract=T), nr_contract, tip_contract, val_investitie, durata_lucrare); S=PROJECT(SELECT(CONTRACT, val_investitie > 60000), nr_contract, tip_contract, val_investitie, durata_lucrare); Rezultat = DIFFERENCE(R, S)
2. Diferena n SQL:

SELECT

FROM WHERE MINUS SELECT nr_contract,tip_contract, val_investitie,durata_lucrare FROM contract WHERE val_investitie>60000; Evident diferena se poate referi la tabele diferite! Implementai cererea prin care se listeaz toate oraele n care se afl o filial, dar nici o proprietate.

nr_contract,tip_contract, val_investitie,durata_lucrare contract tip_contract

Operatorul INTERSECT
Intersecia a dou relaii R i S este mulimea tuplurilor care aparin i lui R i lui S. Operatorul INTERSECT este un operator binar, comutativ, derivat:

25

R S = R (R S) R S = S (S R). Sunt utilizate diferite notaii: INTERSECT(R, S) RS AND(R, S). n anumite dialecte SQL exist operator special (INTERSECT), care realizeaz aceast operaie. Operatorii INTERSECT i DIFFERENCE pot fi simulai n SQL (n cadrul comenzii SELECT) cu ajutorul opiunilor EXISTS, NOT EXISTS, IN, != ANY. Exemplu. Utiliznd tabelele agent_teritorial i programator s se obin lista codurilor salariailor care sunt programatori, dar care lucreaz i ca ageni teritoriali.
1.

Intersecie n algebra relaional:

R = PROJECT(AGENT_TERITORIAL, cod_salariat); S = PROJECT(PROGRAMATOR, cod_salariat), Rezultat = INTERSECT(R, S).


2.

Intersecie n SQL:

SELECT cod_salariat FROM agent_teritorial INTERSECT SELECT cod_salariat FROM programator;


3.

Simularea interseciei n SQL:

SELECT cod_salariat FROM programator p WHERE EXISTS (SELECT cod_salariat FROM agent_teritorial a WHERE p.cod_salariat=a.cod_salariat);

Operatorul PRODUCT
Fie R i S relaii de aritate m, respectiv n. Produsul cartezian al lui R cu S este mulimea tuplurilor de aritate m + n unde primele m componente formeaz un tuplu n R, iar ultimele n componente formeaz un tuplu n S. Sunt utilizate diferite notaii:

26

RS PRODUCT(R, S) TIMES(R, S). Exemplu. S se obin lista tuturor posibilitilor de investiie n diverse obiective de ctre o firm care este persoan juridic.
1.

Produs cartezian n algebra relaional:

R = PROJECT(PERS_JURIDICA, nume, cod_contractant); S = PROJECT(OBIECTIV_INVESTITIE, denumire); Rezultat = PRODUCT(R, S).


2.

Produs cartezian n SQL: cod_contractant, nume, denumire obiectiv_investitie, pers_juridica;

SELECT FROM

Operatorul DIVISION
Diviziunea este o operaie binar care definete o relaie ce conine valorile atributelor dintr-o relaie care apar n toate valorile atributelor din cealalt relaie. Sunt utilizate diferite notaii: DIVIDE(R, S) DIVISION(R, S) R S. Diviziunea conine acele tupluri de dimensiune n m la care, adugnd orice tuplu din S, se obine un tuplu din R. Operatorul diviziune poate fi exprimat formal astfel: R(n) S(m) = {t(n-m) s S, (t, s) R} unde n > m i S . Operatorul DIVISION este legat de cuantificatorul universal () care nu exist n SQL. Cuantificatorul universal poate fi ns simulat cu ajutorul cuantificatorului existenial () utiliznd relaia: x P(x) x P(x). Prin urmare, operatorul DIVISION poate fi exprimat n SQL prin succesiunea a doi operatori NOT EXISTS. Exemplu. S se obin codurile salariailor ataai tuturor proiectelor pentru care s-a alocat un buget egal cu 1000.
1.

Diviziune n algebra relaional:

27

R = PROJECT(ATASAT_LA, cod_salariat, nr_proiect); S = PROJECT(SELECT(PROIECT, buget = 1000), nr_proiect); Rezultat = DIVISION(R, S).
2.

Diviziune n SQL:

SELECT UNIQUE cod_salariat FROM atasat_la sx WHERE NOT EXISTS (SELECT * FROM proiect pp WHERE proiect.buget=1000 AND NOT EXISTS (SELECT * FROM atasat_la bb WHERE pp.nr_proiect=bb.nr_proiect AND bb.cod_salariat=sx.cod_salariat));
3.

Simularea diviziunii cu ajutorul funciei COUNT:

SELECT cod_salariat FROM atasat_la WHERE nr_proiect IN (SELECT nr_proiect FROM proiect WHERE buget=1000) GROUP BY cod_salariat HAVING COUNT(nr_proiect)= (SELECT COUNT(*) FROM proiect WHERE buget=1000);

Operatorul JOIN
Operatorul de compunere (uniune) permite regsirea informaiei din mai multe relaii corelate. Operatorul combin produsul cartezian, selecia i proiecia. Operatorul de compunere natural (NATURAL JOIN) combin tupluri din dou relaii R i S, cu condiia ca atributele comune s aib valori identice. Algoritmul care realizeaz compunerea natural este urmtorul:
1.

Operatorul NATURAL JOIN

se calculeaz produsul cartezian R S;

28

2.

3.

pentru fiecare atribut comun A care definete o coloan n R i o coloan n S, se selecteaz din R S tuplurile ale cror valori coincid n coloanele R.A i S.A (atributul R.A reprezint numele coloanei din R S corespunztoare coloanei A din R); pentru fiecare astfel de atribut A se proiecteaz coloana S.A, iar coloana R.A se va numi A. JOIN(R, S) = i1,...,im (R.A1 = S.A1) ... (R.Ak = S.Ak) (R S),

Operatorul NATURAL JOIN poate fi exprimat formal astfel: unde A1 , ..., Ak sunt atributele comune lui R i S, iar i1 , ..., i m reprezint lista componentelor din R S (pstrnd ordinea iniial) din care au fost eliminate componentele S.A1 , ..., S.Ak . Exemplu. S se obin informaii complete despre angajai i departamentele n care lucreaz.
1.

Operatorul de compunere natural n algebra relaional: Operatorul de compunere natural n SQL: * salariat, departament nr_depart = cod_departament;

Rezultat = JOIN(SALARIAT, DEPARTAMENT).


2.

SELECT FROM WHERE

Operatorul -JOIN
Operatorul -JOIN combin tupluri din dou relaii (nu neaprat corelate) cu condiia ca valorile atributelor specificate s satisfac o anumit condiie specificat explicit n cadrul operaiei. Operatorul -JOIN este un operator derivat, fiind o combinaie de produs scalar i selecie: JOIN(R, S, condiie) = condiie (R S) Exemplu. S se afieze pentru fiecare salariat, codul acestuia i grila sa de salarizare. SELECT empno, level FROM salgrade, emp WHERE sal BETWEEN losal AND hisal; Exemplu. S se obin informaii despre contractani (codul i banca) i obiectivele de investiie asociate acestora (denumire, numr certificat de urbanizare) cu condiia ca obiectivele s nu fie la aceeai adres ca i contractanii.

29

1.

Operatorul -JOIN n algebra relaional:

R = PROJECT(CONTRACTANT, cod_contractant, banca); S = PROJECT(OBIECTIV_INVESTITIE, denumire, nr_cert_urb); Rezultat = JOIN(R, S, OBIECTIV_INVESTITIE.adresa <> CONTRACTANT.adresa).
2.

Opratorul -JOIN n SQL: cod_contractant,banca, nr_cert_urb, denumire contractant a,obiectiv_investitie b b.adresa <> a.adresa;

SELECT FROM WHERE

Operatorul SEMI-JOIN
Operatorul SEMI-JOIN conserv atributele unei singure relaii participante la compunere i este utilizat cnd nu sunt necesare toate atributele compunerii. Operatorul este asimetric. Tupluri ale relaiei R care particip n compunerea (natural sau -JOIN) dintre relaiile R i S. SEMI-JOIN este un operator derivat, fiind o combinaie de proiecie i compunere natural sau proiecie i -JOIN: SEMIJOIN(R, S) = M (JOIN(R, S)) SEMIJOIN(R, S, condiie) = M (JOIN(R, S, condiie)), unde am notat prin M atributele relaiei R. Exemplu. S se obin informaii referitoare la persoanele fizice (nume, buletin) care investesc n obiective cu caracter recreativ.
1.

Operatorul SEMI-JOIN n algebra relaional:

R = SELECT(OBIECTIV_INVESTITIE, denumire = cabana OR denumire = casa de vacanta) S = JOIN(PERS_FIZICA, R) Rezultat = PROJECT(S, nume, buletin).
2.

Operatorul SEMI-JOIN n SQL: nume,bi pers_fizica a,obiectiv_investitie b a.cod_contractant = b.cod_contractant (denumire=cabana)OR (denumire= casa de vacanta);

SELECT FROM WHERE AND

30

Operatorul OUTER JOIN


Operaia de compunere extern combin tupluri din dou relaii pentru care sunt satisfcute condiiile de corelare. n cazul aplicrii operatorului JOIN se pot pierde tupluri, atunci cnd exist un tuplu n una din relaii pentru care nu exist nici un tuplu n cealalt relaie, astfel nct s fie satisfcut relaia de corelare. Operatorul elimin acest inconvenient prin atribuirea valorii null valorilor atributelor care exist ntr-un tuplu din una dintre relaiile de intrare, dar care nu exist i n cea de-a doua relaie. Practic, se realizeaz compunerea a dou relaii R i S la care se adaug tupluri din R i S, care nu sunt coninute n compunere, completate cu valori null pentru atributele care lipsesc. Compunerea extern poate fi: LEFT, RIGHT, FULL. De exemplu, OUTER JOIN LEFT reprezint compunerea n care tuplurile din R, care nu au valori similare n coloanele comune cu relaia S, sunt de asemenea incluse n relaia rezultat. Exemplu. S se obin informaii referitoare la persoanele fizice care sunt investitori (chiar dac nu au investit n obiective industriale) i la obiectivele de investiie industriale (chiar i cele care nu sunt construite de persoane fizice). R = SELECT(OBIECTIV_INVESTITIE, denumire = 'industrial') Rezultat = OUTERJOIN(PERS_FIZICA, R). Operatorii algebrei relaionale pot fi reprezentai grafic cu ajutorul unor simboluri speciale. curs! Operaii adiionale: complement, despicare, nchidere tranzitiv. Funcii asociate: MIN, MAX, COUNT, AVG, SUM, VAR, STD etc.

31

Evaluarea i optimizarea interogrilor


Procesarea interogrilor
O expresie a algebrei relaionale este constituit din relaii legate prin operaii din algebra relaional. O expresie se poate reprezenta grafic cu ajutorul unui arbore, numit arbore algebric, n care nodurile corespund operatorilor din cadrul expresiei respective. Evaluarea unei expresii presupune efectuarea prelucrrilor indicate de operatorii din expresie n ordinea apariiilor sau n ordinea fixat prin paranteze. Rezultatul evalurii unei expresii este o relaie derivat din relaiile menionate ca operanzi n cadrul expresiei. Dou expresii sunt echivalente, dac n urma evalurii lor se obine ca rezultat aceeai relaie. Exemple referitoare la moduri echivalente de exprimare a unei cereri (vor fi rezolvate la curs!). 1. Informaii despre salariaii care nu contribuie la machetarea nici unei publicaii, dar au retribuia mai mare dect o valoare dat. 2. Codul i numele subantreprenorilor care au realizat lucrri specializate la obiective case de vacan sau cabane. 3. Codurile i telefoanele investitorilor, valoarea si durata de execuie a investitiilor a caror valoare este ntre dou limite specificate. 4. Perioada de desfurare i preul ofertelor care ncep dup 1 ianuarie 2003 i sunt: sejururi la munte; excursii n care autocarele sunt conduse de oferi angajai dup 1 mai 1987 i supravegheate de ghizi ce cunosc limba englez care au fcut specializare n Suedia. n majoritatea sistemelor de gestiune, i n special n cele relaionale, interfaa cu utilizatorul este de tip neprocedural. Utilizatorul definete datele pe care dorete s le vizualizeze fr a da algoritmii de acces. Sistemul trebuie s converteasc cererea utilizatorului: ntr-o cerere optimal; n proceduri de acces optimal la datele fizice. Garantarea absolut a performanelor optime pentru procesorul limbajului relaional este imposibil. Corect ar fi utilizarea cuvntului ameliorare n locul cuvntului optimizare.

32

Evaluarea unei interogri se efectueaz n trei etape.

Analiza cererii presupune studierea sintactic i semantic a cererii pentru a verifica corectitudinea sa i a simplifica criteriul de cutare. Ordonanarea presupune descompunerea cererii ntr-o mulime de operaii elementare i determinarea unei ordini optimale a acestor operaii. Operaiile sunt, n general, cele ale algebrei relaionale. La sfritul etapei se obine un plan de execuie pentru cerere. Execuia presupune efectuarea (paralel i/sau secvenial) operaiilor elementare furnizate de planul de execuie pentru a obine rezultatul cererii.

Presupunem c utilizatorul transmite sistemului de gestiune o cerere exprimat prin ordine SQL. Pentru a rspunde cererii, SGBD-ul trebuie s neleag cererea utilizatorului. Cererea trebuie s fie corect sintactic, datele trebuie s fie disponibile utilizatorului i trebuie localizate analiznd diferite drumuri de acces la ele. Aceste funcii sunt realizate de SGBD cu ajutorul a dou module funcionale care comunic permanent:

analizorul cererilor, care asigur verificarea sintactic i semantic a cererii, localizarea datelor implicate n cerere (gsirea adresei blocurilor ce conin datele), furnizarea planului de execuie. administratorul datelor (executorul), care execut efectiv cererea (primete planurile de execuie furnizate de modulul de optimizare i le execut). Execuia presupune cutarea blocurilor ce conin datele i transferul blocurilor n memoria cache.

Ideea general: cerere arbore algebric (nu este unic) plan de executie optimizare Un plan de execuie implic o secven de pai pentru evaluarea cererii (n mod obinuit, fiecare pas din planul de execuie corespunde unei operaii relaionale) precum i metoda care va fi folosit pentru evaluarea operaiei. De obicei, pentru o operaie relaional dat, exist mai multe metode ce pot fi folosite pentru evaluarea acesteia. Dou planuri de execuie diferite care au ntotdeauna acelai rezultat se numesc echivalente. Planuri de execuie echivalente pot avea diferite costuri. Scopul optimizrii cererilor este de a gsi, printre diversele planuri de execuie echivalente, pe acela de cost minim. ntr-un sistem centralizat, costul evalurii unei cereri este suma a dou componente, costul I/O (transferuri de date) i costul CPU (verificare de condiii, operaii join etc.).

33

Ordinea de execuie a operaiilor


O interogare const dintr-un numr de operaii. Ordinea n care se efectueaz operaiile are un rol important n evaluarea costului necesar realizrii interogrii. Exist dou modaliti de abordare pentru a determina ordinea de execuie a operaiilor: algebric; bazat pe estimarea costului. Ambele folosesc o mulime de reguli care permit transformarea unui plan de execuie (reprezentat ca o expresie scris n termenii algebrei relaionale) n altul, echivalent. Optimizarea cererilor bazat pe algebra relaional se realizeaz n dou etape: se exprim cererile sub forma unor expresii algebrice relaionale; se aplic acestor expresii transformri algebrice care conduc la expresii echivalente, dar care vor fi executate mai eficient. Procesul de transformare a cererilor se realizeaz conform unei strategii de optimizare care poate s fie: independent de modul de memorare a datelor (strategie general); dependent de modul de memorare (strategie specific unui anumit SGBD).

Proprietile operatorilor algebrei relaionale


Proprietatea 1. Comutativitatea operaiilor de join i produs cartezian: JOIN(R1, R2) = JOIN(R2, R1) R1 R2 = R2 R1 Proprietatea 2. Asociativitatea operaiilor de join i produs cartezian: JOIN(JOIN(R1, R2), R3) = JOIN(R1, JOIN(R2, R3)) (R1 R2) R3 = R1 (R2 R3) Proprietatea 3. Compunerea proieciilor: A1,...,Am (B1,...,Bn (R)) = A1,...,Am (R), unde {A1, A2,...,Am } {B1, B2,...,Bn }. Proprietatea 4. Compunerea seleciilor: cond1 (cond2 (R)) = cond1cond2 (R) = cond2 ( cond1 (R)), unde am notat prin cond condiia dup care se face selecia.

34

Proprietatea 5. Comutarea seleciei cu proiecia: A1,...,Am (cond (R)) = cond (A1,...,Am (R)), unde condiia dup care se face selecia implic numai atributele A1 ,...,Am. Dac condiia implic i atributele B1,...,Bn , care nu aparin mulimii {A1,...,Am}, atunci: A1,...,Am (cond (R)) = A1,...,Am (cond (A1,...,Am,B1,...,Bn (R))) Proprietatea 6. Comutarea seleciei cu produsul cartezian: Dac toate atributele menionate n condiia dup care se face selecia sunt atribute ale relaiei R1, atunci: cond (R1 R2) = cond (R1) R2 Dac condiia este de forma cond1cond2 i dac cond1 implic numai atribute din R1, iar cond2 implic numai atribute din R2, atunci cond (R1 R2) = cond1 (R1) cond2 (R2) Dac cond1 implic numai atribute din R1, iar cond2 implic atribute att din R1 ct i din R2, atunci: cond (R1 R2) = cond2 (cond1 (R1) R2) Proprietatea 7. Comutarea seleciei cu reuniunea: cond (R1 R2) = cond (R1) cond (R2) Proprietatea 8. Comutarea seleciei cu diferena: cond (R1 R2) = cond (R1) cond (R2) Proprietatea 9. Comutarea proieciei cu reuniunea: A1,...,Am (R1 R2) = A1,...,Am (R1) A1,...,Am (R2) Proprietatea 10. Comutarea proieciei cu produsul cartezian: Dac A1,...,Am este o list de atribute ce apar n schemele relaionale R1 i R2 i dac lista este format din atribute aparinnd lui R1 (notate prin B1,...,Bn ) i din atribute aparinnd lui R2 (notate prin C1 ,...,Ck ) atunci: A1,...,Am (R1 R2) = B1,...,Bn (R1) C1,...,Ck (R2) Proprietatea 11. Compunerea proieciei cu operaia join: Dac A1,...,Am este o list de atribute ce apar n schemele relaionale R1 i R2 i dac lista este format din atribute aparinnd lui R1 (notate prin B1,...,Bn ) i din atribute aparinnd lui R2 (notate prin C1 ,...,Ck ) atunci: A1,...,Am (JOIN(R1,R2,D)) = A1,...,Am (JOIN(D,B1,...,Bn(R1), D,C1,...,Ck(R2),D), unde am notat prin JOIN(R1, R2, D) operaia de compunere natural ntre R1 i R2 dup atributul comun D.

35

Proprietatea 12. Compunerea seleciei cu operaia join: cond (JOIN (R1, R2, D)) = cond (JOIN ( D,A (R1), D,A (R2), D)), unde A reprezint atributele care apar n condiia dup care se face selecia.

Reguli de optimizare frecvent folosite:


Regula de optimizare 1. Seleciile se execut ct mai devreme posibil. Motivaia acestei reguli este c seleciile reduc substanial dimensiunea relaiilor. Regula de transformare 4 poate fi folosit pentru a separa dou sau mai multe selecii n selecii individuale care pot fi distribuite join-ului sau produsului cartezian folosind comutarea seleciei cu join-ul. Regula de optimizare 2. Produsurile carteziene se nlocuiesc cu joinuri, ori de cte ori este posibil. Un produs cartezian ntre dou relaii este de obicei mult mai scump (ca i cost) dect un join ntre cele dou relaii, deoarece primul genereaz concatenarea tuplurilor n mod exhaustiv i poate genera un rezultat foarte mare. Aceast transformare se poate realiza folosind legtura dintre produs cartezian, join i selecie. Regula de optimizare 3. Dac sunt mai multe join-uri atunci cel care se execut primul este cel mai restrictiv. Un join este mai restrictiv dect altul dac produce o relaie mai mic. Se poate determina care join este mai restrictiv pe baza factorului de selectivitate sau cu ajutorul informaiilor statistice. Algebric, acest lucru se poate realiza folosind regula de transformare 2. Regula de optimizare 4. Proieciile se execut la nceput pentru a ndeprta atributele nefolositoare. Dac un atribut al unei relaii nu este folosit n operaiile ulterioare atunci trebuie ndeprtat. n felul acesta se va folosi o relaie mai mic n operaiile ulterioare. Aceasta se poate realiza folosind comutarea proieciei cu join-ul. Exemple curs!!!

36

Regulile lui Codd


Caracteristici ale modelului relaional: nu exist tupluri identice; ordinea liniilor i a coloanelor este arbitrar; articolele unui domeniu sunt omogene; fiecare coloan definete un domeniu distinct i nu se poate repeta n cadrul aceleiai relaii; toate valorile unui domeniu corespunztoare tuturor cazurilor nu mai pot fi descompuse n alte valori (sunt atomice). Avantajele modelului relaional: fundamentare matematic riguroas; independen fizic a datelor; posibilitatea filtrrilor; existena unor structuri de date simple; realizarea unei redundane minime; suplee n comunicarea cu utilizatorul neinformatician. Ca limite ale modelului relaional putem meniona: rmne totui redundan, ocup spaiu, apar fenomene de inconsisten, nu exist mecanisme pentru tratarea optim a cererilor recursive, nu lucreaz cu obiecte complexe, nu exist mijloace perfecionate pentru exprimarea constrngerilor de integritate, nu realizeaz gestiunea totala a datelor distribuite, nu realizeaz gestiunea cunotinelor. n anul 1985, E.F. Codd a publicat un set de 13 reguli n raport cu care un sistem de gestiune a bazelor de date poate fi apreciat ca relaional. Nici un sistem de gestiune a bazelor de date pus n vnzare pe piaa comercial nu respect absolut toate regulile definite de Codd, dar acest lucru nu mpiedic etichetarea acestor sisteme drept relaionale.

37

Nu trebuie apreciat un SGBD ca fiind relaional sau nu, ci msura n care acesta este relaional, deci numrul regulilor lui Codd pe care le respect. Regula 1 regula gestionrii datelor. Un SGBD relaional trebuie s fie capabil s gestioneze o baz de date numai prin posibilitile sale relaionale. Regula 2 regula reprezentrii informaiei. ntr-o baz de date relaional, informaia este reprezentat la nivel logic sub forma unor tabele ce poart numele de relaii. Regula 3 regula accesului garantat la date. Fiecare valoare dintr-o baz de date relaional trebuie s poat fi adresat n mod logic printr-o combinaie format din numele relaiei, valoarea cheii primare i numele atributului. Regula 4 regula reprezentrii informaiei necunoscute. Un sistem relaional trebuie s permit utilizatorului definirea unui tip de date numit null pentru reprezentarea unei informaii necunoscute la momentul respectiv. Regula 5 regula dicionarelor de date. Asupra descrierii bazelor de date (informaii relative la relaii, vizualizri, indeci etc.) trebuie s se poat aplica aceleai operaii ca i asupra datelor din baza de date. Regula 6 regula limbajului de interogare. Trebuie s existe cel puin un limbaj pentru prelucrarea bazei de date. Regula 7 regula de actualizare a vizualizrii. Un SGBD trebuie s poat determina dac o vizualizare poate fi actualizat i s stocheze rezultatul interogrii ntr-un dicionar de tipul unui catalog de sistem. Regula 8 regula limbajului de nivel nalt. Regulile de prelucrare asupra unei relaii luat ca ntreg sunt valabile att pentru operaiile de regsire a datelor, ct i asupra operaiilor de inserare, actualizare i tergere a datelor. Regula 9 regula independenei fizice a datelor: Programele de aplicaie i activitile utilizatorilor nu depind de modul de depunere a datelor sau de modul de acces la date. Regula 10 regula independenei logice a datelor. Programele de aplicaie trebuie s fie transparente la modificrile de orice tip efectuate asupra datelor. Regula 11 regula independenei datelor din punct de vedere al integritii. Regulile de integritate trebuie s fie definite ntr-un sublimbaj relaional, nu n programul de aplicaie.

38

Regula 12 regula independenei datelor din punct de vedere al distribuirii. Distribuirea datelor pe mai multe calculatoare dintr-o reea de comunicaii de date, nu trebuie s afecteze programele de aplicaie. Regula 13 regula versiunii procedurale a unui SGBD. Orice component procedural a unui SGBD trebuie s respecte aceleai restricii de integritate ca i componenta relaional. Deoarece regulile lui Codd sunt prea severe pentru a fi respectate de un SGBD operaional, s-au formulat criterii minimale de definire a unui sistem de gestiune relaional. Un SGBD este minimal relaional dac: toate datele din cadrul bazei sunt reprezentate prin valori n tabele; nu exist pointeri observabili de ctre utilizator; sistemul suport operatorii relaionali de proiecie, selecie i compunere natural, fr limitri impuse din considerente interne. Un SGBD este complet relaional dac este minimal relaional i satisface n plus condiiile: sistemul suport restriciile de integritate de baz (unicitatea cheii primare, constrngerile refereniale, integritatea entitii). sistemul suport toate operaiile de baz ale algebrei relaionale.

NORMALIZAREA RELAIILOR
n procesul modelrii unei baze de date relaionale, o etap important o reprezint normalizarea relaiilor conceptuale (Codd, 1972), adic obinerea de relaii molecularefr a pierde nimic din informaie pentru a elimina: redundana; anomaliile reactualizrii informaiilor. Tehnica normalizrii permite obinerea unei scheme conceptuale rafinate printr-un proces de ameliorare progresiv a unei scheme conceptuale iniiale a bazei de date relaionale. Dup fiecare etap de ameliorare, relaiile bazei de date ating un anumit grad de perfeciune, deci se afl ntr-o anumit form normal. Trecerea unei relaii dintr-o form normal n alta, presupune eliminarea unei anumit tip de dependene nedorite, care sunt transformate n dependene admisibile, adic dependene care nu provoac anomalii.

39

Procesul de ameliorare a schemei conceptuale trebuie: s garanteze conservarea datelor, adic n schema conceptual final trebuie s figureze toate datele din cadrul schemei iniiale; s garanteze conservarea dependenelor dintre date, adic n schema final fiecare dependen trebuie s aib determinantul i determinatul n schema aceleiai relaii; s reprezinte o descompunere minimal a relaiilor iniiale, adic nici una din relaiile care compun schema final nu trebuie s fie coninut ntr-o alt relaie din aceast schem.

Exist dou metode pentru a modela baze de date relaionale fr anomalii sau pierderi de informaie. Schema descompunerii pleac de la o schem relaional universal ce conine toate atributele BD. Schema se descompune prin proiecii succesive n subrelaii. Descompunerea se oprete cnd continuarea ei ar duce la pierderi de informaie. Algoritmii de descompunere se bazeaz, n general, pe descrierea formal a dependenei dintre atribute. Schema sintezei pleac de la o mulime de atribute independente. Utiliznd proprieti de semantic i legturi ntre atribute se pot compune noi relaii, astfel nct, acestea s nu sufere de anumite anomalii. Algoritmii se bazeaz, n general, pe teoria grafurilor pentru a reprezenta legtura ntre atribute.

Dependene funcionale
O relaie universal este o relaie ce grupeaz toate atributele care modeleaz sistemul real cercetat. Fie E, mulimea dependenelor considerate de proiectantul bazei pentru o schem relaional sau pentru o relaie universal. Plecnd de la o mulime de proprieti formale ale dependenelor, proprieti considerate drept reguli de deducie (axiome), poate fi obinut mulimea maximal de dependene asociate lui E. Aceast mulime definete nchiderea lui E. Fie E mulimea dependenelor unei relaii i p 1, p 2, ..., p r, r 1, proprieti formale ale acestor dependene. Dac exist o mulime E, astfel nct orice dependen a mulimii E este derivabil din E prin aplicarea proprietilor p 1, p2 , ..., pr , atunci mulimea E definete acoperirea lui E pentru proprietile p1 , p 2, ..., p r. E este o acoperire minimal pentru E, dac nu exist nici o submulime proprie, nevid a lui E care s fie o acoperire pentru E.

40

Evident, E i E au nchideri identice, deci dispun de acelai potenial informaional! Fie R(A1 , A2 , ..., An ) o schem relaional i fie X, Y submulimi de atribute ale lui R. X determin funcional Y sau Y depinde funcional (FD) de X, dac pentru orice relaie r (valoare curent a lui R) nu exist dou tupluri care s aib aceleai valori pentru atributele lui X i s aib valori diferite pentru cel puin un atribut din Y. Cu alte cuvinte, o valoare a lui X, determin unic o valoare a lui Y. Notaia utilizat pentru desemnarea dependenei funcionale este X Y. X este numit determinant, iar Y este numit determinat (sau dependent). Dependena funcional X Y este trivial dac Y X. Comparnd toate submulimile de atribute ale unei relaii i determinnd legturile dintre ele, se pot obine toate dependenele funcionale pe care o relaie le satisface. Aceast abordare nu este eficient, consumnd mult timp. Exist posibilitatea ca, tiind anumite dependene funcionale i utiliznd reguli de deducie, s fie obinute toate dependenele funcionale. Fie X, Y, Z, W mulimi de atribute ale unei scheme relaionale R i fie urmtoarele axiome: Ax1 reflexivitate. X X. Mai general, dac Y X, atunci X Y. Ax2 creterea determinantului. Pot fi considerate urmtoarele formulri echivalente pentru aceast axiom.
1. 2. 3. 4.

Dac X Y i X Z, atunci Z Y. Dac X Y i W Z, atunci X Z Y W. Dac X Y atunci X Z Y Z. Dac X Y atunci X Z Y.

Ax3 tranzitivitate. Dac X Y i Y Z, atunci X Z. O mulime de axiome este complet dac i numai dac plecnd de la o mulime de dependene E se pot obine toate dependenele nchiderii lui E, utiliznd axiomele mulimii. O mulime de axiome este nchis dac i numai dac plecnd de la o mulime de dependene E, nu poate fi dedus cu ajutorul axiomelor o dependen care nu aparine nchiderii lui E. (nu obin altele!) Ullman a demonstrat c axiomele Ax1 Ax3, numite axiomele lui Amstrong, reprezint o mulime nchis i complet de axiome. Consecina

41

acestui rezultat este c nchiderea lui E reprezint mulimea dependenelor deduse din E, prin aplicarea axiomelor lui Amstrong!!! Nu toate dependenele funcionale sunt folositoare pentru modelarea relaional. O dependen funcional X Y se numete dependen funcional total (FT), dac i numai dac nu exist nici o submulime proprie X X, astfel nct X Y. Dac exist o submulime proprie X X, astfel nct X Y, atunci dependena funcional X Y este parial. n axioma Ax2, dependena Z Y este o dependen funcional parial. n cazul dependenei funcionale totale, axiomele lui Amstrong se reduc la o axiom unic i anume pseudo-tranzitivitatea: dac X Y i W Y Z, atunci W X Z. Aceast axiom este o regul de deducie complet pentru total dependene: pseudo-tranzitivitatea implic tranzitivitatea (W = ); reflexivitatea nu poate fi utilizat pentru a obine dependene totale; reflexivitatea i pseudo-tranzitivitatea implic creterea.

Dac F este o mulime de dependene funcionale totale, atunci nchiderea pseudo-tranzitiv F+ a acestei mulimi este reuniunea mulimilor dependenelor funcionale totale care pot fi obinute din F folosind axioma de pseudo-tranzitivitate. Dou mulimi de dependene funcionale totale sunt echivalente dac au nchideri pseudo-tranzitive identice. Pentru a modela scheme relaionale se consider mulimi minimale de dependene funcionale totale, capabile s genereze toate nchiderile pseudo-tranzitive. Aceste mulimi definesc acoperiri minimale. O mulime de dependene funcionale totale F* asociat unei mulimi de atribute A definete o acoperire minimal dac satisface urmtoarele proprieti: nici o dependen funcional din F* nu este redundant; toate dependenele funcionale totale ntre submulimi ale lui A sunt n nchiderea pseudo-tranzitiv a lui F*. Orice mulime de dependene totale are cel puin o acoperire minimal. Alegerea acoperirii minimale este punctul de start n modelarea schemelor relaionale.

42

Dependenele funcionale ntre atributele bazei pot fi reprezentate grafic. Fie A = {A1 , A2, ..., An } o mulime de atribute i fie o mulime de dependene funcionale {Xi Aj}, unde Xi este o submulime a lui A. Graful dependenelor funcionale este un graf direcionat bipartit, definit astfel: 1. pentru fiecare atribut A j exist un singur nod avnd eticheta A j ;
2. 3.

pentru fiecare dependen funcional de forma A i A j, exist un arc de la Ai la Aj; pentru fiecare dependen funcional de forma X i A j, unde mulimea Xi este definit de X i = {Ai 1 , ..., Ai p } cu p > 1, exist un nod auxiliar etichetat prin Xi i o mulime de arce plecnd de la Ai1 , ..., Ai p pentru a obine pe Xi i printr-un arc adiional de la Xi la Aj. Nodurile Xi se reprezint prin dreptunghiuri.

Exemplu: 1. Graful dependenelor funcionale pentru schema relaional CONSUMATOR_DE_VIN(W#, localitate, varsta, calitate, regiune, tara, D#, nume, data, cantitate) i acoperirea minimal.
localitate W# calitate varsta regiune tara data D# nume localitate W# calitate varsta cantitate

43

regiune tara data D# nume cantitate

2. Graful dependenelor funcionale pentru schema relaional OBIECTIV_INVESTITIE. Dependentele sunt deduse din regulile impuse de beneficiar!
aria_construita denumire nr_certificat_urbanizare cod_obiectiv# adresa nr_contract nr_aut_construtie cod_contractant

Necesitatea normalizrii
Anomaliile care apar n lucrul cu baza de date se produc datorit dependenelor care exist ntre datele din cadrul relaiilor bazei de date. Dependenele sunt plasate greit n tabele!!! Avion A# 1 2 3 4 5 6 nume AIRBUS AIRBUS AIRBUS CAR B707 B707 capacitate 250 250 250 100 150 150 localitate PARIS PARIS LONDRA PARIS LONDRA LONDRA

Constrngere: toate avioanele cu acelai nume au aceeai capacitate. Datorit dependenei introduse pot exista: anomalii la inserare, modificare sau tergere, redundan n date, probleme de reconexiune.

44

1. 2.

Redundan logic. Cuplul (AIRBUS, 250) apare de trei ori. Anomalie la inserie. S-a cumprat un B727 cu 150 locuri. El poate fi inserat n relaia AVION doar dac se definete o nou valoare pentru cheia primar. Anomalie la tergere. Dac este tears nregistrarea pentru care A# este 4, atunci se pierde informaia c un avion CAR are capacitatea 100. Anomalie la modificare. Dac se modific capacitatea lui B707 de la 150 la 170, atunci costul modificrii este mare pentru a modifica toate nregistrrile, iar dac se modific doar o nregistrare atunci constrngerea nu va mai fi verificat. Problema reconexiunii. Considerm schemele relaionale: AVION1 = PROJECT(AVION, A#, nume) AVION22 = PROJECT(AVION, nume, capacitate, localitate) AVION3 = JOIN(AVION1, AVION2). Se observ c schema AVION3 este diferit de AVION. Apare un tuplu nou: (3, AIRBUS, 250, PARIS).

3.

4.

5.

Anomaliile au aprut datorit dependenei funcionale (constrngerii) introduse anterior!!! Normalizarea are drept scop: suprimarea redundanei logice, evitarea anomaliilor la reactualizare, rezolvarea problemei reconexiunii.

Exist o teorie matematic a normalizrii al crei autor este E.F. Codd. Soluia: construirea unor tabele standard (forme normale). Normalizarea este procesul reversibil de transformare a unei relaii, n relaii de structur mai simpl. Procesul este reversibil n sensul c nici o informaie nu este pierdut n timpul transformrii. O relaie este ntr-o form normal particular dac ea satisface o mulime specificat de constrngeri. Procesul normalizrii se realizeaz plecnd de la o relaie universal ce conine toate atributele sistemului de modelat, plus o mulime de anomalii. Orice form normal se obine aplicnd o schem de descompunere. Exist dou tipuri de descompuneri. Descompuneri ce conserv dependenele. Aceast descompunere presupune desfacerea relaiei R n proieciile R 1 , R2 , ..., Rk , astfel nct dependenele lui R sunt echivalente (au

45

nchideri pseudo-tranzitive identice) cu reuniunea dependenelor lui R1 , R 2 , ..., Rk . Descompuneri fr pierderi de informaie (L-join). Aceast descompunere presupune desfacerea relaiei R ntr-o mulime de proiecii R1 , R2 , ..., Rj, astfel nct pentru orice realizare a lui R este adevrat relaia: R = JOIN(B1 (R), B2 (R), ...,Bj (R)) unde, pentru 1 k j, B k reprezint mulimea atributelor corespunztoare proieciei R k (Rk = Bk (R)). Prin urmare, relaia iniial poate fi reconstruit considernd compunerea natural a relaiilor obinute prin descompunere. Formele normale sunt obinute prin descompuneri fr pierderi de informaie. O descompunere fr pierdere de informaie, utilizat n procesul normalizrii, este dat de regula Casey-Delobel: Fie R(A) o schem relaional i fie , , o partiie a lui A. Presupunem c determin funcional pe . Atunci: R(A) = JOIN( (R), (R)). mulimea atributelor care intervin n dependenele funcionale; reprezint reuniunea determinantului cu restul atributelor lui A.
Relatia universala FN1 FN2 FN3 BCNF FN4 FN5

Pentru exemplul analizat anterior: = {nume}, = {capacitate}, = {A#, localitate}. Aplicnd Casey-Delobel se obin schemele: AVION1(nume#, capacitate) AVION2)A#, nume, localitate).

46

Se observ c anomaliile comentate au disprut! AVION1 Nume AIRBUS CAR B707 Capacitate 150 100 150

AVION2 A# Nume 1 AIRBUS 2 AIRBUS 3 AIRBUS 4 CAR 5 B707 6 B707

Localitate PARIS PARIS LONDRA PARIS LONDRA LONDRA

Forma normal (FN1)


O relaie este n prima form normal dac fiecrui atribut care o compune i corespunde o valoare indivizibil (atomic). Exemplu: variante pentru a implementa FN1 pentru tabelul MASINA:
Persoana Eu Tu El noi Varianta 1 Persoana Eu Eu Eu Tu El El Noi Noi Noi Noi Vehicul R25 W14 R21 205 R5 305 BX 305 R12 R25 Vehicul R25 - W14 - R21 205 R5 - 305 BX - 305 - R12 - R25

47

Varianta 2 Persoana Eu Tu El Noi Prima R25 205 R5 BX 305 305 R12 R25 Doi W14 Trei R21 Patru

Varianta 3 (4 tabele) Masina 31 (similar se definesc Masina_32, Masina_33, Masina_34).. Persoana Eu Tu El Noi Masina_34 Persoana Noi Vehicul R25 Vehicul R25 205 R5 BX

Forma normal 2 (FN2)


O relaie R este n a doua form normal dac i numai dac: relaia R este n FN1; fiecare atribut care nu este cheie (nu particip la cheia primar) este dependent de ntreaga cheie primar.
Job_cod Programator Programator Programator Vanzator Inginer Nr_proiect# P1 P2 P3 P3 P3 Functia Supervizor Cercetator Auxiliar Supervizor Supervizor Suma 60 25 10 60 60

atasat_la Cod_salariat# S1 S1 S1 S3 S5 atasat_2a Cod_salariat# S1 S1 S1 S3 Nr_proiect# P1 P2 P3 P3 Functia Supervizor Cercetator Auxiliar Supervizor Suma 60 25 10 60

48

S5 atasat_2b Cod_salariat# S1 S3 S5

P3

Supervizor

60

Job_cod Programator Vanzator Inginer

A doua condiie exprim necesitatea total dependenei de cheia primar. Aceast form normal interzice manifestarea unor dependene funcionale pariale n cadrul relaiei R!!! Pentru a obine o relaie FN2 se poate aplica regula Casey-Delobel. Fie relaia R(K1, K2, X, Y), unde K1 i K2 definesc cheia primar, iar X i Y sunt mulimi de atribute, astfel nct K1 X. Din cauza dependenei funcionale K1 X care arat c R nu este n FN2, se nlocuiete R (fr pierdere de informaie) prin dou proiecii R1(K1, K2, Y) i R2(K1, X).
K1 K2

Exemplu. Presupunem c un antier poate executa mai multe lucrri de baz i c o lucrare poate fi executat de mai multe antiere. LUCRARE(cod_obiectiv#, cod_lucrare#, nume); SANTIER(nr_santier#, specialitate, sef); EXECUTA(cod_obiectiv#, cod_lucrare#, nr_santier#, descriere, functie, conducator, data_inceput, data_sfarsit). Pentru relaia EXECUTA sunt evidente dependenele: {cod_obiectiv#, cod_lucrare#} {data_inceput, data_sfarsit}, {cod_obiectiv#, cod_lucrare#, nr_santier#} {descriere, functie, conducator}.

49

Relaia EXECUTA este n FN1, dar nu este n FN2 deoarece atributele data_inceput i data_sfarsit nu depind de numrul antierului, deci nu depind de ntreaga cheie primar. Pentru a obine o relaie n FN2 se aplic regula Casey Delobel i relaia EXECUTA se desface n: EXECUTA_1(cod_obiectiv#, cod_lucrare#, nr_santier#, descriere, functie, conducator) EXECUTA_2(cod_obiectiv#, cod_lucrare#, data_inceput, data_sfarsit).

Forma normal 3 (FN3)


relaia R este n FN2;

Intuitiv, o relaie R este n a treia form normal dac i numai dac: fiecare atribut care nu este cheie (nu particip la o cheie) depinde direct de cheia primar.

Fie R o relaie, X o submulime de atribute ale lui R i A un atribut al relaiei R. A este dependent tranzitiv de X dac exist Y astfel nct X Y i Y A (A nu aparine lui Y i Y nu determin pe X). X nu este dependent funcional de Y sau A! De exemplu, dac K 1 , K 2 , K 3 A1 i dac K 1 , K 2 , A1 A2 , atunci K 1 , K 2 , K 3 K 1 , K 2 , A1 i K 1 , K 2 , A 1 A2 . Prin urmare, A2 este dependent tranzitiv de K 1 , K 2 , K 3 . Formal, o relaie R este n a treia form normal dac i numai dac: relaia R este n FN2; fiecare atribut care nu este cheie (nu particip la o cheie) nu este dependent tranzitiv de nici o cheie a lui R.

O relaie este n FN3 dac i numai dac fiecare atribut (coloan) care nu este cheie, depinde de cheie, de ntreaga cheie i numai de cheie. Pentru a obine o relaie FN3 se poate aplica regula Casey-Delobel. Fie relaia R(K, X1 , X2 , X3 ), unde atributul X2 depinde tranzitiv de K, iar K este cheia primar a lui R. Presupunem c K X1 X 2 . Din cauza dependenei funcionale X 1 X 2 care arat c R nu este n FN3, se nlocuiete R (fr pierdere de informaie) prin dou proiecii R1(K, X1 , X 3 ) i R2(X 1 , X2 ). K X1 X3 X2

50

Exemplu: Tabelul atasat_2a nu este in FN3. De ce?


atasat_3a Cod_salariat# S1 S1 S1 S3 S5 atasat_3b Functia Supervizor Cercetator Auxiliar Suma 60 25 10 Nr_proiect# P1 P2 P3 P3 P3 Functia Supervizor Cercetator Auxiliar Supervizor Supervizor

Exemplu. n tabelul EXECUTA1(cod_obiectiv#, cod_lucrare#, nr_santier#, descriere, functie, conducator) continu s existe redundan n date. Atributul conducator depinde indirect de cheia primar prin intermediul atributului functie. ntre atributele relaiei exist dependenele: {cod_obiectiv#, cod_lucrare#, nr_santier#} {descriere}, {cod_obiectiv#, cod_lucrare#, nr_santier#} {functie} {conducator}. Pentru a aduce relaia EXECUTA_1 n FN3 se aplic regula CaseyDelobel. Relaia se desface, prin eliminarea dependenelor funcionale tranzitive, n proieciile: EXECUTA11(cod_obiectiv#, cod_lucrare#, nr_santier#, descriere, functie) EXECUTA12(functie, conducator).

Schema de sintez pentru obinerea lui FN3


Algoritmul de sintez construiete o acoperire minimal F a dependenelor funcionale totale. Se elimin atributele i dependenele funcionale redundante. Mulimea F este partiionat n grupuri Fi , astfel nct n fiecare grup Fi sunt dependene funcionale care au acelai membru stng i nu exist dou grupuri avnd acelai membru stng. Fiecare grup Fi produce o schem FN3. Algoritmul realizeaz o descompunere ce conserv dependenele. Algoritm SNF3 (aducerea unei relaii n FN3 prin utilizarea unei scheme de sintez):

51

1. 2.

3.

4.

5.

6.

Se determin F o acoperire minimal a lui E (mulimea dependenelor funcionale). Se descompune mulimea F n grupuri notate Fi , astfel nct n cadrul fiecrui grup s existe dependene funcionale avnd aceeai parte stng. Se determin perechile de chei echivalente (X, Y) n raport cu F (dou mulimi de atribute X, Y sunt chei echivalente dac n mulimea de dependene E exist att dependena X Y, ct i dependenta Y X). Pentru fiecare pereche de chei echivalente: se identific grupurile Fi i F j care conin dependenele funcionale cu partea stng X i respectiv Y; se formeaz un nou grup de dependene Fi j, care va conine dependenele funcionale avnd membrul stng (X, Y); se elimin grupurile Fi i Fj , iar locul lor va fi luat de grupul Fi j. Se determin o acoperire minimal a lui F, care va include toate dependenele X Y, unde X i Y sunt chei echivalente (celelalte dependene sunt redundante). Se construiesc relaii FN3 (cte o relaie pentru fiecare grup de dependene funcionale).

Se observ c algoritmul solicit determinarea unei acoperiri minimale (algoritmii EAR i EDF); determinarea nchiderii (A + ) unei mulimi de atribute A n raport cu mulimea de dependene funcionale E (algoritm AIDF). Determinarea acoperirii minimale presupune eliminarea atributelor i dependenelor redundante. Acoperirea minimal nu este unic i depinde de ordinea n care sunt eliminate aceste atribute i dependene redundante. Algoritm EAR (elimin atributele redundante din determinantul dependenelor funcionale) Pentru fiecare dependen funcional din E i pentru fiecare atribut din partea stng a unei dependene funcionale: Pas1. Se elimin atributul considerat. Pas2. Se calculeaz nchiderea prii stngi reduse. Pas3. Dac nchiderea conine toate atributele din determinantul dependenei, atunci atributul eliminat la pasul 1 este redundant i rmne eliminat. n caz contrar, atributul nu este redundant i se reintroduce n partea stng a dependenei funcionale.

52

Algoritm EDF (elimin dependenele funcionale redundante din E) Pentru fiecare dependen funcional X Y din E: Pas1. Se elimin dependena din E. Pas2. Se calculeaz nchiderea X + , n raport cu mulimea redus de dependene. Pas3. Dac Y este inclus n X + , atunci dependena X Y este redundant i rmne eliminat. n caz contrar, se reintroduce n E. Algoritm AIDF (determin nchiderea lui A) Pas1. Se caut dac exist n E dependene X Y pentru care determinantul X este o submulime a lui A, iar determinatul Y nu este inclus n A. Pas2. Pentru fiecare astfel de dependen funcional se adaug mulimii A atributele care constituie determinatul dependenei. Pas3. Dac nu mai exist dependene funcionale de tipul de la pasul 1, atunci A + = A. Exemplu: Fie dependenele funcionale: f1: F N; F4: P C; f2: F P; f5: P T; f3: P, F, N U; f6: C T; f7: N F.

Pas1 (suprimarea atributelor redundante). Atributul A i este redundant n dependena funcional A 1, A 2 , A i , A n Z, dac dependena funcional A 1, A 2 , A i 1 , A i + 1 A n Z poate fi generat plecnd de la mulimea iniial de dependene (E) i de la axiomele considerate. f1: F N; f3: P, F, N U sau N, P, F U; Aplicnd axioma de pseudotranzitivitate se obine: F, P, F U P, F U Pas2 (suprimarea dependenelor funcionale redundante). Dependena funcional f este redundant n E dac E + = (E - f) + , unde E + reprezint nchiderea lui E. Se observ c f5 este redundant (poate fi obinut din f4 i f6). La sfritul etapei se obine: f1: F N; f2: F P; f3: P, F U; P este redundant =>F-->U

53

f4: P C;

f6: C T;

f7: N F.

Pas3 (gruparea dependenelor avnd acelai membru stng). F1 = {f1, f2, f3}; F2 = {f4}; F3 = {f6}; F4 = {f7} Pas4 (regruparea mulimilor F i si F j dac exist dependene de forma X Y i Y X, unde X reprezinta partea stanga a dependenei lui F i i Y este partea stng a dependenei lui F j . Din F1 i F4 se obine: G1 = {f1, f2, f3, f7}; G2 = {f4}; G3 = {f6}. Pas5 (generarea relaiilor FN3). R1(F#, N, P, U); R2(P#, C); R3(C#, T). De remarcat: R1 nu este in BCNF! De ce? Exista dependenta N -->F. Exerciiu: Presupunem c o parte din activitiile de pe un aeroport sunt caracterizate de atributele: A -- numr zbor; B -- tip avion; C -- aeroport plecare; D -- aeroport sosire; E -- linia aerian; F -- ora plecrii; G -- capacitate; H -- numr locuri rezervate; I -- data; J -- tarif; K -- prestaii la bord. ntre aceste atribute exist legturi exprimate prin dependenele: A BEFG ACDI H CD J CDF K BG CF ABE AC D ABD C EG B

54

Aplicnd algoritmul de sintez se obin relaiile: R1(B#, G) R2(E#, G#, B) R3(A#, B, E, F) R4(C#, D#, J) R5(A#, C#, I#, H) R6(A, C, D, F, K) n care cheile primare pot s fie oricare dintre: AD sau AC sau CF. ncercai s justificai acest rezultat!!!

Forma normal Boyce-Codd (BCNF)


Determinantul este un atribut sau o mulime de atribute neredundante, care constituie un identificator unic pentru alt atribut sau alt mulime de atribute ale unei relaii date. Intuitiv, o relaie R este n forma normal Boyce-Codd dac i numai dac fiecare determinant este o cheie candidat. Formal, o relaie R este n forma normal Boyce-Codd dac i numai dac pentru orice dependen funcional total X A, X este o cheie (candidat) a lui R. Regula Casey Delobel pentru R(K1#, K2#, X) presupunnd c exist dependena: X K2. R1(K1#, X) i R2(X#, K2)
K1 K2

Exemplu: ADRESA(cod_parsoana#, telefon#, adresa)


cod_persoana

adresa

55

telefon

n dependena adresa telefon se observ c determinantul nu este o cheie candidat. Relaia ADRESA se desface n: ADRESA_1(cod_persoana#, adresa); ADRESA_2(adresa#, telefon). Relaiile sunt n BCNF, se conserv datele, dar nu se conserv dependenele (s-a pierdut cod_persoana, telefon adresa). Exemplu: Relaia INVESTESTE_IN leag entitile INVESTITOR i OBIECTIV_INVESTITIE. Ea are schema relaional: INVESTESTE_IN(cod_contractant#, cod_obiectiv#, nr_contract, cota_parte). ntre atributele relaiei exist dependenele: {cod_contractant#, cod_obiectiv#} {nr_contract, cota_parte}, {nr_contract} {cod_obiectiv}. Se aplic regula Casey-Delobel i se aduce relaia n BCNF. INVESTESTE_IN_1(cod_obiectiv, nr_contract#); INVESTESTE_IN_2(cod_contractant#, nr_contract, cota_parte). Pentru ca o relaie s fie adus n BCNF nu trebuie n mod obligatoriu s fie n FN3. Se pot aduce n BCNF i relaii aflate n FN1 sau FN2. Acest lucru este posibil ntruct dependenele funcionale pariale i cele tranzitive sunt tot dependene noncheie, adic dependene ai cror determinani nu sunt chei candidat. Presupunem c R este o relaie ce conine atributele A. Algoritm TFBCNF (aducerea unei relaii R din FN1 n BCNF) 1. Dac relaia conine cel mult dou atribute, atunci R este n BCNF i algoritmul s-a terminat. 2. Dac relaia conine mai mult de dou atribute, se consider toate perechile (X, Y) de atribute distincte din A. + 3. Se determin A 1 , nchiderea mulimii A 1 = A {X, Y}.
4. 5.

Dac pentru orice pereche (X, Y), X A1 + atunci relaia R este n BCNF i algoritmul s-a terminat. n caz contrar (pentru cel puin o pereche (X, Y), X aparine lui A1 +), relaia R nu este n BCNF.

56

6.

Se reduce progresiv schema relaiei i se reia algoritmul, exploatnd relaia redus. Orice relaie obinut prin reducerea lui R i care este n BCNF se consider ca fcnd parte din descompunerea lui R n procesul aducerii sale n BCNF.

Forma normal 4 (FN4)


FN4 elimin redundanele datorate relaiilor m:n, adic datorate dependenei multiple. Intuitiv, o relaie R este n a patra form normal dac i numai dac relaia este n BCNF i nu conine relaii m:n independente. Fie R o relaie definit pe o mulime de atribute A = {A 1 , A 2 , ..., An } i fie X, Y, Z A. Se spune c X multidetermin pe Z sau c Z este multidependent de X : dac pentru fiecare valoare a lui Z n R exist numai o valoare pentru perechea (X, Y); dac valoarea lui Z depinde numai de valoarea lui X. Acest tip de dependen, numit i multivaloare sau multidependen (MVD) se noteaz prin X Z. Intuitiv, multidependena reprezint situaia n care valoarea unui atribut (sau a unei mulimi de atribute) determin o mulime de valori a altui atribut (sau mulimi de atribute)!!! Multidependena X Y poate fi gndit ca o regul de deducie: dac tuplurile <x, y, z> i <x, y, z> sunt n relaie la un moment r, atunci la momentul r sunt n relaie i tuplurile <x, y, z> i <x, y, z>.
x y z

x x x

y' y y'

z' z' z

Orice dependen funcional este o multidependen. Afirmaia invers nu este adevrat. Dac X Y (FD), atunci pentru oricare dou

57

tupluri <x, y, z> i <x, y, z>, se obine y = y. Prin urmare n relaie apar tuplurile <x, y, z> i <x, y, z> i deci X Y (MVD). Fie W, V, X, Y i Z submulimi de atribute ale unei scheme relaionale R. Fiind dat o mulime T de multidependene exist o mulime complet de axiome (Ax1Ax8) care permit obinerea tuturor multidependenelor ce se pot deduce din mulimea T: Ax1. Dac Y X, atunci X Y. Ax2. Dac X Y, atunci X Z Y Z. Ax3. Dac X Y i Y Z, atunci X Z. Ax4. Dac X Y, atunci X R {X Y}. Ax5. Dac X Y i V W, atunci W X V Y. Ax6. Dac X Y i Y Z, atunci X (Z Y). Ax7. Dac X Y, atunci X Y. Ax8. Dac X Y, Z W, W Y i Y Z = , atunci X W. O multidependen elementar este o multidependen care are pri stngi i drepte minimale (nu exist X X i Y Y a.i. X Y). Formal, relaia R este n a patra form normal dac i numai dac: R este n BCNF; orice dependen multivaloare este o dependen funcional. O relaie BCNF este n FN4 dac pentru orice multidependen elementar de forma X Y, X este o supercheie a lui R. Aducerea relaiilor n FN4 presupune eliminarea dependenelor multivaloare atunci cnd sunt mai mult de una n cadrul unei relaii. Regula de descompunere n relaii FN4. Fie R(X, Y, Z) o schem relaional care nu este n FN4 i fie X Y o multidependen elementar care nu este de forma CHEIE atribut. Aceast relaie este descompus prin proiecie n dou relaii: R = JOIN(XY (R), XZ (R)). Aplicnd recursiv aceast regul, se obin relaii FN4. Exemplu. Fie relaia INVESTITIE(cod_contractant#, denumire, telefon) i presupunem c un investitor poate avea mai multe numere de telefon i c poate investi n mai multe obiective. ntre atributele relaiei exist multidependenele: cod_contractant# denumire; cod_contractant# telefon.

58

Relaia INVESTITIE este n BCNF. Pentru a aduce relaia n FN4 o vom descompune prin proiecie n dou relaii: INVESTITIE_1(cod_contractant#, denumire), INVESTITIE_2(cod_contractant#, telefon). INVESTITIE = JOIN(INVESTITIE_1, INVESTITIE_2).

Forma normal 5 (FN5)


FN5 i propune eliminarea redundanelor care apar n relaii m:n dependente. n general, aceste relaii nu pot fi descompuse. S-a artat c o relaie de tip 3 este diferit de trei relaii de tip 2. Exist totui o excepie, i anume, dac relaia este ciclic Intuitiv, o relaie R este n forma normal 5 dac i numai dac: 1. relaia este n FN4; 2. nu conine dependene ciclice. Dependena funcional i multidependena permit descompunerea prin proiecie, fr pierdere de informaie, a unei relaii n dou relaii. Regulile de descompunere (FN1 FN4) nu dau toate descompunerile posibile prin proiecie ale unei relaii. Exist relaii care nu pot fi descompuse n dou relaii dar pot fi descompuse n trei, patru sau mai multe relaii fr a pierde informaii. Pentru a obine descompuneri L-join n trei sau mai multe relaii, s-a introdus conceptul de join-dependen sau dependen la compunere (JD). Fie {R1 , R2 , ..., Rp } o mulime de scheme relaionale care nu sunt disjuncte i a cror reuniune este R. R satisface join-dependena *{R 1 , R 2 , ..., Rp } dac la fiecare moment al lui R are loc egalitatea: R = JOIN(1 (R), 2 (R), ..., p (R)) unde k reprezint mulimea atributelor corespunztoare lui Rk (1 k p). Join-dependena *{R 1 , R 2 , ..., Rp } are loc n R, dac R1 , R2 , ..., Rp este o descompunere L-join a lui R. Pentru p = 2 se regsete multidependena. O join-dependen *{R1 , R2 , ..., Rp } n care una dintre R i este chiar R, definete o join-dependen trivial. Join-dependena generalizeaz multidependena. ntr-adevr, multidependena X Y n relaia R(X, Y, Z) (deci i X Z), corespunde join-dependenei *{X Y, X Z}. Invers, join-dependena *{R1 , R 2 } corespunde multidependenei R1 R2 R1 (R1 R2 ).

59

Formal, o relaie R este n FN5 dac i numai dac orice joindependen *{R 1 , R 2 , ..., Rp } care are loc n R fie este trivial, fie conine o supercheie a lui R (adic, o anumit component Ri este o supercheie a lui R). Cu alte cuvinte, o relaie R este n FN5 dac orice join-dependen definit pe R este implicat de cheile candidat ale lui R. ntre mulimile de atribute X, Y i Z din cadrul relaiei R exist o joindependen dac exist multidependene ntre fiecare dintre perechile de mulimi (X, Y), (Y, Z) i (X, Z). Aducerea n FN5 prin eliminarea join dependenelor! Exemplu. Fie schema R(furnizor, cod_consumabil, cantitate, pret). Reguli: un furnizor produce mai multe consumabile; nu toi furnizorii produc aceleai consumabile; preul unui consumabil de la un furnizor este variabil i nu depinde de cantitate.
Cod_consumabil 1 1 1 2 Cantitate 500 100 500 500 Pret 100 80 100 100

Furnizor F1 F2 F2 F2

Relaia este n FN4, dar exist redundan n date. Relaia se descompune prin proiecie n: R1(furnizor#, cod_consumabil#) R2(furnizor#, cantitate, pret) R3(cod_consumabil#, cantitate, pret). S-au eliminat redundanele: (F2,1) pentru R1; (F2, 500, 100) pentru R2; (1, 500, 100) pentru R3. Se observ c: JOIN(R1, R2) R; JOIN(R1, R3) R; JOIN(R3, R2) R; JOIN(R1, R2, R3) = JOIN(R1, JOIN(R2, R3)) = R

60

Exist join dependena: *{R1(furnizor, cod_consumabil), R3(cod_consumabil, cantitate, pret)} R2(furnizor, cantitate, pret),

Exemplu. Fie schema relaional: EXECUTANT(nr_santier#, cod_obiectiv#, cod_lucrare#, data_inceput, data_sfarsit). Un antier poate executa mai multe lucrri referitoare la acelai obiectiv sau poate executa o lucrare pentru un obiectiv n intervale de timp distincte. Se presupune c mai multe antiere pot executa aceeai lucrare, n acelai interval de timp sau n intervale de timp distincte. Relaia, datorit dependenelor formulate anterior, nu este n FN5. Ea se poate desface prin proiecie n trei relaii: EX1(nr_santier#, cod_obiectiv#, cod_lucrare#); EX2(nr_santier#, data_inceput, data_sfarsit); EX3(cod_obiectiv#, cod_lucrare#, data_inceput, data_sfarsit). Sunt evidente relaiile: EXECUTANT JOIN(EX1, EX2), EXECUTANT JOIN(EX1, EX3), EXECUTANT JOIN(EX2, EX3), EXECUTANT = JOIN(JOIN(EX1, EX2), EX3).

Concluzii:
1.

FN1 FN2 elimin redundanele datorate dependenei netotale a atributelor care nu particip la o cheie, fa de cheile lui R. Se suprim dependenele funcionale care nu sunt totale. FN2 FN3 elimin redundanele datorate dependenei tranzitive. Se suprim dependenele funcionale tranzitive. FN3 BCNF elimin redundanele datorate dependenei funcionale. Se suprim dependenele n care partea stng nu este o supercheie. BCNF FN4 elimin redundanele datorate multidependenei. Se suprim toate multidependenele care nu sunt i dependene funcionale.

2.

3.

4.

61

5.

FN4 FN5 elimin redundanele datorate dependentei. ciclice. Se suprim toate join-dependenele care nu sunt implicate de o cheie. BCNF, FN4 i FN5 corespund la regula c orice determinant este o cheie, dar de fiecare dat dependena cu care se definete determinantul este alta i anume dependena funcional, multidependena sau join-dependena). Descompunerea unei relaii FN2 n FN3 conserv datele i dependenele, pe cnd descompunerea unei relaii FN3 n BCNF i, respectiv, a unei relaii BCNF n FN4 conserv doar datele.

6.

7.

Cateva observaii i concluzii PROIECTAREA BAZELOR DE DATE

referitoare

la

reprezentrii conceptuale a bazei de date, care include identificarea tipurilor importante de entiti, relaii, atribute. 1) identificarea tipurilor de entiti (E); 2) identificarea tipurilor de relaii (R); 3) identificarea i asocierea atributelor (A) cu tipurile de E sau R; 4) determinarea domeniilor atributelor; 5) determinarea atributelor chei candidat i chei primare; 6) specializarea i generalizarea tipurilor de entiti; 7) desenarea diagramei E/R; 8) revizuirea modelului de date conceptual local, mpreun cu utilizatorul, pentru a garanta c modelul este o reprezentare corect a punctului de vedere al utilizatorului asupra sistemului real analizat.

Proiectarea conceptual a bazei de date -- construirea

conceptuale n structura logic a BD, care include proiectarea relaiilor.

Proiectarea logic a bazei de date -- transpunerea reprezentrii


1) transpunerea modelului conceptual local n modelul de date logic local:

62

eliminarea relaiilor M:N (nlocuirea prin relaii de tip 1:M sau prin tabele asociative); eliminarea relaiilor complexe (nlocuirea prin relaii de tip 1:M); eliminarea relaiilor recursive (nlocuirea prin relaii dependente); eliminarea atributelor multiple (nlocuirea prin relaii dependente; reexaminarea relaiilor 1:1 (sunt ntr-adevr 2 relaii distincte?); eliminarea relaiilor redundante.

2) extragerea relaiilor din modelul de date logic local pentru a reprezenta entitile i relaiile (legturile); 3) normalizarea relaiilor; 4) validarea modelului conform tranzaciilor utilizatorului pentru a garanta c acesta accept i rezolv operaiile cerute de ctre model (se verific faptul c modelul furnizeaz toate informaiile cerute de fiecare tranzacie i se reprezint schematic calea urmat de fiecare tranzacie, direct n diagrama E/R); 5) desenarea diagramei conceptuale; 6) definirea constrngerilor de integritate; 7) revizuirea modelului de date conceptual local, mpreun cu utilizatorii; 8) construirea i validarea modelului de date logic global prin combinarea modelelor locale: mbinarea modelelor locale (revizuirea E, R, A, CP, CE, constrngeri, revizuirea denumirilor, cutarea entitilor i relaiilor care lipsesc, reactualizarea documentaiei); normalizarea modelului; validarea modelului conform tranzaciilor utilizatorului; verificarea n vederea dezvoltrii ulterioare; desenarea diagramei conceptuale finale; revizuirea modelului de date conceptual global, mpreun cu utilizatorii. Modaliti pentru asigurarea integritii refeniale!!! Se specific constrngeri de existen care definesc condiiile n care o cheie candidat sau o cheie extern poate fi inserat, tears sau reactualizat.

63

Exemplu: DOMENIU_contine_CARTE (1:M) 1) Inserare n relaia "copil" (carte) - se verific dac domeniul crii inserate este null sau corespunde unui domeniu existent. 2) tergerea n relaia "copil" (fr probleme). 3) Reactualizarea n relaia "copil" (similar cazului 1). 4) Inserarea n relaia "printe" (domeniu) se face fr probleme. 5) Reactualizarea cheii primare n relaia "printe" (dac exist o apariie n tabelul "copil" care face referin la vechea valoare a cheii, atunci se pierde integritatea refenial). Se pot aplica strategii pentru a asigura integritatea refenial (vezi 6). 6) tergerea unei apariii din relaia "printe" (se pierde integritatea referenial dac se terge un domeniu de carte, dar exist cel puin o carte din domeniul respectiv). Exist 5 strategii care pot fi luate n considerare. NO ACTION (nici o aciune)- nu se poate terge un domeniu dac exist o carte n domeniul respectiv; CASCADE - se terge domeniul i automat se terg toate crile din domeniu .a.m.d.; SET NULL - se terge domeniul, iar toate criile din domeniul respectiv vor avea codul domeniului setat null; SET DEFAULT - setare la o valoare prestabilit; NO CHECK - cnd este ters un domeniu de carte, nu se face nimic pentru a garanta c integritatea refenial este meninut (nici o verificare). Proiectarea fizic a bazei de date -- implementarea fizic a structurii logice ntr-o capacitate de stocare secundar corespunztoare SGBD-ului int. Se descriu structurile de stocare i metodele de acces utilizate pentru realizarea unui acces eficient la date. 1) Transformarea relaiilor extrase din modelul de date logic global ntr-o form care s poat fi implementat n SGBD-ul relaional int (LDD). 2) Proiectarea (definirea) constrngerilor sistemului real modelat n SGBD-ul int (CONSTRAINT, declanatori). 3) Proiectarea reprezentrii fizice - determinarea organizrii fiierelor i a metodelor de acces (indeci) care vor fi utilizate pentru a stoca relaiile de baz (modul n care relaiile i tuplurile vor fi pstrate n cadrul capacitii de stocare secundare).

64

4) Introducerea unei redundane controlate (denormalizarea). 5) Estimarea necesarului de spaiu pe disc cerut de baza de date. 6) Proiectarea mecanismelor de securitate: proiectarea vizualizrilor (VIEW); proiectarea regulilor de acces la relaiile de baz i la vizualizri (privilegii, role-uri). 7) Monitorizarea nentrerupt i reglarea sistemului operaional pentru obinerea unor performane maxime (micorarea configuraiei hardware, timpi de rspuns mai sczui, transfer eficient etc.). Comentm pasul 4 referitor la considerarea introducerii unei redundane controlate (denormalizare). NU exist reguli fixe!!! Pasul 4 presupune: considerarea datelor derivate (calculate); considerarea dublrii atributelor i gruprii relaiilor. Considerarea datelor derivate De exemplu, n relaia PROPRIETATE_DE INCHIRIAT apare drept cmp, codul persoanei care a tranzacionat nchirierea. Prin urmare, s-ar putea calcula pentru fiecare angajat, cte proprieti a nchiriat SAU se poate introduce n tabelul PERSONAL, un cmp calculat (derivat) ce conine numrul proprietilor nchiriate de acesta. Considerarea dublrii atributelor i gruprii relaiilor Dublarea atributelor sau gruparea relaiilor are ca scop reducerea numrului de join-uri necesare pentru efectuarea unei interogri. FILIALA (nr_fil#, strada, zona, oras, codpostal, tel, fax) Relaia nu este n FN3 deoarece codpostal determin funcional atributele zona i oras. Aplic FN3 i se obine: FIL(nr_fil#, strada, codpostal, tel, fax COD_P(zona, oras, codpostal#) Nu este convenabil, deoarece rareori vom accesa adresa filialei, fr informaii referitoare la zona i ora. Prin urmare, preferm FN2. Vom analiza cteva situaii concrete de denormalizare. combinarea relaiilor de tip 1:1 dublarea atributelor care nu sunt chei n relaii 1:M

65

SELECT FROM WHERE

p.*, ptr.nume proprietate_de_inchiriat p, proprietar ptr p.nrptr=ptr.nrptr AND nrfil='S3';

Atributul nrptr este codul proprietarului. Dac se va dubla atributul nume din relaia proprietate_de_inchiriat, atunci interogarea devine: SELECT FROM WHERE p.* proprietate_de_inchiriat p nrfil='S3';

Avantaje sau dejavantaje ?!? Depinde de problemele care pot aprea. tabele de referin (tabele de cutare) Acestea conin, de obicei, un cod i o descriere. De exemplu se poate defini un tabel cutare "printe" pentru tipul de proprietate i modifica tabelul proprietate_de_inchiriat ("copil") astfel: TIP_PROPRIETATE(tip, descriere) PROPRIETATE_DE_INCHIRIAT(nrpte, strada, zona, oras, coppostal, tipul, nrcamere, chirie, nrptr, nrfiliala, nrpersonal) Avantaje: dac este modificat descrierea, atunci se va modifica o singur dat, n tabelul de cutare; se reduce dimensiunea relaiei "copil"; dublarea atributelor cheii externe ntr-o relaie de tip 1:M pentru simplificarea join-urilor S se enumere proprietarii de proprieti de nchiriat dintr-o filial. SELECT FROM WHERE ptr.nume proprietate_de_inchiriat p, proprietar ptr p.nrptr=ptr.nrptr AND p.nrfil='S3';

Dac se dubleaz cheia extern nrfiliala n relaia PROPRIETAR, adic se introduce o relaie direct ntre FILIALA i PERSONAL, atunci cererea devine: SELECT FROM WHERE p.nume proprietar p nrfil='S3';

ATENIE! Sunt necesare constrngeri suplimentare asupra cheilor externe. De exemplu, dac un proprietar ar nchiria prin mai multe filiale (atribut multiplu), atunci modificrile nu mai sunt valabile. De remarcat c singurul motiv pentru care relaia proprietate_de_inchiriat conine atributul nrfiliala const n faptul c este

66

posibil ca o proprietate s nu aib alocat un membru de personal, mai ales la nceput, cnd este preluat iniial de ctre agenie. Dublarea atributelor n relaiile de tip M:N, pentru reducerea join-urilor. Presupunem c relaia M:N dintre chirias i proprietate_de_inchiriat a fost descompus prin introducerea relaiei intermediare VIZITARE. Care sunt chiriaii care au vizitat proprieti, dar mai au de fcut comentarii asupra uneia dintre ele? Personalul de la agenie are nevoie de atributul strada atunci cnd vorbete cu chiriaii. SELECT
FROM

p.strada, c.*, v.data

chirias c, vizitare v, proprietate_de_inchiriat p

WHERE v.nrpte = p.nrpte AND c.nrch = v.nrch AND comentarii IS NULL; Atributul nrpte este codul proprietii, iar nrch este codul chiriaului. Dac se introduce atributul strada n relaia VIZITARE, atunci cererea devine: SELECT FROM WHERE v.strada, c.*, v.data chirias c, vizitare v c.nrch = v.nrch AND comentarii IS NULL;

Comentm pasul 3! Proiectarea reprezentrii fizice Scopul este de a stoca datele n mod eficient. Pentru msurarea eficienei poate fi analizat: capacitatea de stocare pe disc; timpul de rspuns; transferul de tranzacii (numrul de tranzacii care pot fi efectuate ntr-un anumit interval de timp). Pentru mbuntirea performanelor trebuie ca proiectantul s cunoasc cum interacioneaz cele 4 componente hardware (memoria principal, CPU, discul I/O, reeaua) i modul cum acestea afecteaz performanele sistemului. Principiile de baz ale distribuirii datelor pe unitile de disc: fiierele sistemului de operare s fie separate de cele ale BD; fiierele principale ale BD s fie separate de fiierele de indexare; fiierul jurnalului de recuperare s fie separat de restul BD. n aceast etap se face i analizarea tranzaciilor, adic cunoaterea funcionalitii acestora i analizarea celor mai importante dintre acestea.

67

Pentru fiecare tranzacie trebuie detrminat: frecvena estimat cu care va fi rulat; relaiile i atributele accesate; tipul de acces (inserare, interogare, tergere sau rectualizare); atributele care apar n predicate (condiii); atributele care apar n join-uri; constrngerile de timp impuse tranzaciilor.

Limbaje pentru prelucrarea datelor relaionale


Unul dintre cele mai mari merite ale modelului relaional este c prin intermediul multiplelor sale limbaje de interogare (neprocedurale) permite utilizatorului, chiar i neinformatician, s indice rezultatul care l intereseaz, fr a preciza modul n care este obinut acest rezultat. O relaie poate fi definit ca o mulime, sau ca un predicat. Conform dualitii definiiei unei relaii, limbajele de prelucrare a datelor relaionale pot fi grupate n: limbaje algebrice - bazate pe teoria mulimilor (SEQUEL, SQL); limbaje predicative - fondate pe calculul predicatelor. Limbajele predicative pot fi: orientate pe tupluri (QUEL, ALPHA); orientate pe domenii (pot fi non-grafice (ILL, FQL) sau grafice). Limbajele grafice pot fi: cu variabile domeniu explicite (QBE); fr variabile domeniu explicite (LAGRIF, CUPID, VGQF). SQL este limbajul standard de descriere a datelor i acces la informaiile din baza de date. SQL nu este un limbaj unic (cu excepia standardului care este puin utilizat), existnd peste o 100 de dialecte. Au fost concepute i dezvoltate diferite versiuni ale standardului SQL de ctre

68

ANSI, IBM, Microsoft, Borland, etc. Din pcate, lipsa unui standard unic SQL are drept consecine creterea costurilor programelor de gestiune a bazelor de date i ngreunarea ntreinerii arhitecturilor client/server. Un grup de specialiti n baze de date s-au reunit sub numele SAG (SQL Access Group) cu scopul de a construi un limbaj SQL comun i de a realiza pentru fiecare dialect un program de conversie din dialect n SQL, i invers. Rezultatul a fost c n: 1992, Microsoft a lansat ODBC (Open Database Connectivity) care este o mulime de primitive bazate pe activitatea lui SAG; 1994 Borland a lansat IDAPI (Integrated Database Application Programming Interface) care este o bibliotec de funcii SQL ce se pot integra ntr-un program gazd.

Limbaje algebrice
n abordarea algebric, o relaie este considerat ca o mulime de tupluri, iar o baz de date este considerat ca o mulime de relaii pe care sunt definii operatorii algebrici. Exist dou tipuri de operatori algebrici: mulime (intersecie, reuniune, diferen, produs cartezian) i relaionali (proiecie, selecie, diviziune, compunere). Operatorii selecie, proiecie, produs cartezian, reuniune i diferen sunt ireductibili i sunt considerai drept operatori de baz, iar operatorii intersecie, diviziune i compunere pot fi dedui din operatorii anteriori i sunt considerai operatori derivai. Operatorii limbajului algebric permit exprimarea unor cereri nerecursive. Dac cererea este recursiv este necesar un operator special i anume nchiderea tranzitiv a unei relaii. limbaj algebric definit pentru prototipul relaional SYSTEMR. Operaia fundamental a limbajului este SELECT, care are forma general clasic. Operatorii clasici UNION, INTERSECTION, DIFFERENCE i INCLUSION sunt implementai n limbaj. SEQUEL este singurul limbaj relaional care are integrat nchiderea tranzitiv. Limbajul permite reactualizri asupra bazelor (UPDATE, INSERT, DELETE) i calculul unor funcii elementare (COUNT, SUM, AVG, MAX, MIN). Conceptul de partiionare a fost de asemenea introdus n SEQUEL i realizat cu ajutorul clauzelor GROUP BY i HAVING. O extensie comercial a acestui limbaj, adoptat de aproape toate SGBD i considerat drept standard n prelucrarea datelor relaionale, este SQL.

SEQUEL (Structured English as a Query Language) este un

69

Limbaje predicative
Limbajele predicative se bazeaz pe calculul predicatelor. Cererile sunt exprimate sub forma unor mulimi de tupluri sau valori pentru care se specific, sub forma unor predicate, proprietile pe care trebuie s le ndeplineasc.

QUEL este un limbaj predicativ orientat pe tupluri, utilizat de


sistemul INGRES. Limbajul QUEL poate fi utilizat independent sau inclus n limbajul de programare C. Limbajul este caracterizat de: declararea unei variabile tuplu pentru fiecare relaie (prin RANGE), absena cuantificatorilor n expresii, utilizarea unor operatori speciali pe mulimi, integrarea operaiilor aritmetice. Exemplu. S se listeze numele cititorilor care au mprumutat cri scrise de Cioran. RANGE OF a IS carte RANGE OF b IS cititor RANGE OF v IS imprumuta RETRIEVE b.nume WHERE (b.codec = v.codec) AND (v.codel = a.codel) AND (a.autor = Cioran) Limbajul accept comenzi de inserare (APPEND), reactualizare (REPLACE), suprimare (DELETE), precum i funcii de calcul (MAX, MIN, SUM, COUNT, AVG). Cuantificatorul existenial este reprezentat implicit prin declaraia RANGE, iar cuantificatorul universal este simulat cu ajutorul funciei COUNT. Exemplu. S se listeze numele cititorilor care au mprumutat toate crile din bibliotec scrise de Cioran. RANGE OF a IS carte RANGE OF b IS cititor RANGE OF v IS imprumuta RETRIEVE b.nume WHERE COUNT (v.codel WHERE (b.codec=v.codec)

70

AND (a.codel=v.codel) AND (a.autor=Cioran)) = COUNT (a.codel WHERE (a.autor=Cioran)) domenii. Limbajul dispune de primitive de programare grafic a cererilor de date i a fost conceput pentru utilizatorii neiniiai. Utilizatorii, pentru a manipula datele, completeaz o mulime de cmpuri predefinite pe un ecran special. Exemplu. S se obin titlurile crilor scrise de Cioran, din care exist n bibliotec mai mult de 10 exemplare.

QBE (Query By Example) este un limbaj predicativ orientat pe

Carte Codel

Titlu P.X

Autor 'Cioran'

Pret

Nrex >10

Coded

Dac utilizatorul dorete i tiprirea, atunci indic rezultatul care l intereseaz sub forma unei variabile domeniu (notat n acest exemplu prin X) prefixat de P (print). Dac condiia care apare n interogare este complex sau se dorete simplificarea scrierii unei cereri, se poate utiliza o caset special (box condition) n care se introduce condiia. n limbaj sunt admise funciile COUNT, MAX, MIN, AVG, SUM, iar pentru eliminarea dublurilor a fost introdus operatorul UNIQUE. Exemplu. S se obin pentru fiecare autor, preul celei mai scumpe cri i numrul exemplarelor scrise de acesta, care s gsesc n bibliotec (tabelul sortat!!!). Carte Codel Titlu Autor GROUP BY Pret MAX Nrex SUM Coded

n QBE exist posibilitatea de a crea o nou relaie care poate fi o schem virtual care reflect modificrile din relaiile de baz sau o imagine n care modificrile nu sunt stocate. Exemplu. Codurile crilor scrise de Popa sau care au titlul Geometrie.

71

Algebric: R1 = SELECT(carte, autor = 'Popa') R2 = SELECT(carte, titlu = Geometrie') R3 = R1 R2 Rezultat = PROJECT (R3, codel) SEQUEL: SELECT FROM WHERE OR QBE: Codel Titlu Autor Pret Nrex Coded P.X 'Popa' P.Y 'Geometrie' Exemplu. Numele cititorilor care au mprumutat cel putin o carte scrisa de Cioran. Algebric: R1 = PROJECT(cititor, codec, nume) R2 = SELECT(carte, autor = 'Cioran') R3 = PROJECT(R2, codel) R4 = PROJECT(imprumuta, codel, codec) R5 = JOIN(R4, R3, codel) R6 = JOIN(R5, R1, codec) Rezultat = PROJECT(R6, nume) QBE: Cititor Codec Y Codel Z Titlu Codec Y Autor 'Cioran' Nume P.X Dataim Dep Carte codel carte autor = Popa titlu = Geometrie

Imprumuta

Datares

Dataef

Carte Codel Z SEQUEL: SELECT FROM WHERE

Pret

Nrex

Coded

nume cititor codec IS IN

72

SELECT codec FROM imprumuta WHERE codel IS IN SELECT codel FROM carte WHERE autor = Cioran

Utilizarea limbajelor de prelucrare a datelor relaionale n contextul limbajelor de programare


Dou abordri: integrarea, extensia. Integrarea LMD-ului ntr-un limbaj de programare. Se consider limbajul de prelucrare independent de limbajul de programare i exist construcii speciale care permit utilizarea acestuia n limbajul gazd. De exemplu, comenzile SQL pot fi integrate n limbajul PL/1. Ele sunt prefixate de caracterul $ pentru a le distinge de comenzile PL/1. Pentru a realiza integrarea, este necesar fie o precompilare a cererilor, fie o interpretare la execuie. Precompilatoarele actuale acoper majoritatea limbajelor semnificative existente. Alegerea unui precompilator particular depinde de domeniul aplicaiei. Extensia limbajului de programare cu un LMD Se consider un limbaj de programare i se realizeaz extensii ale acestuia cu clauze specifice limbajelor de prelucrare a datelor. Un exemplu tipic este extensia PASCAL/R care permite definirea unui nou tip de date, i anume tipul RELATION. De exemplu, relaia carte este definit: TYPE car = RECORD codel: TEXTE; titlu: TEXTE; autor: TEXTE; nrex: INTEGER; pret: INTEGER; coded: TEXTE END; abc = RELATION OF car; VAR carte: abc;

73

Exemplu. S se obin o relaie avnd numele rezultat, ce conine toate crile scrise de Cioran care au preul mai mare de 150000. VAR rezultat: abc; BEGIN rezultat:=[]; FOR EACH x IN carte DO IF(x.autor = Cioran) AND (x.pret >= 150000) THEN rezultat:=rezultat + [x] END; Relaia rezultat poate fi construit i direct prin atribuirea: rezultat := [EACH (x) IN carte: (x.autor = Cioran) AND (x.pret >= 150000)];

PROIECTAREA BAZELOR DE DATE RELAIONALE


3.1. Preliminarii Modelul relaional a fost conceput i dezvoltat de E.F. Codd. El este un model formal de organizare conceptual a datelor, destinat reprezentrii legturilor dintre date, bazat pe teoria matematic a relaiilor. Este modelul cel mai accesibil pentru utilizatorul bazei de date deoarece structura sa fizic este aceeai cu cea a datelor care trebuie prelucrate. n general, datele se prezint sub forma unor tabele (relaii) n care liniile constituie nregistrri, iar coloanele sunt atribute ce caracterizeaz aceste nregistrri. Obiectivele modelului relaional, considerate de ctre E.F. Codd, sunt urmtoarele: s permit un grad nalt de independen a datelor; s furnizeze baze solide pentru tratarea semanticii, coerenei i problemelor de redundan a datelor; s permit dezvoltarea limbajelor de prelucrare a datelor. Spre deosebire de modelul ierarhic i reea unde apar dou elemente, i anume tipul entitii i relaiile dintre dou entiti, modelul relaional este alctuit numai din relaii i prin urmare, orice interogare asupra bazei de date este tot o relaie. Modelul relaional a fost definit cu o deosebit rigoare matematic, furniznd un mijloc performant de studiu al proprietilor logice ale unui sistem de baze de date. Referitor la partea de prelucrare a datelor, modelul relaional este orientat spre mulimi, n timp ce modelele ierarhic i reea sunt orientate spre fiiere. Pentru modelele ierarhic i reea, programatorul trebuie s proiecteze programe care s acceseze baza de date, nregistrare cu nregistrare, utiliznd legturi fizice ntre nregistrri. Modelul relaional a permis introducerea unor limbaje neprocedurale de prelucrare a datelor. Modelul relaional nu este orientat spre sistemul de calcul, deci modelul nu include regulile, structurile i operaiile referitoare la implementarea fizic a unui sistem de baze de date. De fapt, unul dintre obiectivele modelului este acela de a face o distincie ntre aspectele fizice i logice ale unei baze de date (independena datelor).

Modelul relaional, dei are unele imperfeciuni, a fost adoptat n ultimele decenii de majoritatea programatorilor din domeniu, tocmai datorit acestor trei caliti: este simplu, riguros din punct de vedere matematic i nu este orientat spre sistemul de calcul. Definirea unui SGBD relaional impune analizarea caracteristicilor pe care trebuie s le prezinte un model de date pentru a fi considerat relaional. Exist diferite modaliti pentru a defini acest concept: prezentarea datelor n tabele supuse anumitor operaii de tip proiecie, selecie, reuniune, compunere, intersecie etc. (definiie simpl); un sistem de baze de date ce suport un limbaj de tip SQL Structured Query Language (definiie practic); un sistem de baze de date care respect principiile modelului relaional introdus de E.F. Codd (definiia folosit cel mai frecvent). E.F. Codd a publicat un set de 13 reguli, numite reguli de fidelitate, n raport cu care un SGBD poate fi apreciat ca relaional. Ulterior, cele 13 reguli de fidelitate ale lui Codd au fost extinse la un numr de 100. Trebuie remarcat c nu exist un SGBD care respect toate regulile definite de Codd. Nu trebuie s apreciem un SGBD ca fiind relaional sau nu, ci msura n care acesta este relaional, deci numrul regulilor de fidelitate pe care le respect.

3.2. Caracterisicile modelului relaional Dintre principalele caracteristici ale modelului relaional se remarc: nu exist tupluri identice; ordinea liniilor i a coloanelor este arbitrar; articolele unui domeniu sunt omogene; fiecare coloan definete un domeniu distinct i nu se poate repeta n cadrul aceleiai relaii; toate valorile unui domeniu corespunztoare tuturor cazurilor nu mai pot fi descompuse n alte valori (sunt atomice). Comparativ cu celelalte modele de date, modelul relaional are avantaje remarcabile dintre care se remarc: fundamentarea matematic riguroas, independena fizic a datelor, posibilitatea filtrrilor,
2

existena unor structuri de date simple, minimizarea redundanei, supleea n comunicarea cu utilizatorul neinformatician etc. Ca limite ale modelului relaional pot fi menionate: rmne totui redundan, ocup spaiu, apar fenomene de inconsisten, nu exist mecanisme pentru tratarea optim a cererilor recursive, nu lucreaz cu obiecte complexe, nu exist mijloace perfecionate pentru exprimarea constrngerilor de integritate, nu realizeaz gestiunea cunotinelor etc. Un model relaional este caracterizat de trei elemente: structura relaional a datelor (caracteristica structural), operatorii modelului relaional (caracteristica de asigurare a prelucrrii), regulile de integritate care guverneaz folosirea cheilor n model (caracteristica de asigurare a integritii). Aceste trei elemente corespund celor trei componente ale ingineriei software: informaie, proces, integritate. 3.2.1. Structura datelor Conceptelor descrise formal drept relaie, tuplu sau atribut, le corespund uzual denumirile tabel, linie sau coloan, iar fizic fiier, nregistrare sau cmp. Un domeniu este o mulime de valori care se poate defini fie enumernd elementele componente, fie specificnd o proprietate distinctiv a valorilor. Domeniului i corespunde, att uzual ct i fizic, conceptul de tip de date. Un tip de date este o mulime de valori, i anume mulimea tuturor valorilor care satisfac o anumit constrngere a tipului. Un tip de date poate fi definit de ctre sistem sau de ctre utilizator. De asemenea, fiecare tip are asociat un set de operatori care pot fi aplicai valorilor tipului respectiv. Tipurile constrng operaiile prin faptul c este necesar ca operanzii unei operaii s fie de tipurile definite pentru operaia respectiv.

Tipurile pot fi orict de simple sau de complexe. Se pot distinge tipuri de date ale cror valori sunt numere, iruri, date calendaristice, nregistrri audio sau video, hri, puncte geometrice etc. Orice tip de date este scalar (atomic, ncapsulat) sau nescalar. Tipul nescalar are componente vizibile utilizatorului i direct accesibile. Trebuie fcut distincia ntre un tip i reprezentarea sa fizic, deoarece tipurile sunt legate de model, iar reprezentarea fizic este un aspect legat de implementare. Fie D 1 , D 2 , ..., D n domenii finite, nu neaprat disjuncte. Produsul cartezian D1 D2 ... Dn al domeniilor D 1, D 2, ..., Dn este definit de mulimea tuplurilor (V1, V2, ..., Vn ), unde V1 D1 , V2 D 2, ..., Vn Dn . Numrul n definete aritatea tuplului. O relaie R pe mulimile D1 , D2 , ..., Dn este o submulime a produsului cartezian D 1 D2 ... D n, deci este o mulime de tupluri. Exist un alt mod de a defini relaia, i anume ca o mulime finit de funcii. Asociem fiecrui domeniu D i un atribut A i i definim relaia R = {f 1 , f 2 , ..., f m}, unde fi : {A1, A2, ..., An } D1 D 2 ... Dn i fi (Aj ) D j pentru orice valori ale lui i i j. n aceast definiie nu mai este restricionat ordinea. Definirea unei relaii ca o mulime de tupluri sau ca o mulime de funcii se refer la mulimi care variaz n timp (se adaug, se terg sau se modific elemente). Pentru a caracteriza o relaie este necesar existena unui element invariant n timp, iar acest invariant este dat de structura relaiei (schema relaional). Mulimea numelor atributelor corespunztoare unei relaii R definete schema relaional a relaiei respective. Vom nota schema relaional prin R(A1, A2, ..., An ). De exemplu, pentru modelul de date analizat n aceast lucrare, VESTIMENTATIE(cod_vestimentatie, cod_designer, cod_model, cod_prezentare, denumire, valoare, descriere) reprezint o schem relaional. Putem reprezenta o relaie printr-un tabel bidimensional n care fiecare linie corespunde unui tuplu i fiecare coloan corespunde unui domeniu din produsul cartezian. O coloan corespunde unui atribut. Numrul atributelor definete gradul relaiei, iar numrul de tupluri din relaie definete cardinalitatea relaiei. Bazele de date relaionale sunt percepute de ctre utilizatori ca o mulime de tabele. Tabelul reprezint structura logic dintr-un sistem relaional, nu structura fizic. La nivel fizic, sistemul poate stoca datele n diferite moduri, folosind fiiere secveniale, indexri, nlnuiri de pointeri etc., cu condiia s poat realiza corespondena dintre reprezentarea stocat i tabelele de la nivelul logic.

Bazele de date relaionale respect principiul informaiei (principiul reprezentrii uniforme), care afirm c ntregul coninut informaional al bazei este reprezentat ntr-un mod unic, i anume, ca valori explicite ale celulelor unui tabel. Aceast modalitate de reprezentare este singura disponibil, la nivel logic, ntr-un sistem relaional. Cnd se insereaz tupluri ntr-o relaie, de multe ori valoarea unui atribut este necunoscut sau nu este aplicabil tuplului respectiv. Pentru a reprezenta valoarea acestui atribut a fost introdus o valoare convenional n relaie, i anume null. De fapt, null nu reprezint o valoare, ci absena uneia. Un null nu este acelai lucru cu o valoare numeric egal cu zero sau cu un ir de caractere vid. Zerourile i spaiile libere (irul vid) sunt valori, pe cnd null semnific absena unei valori. Prin urmare, null trebuie tratat n mod diferit fa de alte valori i trebuie neles c termenul valoare nul este depreciativ. Evident, este necesar o aritmetic i o logic (polivalent) nou (fig.3.1) care s cuprind acest element. De exemplu, ce valoare are 10 > null ? Rspunsul este null. n general, rezultatul operaiilor aritmetice sau logice este null cnd unul din operanzi este null. Prin urmare, null = null are valoarea null, iar null este null. ntroducerea null-urilor n modelul relaional constituie o problem controversat, dei Codd trateaz null ca parte integrant a modelului. Alii consider aceast abordare greit i prematur. Trebuie remarcat c nu toate sistemele relaionale accept null-urile. AND T F Null T T F Null F F F F Null Null F Null OR T F T T T F T F Null Null T Null Null

Null T

Fig. 3.1. Tabele de adevr pentru operatorii AND i OR Tabelul vizualizare (view, filtru, relaie virtual, vedere) constituie un filtru asupra tabelului iniial, care conine numai informaia necesar unei anumite abordri sau aplicaii. De fapt, vizualizarea este o expresie relaional creia i se atribuie un nume.
5

Dac baza de date conine tabele reale depuse pe disc, o vizualizare este virtual deoarece datele pe care le conine nu sunt n realitate memorate ntr-o baz de date. Este memorat numai definiia vizualizrii. Vizualizarea nu este definit explicit, ca relaiile de baz, prin mulimea tuplurilor componente, ci implicit, pe baza altor relaii obinute prin intermediul unor expresii relaionale. Stabilirea efectiv a tuplurilor care compun vizualizarea se realizeaz prin evaluarea expresiei atunci cnd utilizatorul se refer la acest tabel. Utilizarea vizualizrilor este avantajoas, deoarece: asigur securitatea tabelului iniial (care este protejat de tergeri, modificri etc.) prin capacitatea de a ascunde datele; permit vizualizarea simultan a acelorai date de ctre diveri utilizatori; sunt concise, punnd la dispoziie capaciti macro; asigur independena logic fa de date (imunitatea programelor de aplicaie fa de modificrile din structura logic a bazei de date). Exist totui limitri n utilizarea acestor tabele, n special legate de problema reactualizrii. De exemplu, coloanele calculate nu pot fi reactualizate. De asemenea, inserarea, reactualizarea i tergerea nu sunt, n general, recomandate i sunt permise numai cu anumite restricii care sunt specifice fiecrui SGBD. De exemplu, Oracle9i rezolv problema dificil a reactualizrii vizualizrilor, n anumite situaii, utiliznd o clas special de declanatoare (TRIGGER de tip INSTEAD OF). 3.2.2. Reguli de integritate Regulile de integritate sunt aseriuni pe care datele coninute n baza de date trebuie s le satisfac. Trebuie fcut distincia ntre regulile structurale care sunt inerente modelrii datelor i regulile de funcionare (comportament) care sunt specifice unei aplicaii particulare. Exist trei tipuri de constrngeri structurale (de cheie, de referin, de entitate) ce constituie mulimea minimal de reguli de integritate pe care trebuie s le respecte un SGBD relaional. Restriciile de integritate minimale sunt definite n raport cu noiunea de cheie a unei relaii. O mulime minimal de atribute ale cror valori identific unic un tuplu ntr-o relaie reprezint o cheie pentru relaia respectiv.

Prin urmare, o cheie a unei relaii R este o mulime K de atribute, astfel nct: (1) pentru orice dou tupluri t 1 , t 2 ale lui R t 1 (K) t 2 (K); (2) nu exist nicio submulime proprie a lui K avnd proprietatea (1). Fiecare relaie are cel puin o cheie. Dac exist diferite chei posibile, ele se numesc chei candidat. Una dintre cheile candidat va fi aleas pentru a identifica efectiv tupluri i ea va primi numele de cheie primar. Cheia primar nu poate fi reactualizat. Restul cheilor candidat vor purta numele de chei alternative sau secundare. Atributele care reprezint cheia primar pot fi subliniate sau urmate de semnul #. O cheie identific linii i este diferit de un index care localizeaz liniile. O cheie secundar este folosit ca index pentru a accesa tupluri. Un grup de atribute din cadrul unei relaii care conine o cheie a relaiei poart numele de supercheie. Fie schemele relaionale R1(P1, S1) i R2(S1, S2), unde P1 este cheie primar pentru R1, S1 este cheie secundar pentru R1, iar S1 este cheie primar pentru R2. n acest caz, vom spune c S1 este cheie extern (cheie strin) pentru relaia R1. De exemplu, cod_casa_moda este cheie extern pentru relaia CREATOR i este cheie p imar p e tru relaia CASA_ M r n ODA. Cheia primar poate conine cheia extern. De exemplu, relaia ACCESORIU are cheia primar format din atributele cod_accesoriu i cod_vestimentatie, iar atributul cod_vestimentatie fiind cheie primar n relaia VESTIMENTATIE, devine cheie extern n relaia ACCESORIU. Modelul relaional respect trei reguli de integritate structural.

Regula 1 unicitatea cheii. Cheia primar trebuie s fie unic i minimal. Regula 2 integritatea entitii. Atributele cheii primare trebuie s fie diferite de null. Regula 3 integritatea referirii. O cheie extern trebuie s fie ori null n ntregime, ori s corespund unei valori a cheii primare asociate.

Uneori constrngerile de integritate sunt implementate procedural, folosind o clas de proceduri (declanatori) precompilate, stocate mpreun cu baza de date i invocate automat ori de cte ori are loc un anumit eveniment. Aceste proceduri nu reprezint o modalitate recomandat de implementare a constrngerilor de integritate deoarece, fiind proceduri, sunt

mai dificil de optimizat de ctre sistem i, de asemenea, sunt executate doar atunci cnd apare evenimentul specificat (declanator). Declanatorii trebuie utilizai cu precauie, sau deloc, dac exist o modalitate alternativ de rezolvare a problemei respective. Ei pot crea probleme practice datorit fenomenului declanatori n cascad (lan de declanatori). De asemenea, dac acelai eveniment determin pornirea mai multor declanatori diferii, atunci ordinea n care pornesc poate fi important sau poate fi chiar nedefinit. Exist posibilitatea ca un declanator s se declaneze singur, recursiv. Dac sunt disponibile, soluiile declarative sunt de preferat celor procedurale. 3.2.3. Operatorii modelului relaional Operatorii modelului relaional definesc operaiile care se pot efectua asupra relaiilor n scopul realizrii funciilor de prelucrare asupra bazei de date. Modelul relaional ofer dou mulimi de operatori pe relaii, i anume: algebra relaional i calculul relaional. La rndul su, calculul relaional este de dou tipuri: orientat pe tupluri sau orientat pe domenii. Operatorii algebrei relaionale sunt fie operatori tradiionali pe mulimi (UNION, INTERSECT, PRODUCT, DIFFERENCE), fie operatori relaionali speciali (PROJECT, SELECT, JOIN, DIVISION). Aceti operatori vor fi analizai n seciunea 3.4. Calculul relaional reprezint o adaptare a calculului predicatelor la domeniul bazelor de date relaionale. Ideea de baz este de a identifica o relaie cu un predicat. Pe baza unor predicate iniiale, prin aplicarea unor operatori ai calculului cu predicate (conjuncia, disjuncia, negaia, cuantificatorul existenial i cel universal) se pot defini noi relaii. Variabilele care apar n construciile calculului relaional orientat pe domenii sunt variabile definite asupra domeniilor, iar cele care apar n construciile calculului relaional orientat pe tupluri sunt variabile definite asupra relaiilor, adic valorile acestora reprezint tupluri. Echivalena dintre algebra relaional i calculul relaional a fost demonstrat de J.D.Ullman. Aceast echivalen arat c orice relaie posibil de definit n algebra relaional poate fi definit i n cadrul calcului relaional, i reciproc.

3.3. Proiectarea modelului relaional Problema proiectrii bazelor de date poate fi enunat n urmtoarea manier: fiind dat un volum de informaii care trebuie reprezentat ntr-o baz de date, cum se poate alege o structur logic adecvat pentru acesta? Proiectarea bazelor de date este mai mult o art, dect o tiin. Exist cteva principii tiinifice care pot fi invocate pentru a rezolva problema, dar exist multe aspecte legate de proiectare pe care aceste principii nu le abordeaz i evident, nu le rezolv. Teoreticienii i practicienii au propus metodologii de proiectare mai mult sau mai puin riguroase, dar gsirea proiectrii logice optime rmne o problem complex i dificil. Pot exista criterii obiective care s favorizeze o abordare n raport cu celelalte. n capitolul 2 s-a prezentat o abordare (proiectarea modelului E/R) care are meritul c este frecvent utilizat n practic. n practic, se ncearc obinerea unei scheme conceptuale corecte, adic realizarea proiectrii logice abstracte independent de hardware, de sistemul de operare, de SGBD, de limbaj, de utilizator etc. Este important att obinerea structurilor de date corecte, ct i realizarea integritii datelor. De asemenea, trebuie ca designul s fie robust, n sensul c nu va fi invalidat prin ivirea unor noi cerine ale aplicaiei, care nu au fost prevzute n momentul proiectrii iniiale. Pentru rafinarea proiectrii modelului de date, pentru obinerea schemei conceptuale a bazei de date relaionale, se pleac de la o form de modelare semantic special a datelor, mai precis de la diagrama E/R. Ideea general este de a reprezenta entitile i legturile dintre acestea sub forma unor tabele speciale (relaii). Vor fi prezentate 9 reguli care arat maniera n care se transform entitile, relaiile i atributele acestora, n vederea obinerii schemei conceptuale. Ca formalism, n diagrama conceptual, simbolul indic plasamentul cheii externe. Dac simbolul este subliniat (), se exprim i faptul c respectiva cheie extern este coninut n cheia primar.

3.3.1. Transformarea entitilor

Entitile independente devin tabele independente. Cheia primar nu conine chei externe. De exemplu, entitatea independent PREZENTARE genereaz un tabel independent pentru care atributul cod_prezentare reprezint cheia primar. Entitile dependente devin tabele dependente. Cheia primar a entitilor dependente conine cheia primar a entitii de care depinde (cheie extern) plus unul sau mai multe atribute adiionale. De exemplu, cheia primar a entitii dependente ACCESORIU este format din atributul cod_vestimentatie, care reprezint cheia primar a entitii de care depinde (VESTIMENTATIE), plus atributul adiional cod_accesoriu. Subentitile devin subtabele. Cheia extern se refer la supertabel, iar cheia primar este aceast cheie extern. De exemplu, cheia primar a subentitii MODEL este cod_angajat care este o cheie extern (cheie primar a entitii ANGAJAT_TEMP). 3.3.2. Transformarea relaiilor

Relaiile 1:1 i 1:n devin chei externe. De exemplu, relaia creeaza (CREATOR_creeaza_VESTIMENTATIE) devine coloan n tabelul VESTIMENTATIE. Atributul cod_creator, care este cheie primar n tabelul CREATOR, va fi cheie extern n tabelul VESTIMENTATIE. Relaia 1:1 plaseaz cheia extern n tabelul cu mai puine linii. Relaia m:n devine un tabel special, numit tabel asociativ, care are dou chei externe pentru cele dou tabele asociate. Cheia primar este compunerea acestor dou chei externe plus eventuale coloane adiionale. Un tabel asociativ se deseneaz punctat. De exemplu, relaia participa (CASA_MODA_participa_PREZENTARE), care este de tip m:n, devine tabel asociativ avnd cheia primar format din atributele cod_casa_moda i cod_prezentare. Relaiile de tip trei devin tot tabele asociative. De exemplu, relaia primeste ce leag entitile ANGAJAT_TEMP, PREZENTARE i CASA_MODA, devine tabel asociativ. Cheia primar a tabelului este compunerea a trei chei externe: cod_angajat, cod_casa_moda
10

i cod_prezentare. Practic, n acest caz, este preferabil s fie introdus o cheie primar artificial.

3.3.3. Transformarea atributelor


Un atribut singular devine o coloan. Atributele multiple devin tabele dependendente ce conin cheia primar a entitii i atributul multiplu. Cheia primar este format dintr-o cheie extern, plus una sau mai multe coloane adiionale. De exemplu, o persoan de contact poate cunoate mai multe limbi strine. n acest caz, atributul limba_cunoscuta este multiplu i va genera tabelul dependent LIMBA. Entitile devin tabele, iar atributele lor devin coloane n aceste tabele. Ce devin atributele relaiilor? Pentru relaii 1:1 i 1:n, atributele relaiilor vor aparine tabelului care conine cheia extern, iar pentru relaii m:n i de tipul trei, atributele vor fi plasate n tabelele asociative. Cheie primar nu conine chei externe o cheie extern o cheie extern i una sau mai multe coloane adiionale dou sau mai multe chei externe i (opional) coloane adiionale

Tabel Reprezint Independent entitate independent Subtabel subentitate entitate dependent Dependent Atribut multiplu relaie m:n Asociativ relaie de tip 3

Fig. 3.2. Clasificarea tabelelor

11

LIMBA FIRMA_PUB face PUBLICITATE organizeaza FIRMA_SEC are ANGAJAT_SEC se_face LOCATIE are PAZA ORGANIZATOR are

INFO_CONTACT cunoaste are

PERS CONTACT are LOCALIZARE

PREZENTARE

FINANTEAZA

SPONSOR

SOC ASIG

asigura

PARTICIPA

CASA MODA prezinta lucreaza

PRIMESTE
ANGAJAT_TEMP

CREATOR creeaza prezinta face

MODEL

lucreaza_la are AGENTIE refera ISTORIC

VESTIMENTATIE
are

ACCESORIU

Fig. 3.3. Diagrama conceptual.

12

Cele patru tipuri de tabele (independente, dependente, subtabele i asociative) se deosebesc prin structura cheii primare (figura 3.2.). n figura 3.3 este prezentat diagrama conceptual pentru proiectarea modelului relaional comentat. Ea a fost construit din diagrama E/R prin adugarea tabelelor asociative i prin marcarea cheilor externe. n continuare va fi prezentat modalitatea efectiv de trecere de la diagrama entitate-relaie la diagrama conceptual pentru modelul de date real analizat n capitolul 2. Entitile independente PERS_CONTACT, ORGANIZATOR, PREZENTARE, PUBLICITATE, SPONSOR, FIRMA_PUB, CASA_MODA, CREATOR, ANGAJAT_TEMP, ACCESORIU, LOCALIZARE, FIRMA_SEC, ANGAJAT_SEC, SOCIETATE_ASIG, INFO_CONTACT, AGENTIE, LOCATIE devin tabele independente. Cheile primare ale fiecrei entiti au fost specificate n capitolul 2. Entitile dependente ISTORIC i ACCESORIU, care intervin n model, devin tabele dependente, iar cheile primare au fost specificate n capitolul 2. Subentitatea MODEL devine subtabel, avnd aceeai cheie primar cu superentitatea ANGAJAT_TEMP, adic atributul cod_angajat. Relaiile de tip one-to-one i one-to-many devin chei externe. Relaia PERS_CONTACT_are_LOCALIZARE devine cheie extern n tabelul PERS_CONTACT. Dac restricia c o persoan de contact are o singur localizare este eliminat, atunci cardinalitatea relaiei devine 1:n, iar atributul cod_pers_contact devine cheie extern n tabelul LOCALIZARE. Toate comentariile anterioare rmn valabile i pentru entitile FIRMA_PUB, FIRMA_SEC, PREZENTARE, ORGANIZATOR, CASA_MODA, SPONSOR, SOC_ASIG, CREATOR, LOCATIE, ANGAJAT_TEMP i AGENTIE, care sunt legate de entitatea LOCALIZARE, permind astfel localizarea tuturor structurilor modelului. Relaia PERS_CONTACT_are_INFO_CONTACT devine cheie extern n tabelul PERS_CONTACT. Dac restricia c pentru o persoan de contact exist o singur posibilitate de contactare este eliminat, atunci cardinalitatea relaiei devine 1:n, iar atributul cod_pers_contact devine cheie extern n tabelul INFO_CONTACT. Toate comentariile anterioare rmn valabile i pentru entitile FIRMA_PUB, FIRMA_SEC, ANGAJAT_TEMP, PREZENTARE, ORGANIZATOR, CASA_MODA, SPONSOR, SOC_ASIG, CREATOR, LOCATIE i AGENTIE, care sunt legate de entitatea INFO_CONTACT, permind astfel accesarea tuturor structurilor modelului.
13

Relaia FIRMA_PUB_face_PUBLICITATE devine cheie extern n tabelul PUBLICITATE. Relaia PUBLICITATE_se_face_pentru_PREZENTARE devine cheie extern n tabelul PUBLICITATE. Relaia ORGANIZATOR_are_PERS_CONTACT devine cheie extern n tabelul PERS_CONTACT. Relaia FIRMA_SEC_are_ANGAJAT_SEC devine cheie extern n tabelul ANGAJAT_SEC. Relaia SOC_ASIG_asigura_PREZENTARE devine cheie extern n tabelul PREZENTARE. Relaia CASA_MODA_lucreaza_CREATOR devine cheie extern n tabelul CREATOR. Relaia CREATOR_creeaza_VESTIMENTATIE devine cheie extern n tabelul VESTIMENTATIE. Relaia VESTIMENTATIE_are_ACCESORIU devine cheie extern n tabelul ACCESORIU. Relaia MODEL_prezint_VESTIMENTATIE devine cheie extern n tabelul VESTIMENTATIE. Relaia CREATOR_face_ACCESORIU devine cheie extern n tabelul ACCESORIU. Relaia PREZENTARE_prezinta_VESTIMENTATIE devine cheie extern n tabelul VESTIMENTATIE. Relaia PREZENTARE_are_LOCATIE devine cheie extern n PREZENTARE. Relaia MODEL_lucreaza_AGENTIE devine cheie extern n tabelul MODEL. Relaia MODEL_are_ISTORIC devine cheie extern n tabelul ISTORIC. Relaia ISTORIC_refera_AGENTIE devine cheie extern n tabelul ISTORIC. Relaiile de tip many-to-many devin tabele asociative, avnd dou chei externe pentru cele dou tabele asociate. Relaia ANGAJAT_SEC_paza_PREZENTARE devine tabel asociativ (PAZA). SPONSOR_finanteaza_PREZENTARE devine tabel asociativ (FINANTEAZA). CASA_MODA_participa_PREZENTARE devine tabel asociativ (PARTICIPA). Relaiile de tipul trei (adic cele care leag cel puin trei entiti) devin tabele asociative, avnd chei externe pentru fiecare dintre tabelele asociate.

14

Relaia primeste, care leag entitile ANGAJAT_TEMP, PREZENTARE i CASA_MODA, devine tabel asociativ (PRIMESTE). n acest caz, s-a considerat o cheie primar artificial (atributul cod_primeste). Tabelul asociativ are drept chei externe atributele: cod_angajat, cod_casa_moda i cod_prezentare. Atributele multiple devin tabele dependendente ce conin cheia primar a entitii i atributul multiplu. Atributul limba_cunoscuta este multiplu (relativ la entitatea PERS_CONTACT) i va genera tabelul dependent LIMBA. Acesta va avea drept cheie primar atributele cod_pers_contact i limba_cunoscuta. Tabelul mai conine trei atribute ce reprezint nivelul de cunoatere (scris, citit, vorbit) a limbii. Atributele entitilor devin coloane n tabelele corespunztoare. Pentru relaii 1:1 i 1:n, atributele relaiilor vor aparine tabelului care conine cheia extern, iar pentru relaii m:n i de tipul trei, atributele vor fi plasate n tabelele asociative. Tabelul asociativ PRIMESTE va avea ca atribute, pe lng cele ce constituie cheia primar, suma, data_achitare, cont, banca. Schemele relaionale corespunztoare diagramei conceptuale din figura 3.3. sunt urmtoarele: MODEL(cod_angajat#, cod_agentie, inaltime, nr_pantof, info) ANGAJAT_TEMP(cod_angajat#, nume, prenume, data_nastere, nationalitate, sex, cod_localizare, cod_info_acces, tip) PUBLICITATE(cod_publicitate#, cod_firma_pub, cod_prezentare, tip, nume, suma, observatii) FIRMA_PUB(cod_firma_pub#, nume, info, director, observatii, cod_localizare, nume_pers_contact, cod_info_acces) ORGANIZATOR(cod_organizator#, denumire, banca, cont, cod_info_acces, informatii, cod_localizare) PERS_CONTACT(cod_pers_contact#, cod_organizator, nume, prenume, directie, cod_localizare, cod_info_acces) PREZENTARE(cod_prezentare#, denumire, data_start, data_final, cod_soc_asig, cod_organizator, cod_locatie) LOCATIE(cod_locatie#, denumire, tip, cod_localizare, cod_info_acces, capacitate) SPONSOR(cod_sponsor#, tip, nume, info, cod_localizare, cod_info_acces)
15

CASA_MODA(cod_casa_moda#, nume, cifra_afaceri, proprietar, director, istoric, data_creare, cod_localizare, cod_info_acces) CREATOR(cod_creator#, nume, prenume, data_nastere, data_angajare, tip, mod_angajare, info, cod_casa_moda, cod_localizare, cod_info_acces) VESTIMENTATIE(cod_vestimentatie#, denumire, valoare, descriere, cod_creator, cod_model, cod_prezentare) ACCESORIU(cod_vestimentatie#, cod_accesoriu#, cod_creator, descriere, tip, valoare) AGENTIE(cod_agentie#, nume, data_creare, director, cifra_afaceri, info, cod_localizare, cod_info_acces) ISTORIC(cod_model#, data_angajare#, data_final, cod_agentie, conditii) LOCALIZARE(cod_localizare#, adresa, cod_postal, oras, tara) INFO_CONTACT(cod_info_acces#, telefon_fix, telefon_mobil, mail, fax) FIRMA_SEC(cod_firma_sec#, nume_firma, tip_servicii, director, cod_localizare, cod_info_acces, observatii) ANGAJAT_SEC(cod_angajat#, nume, prenume, data_nastere, specializare, nivel, observatii, cod_info_acces, cod_firma_sec) PAZA(cod_angajat#, cod_prezentare#, tip_paza, dotare, observatii) SOC_ASIG(cod_soc_asig#, conditii, suma, director, observatii, cod_localizare, nume_pers_contact_firma, cod_info_acces) PARTICIPA(cod_prezentare#, cod_casa_moda#, tip, data) FINANTEAZA(cod_sponsor#, cod_prezentare#, suma, banca, cont_emitent, data_emitere, cod_ordin_plata) PRIMESTE(cod_primeste#, cod_angajat, cod_prezentare, cod_casa_moda, data_achitare, suma, cont, banca) LIMBA(cod_pers_contact#, niv_vorbit) limba_cunoscuta#, niv_scris, niv_citit,

16

3.4. Regulile lui Codd

Un SGBD relaional ndeplinete funciile unui SGBD, dar cu anumite particulariti care decurg din concepia de organizare a datelor, respectiv din modelul relaional. Fiecare SGBD relaional implementeaz modelul relaional ntr-o manier proprie, care l difereniaz de restul sistemelor relaionale. Caracterizarea unui SGBD relaional se poate realiza la nivelul clasei sistemelor relaionale, n sensul caracterizrii globale, unitare n raport cu celelalte tipuri de SGBD-uri, sau la nivelul SGBD-ului relaional individual n sensul caracterizrii particularitilor sale, n raport cu alte SGBD-uri relaionale. Realizarea funciilor SGBD-urilor relaionale se face cu ajutorul unor mecanisme de lucru specifice, care le separ de sistemele nerelaionale. Dintre mecanismele de lucru de care dispune un SGBD relaional se pot meniona: un limbaj relaional pentru descrierea datelor la nivel fizic, logic i conceptual; un limbaj relaional pentru prelucrarea datelor; mecanisme pentru controlul integritii semantice a datelor; mecanisme pentru optimizarea cererilor de date; mecanisme pentru asigurarea coerenei datelor; utilitare pentru generarea de rapoarte, pentru generarea de aplicaii, pentru generarea unor statistici referitoare la starea i activitatea bazei de date etc. n anul 1985, E.F. Codd a publicat un set de 13 reguli n raport cu care un sistem de gestiune a bazelor de date poate fi apreciat ca relaional. Niciun sistem de gestiune a bazelor de date pus n vnzare pe piaa comercial nu respect absolut toate regulile definite de Codd, dar acest lucru nu mpiedic etichetarea acestor sisteme drept relaionale. Nu trebuie apreciat un SGBD ca fiind relaional sau nu, ci msura n care acesta este relaional, deci numrul regulilor lui Codd pe care le respect. Regulile lui Codd au fost i sunt cauza multor controverse. Unii le consider doar un exerciiu academic, alii pretind c produsele lor satisfac majoritatea regulilor. De fapt, discuiile n jurul acestor reguli au generat o cunoatere mai bun a caracteristicilor eseniale ale unui SGBD relaional, att din punctul de vedere al utilizatorilor, ct i din cel al productorilor de software.

17

Regulile pot fi organizate n urmtoarele cinci domenii de funcionalitate: reguli fundamentale, reguli structurale, reguli de integritate, reguli de prelucrare a datelor i reguli privind independena datelor. Regula 1 regula gestionrii datelor. Un SGBD relaional trebuie s fie capabil s gestioneze o baz de date prin posibilitile sale relaionale. Practic, nicio implementare curent de SGBD nu respect aceast regul, deoarece implementrile conin att caracteristici relaionale ct i nerelaionale. Regula 2 regula reprezentrii informaiei. ntr-o baz de date relaional, informaia este reprezentat la nivel logic sub forma unor tabele ce poart numele de relaii. Este regula cea mai important i conform lui Codd, un SGBD care nu respect aceast regul, nu poate fi considerat relaional. Chiar i meta-datele, coninute n catalogul de sistem, trebuie s fie stocate ca relaii. Regula 3 regula accesului garantat la date. Fiecare valoare dintr-o baz de date relaional trebuie s poat fi adresat n mod logic printr-o combinaie format din numele relaiei, valoarea cheii primare i numele atributului. Regula 4 regula reprezentrii informaiei necunoscute. Un sistem relaional trebuie s permit utilizatorului definirea unui tip de date numit null pentru reprezentarea unei informaii necunoscute la momentul respectiv. ntr-un SGBD relaional trebuie s putem face diferena ntre valoarea zero, un ir vid de caractere i o valoare necunoscut. Regula 5 regula dicionarelor de date. Asupra descrierii bazelor de date (informaii relative la relaii, vizualizri, indeci etc.) trebuie s se poat aplica aceleai operaii ca i asupra datelor din baza de date. Descrierea bazei de date este reprezentat la nivel logic sub forma unor tabele care pot fi accesate n acelai mod ca i datele efective. Prin urmare exist un singur limbaj de prelucrare att a meta-datelor, ct i a datelor. Regula 6 regula limbajului de interogare. Trebuie s existe cel puin un limbaj pentru prelucrarea bazei de date. n general, toate implementrile SQL respect aceast regul. Limbajul permite utilizatorilor s defineasc relaii i vizualizri, s prelucreze datele interactiv sau prin intermediul programului, s regseasc informaia i s o poat actualiza, s verifice i s corecteze datele de intrare, s implementeze constrngeri, s stabileasc limite pentru tranzacii etc. Regula 7 regula de actualizare a vizualizrii. Un SGBD trebuie s poat determina dac o vizualizare poate fi actualizat i s stocheze rezultatul interogrii, ce definete vizualizarea, ntr-un dicionar de tipul
18

unui catalog de sistem. Trebuie s existe un mecanism prin care s se poat determina dac anumite vizualizri pot fi actualizate sau nu. Regula stabilete c toate vizualizrile care sunt teoretic reactualizabile pot fi reactualizate i de ctre sistemul de gestiune. Nu au fost nc descoperite condiiile pentru identificarea tuturor vizualizrilor care pot fi teoretic reactualizate. Regula 8 regula limbajului de nivel nalt. Capacitatea de tratare a unei relaii de baz sau a unei vizualizri ca pe un singur operand se aplic att pentru operaiile de regsire a datelor, ct i asupra operaiilor de inserare, actualizare i tergere a datelor. Un SGBD relaional nu trebuie s oblige utilizatorul s caute ntr-o relaie, tuplu cu tuplu, pentru a regsi informaia dorit. Operaiile de prelucrare a datelor pot s fie aplicate att n mod interactiv ct i prin program, ntr-un limbaj gazd. Regula 9 regula independenei fizice a datelor. Programele de aplicaie i activitile utilizatorilor nu depind de modul de depunere a datelor sau de modul de acces la date. ntr-un SGBD relaional trebuie s se separe aspectul fizic al datelor (stocare sau acces la date) de aspectul logic al datelor. Regula 10 regula independenei logice a datelor. Programele de aplicaie trebuie s fie transparente la modificrile de orice tip efectuate asupra datelor. Orice modificare efectuat asupra unei relaii nu trebuie s afecteze operaiile de prelucrare a datelor. Regula 11 regula independenei datelor din punct de vedere al integritii. Regulile de integritate trebuie s fie definite ntr-un sublimbaj relaional de date, nu n programul de aplicaie. SQL permite definirea de restricii privind integritatea datelor i stocarea lor n catalogul de sistem. Cu ct sunt mai multe constrngeri de integritate care pot fi ntreinute mai degrab de ctre SGBD, dect n cadrul fiecrui program aplicaie, cu att garantarea calitii datelor este mai bun. Regula 12 regula independenei datelor din punct de vedere al distribuirii. Distribuirea datelor pe mai multe calculatoare dintr-o reea de comunicaii de date nu trebuie s afecteze programele de aplicaie. ANSISQL nu menioneaz regula n specificaiile sale, deoarece este destul de greu de respectat. De observat c regula nu cere ca SGBD-ul s accepte o baz de date distribuite pentru a fi relaional, dar stabilete c limbajul de interogare va rmne acelai atunci cnd se va introduce aceast capacitate, iar datele vor fi distribuite.

19

Regula 13 regula versiunii procedurale a unui SGBD. Orice component procedural a unui SGBD trebuie s respecte aceleai restricii de integritate ca i componenta relaional. De exemplu, dac n partea de prelucrare a datelor a limbajului relaional valoarea dintr-o coloan este de tipul not null, orice alt metod procedural de accesare a acestei coloane nu trebuie s permit introducerea unui null n aceast coloan. Prin urmare, regulile de integritate exprimate ntr-un limbaj relaional de un anumit nivel nu pot fi distruse de un limbaj de nivel inferior. Deoarece regulile lui Codd sunt prea severe pentru a fi respectate de un SGBD operaional, s-au formulat criterii minimale de definire a unui SGBD relaional. Un SGBD este minimal relaional dac: toate datele din cadrul bazei sunt reprezentate prin valori n tabele; nu exist pointeri observabili de ctre utilizator; sistemul suport operatorii relaionali de proiecie, selecie i compunere natural, fr limitri impuse din considerente interne. Un SGBD este complet relaional dac este minimal relaional i satisface n plus condiiile: sistemul suport restriciile de integritate de baz (unicitatea cheii primare, constrngerile refereniale, integritatea entitii); sistemul suport toate operaiile de baza ale algebrei relaionale.

20

4. NORMALIZAREA RELAIILOR
4.1. Preliminarii
n procesul modelrii unei baze de date relaionale, o etap important o reprezint normalizarea relaiilor conceptuale. Aceasta presupune obinerea de relaii moleculare, fr a pierde nimic din informaie, avnd scopul de a elimina redundana i anomaliile reactualizrii informaiilor. Tehnica normalizrii permite determinarea unei scheme conceptuale rafinate, printr-un proces de ameliorare progresiv a unei scheme conceptuale iniiale a bazei de date relaionale. Dup fiecare etap de ameliorare, relaiile bazei de date ating un anumit grad de perfeciune, deci se afl ntr-o anumit form normal. Trecerea unei relaii dintr-o form normal n alta presupune eliminarea unui anumit tip de dependene nedorite, care sunt transformate n dependene admisibile, adic dependene care nu provoac anomalii. Procesul de ameliorare progresiv a schemei conceptuale trebuie s satisfac urmtoarele cerine: s garanteze conservarea datelor, adic n schema conceptual final trebuie s figureze toate datele din cadrul schemei iniiale; s garanteze conservarea dependenelor dintre date, adic n schema final fiecare dependen trebuie s aib determinantul i determinatul n schema aceleiai relaii; s reprezinte o descompunere minimal a relaiilor iniiale, adic nici una din relaiile care compun schema final nu trebuie s fie coninut ntr-o alt relaie din aceast schem. Exist dou metode pentru a modela baze de date relaionale fr anomalii sau pierderi de informaie. Schema descompunerii pleac de la o schem relaional universal care conine toate atributele bazei de date. Schema se descompune prin proiecii succesive n subrelaii. Descompunerea se oprete atunci cnd continuarea ei ar duce la pierderi de informaie. Algoritmii de descompunere se bazeaz, n general, pe descrierea formal a dependenei dintre atribute. Schema sintezei pleac de la o mulime de atribute independente. Utiliznd proprieti de semantic i legturi ntre atribute se pot compune noi relaii, astfel nct acestea s nu sufere de anumite anomalii pe care dorim s le evitm. Algoritmii de sintez se bazeaz n general pe teoria grafurilor pentru a reprezenta legturile ntre atribute.
21

4.2. Dependene funcionale Unul dintre conceptele principale asociate normalizrii este cel de dependen funcional, care descrie formalizat legturile dintre atribute. Dependena funcional este o proprietate a semanticii atributelor dintr-o relaie. Semantica indic modul n care sunt legate atributele i specific dependenele dintre ele. Atunci cnd exist o dependen funcional, ea este specificat ca o constrngere ntre atribute. O relaie universal este o relaie ce grupeaz toate atributele care modeleaz sistemul real cercetat. Fie E, mulimea dependenelor considerate de proiectantul bazei pentru o schem relaional sau pentru o relaie universal. Plecnd de la o mulime de proprieti formale ale dependenelor, proprieti considerate drept reguli de deducie (axiome), poate fi obinut mulimea maximal de dependene asociate lui E. Aceast mulime definete nchiderea lui E. Fie R(A1 , A2 , ..., An ) o schem relaional i fie X, Y submulimi de atribute ale lui R. X determin funcional Y sau Y depinde funcional (FD) de X, dac pentru orice relaie r (valoare curent a lui R) nu exist dou tupluri care s aib aceleai valori pentru atributele lui X i s aib valori diferite pentru cel puin un atribut din Y. Cu alte cuvinte, o valoare a lui X determin unic o valoare a lui Y. Notaia utilizat pentru desemnarea dependenei funcionale este X Y. Altfel spus: Definitie: Fie R un tabel relational si X si Y dou submultimi de coloane ale lui R. Spunem c X determin functional pe Y sau c Y depinde functional de X dac nu exist dou rnduri n tabelul R care s aib aceleasi valori pentru coloanele din X si s aib valori diferite pentru coloanele din Y. Dependena funcional X Y reprezint o constrngere aplicat tuplurilor relaiei R, n sensul c oricare dou tupluri din R care au aceeai valoare pentru X trebuie s ia aceeai valoare i pentru Y. Dac pentru fiecare valoare a lui X exist cel mult o valoare a lui Y, spunem c X este determinant iar Y este determinat. Comparnd toate submulimile de atribute ale unei relaii i determinnd legturile dintre ele, se pot obine toate dependenele funcionale pe care o relaie le satisface. Aceast abordare nu este eficient, consumnd mult timp. Exist posibilitatea ca, tiind anumite dependene funcionale i utiliznd reguli de deducie, s fie obinute toate dependenele funcionale.
22

Fie X, Y, Z, W mulimi de atribute ale unei scheme relaionale R i fie urmtoarele reguli de inferen (axiome) prin care noi dependene funcionale pot fi deduse din cele date: Ax1 reflexivitate. X X. Mai general, dac Y X, atunci X Y. Ax2 creterea determinantului. Pot fi considerate trei formulri echivalente pentru aceast axiom. 1. Dac X Y i X Z, atunci Z Y. 2. Dac X Y i W Z, atunci X Z Y W. 3. Dac X Y atunci X Z Y Z. Ax3 tranzitivitate. Dac X Y i Y Z, atunci X Z. 4.3. Necesitatea normalizrii Anomaliile care apar n lucrul cu baze de date se produc datorit dependenelor care exist ntre datele din cadrul relaiilor bazei. Aceste anomalii fac extrem de dificil lucrul cu baza de date. Aceste anomalii vor fi comentate cu ajutorul unui exemplu. Se consider o vizualizare (VP) asupra schemei relaionale PREZENTARE ce conine doar atributele cod_prezentare#, denumire, luna_start, cod_organizator. Aceste atribute reprezint pentru fiecare prezentare de mod: codul acesteia, denumirea, luna n care ncepe prezentarea i codul organizatorului. Se consider constrngerea: toate prezentrile de mod cu acelai nume ncep n aceeai lun. cod_prezentar e 1 2 3 4 5 denumire primavara primavara primavara iarna toamna luna_start mai mai mai martie august cod_organizato r 11 37 11 32 11

Fig. 4.1. Vizualizarea VP Datorit dependenei introduse pot exista: anomalii la inserare, modificare sau tergere, redundan n date, probleme de reconexiune. 1. Redundan logic. Cuplul (primavara, mai) apare de trei ori.

23

2.

3.

4.

Anomalie la inserie. Dac se dorete includerea unei prezentri de mod, care va incepe n luna aprilie i va avea denumirea veselie, atunci perechea (veselie, aprilie) poate fi inserat n relaia VP doar dac se definete o nou valoare pentru cheia primar. Anomalie la tergere. Dac este tears nregistrarea pentru care codul prezentrii are valoarea 4, atunci se pierde informaia c prezentarea avnd denumirea iarna a nceput n luna martie. Anomalie la modificare. Dac se modific luna de nceput a prezentrii primavara de la mai la februarie, atunci costul modificrii este mare pentru a modifica toate nregistrrile, iar dac se modific doar o nregistrare atunci constrngerea nu va mai fi verificat.

Anomaliile au aprut datorit dependenei funcionale (constrngerii) introduse anterior. Normalizarea are drept scop: suprimarea redundanei logice, evitarea anomaliilor la reactualizare, rezolvarea problemei reconexiunii. Exist o teorie matematic a normalizrii al crei autor este E.F. Codd. Soluia lui E.F. Codd este construirea unor tabele standard (forme normale). Normalizarea este procesul reversibil de transformare a unei relaii, n relaii de structur mai simpl. Procesul este reversibil n sensul c nicio informaie nu este pierdut n timpul transformrii. O relaie este ntr-o form normal particular dac ea satisface o mulime specificat de constrngeri. Procesul normalizrii se realizeaz plecnd de la o relaie universal ce conine toate atributele sistemului de modelat, plus o mulime de anomalii. Orice form normal se obine aplicnd o schem de descompunere. 4.4. Forme normale Formele normale ale relaiilor din baze de date relaionale sunt definite n raport cu anomaliile care pot aprea n lucrul cu aceste relaii, deci n funcie de dependenele nedorite care se manifest n cadrul relaiilor. Pe msur ce relaia este transformat n forme superioare, devine din ce n ce mai restrictiv ca format i mai puin expus anomaliilor la reactualizare. Altfel spus: Definitie: Normalizarea reprezint procesul de descompunere a unui tabel relational n mai multe tabele care satisfac anumite reguli si care stocheaz aceleasi date ca si tabelul initial astfel nct s fie eliminate redundanta n date si anomaliile la actualizare.

24

Prima form normal (FN1) O relaie este n prima form normal dac fiecrui atribut care o compune i corespunde o valoare indivizibil (atomic). n plus, un tuplu nu trebuie s conin atribute sau grupuri de atribute repetitive. Aceast form figureaz ca cerin minimal n majoritatea sistemelor relaionale. Algoritm AFN1 (aducerea unei relaii n FN1 prin eliminarea atributelor compuse i a celor repetitive) 1. Se introduc n relaie, n locul atributelor compuse, componentele acestora. 2. Se plaseaz grupurile de atribute repetitive, fiecare n cte o nou relaie. 3. Se introduce n schema fiecrei noi relaii de la pasul 2 cheia primar a relaiei din care a fost extras atributul repetitiv. 4. Se stabilete cheia primar a fiecrei noi relaii create la pasul 2. Aceasta este compus din cheia introdus la pasul 3, precum i din atribute proprii ale acestor noi relaii. Forma normal 2 (FN2) O relaie R este n a doua form normal dac i numai dac: relaia R este n FN1; fiecare atribut care nu este cheie (nu particip la cheia primar) este dependent de ntreaga cheie primar. A doua condiie exprim necesitatea dependenei totale de cheia primar. Aceast form normal interzice manifestarea unor dependene funcionale pariale n cadrul relaiei R. Pentru a obine o relaie FN2 se poate aplica regula Casey-Delobel. Fie relaia R(K1, K2, X, Y), unde K1 i K2 definesc cheia primar, iar X i Y sunt mulimi de atribute, astfel nct K1 X. Din cauza dependenei funcionale K1 X care arat c R nu este n FN2, se nlocuiete R (fr pierdere de informaie) prin dou proiecii R1(K1, K2, Y) i R2(K1, X). Caracterul reversibil al normalizrii Prin caracter reversibil al normalizrii se ntelege faptul c descompunerea se face fr pierdere de informatie, adic tabelul initial poate fi reconstituit prin compunerea natural, pe atribute comune, a tabelelor rezultate.
25

Pentru un tabel R care se descompune prin proiectie n mai multe tabele: R1, R2, Rn, conditia de descompunere fr pierdere de informatie presupune ca n urma operatiei de compunere natural a tabelelor R1, R2, Rn s se obtin tabelul R. Regula Casey-Delobel (caz particular de descompunere fr pierdere de informatie): Fie un tabel R(X, Y, Z) care se descompune prin proiectie n tabelele R1(X, Y) si R2(X, Z) unde prin X notm setul de coloane comune ale tabelelor R1 si R2, iar prin Y si Z, coloanele specifice lui R1, respectiv R2. Conditia de descompunere fr pierdere de informatie presupune ca tabelul R s fie obtinut prin compunerea natural a tabelelor R1 si R2. n SQL: SELECT R1.X, R1.Y, R2.Z FROM R1, R2 WHERE R1.X = R2.X Algoritm AFN2 (aducerea unei relaii n FN2 prin eliminarea dependenelor funcionale pariale din cadrul unor relaii aflate n FN1) 1. Pentru fiecare dependen funcional parial se creeaz o nou relaie avnd schema format din determinantul i determinatul acestei dependene. 2. Se elimin din cadrul relaiei iniiale atributele care formeaz determinatul dependenei pariale. 3. Dac n relaia iniial exist mai multe dependene pariale cu acelai determinant, pentru acestea se creeaz o singur relaie cu schema format din determinant (luat o singur dat) i din determinaii dependenelor considerate. 4. Se determin cheia primar a fiecrei noi relaii create. Aceasta va conine atributele din determinantul dependenei funcionale pariale care au stat la baza constituirii relaiei. 5. Dac noile relaii create conin dependene pariale, atunci se face transfer la pasul 1, altfel procesul de aducere la FN2 s-a terminat.

26

Exemplu Fie schema relaional PARTICIPA (cod_prezentare#, cod_casa_moda#, tip, data, data_start, data_final, denumire) Pentru relaia PARTICIPA sunt adevrate dependenele: {cod_prezentare} {data_start, data_final, denumire} {cod_prezentare, cod_casa_moda} {data, tip} Relaia PARTICIPA este n FN1, dar nu este n FN2 deoarece atributele data_start, data_final i denumire nu depind de codul casei de mod, deci nu depind de ntreaga cheie primar. Pen tru a o b ine o relaie n FN2 se aplic reg u a Casey Delo b e i l l relaia PARTICIPA se proiecteaz n dou relaii: PARTI1(cod_prezentare#, data_start, data_final, denumire) PARTI2(cod_prezentare#, cod_casa_moda#, data, tip). Not (reamintim C2): Entitatea PREZENTARE are atributele: cod_prezentare, denumire, data_start, data_final, cod_organizator, cod_soc_asig, cod_locatie. Entitatea CASA_MODA are atributele: cod_casa_moda, nume, cifra_afaceri, proprietar, director, istoric, data_creare, cod_localizare, cod_info_acces. Atribute ale relatiei PARTICIPA tip = variabil de tip caracter, de lungime maxim 15, care reprezint modalitatea n care o cas de mod particip la o prezentare, n sensul c poate fi organizator sau neorganizator. data = variabil de tip dat calendaristic reprezentnd ziua n care defileaz modelele casei de mod. Atributul nu este multiplu, deoarece s-a presupus c defilarea unei case de mod are loc ntr-o singur zi. Alt Exemplu: Fie tabelul VANZARI care se foloseste la nregistrarea tranzactiilor unui magazin ce vinde articole la comand. VANZARI (cod_client#, cod_comanda#, cod_articol#, nume_client, nr_telefon, data, nume_articol, cost_articol, cantitate) A1 C1 P1 Popescu 415355 08.10.04 camasa 400000 2 A1 C1 P3 Popescu 415355 08.10.04 tricou 200000 1
27

A2 C2 P1 Ionescu 596322 09.10.04 camasa 400000 3 A2 C2 P3 Ionescu 596322 C2 09.10.04 tricou 200000 2 A2 C2 P2 Ionescu 596322 09.10.04 pantaloni 800000 1 A1 C3 P3 Popescu 415355 10.10.04 tricou 200000 3 A3 C4 P1 Marinescu 546229 C4 10.10.04 P1 camasa 400000 1 Tabelul de mai sus prezint urmtoarele deficiente: a) redundante n date: - informatia (P1, camasa, 400000) este specificata de 3 ori - informatia (A1, Popescu, 415355) este specificata de 3 ori - informatia (A2, Ionescu, 196322) este specificata de 3 ori - s. a. m. d. b) anomalii la actualizare: - anomalie la insertie Dac magazinul achizitioneaz un nou articol (P4, pantofi, 980000) informatia nu poate fi introdus n tabel (un nou tuplu) pentru c s-ar introduce o valoare Null n cheia primar (cod_comanda). - anomalie la stergere Dac este anulat articolul P2 n cadrul comenzii C2 se pierde informatia referitoare la numele si costul articolului respectiv. - anomalie la modificare Dac se modific numrul de telefon al unui client, modificarea trebuie facut n toate tuplurile (liniile) unde apare numele acelui client. n tabelul VANZARI exist urmtoarele dependente functionale n care determinantul nu este cheie a tabelului: (cod_articol) (nume_articol, cost_articol) (cod_comanda) (data, cod_client, nume_client, nr_telefon) (cod_client) (nume_client, nr_telefon) Pen tru a o b ine o relaie n FN2 se aplic reg u a Casey Delo b e i l l relaia VANZARI se proiecteaz n trei relaii: VANZARI1(cod_articol# nume_articol, cost_articol) VANZARI2(cod_comanda#, data, cod_client, nume_client, nr_telefon) VANZARI3(cod_client #, nume_client, nr_telefon)

28

Forma normal 3 (FN3) Intuitiv, o relaie R este n a treia form normal dac i numai dac: relaia R este n FN2; fiecare atribut care nu este cheie (nu particip la o cheie) depinde direct de cheia primar. Fie R o relaie, X o submulime de atribute ale lui R i A un atribut al relaiei R. A este dependent tranzitiv de X dac exist Y astfel nct X Y i Y A (unde A nu aparine lui Y i Y nu determin pe X). De exemplu, dac au loc dependenele K 1 , K 2 , K 3 A1 i K 1 , K 2 , A1 A 2 , atunci K 1 , K 2 , K 3 K 1 , K 2 , A 1 i K 1 , K 2 , A 1 A 2 . Prin urmare, A2 este dependent tranzitiv de K 1 , K 2 , K 3 . Formal, o relaie R este n a treia form normal dac i numai dac: relaia R este n FN2; fiecare atribut care nu este cheie (nu particip la o cheie) nu este dependent tranzitiv de nicio cheie a lui R. A doua condiie interzice utilizarea dependenelor funcionale tranzitive n cadrul relaiei R. Prin urmare, o relaie este n FN3 dac i numai dac fiecare atribut care nu este cheie depinde de cheie, de ntreaga cheie i numai de cheie. Pentru a obine o relaie FN3 se poate aplica regula de descompunere Casey-Delobel. Fie relaia R(K, X 1 , X 2 , X3 ), unde atributul X 2 depinde tranzitiv de K, iar K este cheia primar a lui R. Presupunem c K X 1 X2 . Din cauza dependenei funcionale X1 X 2 care arat c R nu este n FN3, se nlocuiete R (fr pierdere de informaie) prin dou proiecii R1(K, X1 , X 3 ) i R2(X 1 , X2 ). Dependena tranzitiv poate fi mai complex. Fie K 1 o parte a cheii K. Tranzitivitatea poate fi de forma K Y X 2 unde Y = {K 1 , X 1 }. n acest caz, R poate fi descompus n R1(K, X1 , X 3 ) i R2(K 1 , X 1 , X2 ). Algoritm AFN3 (aducerea unei relaii FN2 n FN3 prin eliminarea dependenelor funcionale tranzitive) 1. Pentru fiecare dependen funcional tranzitiv se transfer atributele implicate n dependena tranzitiv ntr-o nou relaie. 2. Se determin cheia primar a fiecrei noi relaii create la pasul 1. 3. Se introduc n relaia iniial, n locul atributelor transferate, cheile primare determinate la pasul 2.
29

4.

Se reanalizeaz relaia iniial. Dac n cadrul ei exist noi dependene tranzitive, atunci se face transfer la pasul 1, altfel procesul de aducere la FN3 s-a terminat.

Exemplu Fie schema relaional PREZENT(cod_prezentare#, data_start, data_final, denumire, cod_locatie, capacitate, cod_info_acces). Pentru relaia PREZENT sunt adevrate dependenele: {cod_prezentare} {data_start, data_final, denumire, cod_locatie} {cod_locatie} {capacitate, cod_info_acces} Relaia PREZENT este n FN2, dar nu este n FN3 deoarece atributele capacitate, cod_info_acces depind indirect de cheia primar, prin intermediul atributului cod_locatie. Pentru a obine o relaie n FN3 se aplic regula Casey-Delobel i relaia PREZENT se proiecteaz n dou relaii, prin eliminarea dependenelor funcionale tranzitive. PREZENT1(cod_prezentare#, data_start, data_final, denumire, cod_locatie) PREZENT2(cod_locatie#, capacitate, cod_info_acces) Forma normal Boyce-Codd (BCNF) Determinantul este un atribut sau o mulime de atribute neredundante, care constituie un identificator unic pentru alt atribut sau alt mulime de atribute ale unei relaii date. Intuitiv, o relaie R este n forma normal Boyce-Codd dac i numai dac fiecare determinant este o cheie candidat. Formal, o relaie R este n forma normal Boyce-Codd dac i numai dac pentru orice dependen funcional total X A, X este o cheie a lui R. Algoritm ABCNF (aducerea unei relaii FN3 n BCNF prin eliminarea dependenelor funcionale ai cror determinani nu sunt chei candidat) 1. Dac relaia conine unul sau cel mult dou atribute, atunci nu pot exista dependene noncheie i deci relaia este n BCNF. 2. Dac relaia conine mai mult de dou atribute, se caut dac ea conine dependene noncheie. Dac nu exist astfel de dependene, relaia este n BCNF. 3. Pentru fiecare dependen noncheie X Y se creeaz dou relaii. Una dintre ele va avea schema format din atributele {X, Y}, iar
30

4.

cealalt va avea schema format din toate atributele relaiei iniiale, mai puin Y. Se reiau paii 1, 2, 3 pentru relaiile obinute la pasul 3.

Exemplu Se consider relaia FINANTEAZA1, ce leag entitile PREZENTARE i SPONSOR. Ea are cardinalitatea many to many i va genera un tabel asociativ. Se presupune c acest tabel are schema relaional: FINANTEAZA1(cod_prezentare#, cod_sponsor#, nume_prezentare, cod_ordin_plata). Pentru exemplul analizat se presupune c numele prezentrilor sunt unice. Prin urmare, n orice moment fiecare prezentare are un cod unic i un nume unic. Cheile candidat sunt {cod_prezentare, cod_sponsor}, respectiv {nume_prezentare, cod_sponsor}. ntre atributele relaiei exist dependenele: {cod_prezentare, cod_sponsor} {cod_ordin_plata} {cod_prezentare} {nume_prezentare} Tabelul nu este n BCNF deoarece conine doi determinani, cod_prezentare i nume_prezentare, care nu sunt chei candidat pentru tabelul respectiv. Ambele atribute sunt determinani deoarece fiecare l determin pe cellalt. Soluia problemei const n divizarea relaiei n dou proiecii conform tehnicii Casey-Delobel. PREZENTARE(cod_prezentare#, nume_prezentare) FINANTEAZA(cod_prezentare#, cod_sponsor#, cod_ordin_plata) Forma normal 4 (FN4) Dac BCNF elimin redundanele datorate relaiilor singulare, FN4 elimin redundanele datorate relaiilor m:n, adic datorate dependenei multiple. Intuitiv, o relaie R este n a patra form normal dac i numai dac relaia este n BCNF i nu conine relaii m:n independente. Exemplu Fie schema relaional PERS_CONTACT(cod_pers#, limba_cunoscuta, nr_telefon). Se presupune c o persoan de contact poate cunoate mai multe limbi strine i poate avea mai multe numere de telefon. ntre atributele relaiei exist multidependenele:
31

cod_pers# limba_cunoscuta cod_pers# nr_telefon. Pentru a aduce relaia PERS_CONTACT (care este n BCNF) n FN4, aceasta se va diviza n dou proiecii : PERS_CONTACT1(cod_pers#, limba_cunoscuta) PERS_CONTACT1(cod_pers#, nr_telefon). Forma normal 5 (FN5) Semnificaia lui FN5 este mai mult academic, ea aprnd rar n practic. A cincea form normal i propune eliminarea redundanelor care apar n relaii m:n dependente. n general, aceste relaii nu pot fi descompuse. S-a artat c o relaie de tip 3 este diferit de trei relaii de tip 2. Exist totui o excepie, i anume, dac relaia este ciclic. Intuitiv, o relaie R este n forma normal 5 dac i numai dac: 1. relaia este n FN4; 2. nu conine dependene ciclice. Exemplu Se consider o relaie ce conine informaii despre creatori, vestimentaiile create de acetia i accesoriile corespunztoare. Se consider schema relaional CREARE(cod_vestimentatie#, cod_creator#, cod_accesoriu#). Se presupune c fiecare creator poate crea una sau mai multe vestimentaii. Fiecare vestimentaie poate fi creat de unul sau mai muli creatori. Similar, fiecare creator este responsabil de crearea unuia sau a mai multor accesorii, iar fiecare accesoriu este creat de unul sau mai muli creatori. Fiecare accesoriu apare n una sau mai multe vestimentaii, iar fiecrei vestimentaii i se ataeaz unul sau mai multe accesorii. Mai mult chiar, dac creatorul C creeaz vestimentaia V, iar accesoriul A este ataat lui V, iar C este este responsabil de A, atunci C creeaz accesoriul A pentru vestimentaia V. innd seama de constrngerile impuse modelului se obin dependenele: {cod_vestimentatie#, cod_creator#} {cod_accesoriu} {cod_vestimentatie#, cod_accesoriu#} {cod_creator} {cod_accesoriu#, cod_creator#} {cod_vestimentatie}. Datorit dependenelor formulate anterior, relaia nu este n FN5. Ea se poate rupe prin proiecie n trei relaii: CREARE1(cod_vestimentatie#, cod_creator#)
32

CREARE2(cod_vestimentatie#, cod_accesoriu#) CREARE3(cod_creator#, cod_accesoriu#). n acest caz, sunt evidente relaiile: CREARE JOIN(CREARE1, CREARE2) CREARE JOIN(CREARE1, CREARE3) CREARE JOIN(CREARE2, CREARE3) CREARE = JOIN(JOIN(CREARE1, CREARE2), CREARE3). Concluzii: 1. FN1 FN2 elimin redundanele datorate dependenei netotale a atributelor care nu particip la o cheie, fa de cheile lui R. Se suprim dependenele funcionale care nu sunt totale. 2. FN2 FN3 elimin redundanele datorate dependenei tranzitive. Se suprim dependenele funcionale tranzitive. 3. FN3 BCNF elimin redundanele datorate dependenei funcionale. Se suprim dependenele n care partea stng nu este o supercheie. 4. BCNF FN4 elimin redundanele datorate multidependenei. Se suprim toate multidependenele care nu sunt i dependene funcionale. 5. FN4 FN5 elimin redundanele datorate dependenei ciclice. Se suprim toate join-dependenele care nu sunt implicate de o cheie. 6. BCNF, FN4 i FN5 corespund la regula c orice determinant este o cheie, dar de fiecare dat dependena cu care se definete determinantul este alta i anume dependena funcional, multidependena sau join-dependena. 7. Descompunerea unei relaii FN2 n FN3 conserv datele i dependenele, pe cnd descompunerea unei relaii FN3 n BCNF i, respectiv, a unei relaii BCNF n FN4 conserv doar datele.

33

Limbajul de interogare a datelor(DQL)


Limbajul SQL de interogare a datelor (DQL Data Query Language) include o singur comand SELECT, care este cea mai folosit pentru a obine date din baza de date, astfel nct acestea s fie prelucrate de o anumit aplicaie sau s fie afiate. Rezultatul unei instruciuni SELECT, numit i set de rezultate, este returnat sub forma unui tabel. Deoarece SQL este un limbaj neprocedural, se specific rezultatele pe care le dorii s le obinei, nu i modul lor de obinere. Instruciunea SELECT de baz Cererea (interogarea) este realizat de instruciunea SELECT. Cu ajutorul ei pot fi extrase submulimi de valori att pe vertical (coloane), ct i pe orizontal (linii) din unul sau mai multe tabele. Sintaxa comenzii este simpl, apropiat de limbajul natural. SELECT FROM [WHERE [GROUP BY [HAVING [ORDER BY [ALL | DISTINCT] {* | list de atribute selectate | expr AS alias} { [schema.]tabel [alias_tabel] } condiie] list de expresii condiie]] {expresie | poziie | c_alias} [ASC | DESC]]

Forma elementar a instruciunii SELECT conine dou clauze: SELECT [DISTINCT] - Specific lista de coloane care urmeaz s fie returnate n setul de rezultate, separate prin virgule. Se poate folosi simbolul asterisc (*) n locul listei de coloane pentru a selecta toate coloanele dintr-un tabel sau dintr-o vizualizare. Cuvntul cheie DISTINCT poate fi adugat dup cuvntul cheie SELECT pentru a elimina rndurile duplicate din rezultatele interogrii. FROM - Specific lista tabelelor sau vizualizrilor din care urmeaz s fie selectate datele. n locul numelor reale ale tabelelor sau vizualizrilor se poate folosi sinonime, adic pseudonime pentru tabele sau vizualizri definite n baza de date. Prezena clauzelor SELECT i FROM este obligatorie deoarece acestea specific coloanele selectate, respectiv tabelele din care se vor extrage datele. Tabelele specificate n clauza FROM pot fi urmate de un alias, care va reprezenta numele folosit pentru referirea tabelului respectiv n cadrul instruciunii.

Eliminarea duplicatelor se poate realiza folosind clauza DISTINCT. Dac nu se specific parametrul DISTINCT, parametrul ALL este implicit i are ca efect afiarea dublurilor. Simbolul * permite selectarea tuturor atributelor din tabelele asupra crora se execut cererea. Atributele sau expresiile din lista clauzei SELECT pot conine alias-uri, care vor reprezenta numele cmpurilor respective n cadrul tabelului furnizat ca rezultat de instruciunea SELECT. Clauza WHERE poate fi folosit pentru a impune anumite condiii liniilor din care se vor extrage atributele specificate n clauza SELECT. Clauza GROUP BY grupeaz nregistrrile dup anumite cmpuri; n cazul prezenei acestei clauze, clauza HAVING poate impune restricii suplimentare asupra rezultatului final. Ordonarea nregistrrilor se poate face cu ajutorul clauzei ORDER BY. Cu ajutoru l p arametrilor ASC i DESC se p o a sp ecifica te ordonarea cresctoare, respectiv descresctoare a nregistrrilor. Pentru o secven cresctoare valorile null sunt afiate ultimele. Dac nu se face nici o specificaie, atunci ordinea de returnare este la latitudinea serverului. n exemplul urmtor se selecteaz coloanele: COD_G EN_ FILM, MPAA_RATING_COD i TITLU_FILM din tabelul FILM. SELECT COD_GEN_FILM, COD_ RATING, TITLU_FILM FROM FILM; Pseudonime pentru numele coloanelor In setul de rezultate din interogri numele coloanelor din tabel apare automat ca titlu de coloane n interogare. Dac se dorete un alt nume pentru coloanele unei interogri se folosesc pseudonime. Pseudonimele (aliases) specificate devin numele coloanelor din setul de rezultate. Pseudonimele nu exist dect dup rularea instruciunii SQL, aa c nu pot fi folosite n alte pri ale instruciunii SQL. Pseudonimul unei coloane este specificat prin plasarea cuvntului cheie AS" dup numele coloanei n lista SELECT (cu cel puin un spaiu nainte i dup), urmat de numele dorit pentru a fi atribuit coloanei n setul de rezultate. SELECT COD_GEN_FILM AS GEN, MPAA_RATING_COD AS RATING, TITLU_FILM AS FILM FROM FILM;

Dac n interiorul alias-ului apare un spaiu liber sau caractere speciale, atunci alias-ul trebuie scris ntre ghilimele. SELECT FROM dateresdataim numar zile imprumuta;

Sortarea rezultatelor Rezultatele interogrilor sunt deseori mult mai utile dac se specific pentru rndurile returnate o ordine care s aib o semnificaie pentru persoana sau aplicaia care folosete informaiile. n SQL, acest lucru este fcut prin adugarea n instruciunea SELECT a clauzei ORDER BY, cu o list de una sau mai multe coloane care vor fi folosite pentru sortarea rndurilor n ordine ascendent sau descendent, n conformitate cu valorile datelor din coloane. De asemenea, se ine seama de urmtoarele aspecte: Ordinea prestabilit pentru fiecare coloan este ascendent, dar se poate aduga cuvntul cheie ASC dup numele coloanei pentru obinerea unei ordonri ascendente sau cuvntul cheie DESC pentru obinerea unei ordonri descendente. Nu este obligatoriu ca numele coloanelor din lista ORDER BY s fie incluse i n lista de rezultate (adic n lista SELECT). Motorul SQL din SGBD va gsi cea mai bun cale de ordonare a coloanelor. n general, sortarea datelor este un proces costisitor din punct de vedere al resurselor de calcul, aa c majoritatea sistemelor SGBD folosesc un index pentru accesul la rnduri n ordinea dorit, presupunnd c exist, i fac o sortare propriu-zis numai ca ultim soluie. Se poate folosi pseudonimele coloanelor n clauza ORDER BY, dar dac se face acest lucru se foreaz motorul SQL s sorteze rezultatele abia dup rularea interogrii. n locul coloanelor, se poate specifica n lista de ordonare poziia relativ a coloanelor. De exemplu, clauza ORDER BY 1,2 va sorta rezultatele n ordine ascendent dup primele dou coloane din setul de rezultate. Numrul specificat nu are nici o legtur cu poziia coloanei n tabelul sau vizualizarea surs. Aceast opiune nu este agreat n programarea SQL formal, deoarece dac ulterior cineva modific interogarea, este posibil s amestece coloanele din lista SELECT, fr si dea seama c astfel schimb i coloanele folosite pentru sortarea rezultatelor. Exemplu: SELECT MPAA_ RATING_COD AS RATING, COD_GEN_FILM AS GEN, TITLU_FILM AS FILM

FROM FILM ORDER BY MPAA_RATING_COD, COD_GEN_FILM ; Dac dorim s ordonm acum cresctor dup rating i descresctor dup gen, atunci instruciunea de mai sus modificat va fi SELECT MPAA_ RATING_COD AS RATING, COD_GEN_FILM AS GEN, TITLU_FILM AS FILM FROM FILM ORDER BY MPAA_RATING_COD ASC, COD_GEN_FILM DESC; Observaie: Oracle va afia titlu de coloana la dimensiunea maxim a valorilor din coloana(de ex. dac n coloana RATING val cea mai mare este de 5 caractere, interogarea va afia RATIN). n noua versiune de SQL produs de Oracle, iSQL*Plus, nu mai prescurteaz. Exemplu : SELECT titlu, autor, pret, coded as domeniu from carte order by coded, autor; SELECT titlu, autor, pret, coded as domeniu from carte order by coded desc, pret; Se observa ca domeniu este trunchiat la 5 caractere, DOMEN

Utilizarea clauzei WHERE pentru filtrarea rezultatelor SQL folosete clauza WHERE pentru a filtra rndurile ce urmeaz s fie afiate. O interogare fr o clauz WHERE returneaz un set de rezultate care conine toate rndurile din tabelele sau vizualizrile referite n clauza FROM. Dac este inclus o clauz WHERE, sunt folosite regulile algebrei booleene, evalund clauza WHERE pentru fiecare rnd de date. n rezultatele interogrii sunt afiate numai rndurile pentru care clauza WHERE este evaluat la valoarea logic adevrat". Operatorii utilizai n clauza WHERE se impart n patru categorii: Operatori de comparare Operatori conjuctivi Operatori logici Operatori aritmetici Operatori de comparare
Operatorii de comparare sunt folosii n clauza WHERE pentru compararea a dou valori, avnd ca rezultat o valoare logic de adevrat" sau fals". Cele dou valori comparare pot fi constante furnizate n clauza WHERE, valori ale unor coloane din baza de date sau combinaii ale celor dou. Operatorii de comparare care pot fi folosii n clauza WHERE sunt prezentai n tabelul urmtor:

Operator = < <= > >= != <>

Descriere Egal cu Mai mic dect Mai mic sau egal Mai mare dect Mai mare sau egal Diferit de Diferit de (standard ANSI)

Exemple din schema FILM: S se afieze toate filmele pentru care RATING are valoarea PG-13. SELECT MPAA_RATING_COD AS RATING, TITLU_FILM FROM FILM WHERE MPAA_ RATING_COD = 'PG-13' ORDER BY TITLU_FILM; S se afieze filmele pentru care COD_RATING are alt valoare dect PG-13. SELECT COD_RATING AS RATING, TITLU_FILM FROM FILM WHERE COD_RATING <> 'PG-13' ORDER BY TITLU_FILM; S se afieze toate filmele cu preul de vnzare cu amnuntul pentru formatul DVD(DVD Retail Price) mai mare de 25.00, n ordinea cresctoare a preurilor. SELECT PRET_VANZARE_DVD, TITLU_FILM FROM FILM WHERE PRET_VANZARE_DVD >= 25.00 ORDER BY PRET_VANZARE_DVD DESC;

Exemple pe schema BIBLIOTECA S se obtin codul crtii care are data restituirii >.. SELECT codel FROM imprumuta WHERE datares >= 05oct09;

S se obin titlurile i numrul de exemplare ale crilor care au nrex>100 ; SELECT titlu, nrex FROM carte WHERE nrex>100;

Operatori conjunctivi Uneori sunt necesare condiii multiple pentru a ngusta setul de rezultate al unei interogri. Atunci cnd sunt folosite mai multe condiii, ele trebuie s fie combinate din punct de vedere logic n clauza WHERE, iar aceasta este sarcina operatorilor conjunctivi. Aceti operatori sunt: AND (I) - Clauza WHERE este evaluat ca adevrat" dac toate condiiile conectate cu operatorul AND sunt adevrate. OR (SAU) - Clauza WHERE este evaluat ca adevrat" dac oricare din condiiile conectate cu operatorul OR este adevrat. Operatorul AND are prioritate mai mare i, ca urmare, este evaluat naintea operatorilor OR. Exemple de folosire a operatorilor conjunctivi:

S se afieze toate filmele pentru care categoria RATING este PG13 i preul de vnzare cu amnuntul pentru formatul DVD este 19.99 sau mai mic, n ordinea cresctoare a preurilor. SELECT COD_RATING AS RATING, PRET_VANZARE_DVD AS PRET, TITLU_FILM FROM FILM WHERE COD_RATING = 'PG-13' AND PRET_VANZARE_DVD <= 20.00 ORDER BY PRET_VANZARE_DVD;

S se afieze toate filmele pentru care categoria RATING este PG13 sau preul de vnzare cu amnuntul pentru formatul DVD este 19.99 sau mai mic, n ordinea cresctoare a preurilor. SELECT COD_RATING AS RATING, PRET_VANZARE_DVD AS PRET, TITLU_FILM FROM FILM WHERE COD_RATING = 'PG-13' OR PRET_VANZARE_DVD <= 20 ORDER BY PRET_VANZARE_DVD;

Afiai toate filmele pentru care categoria RATING este PG-13 i sunt din genul dram sau aciune/aventur. SELECT COD_RATING AS RATING, PRET_VANZARE_DVD AS PRET, TITLU_FILM FROM FILM WHERE COD_GEN_FILM= 'ActAd' OR COD_GEN_FILM = 'Drama' AND COD_RATING = 'PG-13' ORDER BY COD_GEN_FILM, COD_RATING;

S se adauge parantezele necesare, astfel nct s obinem filmele cu categoria PG-13 i genul aciune/aventur sau dram. SELECT COD_GEN_FILM AS GEN, COD_RATING AS RATING, TITLU_FILM FROM FILM WHERE (COD_GEN_FILM = 'ActAd' OR COD_GEM_FILM = 'Drama') AND COD_RATING='PG-13' ORDER BY COND_GEN_FILM, COD_RATING; Operatori logici

Operatorii logici folosesc cuvinte cheie n locul simbolurilor la formarea expresiilor de comparare. La oricare dintre aceti operatori poate fi adugat cuvntul cheie NOT, pentru a inversa valoarea logic a comparaiei.

IS NULL Operatorul IS NULL este folosit pentru a determina dac o valoare este nul. Exemple: S se gseasc toate conturile de clieni active, adic toate conturile pentru care coloana DATA TERMINATA conine o valoare nul: SELECT ID_CONT_CLIENT FROM CONT_CLIENT WHERE DATA_INCHEIERE IS NULL;

S se gseasc toate conturile inactive, adic toate conturile pentru care coloana DATA TERMINAT conine o alt valoare dect NULL: SELECT ID_CONT_CLIENT FROM CONT_CLIENT WHERE DATA_INCHEIERE IS NOT NULL;

BETWEEN Operatorul BETWEEN este folosit pentru a determina dac o valoare se ncadreaz ntr-un interval special. Intervalul este specificat folosind o valoare minim i o valoare maxim, fiind un interval inclusiv, ceea ce nseamn c include i valori specificate. Exemple: S se afieze toate filmele cu preul de vnzare cu amnuntul pentru formatul DVD ntre 14.99 i 19.99, ordonate cresctor dup pre. SELECT TITLU_FILM, PRET_VANZARE_DVD FORM FILM WHERE PRER_VANZARE_DVD BETWEEN 14.99 AND 19.99 ORDER BY PRER_VANZARE_DVD; S se afieze toate filmele pentru care preul de vnzare cu amnuntul pentru formatul DVD nu este n intervalul 14.99-19.99, ordonate cresctor dup pre. SELECT TITLU_FILM, PRET_VANZARE_DVD FORM FILM WHERE PRET_VANZARE_DVD NOT BETWEEN 14.99 AND 19.99 ORDER BY PRET_VANZARE_DVD; S se afieze toate conturile de clieni n luna ianuarie 2009. SELECT ID_CONT_CLIENT, DATA_INSCRIERE FROM CONT_CLIENT WHERE DATA_INSCRIERE BETWEEN 2009/01/01 AND 2009/01/31;
9

Tabelul DUAL se afl n schema SYS i poate fi accesat de ctre toi utilizatorii. Tabelul este util atunci cnd se afieaz valoarea unei constante, pseudocoloane sau expresii care nu este construit pe baza datelor vreunui tabel. n general, tabelul DUAL este utilizat pentru a completa sintaxa instruciunii SELECT, ntruct clauzele SELECT i FROM sunt obligatorii. S se afieze data i ora curent. SELECT TO_CHAR(SYSDATE,DD/MM/YY HH24:MI:SS) FROM DUAL;

LIKE Operatorul LIKE este folosit pentru a compara o valoare de tip caracter cu un tipar*(pattern), returnnd valoarea logic adevrat dac valoarea de tip caracter se ncadreaz n tipar i fals" n caz contrar. Pentru definirea tiparului pot fi folosite dou caractere de nlocuire: Liniua de subliniere (_) - Caracterul liniu de subliniere poate fi folosit drept caracter de nlocuire poziional, ceea ce nseamn c se potrivete cu orice caracter aflat pe poziia respectiv n irul de caractere evaluat. Procent (%) - Simbolul procent (%) poate fi folosit drept caracter de nlocuire nepoziional, ceea ce nseamn c se potrivete cu orice numr de caractere, indiferent de lungime, reprezentnd orice secven de zero sau mai multe caractere, i _, reprezentnd un singur caracter. Exemple de tipare: Tipar Now% N_w Interpretare Se potrivete cu orice ir de caractere care incepe cu Now". Se potrivete cu orice ir de caractere format din exact trei caractere, care ncepe cu N" i se termin cu w".

10

%N -w%

%Now% %Now

Se potrivete cu orice ir de caractere care conine litera N", urmat de orice alt caracter, urmat de litera w" (1a nceputul, la sfritul sau undeva n mijlocul irului de caractere) Se potrivete cu orice ir de caractere care conine Now" (1a inceput, la sfrit sau n mijloc). Se potrivete cu orice ir de caractere care se termin cu Now".

Datele din bazele de date relaionale fac ntotdeauna diferenierea literelor mari de cele mici. O liter mica din date nu se potrivete cu o liter mare din tiparul unei clauze LIKE, i invers. Exemple de utilizare a operatorului LIKE: S se afieze toate titlurile de filme care conin irul de caractere on": SELECT TITLU_FILM FROM FILM WHERE TITLU_FILM LIKE '%on%'; Dac se intenioneaz s se gseasc titlurile care conin cuvntul on", nu literele on" din alte cuvinte, ar fi trebuit s includ n tipar i spatiile necesare, ca n exemplul urmtor: Exemple S se afieze cartile ale cror titlu conine cuvntul Baza, sau pentru care al treilea caracter din autor este p. SELECT titlu, autor FROM carte WHERE titlu LIKE '%Baza%' OR

autor LIKE '__p%';

11

IN Operatorul IN este folosit pentru a determina dac o valoare face parte dintr-o list de valori. Lista poate fi specificat ca valori literale, folosind o list de valori separate prin virgule i ncadrate ntre paranteze, sau poate fi selectat din baza de date folosind o subselecie (o subinterogare), care este o interogare n cadrul unei alte interogri. Exemple de utilizare a operatorului IN: S se afieze toate filmele pentru care COD_GEN_FILM este Drama, Forgn. SELECT COD_GEN_FILM AS GEN, TITLU_FILM FROM FILM WHERE COD_GEN_FILM IN ('Drama', 'Forgn') ORDER BY COD_GEN_FILM, TITLU_FILM; S se afieze toate filmele pentru care descrierea genului conine cuvntul and". Avei nevoie de o subinterogare prin care s gsii toate valorile COD_GEN_FILM care conin cuvntul and" n descriere. Operatorul IN este apoi folosit pentru a gsi filmele care au unul dintre codurile selectate de subinterogare. SELECT COD_GEN_FILM AS GEN, TITLU_FILM FROM FILM WHERE COD_GEN_FILM IN (SELECT COD_GEN_FILM FROM GEN_FILM WHERE GEN_FILM DESCRIPTION LIKE '% and %') ORDER BY COD_GEN_FILM AS GEN, TITLU_FILM; S se afieze toate cartile din domeniile Isi M. SELECT TITLU, AUTOR FROM CARTE WHERE CODED IN(I,M);

12

EXISTS Operatorul EXISTS este folosit pentru a detemina dac o subinterogare conine nregistrri. Dac n setul de rezultate al subinterogrii nu exist nici un rnd, operatorul returneaz valoarea false; dac setul de rezultate conine cel puin un rnd, valoarea devine adevrat. Exemple de utilizare a operatorului EXIST: Proprietarul magazinului a auzit c filmul The Last Samurai se nchiriaz bine att n format DVD, ct i-n format VHS i vrea s se asigure c n inventarul magazinului exist o copie VHS. Tabelul FILM_COPIAT conine un rnd pentru fiecare copie a unui film din inventarul magazinului, aa c putei folosi o subinterogare pentru a afla dac exist copii VHS ale filmului n inventar. De cele mai multe ori, operatorul EXISTS este folosit in conjuncie cu o form mai complex de subinterogare, numit subinterogare corelat. (correlated subquery),n care valorile datelor din interogarea extern (ID_FILM, n acest caz) sunt comparate cu rndurile din interogarea inten. SELECT ID_FILM, TITLU_FILM FROM FILM M WHERE TITLU_FILM = 'The Last Samurai' AND EXISTS (SELECT ID_FILM FROM FILM_COPIAT C WHERE M. ID_FILM = C. ID_FILM); Dac inversai logica, folosind operatorul NOT EXISTS, putei afia titlul filmului numai dac nu exist o copie VHS n inventar. SELECT ID_FILM, TITLU_FILM FROM FILM M WHERE TITLU_FILM = 'The Last Samurai' AND NOT EXISTS (SELECT ID_FILM FROM FILM_COPIAT C WHERE M. ID_FILM = C. ID_FILM);

13

Operatori aritmetici n SQL, operatorii aritmetici sunt folosii pentru efectuarea calculelor matematice la fel ca i n formulele dintr-o foaie de calcul tabelar sau ntr-un limbaj de programare, precum Java sau C. Cei patru operatori aritmetici din SQL sunt: Op Desc erator riere + Adun are Scd ere * nmu lire / mp rire

Ca i n cazul operatorilor conjunctivi, dac se amestec operatorii aritmetici n aceeai instruciune SQL fr a folosi paranteze, ordinea n care sunt evaluate operaiile este determinat de prioritatea predefinit. Din fericire, prioritatea operatorilor din SQL este cea pe care o folosim n operaiile matematice obinuite. Exemple de utilizare a operatorilor aritmetici: Ct v-ar costa s cumprai copiile VHS i DVD ale filmului The Last Samurai? SELECT PRET_VANZARE_VHS + PRET_VANZARE _DVD AS COST FROM FILM WHERE TITLU_FILM = 'The Last Samurai'; Ct v-ar costa aceeai achiziie dac ai avea un bon valoric de 8 ron? SELECT (PRET_VANZARE _VHS + PRET_VANZARE _DVD) - 8 AS COST FROM FILM WHERE TITLU_FILM = 'The Last Samurai'; Dac taxele sunt de 8.25% (0.0825), ct reprezint taxele de vnzare din costul achiziiei anterioare? SELECT (PRET_VANZARE _VHS+ PRET_VANZARE _DVD) * 0.0825 AS TAX FROM FILM WHERE TITLU_FILM = 'The Last Samurai'; Care este costul mediu pentru o copie a filmului The Last Samurai? SELECT (PRET_VANZARE_VHS+PRET_VANZARE _DVD) / 2 AS AVG_COST
14

FROM FILM WHERE TITLU_FILM = 'The Last Samurai'

Funcii SQL elementare


O funcie este un tip special de program, care returneaz o singur valoare de fiecare data cnd este apelat. Termenul provine de la conceptul matematic al unei funcii. n SQL, funciile necesit ntotdeauna specificarea unei expresii, care deseori include numele unei coloane. Cel mai des, funciile sunt folosite n lista de coloane a unei instruciuni SELECT, sunt apelate pentru fiecare rnd prelucrat de interogare i, ca urmare, returneaz o singur valoare pentru fiecare rnd din setul de rezultate. Uneori este folosit termenul funcie de coloan, pentru a indica faptul c o funcie este aplicat unei coloane dintr-un tabel sau o vizualizare. Un numr de funcii sunt furnizate de productorul DBMS i se pot scrie propriile funcii, folosind un limbaj special livrat mpreun cu sistemul DBMS, cum ar fi PL/SQL pentru Oracle sau Transact SQL pentru Microsoft SQL Server i Sybase Adaptive Server. Atenie la folosirea funciilor SQL n condiiile WHERE. n cele mai multe situaii, pentru o coloan creia i este aplicat o funcie nu poate fi folosit indexarea. Ca urmare, n cazul tabelelor mari, utilizarea funciilor n condiiile WHERE poate duce la probleme de performan cu adevrat memorabile. Funciile pot fi clasificate n multe moduri, dar majoritatea specialitilor le mpart dup ceea ce fac. Funcii pentru caractere Funciile pentru caractere sunt numite astfel deoarece manipuleaz date de tip text. Concatenarea irurilor de caractere Funcia de concatenare a irurilor de caractere reunete mai multe iruri de caractere pentru a forma o singur valoare n rezultatele interogrii. Funcia standard de concatenare a irurilor de caractere din SQL este apelat cu dou bare verticale (||), dar exist i excepii, cum ar fi Microsoft SQL Server, care folosete semnul plus (+) pentru concatenarea irurilor de caractere. Exemple de concatenare a irurilor de caractere: Magazinul de produse video vrea s trimit fiecrui client o scrisoare care ncepe cu formula "Client", plus prenumele i numele persoanei. Numele sunt stocate n tabelul PERSON. Soluia acestei cerinte n Oracle:
15

SELECT 'Client' || NUME_PERSOANA|| ' ' || NUME_FAMILIE_PERSOANA AS SALUT_CLIENT FROM PERSOANA; Aceeai soluie, modificat pentru a funciona n Microsoft SQL Server : SELECT Client' + NUME_PERSOANA + ' ' + NUME_FAMILIE_PERSOANA AS SALUT_CLIENT FROM PERSOANA; <nume angajat> castiga <salariu> lunar, dar doreste <salariu de 3 ori mai mare> SELECT last_name||'castiga'||salary||'lunar, dar doreste'||salary*3 "salariul ideal" FROM employees; UPPER Funcia UPPER este deseori folosit n condiiile WHERE. Funcia UPPER transform literele dintr-un ir de caractere n litere mari. Numerele i caracterele speciale sunt lsate ca stare. Exemple: S se afieze comediile (COD_GEN_FILM = 'Comdy') scriind titlurile cu majuscule. SELECT UPPER(TITLU_FILM) AS TITLU_FILM FROM FILM WHERE COD_GEN_FILM = 'Comdy'; S presupunem c nu v amintii dac valorile COD_GEN_FILM au fost stocate cu litere mari, litere mici sau combinaii ale acestora. Dac n condiia WHERE transformai valorile n litere mari, putei obine rezultatele corecte indiferent de modul de stocare. SELECT UPPER(TITLU_FILM) AS TITLU_FILM FROM FILM WHERE UPPER(COD_GEN_FILM) = 'COMDY'; LOWER Funcia LOWER este inversa funciei UPPER transform literele dintr-un * de caractere n litere mici. Exemple de utilizare a funciei LOWER: S se afieze comediile (GEN_COD_FILM = 'Comedy') scriind titlurile cu minuscule. SELECT LOWER(TITLU_FILM) AS TITLU_FILM
16

FROM FILM WHERE GEN_COD_FILM = 'Comedy'; Se poate folosi funcia LOWER ntr-o clauz WHERE, atunci cnd nu titi sigur ce tip de litere obine textul pe care vrei s-1 comparai. Afiai toate filmele care au n titlu cuvntul of ", indiferent dac este scris cu litere mari sau mici. SELECT TITLU_FILM FROM FILM WHERE LOWER(TITLU_FILM) LIKE ' % of %' OR LOWER(TITLU_FILM) LIKE 'of % ' OR LOWER(TITLU_FILM) LIKE ' % of '; SUBSTR Funcia SUBSTR apare n majoritatea implementrilor SQL, dar uneori are un nume puin diferit. De exemplu, funcia se numete SUBSTRING n Microsoft SQL Server, Sybase Adaptive Server i MySQL, dar SUBSTR n Oracle i D132. Funcia returneaz o poriune a irului de caractere, n funcie de parametrii furnizai, care specific numele coloanei, poziia de nceput a subirului n datele coloanei i lungimea subirului returnat (numrul de caractere). Dei este o utilizare mai puin obinuit, funcia SUBSTR accept i un ir de caractere literal n locul numelui unei coloane. Iat forma general a funciei, urmat de un exemplu: SUBSTR (numele coloanei, poziia de nceput, lungimea subirului n tabelul PERSON, unele persoane au al doilea nume n ntregime, alii au numai initiale. Afiati numele complet al persoanelor al cror nume de familie ncepe cu litera B", sub forma unui singur ir de caractere care conine prenumele, iniiala i numele de familie. SELECT NUME_PERSOANA || ' ' || SUBSTR(PRENUME_PERSOANA, 1, 1) || ' . ' || NUME_FAMILIE_PERSOANA AS NUME_INTREG FROM PERSOANA WHERE SUBSTR(NUME_FAMILIE_PERSOANA, 1, 1)='B' Observai folosirea funciei SUBSTR n clauza WHERE pentru a elimina din rezultate persoanele al cror nume de familie nu ncepe cu litera B". Ar trebui s v putei deja gndi la alte moduri de a face acest lucru, prin folosirea operatorului LIKE.
17

LENGTH Funcia LENGTH returneaz lungimea unui ir de caractere. Microsoft SQL Server i Sybase Adaptive Server folosesc numele LEN pentru versiunea proprie a acestei funcii. Exemple: S se afieze lungimea titlului pentru filmul a crui valoare ID_FILM este 1. Presupunem c folosii o baz de date oracle, DB2 sau MySQL. SELECT TITLU_FILM, LENGTH (TITLU_FILM) AS LENGTH FROM FILM WHERE ID_FILM = 1; SELECT TITLU_FILM, LENGTH (TITLU_FILM) AS LENGTH FROM FILM WHERE LENGTH (TITLU_FILM) < 10; Funii matematice Funciile matematice manipuleaz valori numerice, n conformitate cu regulile matematicii. ROUND Funcia ROUND rotunjete o valoare la un numr specificat de zecimale. Valoarea numeric este furnizat prin primul parametru, iar numrul de zecimale prin cel de-al doilea. n continuare este prezentat formatul general al funciei ROUND. ROUND (expresie numeric, numr de poziii zecimale) Care este costul mediu al unei copii a filmului The Last Samurai, rotunjit la dou zecimale? SELECT ROUND((PRET_VANZARE_VHS + PRET_VANZARE _DVD) / 2, 2) AS AVG_COST FROM FILM WHERE TITLU_FILM = 'The Last Samurai'; Alte funcii matematice Tabelul care urmeaz prezint funciile matematice cel mai
18

des ntlnite. Pentru toate, sintaxa general este aceeai: NUME_FUNCTIE (expresie) Funcie ABS COS EXP POWER SIN TAN Descriere Valoarea absolut a unui numr dat Cosinusul trigonometric al unui unghi specificat n radiani Valoarea exponenial a unui numr dat Ridic un numr la o putere (numrul i puterea sunt fumizate ca parametri) Sinusul trigonometric al unui unghi specificat n radiani Tangenta trigonometric a unui unghi specificat n radiani

Funcii de conversie Funciile de conversie transform date dintr-un tip de date n altul. CAST Funcia CAST transfo rm d ate dintr-un tip de date n altul. Iat sintaxa general a funciei CAST, urmat de un exemplu: CAST (expresie AS tip de date) Afiati preul pentru formatul DVD al filmului The Last Samurai, cu un simbol dolar n faa sumei. Valoarea numeric trebuie s fie convertit ntr-un ir de caractere pentru a putea fi concatenat cu o valoare literal coninnd simbolul dolar. SELECT '$' || CAST(PRET_VANZARE _DVD AS VARCHAR(6)) AS PRET FROM FILM WHERE TITLU_FILM = 'The Last Samurai'; Funcii de agregare i gruparea rndurilor O funcie de agregare (aggregate functions) este o funcie care combin mai multe rnduri de date ntr-un singur rnd. Tabelul urmtor prezint funciile de agregare acceptate n majoritatea implementrilor SQL: Funcie AVG Descriere Calculeaz valoarea medie pentru o coloan sau o expresie. COUNT Numr valorile dintr-o coloan. MAX Gsete valoarea maxin dintr-o coloan. MIN Gsete valoarea minim dintr-o coloan.

19

SUM nsumeaz valorile dintr-o coloan. Exemple: Care este preul mediu al unui DVD? SELECT ROUND(AVG(PRET_VANZARE _DVD),2) AS AVG_PRET FROM FILM; Cte filme exist n tabelul FILM? SELECT COUNT(*) AS NUM_FILM FROM FILM; Cte genuri diferite de filme sunt reprezentate n tabelul FILM? SELECT COUNT(DISTINCT COD_GEN_FILM) AS NUM_GEN FROM FILM; Care sunt lungimea minim i maxim a titlurilor filmelor? SELECT MIN(LENGTH(TITLU_FILM)) AS MIN_LENGTH, MAX(LENGTH(TITLU_FILM)) AS MAX_LENGTH FROM FILM; Clauza GROUP BY

GROUP BY cere sistemului DBMS s grupeze rndurile selectate de interogare pe baza valorilor din una sau mai multe coloane i s aplice funcia (sau funciile) de agregare fiecrui grup, returnnd un rnd pentru fiecare grup din setul de rezultate. Sistemul DBMS va ordona rndurile selectate de interogare dup coloanele din clauza GROUP BY, aa c grupurile vor fi returnate n ordine ascendent, exceptnd cazul n care se adug o clauz ORDER BY care specific un alt mod de ordonare. Iat un exemplu: Afiati fiecare cod de gen, mpreun cu numrul de filme asociate fiecrui cod. SELECT COD_GEN_FILM AS GEN, COUNT(*) AS COUNT FROM FILM GROUP BY COD_GEN_FILM; Ce se ntmpl dac scoatei clauza GROUP BY din aceast interogare? Sistemul DBMS retumeaz un mesaj de eroare i, din nefericire, mesajul de eroare este deseori destul de criptic. Functia COUNT(*) este o functie de agregare i, n absenta clauzei GROUP BY, retumeaz un singur rnd de date. Exemplele care urmeaz arat modul general de constituire a subansamblelor virtuale folosind clauza GROUP BY. Fiecare expresie care apare n SELECT trebuie s aib aceeai valoare pentru toate liniile

20

care aparin aceleiai partiii. Numele coloanelor din GROUP BY nu trebuie s figureze obligatoriu n lista de la SELECT. Clauza WHERE are prioritate fata de GROUP BY. Nu se poate utiliza alias de coloana in clauza GROUP BY. Pentru a returna informatie corespunxatoare fiecarui grup, pot fi utilizate functiile agregat. Acestea pot aparea in clauzele SELECT, ORDER BY si HAVING. Se poate utiliza functie grup in clauza WHERE? Este corect WHERE AVG(sal) > 200? NU! Cand se utilizeaza GROUP BY, server-ul sorteaza implicit multimea rezultata in ordinea crescatoare a valorilor coloanelor dupa care se realizeaza gruparea. Grupurile sunt formate si functiile grup sunt calculate, inainte ca clauza HAVING sa fie aplicata grupurilor. Exemplu: S se obin numrul de cte ori a fost mprumutat fiecare carte. SELECT codel, COUNT(*) FROM imprumuta GROUP BY codel; Exemplu: Pentru fiecare domeniu de carte s se obin numrul crilor din domeniu, media preurilor i numrul total de exemplare. SELECT coded,COUNT(*), AVG(pret),SUM(nrex) FROM carte GROUP BY coded; Dac n comanda SELECT apar atribute coloan (nu funcii grup) i se utilizeaz clauza GROUP BY atunci aceste coloane trebuie obligatoriu s apar n clauza GROUP BY. Exemplu: S se obin pentru fiecare autor, media preurilor crilor din bibliotec. SELECT autor, AVG(pret) FROM carte GROUP BY autor; Exemplu: Pentru departamentele n care salariul maxim depete 5000$ s se obin codul acestor departamente i salariul maxim pe departament. SELECT FROM GROUP BY HAVING deptno, MAX(sal) emp deptno MAX(sal)>5000;
21

Exemplu: SELECT FROM GROUP BY MAX(AVG(pret)) carte autor;

Exemplu: S se afieze numele i salariul celor mai prost pltii angajai din fiecare departament.

SELECT
FROM WHERE

ename, sal

emp (deptno, sal) IN (SELECT deptno, MIN(sal) FROM emp GROUP BY deptno);

Exemplu: S se obin pentru fiecare carte, codul su i numrul de exemplare care nu au fost nc restituite. SELECT FROM codel, COUNT(*) imprumuta

WHERE dataef IS NULL GROUP BY codel; Exemplu: S se obin numrul crilor mprumutate cel puin o dat. SELECT COUNT(DISTINCT codel) FROM imprumuta; Exemplu: S se afieze numrul crilor mprumutate cel puin de dou ori (pentru fiecare carte mprumutat mai mult dect o dat s se obin numrul de cte ori a fost mprumutat). SELECT FROM GROUP BY HAVING COUNT(COUNT(codel)) imprumuta codel COUNT(*)>1;

22

n cererea anterioar COUNT(codel), reprezint numrul care arat de cte ori a fost mprumutat fiecare carte, iar COUNT(COUNT(codel)), reprezint numrul total al crilor mprumutate. Exemplu: Pentru fiecare departament codul dep si numarul de angajati. 1 select department_id, count(*) 2 from employees 3* group by department_id SQL> / DEPARTMENT_ID COUNT(*) ------------- ---------10 1 20 2 30 6 40 1 50 45 60 5 70 1 80 34 90 3 100 6 110 2 1 12 rows selected. Pentru departamentele cu mai mult de un angajat se afiseaza codul dep si numarul de angajati. 1 select department_id, coun 2 from employees 3 group by department_id 4* having count(*)>1 SQL> / DEPARTMENT_ID COUNT(*) ------------- ---------20 2 30 6 50 45 60 5 80 34
23

90 100 110

3 6 2

8 rows selected. Se afiseaza numarul departamentelor cu mai mult de un angajat. 1 select count(count(*)) 2 from employees 3 group by department_id 4* having count(*)>1 SQL> / COUNT(COUNT(*)) --------------8 Exemplu: Sa se afiseze numrul de cri imprumutate din fiecare domeniu. SELECT d.intdom, COUNT(*) FROM domeniu d, carte c, imprumuta I WHERE c.codel = i. codel AND c.coded = d.coded GROUP BY intdom;

Exemplu: Lista codurilor cititorilor care au mai mult de 3 cri nerestituite la termen.

SELECT

codec

FROM imprumuta WHERE dataef IS NULL AND datares < SYSDATE GROUP BY codec HAVING COUNT(*) > 2; Exemplu: Pentru fiecare domeniu de carte care conine cel puin o carte i unde preul oricrei cri nu depete o valoare dat, s se obin: codul domeniului, numrul crilor din domeniu i numrul mediu de exemplare. SELECT coded, COUNT(*), AVG(nrex)

24

FROM carte GROUP BY coded HAVING COUNT(*) >= 1 AND MAX(pret) < &pret_dat; Exemplu: Codurile domeniilor care nu contin carti. SELECT coded FROM carte GROUP BY coded HAVING COUNT(*) = 0; Nu este corect, deoarece se iau in considerare NUMAI codurile domeniilor care apar in tabelul CARTE. SELECT intdom FROM domeniu d WHERE 0 = (SELECT COUNT(*) FROM carte WHERE coded = d.coded); Urmatoarea cerere este corecta? SELECT intdom FROM domeniu d,(SELECT coded, COUNT(*) a FROM carte GROUP BY coded) b WHERE b.coded = d.coded) AND b.a = o; Exemplu: n ce interogri este necesar utilizarea cuvntului cheie HAVING? A. B. C. D. cnd este necesar s eliminm linii duble din rezultat; cnd este necesar s ordonm mulimea rezultat; cnd este necesar s efectum un calcul pe grup; cnd este necesar s restricionm grupurile de linii returnate.

Operatori pentru interogri compuse Uneori este util s se ruleze interogri multiple i s se combine rezultatele ntr-un singur set de rezultate. UNION Operatorul UNION adaug rndurile din setul de nregistrri al

25

unei interogri la cel al unei alte inregistrri i, n acelai timp, elimin rndurile duplicate, ntr-un mod similar cu cel al cuvntului cheie DISTINCT. Operaia este permis numai dac interogrile sunt compatibile din punctul de vedere al uniunii, ceea ce nseamn c au acelai numr de coloane i c tipurile de date ale coloanelor corespondente sunt compatibile. Iat un exemplu: Afiai pe o singur coloan toate valorile nenule pentru taxa de inchiriere i taxa de ntrziere din tabelul FILM_NCHIRIAT. SELECT INCHIRIAT_FEE AS FEE FROM FILM_INCHIRIAT WHERE INCHIRIAT _FEE IS NOT NULL UNION SELECT LATE_OR_LOSS_FEE AS FEE FROM FILM_INCHIRIAT WHERE LATE _OR_ LOSS FEE IS NOT NULL; UNION ALL UNION ALL funcioneaz la fel ca i operatorul UNION, exceptnd faptul c rndurile duplicate nu sunt eliminate. INTERSECT Operatorul INTERSECT gsete valorile selectate dintr-o interogare, care apar i ntr-o alt interogare. n esen, gsete intersecia valorilor din cele dou interogri. Totui, doar un numr mic de sisteme DBMS (cele mai importance fiind Oracle i DB2) implementeaz acest operator. Nu-1 vei gsi n Microsoft SQL Server sau MySQL. Iat un exemplu: Exist n tabelul FILM filme pentru care preul pentru DVD este egal cu preul pentru VHS? SELECT INCHIRIAT_FEE AS FEE FROM FILM_ INCHIRIAT WHERE INCHIRIAT _FEE IS NOT NULL INTERSECT SELECT LATE_OR_LOSS_FEE AS FEE FROM FILM_ INCHIRIAT WHERE LATE OR_ LOSS FEE IS NOT NULL

26

EXCEPT EXCEPT este operatorul standard ANSI/ISO care gsete diferenele dintre dou seturi de rezultate, returnnd, n esen, valorile din prima interogare care nu apar n cea de-a doua interogare. Foarte puine sisteme DBMS implementeaz acest operator. n unele implementri, precum Oracle, operatorul se numete MINUS, nu EXCEPT.

27