Sunteți pe pagina 1din 111

BAZE DE DATE

(Curs Facultatea de Informatic, anul III ID, Semestrul I)

Obiective:

1. nsuirea noiunilor fundamentale din domeniul bazelor de date. 2. Formarea deprinderilor de proiectare a bazelor de date relaionale folosind diagrama entitate-relaie i normalizarea. 3. Prezentarea modelului relaional. 4. Utilizarea operatorilor algebrei relaionale pentru manipularea datelor din baza de date. 5. nsuirea limbajului SQL de definire (DDL) i manipulare a datelor din baza de date (DML). 6. Utilizarea bazelor de date relaionale folosind cunotinele nsuite.

Stabilirea Notei Finale (procentaje) : 1) Procentul de 80% constituit din: - rspunsurile la colocviu; - activiti aplicative atestate/ seminarii/ lucrri practice/ proiect, etc; - teste pe parcursul semestrului. 2) Procentul de 10% constituit din: - rezolvarea temelor de cas. 3) Procentul de 10% constituit din: - prezena la activitile tutoriale.

CAPITOLUL I. PROIECTAREA BAZELOR DE DATE RELAIONALE


Se prezint definiia bazelor de date i a conceptelor cu care opereaz acestea; se descriu paii parcuri n realizarea unei baze de date, exemplificndu-se la nivelul unei agenii imobiliare naionale care faciliteaz tranzacii de vnzare/cumprare ntre vnztori i cumprtori; fiecare punct al capitolului se ncheie cu propunerea unor exerciii de fixare a noiunilor.

1. Preliminarii
Bazele de date reprezint un instrument indispensabil pentru sistemele informatice. Modelarea bazelor de date constitue un subiect vast care nu poate fi tratat complet ntr-un singur curs. Baza de date reprezint o modalitate de stocare pe un suport extern a unei mulimi de date care modeleaz un proces (sistem) din lumea real, cu posibilitatea regsirii acesteia. De obicei o baz de date este memorat ntr-unul sau mai multe fiiere. Baza de date nsi poate fi privit ca un fel de cutie de umplere electronic - adic un container pentru o colecie de fiiere de date digitale. Bazele de date sunt manipulate cu ajutorul sistemelor de gestiune a bazelor de date. Acestea, SGBD-urile, sunt responsabile cu crearea, manipularea i ntreinerea unei baze de date. Principala funcie a acestuia este de a permite utilizatorilor (prin intermediul programelor) s acceseze date dintr-o baz de date. Cel mai rspndit model de baze de date este cel relaional, n care datele sunt memorate n tabele. Pe lng tabele, o baz de date relaional mai poate conine: indeci, proceduri stocate, trigger-e, utilizatori i grupuri de utilizatori, tipuri de date, mecanisme de securitate i de gestiune a tranzaciilor etc. Cursul propune trecerea n revist a principalelor probleme care apar n proiectarea i implementarea bazelor de date relaionale. Pentru exemplificarea conceptelor se utilizeaz sistemul de gestiune Microsoft SQL Server i MySQL. 1.1. Noiuni folosite n teoria bazelor de date a) O baz de date : reprezint un ansamblu structurat de fiiere care grupeaz datele prelucrate n aplicaii informatice ale unei persoane, grup de persoane, instituii etc. este definit ca o colecie de date aflate n interdependen, mpreun cu descrierea datelor i a relaiilor dintre ele. b) Organizarea bazei de date se refer la structura bazei de date i reprezint un ansamblu de instrumente pentru descrierea datelor, relaiilor, restriciilor la care sunt supuse. c) Sistemul de gestiune a bazei de date (SGBD): este un sistem complex de programe care asigur interfaa ntre o baz de date i utilizatorii acesteia (exemple de programe: ACCESS, Fox Pro, PARADOX, ORACLE, MySQL, SQL Server) este software-ul bazei de date care asigur: 1) definirea structurii bazei de date; 2) ncrcarea datelor n baza de date; 3) accesul la baza de date (interogare, actualizare); 2

4) 5) 6)

ntreinerea bazei de date (refolosirea spaiilor goale, refacerea bazei de date n cazul unor incidente); reorganizarea bazei de date (restructurarea i modificarea strategiei de acces); securitatea datelor.

d) Cele trei concepte de baz utilizate n organizarea bazei de date sunt: entitatea atributul valoarea Prin entitate se nelege un obiect concret sau abstract reprezentat prin proprietile sale. O proprietate a unui obiect poate fi exprimat prin perechea (ATRIBUT, VALOARE). Exemplu: n exemplul Masa x are culoarea alba, atributul este culoare, iar valoarea este reprezentat de cuvntul alb. Alte exemple ar putea fi: (Sex, Feminin), (Nume, POP), (Profesie, Medic), (Salariu, 200$). Observaie: Atributele pot caracteriza o clas de entiti, nu doar o entitate. e) Data este un model de reprezentare a informaiei, accesibil unui anumit procesor (om, program, calculator) i se definete prin: Identificator; Tip; Valoare. 1.2. Funcionarea unei baze de date Exploatarea unei baze de date aflate pe un suport specific (magnetic), de ctre un utilizator, prin intermediul unui sistem de calcul, avnd la dispoziie un SGBD, parcurge uzual urmtoarele etape: 1. Utilizatorul, aflat la un terminal electronic, pune o "ntrebare" sau lanseaz o cerere de date, referitoare la informaiile din baza de date. ntrebarea se poate pune ntr-un limbaj de cereri specific SGBD-ului cu care se lucreaz (dac utilizatorul este familiarizat cu acest limbaj de exemplu, SQL, FoxPro, dBase, Oracle) sau utilizatorul poate fi asistat n adresarea cererii de date de ctre SGBD (produsul soft pe care l folosete) printr-un sistem de meniuri, butoane sau ferestre de dialog (obiecte de control). 2. ntrebarea este analizat de ctre calculator, de fapt de SGBD, iar dac este corect, se ncearc (SGBD) s i se dea rspuns prin accesarea informaiilor din baza de date. Rspunsul va fi constituit din mulimea datelor cerute de utilizator, care verific criteriile specificate de acesta. Acest proces de lansare a unei cereri de date care va fi satisfcut prin furnizarea datelor care ndeplinesc proprietile cerute se numete interogarea bazei de date. 3. Rspunsul la cererea de date se va afia pe ecran, se va tipri la imprimant sau se va memora ntr-un fiier. n realizarea unei baze de date se urmrete: micorarea timpului de rspuns la o interogare; asigurarea costurilor minime de prelucrare i ntreinere ; adaptabilitatea la cerine noi (flexibilitate);

sincronizarea n exploatarea simultan a datelor de ctre mai muli utilizatori(accesul concurent); asigurarea proteciei mpotriva accesului neautorizat (confidenialitate); posibilitatea recuperrii datelor n cazul deteriorrilor accidentale (integritate) etc.

Exemplu: n figura 1.1 este prezentat o baz de date foarte mic, ce conine un singur fiier, numit VINOTECA; la rndul su, aceasta cuprinde date despre coninutul unei anumite vinoteci. n figura 1.2 este prezentat un exemplu de operaie de consultare din baza de date, mpreun cu datele returnate prin aceast operaie.

raft# 2 3 22 50

vin Cab. Sauvignon Pinot Noir Pinot Noir Merlot

producator Windsor Fetzer Dehlinger Clos du Bois

an 1995 1997 1999 1998

sticle 12 3 2 9

lansat 2004 2004 2002 2004

Fig. 1.1. Baza de date pentru VINOTECA (fiierul VINOTECA) Consultare: SELECT vin, raft, producator FROM VINOTECA WHERE lansat = 2004; Rezultat ce apare pe monitorul unui PC: vin raft producator Cab. Sauvignon 2 Windsor Pinot Noir 3 Fetzer Merlot 50 Clos du Bois Fig. 1.2 Exemplu de consultare Observaii: n limbajul SQL, fiierul VINOTECA din figura 1.1 este numit tabel, rndurile unei astfel de tabele pot fi considerate ca nregistrri din fiier, iar coloanele pot fi considerate drept cmpuri.

1.3

Realizarea unei baze de date


Realizarea unei baze de date presupune parcurgerea etapelor: analiza domeniului (sistemului) pentru care se realizeaz baza de date; proiectarea structurii bazei de date; ncrcarea datelor n baza de date; exploatarea i ntreinerea bazei de date. 1. Analiza

1. 2. 3. 4.

3. ncrcarea datelor
LMD LMD, LDD Baza de date

2. Proiectarea

LDD LMD

4. ntreinerea

4. Exploatarea

Fig. 1.3 Realizarea unei baze de date a) Analiza sistemului Analiza sistemului presupune stabilirea temei, analiza componentelor sistemului i analiza legturilor (asocierilor) dintre aceste componente. Rezultatul analizei formeaz modelul conceptual al bazei de date. Cele patru etape necesare realizrii unei baze de date vor fi tratate pe parcursul ntregului curs urmrind un exemplu concret i anume o baz de date pentru o agenie imobiliar din ar, denumit AGENIE IMOBILIAR, care faciliteaz tranzacii de vnzare/cumprare ntre vnztor i cumprtor, care gestioneaz documente legate de oferte imobiliare, de ntreinere a nomenclatoarelor specifice domeniului i care ofer o gam larg de rapoarte privind situaia vnzare-cumprare. Odat stabilit tema proiectului, se trece la etapa urmtoare, i anume la identificarea tuturor tipurilor de informaii, a legturilor dintre informaii i a operaiilor necesare pentru gestionarea lor. Aceast etap va fi detaliat n cursul urmtor.

b) Proiectarea structurii bazei de date Dac etapa de analiz a modelului conceptual se realizeaz independent de un SGBD, prin etapa de proiectare a structurii bazei de date se trece la luarea n considerare a SGBD -ului cu ajutorul cruia va fi implementat i exploatat baza de date. Proiectarea structurii bazei de date reprezint transpunerea rezultatelor obinute n urma analizei modelului conceptual n termenii unui model al datelor suportat de un anumit SGBD. Compilatorul limbajului de descriere a datelor permite aducerea schemei bazei de date la nivelul la care s poat fi memorat n baza de date. 5

Astfel, proiectarea presupune o detaliere, de exemplu, de tip pseudocod a modulelor necesare realizrii bazei de date: module pentru crearea fiierelor, pentru introducerea datelor, pentru prelucrarea i extragerea rezultatelor, pentru tratarea erorilor etc. c) ncrcarea datelor n baza de date Este etapa n care se realizeaz popularea masiv cu date a bazei de date , activitate care trebuie s se efectueze cu un minim de efort. d) Exploatarea i ntreinerea bazei de date Exploatarea bazei de date de ctre diferii utilizatori finali este realizat n scopul satisfacerii cerinelor de informare ale acestora. SGBD sprijin utilizatorii finali n exploatarea bazei de date, oferind o serie de mecanisme i instrumente cum ar fi limbajele de manipulare a datelor (LMD). ntreinerea bazei de date reprezint o activitate complex, realizat, n principal, de ctre administratorul bazei de date i care se refer la actualizarea datelor din cadrul bazei de date.

1.4
1.

Exerciii de fixare a noiunilor


Prin tipul unei date nelegem: a) mulimea valorilor pe care le poate lua data; b) structura, mulimea valorilor, operaiile admise i modul de tratare a erorilor; c) structura, mulimea valorilor, operaiile admise, regulile de protecie i securitatea datelor. Prin valoarea atomic nelegem: a) o valoare reprezentat printr-un singur simbol; b) o valoare din care nu putem elimina nici o component fr s denaturm semnificaia datei; c) o valoare cu format rigid Atributul reprezint: a) mulimea valorilor posibile ale unei date; b) o caracteristic a unei entiti; c) formatul de reprezentare a unei date Prin baz de date nelegem: a) orice colecie de date; b) o colecie de date conectate logic, exhaustiv i neredundant; c) orice colecie de date materializat sub forma unor fiiere de disc magnetic Prin sistem de gestiune a bazelor de date nelegem: a) modul de organizare al unui sistem informatic, care manipuleaz date din baze de date; b) un program sau pachet de programe, care permite crearea, pstrarea i eliminarea bazelor de date; c) un sistem de programe, care permite utilizatorului definirea, crearea i ntreinerea bazei de date, precum i accesul controlat la aceasta.

2.

3.

4.

5.

6.

7.

Definii urmtorii termeni: - baz de date - sistem de gestiune de baz de date - entitate - diagram E-R - atribut - asociere Care sunt etapele de realizare a unei baze de date?

2. Construirea de diagrame entitate-relaie


Prima etap pentru realizarea unei baze de date const n analiza sistemului. Se cunosc mai multe tehnici de analiz, dar cea mai des ntlnit este tehnica entitate-relaie. Prin tehnica entiate-relaie (denumit i entitate-asociere) se construiete o diagram entiate-relaie (notat E-R) prin parcurgerea urmtorilor pai: a) identificarea entitilor (componentelor) din sistemul proiectului; b) identificarea asocierilor (relaiilor) dintre entiti i calificarea lor; c) identificarea atributelor corespunztoare entitilor; d) stabilirea atributelor de identificare a entitilor. a) Identificarea entitilor Prin entitate se nelege un obiect concret sau abstract reprezentat prin proprietile sale. Prin convenie, entitile sunt substantive, se scriu cu litere mari i se reprezint prin dreptunghiuri. ntr-o diagram nu pot exista dou entiti cu acelai nume, sau o aceeai entitate cu nume diferite. Pentru baza de date din domeniul imobiliar considerat anterior, se pot pune n eviden urmtoarele entiti: DATE_PERSOAN entitate care stocheaz date personale ale ofertantului (vnztorului) sau ale clientului (cumprtorului); CERERI_ OFERTE conine ofertele sau cererile imobiliare propuse de vnztori, respectiv cumprtori; DESCRIERE_IMOBIL stocheaz informaiile referitoare la imobile; JUDEE entitate ce conine judeele n care sunt amplasate imobilele; LOCALITI - entitate ce conine localitile n care sunt amplasate imobilele; STRZI - entitate ce precizeaz strzile n care sunt amplasate imobilele; FACTURI formularul necesar unei tranzacii de cumprare-vnzare. Figura urmtoare prezint o prim form a diagramei entitate-asociere (E-R). DATE_ PERSOANA CERERI_ OFERTE DESCRIERE_ IMOBIL
FACTURI

LOCALITATI JUDETE STRAZI

Fig. 2.1. Diagrama E-R pentru domeniul imobiliar (prima form) b) Identificarea asocierilor dintre entiti i calificarea lor ntre majoritatea componentelor (adic a entitilor) unui sistem economic se stabilesc legturi (asocieri). Exemplu: Exist o asociere ntre entitile CERERI_OFERTE i FACTURI deoarece facturile reprezint finalizarea unei cereri/oferte. Aceast asociere se reprezint ca n figura de mai jos. 8

(1,1)

(0,1)

CERERI_OFERTE

sunt finalizate prin

FACTURI

Fig. 2.2. Prezentarea asocierii dintre entitile CERERI_OFERTE i FACTURI Sunt necesare precizarea ctorva notaii i noiuni utilizate n exemplul de mai sus: legturile (asocierile) se reprezint prin arce neorientate ntre entiti; fiecrei legturi i se acord un nume plasat la mijlocul arcului i simbolizat printr-un romb (semnificaia legturii); numerele simbolizate deasupra arcelor se numesc cardinaliti i reprezint tipul legturii; cardinalitatea asocierilor exprim numrul minim i maxim de realizri ale unei entiti cu cealalt entitate asociat. Exemplu: Cardinalitatea (1,1) ataat entitii CERERI_OFERTA nseamn c o factur poate fi rezultatul tranzacionrii a minim unei cereri/oferte i a unui numr maxim de tot o cerere/ofert. Cardinalitatea (0,1) ataat entitii FACTURI nseamn c o cerere se poate finaliza prin maxim o factur sau prin nici una (0 facturi) . Aceast cardinalitate reiese din analiz: CERERI_ OFERTE 1 2 3 FACTURI F1 F2

Fig. 2.3. Determinarea cardinalitii asocierii dintre entitile CERERI_OFERTE i FACTURI Maximele unei cardinaliti sunt cunoscute i sub denumirea de grad de asociere, iar minimele unei cardinaliti, obligativitatea participrii entitilor la asociere.
Tipuri de asocieri (legturi) ntre entiti

Asocierile pot fi de mai multe feluri, iar odat cu asocierea, se impune stabilirea calificrii acesteia. Asocierea dintre entiti se face n funcie de: i) cardinalitatea asocierii; ii) numrul de entiti distincte care particip la asociere. i. Dup cardinalitatea asocierii n funcie de maxima cardinalitii (gradul de asociere), se cunosc trei tipuri de asocieri, care, la rndul lor, sunt de dou tipuri, n funcie de minima cardinalitii (gradul de obligativitate al participrii la asociere): asocieri de tip unu la unu: o asocieri pariale de tip unu la unu o asocieri totale de tip unu la unu asocieri de tip unu la mai muli: o asocieri pariale de tip unu la muli o asocieri totale de tip unu la muli asocieri de tip muli la muli: o asocieri pariale de tip muli la muli 9

ii.

o asocieri totale de tip muli la muli. Dup numrul de entiti distincte care particip la asociere: asocieri binare (ntre dou entiti distincte); asocieri recursive (asocieri ale entitilor cu ele nsele); asocieri complexe (ntre mai mult de dou entiti distincte). n continuare se descriu asocierile grupate dup cardinalitatea lor.

Asocieri n funcie de cardinalitatea legturii

1. Asocieri de tip unu la unu sunt asocieri n care maximele cardinalitii au valoarea 1. E1
(...,1)

(...,1)

E2

Fig. 2.4. Asociere de tip unu la unu Exemplu: Asocierea din figura 2.3 este asociere de tip 1 la 1. 2. Asocieri de tip unu la mai muli sunt asocieri n care maxima cardinalitii unei entiti este unu, iar a celeilalte entiti are valoarea muli.
(...,1) E1 A (...,n) E2 E1 (...,n) A (...,1) E2

Fig. 2.5. Asociere de tipul unu la mai muli Exemplu: A LOCALITATI L1 L2 L3


LOCALITATI

B
CERERI_OFERTE

1 2 3
CERERI_OFERTE

(1,1)

i corespunde

(0,n)

Fig. 2.6. Asociere de unu la mai muli ntre entitile LOCALITI i CERERI_OFERTE 3. Asocieri de tipul muli la muli sunt asocieri n care maximele cardinalitii au valoarea muli. E1
(...,n)

(...,n)

E2

Fig. 2.7. Asociere de tipul muli la muli 10

Exemplu:
DEPOZIT

PRODUS

D1 D2 D3

P1 P2 P3

(0,n)

(0,n) nmagazi neaz PRODUS

DEPOZIT

Fig. 2.8. Asociere de tipul muli la muli ntre entitile DEPOZIT i PRODUS Observaie: Uneori (n cazul utilizrii unor SGBD), asocierea de tip muli la muli se transform n dou asocieri de tipul unul la muli fiind, de regul, mai uor de implementat i de utilizat i anume:
(...,n) (...,n) A

Din

E1

E2

(...,1)

(...,n)
A1

E1

E b)

(...,n)
A2

(...,1)

E2

a)

Fig. 2.9. Transformarea unei asocieri de tipul muli la muli (a) n asocieri de tipul unu la muli (b) Exemplu: n cazul exemplului de mai sus (vezi figura 2.8), transformarea asocierii muli la muli n asocieri de tipul unu la muli se poate realiza prin construirea unei noi entiti DEPOZIT_PRODUS astfel:
DEPOZIT_ PRODUS D1-P1 D1-P3 D2-P2 D3-P2 .... PRODUS P1 P2 P3 P4 ...

DEPOZIT D1 D2 D3 D4 ....

(1,1)

asociaz

(0,n)

(0,n)

asociaz

(1,1)

Fig. 2.10. Transformarea asocierii de tipul muli la muli n asocieri de tipul unu la muli Asocieri pariale i totale Printr-o asociere parial se nelege o asociere n care nu exist obligativitatea participrii la aceast asociere a tuturor entitilor vizate, ci numai a unora dintre ele sau a nici uneia. Asocierea parial se caracterizeaz prin faptul c minima cardinalitii ataat unei entiti este zero. Observaii (asupra minimii cardinalitii) 11

minima cardinalitii zero, are drept rezultat lipsa obligativitii participrii partenerului la aceast asociere; minima cardinalitii mai mare dect zero, are drept rezultat obligativitatea participrii.
(0,) (,) (,) (0,)

E1

E2

E1

E2

a)

b)

Fig. 2.11 Asocieri pariale ntre entitile E1 i E2 Exemplu: Asocierea dintre entitile CERERI_OFERTE i FACTURI din fig. 2.3 reprezint o asociere parial, deoarece participarea entitii FACTURI nu este obligatorie, minima caracteristicii corespunztoare entitii FACTURI fiind 0. O asociere este total dac toate entitile au obligativitatea s participe la asociere, adic minima cardinalitii este mai mare dect zero.
(1,) (1,)

E1
(1,)

A
a) (n,)

E2
(n,) (1,)

E1
(n,)

A
b) (n,)

E2

E1

A
c)

E2

E1

A
d)

E2

Fig. 2.12 Asocieri totale ntre entitile E1 i E2 n continuare se dau cteva exemple de asocieri totale, respectiv pariale. Exemplu: Asocieri pariale de tip unu la unu CERERI_ OFERTE 1 2 3 FACTURI F1 F2

12

Exemplu: Asocieri totale de tip unu la unu CERERI_ OFERTE 1 2 3 Exemplu: Asocieri pariale de tip unu la muli LOCALITATI L1 L2 L3
CERERI_OFERTE
DESCRIERE_IMOBIL

I1 I2 I3

1 2 3

Exemplu: Asocieri totale de tip unu la muli CLASE C1 C2 C3 ELEVI E1 E2 E3 E4

Exemplu: Asocieri pariale de tip muli la muli


DEPOZIT PRODUS

Exemplu: Asocieri totale de tip muli la muli


CURSURI

D1 D2 D3 D4

P1 P2 P3

STUDENTI

C1 C2 C3

S1 S2 S3 S4

Fig. 2.13 Asocieri dup gradul i obiectivitatea lor n exemplul bazei de date AGENTIE_IMOBILIARA, tipurile de asocieri dintre entiti stabilite n funcie de modul n care se desfoar activitatea modelat sunt: JUDETE-LOCALITATI 1:n deoarece unui jude i corespund mai multe localiti; 13

LOCALITATI-STRAZI 1:n - deoarece unei localiti i corespund mai multe strzi; STRAZI-CERERI_OFERTE 1:n deoarece unei strzi i pot corespunde mai multe oferte/cereri; FACTURI-CERERI_OFERTE 1:1 deoarece fiecare factur conine doar cte o ofert/cerere; CERERI_OFERTE-DESCRIERE_IMOBIL 1:1 fiecrui imobil i se face o singur descriere; FACTURI- DATE_PERSOANA 1:1 o factur este ncheiat de o singur persoan; DATE_PERSOANA - CERERI_OFERTE 1:n o persoan poate lansa mai multe cereri sau oferte de imobil.

c) Identificarea atributelor entitilor i a asocierilor dintre entiti Atributele unei entiti reprezint proprieti ale acestora. Atributele sunt substantive, iar pentru fiecare atribut i se va preciza tipul fizic (integer, float, char, string etc.) Exemplu: Entitatea LOCALITI are urmtoarele atribute: codul localitii, notat cod_loc, simbolul de identificare al judeului simbol_jude i denumirea localitii nume_loc. d) Stabilirea atributelor de identificare a entitilor Un atribut de identificare (numit cheie primar), reprezint un atribut care se caracterizeaz prin unicitatea valorii sale pentru fiecare instan a entitii. n cadrul diagramei entitate-asociere, un atribut de identificare se marcheaz prin subliniere sau prin marcarea cu simbolul # plasat la sfritul numelui acestuia.
a (a) E a# (b) E

Fig. 2.14. Notaii uzuale pentru atributele de identificare Exemplu: Ca atribut de identificare putem considera codul numeric personal cnp pentru entitatea DATE_PERSOAN. Pentru ca un atribut s fie atribut de identificare, acesta trebuie s satisfac unele cerine: ofer o identificare unic n cadrul entitii; este uor de utilizat; este scurt (de cele mai multe ori, atributul de identificare apare i n alte entiti, drept cheie extern). Pentru o entitate pot exista mai multe atribute de identificare, numite atribute (chei) candidate. Dac exist mai muli candidai cheie, se va selecta unul, preferndu-se acela cu valori mai scurte i mai puin volatile. Exemplu: n urma analizrii celor 4 etape necesare construirii diagramei entitate-asociere: identificarea entitilor domeniului sau a sistemului economic; identificarea asocierilor dintre entiti; identificarea atributelor aferente entitilor i a asocierilor dintre acestea; stabilirea atributelor de identificare a entitilor, 14

se poate prezenta forma complet a diagramei asociate domeniului ales n exemplu.


(0,n) are asociat (1,1) (0,n) are asociat (1,1)

STRAZI
(1,1) se regsete (1,n)

LOCALITATI

JUDETE

CERERI_ OFERTE
(1,1)

(1,n) conin

(1,1)

DATE_PERSOANA
(1,1) incheie

(1,1) finisate conin (1,1) (0,1)

(0,1)

FACTURI

DESCRIERE _IMOBIL

Fig. 2.15. Diagrama E-R pentru domeniul imobiliar (a doua form) n cazul n care se dorete o diagram care s conin i atributele fiecrei entiti nsoite de precizarea atributelor de identificare (adic a cheilor primare), pentru a nu ncrca imaginea, diagrama proiectului se poate fragmenta pe mici domenii, dup cum este cazul entitii CERERI_OFERTE, prezentat n figura 2.16. (S-au considerat un numr relativ mic de atribute).
id_co# tipul cnp data_inreg

CERERI_OFERTE

cod_loc id_strada nr_imobil pret_min pret_max


tip_solutionare

Fig. 2.16. Reprezentarea atributelor aferente entitii CERERI_OFERTE (detaliu dintr-o diagram E-R) 15

n reprezentarea atributelor aferente entitii CERERI_OFERTE semnificaia atributelor este urmtoarea: cheia primar a entitii id_co reprezint numrul de ordine al cererii sau ofertei de imobil lansat de o anumit persoan, atributul tipul specific dac este vorba de o cerere sau de o ofert, prin cnp se precizeaz codul numeric personal al clientului, data_inreg reprezint data la care s-a nregistrat oferta/cererea, apoi urmeaz cteva date legate de imobil: codul localitii cod loc, codul strzii id_strada, numrul imobilului nr_imobil, preul minim, respectiv preul maxim al imobilului pret_min, pret_max. Ultimul atribut, tip_solutionare precizeaz dac cererea/oferta respectiv a fost soluionat; pentru o cerere/oferta nou introdus, acest atribut se va completa cu explicaia de nesoluionat. Astfel, diagrama bazei de date AGENIE IMOBILIAR conine 7 entiti a cror asociere a fost prezentat n figura 2.15.
DATE_PERSOANA cnp# numele adresa nr_telefon email banca_client nr_cont_client STRZI id_strada# cod_loc# nume_str LOCALITATI cod_loc# simbol_judet# nume_loc JUDETE simbol_judet# nume_judet

_
CERERI-OFERTE id_co # tip cnp data_inreg tip_solutionare cod_loc id_strada nr_imobil pret_min pret_max DESCRIERE_IMOB IL id_co# tip_imobil etaj nr_camere suprafata garaj centrala_termica termopane

FACTURI id_oferta# data_factura cnp pret TVA total

Fig. 2.17. Baza de date AGENIE IMOBILIAR- entiti i atribute

2.1

Exerciii de fixare a noiunilor

1. O relaie este: a. orice tabel bidimensional cu valori atomice; b. orice tabel; c. orice tabel bidimensional 2. Se numete grad al unei relaii: a. numrul domeniilor distincte ale relaiei; b. numrul de tupluri distincte ale relaiei; c. numrul de atribute ale relaiei 3. Cardinalitatea unei relaii reprezint: a. numrul de atribute ale relaiei; b. numrul de tupluri ale relaiei; c. numrul de atribute identificator, ale relatiei. 4. Care sunt componentele unei diagrame E-R? 5. Ce se nelege prin cardinalitate? 6. Numii trei tipuri de asocieri ntre entiti. 16

7. Dai exemple de: a. o relaie de tip muli la muli b. o relaie de tip unu la unu c. o relaie de tip unu la muli. 8. Relaiile de tip mai multe la mai multe sunt dificil de implementat ntr-un proiect eficient de baze de date. Ce este de fcut, n acest caz? 9. Desenai diagrama entitate-relaie (preciznd i tipul asocierilor) pentru urmtoarea baz de date COLECTIE_MUZICA: presupunei c avei o colecie muzical rock, format din CD-uri i DVD-uri i casete audio i dorii s construii o baz de date care s permit s gsii nregistrrile pe care le avei pentru un anumit interpret (de exemplu, Joe Cocker), pentru un anumit chitarist (de exemplu, Joe Satriani), pentru un anumit baterist (de exemplu, Lars Ulrich), pentru un anumit album (de exemplu, Master of Puppets), o anumit formaie (de exemplu, Metallica).

17

CAPITOLUL II. PREZENTAREA BAZELOR DE DATE RELAIONALE


Se prezint conceptele care definesc bazele de date relaionale: structura relaional a datelor, operatorii modelului relaional i restriciile de integritate ale modelului relaional. 3. Proiectarea modelului relaional Proiectarea corect a bazelor de date este crucial pentru obinerea unei aplicaii de nalt performan. Modelul relaional este cel mai utilizat dintre modelele de date existente (modele ierarhice, modele reea, modele orientate pe obiect). Fa de modelele ierarhic i reea, modelul relaional prezint cteva avantaje: propune structuri de date uor de utilizat; amelioreaz independena logic i fizic; pune la dispoziia utilizatorilor limbaje neprocedurale; optimizeaz accesul la date; mbuntete confidenialitatea datelor. Din punct de vedere istoric, trebuie menionat c modelul relaional s-a conturat n dou articole publicate de ctre F.E. Codd n 1969 i 1970, matematician la centrul de cercetri (California) I.B.M. Codd a propus o structur de date tabelar, independent de tipul de echipamente i de software-ul de sistem pe care este implementat. Dei puternic matematizat, modelul relaional este relativ uor de neles. Dac, teoretic, modelul s-a consacrat n anii 1970, produsele software care s gestioneze baze de date au devenit populare abia n anii 80. Cele mai utilizate sisteme de gestiune a bazelor de date relaionale (SGBDR) dedicate uzului individual sunt: ACCESS, PARADOX, Visual Fox Pro. Pentru aplicaiile complexe din bnci i instituii de mari dimensiuni se folosesc SGBDR-urile de categorie grea, ORACLE, DB2 IBM, Informix IBM, SyBase (SyBase), SQL Server (MicroSoft);sunt mult mai robuste, fiabile, dar i costisitoare. n ultimul timp i-au fcut apariia aa-zisele SGBD-uri (aproape) gratuite: PostgreSQL, MySQL, mSQL, FireBird etc. (Acestea ruleaz de obicei pe sisteme de operare Linux). Modelul relaional are la baz teoria matematic a relaiilor i poate fi privit ca o mulime de tabele obinute prin metoda normalizrii, eliminndu-se astfel anomaliile de actualizare. Conceptele modelului relaional sunt: 1. structura relaional a datelor; 2. operatorii modelului relaional; 3. restriciile de integritate ale modelului relaional. 3.1 Structura relaional a datelor O baz de date relaional (BDR) reprezint un ansamblu de relaii, prin care se reprezint datele i legturile dintre ele. n cadrul bazei de date relaionale, datele sunt organizate sub forma unor tablouri bidimensionale (tabele) de date, numite relaii. Asocierile dintre relaii se reprezint prin atributele de legtur. n cazul legturilor de tip unu la muli, aceste atribute figureaz ntr 18

una dintre relaiile implicate n asociere. n cazul legturilor de tip muli la muli, atributele sunt situate ntr-o relaie distinct, construit special pentru explicarea legturilor ntre relaii. Prezentarea structurii relaionale a datelor impune definirea noiunilor de: domeniu; relaie; atribut; schem a unei relaii. 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 Camp Tip de dat

Fig. 3.1. Concepte uzuale folosite n exprimarea formal, uzual i fizic Domeniul

Domeniul reprezint o mulime de valori, notat prin litere mari D1,D2 etc., caracterizat printr-un nume. Modalitile de definire a unui domeniu sunt: explicit: prin enumerarea tuturor valorilor aparinnd domeniului; implicit: prin precizarea proprietilor pe care le au valorile din cadrul domeniului. Exemplu: D1: {Da, Nu} reprezint un domeniu definit explicit. D2: {x| x este de dat calendaristic} sau D3: {s| s este numr decimal} reprezint domenii definite implicit, unde prin numr decimal se nelege un numr zecimal pentru care se precizeaz numrul de cifre componente. Printr-un tuplu se nelege o succesiune de valori de diferite tipuri. Un tuplu se noteaz enumernd valorile sale <V1,V2,V3,...,Vn>, unde V1 este o valoare din domeniul D1, V2D2 etc. Exemplu: Considerm c tuplul referitor la persoana x din entitatea CERERI_OFERTE conine trei valori diferite ce desemneaz: codul numeric personal (cnp): 1701205230023; data nregistrrii ofertei (data_nreg): 2006-07-03; tipul soluionrii (tip_soluionare): Nu. Se formeaz tuplul <1701205230023, 2006-07-03, Nu>. Relaia

Relaia R este un subansamblu al produsului cartezian dintre mai multe domenii D1, D2, ..., Dn, reprezentat sub forma unei tabele de date (tabelul bidimensional) i deci, o mulime de tupluri. Exemplu: Considerm c: D1 conine valori care exprim cnp-ul persoanei. D2 cuprinde valori ale datei calendaristice; 19

D3 cuprinde valori referitoare la tipul soluionrii tranzaciei: Da, dac tranzacia a fost soluionat, Nu, n caz contrar. De asemenea considerm c se cunosc datele a doi ofertani i c fiecare pune n vnzare doar cte un imobil. Atunci definim relaia R prin tuplurile care descriu aceste informaii ale ofertelor celor dou persoane:
R: {<1701205230023,2006-07-03, Nu>, <2661805270023,2006-05-27, Da>}.

sau R: D1
2661805270023 1701205230023

D2
2006-05-27 2006-07-03

D3
Da Nu

Fig. 3.2. Variante de prezentare a unei relaii R Observaia 1. ntr-o relaie, tuplurile trebuie s fie distincte. Observaia 2. Cardinalul relaiei este numrul tuplurilor dintr-o relaie. Gradul relaiei este numrul valorilor dintr-un tuplu. Atributul

Atributul reprezint coloana unei tabele de date, caracterizat printr-un nume. Exemplu: R: cnp: D data_nreg:D tip_
1 2

soluionare:D3

2661805270023 1701205230023

2006-05-27 2006-07-03

Da Nu

Fig. 3.3. Relaia R reprezentat cu ajutorul atributelor Atributele sunt utile atunci cnd ntr-o relaie un domeniu apare de mai multe ori. Prin numele dat fiecrei coloane (atribut), se difereniaz coloanele care conin valori ale aceluiai domeniu, eliminnd dependena fa de ordine. Schema unei relaii

Schema unei relaii este numele relaiei urmat de lista de atribute, pentru fiecare atribut precizndu-se domeniul asociat. Astfel, pentru o relaie R cu atributele A1, A2, ... , An i domeniile D1, D2, ... ,Dm, cu m n, schema relaiei R poate fi prezentat astfel: R(A1: D1, A2:D2, ... , An: Dm) sau R: A1:D1 ... An:Dm Fig. 3.4. Reprezentarea schemei relaiei R Ca o concluzie, dintre caracteristicile modelului relaional menionm: - nu exist tupluri identice; 20

- 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. 3.2 Operatorii modelului relaional
Limbajele de interogare sunt procedurale sau ne-procedurale. n limbajele procedurale utilizatorul indic sistemului succesiunea de operaii asupra BD pentru a determina rezultatul dorit. n limbajele ne-procedurale, utilizatorul descrie rezultatul dorit, fr a indica procedura prin care acesta este obinut Modelul relaional ofer dou colecii de operatori pe relaii: algebra relaional; calcul relaional: calcul relaional orientat pe tuplu; calcul relaional orientat pe domeniu. Algebra relaional este un limbaj procedural, pe cnd calculul relaional pe tupluri i calculul relaional pe domenii sunt limbaje ne-procedurale n acest curs va fi tratat doar cazul algebrei relaionale. Algebra relaional este o colecie de operaii pe relaii, fiecare operaie avnd drept operanzi una sau mai multe relaii, rezultatul fiind o alt relaie. Exist mai multe criterii de grupare a operaiilor: operaii de baz: reuniunea; diferena; produsul cartezian etc. operaii derivate: intersecia; diviziunea etc. sau operaii tradiionale pe mulimi (reuniune, intersecie, diviziune, produs cartezian) operaii relaionale speciale (selecia, proiecia, jonciunea, etc.)

Reuniunea

Reuniunea reprezint o operaie a algebrei relaionale definit pe dou relaii: R1 i R2, ambele cu aceeai schem, n urma creia se construiete o nou relaie R3, cu aceeai schem ca i R1 i R2 i avnd drept extensie tuplurile din R1 i R2, luate mpreun o singur dat. Notaii: R1U R2 OR (R1, R2) APPEND (R1, R2) UNION (R1, R2)

21

Reprezentarea grafic R3

R1 R2

Fig. 3.5. Reprezentarea grafic a operaiei de reuniune a dou relaii Exemplu: Deoarece aplicaia AGENTIE IMOBILIARA luat ca exemplu n acest curs nu conine dou relaii cu aceeai structur, pentru a putea exemplifica operaia de reuniune se vor construi dou relaii ARHIVA_OFERTE i ARHIVA_CERERI populate cu informaiile aferente ofertelor respectiv cererilor soluionate (s-au ales doar patru atribute: id-ul ofertei sau a cererii, tipul operaiei(ofert sau cerere), cnp-ul clientului, tipul soluionrii). Pentru a afla care sunt toate ofertele i cererile soluionate, se realizeaz operaia de reuniune.
REZ:

id 1066 1210 220 1316

tipul oferta oferta cerere cerere

cnp 2660805270023 1881106300897 2820506300898 1881106300897

tip_solutionare Da Da Da Da

ARHIVA_OFERTE: ARHIVA_CERERI:

id 1066 1210

tipul oferta oferta

cnp 2660805270023 1881106300897

tip_solutionare Da Da

id 220 1316

tipul cerere cerere

cnp 2820506300898 1881106300897

tip_solutionare Da Da

Fig. 3.6. Reuniunea relaiilor ARHIVA_OFERTE i ARHIVA_CERERI Diferena

Diferena reprezint o operaie a algebrei relaionale definit pe dou relaii R1 i R2, ambele cu o aceeai schem, n urma creia se construiete o nou relaie R3, cu schema identic cu R1 i R2, avnd drept extensie acele tupluri ale relaiei R1 care nu se regsesc n relaia R2. Notaii: R1 R2 REMOVE (R1, R2) MINUS (R1, R2)

22

Reprezentarea grafic: R3

R1 R2

Fig. 3.7. Reprezentarea grafic a operaiei de diferen a dou relaii Exemplu: Presupunnd c exist clieni care au nregistrri n ambele tabele (adic au oferit imobil spre vnzare, dar i au achiziionat un alt imobil n acelai timp), pentru a afla care au fost doar ofertanii de imobile, se aplic diferena dintre relaiile ARHIVA_OFERTE i ARHIVA_CERERI.
REZ:

id 2066

tipul oferta

cnp 2660805270023

tip_solutionare Da

ARHIVA_OFERTE: ARHIVA_CERERI:

id 1210 2066

tipul oferta oferta

cnp 1881106300897 2660805270023

tip_solutionare Da Da

id 0221 1210 3161

tipul cerere cerere cerere

cnp 2820506300898 1881106300897 2690125270032

tip_solutionare Da Da Da

Fig. 3.8. Diferena relaiilor ARHIVA_OFERTE i ARHIVA_CERERI Produsul cartezian Produsul cartezian reprezint o operaie a algebrei relaionale definit pe dou relaii R1 i R2, n urma creia se construiete o nou relaie R3, a crei schem se obine prin concatenarea schemelor relaiilor R1 i R2, avnd ca extensie toate combinaiile tuplurilor din R1 cu cele din R2 (operaie laborioas). Notaie: R1xR2 PRODUCT (R1, R2) TIMES (R1, R2) Reprezentarea grafic: R3

R1 R2

Fig. 3.9. Reprezentarea grafic a produsului cartezian 23

Exemplu: Operaia de produs cartezian va fi exemplificat pe un exemplu independent de aplicaia AGENIA IMOBILIAR considerat. Astfel:
TRANSPORT:

Localit:D1 Baia Mare Braov Baia Mare Braov

Jude:D1 Maramure Braov Maramure Braov

Transport:D3 autobuz autobuz troleibuz troleibuz

Tarif: D4 11 000 11 000 10 000 10 000

LOCALIT:

TARIFE:

Localit:D1 Baia Mare Braov

Jude:D1 Maramure Braov

Transport: D3 autobuz troleibuz

Tarif: D4 11 000 10 000

Fig. 3.10. Produsul cartezian dintre relaiile LOCALIT i TARIFE Proiecia Proiecia reprezint o operaie a algebrei relaionale definit asupra unei relaii R, n urma creia se construiete o nou relaie P, n care se gsesc acele atribute din R specificate explicit n cadrul operaiei. Prin operaie de proiecie se trece de la o relaie de grad n (are n coloane) la o relaie de grad mai mic, p (p<n). Notaie:

A j , A j ,...,Am ( R)
R[ Ai , A j ,..., Am ]

PROJECT ( R, Ai , A j ,..., Am ) Reprezentarea grafic: P


Ai,Aj,...,Am

R Fig. 3.11. Reprezentarea grafic a operaiei de proiecie Exemplu: Pentru a obine o list cu numele i numerele de telefon ale ofertanilor/cumprtorilor, se poate aplica operaia de proiecie a relaiei DATE_PERSOANE asupra atributelor numele, nr_telefon

24

REZ: numele
Pop Ana Sas Ioan

nr_telefon 0362/409209

numele, nr_telefon DATE_PERSOANA: cnp 1701205230032 numele Pop Ana adresa Str. Viilor, nr.55/4, Oradea, Bihor Str. Victoriei, nr.22/12, Baia Mare, Maramures nr_telefon email pa@yahoo.it

2660805270023

Sas Ioan

0362/409209

Fig. 3.12. Proiecia relaiei DATE_PERSOANA pe atributele numele, nr_telefon Selecia

Selecia reprezint o operaie din algebra relaional definit asupra unei relaii R, n urma creia se construiete o nou relaie S, cu aceeai schema ca R, avnd extensia construit din acele tupluri din R care satisfac o condiie menionat explicit n cadrul operaiei (se poate interpreta ca tiere orizontal: nu toate tuplurile din R satisfac aceast condiie sau filtru). Condiia precizat n cadrul operaiei de selecie se reprezint sub forma: atribut, operator de comparaie, valoare unde operator de comparaie poate fi unul din semnele <, <=, >=, > sau . Notaie: condiie (R) R [condiie] RESTRICT (R, condiie) Reprezentarea grafic: S condiie

R Fig. 3.13. Reprezentarea grafic a operaiei de selecie Exemplu: n cazul n care se dorete afiarea ofertelor/cererilor anterioare datei de 2006-0703, se poate aplica operaia de selecie asupra relaiei CERERI_OFERTE, dup cum se va vedea n figura 3.14. 25

OFERTE VECHI: id_ co# 12 tipul oferta cnp 2660805270023 data_ inreg 2006-05-27 Cod_loc CJ147 Id_ strada 120 Nr_ imobil 22 etaj P Pret_ min 45 Pret_ max 47

Id_confort 0012

data_nreg<2006-07-03 OFERTE: id_ co# 12 13 tipul oferta oferta cnp 2660805270023 1701205230023 data_ inreg 2006-05-27 2006-07-03 Cod_loc CJ147 BV230 Id_ strada 120 120 Nr_ imobil 22 52 etaj P 2 Pret_ min 45 30 Pret_ max 47 35

Id_confo 0013 0012

Fig. 3.14. Selecia efectuat asupra relaiei CERERI_OFERTE

Jonciunea

Jonciunea (joinul) reprezint o operaie a algebrei relaionale definit pe dou relaii: R1 i R2, n urma creia se construiete o alt relaie R3, prin concatenarea unor tupluri din R1 cu tupluri din R2 care ndeplinesc o anumit condiie specificat explicit n cadrul operaiei. Notaie: R1 R2; JOIN(R1,R2,condiie) Reprezentarea grafic:
R3 atribut din R1 atribut din R2 Operator de comparaie R1 R2

Fig. 3.15. Reprezentarea grafic a operaiei de jonciune Condiia de concatenare din cadrul operaiei de jonciune este de forma: atribut din R1 operator de comparaie atribut din R2 n funcie de operatorul de comparaie din condiia de concatenare, joinul poate fi de mai multe feluri, ns cel mai important este equijoinul: atribut din R1 = atribut din R2

Exemplu: Aplicnd operaia de equijoin relaiilor DATE_PERSOANE i FACTURI pentru atributul cnp, se obin informaii referitoare la clienii care au ncheiat facturi. Pentru a nu ncrca figura, pentru cele dou relaii s-au ales doar cteva atribute. 26

cnp

REZ :

numele

adresa

nr_telefon

nr_ factura

id_co

cnp 1551212245038

1551212245038

Pop Radu

Str. Al. Cuza, nr.4/34, Ploiesti

0744304505

22

43

cnp

cnp

=
DATE_PERSOANA:

FACTURI: adresa Str. Al. Cuza, nr.4/34, Ploiesti Str. Luminii, 76, Buzau nr_ telefon 0744304505 0721435622

cnp# 1551212245038 2560405570053

numele Pop Radu Chis Alina

nr_ id_co cnp factura# 22 43 1551212245038

Fig. 3.16. Operaia de equijoin a relaiilor DATE_PERSOANA i FACTURI Observaie: Operaia de jonciune se poate exprima cu ajutorul operaiilor de produs cartezian i selecie, rezultatul unui join fiind asemenea cu cel al operaiei de selecie asupra unui produs cartezian: JOIN (R1, R2, condiie) = RESTRICT (PRODUCT (R1, R2), condiie). Este indicat utilizarea joinului n locul produsului cartezian, de cte ori este posibil. Tipuri de jonciuni n funcie de tipul condiiilor de conectare modul de definire a schemei extensia relaiei rezultate prin jonciune, vom studia: jonciunea natural jonciunea extern semijonciunea. Jonciunea natural

Jonciunea natural este o operaie definit pe dou relaii R1 i R2, n urma creia se construiete o nou relaie R3, a crei schem este obinut prin reuniunea atributelor din relaiile R1 i R2 (atributele cu aceleai nume se iau o singur dat) i a crei extensie conine tuplurile obinute prin concatenarea tuplurilor din R1 cu cele din R2 care prezint aceleai valori pentru atributele cu aceleai nume. Jonciunea natural elimin inconvenientul ce apare n cazul equijoinului i anume: schema relaiei n cazul equijoinului conine toate atributele celor dou relaii. Astfel, n relaia R3 a jonciunii naturale, atributele cu acelai nume vor aprea o singur dat. Reprezentarea grafic: 27

R3

R1

R2

Fig. 3.17. Reprezentarea grafic a operaiei de jonciune natural Exemplul 1: Relund exemplul anterior, prin jonciunea natural se elimin atributul repetitiv cnp.
REZ :
cnp numele adresa nr_telefon

nr_ factura

id_co

1551212245038

Pop Radu

Str. Al. I. Cuza, nr.4/34, Ploiesti

0744304505

22

43

cnp

cnp

=
DATE_PERSOANA:

FACTURI: adresa Str. Al. Cuza, nr.4/34, Ploiesti Str. Luminii, 76, Buzau nr_ telefon 0744304505 0721435622

cnp# 1551212245038 2560405570053

numele Pop Radu Chis Alina

nr_ id_co cnp factura# 22 43 1551212245038

Fig. 3.18. Operaia de jonciune natural a relaiilor DATE_PERSOANA i FACTURI Exemplul 2: Dac se dorete aflarea denumirilor localitilor n care sunt oferte sau cereri, cum n relaia CERERI_OFERTE se afl doar codul localitii respective iar n relaia LOCALITATI este asociat fiecrui cod de localitate denumirea localitii, trebuie s se realizeze o jonciune natural ntre aceste dou relaii. Astfel rezultatul jonciunii va fi cel prezentat n figura 3.19.

28

REZ:
id_ co# 12 234 tipul oferta cerere cnp 1701205230023 2760805270024 data_ inreg 200607-03 200605-27 cod_ loc BV230 CJ400 id_ strada 120 120 nr_ imobil 52 22 pret_ min 30 45 pret_ max 35 47 tip_ solutionare da da nume _loc Brasov ClujNapoca simbol_ judet BV CJ

cod_loc

cod_loc

LOCALITATI:

cod_loc# CJ400 BV230 CERERI_OFERTE:


id_ co# 12 234 44 tipul oferta cerere oferta cnp 1701205230023 2760805270024 2661111246642 data_ inreg 2006-07-03 2006-09-21 2006-09-17 cod_loc BV230 CJ400 MM430 id_ strada 120 120 133 nr_ imobil 52 22 4 pret_ min 30 45 50

nume_loc ClujNapoca Brasov

simbol _judet CJ BV

pret_ max 35 47

tip_ solutionare da da nu

Fig. 3.19. Jonciunea natural a relaiilor CERERI_OFERTE i LOCALITATI

Jonciunea extern

Jonciunea extern este operaia definit pe dou relaii: R1 i R2, n urma creia se obine o nou relaie R3 prin joncionarea relaiilor R1 i R2. n relaia R3 apar i tuplurile din R1 i R2 care nu au participat la join (atributul de jonciune cel care are acelai nume i n relaia R1 i n relaia R2 nu prezint aceleai valori). Aceste tupluri sunt completate cu valoarea NULL. Jonciunea extern elimin inconvenientul cauzat de jonciunea intern i anume pierderea de tupluri (vezi figura 3.19; tuplul <44,oferta, 2661111246642, 2006-09-17, MM430, 133, 4, 50, nu> nu mai apare n relaia REZ, deoarece simbolul MM430 corespunztoare atributului cod_loc din relaia CERERI_OFERTA nu figureaz printre valorile atributului cu acelai nume din relaia LOCALITATI. Reprezentarea grafic:
R3

R1

R2

Fig. 3.20. Reprezentarea grafic a operaiei de join extern Exemplu: Jonciunea extern este o operaie care din punct de vedere al programrii prezint inconvenientul manipulrii valorilor nule. n relaia REZ, judeului Braov nu i s-a asignat o localitate, deci nici codul localitii. 29

REZ:

cod_loc# 430 435 400 710 -

nume_loc Baia Mare Borsa Cluj-Napoca Botosani -

simbol_judet MM MM CJ BT BV

nume_judet Maramures Maramures Cluj Brasov

simbol_judet

simbol_judet

LOCALITATI:

JUDETE:

cod_loc# 430 435 400 710

nume_loc Baia Mare Borsa Cluj-Napoca Botosani

simbol_judet MM MM CJ BT

simbol_judet# MM CJ BV

nume_judet Maramures Cluj Brasov

Fig. 3.21. Operaia de jonciune extern a relaiilor LOCALITI i JUDEE Semijonciunea

Semijonciunea este o operaie definit pe dou relaii R1 i R2, n urma creia se construiete o nou relaie R3, a crei extensie conine tuplurile relaiei R1 care particip la jonciunea celor dou relaii, conservnd atributele relaiei R1. Notaie: R1 R2; SEMIJOIN(R1, R2). Reprezentarea grafic:
R3

R1

R2

Fig. 3.22. Reprezentarea grafic a operaiei de semijonciune Exemplu: Semijonciunea urmtoare realizeaz lista localitilor care au referin n relaia JUDETE.

30

REZ:

cod_loc# 430 435 400

nume_loc Baia Mare Borsa Cluj-Napoca

simbol_judet MM MM CJ

simbol_judet

LOCALITATI:

JUDETE:

cod_loc# 430 435 400 710

nume_loc Baia Mare Borsa Cluj-Napoca Botosani

simbol_judet MM MM CJ BT

simbol_judet# MM CJ BV

nume_judet Maramures Cluj Brasov

Fig. 3.23. Operaia de semijonciune a relaiilor LOCALITATI i JUDETE Observaia 1. Aceast operaie a fost introdus de P.A. Bernstein, fiind necesar la optimizarea cererilor de date. Observaia 2. Semijonciunea produce acelai rezultat ca operaia de proiecie pe atributele din relaia R1 efectuat asupra jonciunii dintre R1 i R2 PROJECT (JOIN (R1, R2, condiia), A1, A2, A3)=SEMIJOIN (R1, R2). Intersecia

Intersecia reprezint o operaie a algebrei relaionale definit pe dou relaii, R1 i R2, ambele cu aceeai schem, n urma creia se construiete o nou relaie R3, cu schema identic cu a operanzilor i cu extensia format din tuplurile comune lui R1 i R2. Notaie: R1R2 INTERSECT (R1, R2) AND (R1, R2) Reprezentarea grafic: R3

R1 R2

Fig. 3.24. Reprezentarea grafic a operaiei de intersecie

31

Exemplu:
REZ: localitate judete populatie

Brasov

Brasov

350 000

ORASE:
localitate judete populatie localitate

MUNICIPII:
judete populatie

Borsa Brasov

Maramures Brasov

27 000 350 000

Baia Mare Brasov

Maramures Brasov

148 270 350 000

Fig. 3.25. Intersecia relaiilor ORASE i MUNICIPII Observaie: Intersecia se poate exprima prin intermediul unor operaii de baz. De aceea intersecia este o operaie derivat. R1R2=R1-(R1-R2) R1R2=R2-(R2-R1) Diviziunea

Diviziunea reprezint o operaie a algebrei relaionale definit asupra unei relaii R cu schema R(A1:D1, , Ap:Dk, , Ap+1:Di, , An:Dm), n urma creia se construiete o nou relaie Q cu ajutorul unei relaii r cu schema r (Ap+1:Dl, , An:Dm), relaia Q avnd schema: Q(A1:D1, , Ap:Dk). Tuplurile relaiei Q concatenate cu tuplurile relaiei r permit obinerea tuplurilor relaiei R. Notaie: Rr Division (R, r). Reprezentarea grafic: Q

R r

Fig. 3.26. Reprezentarea grafic a operaiei de diviziune Exemplul se lasa ca exerciiu suplimentar.

Complementarea

Complementarea reprezint o operaie (adiional) a algebrei relaionale definit asupra unei relaii R, n urma creia se construiete o nou relaie C, numit complementarea relaiei R. Extensia relaiei C va conine ansamblul tuplurilor din produsul cartezian al domeniilor asociate atributelor relaiei, care nu figureaz n extensia relaiei considerate. 32

Notaii: R NOT (R) COMP(R) Exemplu: Fie relaia: R(A1:D1, A2:D2), unde A1 = culoare; A2 = numr; D1 = {Rou, Galben, Albastru} D2 = {1, 2, 3} reprezentat prin tabelul: R: A1:D1 A2.D2 Rou 1 Rou 2 Galben 3 a) relaia R Complementarea relaiei R va fi relaia NOT (R) repezintat prin tabelul: NOT (R): A1:D1 A2:D2 Rou 3 Galben 1 Galben 2 Albastru 1 Albastru 2 Albastru 3 b) relaia not R Fig. 3.27. Complementarea relaiei R Observaie: Complementaritatea este puin utilizat, datorit rezultatului foarte mare de tupluri. Splitarea

Splitarea (spargerea) reprezint o operaie (adiional) a algebrei relaionale definit asupra unei relaii R, n urma creia se construiesc dou relaii R1 i R2 cu aceeai schem cu R, relaii obinute pe baza unei condiii definite asupra atributelor din R. Extensia lui R1 conine tuplurile din R care verific condiia specificat, iar R2 conine tuplurile din R care nu verific aceast condiie. Exemplu: Considernd relaia R din figura 3.27 (a) i condiia A2>2, operaia de splitare a relaiei R produce relaiile R1 i R2 reprezentate prin tabelele: R1 A1:D1 A 2:D2 Galben 3

33

R2 A1:D1 A2:D2 Rou 1 Rou 2 Figura 3.28. Rezultatul operaiei de splitare a relaiei R din figura 3.27 (a) pe baza condiiei A2>2 nchiderea tranzitiv

nchiderea tranzitiv este o operaie (adiional) a algebrei relaionale, definit asupra unei relaii R, a crei schem conine dou atribute A1 i A2 cu acelai domeniu asociat, operaie care const n adugarea la relaia R a tuplurilor care se obin succesiv prin tranzitivitate: dac n R exist tuplurile: <a,b> i <b,c> se va aduga la R tuplul <a,c>. Notaie: ( R) R+ CLOSE(R) Exemplu:
R:
Persoana: D Urma: D

( R) :
Persoana: D Urma: D

Ana Ana Ion Ion Maria

Ana Maria Ana Ion Ion Vasile Ion Nicoleta Maria Oana a) Ana Oana Ana Vasile Ana b) Nicoleta Fig. 3.29. nchiderea tranzitiv a relaiei R

Maria Ion Vasile Nicoleta Oana

3.3 Restricii de integritate ale modelului relaional Restriciile de integritate ale modelului relaional reprezint cerine pe care trebuie s le ndeplineasc datele din cadrul bazei de date pentru a putea fi considerate corecte i coerente n raport cu lumea real pe care o reflect. Dac o baz de date nu respect aceste cerine, ea nu poate fi utilizat cu un maxim de eficien. Restriciile sunt de dou tipuri: restricii de integritate structurale, care se definesc prin egalitatea sau inegalitatea unor valori din cadrul relaiilor: restricia de unicitate a cheilor; restricia entitii; dependenele ntre ele; restricii de integritate de comportament care in cont de semnificaia valorilor din cadrul bazei de date. Utilizarea modelului relaional nu impune definirea i verificarea tuturor acestor

34

tipuri de restricii de integritate. Din acest punct de vedere exist restricii de integritate minimale. Acestea sunt obligatoriu de definit i de respectat cnd se lucreaz cu modelul relaional. Dintre restriciile minimale fac parte: restricia de unicitate a cheii; restricia referenial; restricia entitii. Alte restriciii de integritate ar fi dependenele; restricii de comportament. Restricii de integritate minimale Restriciile de integritate minimale sunt definite n raport cu noiunea de cheie a unei relaii. Cheia identific un tuplu n cadrul unei relaii fr a face apel la toate valorile din tuplu. Cheia unei relaii reprezint ansamblul minimal de atribute prin care se poate identifica n mod unic orice tuplu al relaiei. Oricare relaie posed cel puin o cheie: cheie simpl, cnd cheia este construit dintr-un singur atribut; cheie compus, cnd cheia este construit din mai multe atribute. Exemplul 1:
R2: R1:

A:DA a1 a2 a3

B:DB b1 b3 b2

ADA a1 a1 a2 a3

B:DB b1 b2 b3 b2

a) cheie simpl

b) cheie compus

Fig. 3.30. Chei simple i chei compuse Determinarea cheii unei relaii necesit cunoaterea tuturor extensiilor posibile, nu numai a aceleia din momentul n care se stabilete cheia. Astfel, presupunnd c R1 i R2 sunt versiuni ale aceleiai relaii R la momente de timp diferite: t1, respectiv t2, alegerea la momentul t1 drept cheie atributul A a relaiei R se dovedete a fi greit, ntruct atributul A nu face posibil identificarea unic a tuplurilor i la momentul t2. Cheia relaiei R este reprezentat, prin urmare, de perechea de atribute (A,B). Exemplul 2:
JUDETE: STRAZI: simbol_jude BV BV CJ cod_loc# BV230 BV230 CJ147 id_strad# 120 078 120 nume_str Independenei Grii Cireilor

simbol_judet# nume_jud MM Maramures AB Alba

Fig. 3.31. Chei simple i chei compuse n cadrul relaiilor JUDEE, respectiv STRZI

35

Observaie: Cheia relaiei JUDEE este simbol_jude, deoarece fiecare jude are o codificare unic a denumirii sale, deci fiecrui jude i corespunde un singur simbol. Cheia relaiei STRZI este compus din atributele cod_loc i id_strada. Dac s-ar alege drept cheie primar doar atributul id_strada, acesta nu ar identifica n mod unic numele unei strzi dintr-o localitate, id-ul strzii respective putndu-se regsi i n alte localiti ale aceluiai jude sau a altui jude. La fel, dac s-ar alege drept cheie primar atributul cod_loc, acesta nu ar mai identifica n mod unic un tuplu, deoarece ntr-o localitate exist mai multe strzi. O relaie poate avea mai multe combinaii de atribute, cu proprietatea de identificare unic a tuplurilor. Se spune n acest caz c relaia posed mai muli candidai cheie (chei candidate). Definiia 1. Se numete cheie primar, cheia aleas dintre cheile candidate care s serveasc n mod efectiv la identificarea tuplurilor. Cheia primar nu poate fi reactualizat. Cheia primar a unei relaii nu este altceva dect atributul de identificare a unei entiti, prin urmare se reprezint fie prin subliniere, fie urmate de semnul #. Definiia 2. Se numete cheie extern atributul/grupul de atribute dintr-o relaie R1 a crui/cror valori sunt definite pe acelai domeniu/aceleai domenii ca i cheia primar a unei alte relaii R2 i care are rolul de a modela asocierea ntre entitile reprezentate prin relaiile R1 i R2. n acest caz, R1 se numete relaie care refer, iar R2 se numete relaie referit. Exemplul 1:
DATE_PERSOANA: JUDETE:

cnp 1701205230023 2660805270023

numele Sas Ioan Pop Ana

simbol_ judet BV CJ

simbol_judet BV CJ MM

descriere Brasov Cluj Maramures

Fig. 3.32. Reprezentarea legturii dintre relaiile DATE_PERSOANA i JUDETE cu ajutorul cheii externe simbol_judet din cadrul relaiei DATE_PERSOANA Observaia1: n exemplul de mai sus, relaia DATE_PERSOANA are drept cheie primar atributul cnp, iar ca i cheie extern atributul simbol_judet, iar relaia JUDETE are drept cheie primar cheia simbol_judet. Relaia DATE_PERSOANA este relaia care refer, iar JUDETE este relaia referit. Observaia2: ntre cele dou relaii (entiti) avem urmtoarea asociere:
(0,n)

DATE_PERSOANA

are reedina

(1,1)

JUDETE

Fig. 3.33. Asocierea dintre entitile DATE_PERSOANA i JUDETE

36

Exemplul 2:
JUDETE: simbol_judet# BV CJ nume_jud Braov Cluj simbol_jude BV CJ LOCALITATI: cod_loc# BV230 CJ147 nume_loc Braov Dej

STRZI: simbol_judet BV BV CJ

cod_loc# BV230 BV230 CJ147

id_strada# 001 002 003

nume_str Independenei Grii Cireilor

Fig. 3.34. Reprezentarea legturii ntre relaiile JUDETE i LOCALITATI cu ajutorul cheilor externe simbol_judet i cod_localitate Restricia de unicitate a cheii

Restricia de unicitate a cheii impune ca ntr-o relaie s nu existe dou linii identice (linii care s nu conin aceleai valori pentru toate atributele). Altfel spus, restricia de unicitate a cheii impune ca ntr-o relaie s nu existe dou tupluri cu o aceeai valoare pentru atributul cheie. Exemplele 1 i 2 respect restricia de unicitate a cheii. Restricia referenial

Restricia referenial impune ca ntr-o relaie R1 care refer o relaie R2, valorile cheii externe s figureze printre valorile cheii primare din R2 sau s fie valori null (nedefinite). R1 i R2 nu trebuie s fie neaprat distincte. Exemplele 1 i 2 prezint un mecanism de legare a relaiilor i respect restricia referenial a cheii. Restricia entitii

Restricia entitii impune ca ntr-o relaie atributele cheii primare s fie nenule. (Atributele cheie s nu conin valori nule). Dac exist valori null, cheia i poate pierde rolul de identificator de tuplu. Astfel, la ncrcarea unui tuplu, valoarea cheii trebuie s fie cunoscut, pentru a se putea verifica faptul c aceast valoare nu exist deja ncrcat. Exemplele 1 i 2 respect restricia entitii. Relaia REZ din figura 4.17 ncalc restricia entitii deoarece exist chei primare ce conin valori nule, dup cum este cazul judeului Braov. Alte restricii de integritate n categoria restricii de integritate intr urmtoarele tipuri de restricii: a) restricii referitoare la dependena datelor: dependen funcional; dependen multivaloare; b) restricii de comportament: restricii de domeniu; restricii temporale. 37

Restriciile referitoare la dependena datelor, reprezint modul n care datele depind unele de altele. Dependenele funcionale

Dependenele funcionale reprezint dependena ntre date prin care se poate identifica un atribut/grup de atribute prin intermediul altui atribut/grup de atribute. Dac X i Y sunt dou subansamble de atribute ale atributelor relaiei R, spunem c ntre X i Y exist o dependen funcional, notat X Y , dac i numai dac: (i) fiecare valoare a lui X poate fi asociat unei singure valori din Y, i (ii) dou valori distincte ale lui X nu pot fi asociate dect aceleiai valori ale lui Y. X se numete determinantul (sursa) dependenei, iar Y se numete determinatul (destinaia) dependenei. Exemple: Urmtoarele atribute se afl n dependen funcional: cod_potallocalitate, deoarece unui cod potal i corespunde o singur localitate (sensul dependenei este foarte important, deoarece, viceversa ar nsemna: o localitate are un singur cod_potal); nr_facturdata_factur, deoarece cunoaterea numrului facturii determin cu exactitate data facturii. Dou atribute nu sunt n dependen funcional, notat X Y, atunci cnd cunoaterea unei valori a primului atribut fie nu permite cunoaterea nici uneia dintre valorile celui de al doilea atribut, fie permite cunoaterea mai multor valori ale celui de al doilea atribut. Exemplu: Urmtorul atribut nu se afl n dependen funcional: cnp nr_factur, deoarece pentru o persoan se pot ntocmi mai multe facturi (aferente fiecrei vnzri). n cadrul modelului relaional, o dependen funcional este reprezentat printr-o sgeat ce pornete din surs i se termin n destinaie.
FACTURI:

nr_factura# data_facturii cnp 1 2006-07-05 1701205230023 2 2006-06-28 2581023457723 Fig. 3.35. Reprezentarea dependenei funcionale ntre atributele nr_factura i data_facturii Dependenele multivaloare

Dependenele multivaloare reprezint dependena n care un atribut/ grup de atribute poate reprezenta/ identifica mai multe valori pentru o singur valoare a unui alt atribut/ grup de atribute. Dac X,Y i Z sunt trei subansambluri de atribute ale atributelor relaiei R, spunem c ntre X i Y exist o dependen multivaloare, notat X Y sau X Y | Z , dac i numai dac: (i) la fiecare valoare a lui X poate fi asociat una sau mai multe valori ale lui Y, i (ii) aceast asociere nu depinde de apariiile lui Z. 38

Altfel spus, dac X Y i (x,y,z), (x,y,z) sunt dou tupluri din R, atunci i (x,y,z), (x,y,z) sunt tupluri din R. Exemplu: n relaia OFERTE (alctuit din atributele: id_tip_oferte, cnp i simbol_judet) valorile atributului id_tip_oferte au urmtoarea semnificaie: 01 desemneaz imobil de tip apartament, iar 02, imobil de tip cas. Astfel, urmtoarea relaie conine dependene multivaloare:
OFERTE:

id_tip_oferte 01 01 02 01 01 02

cnp simbol_judet 1701205230023 MM 2581023457723 MM 1701205230023 SM 2581023457723 SM 2581023457723 SM 2581023457723 CJ

deoarece 01 01 01 01 1701205230023 MM 2581023457723 SM 1701205230023 SM 2581023457723 MM


(x, y,z) (x, y,z) (x, y,z) (x, y,z)

Fig. 3.36. Relaia OFERTE n care exist dependen multivaloare 3.4 Exerciii de fixare a noiunilor 1. Se numete domeniu al unui atribut: a) mulimea valorilor posibile ale unui atribut; b) tipul datelor de atribut; c) mulimea valorilor actuale ale unui atribut 2. Se numete baz de date relaional: a) un set de tabele; b) un set de tabele normalizate; c) un set de tabele bidimensionale 3. Definii urmtorii termeni: - cheie primar -cheie extern - BDR - domeniu - entitate - atribut - relaie 4. Care sunt conceptele utilizate pentru a descrie elementele de baz ale organizrii unei BDR? 39

5. Dou relaii R1 i R2 sunt compatibile cu reuniunea, dac: a) au acelai numr de atribute; b) au acelai numr de atribute, iar atributele care ocup aceeai poziie au acelai nume; c) au acelai numr de atribute, iar atributele care ocup aceeai poziie au acelai domeniu. 6. Pentru a putea determina intersecia relaiilor R1 i R2 este necesar ca: a) relaiile s fie compatibile cu intersecia; b) relaiile s fie compatibile cu reuniunea; c) relaiile s aib cel puin un tuplu comun. 7. Dac R1 are n1 tupluri, R2 are n2 tupluri, atunci R1 U R2 are: a) cel puin n1 + n2 tupluri; b) n1 + n2 tupluri; c) cel mult n1 + n2 tupluri. 8. Operatorul de proiecie aplicat unei relaii, permite: a) eliminarea unor coloane; b) modificarea poziiei coloanelor; c) eliminarea unor coloane i modificarea poziiei lor 9. Pentru a putea realiza jonciunea natural ntre relaiile R1 i R2 este necesar ca: a) relaiile R1 i R2 s fie compatibile cu reuniunea; b) relaiile R1 i R2 s aib cte un atribut cu acelai domeniu; c) relaiile R1 i R2 s aib cel puin cte un atribut cu acelai nume i acelai domeniu. 10. Se consider relaiile: STUDENT (NR_LEG, NUME, PRENUME, GRUPA) i TELEFON (NR_LEG, PREFIX, TELEFON, TIP_TELEFON). Se presupune c fiecare student are cel mult un telefon mobil. Pentru a rezolva cererea s se afieze toi studenii unei grupe precizate, iar acolo unde este cazul s se afieze i telefonul mobil, este necesar s utilizam: a) o jonciune natural; b) o jonciune de egalitate; c) o jonciune extern. 11. Rezultatul aplicrii unui operator relaional, este ntotdeauna: a) o relaie; b) o relaie sau o valoare; c) o relaie sau un set de relaii. 12. Definii urmtorii operatori: - reuniunea - diferena - produsul cartezian - proiecia - selecia - intersecia - diviziunea 13. Enumerai cele trei tipuri de jonciune. 14. Care dintre operatorii relaionali definii n cursul 4 au o definiie care nu se bazeaz pe aceeai structur? 15. Fie baza de date FURNIZORI_COMPONENTE modelat de urmtoarele valori eantion: 40

F F#
F1 F2 F3 F4 F5

numeF Pop Achim Ardelean Popescu Ionescu numeC piulita Bolt Surub Surub Cama Roata dintata

Stare 20 10 30 20 30 Culoare Rosu Verde albastru Rosu Albastru rosu

oras Bucuresti Ploiesti Ploiesti Bucuresti Vaslui Masa 12.0 17.0 17.0 14.0 12.0 19.0 oras Bucuresti Ploiesti Arad Bucuresti Ploiesti Bucuresti

FC

C C#
C1 C2 C3 C4 C5 C6

F# F1 F1 F1 F1 F1 F1 F2 F2 F3 F4 F4 F4

C# C1 C2 C3 C4 C5 C6 C1 C2 C2 C2 C4 C5

cant 300 200 400 200 100 100 300 400 200 200 300 400

Fig. 1. Baza de date FURNIZORI_COMPONENTE (valori eantion) Furnizorii i componentele sunt identificate n mod unic prin numrul furnizorului F, respectiv prin numrul componentei C. Fiecare furnizor are un numr F, un nume numeF, care nu este neaprat unic, o valoare de cotare sau a strii stare i o localizare oras. Se presupune c fiecare furnizor este localizat n exact un singur ora. Fiecare component are un numr C care este unic, un nume numeC, o culoare culoare, o mas mas i localitate n care sunt stocate componentele. Relaia FC reprezint livrrile i se exprim astfel: Furnizorul F livreaz componenta C n cantitatea cant. Care este valaorea expresiei F JOIN FC JOIN C? 16. Fie A si B dou atribute (simple sau compuse) ale relaiei R. Se spune c atributul B este dependent funcional de A, dac: a) fiecrei valori a lui A i este asociat exact o valoare a atributului B; b) fiecrei valori a lui A i este asociat cel puin o valoare nenul a atributului B; c) fiecare valoare a lui B este asociat unei valori a lui A. 17. Explicai urmtoarele noiuni: - restricii de integritate - cheia primar a unei relaii - cheia extern a unei relatii - relaie care refer - relaie referit. 18. n baza de date FURNIZORI_COMPONENTE, dai exemple de a) chei primare i secundare b) chei simple i chei compuse c) relaie care refer i relaie referit. 19. Precizai care sunt restriciile de integritate minimal ale modelului relaional, apoi enunai aceste restricii. 20. Ce nseamn dependen funcional? Dai dou exemple de DF. 21. Se definete o relaie ORAR, cu urmtoarele atribute: Z ziua din sptmn (de la 1 la 5) T perioada din zi (de la 1 la 6) C numrul slii de clas P numele profesorului L numele leciei. 41

Tuplul (z,t,c,p,l) apare n aceast relaie dac i numai dac la momentul (z,t) lecia l este predat de profesorul p n sala de clas c. Se presupune c leciile au durata de o perioad i c ficare lecie are un nume, care este unic pentru toate leciile predate ntro sptmn. Ce dependene funcionale conine aceast relaie? Care sunt cheile candidat? 22. Fie relaia F_O_C din figura urmtoare:
F_O_C

F# F1 F1 F2 F2 F3 F4 F4 F4

oras Brasov Brasov Iasi Iasi Iasi Brasov Brasov Brasov

C# C1 C2 C1 C2 C2 C2 C4 C5

cant 100 100 200 200 300 400 400 400

Fig. 2. Relaia F_O_C (valori eantion) Determinai dependenele funcionale.

42

CAPITOLUL III. OPTIMIZAREA STRUCTURII BAZELOR DE DATE RELAIONALE


Se expun regulile formulate de dr.Codd, care definesc un sistem de gestiune a bazelor de date relaional; se prezint apoi tehnicile de normalizare a bazelor de date relaionale, care au ca efect obinerea unei structuri optime, acre s elimine anomaliile de inserare, modificare i tergere a datelor, precum i redundanele la nivelul datelor. 4. Prelucrarea/evaluarea i optimizarea cerinelor Regulile lui Codd Prin sistem de gestiune a bazelor de date relaionale (SGBDR) se nelege un SGBD care utilizeaz drept concepie de organizare a datelor modelul relaional. Definirea unui SGBDR impune o detaliere a caracteristicilor pe care trebuie s le prezinte un SGBD pentru a putea fi considerat relaional. n acest sens, Codd a formulat (n 1985) 13 reguli, care exprim cerinele pe care trebuie s le satisfac un SGBD. Aceste reguli sunt deosebit de utile n evaluarea unui SGBDR. R0: Regula privind gestionarea datelor la nivel de relaie. - sistemul trebuie s gestioneze BD numai prin mecanisme relaionale. R1: Regula privind reprezentarea logic a datelor. - ntr-o baz de date relaionat, informaia este reprezentat la nivel logic sub forma unor tabele (relaii); - acest lucru nseamn c toate datele trebuie s fie memorate i prelucrate n acelai mod. R2: Regula privind reprezentarea logic a datelor - orice data din baza de date relaionat trebuie s poat fi accesat prin specificarea: numelui relaiei; valorii cheii primare; numele atributului. R3: Regula privind valorile nule - sistemul trebuie s permit declararea i manipularea sistematic a valorilor NULL (semnific lipsa unor date); - valorile NULL difer de irurile de caractere spaiu, irurile vide de caractere. - valorile NULL sunt deosebit de importante n implementarea restriciilor de integritate: integritatea entitilor; integritatea referenial. R4: Regula privind metadatele - utilizatorii autorizai trebuie s poat aplica asupra descrierii bazei de date aceleai operaii ca i asupra datelor obinuite. R5: Regula privind facilitile limbajelor de utilizare: - trebuie s existe cel puin un limbaj care s exprime oricare din urmtoarele operaii: definirea relaiilor; sa vizualizeze datele; 43

s regseasc informaia; s poat reactualiza informaia; s verifice i s corecteze datele de intrare, etc. - n general, toate implementrile SQL respect aceast regul. R6: Regula privind actualizarea tabelelor virtuale: - toate tabelele/relaiile virtuale trebuie s poat fi actualizate. - nu toate tabelele virtuale sunt teoretic actualizate. Exemplu: Fie tabela de baz PROD, cu urmtoarea schem PROD(Denp:D1, Cant:D2, Pret:D3), cu ajutorul tabelei PROD este definit o tabel virtual DISP, cu schema: DISP (Denp:D1, Cant:D2, Pret:D3, Val:D4). Valorile atributului Val se calculeaz astfel: Val=Cant*Pret. Presupunem c se dorete schimbarea preului unitar la un anumit produs, aceast schimbare trebuie efectuat n tabela de baz PROD, atributul Pret din tabela virtual DISP, fiind actualizabil, ntruct actualizarea se poate propaga spre tabela de baz. Presupunem c se dorete schimbarea valorii Val la un anumit produs: modificarea de la tabela virtual spre tabela de baz nu mai este posibil, atributul Val nu este actualizabil, deoarece schimbarea valorii Val se poate datora schimbrii cantitii Cant i/sau a preului unitar Pret. astfel trebuie s existe un mecanism prin care s se poat determina dac anumite vizualizri pot fi modificate sau nu. - majoritatea implementrilor SQL ndeplinesc aceast cerin. R7: Regula privind inserrile, modificrile i tergerile din baza de date. - un SGBDR nu trebuie s oblige utilizatorul s caute ntr-o relaie, tuplu cu tuplu, pentru a regsi informaia dorit; - aceast regul exprim cerina ca n operaiile prin care se schimb coninutul bazei de date s se lucreze la un moment dat pe o ntreag relaie. R8: Regula privind independena fizic a datelor - o schimbare a structurii fizice a datelor nu trebuie s blocheze funcionarea programelor de aplicaii; - ntr-un SGBDR trebuie s se separe aspectul fizic al datelor (stocare sau acces la date) de aspectul logic al datelor. R9: Regula privind independena logic a datelor. - o schimbare a relaiilor bazei de date nu trebuie s afecteze programele de aplicaie. R10: Regula privind restriciile de integritate - restriciile de integritate trebuie s fie definite ntr-un limbaj relaional, nu n programul de aplicaie. R11: Regula privind distribuirea geografic a datelor - distribuirea datelor pe mai multe calculatoare dintr-o reea de comunicaii de date, nu trebuie s afecteze programele de aplicaie. R12: Regula privind prelucrarea datelor la nivelul de baz - dac sistemul posed un limbaj de baz orientat pe prelucrarea de tupluri i nu pe prelucrarea relaiilor, acest limbaj nu trebuie s fie utilizat pentru a evita restriciile de integritate (se introduc inconsistene).

44

Clasificarea regulilor lui Codd n funcie de tipul de cerine pe care le exprim, regulile sunt grupate n 5 categorii: 1. Reguli de baz: R0 i R12; 2. Reguli structurale: R1 i R6; 3. Reguli privind integritatea datelor: R3 i R10; 4. Reguli privind manipularea datelor: R2, R4, R5, R7; 5. Reguli privind independena datelor: R8, R9, R11. Evaluarea/prelucrarea cerinelor i optimizarea n SGBDR interfaa cu utilizatorul este de tip neprocedural. Utilizatorul definete datele pe care dorete s le vizualizeze fr a da algoritmi de acces. Sistemul trebuie s converteasc cererea utilizatorului ntr-o cerere optimal. Evaluarea unei cereri se efectueaz n trei etape: 1. Analiza cererii ce const n studierea sintactic i semantic a cererii pentru a verifica corectitudinea sa i a simplifica criteriului de cutare. 2. Ordonarea presupune: - descompunerea cererii ntr-o mulime de operaii elementare i - determinarea ordinii optimale a acestor aplicaii. 3. Execuia n paralel i/sau secvenial a operaiilor elementare 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. Ideea general este concretizat n schema de mai jos: cerere arbore algebric (nu este unic) plan de executie optimizare adic optimizarea cererilor de date se realizeaz prin parcurgerea urmtoarelor etape: 1. exprimarea cererilor sub forma unei expresii algebrice relaionale; 2. aplicarea unor transformri algebrice asupra expresiilor obinute n etapa precedent, n scopul executrii mai eficiente a lor; 3. planul de execuie; 4. optimizarea. 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.). Strategiile de optimizare pot fi de dou tipuri: 1. Strategii generale de optimizare (independente de modul de memorare al datelor); 2. Strategii specifice anumitor SGBDR (in cont de modul de memorare al datelor). Strategiile generale de optimizare a cererilor de date sunt: 45

Regula de optimizare 1. Seleciile se execut ct mai devreme posibil. Motivaia acestei reguli este c seleciile reduc substanial dimensiunea relaiilor. Regula de optimizare 2. Produsele carteziene se nlocuiesc cu join-uri, 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. 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. 5. Tehnica normalizrii relaiilor La proiectarea structurii unei baze de date relaionale trebuie stabilite (dup cum s-a vzut n cursurile anterioare) n primul rnd tabelele n care vor fi memorate datele i asocierile dintre tabele. Acestea sunt stabilite ntr-o form iniial, dup care, prin rafinare succesiv se ajunge la forma definitiv. Acestei structuri iniiale i sunt aplicate un set de reguli care reprezint paii de obinere a unei baze de date normalizate. Dac o baz de date nu este normalizat ea nu poate fi utilizat cu un maxim de eficien. Algoritmul de normalizare a bazelor de date relaionale precum i paii acestuia au fost descrii de ctre E. F. Codd n 1972. 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). Scopul normalizrii este de a suprima redundanele logice i de a evita anomaliile la reactualizare. Exemplu: Pentru a evidenia cteva exemple de redundane i anomalii, se va considera cazul relaiei iniiale OFERTANTI. Pentru a nu ncrca relaia, se vor considera valori ale atributelor prescurtate.
OFERTANTI:

cnp#
Cnp1

numele
N1

adresa_ client
Str. Victoriei, nr.22/12, Baia Mare, Maramures Str. Victoriei, nr.22/12, Baia Mare, Maramures Str. Viilor, nr.55/4, Oradea, Bihor Str. Grii, nr. 14, Bucuresti

nr_ telefon
Nr1

oferta adresa_ imobil casa A_imobil1

Cnp1

N1

Nr1

hala

A_imobil2

Cnp2

N2

Nr2

casa teren

A_imobil3 A_imobil4

Cnp3

N3

Nr3

Fig. 5.1. Relaia OFERTANTI 46

Redundana logic: Tripletul (N1, Str. Victoriei, nr.22/12, Baia Mare, Maramures, Nr1) apare de dou ori. Anomalii la inserare: Dac o persoan ofer spre vnzare mai multe imobile, pentru nregistrarea ofertei trebuie rescris codul numeric personal nc o dat, deci cheia devine duplicat. Anomalii de tergere: tergerea unei persoane din baza de date atrage dup sine pierderea informaiilor despre oferta respectiv. Anomalii la modificare: Dac se modific numele strzii Victoriei din localitatea Baia Mare n strada Independenei, modificarea trebuie efectuat pentru fiecare ofert din Baia Mare amplasat pe strada Victoriei. Dac ar exista 25 de oferte n aceast localitate pe strada Victoriei, costul modificrii ar fi mare pentru a modifica toate nregistrrile. Aceast redundan este eliminat dac atributul adresa este mprit n alte trei atribute: simbol_judet, cod_loc, id_strada. Valorile acestea vor fi codul judeului, localitii, respectiv a strzii preluate din relaiile deja existente JUDETE, LOCALITATI, respectiv STRAZI. n acest caz, modificarea se face doar o singur dat, n tabela STRAZI. Normalizarea Codd a definit iniial 3 forme normale, notate prin FN1, FN2 i FN3. ntruct ntr-o prim formulare, definiia FN3 ridic ceva probleme, Codd i Boyce au elaborat o nou variant, cunoscut sub numele de Boyce-Codd Normal Form (BCNF). Astfel BCNF este reprezentat separat n majoritatea lucrrilor. R. Fagin a tratat cazul FN4 i FN5. O relaie este ntr-o form normal dac satisface o mulime de constrngeri specificat n figura 5.2. De exemplu, se spune c o relaie se afl n a doua form normal FN2 dac i numai dac se afl n FN1.
Relaia universal FN1 FN2 FN3 BCFN FN4 FN5

Fig. 5.2. Formele normale ale relaiilor dintr-o BDR Normalizarea bazei de date relaionale poate fi imaginat ca un proces prin care pornindu-se de la relaia iniial/universal R se realizeaz descompunerea succesiv a acesteia n subrelaii, aplicnd operatorul de proiecie. Relaia R poate fi ulterior reconstruit din cele n relaii obinute n urma normalizrii, prin operaii de jonciune. 5.1 Prima form normal (FN1) FN1 este strns legat de noiunea de atomicitate a atributelor unei relaii. Astfel, aducerea unei relaii n FN1 presupune introducerea noiunilor de: atribut simplu; 47

atribut compus; grupuri repetitive de atribute. Atributul simplu- Atribut compus

Prin atribut simplu (atribut atomic) se nelege un atribut care nu mai poate fi descompus n alte atribute, n caz contrar, atributul este compus (atribut neatomic). Exemplu: Urmtoarele exemple de atribute pot fi considerate simple sau compuse n funcie de circumstane i de obiectivele bazei de date. Data calendaristic este un atribut n care apar cmpurile: zi, lun, an; Adresa este un atribut n care apar cmpurile: strada, nr, bloc, scara, etaj, apartament, localitate, jude; Data operaiunii bancare este un atribut n care apar cmpurile data, ora; Buletin/carte identitate este un atribut n care apar cmpurile: seria, nr. Aceste atribute pot fi atomice sau neatomice. Astfel adresa clienilor ageniei imobiliare intereseaz la nivel global, pe cnd pentru adresa ofertei sau a cererii de imobile este vital prelucrarea separat a fiecrui cmp considerat. Analog, atributul nume reprezint un atribut simplu al acestei baze de date, deoarece numele clientului intereseaz la nivel global. Grupuri repetitive de atribute

Un grup repetitiv este un atribut (grup de atribute) dintr-o relaie care apare cu valori multiple pentru o singur apariie a cheii primare a relaiei nenormalizate. Exemplu: Fie relaia nenormalizat (primar) FACTURI. Dorim s stabilim o structur de tabele care s permit stocarea informaiilor coninute n document (factur) i obinerea unor situaii sintetice privind evidena sumelor facturate pe produse, pe clieni, pe anumite perioade de timp.

48

FACTURI nr_factura# data_factura nume_client adresa_client banca_client nr_cont_client delegat cod_produs denumire_produs unitate_de_masura cantitate pret_unitar valoare valoare_tva total_valoare_factura total_valoare_tva Fig. 5.3. Relaia FACTURI nenormalizat n cazul n care o factur conine mai multe produse, relaia de mai sus va avea grupurile repetitive: cod_produs, denumire_produs, cantitate, pret_unitar, valoare, valoare_tva. Aducerea unei relaii universale la FN1 FN1 este tratat n general cu superficialitate, deoarece principala cerin atomicitatea valorilor este uor de ndeplinit (cel puin la prima vedere). Dintre toate formele normale, doar FN1 are caracter de obligativitate. Se spune c o baz de date este normalizat daca toate relaiile se afl mcar n FN1. O relaie este n FN1 dac domeniile pe care sunt definite atributele relaiei sunt constituite numai din valori atomice. Un tuplu nu trebuie s conin atribute sau grupuri de atribute repetitive. Aducerea relaiilor n FN1 presupune eliminarea atributelor compuse i a celor repetitive. Se cunosc trei soluii pentru determinarea grupurilor repetitive: eliminarea grupurilor repetitive pe orizontal (n relaia R iniial, n locul atributelor compuse se trec componentele acestora, ca atribute simple); eliminarea grupurilor repetitive prin adugarea de tupluri; eliminarea grupurilor repetitive prin construirea de noi relaii. Primele dou metode genereaz relaii stufoase prin duplicarea forat a unor atribute, respectiv tupluri, crendu-se astfel redundane masive cu multiple anomalii de actualizare. Metoda a treia presupune eliminarea grupurilor repetitive prin construirea de noi relaii, ceea ce genereaz o structur ce ofer cel mai mic volum de redundan. Etapele de aducere a unei relaii n FN1 sunt: I. se construiete cte o relaie pentru fiecare grup repetitiv; 49

II. n schema fiecrei noi relaii obinute la pasul 1 se introduce i cheia primar a relaiei R nenormalizate; III. cheia primar a fiecrei noi relaii va fi compus din atributele chei ale relaiei R, plus unul sau mai multe atribute proprii. Exemplu: Deoarece o factur poate avea unul sau mai multe produse nscrise pe aceasta, informaiile legate de produse vor fi separate ntr-o alt tabel. Aplicnd etapele de aducere la FN1, se obin dou relaii: FACTURI nr_factura# data_factura nume_client adresa_client banca_client nr_cont_client delegat toal_valoare_factura toal_valoare_tva LINII_FACTURI nr_factura# cod_produs# denumire_produs unitate_de_masura cantitate pret_unitar valoare valoare_tva

Fig. 5.4. Relaia FACTURI adus n forma normal FN1 Observaia1: Cmpul adresa_client cuprinde informaii despre judeul, localitatea, strada i numrul domicililului clientului. Dac se consider c este de interes o eviden a sumelor factorizate pe judee sau localiti, se vor pune n locul cmpului adresa_client trei cmpuri distincte: judet_client, localitate_client, adresa_client, uurnd n acest fel interogrile. Observaia2: ntre tabela FACTURI i tabela LINII_FACTURI exist o relaie de unu la muli, adic unui numr unic de factur i pot corespunde unul sau mai multe produse care sunt memorate ca nregistrri n tabele LINII_FACTURI. Cheia primar n aceast tabel este o cheie compus, format din dou cmpuri: nr_factura i cod_produs. ns eliminarea grupurilor repetitive, adic aducerea unei relaii la FN1, nu rezolv complet problema normalizrii. 5.2. A doua form normal (FN2) FN2 este strns legat de noiunea de dependen funcional. Noiunea de dependen funcional a fost prezentat n cursul 5: Restricii de integritate ale modelului relaional. O relaie se afl n a doua form normal FN2 dac: 1. se afl n forma normal FN1 i 2. fiecare atribut care nu este cheie este dependent de ntreaga cheie primar. Etapele de aducere a unei relaii de la FN1 la FN2 sunt: I. Se identific posibila cheie primar a relaiei aflate n FN1; II. Se identific toate dependenele dintre atributele relaiei, cu excepia acelora n care sursa este un atribut component al cheii primare; III. Se identific toate dependenele care au ca surs un atribut sau subansamblu de atribute din cheia primar;

50

IV. Pentru fiecare atribut (sau subansamblu) al cheii de la pasul III se creeaz o relaie care va avea cheia primar atributul (subansamblul) respectiv, iar celelalte atribute vor fi cele care apar ca destinaie n dependenele de la etapa III. Exemplu: Relaia care conine date redundante (de exemplu, modificarea denumirii unui produs atrage dup sine modificarea n fiecare tuplu n care apare acest produs) este relaia LINII_FACTURI. Se observ ca nu exist nici o dependen funcional ntre atributele necomponente ale cheii. n schimb, toate atributele care nu intr n alctuirea cheii compuse sunt dependente de aceasta, iar DF dintre atributul component al cheii primare sunt: cod_produs --> denumire_produs, cod_produs --> unitate_de_masura. Ca urmare se formeaz nc dou relaii. FACTURI nr_factura# data_factura nume_client adresa_client banca_client nr_cont_client delegat toal_valoare_factura toal_valoare_tva LINII_FACTURI nr_factura# cod_produs# cantitate pret_unitar valoare valoare_tva PRODUSE cod_produs# denumire_produs unitate_de_masura

Fig. 5.5. Relaia FACTURI n a doua forma normal FN2 Chiar dac au fost eliminate o parte din redundane, mai rmn i alte redundane ce se vor elimina aplicnd alte forme normale.

51

5.3. A treia form normal (FN3) O relaie este n forma normal trei FN3 dac: 1. se gsete n FN2 i 2. fiecare atribut care nu este cheie (nu particip la o cheie) depinde direct de cheia primar. A treia regul de normalizare cere ca toate cmpurile din tabele s fie independente ntre ele. Etapele de aducere a unei relaii de la FN2 la FN3 sunt: I. Se identific toate atributele ce nu fac parte din cheia primara i sunt surse ale unor dependene funcionale; II. Pentru aceste atribute, se construiete cte o relaie n care cheia primar va fi atributul respectiv, iar celelalte atribute, destinaiile din DF considerate; III. Din relaia de la care s-a pornit se elimin atributele destinaie din DF identificat la pasul I, pstrndu-se atributele surse. Exemplu: n relaia FACTURI se observ c atributul nume_client determin n mod unic atributele adresa_client, banca_client i nr_cont_client. Deci pentru atributul nume_client se construiete o relaie CLIENTI n care cheia primar va fi acest atribut, iar celelalte atribute vor fi adresa_client, banca_client i nr_cont_client. Cmpurile valoare i valoare_tva depind de cmpurile cantitate, pret_unitar, i de un procent fix de TVA. Fiind cmpuri ce se pot calcula n orice moment, ele vor fi eliminate din tabel LINII FACTURI, deoarece constituie informaie memorat redundant. FACTURI nr_factura# data_factura nume_client delegat toal_valoare_factura toal_valoare_tva LINII_FACTURI nr_factura# cod_produs# cantitate pret_unitar PRODUSE cod_produs# denumire_produs unitate_de_masura CLIENTI nume_client# adresa_client banca_client nr_cont_client

Fig. 5.6. Relaia FACTURI n a treia forma normal FN3 Observaia 1: Aceast a treia form normal mai poate suferi o serie de rafinri pentru a putea obine o structur performant de tabele ale bazei de date. De exemplu se observ c nume_client este un cmp n care este nscris un text destul de lung format dintr-o succesiune de litere, semne speciale (punct, virgul, cratim), spaii, numere. Ordonarea i regsirea informaiilor dup astfel de cmpuri este lent i mai greoaie dect dup cmpuri numerice. Din acest motiv se poate introduce un nou atribut cod_client care s fie numeric i care s fie cheia primar de identificare pentru fiecare client. Observaia 2: O alt observaie care poate fi fcut n legtur cu tabelele aflate n cea de a treia form normal este aceea c total_valoare_factura este un cmp care ar trebui s conin informaii sintetice obinute prin nsumarea valorii tuturor ofertelor aflate pe o factur. Este de preferat ca astfel de cmpuri s fie calculate n rapoarte sau interogri i s nu fie memorate n tabelele bazei de date. 52

FACTURI nr_factura# data_factura cod_client delegat

LINII_FACTURI nr_factura# cod_produs# cantitate pret_unitar

PRODUSE cod_produs# denumire_produs unitate_de_masura

CLIENTI cod_client# nume_client adresa_client banca_client nr_cont_client

Verificarea aplicrii corecte a procesului de normalizare se realizeaz astfel nct uniunea acestor relaii s produc relaia iniial, cu alte cuvinte, descompunerea este fr pierderi. Celelalte forme normale se ntlnesc mai rar n practic. Aceste forme nu sunt respectate, n general, pentru c beneficiile de eficien pe care le aduc nu compenseaz costul i munca de care este nevoie pentru a le respecta. 5.4. Exerciii de fixare a noiunilor 1. Se spune c o relaie este n forma normal 1, dac: a) nu conine atribute compuse; b) fiecare atribut are numai valori atomice; c) conine cel puin o cheie candidat. 2. Se spune c o relaie se afl n a doua form normal, dac: a) se afl n prima form normal i fiecare atribut care nu este cheie primar este total dependent de cheia primara; b) se afl n prima form normal i orice atribut care nu este cheie candidat este total dependent de cheia primar; c) se afl n prima form normal i orice atribut care nu este determinat este total dependent de cheia primar. 3. Se consider relaia EXAMEN (NR_LEG, DATA_EXAMEN, ID_MATERIE, SALA, NOTA). Aceast relaie se afl n: a) a II-a form normal; b) a III-a form normal; c) prima form normal. 4. Exist numai trei forme normale? Enumerai formele normale. 5. Definii urmtoarele noiuni: - atribut simplu (atomic) - atribut compus. 6. S se normalizeze bazele de date prezente pe parcursul capitolelor anterioare: COLECTIE_MUZICALA, FURNIZORI_COMPONENTE.

53

CAPITOLUL IV. MANIPULAREA BAZELOR DE DATE RELAIONALE


Capitolul prezinta, pe scurt, posibilitile de interogare a bazelor de date relaionale, utiliznd algebra relaional i limbajul SQL.

Pentru interogarea bazelor de date, deci pentru cererea de date, poate exista un limbaj specializat numit limbaj al interogrilor, ca o parte a unui limbaj de manipulare a bazelor de date. In afara regsirii datelor, un limbaj de manipulare mai trebuie s conin comenzi pentru tergerea de nregistrri dintr-o relaie, adugarea de noi nregistrri ntr-o relaie i modificarea nregistrrilor. Dintre limbajele de interogare a bazelor de date relaionale se pot aminti: . Limbaj bazat pe algebra relaiilor. Acest limbaj este bazat pe o mulime de operatori ce acioneaz asupra uneia sau a dou relaii, iar rezultatul este tot o relaie. In paragraful urmtor sunt precizai operatorii acestui limbaj. Limbajul SQL (Structured Query Language). Diferite versiuni ale acestui limbaj au fost incluse n majoritatea SGBD-urilor comerciale. Unele comenzi din acest limbaj sunt descrise ntr-un paragraf urmtor. 6.1 Limbaj de interogare bazat pe algebra relaiilor Pentru a explica limbajul de interogare bazat pe algebra relaiilor vom preciza la nceput tipurile de condiii ce pot aprea n cadrul diferiilor operatori relaionali: 1. Pentru a verifica dac un atribut ndeplinete o condiie simpl, se face compararea acestuia cu o anumit valoare, sub forma:

nume_atribut

valoare

2. Urmtoarea condiie testeaz dac o anumit valoare aparine sau nu unei mulimi: nume_atribut relaie

54

3. Dou relaii se pot compara prin operaiile de egalitate, diferit, incluziune, neincluziune. Intre dou relaii cu acelai numr de coloane i cu aceleai tipuri de date pentru coloane (deci ntre dou mulimi comparabile) putem avea condiii de tipul urmtor:

4. O condiie poate fi oricare din construciile urmtoare: (condiie) NOT condiie condiie1 AND condiie2 condiie1 OR condiie2 , unde condiie, condiie1, condiie2 sunt condiii de tipurile 1-4. Pentru fiecare construcie se ia n consideraie o anumit relaie curent, care rezult din contextul n care apare aceasta: nume_atribut - care precizeaz valoarea atributului dintr-o anumit nregistrare. Dac precizarea numai a numelui atributului creaz ambiguitate (exist mai multe relaii curente care conin cte un atribut cu acest nume), atunci se va face o calificare a atributului cu numele relaiei sub forma: relaie.atribut; expresie - dac la evaluarea expresiei apar i denumiri de atribute, atunci acestea se iau din nregistrarea curent; COUNT(*) FROM relaie - precizeaz numrul de nregistrri din relaia precizat.

, care determin o valoare plecnd de la toate nregistrrile din relaia curent. La determinarea acestui numr se consider toate valorile atributului precizat (din toate nregistrrile), sau numai valorile distincte, dup cum lipsete sau apare clauza DISTINCT. Valorile astfel determinate sunt: numrul de valori (pentru COUNT), suma acestor valori (pentru SUM valorile trebuie s fie numerice), valoarea medie (pentru AVG valorile trebuie s fie numerice), valoarea maxim (apare MAX), respectiv valoarea minim (apare MIN). In continuare se vor preciza operatorii care se pot folosi pentru interogarea bazelor de date relaionale: Selecia (sau proiecia orizontal) - determin o nou relaie care are aceeai schem cu a unei relaii R. Din relaia R se iau numai nregistrrile care ndeplinesc o condiie c. Notaia pentru acest operator este: c (R) .

55

Proiecia (sau proiecia vertical) - determin o relaie nou care are atributele precizate printr-o mulime de atribute. Din fiecare nregistrare a unei relaii R se determin numai valorile atributelor incluse n mulimea . Mulimea se poate extinde la o mulime de expresii (n loc de o mulime de atribute), care precizeaz coloanele relaiei care se construiete. Notaia pentru acest operator este: (R) . Produsul cartezian al dou relaii: R1R2 - determin o relaie nou care are ca atribute concatenarea atributelor din cele dou relaii, iar fiecare nregistrare din R1 se concateneaz cu fiecare nregistrare din R2. Reuniunea, diferena i intersecia a dou relaii: R1R2, R1 - R2, R1R2. Cele dou relaii trebuie s aib aceeai schem. Exist mai muli operatori join: Joinul condiional, notat prin R1 c R2 - care determin acele nregistrri din produsul cartezian al celor dou relaii care ndeplinesc o anumit condiie. Din definiie se observ c avem: R1 c R2= c (R1 R2 ) . Joinul natural, notat prin R1 R2, care determin o relaie nou ce are ca atribute reuniunea atributelor din cele dou relaii, iar nregistrrile se obin din toate perechile de nregistrri ale celor dou relaii care au aceleai valori pentru atributele comune. Dac cele dou relaii au schemele R1[], R2[ ], i = {A1, A2 ,..., Am}, atunci joinul natural se poate calcula prin construcia urmtoare:

Atribuirea: unei variabile (care va desemna o relaie) i vom atribui o relaie dat printr-o expresie construit cu operatorii de mai sus. Parcurgerea unei relaii, care nseamn luarea pe rnd a fiecrei nregistrri din relaie. Inregistrrile din relaie se pot furniza sortate n raport cu anumite atribute din relaie: scan relaie [sorted by list_de_atribute] comenzi pentru o nregistrare curent endscan Stergerea unei relaii: erase nume. Apelul unei proceduri scrie pentru extragerea de informaii. Instruciuni (dintr-un limbaj pseudocod) pentru a descrie anumii algoritmi (de ex. if ... then ...endif, instruciuni de atribuire pentru variabile numerice sau iruri de caractere). In continuare se vor da cteva exemple de folosire a operatorilor amintii mai sus. Pentru unele explicaii se vor folosi comentariile date ntre acolade. Pentru aceste exemple s e va folosi o baz de date ce conine urmtoarele relaii cu informaii dintr-o universitate(coal): STUDENTI [nume, prenume, nrmatricol, grupa, datan, sexul, adresa, media]; SALI [cod_grupa, cod_sala, profil, indrumator]; PROFILE [denumire, cod_grupa]. Exemple: 1. Se cer studentii (numele i prenumele) grupei E-211. S:={nume,prenume}( grupa=E-211(studenti)); {mulimea cerut de studenti} n:=0; {numrul curent pentru un student} scan S sorted by nume, prenume {studentii se iau alfabetic}

56

n:=n+1; scrie(n,nume, prenume); endscan; erase S; 2. Se cer ndrumtorii tiinifici ai grupelor de la profilul MEC. I:={indrumator}(profil=MEC(SALI)); scan I sorted by indrumator scrie(indrumator); endscan; erase I; 3. Se cer studenii grupelor de la profilul ELE. S:= studenti grupa=cod_grupa and profil=ELE (sali); {join condiional} {n S sunt atributele din cele dou relaii folosite} scan S sorted by nume,prenume scrie(nume, prenume); endscan; erase S; 4. Se cer numele, prenumele, grupa i profilul grupei pentru toi studenii. C:= sali * profile ; {join natural, atributul comun este cod_grupa} S:= studenti grupa=cod_grupaC; {join condiional} scan S sorted by nume,prenume scrie(nume, prenume); endscan; erase C; erase S; 5. Pentru fiecare grup se cere numrul de studenti, media minim i media maxim. g:=; {grupa curent} n:=0; {numrul de studenti} medmin:=10; {media minim} medmax:=0; {media maxim} scan studenti sorted by grupa if g<>grupa then {se schimb grupa precedent} if g <> then {nu este la prima grup} scrie(g, n, medmin, medmax); n:=0; {o noua grupa} end if; medmin:=media; {primul student din noua grup} medmax:=media; end if; n:=n+1; {apare un nou student} if medmin > media then

57

medmin:=media; end if; if medmax < media then medmax:=media; end if; g:=studenti.grupa; {grupa curenta} endscan; scrie(g, n, medmin, medmax); {valori pentru ultima clas} 6. Se cer studenii de la grupele cu profil electric(ELE) sau mecanic(MEC), care au media mai mare dect media general a studenilor de la aceste grupe. C:={cod_grupa}(profil=ELE or profil=MEC(sali)); {codurile grupelor de la profilele cerute} {C este o relaie cu o coloan, deci poate fi considerat ca o mulime} S:= grupa in C(studenti); {studentii din grupele cu codurile n C} F:= media >= avg(media)(S); {studentii cu media mai mare sau egal dect media general a studentilor din S} scan F sorted by nume, prenume, grupa scrie(nume, prenume, grupa); endscan; erase C; erase S; erase F; 6.2 Limbajul SQL Pentru gestiunea bazelor de date relaionale s-a construit limbajul SOL (Structured Query Language), ce permite gestiunea tabelelor de date ntr-o form foarte simpl i performant. Acest limbaj se folosete i pentru formularea cererilor de date la un server de date folosind tehnologia client/server. Dintre instruciunile limbajului SQL amintim n continuare numai comenzile Create Table, Insert, Update, Delete, Select. Pentru crearea unui tabel se folosete comanda: CREATE TABLE nume_tabel (definire_coloana [,definire_coloana] ...[, restricii_tabel]) Pentru definirea unei coloane din tabel se precizeaz: un nume pentru coloan; un tip al valorilor din aceast coloan, cu eventuale precizri ale dimensiunii coloanelor; restricii asociate coloanei (valorile pentru coloana respectiv trebuie s ndeplineasc aceste restricii). Pentru adugarea de nregistri ntr-un tabel se folosete comanda INSERT cu una din formatele: INSERT INTO nume_tabel [(lista_coloane)] VALUES (lista_valori) INSERT INTO nume_tabel [(lista_coloane)] subinterogare unde prin "subinterogare" se precizeaz o mulime de nregistrri (cu ajutorul comenzii SELECT). Modificarea datelor dintr-un tabel se poate realiza prin comanda:

58

UPDATE nume_tabel SET coloana=expresie [,coloana=expresie] ... [WHERE condiie] Se modific nregistrrile din tabel pentru care condiia din clauza WHERE are valoarea true. n lipsa clauzei WHERE se consider toate nregistrrile din tabel. Valorile coloanelor precizate n SET se schimb la valoarea expresiilor asociate. Pentru tergerea de nregistrri dintr-un tabel se folosete comanda: DELETE FROM nume_tabel [WHERE condiie] Inregistrrile pentru care condiia din WHERE este adevrat se vor elimina din tabel. Dac aceast clauz lipsete, se terg toate nregistrrile tabelului. Comanda SELECT este folosit pentru interogarea bazelor de date relaionale, fiind cea mai complex din cadrul SGBDR -urilor . Comanda permite obinerea de date din mai multe surse de date. Ea poate realiza, printre altele, funciile de selecie, proiecie, produs cartezian i reuniune din limbajul de interogare a bazelor de date relaionale bazat pe algebra relaiilor. Sintaxa comenzii este dat n continuare.

Aceast comand selecteaz datele din relaiile surs precizate n clauza FROM. Pentru precizarea (calificarea) cmpurilor (dac folosirea numai a numelui cmpului produce ambiguitate, pt. c exist mai multe cmpuri cu acelai nume n sursele de date) se poate folosi numele relaiei sau un nume sinonim (alias local) stabilit n clauza FROM dup numele relaiei. Dac n clauza FROM apar mai multe relaii, atunci ntre prima relaie - pe care o vom numi relaie principal, i celelalte relaii este indicat s existe anumite legturi (stabilite prin condiii). Plecnd de la fiecare nregistrare a relaiei principale se determin nregistrrile din celelalte relaii asociate prin astfel de legturi (deci nregistrrile care verific o condiie). Dac legtura (condiia) nu exist, atunci se consider c ea asociaz toate nregistrrile din celelalte relaii pentru fiecare nregistrare a relaiei principale (se consider c valoarea condiiei este true atunci cnd ea lipsete). Pentru exemplificarea unor clauze din comanda SELECT vom considera urmtoarele trei relaii: SCOALA[Cod_Scoala, Nume, Adresa, Cod_Director], PROFESOR[Cod_Prof, Nume, Disciplina, DataN, Telefon], LEGATURA[Cod_Scoala, Cod_Profesor, Obs] Semnificaia celor trei relaii simple este urmtoarea: SCOALA - memoreaz unele informaii despre coli: un cod, numele, adresa, codul directorului;

59

PROFESOR - pstreaz codul, numele, disciplina de baz, data naterii i telefonul pentru diferii profesori; LEGATURA - este o relaie de jonciune construit pentru a memora legturi de tipul m:n (la o scoal lucreaz mai muli profesori, un profesor lucreaz la mai multe coli). S presupunem c avem urmtoarea construcie ntr-o comand SELECT: SELECT * FROM scoala, profesor, legatura Dac nu stabilim nici o legtur ntre relaia scoala (relaie principal deoarece apare prima) i celelalte relaii, atunci fiecare scoala va fi pus n corespondent cu fiecare profesor i cu fiecare nregistrare din relaia legatura. Daca ns este numrul de coli (numrul de nregistrri din relaie), np este numrul de profesori i nl este numrul de nregistrri din relaia legatur, atunci vom obine ns*np*nl triplete de forma (scoala, profesor, legatura), cu cte o nregistrare din fiecare relaie. Fr condiii formulate se obine, aadar, produsul cartezian al celor trei relaii: scoala profesor legatura Pentru a elimina anumite triplete fr sens, sunt necesare legturi, stabilite prin anumite condiii. Fr astfel de legturi putem avea situaia n care o scoala se pune n coresponden cu un profesor ce nu lucreaz la coala respectiv, iar la aceast pereche de nregistrri se adaug o nregistrare din tabelul legtur fr nici o legtur cu coala i profesorul de care se leag. Avem nevoie de urmtoarele legturi: plecnd de la o scoal vom lua numai acele nregistrri din tabelul legturi ce au valoarea cmpului cod_scoala egal cu codul colii de la care se pleac; plecnd de la o pereche de nregistrri scoala i legatura fixate la punctul precedent (n nregistrarea din legtura exist i un cod de profesor), vom lua acele nregistrri din relaia profesor ce corespund la profesorul precizat n legtur. Aceste legturi se stabilesc prin dou condiii elementare legate cu operatorul AND: scoala.cod_scoala = legatura.cod_scoala AND legatura.cod_profesor = profesor.cod_prof Dup cum se vede din aceast condiie, cmpurile din tabele se vor califica prin numele tabelului din care fac parte. Dac numele este unic n lista surselor de date, atunci aceast calificare se poate elimina. Condiiile elementare de legtur dintre dou fiiere sunt de forma: cmp1 operator cmp2 , unde operator poate fi: =, <>, >, >=, <, <=. Cei doi termeni ai comparaiei trebuie s aparin la tabele diferite. Plecnd de la tabelele din clauza FROM va rezulta o succesiune de nregistrri ce ndeplinesc (sunt evaluate cu adevrat) condiia de legtur. Din aceast succesiune de valori se pot setecta toate cmpurile din toate tabelele (apare clauza "*" dup numele comenzii), sau se pot construi cmpuri ce au ca valoare rezultatul unor expresii (expresiile se precizeaz cu ajutorul cmpurilor). Numele cmpului din tabelul rezultat este stabilit automat de sistem (n functie de expresia ce-l genereaz) sau se poate preciza prin clauza AS ce urmeaz expresiei (sau cmpului). In acest fel putem construi valori pentru o nou nregistrare n "tabel nou". In continuare vom da cteva exemple de construcii ce pot aprea ntr-o comand SELECT.

60

1. SELECT nume, disciplina, datan FROM profesor Aici apare un singur tabel, din care se selecteaz numai cele trei cmpuri precizate. 2. SELECT scoala.nume, profesor.nume FROM scoala, profesor WHERE scoala.cod_director = profesor.cod_prof Din cele dou tabele (coala i profesor) se pune n coresponden cte o coal cu directorul acesteia (un profesor), iar din aceast pereche se ia numele colii i numele directorului. 3. SELECT nume, year(now()) - year(datan)) as varsta FROM profesor Plecnd de la datele aflate n tabelul profesor, se afieaz numele fiecrui profesor i vrsta acestuia. Aici se presupune c exist funciile now() care furnizeaz data curent i year care extrage anul dintr-o dat calendaristic. In "tabelul nou" se pot pstra toate nregistrrile rezultate din tabelele surs (apare ALL, care este i valoarea implicit) sau numai nregistrrile distincte (apare DISTINCT). Inregistrrile obinute n felul descris mai sus n "tabelul nou" pot fi restrnse (filtrate) la cele care ndeplinesc o anumit condiie de filtrare, ce va fi trecut n clauza WHERE. Condiia de filtrare din clauza WHERE poate fi compus prin operatorii logici AND i OR. Condiiile elementare de filtrare pot fi de una din formele urmtoare: expresie operator_relational expresie expresie [NOT] BETWEEN valmin AND valmax pentru a verifica dac valoarea unei expresii este cuprins ntre dou valori (valmin i valmax) sau nu este cuprins ntre aceste valori (apare NOT) cmp (NOT) LIKE ablon Dup LIKE apare un ablon (ca un ir de caractere) ce precizeaz o mulime de valori. n funcie de sistemul de gestiune utilizat, exist un simbol special ce desemneaz locul unui singur caracter necunoscut, sau un simbol ce exprim un ir neprecizat de caractere.

Se verific dac valoarea expresiei apare (sau nu - cu NOT) ntr-o list de valori sau ntro subselecie. O subselecie(subinterogare) este un "tabel nou" generat cu comanda SELECT i care are numai un singur cmp - cu valori de acelai tip cu valorile expresiei. Aceast condiie corespunde testului de "apartenen" a unui element la o mulime. Exemple: scoala.cod_scoala IN (L01, L02, L03) profesor.cod_prof IN (SELECT cod_director FROM scoala) In subselecia dintre paranteze se includ codurile directorilor tuturor colilor.

61

Valorile cmpului din stnga operatorului relaional i valorile singurului cmp din subselecie trebuie s fie de acelai tip. Se obine valoarea adevrat pentru condiie dac valoarea din partea stng este n relaia dat de operator pentru:

Exemple: /* profesorii mai tineri dect orice director */ SELECT nume, datan FROM profesor WHERE datan >= ALL (SELECT datan FROM scoala, profesor WHERE cod_director=profesor.cod_prof) i /* profesorii care au cel putin un director mai tnr dect ei */ SELECT nume, datan FROM profesor WHERE datan <= ANY (SELECT datan FROM scoala, profesor WHERE cod_director=profesor.cod_prof) Subselecia folosit precizeaz datele de natere pentru toi directorii colilor. [NOT] EXISTS (subselectie) Cu EXISTS se obine valoarea adevrat dac n subselecie exist cel puin o nregistrare i fals dac subselecia este vid. Prezena lui NOT inverseaz valorile de adevr. (condiie) Inregistrrile din "tabelul nou" se pot ordona cresctor (ASC) sau descresctor (DESC) dup valorile unor cmpuri, precizate n clauza ORDER BY. Cmpurile se pot preciza prin nume sau prin poziia lor (numrul cmpului) n lista de cmpuri din comanda SELECT (precizarea prin poziie este obligatorie atunci cnd se dorete sortarea dup valorile unei expresii). Ordinea cmpurilor din aceast clauz precizeaz prioritatea cheilor de sortare. Mai multe nregistrri consecutive din surs pot fi grupate ntr-o singur nregistrare, deci un grup de nregistrri se nlocuiete cu o singur nregistrare. Un astfel de grup este precizat de valorile comune ale cmpurilor ce apar n clauza GROUP BY. "Tabelul nou" se sorteaz (automat de ctre sistem) cresctor dup valorile cmpurilor din GROUP BY. Inregistrrile consecutive din fiierul astfel sortat, care au aceeai valoare pentru toate cmpurile din GROUP BY, se nlocuiesc cu o singur nregistrare. Prezena unei astfel de nregistrri poate fi condiionat de valoarea adevrat pentru o condiie ce se trece n clauza HAVING. 62

Pentru grupul de nregistrri astfel precizat (deci pentru o mulime de valori) se pot folosi urmtoarele cinci funcii:

Sau AVG([ALL] expresie) Pentru grupul de nregistrri se iau toate valorile (cu ALL, care este i valoarea implicit) sau numai valorile distincte (apare DISTINCT) ale cmpului sau expresiei numerice precizate i din aceste valori se determin valoarea medie.

Aceast funcie determin numrul de nregistrri din grup (apare *), numrul de valori ale unui cmp (apare ALL, identic cu *), sau numrul de nregistrri distincte din grup (cu DISTINCT).

Sau SUM([ALL] expresie) Pentru nregistrrile din grup se face suma valorilor unui cmp sau ale unei expresii numerice (deci numrul de termeni este dat de numrul de nregistrri din grup sau suma valorilor distincte ale cmpului).

Sau MAX([ALL] expresie) ori MIN([ALL] expresie) Pentru fiecare grup se determin valoarea maxim sau minim. Cele cinci funcii amintite mai sus (AVG, COUNT, SUM, MIN, MAX) pot aprea att n expresiile ce descriu cmpurile din fiierul rezultat, ct i n clauza HAVING. Deoarece aceste funcii se aplic unui grup de nregistrri din comada SELECT, acest grup trebuie generat de clauza GROUP BY. Dac aceast clauz lipsete, atunci ntregul "tabel nou" constituie un grup, deci tabelul rezultat va avea o singur nregistrare. Exemplu (se folosete funcia month ce determin luna pentru o dat calendaristic): SELECT month (datan) AS luna, count(*) AS nr FROM profesor GROUP BY luna 63

Se determin numrul de profesori ce s-au nscut n aceeai lun, pentru lunile n care exist profesori nscui. Dou tabele cu acelai numr de cmpuri i cu acelai tip pentru valorile cmpurilor aflate pe aceleai pozitii se pot reuni ntr-un singur tabel obinut cu ajutorul clauzei UNION. Din tabelul rezultat obinut se pot pstra toate nregistrrile (apare ALL) sau numai cele distincte (nu apare ALL). Clauza ORDER BY poate apare numai pentru ultima selecie. Nu se pot combina subselecii prin clauza UNION. In continuare sunt date cteva exemple de folosire a comenzii SELECT: 1. Se cere un tabel cu numele i adresele colilor. SELECT nume, adresa FROM scoala 2. Se cer profesorii (toate datele despre ei) ce aparin colii cu codul S308. SELECT * FROM profesor, legatura WHERE cod_prof=cod_profesor and cod_scoala=S308 3. Se cer profesorii (numele i vrsta) care au cel puin 40 de ani. SELECT nume, year(now ()) - year(datan) AS varsta FROM profesor WHERE year(now ()) - year (datan) >=40 4. Se cer directorii colilor. SELECT scoala.nume AS scoala, profesor.nume AS director FROM scoala, profesor WHERE cod_director=profesor.cod_prof 5. Pentru fiecare coal se cere numrul de profesori. SELECT nume, COUNT(*) AS Nr_Profesori FROM scoala AS s ,legatura AS l WHERE s.cod_scoala = l.cod_scoala GROUP BY nume 6. Se cer profesorii cu vrsta de 25 sau 35 de ani. SELECT nume, year (now()) -year (datan) AS varsta FROM profesor WHERE year(now()) - year(datan) IN (25, 35) 7. Se cere numrul de profesori nscui n acelai an. SELECT anul, COUNT(*) AS nr_prof FROM (SELECT YEAR (datan) AS anul FROM profesor) AS tab_nou GROUP BY tab_nou.anul 8. Pentru fiecare disciplin, se cere numrul de profesori cu aceeai disciplin de baz. SELECT disciplina, COUNT(*) AS nr_prof FROM profesor GROUP BY disciplina

64

9. Se cer toate datele despre profesorii de la coala cu codul S308, cu vrsta mai mic dect vrsta medie a profesorilor(din toate colile). SELECT * FROM profesor AS P, legatura AS L WHERE P.cod_prof = L.cod_profesor AND year (now( )) -year (datan) < (SELECT AVG(year(now())-year(datan)) FROM profesor) AND L.cod_scoala=S308 10. Se cer profesorii care sunt nscui n numr de 2 n acelai an. SELECT nume, year (datan) AS Data_Nasterii FROM profesor AS P WHERE EXISTS (SELECT count(P1.datan) from profesor P1 WHERE year(P.datan) = year(P1.datan) GROUP BY year(P1.datan) HAVING count(P1.datan) =2) 11. Se cer profesorii al cror nume ncepe cu litera POP. SELECT nume FROM profesor WHERE nume LIKE POP%

65

CAPITOLUL V. LIMBAJUL DE INTEROGARE A BAZELOR DE DATE RELAIONALE


Se prezint, n detaliu, limbajul SQL(Structured Query Language) de interogare a bazelor de date relaionale; la nceputul capitolului se definesc noiunile comune limbajelor de interogare a datelor,indiferent de platforma de dezvoltare, pentru componentele specifice unui SGBDR: limbajul de descriere a datelor LDD, limbajul de manipulare a datelor LMD, limbajul de control al tranzaciilor LCT i cel de control al securitii -LCS .Se expune apoi LDD(CREATE, ALTER, DROP, RENAME) i LCS(GRANT, REVOKE) cu exemplificri n MySQL.

7. Limbajul SQL Noiuni introductive Limbajul SQL (Structured Query Language) este limbajul utilizat de majoritatea sistemelor de baze de date relaionale (SGBDR) pentru definirea i manipularea datelor. Din punct de vedere istoric ar trebui menionat faptul c limbajul SQL a fost dezvoltat ntr-un prototip de sistem de gestiune a bazelor de date relaionale la IBM, n 1970. n 1979 corporaia Oracle a introdus prima implementare a limbajului SQL n varianta comercial. n 1987 Institutul Naional de Standarde (ANSI) a elaborat standardul limbajului SQL. Ulterior au avut loc mai multe revizii ale acestui standard. Majoritatea limbajelor posed un set de instruciuni comun unanim acceptat de toate marile companii productoare de soft, precum MICROSOFT sau ORACLE. Termenii utilizai de limbajul SQL sunt : - tabel (Table) utilizat pentru a desemna o relaie; - linie (row) utilizat pentru a desemna un tuplu; - coloan (column) utilizat pentru a desemna un atribut. Componentele pe care le cuprinde limbajul SQL sunt urmtoarele: 1. componenta de descriere a datelor relaionale (limbajul de descriere a datelor LDD), 2. componenta de manipulare a datelor relaionale (limbajul de manipulare a datelor - LMD),ambele fiind absolut necesare n gestiunea BD. Pe lng aceste componente principale, standardul SQL2 mai prevede i alte componente ale limbajului: 3. controlul tranzaciilor; 4. controlul securitii i refacerea datelor.

66

Controlul tranzaciilor conine comenzi pentru specificarea tranzaciilor. Unele implementri adaug comenzilor prevzute n standard i alte comenzi suplimentare de control al concurenei i refacerea datelor. Controlul securitii i refacerea datelor conine comenzi de administrare a bazei de date pentru definirea utilizatorilor i a drepturilor acestora de acces la tabele. Aceast component este dependent de SGBD, iar pentru sisteme performante, administratorul BD este obiectul activitii unei categorii speciale de utilizatori ai BD administratori ai BD.

Structura lexical a limbajului SQL Elementele unei instruciuni (statement) sunt: cuvintele cheie (key words), dintre care fac parte comenzile (SELECT, UPDATE, INSERT etc), operatorii (AND, OR, NOT, LIKE), clauzele (WHERE, SET, VALUES etc); identificatorii (identifier) sunt elementele care denumesc tabela, coloana sau alt obiect BD; SQL face diferena ntre literele mari i mici, deci este casesensitive; identificatorul care conine ghilimele se numete identificator delimitat; constantele (literal) reprezint iruri de caractere ( ), numere ntregi, numere reale (ex. 3.5; 4. ; .001; 5e2), constanta NULL care simbolizeaz lipsa de informare, constante de tip logic (1 pentru TRUE i 0 pentru FALSE); caracterele speciale, cum ar fi ; care semnific terminarea comenzilor, . care semnific virgula zecimal, sau * care simbolizeaz operatorul de nmulire.

Operatori SQL SQL are urmtorii operatori: operatori aritmetici binari: + * % modulo ^ ridicarea la putere & AND orientat pe bii | OR orientat pe bii # XOR orientat pe bii << deplasare la stnga >> deplasare la dreapta

67

operatori binari de comparaie < > <= >= = <> sau != diferit

operatori aritmetici mari @ valoarea absolut ! factorial !! factorial, operator postfix ~ NOT orientat pe bii

operatori de comparaie A BETWEEN min AND max (compar A cu dou valori: min i max) A IN (v1,...,vn) compar A cu o list de valori A IS NULL A IS NOT NULL A LIKE model_ir

operatori logici

Operatorii logici sunt legai prin cuvintele cheie AND, OR, NOT i returneaz o valoare logic TRUE, FALSE sau NULL. operatori relaionali UNION (reuniune) INTERSECT (intersecie) MINUS (diferena). Funcii definite n SQL Funcii agregat Funciile agregat calculeaz un rezultat din mai multe linii ale unui tabel (funcii de totalizare): COUNT (furnizeaz numrul de linii ale unui rezultat); SUM (execut suma tuturor valorilor dintr-o coloan); MAX (returneaz valoarea cea mai mare dintr-o coloan); MIN (returneaz valoarea cea mai mic dintr-o coloan);

68

AVG (calculeaz media valorilor dintr-o coloan). Aceste funcii vor fi folosite n instruciunea SELECT. Funcii scalare

Funciile scalare primesc unul sau mai multe argumente i returneaz valoarea calculat sau NULL n caz de eroare. Argumentele funciilor pot fi constante sau valori ale atributelor specificate prin numele coloanelor corespunztoare. Dintre funciile scalare amintim: funcii numerice - de calcul trigonometric: sin, cos, tg, ctg etc. - de calcul al logaritmului: ln, log, lg - de calcul al puterilor: pow - de rotunjire: floor, ceil etc. funcii pentru manipularea irurilor de caractere funcii pentru data calendaristic funcii de conversie Tipuri de date n limbajul SQL sunt definite mai multe tipuri de date: numeric, ir de caractere, ir de bii, data (calendaristic), timp. Denumirile tipurilor de date precum i limitele acestora difer de la un SGBD la altul, dar n general, sunt destul de asemntoare. Tipul numeric include numere ntregi: INTEGER sau INT reprezentat pe 4 octei; SMALLINT reprezentat pe 2 octei; numere reale reprezentate n virgul flotant, cu diferite precizii: FLOAT reprezentat pe 4 octei; REAL reprezentat pe 8 octei; DOUBLE [PRECISION] reprezentat pe 8 octei; numere zecimale reprezentate cu precizia dorit: tipul NUMERIC sau DECIMAL, cu forma numeric[(p,s)] , unde p este numrul total de cifre afiate, iar s este numrul de cifre dup punctul zecimal. Tipul ir de caractere

CHARACTER (n) sau CHAR (n) definesc iruri de caractere cu lungimea fix. CHARACTER VARYING sau VARCHAR (n) definete irul de caractere cu lungimea variabil. Asemnarea dintre cele dou tipuri prezentate mai sus este aceea c ambele reprezint iruri de maxim n caractere, iar deosebirea este aceea c pentru iruri cu numr

69

de caractere mai mic ca n, CHAR (n) completeaz irul cu spaii albe pn la n caractere, iar VARCHAR (n) memoreaz numai attea caractere cte are irul dat. Tipul iruri de bii

BIT(n) definete secvene de cifre binare (care pot lua valoarea 0 sau 1) de lungime finit n; BIT VARYING (n) definete secvene de lungime variabil, cu limita maxim n. ` Tipuri pentru data calendaristic i timp DATE permite memorarea datelor calendaristice n formatul yyyy-mm-dd; TIME permite memorarea timpului, folosind trei cmpuri hh:mm:ss; TIMESTAMP(p) permite memorarea combinat a datei calendaristice i a timpului, cu precizia p pentru cmpul SECOND (al secundelor); valoarea implicit a lui p este 6; INTERVAL este utilizat pentru memorarea intervalelor de timp. Tipurile de date sunt case-insensitive, deci nu in cont de caracterele mari sau mici.

70

7.1. Limbaje relaionale de definire a datelor (LDD) Limbajul de definire a datelor (a schemei unei BD) include instruciuni ce permit: crearea schemei bazei de date; adugarea relaiilor la schema bazei; tergerea unor relaii existente; adugarea de noi atribute relaiilor existente; optimizarea bazei de date (index, grup, declanator); definirea structurii fizice i logice a unei BD; restricii cu privire la utilizarea structurii de mai sus. Comenzi pentru crearea unei baze de date Comanda pentru crearea unei baze de date este CREATE DATABASE nume_baza; Exemplu: S se creeze baza de date AGENTIA_IMOBILIARA. CREATE DATABASE AGENTIA_IMOBILIARA; Aceast comand creeaz o BD cu numele nume_baza. Nu toate SGBDR suport noiunea explicit de BD, dei utilizarea unei asemenea noiuni poate facilita controlul drepturilor de acces la relaiile BD. Sisteme precum DB2 nu posed noiunea explicit de BD, n timp ce sistemul dBASE o suport. Creatorul bazei de date devine automat administratorul BD. Comenzi pentru suprimarea unei baze de date Comanda pentru suprimarea unei baze de date este DROP DATABASE nume_baza; Aceast comand distruge BD cu numele nume_baza. Comenzi pentru crearea relaiilor de baz

n cadrul acestor comenzi se precizeaz numele relaiei precum i numele i tipul atributelor. n SQL, cele mai frecvente tipuri de date sunt: CHAR pentru ir de caractere de lungime fix; VARCHAR2 pentru ir de caractere de lungime variabil; NUMBER pentru numere ntregi sau reale de lungime variabil; DATE pentru date calendaristice; LONG pentru texte de lungime variabil RAW pentru informaie binar de lungime variabil. Comanda de creare a unei relaii este CREATE TABLE nume_tabela (atribute);

71

Crearea unei relaii indicnd cheia la nivel de coloan

Exemplu: S se creeze relaia JUDETE (simbol_judet, nume_judet). CREATE TABLE JUDETE (simbol_judet CHAR(2) PRIMARY KEY, nume_judet VARCHAR(30)); Crearea unei relaii indicnd cheile la nivel de tabel

Exemplu: S se creeze relaia LOCALITATI (cod_loc, simbol_judet, nume_loc). CREATE TABLE LOCALITATI (cod_loc VARCHAR(7), simbol_judet CHAR (2), nume_loc VARCHAR (50), PRIMARY KEY (cod_loc, simbol_judet), FOREIGN KEY (simbol_judet) REFERENCES JUDETE(simbol_judet)); Dac cheia primar are mai mult de o coloan atunci cheile trebuie indicate la nivel de tabel. Crearea unui tabel prin copiere

Exemplu: S se creeze relaia LOCALITATI_CLUJ (cod_loc, simbol_judet, nume_loc) utiliznd copierea datelor din relaia LOCALITATI. CREATE TABLE LOCALITATI_CLUJ SELECT cod_loc , simbol_judet , nume_loc FROM LOCALITATI WHERE simbol_judet LIKE 'CJ'; Comenzi pentru suprimarea unei relaii de baz Comanda de suprimarea unei relaii este DROP TABLE nume_tabela; Comanda SQL distruge relaia nume_tabela. Comenzi pentru schimbarea numelui unei relaii Comanda SQL pentru schimbarea numelui unei relaii este RENAME nume_tabela TO nume_tabela_nou; Exemplu: S se modifice numele relaiei LOCALITATI_CLUJ n LOC_CJ, apoi s se suprime relaia LOC_CJ.

72

RENAME TABLE LOCALITATI_CLUJ TO LOC_CJ; DROP TABLE LOC_CJ; Comenzi pentru modificarea structurii unei relaii

Prin modificarea structurii unei relaii se nelege: extinderea schemei relaiei prin adugarea de noi atribute; restrngerea schemei unei relaii prin suprimarea unor atribute; modificarea numelui i/sau tipului unui atribut din cadrul relaiei. Unele limbaje relaionale (QBE) admit toate aceste tipuri de modificri n schema unei relaii, iar altele (SQL sau QUEL) numai o parte. Comanda de modificare a unei relaii este ALTER TABLE nume_tabel ... Adugarea unui atribut cu ajutorul opiunii ADD

Exemplu: S se adauge atributul regiunea la relaia LOCALITATI. (Valorile acestui atribut vor fi: Transilvania, Banat, Oltenia, Muntenia, Moldova, Dobrogea.) ALTER TABLE LOCALITATI ADD (regiunea VARCHAR(10)); Modificarea unui atribut cu ajutorul opiunii MODIFY

Exemplu: Presupunnd c relaia FACTURI a fost adugat bazei de date AGENTIA_IMOBILIARA i c atributul pret_unitar este de tip INTEGER, s se modifice forma preului unitar. ALTER TABLE FACTURI MODIFY pret_unitar DECIMAL (10,2) ; Comenzi pentru declararea restriciilor de integritate (a constrngerilor)

Constrngere este un mecanism care asigur c valorile unei coloane sau a unei mulimi de coloane satisfac o condiie declarat. Unei constrngeri i se poate da un nume unic. Dac nu se specific un nume explicit atunci sistemul automat i atribuie un nume de forma SYS_Cn, unde n reprezint numrul constrngerii. Constrngerile pot fi terse, pot fi adugate, pot fi activate sau dezactivate, dar nu pot fi modificate. Prin comanda CREATE TABLE pot fi specificate anumite restricii (constrngeri) prin care se exprim o condiie care trebuie respectat de toate tuplurile uneia sau mai multor relaii. Acestea pot fi definite cu ajutorul comenzii ALTER TABLE Constrngerile declarative pot fi: - constrngeri de domeniu, care definesc valorile luate de un atribut: DEFAULT NOT NULL UNIQUE CHECK 73

constrngeri de integritate a entitii care precizeaz cheia primar PRIMARY KEY - constrngeri de integritate referenial care asigur corespondena ntre cheile primare i cheile externe corespunztoare FOREIGN KEY Fiecrei restricii i se poate da un nume, lucru util atunci cnd, la un moment dat (salvri, restaurri, ncrcarea BD) se dorete dezactivarea uneia sau mai multora dintre acestea. Astfel se prefigureaz numele fiecrei restricii cu tipul su: pk_(PRIMARY KEY) pentru cheile primare un_(UNIQUE) pentru cheile alternative nn_(NOT NULL) pentru atributele obligatorii ck_(CHECK) pentru reguli de validare la nivel de atribut fk_(FOREIGN KEY) pentru cheile strine. Exemplu: S se realizeze constrngerea de cheie primar, de cheie extern i constrngerea de domeniu pentru relaia DESCRIERE_IMOBIL. CREATE TABLE DESCRIERE_IMOBIL (id_co SMALLINT (7) NOT NULL, CONSTRAINT FOREIGN KEY fk_co(id_co) REFERENCES CERERI_OFERTE(id_co), CONSTRAINT pk_co PRIMARY KEY (id_co), tip_imobil VARCHAR(10), etaj VARCHAR(10), nr_camere SMALLINT (6), suprafata DECIMAL (12,4), garaj TINYINT (4), centrala_termica TINYINT (4), termopane TINYINT (4)); Observaia 1: Liniile ce nu respect constrngerea sunt depuse automat ntr-un tabel special. Observaia 2: Constrngerile previn tergerea unui tabel dac exist dependene. (vezi cursul tergerea datelor) Observaia 3: Constrngerile pot fi activate sau dezactivate n funcie de necesiti. Observaia 4: Constrngerile pot fi create o dat cu tabelul sau dup ce acesta a fost creat. Modificarea unei restricii de integritate Comanda de modificare a unei restricii este ALTER TABLE nume_tabela TIP_CONSTRNGERE);

MODIFY

(nume_atribut

Exemplu: S se modifice una din constrngerile din exemplul de mai sus. ALTER TABLE DESCRIERE_IMOBIL MODIFY

74

tip_imobil VARCHAR (10) NOT NULL ; Activarea i/sau dezactivarea unei constrngeri

Activarea sau dezactivarea unei constrngeri se realizeaz cu ajutorul opiunilor ENABLE sau DISABLE. Exemplu: S se dezactiveze, apoi s se activeze constrngerea de cheie primar din relaia DESCRIERE_OFERTA. ALTER TABLE DESCRIERE_IMOBIL ADD (CONSTRAINT id_co PRIMARY KEY (id_co) DISABLE); ALTER TABLE DESCRIERE_IMOBIL ENABLE (CONSTRAINT id_co); Suprimarea unei constrngeri cu ajutorul opiunii DROP Comanda pentru suprimarea unei restricii este ALTER TABLE nume_tabela DROP PRIMARY KEY; Exemplu: S se suprime restricia de cheie primar pentru atributul nr_factura din tabela FACTURI. ALTER TABLE FACTURI DROP PRIMARY KEY; Adugarea unei constrngeri cu ajutorul opiunii ADD Comanda pentru adugarea unei restricii este ALTER TABLE nume_tabela ADD CONSTRAINT ...; Exemplu: S se adauge restricia de cheie primar nr_factura pentru relaia FACTURI. ALTER TABLE FACTURI ADD CONSTRAINT pk_nr_factura PRIMARY KEY (nr_factura); Observaia 1: Astfel, comanda ALTER TABLE realizeaz modificarea structurii tabelului (la nivel de coloan sau la nivel de tabel), dar nu modificarea coninutului acestuia. Observaia 2: Constrngerile pot fi adugate (ADD CONSTRAINT), terse (DROP CONSTRAINT), activate (ENABLE) sau dezactivate (DISABLE), dar nu pot fi modificate. Observaia 3: Dac exist o cheie extern care refer o cheie primar i dac se ncearc tergerea cheii primare, aceast tergere nu se poate realiza (tabelele sunt legate prin declaraia de cheie extern). tergerea este totui permis dac n comanda ALTER apare opiunea CASCADE, care determin i tergerea cheilor externe ce refer cheia primar urmrind sintaxa ALTER TABLE Nume_tabela DROP PRIMARY KEY CASACDE;

75

7.2 Comenzi pentru acordarea drepturilor de acces la baza de date La nivel logic, limbajele relaionale ofer comenzi pentru acordarea drepturilor de acces la baza de date. Accesul unor persoane la BD se poate realiza doar n condiiile recunoaterii acestora de ctre sistem drept utilizatori autorizai. Creatorul unei relaii primete n mod automat toate privilegiile de operare asupra acestei relaii: - cutri de date n relaie - actualizri ale datelor n relaie - actualizri ale schemei relaiei - ataarea unor restricii de integritate - suprimarea relaiei. Poate acorda, la rndul su, privilegii asupra relaiei i altor utilizatori n funcie de sistem: - sistem centralizat (INGRES) n cadrul cruia singurul care poate acorda drepturi de acces la BD este administratorul bazei de date, funcia de administrator neputnd fi delegat altor persoane; - sistem descentralizat (DB2, SABRINA, ORACLE) n cadrul cruia administratorul poate da drepturi de acces la BD, dar, n acelai timp, putnd delega i alte persoane s fie administratori. Comanda n SQL de acordare a drepturilor utilizatorilor este GRANT SELECT, UPDATE ,... ON nume_tabela TO nume_utilizator; Exemplu: S se confere utilizatorului cu numele Zita i cu parola BDZ dreptul de conectare la BD, precum i unele drepturi de acces la una dintre tabelele bazei de date. GRANT SELECT, UPDATE ON DESCRIERE_IMOBIL TO Zita IDENTIFIED BY 'BDZ'; Comenzi pentru retragerea drepturilor de acces la baza de date Comanda SQL pentru retragerea drepturilor de acces la BD este REVOKE UPDATE ON nume_tabela FROM nume_utilizator; Exemplu: S se retrag drepturile utilizatorului Zita de actualizare a datelor. REVOKE UPDATE ON DESCRIERE_IMOBIL FROM Zita; 7.3. Exerciii de fixare a noiunilor 1. Limbajul SQL reprezint: a) un limbaj procedural de descriere i manipulare a datelor ntr-o baz de date; b) un limbaj neprocedural de descriere i manipulare a datelor ntr-o baza de date; c) un limbaj neprocedural de descriere i manipulare a datelor ntr-o baza de date relaional, sau obiect relational. 2. Ce este SQL? 3. Care sunt limbajele SQL?

76

4. Explicai care este rezultatul returnat de fiecare dintre urmtoarele funcii: MAX, MIN, COUNT, SUM, AVG. 5. Precizai care sunt rezultatele generate de comanda ALTER TABLE...ADD. 6. Creai tabelul salariat avnd urmtoarea structur: Nume cod_angajat nume prenume functia sef data_angajarii varsta email salariu Caracteristici NOT NULL Tipul INTEGER(4) VARCHAR(25) VARCHAR(25) VARCHAR(20) INTEGER(4) DATE NUMBER CHAR(10) DECIMAL(9,2)

Valoare implicit 0

Fig. 3. Structura tabelului SALARIAT (prima form) 7. Pentru baza de date COLECTIE_MUZICA, definit anterior, s se execute toate comenzile pentru: - crearea bazei de date; - crearea tabelelor indicnd cheile; - modificarea numelui unei tabele; - adugarea unui atribut; - modificarea unui atribut; - adugarea/ suprimarea unor restricii de integritate; - modificarea unei constrngeri; - acordarea/ retragerea drepturilor de acces la baza de date. 8. Exersai aceleai comenzi pentru baza de date FURNIZORI_COMPONENTE. 9. tergei i apoi creai din nou tabelul salariat cu urmtoarea structur: NUME TIP CONSTRNGERE cod_ang INTEGER(4) Cheie primar nume VARCHAR(25) NOT NULL prenume VARCHAR(25) data_nasterii DATE data_nasterii<data_angajarii functia VARCHAR(9) NOT NULL Refer ca i cheie extern sef INTEGER(4) cod_ang din acelai tabel data_angajarii DATE email VARCHAR(20) unic salariu DECIMAL(12,3) >0 cod_dept INTEGER(4) NOT NULL Combinaia NUME + PRENUME s fie unic Fig. 4. Structura tabelului SALARIAT (a doua form) 77

10. 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.

78

CAPITOLUL VI. LIMBAJE RELAIONALE DE MANIPULARE A DATELOR (LMD) - INTEROGAREA DATELOR


Se prezint, n detaliu, sintaxa instruciunii SELECT de extragere a datelor din unul sau mai multe tabele ale unei baze de date, cu utilizarea diferitelor clauze; expunerea se ncheie cu preyentarea celor mai cunoscute tipuri de funcii. Limbajele de manipulare a datelor trebuie s ofere o serie de faciliti pentru prelucrarea datelor din relaiile bazei de date i anume: - interogri - inserri - modificri - tergere. 8.1. Interogarea datelor Interogarea bazei de date reprezint principala funcie a unui limbaj relaional de manipulare a datelor. Comanda fundamental a standardului SQL este SELECT, aceasta permind interogarea unei baze de date. Interogarea reprezint o ntrebare care i extrage rspunsul din baza de date. Componentele interogrii se numesc clause. Sintaxa general a comenzii SELECT este urmtoarea: SELECT [ALL/DISTINCT/UNIQUE] list de selecie FROM list de relaii (tabele) WHERE condiie de cutare asupra liniilor GROUP BY list de atribute care permit partiionarea HAVING condiie asupra partiiilor ORDER BY list de atribute; Clauzele SELECT i FROM sunt obligatorii. SELECT specific datele care se selecteaz, iar clauza FROM specific relaiile din care se selecteaz. Restul clauzelor sunt opionale. Exemplul 1: S se selecteze toate persoanele mpreun cu toate datele personale ale acestora existente n baza de date. SELECT * FROM DATE_PERSOANA; Exemplul 2: S se selecteze toate ofertele/cererile nregistrate n data de 2006-07-03. SELECT * FROM CERERI_OFERTE WHERE data_inreg=2006-07-03;

79

Interogarea datelor folosind operatorii IS i IS NOT


Exemplu: S se selecteze numele tuturor persoanelor care nu au completat adresa de email, apoi s se afieze numele tuturor persoanelor care au numrul de telefon completat. SELECT numele FROM DATE_PERSOANA WHERE email IS NULL; SELECT numele FROM DATE_PERSOANA WHERE nr_telefon IS NOT NULL; Interogarea datelor folosind operatorii logici AND, OR, NOT Sintaxa pentru interogarea care utilizeaz un operator logic este condiie 1 AND condiie 2; condiie1 OR condiie 2; NOT condiie; Exemplu: S se determine numrul facturii i codul numeric personal pentru ofertele soluionate dup date de 2006-05-01 i cu un pre final mai mare sau egal ca 100.000. SELECT cnp,nr_factura FROM FACTURI WHERE data_factura=2006-08-01 AND total>=100000; Interogarea datelor folosind operatorul IN Sintaxa este SELECT valoare_cmp IN (valoare1, valoare2,...); Aceast sintax a operatorului IN este similar cu urmtoarea list de disjuncii: Valoare_cmp=valoare1 OR valoare_cmp=valoare2 OR ...; Exemplu: S se selecteze numrul facturii, id-ul cererii/ofertei, data facturii, valoarea total a facturii, valoarea TVA i codul numeric personal pentru cererile/ofertele soluionate cu valoarea total de 70.000,80.000, 90.000. SELECT * FROM FACTURI WHERE total IN (70000.00,80000.00,90000.00); Interogarea datelor folosind sintaxa DISTINCT

Pentru a selecta seturi de valori distincte, adic eliminarea valorilor duplicat, n SQL se folosete sintaxa DISTINCT, micornd astfel setul de date. Sintaxa acestei comenzi este:

80

SELECT DISTINCT nume_cmp1, nume_cmp2,... FROM nume_tabela WHERE comenzi; sau SELECT DISTINCT * FROM nume_tabela; Sintaxa DISTINCT se refer la o nregistrare care poate cuprinde unul sau mai multe cmpuri. Exemplu: S se afieze toate datele distincte n care s-au nregistrat cereri sau oferte. SELECT DISTINCT data_inreg FROM CERERI_OFERTE; Interogarea datelor folosind operatorul LIKE Se cunosc mai multe modaliti de utilizare a expresiei LIKE, i anume: pentru o expresie care ncepe cu o anumit liter, de exemplu litera A: LIKE A%; pentru o expresie care se termin cu o anumit liter, de exemplu litera A: LIKE %A; pentru o expresie care include o anumit liter, de exemplu litera A: LIKE %A%;

Exemplu: S se selecteze numele, adresa i emailul tuturor persoanelor feminine care au adres de email pe yahoo sau personal. SELECT numele, adresa, email FROM DATE_PERSOANA WHERE adresa LIKE %BAIA MARE% AND (email LIKE %yahoo% OR email LIKE %personal%); Interogarea datelor folosind operatorul BETWEEN

Operatorul se utilizeaz n combinaie cu dou valori ntre care se afl valoarea la care se refer operatorul. Sintaxa este val BETWEEN minim AND maxim; sau val>=min AND val<=max; Cele trei expresii val, min, max pot fi de tip numeric (numeric, decimal, int, smalint etc.) sau de tip dat calendaristic. Exemplu: S se selecteze codurile tuturor cererilor/ofertelor nregistrate n perioada 1 ianuarie 2006 i 1 mai 20006. SELECT id_co FROM CERERI_OFERTE WHERE data_inreg BETWEEN 2006-01-01 AND 2006-0501;

81

Interogarea datelor folosind funciile calendaristice YEAR, DAY, MONTH

Funciile YEAR, DAY, MONTH rein dintr-un cmp de tip dat calendaristic anul, ziua, respectiv luna. Exemplu: S se vizualizeze codurile tuturor cererilor/ofertelor nregistrate n luna mai. SELECT id_co FROM CERERI_OFERTE WHERE MONTH(data_inreg)=05; Interogarea datelor folosind ordonarea

Datele se pot ordona dup orice cmp. Ordonarea se poate face att cresctor ct i descresctor. Sintaxa pentru interogarea - ordonat cresctor este ORDER BY nume_cmp (ASC); - ordonat descresctor este ORDER BY nume_cmp (DESC); Dac ORDER BY nu este urmat de ASC sau DESC, ordonarea se face implicit cresctor. Exemplu: S se vizualizeze lista persoanelor n ordine alfabetic. SELECT numele FROM DATE_PERSOANA ORDER BY numele; Interogarea datelor din mai multe tabele

Interogarea datelor din mai multe relaii este strns legat de noiunea de cheie primar, cheie secundar, restricii de integritate, asocieri ntre relaii. Exemplu: S se afieze ofertele i denumirile oraelor corespunztoare ofertelor. SELECT id_co, nume_loc FROM CERERI_OFERTE, LOCALITATI WHERE CERERI_OFERTE.tipul=oferta AND CERERI_OFERTE.cod_loc=LOCALITATI.cod_loc; Observaii: Clauza FROM specific dou relaii. Clauza SELECT cuprinde valori din relaia CERERI_OFERTE i din relaia LOCALITATI, prin urmare trebuie definite cmpurile n funcie de tabela din care face parte. Se utilizeaz sintaxa nume_tabel.nume_cmp Clauza WHERE include condiii care exprim o egalitate ntre valorile identificatorului nume_cmp a relaiei nume_tabel i a celei ale referinei la acest identificator n tabela referit.

82

8.2. LMD - Interogarea datelor din mai multe relaii 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. n acest fel liniile dintr-un tabel pot fi puse n legtura cu cele din alt tabel conform valorilor comune ale unor coloane. Condiiile de corelare utilizeaz de obicei coloanele cheie primar i cheie extern. Tipuri de asocieri pentru relaii Rolul unei relaii fiind acela de a modela entiti, ntre relaii exist aceleai tipuri de asocieri ca i ntre entiti, prezentate la nceputul cursului, i anume asocieri unu la unu, unu la mai muli, muli la mai muli. Asocieri de la unu la unu

Dou relaii stocheaz informaii n asocierea unu la unu dac unei nregistrri din relaia A i corespunde (sau nu) o singur nregistrare din B. Acest tip de asociere este utilizat mai rar. Exist, totui, cazuri n care este necesar i util stabilirea unei astfel de relaii. Exemplu:
CERERI_OFERTE id_co # tip cnp data_inreg tip_solutionare cod_loc id_strada nr_imobil pret_min pret_max 1:1 DESCRIERE_IMOB IL id_co# tip_imobil etaj nr_camere suprafata garaj centrala_termica termopane

Fig. 8.1. Asociere de tip 1:1 Asocieri de la unu la mai muli

O relaie A se afl ntr-o asociere de unu la mai muli cu o relaie B dac fiecrei nregistrri din A i corespund una sau mai multe nregistrri din relaia B. Unei nregistrri din relaia B nu i corespunde dect maxim o nregistrare din relaia A. Sunt utilizate urmtoarele denumiri: B este relaia copil sau relaia care refer la A sau relaia cheie strin; A este relaia printe (master) sau relaia referit sau relaia cheie primar.

83

Exemplu: A
JUDETE simbol_judet# nume_judet 1:n

B
LOCALITATI cod_loc# simbol_judet nume_judet

Fig. 8.2. Asociere de tip 1:n Observaie: Relaia A are cheia primar simbol_judet, iar relaia B are atributul simbol_judet cheie extern. Asocieri de la mai muli la mai muli

O relaie A se afl n asociere de tipul muli la mai muli cu o relaie B dac unei nregistrri din relaia A i pot corespunde mai multe nregistrri din relaia B i unei nregistrri din relaia B i pot corespunde mai multe nregistrri din relaia A. O asociere n la n nu se definete direct, asocierea construindu-se cu ajutorul unei relaii de jonciune. n aceast relaie se pstreaz legtura ntre cele dou relaii, precum i informaiile necesare. Exemplu: A
JUDETE simbol_judet# nume_judet 1:n

B
LOCALITATI cod_loc# simbol_judet# nume_judet 1:n

C
STRAZI id_strada# cod_loc# nume_str

Fig. 8.3. Asociere de tip n:n Observaie: n exemplul de mai sus, relaia LOCALITATI realizeaz jonciunea ntre relaiile JUDETE i STRAZI, stocnd informaiile privind numele judeului nume_judet, simbolul judeului simbol_judet i identificatorul localitii cod_loc. Astfel, asocierea n la n este vizualizat sub forma a dou relaii de unu la n. Interogarea datelor din mai multe relaii folosind aliasuri

Un alias este o redenumire fie a unui cmp, fie a unei relaii. Aliasurile sunt utilizate la eliminarea rescrierii complete a denumirii unei relaii sau a unui cmp, redenumindu -le ntr-un mod simplificat. Sintaxa utilizat este: nume_relaie/camp AS nume_nou; sau nume_relaie/camp nume_nou; Exist posibilitatea de a utiliza aliasuri pentru tabelele din clauza FROM i utilizarea lor n cadrul comenzii SELECT respective (alias.coloana). Aceast identificare (prin

84

'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. Exemplul 1: S se determine toate ofertele de apartamente din oraul Baia Mare, de pe strada Victoriei. SELECT CO.id_co, L.nume_loc, S.nume_str, CO.nr_imobil, DI.etaj, DI.nr_camere, DI.garaj, DI.suprafata, DI.centrala_termica, DI.termopane, DI.tip_imobil, CO.pret_min, CO.pret_max FROM CERERI_OFERTE AS CO, LOCALITATI AS L, STRAZI AS S, DESCRIERE_IMOBIL AS DI WHERE CO.tipul=oferta AND CO.id_co=DI.id_co AND CO.cod_loc=L.cod_loc AND CO.id_strada=S.id_strada AND CO.cod_loc=S.cod_loc AND L.cod_loc='MM430' AND S.id_strada='152' AND DI.tip_imobil='apartament'; Lista afiat n urma acestei interogri poate fi de genul:

Fig. 8.4. Lista apartamentelor din Baia Mare, de pe strada Victoriei Exemplul 2: S se afieze toate cererile nesoluionate de terenuri din localitatea Bora, data nregistrrii, precum i datele personale ale clienilor. SELECT CO.id_co, CO.tipul, CO.cnp, CO.data_inreg, CO.tip_solutionare, CO.cod_loc, DP.numele, DP.adresa, DP.nr_telefon, DP.email, DI.tip_imobil FROM CERERI_OFERTE CO, DATE_PERSOANA DP, DESCRIERE_IMOBIL DI WHERE CO.tipul='cerere' AND CO.cnp=DP.cnp AND cod_loc='MM435' AND CO.tip_solutionare='0' AND CO.id_co = DI.id_co AND DI.tip_imobil LIKE 'teren'; Observaie: n cazul n care un atribut apare doar ntr-o relaie dintre cele menionate n list, nu este obligatorie precizarea relaiei (adic a aliasului) din care face parte atributul respectiv, dup cum este cod_loc='MM435'. Interogarea datelor din mai multe relaii folosind tipuri de asocieri Tipurile de asocieri utilizate n interogarea mai multor relaii sunt: INNER JOIN (jonciunea intern) LEFT OUTER JOIN (semijonciunea la stnga) RIGHT OUTER JOIN (semijonciunea la dreapta)

a) Sintaxa SELECT ...FROM tabel_A INNER JOIN tabel_B (condiii de join) selecteaz toate informaiile din relaiile A i B care corespund condiiilor de asociere.

85

Exemplul 1: Selectai codul ofertei/cererilor i codul localitilor fiecrei oferte folosind operaia de join, apoi utiliznd clauza WHERE. SELECT CO.id_co, CO.cod_loc FROM CERERI_OFERTE CO INNER JOIN LOCALITATI L ON (CO.cod_loc=L.cod_loc); SELECT CO.id_co, CO.cod_loc FROM CERERI_OFERTE CO, LOCALITATI L WHERE CO. cod_loc=L.cod_loc; Observaie: Rezultatul este acelai. Valorile NULL vor fi ignorate. Exemplul 2: Selectai numele persoanelor care ofer imobile, codul ofertelor, precum i denumirile localitilor, ordonnd alfabetic localitile. SELECT DP.numele, CO.id_co, L.nume_loc FROM DATE_PERSOANA DP INNER JOIN CERERI_OFERTE CO ON (DP.cnp=CO.cnp) INNER JOIN LOCALITATI L ON (CO.cod_loc=L.cod_loc) WHERE CO.tipul LIKE oferta ORDER BY L.nume_loc; SELECT DP.numele, CO.id_co, L.nume_loc FROM DATE_PERSOANA DP, CERERi_OFERTE LOCALITATI L WHERE CO.tipul LIKE oferta AND DP.cnp=CO.cnp AND CO.cod_loc=L.cod_loc ORDER BY L.nume_loc;

CO,

Observaie: Sintaxei SELECT-FROM-INNER JOIN i se pot aduga i alte condiii, neincluse n condiiile de join, dac acestea se refer la alte cmpuri dect cele care particip la join. Exemplul 3: Selectai numele persoanelor care ofer imobile n judeul Maramure, codul ofertelor, tipul acestora, precum i denumirile localitilor i a strzilor, ordonnd alfabetic localitile i strzile. 1) Folosind INNER JOIN SELECT DP.numele, CO.id_co, S.nume_str, DI.tip_imobil, L.nume_loc FROM DATE_PERSOANA DP INNER JOIN CERERI_OFERTE CO ON (DP.cnp=CO.cnp) INNER JOIN STRAZI S ON (CO.id_strada=S.id_strada ) INNER JOIN LOCALITATI L ON (CO.cod_loc=L.cod_loc AND L.cod_loc LIKE 'MM%') INNER JOIN DESCRIERE_IMOBIL DI ON (CO.id_co=DI.id_co AND CO.tipul='oferta') ORDER BY L.nume_loc, S.nume_str; Observaie: Toate condiiile ce se refer la cmpurile din join se vor prezenta n cadrul condiiilor de join.

86

2) Folosind WHERE SELECT DP.numele, CO.id_co, S.nume_str, DI.tip_imobil, L.nume_loc FROM DATE_PERSOANA DP, CERERI_OFERTE CO, STRAZI S, LOCALITATI L, DESCRIERE_IMOBIL DI WHERE CO.tipul='oferta' AND DP.cnp=CO.cnp AND CO.id_strada=S.id_strada AND CO.cod_loc=L.cod_loc AND CO.id_co=DI.id_co AND L.cod_loc LIKE 'MM%' ORDER BY L.nume_loc, S.nume_str; 3) Folosind INNER JOIN i WHERE SELECT DP.numele, CO.id_co, S.nume_str, DI.tip_imobil, L.nume_loc FROM DATE_PERSOANA DP INNER JOIN CERERI_OFERTE CO ON (DP.cnp=CO.cnp) INNER JOIN STRAZI S ON (CO.id_strada=S.id_strada ) INNER JOIN LOCALITATI L ON (CO.cod_loc=L.cod_loc ) INNER JOIN DESCRIERE_IMOBIL DI ON (CO.id_co=DI.id_oferta) WHERE L.cod_loc LIKE 'MM%' AND CO.tipul='oferta' ORDER BY L.nume_loc, S.nume_str; b) Sintaxa SELECT ...FROM tabel_A LEFT OUTER JOIN tabel_B ON (condiii de join) selecteaz toate informaiile din A, pe care le completeaz cu informaii din B, n msura n care satisfac condiiile de join; acolo unde nu vor exista informaii din B, acestea vor fi completate cu NULL. Exemplul1: Selectai toate ofertele. Dac exist informaii despre aceste oferte, afiai i aceste informaii. SELECT * FROM CERERI_OFERTE CO LEFT OUTER JOIN DESCRIERE_IMOBIL DI ON (CO.id_co=DI.id_co ) WHERE CO.tipul='oferta'; Observaie: Ordinea n care se scrie denumirea relaiei n sintaxa LEFT OUTER JOIN este foarte important. Astfel, relaia din stnga este relaia primar, adic relaia pentru care se dorete returnarea tuturor informaiilor; relaia din dreapta este relaia secundar, adic informaiile din ea sunt necesare doar n msura n care se potrivesc condiiilor de asociere. Astfel se explic i denumirea de asociere de la stnga spre exterior. Exemplul2: Selectai toate ofertele, preciznd i numele judeelor, localitilor precum i a strzilor. Dac exist informaii despre aceste oferte, afiai i aceste informaii. SELECT L.nume_loc, CO.*, S.nume_str, DI.tip_imobil, DI.nr_camere, DI.suprafata, DI.garaj, 87

DI.centrala_termica, DI.termopane FROM CERERI_OFERTE CO LEFT OUTER JOIN DESCRIERE_IMOBIL DI ON(DI.id_co=CO.id_co) INNER JOIN STRAZI S ON S.id_strada = CO.id_strada AND CO.cod_loc=S.cod_loc INNER JOIN LOCALITATI L ON CO.cod_loc = L.cod_loc WHERE CO.tipul LIKE 'oferta'; c) Sintaxa SELECT ...FROM tabel_A RIGHT OUTER JOIN tabel_B ON (condiii de join) selecteaz toate informaiile din B, pe care le completeaz cu informaii din A, n msura n care satisfac condiiile de join; acolo unde nu vor exista informaii din A, acestea vor fi completate cu NULL. Exemplu: Selectai toate localitile i, n localitile n care exist cereri nesoluionate, afiai numele clienilor i tipul de cerere de imobil respectiv. SELECT L.nume_loc, DP.numele, CO.tip_solutionare, DI.tip_imobil FROM LOCALITATI L RIGHT OUTER JOIN CERERI_OFERTE CO ON (L.cod_loc=CO.cod_loc) INNER JOIN DATE_PERSOANA DP ON (DP.cnp=CO.cnp) INNER JOIN DESCRIERE_IMOBIL DI ON (CO.id_co=DI.id_co AND CO.tipul = cerere) WHERE CO.tip_solutionare=0; Observaie: Sintaxa RIGHT OUTER JOIN este utilizat mai rar; de obicei se utilizeaz sintaxa LEFT OUTER JOIN. Interogarea datelor din mai multe relaii folosind instruciunea UNION

Sintaxa interogrii datelor din mai multe relaii folosind instruciunea UNION este SELECT Cmp 1, Cmp 2, ..., Cmp n FROM Tabel 1 UNION (ALL) SELECT Cmp 1A, Cmp 2A,..., Cmp nA FROM Tabel 2 i returneaz nregistrri distincte, dac este folosit instruciunea UNION i toate nregistrrile, dac se folosete UNION ALL. Astfel operatorul UNION elimin duplicatele, iar UNION ALL vizualizeaz toate nregistrrile, inclusiv duplicatele. Pentru a utiliza aceast interogare, trebuie s se in seama de dou cerine: domeniile Cmp 1A, Cmp 2A,..., Cmp nA i Cmap 1, Cmp 2, ..., Cmp n trebuie s fie respectiv aceleai i, numrul de cmpuri din fiecare interogare trebuie s coincid. Operatorul UNION se folosete atunci cnd ntre relaii nu exist o asociere direct. Exemplul 1: Pentru exemplificare se vor considera relaiile: PROFESORI (prof_id, nume, prenume), respectiv STUDENTI (stud_id, nume, prenume). Selectai lista numelor tuturor profesorilor i a studenilor. SELECT nume, prenume FROM PROFESORI 88

UNION ALL SELECT nume, prenume FROM STUDENTI; Rezultatul generat de interogare va fi nume POP ION prenume VASILE ANA

Fig. 8.5. Interogarea mai multor relaii folosind operatorul UNION ALL Observai: Problema mai poate fi soluionat utiliznd alte interogri, dar acestea rmn ca exerciii individuale. Exemplul 2: S se determine care sunt ofertele i cererile soluionate prin facturi, afind ntro list id_ul cererii/ofertei i cnp-ul cleintului, att din tabela CERERI_OFERTE ct i din tabela FACTURI. SELECT cnp, id_co,data_factura FROM FACTURI UNION ALL SELECT cnp, id_co,data_inreg FROM CERERI_OFERTE; Rezultatul generat de interogare va fi o lista greu de urmrit, dup cum este i cea din figura 8.5, deoarece nu se specific clar care inregistrare corespunde facturilor, i care tabelei CERERI_OFERTE (acest neajuns va fi nlturat utiliznd concatenarea):

Fig. 8.6. Interogarea mai multor relaii folosind operatorul UNION ALL (cazul neclar)

89

Interogarea datelor mai multor relaii folosind operatorul de concatenare a dou iruri de caractere

Rolul operatorului de concatenare a dou iruri de caractere este de a uni dou iruri de caractere ntr-unul singur. Este utilizat n toate SGBD-urile, cu mici modificri ale simbolului: n Tranzact SQL se folosete simbolul +, n Oracle simbolul || etc. Se pot concatena o constant cu un cmp, sau dou cmpuri. Cmpurile trebuie s fie de tip text. Sintaxa pentru concatenarea a dou cmpuri este CONCAT(Cmp1, Cmp2) sau insernd virgula, spaiu sau oricare marcaj de delimitare CONCAT(Cmp1,,, Cmp2) sau CONCAT (Cmp1, , Cmp2). Sintaxa CONCAT(Ceva, Cmp) concateneaz cmpul i valoarea returnnd o singur valoare. Sintaxa CONCAT(Ceva1, Ceva1) concateneaz cele dou constante ntr-una singur Ceva1Ceva2. Exemplu: S se determine care sunt ofertele i cererile soluionate prin facturi, afind ntr-o list id_ul cererii/ofertei i cnp-ul clientului, att din tabela CERERI_OFERTE ct i din tabela FACTURI. De aceast dat, s se precizeze cnd este vorba de facturi, respectiv cnd este vorba de cerere sau ofert. SELECT CONCAT('F:', ' ', 'cnp;',cnp,' ', 'id_co:',id_co,' ','data:', data_factura) AS facturi_si_oferte_cereri FROM FACTURI UNION SELECT CONCAT('C_O:',' ', 'cnp;',cnp,' ', 'id_co:',id_co,' ','data:', data_inreg) FROM CERERI_OFERTE; Rezultatul generat de interogare va fi:

90

Fig. 8.7. Interogarea mai multor relaii folosind concatenarea (cazul mai clar) Observaie: Concatenarea prezint dezavantajul afirii cmpurilor null. a) Interogarea datelor folosind funciile totalizatoare MAX MIN COUNT SUM AVG Interogarea datelor folosind funcia MAX Sintaxa: SELECT MAX(Nume_cmp) FROM Tabela returneaz un numr egal cu valoarea maxim a cmpului Nume_cmp din relaia Tabela, valorile null fiind ignorate. Exemplu: Selectai cea mai recent nregistrare din tabela CERERI_OFERTE, fr a da un nume rezultatului, apoi cu nume pentru cmpul rezultat. SELECT MAX(data_inreg) FROM CERERI_OFERTE; SELECT MAX(data_inreg) AS data_ultimei_nregistrari FROM CERERI_OFERTE; b) Interogarea datelor folosind funcia MIN 91

Funcia MIN este o funcie similar cu funcia MAX, cu ajutorul creia se poate determina valoarea cea mai mic dintr-un cmp. Att funcia MIN ct i funcia MAX se poate aplica doar pentru tipurile de date numeric sau dat calendaristic. c) Interogarea datelor folosind funcia COUNT Sintaxa SELECT COUNT (*) FROM Nume_tabela returneaz un numr egal cu numrul de nregistrri ale tabelei Nume_tabela. Exemplu: Precizai numrul de oferte nregistrare. SELECT COUNT(*) AS numar_de_oferte FROM CERERI_OFERTE WHERE tipul LIKE oferta; Sintaxa SELECT COUNT (Nume_cmp) FROM Tabela returneaz un numr egal cu numrul de valori nenule ale cmpului Nume_cmp din tabela Nume_tabela. Sunt ignorate valorile null. Exemplu: Precizai numrul de cereri nesoluionate. SELECT COUNT(tip_solutionare) AS cereri_solutionate FROM CERERI_OFERTE WHERE tip_solutionare=1 AND tipul=cerere; Sintaxa SELECT COUNT(DISTINCT Nume_cmp) FROM Tabela returneaz un numr egal cu numrul de valori distincte nenule ale cmpului Nume_cmp din tabela Nume_tabela. Sunt ignorate valorile null. Exemplu: Precizai numrul de localiti din care provin ofertele. SELECT COUNT(DISTINCT cod_loc) FROM CERERI_OFERTE WHERE tipul=oferta; d) Interogarea datelor folosind funcia SUM Sintaxa SELECT SUM (Nume_cmp) FROM Tabela returneaz un numr egal cu suma tuturor valorilor cmpului Nume_cmp din relaia Nume_Tabela. Sunt ignorate valorile null. Exemplu: Precizai suma tuturor ncasrilor existente pe facturile emise. SELECT SUM(DISTINCT total) FROM FACTURI; Sintaxa SUM (DISTINCT Nume_cmp) FROM Tabela 92

returneaz un numr egal cu suma valorilor distincte ale cmpului Nume_cmp din relaia Nume_Tabela. Funcia SUM se aplic acelor cmpuri care au domeniul de valori de tipul FLOAT, DECIMAL, NUMERIC, INT etc. i nu are sene pentru cmpuri de tip text. e) Interogarea datelor folosind funcia AVG Sintaxa AVG (nume_cmp) FROM Nume_tabela returneaz un numr egal cu media aritmetic a tuturor valorilor cmpului Nume_cmp din relaia Nume_tabela. Valorile null sunt ignorate. Funcia AVG se utilizeaz doar pentru date de tip numeric: INT, FLOAT, NUMERIC. Exemplu: Selectai media valorilor vnzrilor din agenia imobiliar. SELECT AVG (total) FROM FACTURI; Interogarea datelor folosind instruciunea GROUP BY Prin instruciunea GROUP BY se grupeaz datele dup fiecare produs n parte. Exemplu: Selectai fiecare tip de imobil n parte grupndu-le alfabetic i precizai numrul de imobile vndute din fiecare tip. SELECT DI.tip_imobil, COUNT(F.id_co) AS suma FROM DESCRIERE_IMOBIL DI, FACTURI F WHERE F.id_co=DI.id_co GROUP BY DI.tip_imobil; Interogarea returneaz urmtoarele informaii:

Fig. 8.8 Rezultatul interogrii folosind instruciunea GROUP BY i funcia SUM Menionarea clauzelor SELECT, FROM, WHERE, GROUP BY, ORDER BY n aceast ordine este obligatorie. Greeala frecvent care duce la apariia unor mesaje de eroare este aceea a introducerii unor cmpuri dup care se grupeaz n clauza SELECT i neintroducerea lor n clauza GROUP BY. Interogarea datelor folosind instruciunea HAVING

Instruciunea HAVING se utilizeaz numai n combinaie cu instruciunea GROUP BY. Dac gruparea de date trebuie s satisfac vreo condiie, aceast condiie se exprim cu ajutorul sintaxei HAVING. Clauza HAVING este utilizat cnd se dorete filtrarea datelor grupate conform unor criterii. Aceste criterii presupun compararea unor valori obinute prin apelarea unor funcii totalizatoare. Aceste tipuri de comparri presupun gruparea datelor. Din aceast cauz, HAVING cere obligatoriu clauza GROUP BY. Exemplu: Selectai adresele ofertelor grupate dup judee, localiti i strzi care au preul minim cuprins ntre 50000 i 300000. 93

SELECT CO.id_co,J.nume_judet, L.nume_loc, S.nume_str, CO.pret_min, CO.pret_max FROM JUDETE J, CERERI_OFERTE CO, LOCALITATI L, STRAZI S WHERE CO.cod_loc=L.cod_loc AND CO.id_strada=S.id_strada AND L.simbol_judet=J.simbol_judet GROUP BY CO.id_co,.... HAVING CO.pret_min BETWEEN 50000 AND 300000; Ordinea obligatorie a unei fraze SELECT complete este: SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY. 8.3. Funcii utilizate n interogri Cele mai des ntlnite funcii n interogri sunt: funcii pentru iruri de caractere funcii pentru valori numerice funcii pentru date calendaristice funcii de conversie dintr-un tip n altul.

a) b) c) d)

a) Funcii pentru iruri de caractere CONCAT: concateneaz dou iruri de caractere SELECT CONCAT('My', 'S', 'QL'); -> 'MySQL' SELECT CONCAT('My', NULL, 'QL'); -> NULL SELECT CONCAT(14.3); -> '14.3' - REPLACE: nlocuirea unui ir de caractere cu un altul ntr-o expresie de acest tip; SELECT REPLACE('www.mysql.com', 'w', 'Ww'); -> WwWwWw.mysql.com - CHAR_LENGTH: returneaz numrul de caractere dintr-un ir; - FIELD(str,str1,str2,str3,): returneaz poziia irului de caractere str n lista irurilor de caractere str1,str2,str3; dac irul str nu este gsit, returneaz valoarea 0. SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo'); -> 2 SELECT FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo'); -> 0 - LEFT(str,n): returneaz subirul fromat dintr-un numr de n caractere; SELECT LEFT('paralelipiped', 5); -> 'paral' - LOWER(str): toate literele din str vor fi convertite n minuscule; SELECT LOWER('LITERE MARI'); -> 'litere mari' - UPPER(str): toate literele din str vor fi convertite n majuscule; SELECT UPPER('LITERE mari'); 94

-> 'LITERE MARI' LPAD(str,n,caracter): completeaz la stnga cu un caracter pn la atingerea unei lungimi specificate SELECT LPAD('buna',6,'?'); ->??buna SELECT LPAD('buna',1,'??'); ->b RPAD(str,n,caracter): completeaz la dreapta cu un caracter pn la atingerea unei lungimi specificate SELECT RPAD('buna',5,'?'); ->buna? LTRIM(str): elimin spaiile de la stnga valorii str; SELECT LTRIM(' barbar'); ->barbar RTRIM(str): elimin spaiile de la dreapta valorii str; SELECT RTRIM('barbar '); ->barbar TRIM: eliminarea simultan a spaiillor la stnga i la dreapta; SELECT TRIM(' bar '); ->bar SUBSTR(sir,n): extragerea unei poriuni dintr-un ir ncepnd cu a n-a liter; SELECT SUBSTR('Paralelipiped',5); ->lelipiped

b) Funcii pentru valori numerice CEIL(p): ntoarce cel mai mic ntreg mai mare sau egal cu argumentul p; SELECT CEIL(1.23); ->2 SELECT CEIL(-1.23); ->-1 FLOOR(p): ntoarce cel mai mare ntreg mai mic sau egal cu argumentul p; SELECT FLOOR(-1.23); ->-2 SELECT FLOOR(1.23); ->1 ROUND(p,n): rotunjete rezultatul unei expresii (p) la un numr de poziii fracionare dac n este pozitiv, sau, dac n este negativ, se face la ordinul zecilor, sutelor, miilor etc. SELECT ROUND(-1.23); ->-1 SELECT ROUND(-1.58); ->-2 SELECT ROUND(1.58); ->2 SELECT ROUND(1.298, 1); ->1.3 SELECT ROUND(1.298, 0); ->1 SELECT ROUND(23.298, -1); 95

->20 TRUNC(p,n): are efect similar funciei ROUND, numai c n loc de rotunjire se face trunchiere. SELECT TRUNCATE(1.223,1); ->1.2 SELECT TRUNCATE(1.999,1); ->1.9 SELECT TRUNCATE(1.999,0); ->1 SELECT TRUNCATE(-1.999,1); ->-1.9 SELECT TRUNCATE(122,-2); ->100

c) Funcii pentru date calendaristice CURRENT_DATE(): furnizeaz data curent sub forma YYYY-MM-DD; SELECT current_date(); -> 2006-08-15 - SYSDATE(): furnizeaz data curent i ora exact sub forma YYYY-MM-DD HHMM-SS; SELECT SYSDATE(); -> 2006-08-15 15:06:44 - CURRENT_TIMESTAMP(), NOW(), SYSTIMESTAMP: sunt sinonime cu SYSDATE; - DATE_ADD (data,INTERVAL nr.): adun un numr de ani, luni sau zile la data argument; SELECT DATE_ADD('2006-08-15', INTERVAL 1 MONTH); -> 2006-09-15 - LAST_DAY(data): furnizeaz ultima zi din luna n care se afl data argument; SELECT LAST_DAY('2008-02-15'); -> 2008-02-29 - DATEDIFF(data1,data2): calculeaz numrul de zile dintre cele dou date calendaristice; SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30'); ->1 SELECT DATEDIFF('1997-11-30 23:59:59','1997-12-31'); ->-31 - DAYNAME(data): afieaz denumirea zilei corespunztoare datei argument; SELECT DAYNAME(2006-08-19); -> 'Saturday' - DAYOFMONTH(data), DAYOFYEAR(data): (ziua din lun, ziua din an) furnizeaz numrul de ordine n cadrul lunii, respective a anului pentru o dat calendaristic. SELECT DAYOFYEAR('2006-08-19'); ->231 d) Funcii de conversie dintr-un tip n altul Funcia de conversie cel mai des utilizat este funcia CAST. CAST: realizeaz diferite conversii, de exemplu 96

SELECT CONCAT('Data: ', CAST(NOW() AS DATE)); -> Data: 2006-08-18 concateneaz irul de caractere data: cu data calendaristic actual, convertit la ir de caractere. Exemple Exemplul 1: Modificai toate numerele de telefon din judeul Maramure, astfel ca prefixul s nu mai fie 0262 ci 0362, din baza de date AGENTIE_IMOBILIARA. UPDATE DATE_PERSOANA SET nr_telefon=CONCAT('0362', SUBSTR(nr_telefon, 5)) WHERE SUBSTR(nr_telefon,1,4)='0262'; Pentru modificarea datelor s-a folosit comanda UPDATE nume_tabel SET instructiuni WHERE conditii, iar funcia SUBSTR(sir,nr) extrage ciferele din ntregul numr de telefon, ncepnd cu a cincea poziie, cifre ce vor fi concatenate cu prefixul 0362. De asemenea, prin funcia SUBSTR(nr_telefon,1,4) se realizeaz extragerea primelor patru numere din ntregul numr de telefon. Exemplul 2: Afiai numele i data naterii clienilor din baza de date AGENTIE_IMOBILIARA, cunoscnd codul numeric personal al acestora. SELECT CONCAT('Numele: ',numele) AS numele, CONCAT('Anul: ', '19',SUBSTR(cnp,2,2),' , ','Luna:', SUBSTR(cnp,4,2), ', ','Ziua: ', SUBSTR(cnp,6,2)) AS data_nasterii FROM DATE_PERSOANA; Observaie: n interogarea de mai sus se concateneaz irul Numele cu numele clientului, apoi se concateneaz irul Anul cu irul 19 (deoarece se consider c nu sunt clieni nscui dup anul 1999) i cu cele dou cifre ale codului numeric personal care desemneaz anul naterii unei persoane (SUBSTR(cnp,2,2)). n mod analog se efectueaz i celelalte concatenri.

Fig. 8.9. Utilizarea funciilor CONCAT i SUSTR

97

Exemplul 3: Afiai preurile ofertelor (preul minim i preul maxim) folosind alinierea la dreapta i la stnga. SELECT LPAD(pret_min,30,' ') AS 'pret minim', RPAD(pret_max,30,' ') AS 'pret maxim' FROM CERERI_OFERTE WHERE tipul LIKE oferta ORDER BY pret_min,pret_max;

Fig. 8.10. Utilizarea funciilor LPAD i RPAD Exemplul 4: S se afieze numrul de cereri de imobile primite n prima jumtate a oricrei luni fa de cele primite n cea de a doua jumtate. SELECT LTRIM(COUNT(id_co)) AS 'nr de cereri in prima jumatate a lunii' FROM CERERI_OFERTE WHERE DAYOFMONTH(data_inreg)<16 AND tipul =cerere;

(a) SELECT COUNT(id_co) AS 'nr de cereri in a doua jumatate a lunii' FROM CERERI_OFERTE WHERE DAYOFMONTH(data_inreg)>15 AND tipul =cerere;

(b) Fig. 8.11. Utilizarea funciei DAYOFMONTH (a), (b)

98

8.4. Exerciii de fixare a noiunilor 1. Se consider comanda SQL SELECT * FROM STUDENT LEFT OUTER JOIN TELEFON ON STUDENT. NR_LEG = TELEFON.NR_LEG WHERE GRUPA = 7710; Se presupune c n grupa selectat sunt 30 de studeni, 5 studeni au un telefon i 4 studeni au cte dou telefoane. Atunci, n urma execuiei se va afia: a) o list cu 30 linii; b) o list cu 34 de linii; c) o list cu 13 linii. 2. S se afieze numele clienilor care au achiziionate ntre 3 i 10 imobile, din baza de date AGENTIE_IMOBILIARA. 3. Pentru baza de date FURNIZORI_COMPONENTE realizai urmtoarele interogri: a) afiarea tuturor furnizorilor i a oraelor unde sunt situate, ordonnd descresctor dup numele furnizorilor; b) afiarea tuturor furnizorilor din Ploieti; c) afiarea componentelor care au masa sub 14 u.m, inclusiv; d) afiarea componentelor de culoare roie i albastr care nu sunt produse n oraul Ploieti; e) afiarea acelor furnizori care au livrat componenta C2, ordonnd dup furnizori; f) afiarea mediei cantitii livrate de furnizorul F1; (utilizai dicionarul pentru a afla detalii despre funcia MIN, MAX, SUM, COUNT, AVG); g) afiarea furnizorilor care au livrat cel mai mare numr de componente de un anumit tip; h) afiarea furnizorilor care au livrat cea mai mic cantitate de componente, afind numele acestora oraul de provenien al furnizorilor i componenta livrat; i) afiarea tuturor culorilor folosite pentru componentele livrate de furnizori; j) afiarea tuturor informaiilor furnizorilor a cror nume ncepe cu A; k) afiarea numelui furnizorilor care au starea cuprins ntre 10 si 20; 4. n cazul bazei de date FURNIZORI_COMPONENTE, s se realizeze urmtoarele interogri: a) Care sunt numele furnizorilor ce au livrat componenta C2 i care sunt oraele din care provin aceti furnizori? b) Care component roie s-a livrat n cea mai mare cantate? c) Din ce ora provine furnizorul cu cele mai puine componente vndute, i care sunt aceste componente? d) S se vizualizeze toate informaiile legate de furnizorii care au livrat componente, precum i toate informaiile despre aceste componente. 5. Afiai lista cu toi interpreii i cu albumele lor existente n baza de date COLECTIE_MUZICA, ordonnd dup interprei. 6. Vizualizai aceeai list de mai sus existent pe casete audio. 7. Care dintre interprei figureaz i pe CD i pe casete audio? 8. Descriei tipurile de JOIN utilizate n procesul de interogare a relaiilor unei baze de date.

99

9. Pentru toate interogrile de mai sus, s se formuleze fraze SELECT att cu ajutorul clauzei WHERE ct i cu ajutorul operaiilor de JOIN. 10. Fie baza de date H-R cu diagrama reprezentat n figura 6. manage s belongs to

11. DEPARTMENTS Department_id Department_name Manager_id Location_id Located in


LOCATIONS location_id country_id street_address city

EMPLOYEES employee_id first_name last_name salary Manager_id Department_id Job_id Location_id JOB_HISTORY employee_id start_date end_date job_id department_id

is manager of has job

Located in (2)
COUNTRIES country_id country_name region_id

JOBS job_id job_title min_salary max_salary JOB_GRADES Grade_level Lowest_sal Highest_sal

Located in (3)

REGIONS region_id region_name

Fig. 5. Diagrama bazei de date H-R

100

n ipoteza n care tabelele au fost populate cu date, 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). 11. S se afieze numele departamentelor i numele salariailor care lucreaz n ele. Se vor afia i departamentele care nu au salariai. (left outher join).

101

CAPITOLUL VII. UTILIZAREA LIMBAJULUI TRANSACT SQL (T-SQL) DE INTEROGARE A BAZELOR DE DATE MICROSOFT SQL SERVER
Se presupune c ntr-o instan Microsoft SQL Server 2005/2008 avem creat baza de date angajat, cu tabelele emp care conine angajaii unei firme i dept---care descrie departamentele din care fac parte angajaii (cu diagrama de relaii i structura date mai jos), populate cu date care s respecte structura propus:
emp
empno ename job mgr hiredate sal comm deptno

dept
deptno dname loc

Structura tabelelor: Tabelul emp Coloan Allow Nulls Data Type NOT NULL numeric(4,0) empno ename job mgr hiredate sal comm deptno Semnificaie coloan Codul angajatului (cheie primar) NULL varchar(50) Numele angajatului NULL varchar(9) Job-ul angajatului NULL numeric(4,0) Codul managerului NULL datetime Data angajrii NULL numeric(7, 2) Salariul angajatului NULL numeric(7, 2) Comisionul angajatului NOT NULL numeric(2,0) Nr. departamentului angajatului(cheie strin) 102

Tabelul dept Coloan Allow Nulls Data Type NOT NULL numeric(2,0) deptno dname loc NULL NULL varchar(14) varchar(13) Semnificaie coloan Numrul departamentului (cheie primar) Numele departamentului Locaia departamentului

9. 1. Exerciii propuse pentru rezolvare de ctre studeni - Utiliznd limbajul de interogare a datelor Microsoft Transact SQL S se scrie instruciunile Microsoft Transact-SQL care s afieze urmtoarele informaii: Utilizarea instruciunii SELECT i a diferitelor clauze ale acesteia:

I.

1. S se afieze coninutul tabelelor emp i dept, apoi s se afieze numrul de nregistrri ale fiecreia. 2. Afiai job-urile unice din tabela emp. 3. Afiai numele i salariul angajailor care ctig mai mult de 2850$. 4. Afiai numele i departamentul pt. angajatul cu codul 7566. 5. Afiai numele, job-ul i data angajrii pentru salariaii care au venit ntre 20.02.1981 i 1.05.1981. 6. Afiai numele i salariul pt. toi angajaii ale cror salarii nu aparin intervalului [1500; 2850]. 7. Afiai numele i departamentul angajailor din departamentele 10 i 30, n ordinea alfabetic a numelor. 8. Afiai numele i salariul angajailor din departamentele 10 i 30, n ordinea cresctoare a salariilor, pt. angajaii care ctig mai mult de 1500$. Etichetai coloanele Nume angajat i Salariu lunar. 9. Afiai numele i data angajrii pt. salariaii din 1982(angajai n acest an). 10. Afiai numele i job-ul angajailor care nu au un manager. 11. Afiai numele, salariul i comisionul angajailor care primesc comision; sortai datele n ordinea descendent a salariului i comisionului. 103

12. Afiai numele angajailor care conin litera C sau c pe a treia poziie a numelui lor. 13. Afiai numele tuturor angajailor care au doi de L n nume i sunt n departamentul 30 sau al cror cod de manager este 7782. 14. Afiai numele, job-ul i salariul angajailor cu job-ul CLERK sau ANALYST i salariul diferit de 1000, 3000 sau 5000. 15. Afiai numele, job-ul , salariul i comisionul angajailor cu comisionul mai mare dect salariul crescut cu 10 %. II. Utilizarea instruciunii SELECT i a funciilor:

1. Afiai data curent. 2. Afiai codul angajatului, numele, salariul i salariul crescut cu 15% exprimat ca numr ntreg, precum i creterea salarial. 3. Afiai numele, data angajrii i data de revizuire a salariului (dup 6 luni de serviciu). 4. Afiai numele angajailor cu prima liter upper i celelalte lowercase, apoi lungimea numelor, pentru toi angajaii ale cror nume ncep cu litera J, A sau M. 5. S se afieze datele despre angajaii care au jobul CLERK sau ANALYST i ctig mai mult de 1000$. 6. S se afieze datele despre angajaii care au jobul MANAGER i ctig mai mult de 1500$. 7. S se afieze datele despre angajaii care au jobul CLERK sau ANALYST, angajai dup 1981 i care lucreaz n departamentul 20. 8. S se afieze numele, jobul, salariul i comisionul angajailor care au salariul mai mare dect comisionul; sortai datele n ordinea descendent a diferenei dintre salariu i comision. 9. Afiai numele angajailor a cror a treia liter a numelor este A(cutare case senzitiv). (Indicaie: vezi clauza COLLATE) 10. Afiai Afiai numele i salariul pt. toi angajaii ale cror salarii aparin intervalului (1500; 2850] sau (500,1200).

104

III.

Utilizarea instruciunii SELECT n subinterogri

1. S se afieze angajaii cu salariul mai mare dect salariul angajatului cu codul 7566. 2. S se afieze angajaii care au acelai job cu cel al angajatului cu codul 7369. 3. S se afieze angajaii cu acelai job ca i angajatul cu codul 7369 i cu salariul mai mare dect al angajatului cu codul 7876. 4. Utilizare funcii de grup ntr-o interogare: S se afieze numele, jobul i salariul angajailor cu salariul minim. 5. Utilizare clauz HAVING n subinterogare: S se afieze toate departamentele cu salariul minim mai mare dect salariul minim din departamentul 20. 6. Afiai jobul cu cel mai mic salariu mediu. 7. S se afieze numele, salariul i numrul departamentului pentru angajaii cu salariul egal cu salariul minim din departamente. 8. S se afieze angajaii cu salariul egal cu 800, 950 sau 1300. 9. S se afieze codul, numele i jobul angajailor cu salariul mai mic dect cel al oricrui funcionar i care un sunt funcionari. 10. S se afieze angajaii cu salariul mai mare dect media salariilor din toate departamentele. 11. S se afieze angajaii care au subordonai (sunt efi). 12. Folosire subinterogare n clauza FROM: S se afieze angajaii cu salariul mai mare dect salariul mediu al departamentului din care fac parte. 13. S se afieze angajaii (nume, nr. departament, salariu i comision) ale cror salariu i comision sunt identice cu cele ale oricrui angajat din departamentul 30.

IV.

Utilizarea instruciunii SELECT n gruparea datelor(funcii de grup)

1. S se afieze media, maximum, minimum i suma salariilor lunare pentru toi angajaii cu jobul SALESMAN. 2. S se afieze numele angajatului cu cea mai mare vechime n munc i cel mai nou n firm. 3. S se afieze primul i ultimul angajat din punct de vedere alfabetic. 4. S se afieze numrul de angajai din departamentul 30. 105

5. S se afieze numrul distinct de departamente din tabela emp. 6. S se afieze valoarea medie a comisioanelor angajailor din firm. 7. Utilizare clauz GROUP BY: S se afieze numrul departamentului i salariul mediu pe departament. 8. Utilizare clauz GROUP BY: S se afieze salariul total pltit pe fiecare job n cadrul fiecrui departament. 9. S se afieze salariul mediu maxim din firm. 10. S se afieze numrul departamentului i salariul mediu al acestuia, pentru fiecare departament din firm. 11. S se afieze numrul de persoane care au acelai job. 12. S se afieze numrul de manageri(efi) existeni n tabela de angajai. 9.2. Exerciii rezolvate - Utiliznd limbajul de interogare a datelor Microsoft Transact SQL S se scrie instruciunile Microsoft Transact-SQL care s afieze urmtoarele informaii: I. Utilizarea instruciunii SELECT i a diferitelor clauze ale acesteia:

1. S se afieze numele angajailor, concatenat cu jobul, separat de o virgul i un spaiu, sub aliasul Angajat si titlu. SELECT ename+, +job AS [Angajat si titlu] FROM emp 2. S se afieze coninutul tabelei emp i apoi numrul de nregistrri. SELECT * FROM emp SELECT Tabela emp: , COUNT(*) AS [Nr. De inregistrari] FROM emp 3. S se afieze numele angajailor a cror a treia liter a numelor este A. SELECT ename FROM emp WHERE ename COLLATE Latin1_General_Cs_As LIKE __A 4. S se afieze angajaii din departamentul 30, folosind alias-uri adecvate. SELECT In departamentul +STR(deptno)+ sunt , STR(COUNT(*))+ angajati! FROM emp WHERE deptno = 30 GROUP BY deptno 5. Afiai numrul de manageri existeni n tabela de angajai. SELECT COUNT(DISTINCT(mgr)) [Nr. de manageri] FROM emp 106

II.

Utilizarea instruciunii SELECT n subinterogri: 1. S se afieze numele i data angajrii pentru toi angajaii din acelai departament cu Blake (excludei Blake) SELECT ename, hiredate FROM emp WHERE deptno IN (SELECT deptno FROM emp WHERE ename = Blake) AND ename < > Blake 2. S se afieze codul i numele angajailor care ctig mai mult dect media salariilor din firm; sortai rezultatul n ordinea descendent a salariilor. SELECT empno [Codul angajat], ename [Numele] FROM emp WHERE sal > (SELECT AVG(sal) FROM emp) ORDER BY sal DESC 3. Afiai codul i numele tuturor angajailor care lucreaz ntr-un departament care are i angajai al cror nume conine pe T sau t. SELECT empno [Codul angajat], ename [Numele] FROM emp WHERE deptno IN (SELECT deptno FROM emp WHERE ename LIKE %T%) 4. Afiai numele, numrul departamentului i jobul tuturor angajailor a cror locaie de departament este Dallas: SELECT ename, deptno, job FROM emp WHERE deptno IN (SELECT deptno FROM emp WHERE loc = Dallas) 5. Afiai numele i salariul angajailor subordonai lui King. SELECT ename, sal FROM emp WHERE mgr IN (SELECT empno FROM emp WHERE ename=King) 6. Afiai numrul departamentului, numele i jobul angajailor din departamentul Sales. SELECT dept, ename, job FROM emp WHERE deptno IN (SELECT deptno FROM dept WHERE dname=Sales) 7. Afiai codul, numele i salariul angajailor care ctig mai mult dect salariul mediu din firm i care lucreaz n departamentele care au cel puin un angajat care are litera T n nume. 107

SELECT empno, ename, sal FROM emp WHERE sa l> (SELECT AVG(sal) FROM emp ) AND deptno IN (SELECT deptno FROM emp WHERE ename LIKE %T%) III. Utilizarea instruciunii SELECT n gruparea datelor(funcii de grup) 1. Salariul maxim, minim, suma i media acestuia pentru toi angajaii; rotunjii rezultatul la prima poziie zecimal . SELECT ROUND(MAX(sal), 0) Maxim, ROUND(MIN(sal), 0) Minim, ROUND(SUM(sal), 0) Suma, ROUND(AVG(sal), 0) Media, FROM emp 2. Afiai maximul, minimul i suma salariilor pentru fiecare tip de job. SELECT job, ROUND(MAX(sal),0) [Maximul], MIN(sal) Minimul, SUM(sal) Suma, AVG(sal) [Media salariului] FROM emp GROUP BY job 3. Afiai numrul de persoane cu acelai job. SELECT job, COUNT(*) [Nr. de persoane] FROM emp GROUP BY job 4. Afiai codul managerului i cel mai mic salariu al angajailor care-l au ca manager ; excludei angajaii care nu au manager i grupurile de angajai care au salariul minim mai mic dect 1000; sortai rezultatul n ordinea descresctoare a salariului. SELECT mgr, MIN(sal) FROM emp WHERE mgr IS NOT NULL GROUP BY mgr HAVING MIN(sal) > 1000 ORDER BY MIN(sal) DESC Verificare (pentru un manager): SELECT MIN(sal) FROM emp WHERE mgr = 7566 5. Afiai numele i locaia departamentului, nr. de angajai i salariul mediu pentru toi angajaii din acel departament. SELECT d.dname, d.loc, COUNT(*) [Nr. de angajati], ROUND(AVG(sal), 2) [Salariul mediu] FROM emp e, dept d WHERE d.deptno = e.deptno GROUP BY d.dname, d.loc 108

6. S se afieze numrul de angajai din fiecare an calendaristic. SELECT YEAR(hiredate) [Anul angajarii], COUNT(hiredate) [Nr. de angajati] FROM emp GROUP BY YEAR(hiredate) Verificare: SELECT YEAR(hiredate) [Anul angajarii], COUNT(hiredate) [Nr. de angajati] FROM emp WHERE YEAR(hiredate) = 1981 GROUP BY YEAR(hiredate) 7. S se afieze numrul departamentului, joburile din departament (tipurile) i suma salariilor pentru joburile respective. SELECT deptno, job, SUM(sal) [Suma salariilor pe job] FROM emp GROUP BY job, deptno --(executie de la dreapta la stanga) Verificare: SELECT deptno, ename, job,sal FROM emp ORDER BY deptno, job --faceti suma pe joburi in fiecare departament si comparati

109

BAZE DE DATE.......................................................................................................................1 CAP. I. PROIECTAREA BAZELOR DE DATE RELAIONALE.2 1. Preliminarii.2 2. Construirea de diagrame entitate-relaie 8 CAP. II. PREZENTAREA BAZELOR DE DATE RELAIONALE.18 3. Proiectarea modelului relaional..18 3.1 Structura relaional a datelor.18 3.2 Operatorii modelului relaional...21 3.3 Restricii de integritate ale modelului relaional. 34 3.4 Exerciii de fixare a noiunilor 39 CAP. III. OPTIMIZAREA STRUCTURII BAZELOR DE DATE RELAIONALE.43 4. Prelucrarea/evaluarea i optimizarea cerinelor43 5. Tehnica normalizrii relaiilor. 46 5.1 Prima form normal (FN1)47 5.2. A doua form normal (FN2).. 50 5.3. A treia form normal (FN3). 52 5.4. Exerciii de fixare a noiunilor.. 53 CAP. IV. MANIPULAREA BAZELOR DE DATE RELAIONALE. 54 6.1 Limbaj de interogare bazat pe algebra relaiilor......................................................... 54 6.2 Limbajul SQL............................................................................................................. 58 CAP. V. LIMBAJUL DE INTEROGARE A BAZELOR DE DATE RELAIONALE 66 7. Limbajul SQL... 66 7.1. Limbaje relaionale de definire a datelor (LDD)..71 7.2. Comenzi pentru acordarea drepturilor de acces la baza de date..76 7.3. Exerciii de fixare a noiunilor.76 CAP.VI. LIMBAJE RELAIONALE DE MANIPULARE A DATELOR (LMD) INTEROGAREA DATELOR.. 79 8.1. Interogarea datelor.. 79 8.2. LMD - Interogarea datelor din mai multe relaii.. 83 8.3. Funcii utilizate n interogri 94 8.4. Exerciii de fixare a noiunilor 99 CAP. VII. UTILIZAREA LIMBAJULUI TRANSACT SQL (T-SQL) DE INTEROGARE A BAZELOR DE DATE MICROSOFT SQL SERVER...... 102 9. 1. Exerciii propuse -Interogri baz de date utiliznd Microsoft Transact.................103 9.2. Exerciii rezolvate - Interogri baz de date utiliznd Microsoft Transact SQL...106

110

Bibliografie
1. Ardeleanu tefan, Transact SQL, Ed. Niculescu, Bucureti, 2004. 2. Fotache Marin, SQL. Dialecte DB2, Oracle i Visual FoxPro, Polirom, 2001. 3. Lungu Ion, Constanta Bodea, Georgeta Bdescu, Cristian Ioni, Baze de dateOrganizare, proiectare i implementare, Ed. ALL Educational, Bucureti, 1995. 4. Popescu Ileana, Baze de date relaionale-proiectare i implementare, Editura Universitii din Bucureti, 1996. 5. Popescu Mihai, Baze de date relaionale, Ed. Academiei Tehnice Militare, Bucureti, 2001. 6. Tilca Magnolia, Boriga Radu, Baze de date, Ed. Univ. Titu Maiorescu, Bucureti, 2007.

111

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