Sunteți pe pagina 1din 109

UNIVERSITATEA VALAHIA DIN TRGOVITE

CURS LA DISCIPLINA BAZE DE DATE

LECT.DRD. FLORIN RADU

TRGOVITE =2007= 1

CUPRINS Capitolul 1 Introducere 1.1. Conceptul de baz de date 1.2. Utilizatorii bazelor de date 1.3. Sistemul de gestiune a bazelor de date Capitolul 2 Modele de reprezentare a datelor n bazele de date 2.1. Modelul ierarhic 2.2. Modelul reea 2.3. Modelul relaional 2.4. Modelul obiectual Capitolul 3 Algebra relaional 3.1. Caracterizarea general a limbajelor de programare 3.2. Operatorii asambliti 3.2.1. Reuniunea 3.2.2. Intersecia 3.2.3. Diferena 3.2.4 Produsul cartezian 3.3. Operatorii relaionali 3.3.1. Selecia 3.3.2. Proiecia 3.3.3. nlnuirea consultrilor 3.3.4. Jonciunea 3.3.5 Diviziunea Capitolul 4 Limbajul de interogare relaional SQL 4.1. Prezentare general 4.2. Elemente de baz ale interogrilor SQL 4.3. Coloane expresii 4.4. Opiunea ORDER BY 4.5. Operatorii LIKE, BETWEEN, IN 4.5.1. Operatorul BETWEEN 4.5.2. Operatorul LIKE 4.5.3. Operatorul IN 4.6. Theta i echijonciunea 4.7. Sinonime locale i jonciunea unei tabele cu ea nsi 4.8. Subconsultri 4.9. Funcii agregat 4.9.1. Funcia COUNT 4.9.2. Funcia SUM 4.9.3. Funcia AVG 4.9.4. Funciile MIN i MAX 4.10. Gruparea tuplurilor 4.10.1. Clauza GROUP BY 4.10.2. Clauza HAVING Anexe

CAPITOLUL 1 INTRODUCERE N BAZELE DE DATE Subiecte prezentate n acest capitol Conceptul de baz de date Utilizatorii bazelor de date Sistemul de gestiune al bazelor de date Sintez ntrebri recapitulative Bibliografie selectiv Preocuparea oamenilor pentru a nregistra faptele i aspectele din viaa de zi cu zi este veche de mii de ani, mrturie n acest sens stnd tbliele de lut rmase de la sumerieni de acum peste 6000 de ani. Pe lng faptele de arme ale eroilor vremii, respectivele documente consemneaz i alte aspecte, mult mai comune, n legtur cu existena de zi cu zi a acelei societi: taxele i impozitele pltite de ceteni, procese verbale n care sunt consemnate deciziile judectorilor din tribunale i multe altele. La fel de veche (ca i preocuparea de a nregistra faptele) este i necesitatea organizrii i gestionrii nregistrrilor respective, fapt ce a condus la dezvoltarea a numeroase tehnici n acest sens i poate c cel mai bune exemplu este apariia bibliotecilor (cea mai celebr fiind cea din Alexandria). Odat cu apariia tehnicii de calcul i dezvoltarea ulterioar a acesteia sau adugat noi dimensiuni acestei activiti fapt ce a permis nu numai transpunerea integral pe calculator a tuturor tehnicilor manuale dezvoltate de-a lungul timpului, ci i un salt calitativ ft precedent n organizarea i gestionarea datelor. Bazele de date actuale nregistreaz aspecte din cele mai diverse domenii de activitate: economie, tiin, art, cultur i cultur, medicin etc. Formele de prezentare a informaiei sunt i ele dintre cele mai variate: text, numere, imagini, hri, sunet, video .a. La ora actual sistemele de gestiune a bazelor de date (SGBD) asigur accesul automat, rapid i sigur la volume imense de date care pot fi dispersate n ntreaga lume. Aceste sisteme au devenit un element important al infrastructurii societii noastre i ctig o importan tot mai mare printre diversele sisteme de programare utilizate pe toate tipurile de calculatoare. n activitatea de zi cu zi de foarte multe ori sunt confruntai cu nevoia lurii deciziilor. Aproape de fiecare data aceast luare de decizii este condiionat de existena informaiilor cu privire la situaia asupra creia trebuie s decidem. O decizie care nu este fundamentat pe informaii clare, complete i la zi este fr nici o valoare i chiar mai mult dect att poate fi duntoare. Deseori foarte mult lume folosete noiunile de date i informaii ca i cnd ar fi echivalente. Cotidian acest lucru nu deranjeaz i devenit deja o practic comun ca cei doi termeni s fie considerai interschimbabili, folosindu-se cnd termenul de dat, cnd termenul de informaie atribuind ambelor aproximativ aceeai semnificaie. ns, n cazul nostru este foarte important s facem o distincie clar ntre noiunile de dat i informaie. Datele sunt fapte culese din realitate (lumea real) pe baza unor observaii i msurtori n timp ce informaia este rezultatul interpretrii (prelucrrii) datelor de ctre un anumit subiect i confer acestuia capacitatea de a lua decizii. Aadar, datele devin informaii doar n momentul n care ele interacioneaz cu un sistem capabil s le interpreteze. Aceeai dat poate fi interpretat n mod diferit de subieci diferii, fapt ce conduce la generarea de informaii diferite. Aadar nu putem spune c exist o coresponden biunivoc ntre date i informaii. n acest context, trebuie precizat faptul c sistemele de calcul nu prelucreaz informaii, ci date; vorbim de sisteme de prelucrare a datelor i nu de sisteme de prelucrare a informaiilor, folosim baze de date i nu baze de informaii. Datele au un caracter obiectiv n timp ce informaia este subiectiv.

Astzi informaia a devenit o component major, esenial n desfurarea oricrei activiti. Informaia nu are valoare dect dac ea influeneaz procesul de luarea a deciziilor i dac determin luarea unor decizii mai bune dect cele care ar fi luate n lipsa ei. Pentru aceasta informaia trebuie s fie disponibil n timp util, s fie corect, necontradictorie, neredundant i s aib forma adecvat necesitilor factorilor de decizie. Aceste cerine sunt realizabile prin existena unui volum imens de date care trebuie culese, memorate, organizate, regsite i prelucrate n mod corespunztor n vederea utilizrii lor ca informaie. O astfel de activitatea instituionalizat este legat n informatic de noiunea de baz de date. 1.1. Conceptul de baz de date n cadrul oricrei ntreprinderi, datele constituie o resurs organizaional crucial i n consecin ele trebuiesc gestionate similar altor active importante. Fr date asupra funcionrii interne i asupra mediului extern ntreprinderile nu ar putea s se menin n competiie sau s reueasc n afaceri. Volumul acestor sate este n continu cretere. Organizarea i memorarea acestor date pe suporturi tehnice adresabile (HDD, FDD, CD) este mult facilitat de faptul, c n majoritatea cazurilor, se opereaz cu structuri de date. Determinarea structurilor de date i a legturilor ntre realizrile acestora nu este o activitate deloc uoar. Ea presupune utilizarea unor modele de date i respectiv a unor formalisme de modelare a datelor i are ca obiectiv definirea structurilor de date de gestionat n memoria secundar. Organizarea datelor pe memoria extern a parcurs n timp mai multe etape: fiiere, fiiere cu legturi i a culminat cu bazele de date actuale. Un fiier este un ansamblu de nregistrri fizice, omogene din punct de vedre al coninutului i al prelucrrii. Fiierele conin n cea mai mare parte elemente comune iar asocierile dintre date nu sunt prea bine exploatate dat fiind faptul c fiierele sunt utilizate izolat i independent unele de altele. Soluia fiierelor a fost specific anilor 60-70, dar mai sunt ntlnite i n prezent n cadrul unor aplicaii economice care folosesc limbaje clasice i ndeosebi limbajul COBOL. Dominat n prezent este o alt soluie, care const n organizarea datelor n baze de date. O baz de date este o colecie organizat de date folosit n scopul de a modela un anumit tip de organizaie sau proces organizaional. n gestiunea bazelor de date exist dou tipuri de baze de date: operaionale i analitice. Bazele de date operaionale constituie suportul a numeroase companii, instituii i organizaii din ntreaga lume. Aceast categorie de baze de date este utilizat n cazul prelucrrilor on-line a tranzaciilor (OLTP On Line Transaction Processing), adic n acele situaii n care este necesar colectarea, modificarea i ntreinerea zilnic a bazelor de date. Datele stocate ntr-o baz de date operaional sunt date de tip dinamic, ceea ce nseamn c se modific n permanen i reflect ntotdeauna informaii actualizate la zi. Contrar acestora, bazele de date analitice sunt folosite n special n prelucrrile analitice online (OLAP On Line Analitical Processing), cnd este necesar stocarea i urmrirea datelor istorice i dependente de timp. O baz de date analitice este de un real folos atunci cnd este necesar urmrirea tendinelor, vizualizarea datelor statistice aferente unei perioade mai lungi de timp sau efectuarea de previziuni tactice sau strategice de afaceri. Acest tip de baz de date stocheaz date statice, ceea ce nseamn c datele respective nu se modific niciodat (sau foarte rar). Informaiile culese dintr-o baz de date analitic reflect o fotografie a datelor la un anumit moment de timp. Bazele de date analitice utilizeaz frecvent bazele de date operaionale ca surs principal de date, deci poate exista o oarecare asociere ntre cele dou tipuri; cu toate acestea, bazele de date operaionale i analitice satisfac tipuri de necesiti foarte concrete privind prelucrarea datelor. 1.2. Utilizatorii bazelor de date

O baz de date poate avea unul sau mai muli utilizatori. n funcie de rolul acestora distingem trei clase de utilizatori ai bazelor de date: Programatorii de aplicaii, sunt cei care scriu programele ce utilizeaz bazele de date. Indiferent de limbajul de programare utilizat (COBOL, C, PASCAL), aceste programe asigur accesul la datele stocate n baza de date, adugarea de noi date, tergerea sau modificarea datelor existente. Aceste funcii se execut printr-o interogare adresat SGBD-ului. Utilizatorii finali, cuprind dou categorii de utilizatori: Utilizatorul expert, informatician, cunoscnd limbajele de programare i limbajele bazelor de date; Utilizatorul neinformatician, care nu este specialist n baze de date. Utilizatorii finali interacioneaz cu baza de date de la o staie de lucru sau de la un terminal, utiliznd fie una din aplicaiile menionate la punctul precedent, fie o interfa care face parte integrant din SGBD. Majoritatea SGBD-urilor furnizeaz cel puin un procesor de limbaj de interogare interactiv, care permite utilizatorului s adreseze SGBD-ului comenzi de nivel nalt (ca SELECT, INSERT etc). Limbajul SQL este un limbaj tipic de interogare. Unele sisteme ofer utilizatorilor si alte tipuri de interfee n care nu pot adresa o comand explicit (ca SELECT), dar pot s aleag o comand dintr-un meniu sau s completeze rubrici n structuri predefinite. Aceste meniuri sau interfee grafice sunt mai uor de folosit de utilizatorii care nu au cunotine formale n tehnologia informaiei. Administratorul BD, care asigur administrarea unitar a datelor din baza de date. Funciile asigurate de ctre administratorul bazei de date sunt: Definirea schemei conceptuale (n care sunt incluse i regulile care s asigure integritatea datelor). Definirea schemei interne. Definirea schemei externe (sau sprijinirea utilizatorului final n definirea acestora). Definirea procedurilor de salvare i restaurare. Definirea utilizatorilor bazei de date i a drepturilor de acces (la baza de date sau la anumite obiecte ale bazei de date). Supervizarea performanelor i asigurarea evoluiei bazei de date, etc. 1.3. Sistemul de gestiune al bazelor de date O baz de date este un ansamblu organizat i structurat de date. Acest ansamblu trebuie s permit o reprezentare fidel a datelor cu minim de constrngeri. SGBD-ul este un instrument care permite o astfel de organizare i manipulare a datelor. Este un ansamblu de programe care permite descrierea, memorarea, manipularea i restaurarea datelor pentru a asigura securitatea acestora. Se numete aplicaie baz de date sau sistem de baz de date un ansamblu de programe construite n jurul unei baze de date i integrnd un SGBD pentru gestiunea informaiilor. Funciile unui SGBD n primul rnd trebuie menionate funciile eseniale, adic cele pentru care SGBD-ul este conceput. Ele sunt n numr de patru: descrierea datelor, introducerea, extragerea/interogarea i actualizarea. Descrierea datelor este acea parte care permite, nainte de introducerea datelor, de a defini numele acestor date, structura i coninutul lor. De exemplu baza de date a unei biblioteci comport un ansamblu de date referitoare la cri. nainte de a putea nregistra aceste date, trebuie definit cu precizie ansamblul informaiilor care se dorete a fi administrat cu privire la aceste cri: numrul (cota), titlul, numrul de exemplare, etc. Trebuie, de asemenea, estimat mrimea sau cel puin s fie definit mrimea maxim admis: 30 caractere pentru titlu, 5 pentru numr, etc. Odat definite structurile, funcia de introducere permite tuturor utilizatorilor inserarea de date n baz. Aceast funcie de introducere trebuie, n plus, s asigure toate controalele posibile, al

acestor date. n cazul bibliotecii, SGBD-ul trebuie s verifice dac numrul crii este n forma cerut, dac mrimea titlului nu depete numrul maxim de caractere prevzut, dac numrul de exemplare este un numr ntreg pozitiv, etc. Extragerea datelor desemneaz toate operaiile regulate sau punctuale, de cutare i de ieire pe ecran, pe suport de hrtie sau pe un alt suport, n ntregime sau doar n parte a informaiilor din baza de date. Se va putea, de exemplu, s se extrag toate crile care sunt scrise de un anumit autor sau toate crile aprute n colecia Baze de date. n fine, funcia de actualizare trebuie s asigure modificare sistematic a informaiilor pe msur ce acestea evolueaz. La fiecare cumprare a unei cri, trebuie modificat numrul de exemplare al titlului corespunztor din baza de date. Pentru c datele sunt partajate de ctre mai multe aplicaii, dezvoltarea funciilor descrise anterior, antreneaz i alte necesiti. Punerea n comun a unui ansamblu de date are ca i consecin necesitatea de a prevedea controlul accesului la date. Exist dou aspecte legate de protecia datelor. Primul privete confidenialitatea: informaia nu poate fi cunoscut de toi. Pentru fiecare tip de informaie trebuie stabilit lista persoanelor sau a grupurilor autorizate a le consulta. Al doilea aspect se refer la integritate: informaia nu poate fi modificat de toi. n acest caz, se convine la definirea unui cerc de persoane, n general foarte mic, abilitate s actualizeze informaia. SGBD-ul trebuie s permit personalizarea accesului la baza de date. Trebuie deci s se poat identifica utilizatorii i controla aceast identificare, ceea ce se cheam autentificarea accesului. Dup caz, protecia se poate face la mai multe nivele: accesul la ntreaga baz, la o parte din ea sau la un singur element al bazei. Protecia datelor este unul din aspectele unei funcii destul de importante care este securitatea bazei de date. La aceast funcie se adaug i funciile de rezisten n cazul unor pene, pe care trebuie sa le furnizeze SGBD-ul. Un program nu poate mpiedica n totalitate apariia incidentelor sau a problemelor majore. Totui, el trebuie s fie n msur s furnizeze mecanisme care s faciliteze recuperarea datelor n cazul n care apar probleme grave. Bazele de date sunt utilizate pentru a evita redundana informaiilor stocate. Uneori, pentru a minimiza consecinele legate de eventualele probleme ce pot aprea, este necesar efectuarea de salvri ale bazei de date. Aceste salvri nu sunt nimic altceva dect date redundante, dar, n acest caz duplicarea informaiilor este controlat de SGBD. SGBD-ul este dedicat manipulrii datelor. Pentru aceasta trebuie s asigure un acces optimal la date. Dincolo de organizarea fizic a datelor, SGBD-ul trebuie s faciliteze cutarea acestora. n aceeai ordine de idei, SGBD-ul trebuie s faciliteze accesul la date pentru toate programele, dar i pentru toate categoriile de utilizatori. Pentru aceasta, el trebuie s furnizeze instrumentele care s permit interfaarea comunicarea SGBD-ului cu alte programe. Trebuie oferit un acces direct la date sub o form compatibil cu categoriile de utilizatori, de exemplu o interfa grafic pentru nespecialiti, un limbaj de acces puternic pentru informaticieni. O alt funcie important este controlul concurenei. ntr-adevr o baz de date trebuie s permit accesul simultan al mai multor utilizatori, fr nici un fel de incident. S lum exemplu unui sistem de rezervare a locurilor pentru cursele aeriene, fondat pe o baz de date. Aceasta trebuie s permit alocarea fiecrui loc unei singure persoane i numai uneia. O agenie conectat la baza de date respectiv, ntreab dac a mai rmas un loc liber pentru zborul 747. I se rspunde c a mai rmas unul singur. O alt agenie pune imediat aceeai ntrebare, nainte ca prima agenie s fi confirmat interesul su pentru locul rmas. Locul este nc disponibil. Prima agenie l-a rezervat. A doua, de asemenea, a ntrebat. Se produce n acest caz o problem zis de acces concurent pe care SGBD-ul trebuie s o previn. Principiile independenei Realizarea unei baze de date are drept consecin punerea n comun i partajarea unui ansamblu de informaii. Aceast punere n comun trebuie s respecte dou principii de independen: respectiv independena fizic i independena logic.

Independena fizic desemneaz principiul conform cruia un program care acceseaz datele din baz, trebuie s manipuleze aceste date ntr-un mod abstract, independent de organizarea lor fizic. Independena logic caracterizeaz accesul simultan al diferiilor utilizatori sau programe la aceeai baz de date. Fiecare program trebuie s poat lucra doar asupra prii de date care dorete. Pentru aceasta la realizarea programului se vor folosi doare datele utile acestuia. Trebuie s se poat utiliza pentru calificarea acestor date, termeni care sunt proprii programului, eventual diferii de cuvintele care vor fi utilizate n alte programe sau de ali utilizatori pentru a desemna aceleai date. Mecanisme precum sub-schema n cazul bazelor de date reea sau vederile n cazul bazelor de date relaionale permit ceast independen logic. Arhitectura funcional a unui SGBD Un SGBD este format din diferite module fiecare avnd n sarcin una sau mai multe din funciile descrise anterior.

SGBD Interfaa utilizator

SGBD Interfaa de administrare SGBD Gestiunea acceselor SGBD Gestiunea tranzaciilor

SGF Gestiunea fiierelor

SGBD Mecanisme specifice SGBD Gestiunea discurilor

Discuri

Figura 1.1. Arhitectura funcional a unui SGBD Ansamblul acestor module constituie puntea de legtur ntre baza de date stocat pe unul sau mai multe discuri magnetice i ansamblul utilizatorilor. La cel mai nalt nivel SGBD ul conine un ansamblu de instrumente administrnd comunicarea direct cu utilizatorii. n funcie de SGBD, oferta n termeni de interfee este mai mult sau mai puin bogat i mai mult sau mai puin xxx. Editorii de SGBD-uri tind s propun diferite limbaje de acces la baza de date, adaptate gradului de competen sau nevoilor categoriilor de utilizatori desemnai s lucreze cu datele, interfee interactive dispun de instrumentele necesare punerii n legtur a programelor de acces la date scrise n limbaje de programare clasice cu baza de date. Instrumentele respective permit munca cu datele coninute n baza de date. SGBD-ul ofer, n plus, o interfa care permite de a aciona asupra structurii bazelor de date i/sau asupra aspectelor tehnice, cum ar fi optimizarea bazelor, configurarea lor. Aceast interfa este numit interfaa de administrare. Ea este rezervat, n general, informaticienilor dau utilizatorilor foarte avizai. Este instrumentul de munc privilegiat al administratorului bazei de date. Indiferent care ar fi interfaa de comunicare aleas pentru a accede la baza de date, trebuie s existe un drept de acces la aceasta din urm. Drepturile sunt atribuite de administrator i se concretizeaz ntr-o identificare (nume utilizator) i o autentificare (parol). Modulul de gestiune a acceselor are n sarcin aceste controale. El asigur n acelai timp i controlul integritii. Altfel spus, el protejeaz datele verificnd dat toate actualizrile respect un ansamblu de reguli numite constrngeri de integritate. Se mpiedic modificrile care violeaz aceste constrngeri i avertizeaz utilizatorul de problemele ntlnite. Tipurile de constrngeri admise de un SGBD vor fi descrie mai trziu. n fine modulul de gestiune a acceselor asigur optimizarea acestora. Astfel, n majoritatea SGBD-urilor, accesul la date este formulat n limbaje evoluate precum SQL (Structured Query Language). Modulul de gestiune a tranzaciilor este indispensabil pentru a asigura, n acelai timp, buna execuie a acceselor simultane i pentru a realiza aciunile care vor permite, n caz de pan, recuperarea datelor n cea mai bun stare posibil. Rspunsul editorilor de SGBD-uri la aceste dou nevoi a fost cvasi unanim: punerea la punct a unui mecanism numit tranzacie care permite definirea ansamblului de executat totul sau nimic asupra bazei de date. Astfel, se asigur c

utilizatorii pot lucra simultan fr conflicte: cererea disponibilitii unui loc n avion i rezervarea sa trebuie s fac pare din aceeai tranzacie. Prin acelai mijloc, n caz de pan, nu se reia dect tranzaciile corect executate, adic tranzaciile terminate i valide. Toate modulele descrie pn acum sunt parte component a SGBD. Totui, SGBD-ul nu este n relaie direct cu baza de date. Dup cum am vzut baza de date este constituit dintr-un ansamblu de fiiere, mbogite cu structuri zise de acces. Aceste fiiere sunt, n general, administrate de sistemul de gestiune al fiierelor (SGF) care face parte din sistemul de operare al calculatorului: Unix, Windows. Altfel spus, SGBD utilizeaz SGBD-ul xxx, dar poate, n anumite cazuri, pune la dispoziie mecanisme suplimentare de organizare i acces la datele stocate n aceste fiiere. Ultimul strat reprezentat n figur nu este intern SGBD. El reprezint sistemul de gestiune al intrrilor-ieirilor al sistemului de operare. El permite convertirea comenzilor scrise n straturile superiore n ordinea citire, scriere, deplasare i poziionare a capetelor pe discuri. Realizeaz, de asemenea, operaiile necesare pentru cutarea i actualizarea datelor. De fapt, baze de date este stocat pe disc. Totui, toate informaiile asupra datelor sunt efectuate n memoria central. Gestiunea discurilor asigur deci toate transferurile ntre memoria central i spaiul de stocare de pe disc. Arhitectura operaional a unei aplicaii baze de date La nceput, SGBD-urile erau concepute pentru sisteme centralizate. Utilizatorii conectai la aceste sisteme partajau aceleai date implantate pe acelai disc i ncrcate n acelai spaiu de memorie central. Apariia micro-informaticii n anii 1980 a dus la realizarea de SGBD la nivel micro. Totui, utilizatorii i-au exprimat rapid dorina de a putea interaciona cu baza de date centralizat prin intermediul microcalculatorului. Acestea nu avea ns puterea i securitatea marilor sisteme. La nceputul anilor 1990 apare conceptul de arhitectur client/server. Se consider c o aplicaie informatic comport n general trei tipuri de tratamente: gestiunea datelor (cutare, actualizare), logica aplicativ care nseamn calcule, reflecii i n cele din urm prezentarea rezultatelor. Se vorbete de client/server de ndat ce aceste tratamente sunt repartizate ntre cel puin dou calculatoare. Este evident faptul c gestiunea datelor este mai bine asigurat de marile sisteme. n schimb, prezentarea rezultatelor este mai mulumitoarea via un microcalculator. Cea mai clasic arhitectur client/server poate fi descris dup cum urmeaz: - client este microcalculatorul care emite cererile de acces la baza de date situat pe un server; - cererea este executat pe server care remite clientului liniile rezultat; - acest rezultat este afiat pe postul client, de exemplu prin intermediului unui tabel.

Server

Client 1

Client 2

Client n

Cererea client ctre server Rspunsul serverului ctre client Figura 1.2. Arhitectura client server Acest tip de funcionare este eficace n msura n care fiecare dintre cei doi efectueaz sarcina pentru care este cel mai adaptat: prezentarea rezultatelor este efectuat de ctre client, gestiunea datelor (coerena, integritatea) este asigurat de server. Logica aplicativ poate fi executat fie de client, fie de server. Totui, n primul caz, inconvenientul este c ansamblul de date uneori voluminos tranziteaz reeaua. Dac numrul utilizatorilor este foarte mare, reeaua poate fi foarte ncrcat. n cazul n care logic aplicativ este efectuat de server, acesta poate fi foarte solicitat de un mare numr de utilizatori simultan. n ciuda acestor inconveniente, arhitecturi de acest tip sunt nc foarte utilizate n ntreprinderi. n aceste configuraii, conexiunea ntre programe este realizat de programe de comunicare numite middlewares. Pentru a rezolva inconvenientul citat mai sus, de acum nainte se realizeaz arhitecturi pe 3 niveluri. Cele 3 componente care sunt gestiunea datelor, logica aplicativ i prezentarea rezultatelor sunt repartizate ntre trei calculatoare: serverul de date, serverul de aplicaie i postul client:

Server

Server de aplicaie

Client 1

Client 2

Client n Figura 1.3. Arhitectura pe 3 niveluri

10

Sintez Primul capitol a avut ca scop familiarizarea cu conceptul de baz de date. Dac la nceput, organizarea datelor s-a realizat cu ajutorul fiierelor, n prezent, bazele de date au devenit sursa dominant. O baz de date este o colecie organizat de date folosit n scopul de a modela un anumit tip de organizaie sau proces organizaional Din punct de vedere al utilizatorilor bazei de date, distingem urmtoarele 3 categorii: programatorii de aplicaie; utilizatorii finali (care pot fi i experi informaticieni i neinformaticieni); administratorul bazei de date. SGBD-ul permite descrierea, memorarea, manipularea i restaurarea datelor pentru a asigura securitatea acestora. Cele patru funcii eseniale ale unui SGBD sunt: descrierea datelor, introducerea, extragerea/interogarea i actualizarea. Acestora li se mai adaug alte dou i anume securitatea bazei de date i controlul concurenei. ntrebri recapitulative 1. Care sunt etapele prin care a trecut organizarea datelor? 2. Ce este o baz de date? 3. Ce este o baz de date operaional? 4. Ce reprezint OLTP? 5. Ce este o baz de date analitic? 6. Ce reprezint OLAP? 7. Exist legtur ntre bazele de date operaionale i cele analitice? 8. Cine sunt utilizatorii bazei de date? 9. Cine poate fi utilizatorul final? 10. Care sunt funciile asigurate de administratorul bazei de date? 11. Ce este un sistem de gestiune a bazelor de date? 12. Ce presupune descrierea datelor? 13. n ce const extragerea datelor? 14. Ce implic protecia datelor? 15. Ce presupune controlul concurenei? 16. Descriei arhitectura funcional a unui SGBD. 17. Descriei arhitectura client/server. 18. Descriei arhitectura pe 3 niveluri. Bibliografie selectiv 1. Michael Hernandez Proiectarea bazelor de date, Editura Teora, Bucureti, 2003 2. Mariana Miloescu Baze de date n Visual FoxPro, Editura Teora, 2003 3. Marin Fotache, Proiectarea bazelor de date, Editura Polirom, Iai, 2005 4. Grupul BDASEIG, Baze de date. Fundamente teoretice i practice, Editura Infomega, Bucureti, 2002 5. Fleming Candace Handbook of Relational database Design, Reading, MA: AddisonWesley, 1989

11

CAPITOLUL 2 MODELE DE REPREZENTARE A DATELOR N BAZELE DE DATE Subiecte prezentate n acest capitol Modelul ierarhic Modelul reea Modelul relaional Modelul obiectual Sintez ntrebri recapitulative 2.1. Modelul ierarhic Primul model utilizat n bazele de date este modelul ierarhic, care are la baz o structur arborescent, n care un nod printe poate avea mai multe noduri fiu, n timp de un nod fiu nu poate avea dect un singur nod printe. Schema ierarhiei are un singur nod rdcin, iar pentru reprezentarea relaiilor de tipul m:n ntr-o structur de baz de date ierarhic se admite duplicate pentru instanele nregistrrilor fiu. Pentru a realiza reprezentarea acestui model se folosesc diagramele de structur care sunt formate din dou elemente principale: dreptunghiuri pentru tipurile de nregistrri i linii pentru legturi. Aceste diagrame se aseamn cu o structur arborescent, locul liniilor fiind luat de tipurile de nregistrare. Pentru a pune n eviden legturile care pot exista ntre tipurile de nregistrri, se folosesc urmtoarele reprezentri grafice: relaia 1:1 se consider tipurile de nregistrri CONTRIBUABIL i ROL. ntre aceste dou tipuri de nregistrri exist urmtoarea legtur: orice contribuabil aflat n evidena administraiei financiare are deschis un singur rol, iar fiecare rol deschis la administraiei nu aparine dect unui singur contribuabil. Reprezentarea grafic a acestei legturi este urmtoarea: CONTRIBUABIL ROL

relaia 1:n se consider tipul de nregistrri COMAND i CLIENT. ntre aceste tipuri de nregistrri exist urmtoarea legtur: un client emite mai multe comenzi, n timp ce o comand este emis de un singur client. Reprezentarea grafic a acestei legturi este urmtoarea: CLIENT COMAND

relaia m:n - se consider tipul de nregistrri COMAND i PRODUSE. ntre aceste tipuri de nregistrri exist urmtoarea legtur: o comand poate conine mai multe produse, iar un produs poate fi inclus n mai multe comenzi. Reprezentarea grafic a acestei legturi este urmtoarea: COMAND PRODUSE

O baz de date ierarhic este constituit dintr-un grup de nregistrri interconectate prin intermediul unor legturi. O nregistrare reprezint o colecie de cmpuri, fiecare cmp coninnd o singur valoare, iar prin legtur se nelege o asociere ntre cele dou cmpuri. Fiecare tip de nregistrare din diagrama de structur are asociat n baza de date un anumit numr de realizri, ceea ce nseamn c pentru fiecare tip de nregistrare printe pot exista nici una, una sau mai multe nregistrri ale tipului de nregistrare fiu. De exemplu, un anumit client nu a emis nici o comand.

12

Exemplu: Se consider o baz de date cu informaii despre studenii i specializrile unei faculti. O specializare are mai muli studeni, n schimb, un student nu poate urma dect o singur specializare. Reprezentarea modelul ierarhic al exemplului este prezentat mai jos: SPECIALIZARE STUDENTI Cod_spec Nr_matricol
SPECIALIZARE

Denumire Nume_student Tip_burs

CIG Contabilitate

FB

Finane

MG

Management

MK

Marketing

120 Popa Dan Studiu

322 Radu Ioana Social

187 Vlad Andrei

562 Sima Ileana

Merit

n acest exemplu, tipului de nregistrare printe SPECIALIZARE i corespund patru nregistrri: (CIG, Contabilitate), (FB, Finane), (MG, Management) i (MK, Marketing). Prima nregistrare, (CIG, Contabilitate) este printe pentru (120, Popa Dan, Vaslui), care este o realizare a tipului de entitate STUDENI, a doua nregistrare nu are nregistrri fiu, a treia nregistrare are doi fii (322, Radu Ioana, Arad) i (187, Vlad Andrei, Iai), n timp ce ultima nregistrare are un singur fiu (562, Sima Ileana, Titu). 2.2. Modelul reea Este un model care are la baz o structur de tip reea. Acest model este oarecum similar cu modelul ierarhic, n sensul c un nod printe poate avea mai muli fii, deosebirea constnd n faptul c un nod fiu poate avea mai muli prini. Ca i modelul ierarhic i modelul reea folosete diagramele de structur, care se aseamn cu un graf, nodurile fiind nlocuite de tipurile de nregistrare. Reprezentarea grafic a legturilor care pot exista ntre tipurile de nregistrri (legturi 1:1, 1:n, n:m) este similar modelului ierarhic. Exemplu: Se consider o baz de date cu informaii despre studeni, specializarea urmat de acetia i bursele pe care acetia le primesc. O specializare are mai muli studeni, n schimb, un student nu poate urma dect o singur specializare; bursa poate fi obinut de mai muli studeni, n schimb, un student poate obine o singur burs. Reprezentarea modelul reea al exemplului este realizat n cele ce urmeaz:

SPECIALIZARE STUDENTI

Cod_spec

Denumire

BURSE

Tip

Cuantum

Nr_matricol

Nume_student

Localitate

13

CIG FA MG Mk

Contabilitate Finane Management Marketing

120 322 187 562

Popa Dan Radu Ioana Vlad Andrei Sima Ileana

Studiu Social Merit

1.200.000 1.000.000 1.900.000

n acest exemplu, tipului de nregistrare printe SPECIALIZARE i corespund patru nregistrri: (CIG, Contabilitate), (FA, Finane), (MG, Management) i (MK, Marketing), tipului de nregistrare BURSE trei realizri (Studiu, 1.200.000), (Social, 1.000.000) i (Merit, 1.900.000), iar tipului de nregistrare STUDENI patru realizri (120, Popa Dan, Vaslui), (322, Radu Ioana, Arad) , (187, Vlad Andrei, ) i (562, Sima Ileana, Titu). nregistrrile (CIG, Contabilitate) SPECIALIZARE i (Studiu, 1.200.000) BURSE sunt prini pentru (120, Popa Dan, Studiu) STUDENI. nregistrarea (FA, Finane) nu are nregistrri fiu. nregistrarea (Social, 1.000.000) BURSE i (MG, Management) SPECIALIZARE sunt prini pentru (322, Radu Ioana, Social). Realizarea (187, Vlad Andrei, ) are drept printe (MG, Management), iar nregistrarea (562, Sima Ileana, Merit) este copilul realizrilor (MK, Marketing) i (Merit, 1.900.000). 2.3. Modelul relaional Modelul relaional a fost introdus de E. F. Codd i reprezint astzi cel mai utilizat model pentru gestionarea bazelor de date. Modelul are la baz conceptul de relaie definit n teoria matematic a mulimilor ca fiind o submulime a produsului cartezian al mai multor mulimi: R M1 x M2 x x Mn. Familia de mulimi pe care este definit relaia se numete domeniu, atunci cnd M1 = M2 = = Mn se spune c relaia este omogen. Numrul n se numete gradul relaiei, un element al relaiei t = (m1, m2, , mn) se numete tuplu, iar numrul de tupluri indic cardinalitatea relaiei. Schema unei relaii este format din numele relaiei, atributele acesteia i restriciile de integritate. Domeniul reprezint mulimea tuturor valorilor posibile care definesc o anumit proprietate a unui obiect. Atributul reprezint mulimea valorilor existente la un moment dat n coloana pe care acesta o desemneaz n cadrul unei relaii. ntr-o relaiei pot exista mai multe atribute care s ia valori n acelai domeniu. Relaia STUDENI se scrie n felul urmtor Atribute Nr_matricol 120 187 322 562 Nume_student Popa Dan Vlad Andrei Radu Ioana Sima Ileana Localitate Titu Ploieti Trgovite Tuplu Moreni

Domeniu

14

Relaiile se prezint sub forma unor tabele, supuse urmtoarelor restricii: - fiecare coloan din tabel conine acelai fel de valori; - n tabel ordinea liniilor nu este stabilit i n acelai timp nu se admit valori duplicate; - orice valoare este un numr sau un ir de caractere (nu are cum s fie un ansamblu); - orice coloan este identificat printr-un nume care reprezint atributul relaiei. O baz de date, privit din punct de vedere al modelului relaional, este vzut ca o colecie de tabele (relaii), n care fiecare coloan reprezint un atribut distinct, iar fiecare rnd, un tuplu distinct. Tuplurile unei relaii se pot identifica n mod unic prin intermediul valorilor unuia sau mai multor atribute, care joac rolul de cheie primar a relaiei respective. Orice relaie posed cel puin o cheie. Cnd aceast cheie este alctuit dintr-un singur atribut, poart numele de cheie simpl, iar atunci cnd este format din mai multe atribute ea se numete cheie compus. Cheia primar a unei tabele este un atribut sau un grup de atribute care permite identificarea fr ambiguitate a fiecrui tuplu din tabel. La alegerea unei astfel de chei, administratorul bazei de date trebuie s aib n vedere criterii prin care s asigure identificarea efectiv a tuplurilor (lungime, natur). Cheia primar trebuie s verifice urmtoarele trei restricii: - unicitatea: o cheie identific un singur tuplu al relaiei; - compoziia minimal: atunci cnd cheia primar este compus, nici un atribut cheie nu poate fi eliminat fr distrugerea unicitii tuplului n cadrul relaiei; - valorile non-nule: valorile atributului sau ale ansamblului de atribute care desemneaz cheia primar sunt ntotdeauna specificate, deci nenule; nici un atribut din compoziia cheii primare nu poate avea valori nule. Dac ntr-o relaie exist mai multe combinaii de atribute care confer unicitatea tuplului, acestea sunt denumite chei candidate. Atunci cnd o cheie candidat nu este cheie primar este considerat cheie alternativ (secundar). Legturile ntre tuplurile din relaii diferite se realizeaz prin atribute sau combinaii de atribute numite chei strine (externe). Reflectnd un aspect din realitate, relaiile se spun unor restricii, ce pot fi de dou feluri: restricii de integritate depind de semantica valorilor domeniilor i impun relaiilor s se supun regulilor: - integritatea entitii valorile cheii primare trebuie s fie diferite de zero, pentru c altfel, cheia respectiv nu va mai fi identificator; - integritatea referirii valorile unei chei externe trebuie s refere tuplurile unei alte relaii. alte restricii se aplic asupra domeniilor i reflect anumite corelaii de ordin valoric (egalitate, inegalitate). Avantajele modelului relaional n comparaie cu celelalte tipuri de modele sunt: - independena sporit a programelor de aplicaie fa de modul de reprezentare intern a datelor i de metodele de acces la date; - definirea unei structuri conceptuale optime, minimaliznd redundana datelor i erorile la actualizare; - utilizarea unor limbaje procedurale bazate pe algebra relaional i a unor limbaje neprocedurale care contribuie la mbuntirea comunicrii dintre sistem i neinformaticieni. 2.4. Modelul obiectual Dei n prezent cel mai utiliza model este modelul relaional, el nu permite: descrierea unor structuri de date complexe (documente electronice, date n format multimedia); partajarea i

15

reutilizarea structurilor de date; declararea prelucrrilor aferente structurilor de date (datele sunt descrise separat de prelucrri). Rspunsul la astfel de cerine l constituie modelul orientat obiect. Modelarea orientat obiect se bazeaz pe urmtoarele concepte: obiect, abstractizare, ncapsulare, motenire, polimorfism. Obiectul este definit ca o entitate cu o identitate proprie, caracterizat printr-o stare i un comportament. Orice entitate a lumii reale este un obiect, i invers, orice obiect reprezint o entitate a realitii. Obiectele pot comunica ntre ele prin intermediul mesajelor. Identitatea unui obiect este proprietatea acestuia care l distinge de alte obiecte, ea fiind o adres logic invariabil. Dac n modelul relaional datele sunt identificate prin valorile cheilor primare definite de utilizato, n modelul orientat obiect, identificarea obiectelor este fcut automat de sistem la crearea acestora i este transparent utilizatorului. Dou obiecte O1 i O2 sunt identice (O1==O2) dac au acelai identificator; n schimb dou obiecte sun egale (O1=O2) dac au aceleai valori (O1==O2, implic O1=O2, reciproca nefiind valabil). Starea unui obiect este definit de valorile atributelor sale (realizrile). Un atribut se definete printr-un nume i poate lua valori elementare (numeric, alfanumeric) sau complexe (referine spre alte obiecte). Exemplu: Clientul CL1: Cod = 678 Denumire = S.C. N&L Localitate = Trgovite Comanda CDA1: Numr = 17865 Data = 10/12/2003 CotaTVA = 19% Client = CL1. Comportamentul unui obiect este definit ca un set de operaii aplicate obiectului respectiv. Operaiile unui obiect reprezint modalitile de rspuns la mesajele primite din exterior de obiectul respectiv; ele sunt de regul proceduri sau funcii ce acioneaz asupra obiectului respectiv. Abstractizarea este procesul prin care obiectele care au aceleai atribute i comportament similar sunt grupate n tipuri abstracte de obiecte numite i clase. Obiectele devin astfel instanieri (realizri) ale claselor; n timp ce obiectele descriu entiti ale realitii, clasele sunt reprezentri abstracte ale acestor entiti. Exemplu: Client, Comand, Student. ncapsularea const n capacitatea obiectelor de a conine la un loc att date ct i operaii, dar numai o parte a acestora este vizibil din exterior. Se poate spune c n felul aceste obiectele apar ca nite cutii negre, care ascund detaliile de implementare, ele oferind o interfa simpl de rezolvare a unei probleme. Motenirea este procesul prin care toate atributele i metodele vizibile ale unei clase (numit i clas se baz) sunt preluate n mod automat de o alt clas nrudit cu aceast (numit i subclas sau clas derivat). Clasele derivate pe lng acestea pot conine i atribute sau metode specifice. Motenirea se constituie ca o cale de ncurajare a partajrii i reutilizrii structurilor de date; prin intermediul ei se pot exprima relaii deosebit de importante ntre clase, cum ar fi: clasificarea, generalizarea sau specializarea. Exemplu: Se consider clasa PERSOANA definit prin atributele publice (vizibile din exterior): CNP, NumePrenume, DataNaterii, Sex i metoda public ReturneazVrsta(An). Din clasa PERSOANA pot fi derivate clasele ANGAJAT i STUDENT, de acelai fel cu ea, fiecare student angajat fiind descris prin CNP, nume i prenume, data naterii, sex i vrst, calculat n funcie de anul naterii. STUDENT poate conine ca atribute specifice NumrMatricol, AnStudiu iar ca metod proprie MediaGeneral, n timp ce clasa ANGAJAT poate fi descris prin atributele proprii Marca, DataAngajrii i metoda ReturneazVechime().

16

PERSOAN

ANGAJAT

STUDENT

Polimorfismul reprezint posibilitate unui obiect, instan a unei clase, de a rspunde n mod diferit la primirea aceluiai mesaj. Poate fi asigurat n dou variante: - redefinirea metodelor motenite n clasele derivate; - crearea unor metode cu acelai nume sar cu parametri diferii (suprancrcarea unei metode). Polimorfismul mrete flexibilitatea modelului orientat obiect de a reprezenta ct mai sintetic realitatea.

17

Sintez Prezentul capitol a fost dedicate celor patru modele de reprezentare a datelor n bazele de date: ierarhic, reea, relaional i obiectual. Conform modelului ierarhic datele incluse ntr-o baz de date ierarhic pot fi reprezentate sub forma unui arbore cu rdcina n sus. Un singur nod acioneaz ca rdcin, toate celelalte noduri comportndu-se ca ramuri care provin din rdcin. Modelul reea este oarecum similar modelului ierarhic, diferena constnd n faptul c spre deosebire de acesta (un nod printe poate avea mai muli fii), un nod fiu poate avea mai muli prini. Modelul relaional (introdus de Codd n 1970) se constituie astzi n cel mai utilizat model pentru gestionarea datelor. Are la baz conceptul de relaie din teoria matematic a mulimilor. Fa de celelalte modele are o serie de avantaje: independena sporit a programelor de aplicaie fa de modul de reprezentare intern a datelor i de metodele de acces la date; definirea unei structuri conceptuale optime, minimaliznd redundana datelor i erorile la actualizare; utilizarea unor limbaje procedurale bazate pe algebra relaional i a unor limbaje neprocedurale care contribuie la mbuntirea comunicrii dintre sistem i neinformaticieni. Pentru c modelul relaional nu permite o serie de operaii (descrierea unor structuri de date complexe; partajarea i reutilizarea structurilor de date; declararea prelucrrilor aferente structurilor de date) a aprut modelul orientat obiect. Obiectul este definit ca o entitate cu identitate proprie caracterizat printr-o stare (definit de valorile atributelor sale) i un comportament (definit ca un set de operaii aplicate obiectului respectiv). ntrebri recapitulative 1. n modelul ierarhic, cte noduri rdcin conine schema relaiei? 2. Corespunztor celor 3 tipuri de relaii, ncadrai corespunztor urmtoarele tipuri de nregistrri: BON CONSUM MATERIAL, PACIENT PROGRAMARE, MEDIC CONSULTAIE; STUDENT CURS; PRODUS DEPOZIT, CLIENT CAMERA. 3. Ce este o baz de date ierarhic? 4. Care este deosebirea dintre modelul ierarhic i cel reea? 5. Cine a pus bazele modelului relaional? 6. Ce st la baza modelului relaional? 7. Din ce este alctuit schema unei relaii? 8. Ce este domeniul? 9. Ce este atributul? 10. Care sunt restriciile la care sunt supuse relaii? 11. Din punct de vedere al modelului relaional, cum este privit o baz de date? 12. Ce este un tuplu? 13. Ce este cheia primar? 14. Care sunt restriciile cheii primare? 15. Care sunt restriciile de integritate? 16. Care sunt avantajele modelului relaional? 17. Care sunt limitele modelului relaional? 18. Definii obiectul (cu exemplificri). 19. n ce const ncapsularea. 20. Descriei conceptul de motenire cu exemplificri. 21. Ce este polimorfismul. Bibliografie selectiv

18

CAPITOLUL 3 ALGEBRA RELAIONAL Subiecte prezentate n acest capitol Caracterizarea general a limbajelor de programare Operatorii asambliti Operatorii relaionali Sintez Studiu de caz 3.1. Caracterizare general a limbajelor de interogare Bazele de date relaionale au ca principal obiectiv acoperirea nevoilor informaionale ale conducerii firmei la toate nivelurile ierarhice. Pn la consacrarea definitiv a SGBDR-urilor, extragerea informaiilor dorite din baza de date se realiza, n principal, prin aplicaii dezvoltate exclusiv prin intermediul limbajelor procedurale, n care se precizau att datele dorite ct i metodele de cutare i de extragere a acestora. Generalizarea SGBDR-urilor este strns legat de elaborarea i implementarea unor limbaje performante pentru manipularea bazelor de date limbajele de interogare. Limbajele relaionale sunt limbaje neprocedurale, n sensul c utilizatorul definete doar datele ce trebuie extrase din baza de date, sarcina cutrii i extragerii fiind n sarcina exclusiv a SGBD-ului. Limbajele de manipulare a datelor, plecnd de la cele dou modaliti de definire a unei relaii (ca predicat aplicat asupra unor domenii i ca ansamblu de tupluri), sunt grupate n dou mari categorii: limbaje predicative bazate pe teoria predicatelor; limbaje asambliste bazate pe teoria ansamblurilor (a tuplurilor). La rndul lor limbajele predicative sunt mprite n: limbaje care au la baz calculul relaional asupra tuplurilor; limbaje n care calculul relaional se aplic doar asupra domeniilor. Pentru limbajele de manipulare a datelor bazate pe calculul predicatelor, elementul definitoriu l constituie noiunea de variabil, noiune ce poate fi asociat att tuplurilor, ct i domeniilor. O alt clasificare este cea care realizeaz o delimitare ntre limbajele non-grafice i cele grafice. Prima categorie permite realizarea unei consultri prin dispunerea succesiv a operatorilor, atributelor i relaiilor, n timp ce a doua categorie permite redactarea consultrii n mod interactiv, prin afiarea pe ecran a unui sistem de meniuri i elemente de dialog din care opiunile pot fi selectate i modificate uor cu ajutorul mouse-ului Exist o serie de caracteristici comune tuturor limbajelor de interogare: rezultatul consultrii este o nou relaie ce poate servi, n continuare, ca argument ntr-o nou consultare; operatoriile relaionali se aplic relaiilor considerate n totalitatea lor, adic tuturor tuplurilor care alctuiesc relaiile respective; logica operatorilor se bazeaz pe valorile atributelor, aceasta constituind singurul mod de acces la baza de date. Accesul total independent de limbaj este asigurat prin compararea valorilor atributelor definite pe domenii compatibile. Pentru a se realiza o consultare ntr-un limbaj relaional, nainte de toate trebuie parcurs o faz de analiz, pentru determinarea rezultatului, a legturilor dintre tabele precum i a eventualelor restricii ce trebuie respectate. Algebra relaional cuprinde dou tipuri de operatori: asambliti (REUNIUNE, INTERSECIE, DIFEREN, PRODUS CARTEZIAN) i relaionali (SELECIE, PROIECIE, JONCIUNE, DIVIZIUNE).

19

ntr-o alt clasificare se face diferena ntre operatorii fundamentali, ireductibili (reuniunea, diferena, produsul cartezian, selecia i proiecia) i operatorii derivai, a cror funcionalitate poate fi realizat prin combinarea operatorilor fundamentali (intersecia, jonciunea i diviziunea). Pe parcursul acestui capitol se vor folosi notaiile: t un tuplu al unei relaii (o linie a unei tabele) i t(A), un subtuplu al relaiei R, relativ la atributul A (valoarea atributului A n linia t). Ca i calculul relaional, algebra relaional, servete ca punct de referin n caracterizarea unui limbaj ca fiind complet sau incomplet, din punct de vedere relaional. Dac un limbaj permite exprimarea tuturor operatorilor amintii anterior i ofer cel puin facilitii algebrei relaionale, se poate spune despre respectivul limbaj c este un limbaj complet relaional. 3.2. Operatorii asambliti Trei dintre operatorii asambliti reuniune (), intersecie () i diferen () pot opera numai cu dou relaii unicompatibile. Ce nelegem prin relaii unicompatibile? Fie R1 (A1, A2, .., An) i R2 (B1, B2,.., Bm) dou relaii. Spunem despre R1 i R2 c sunt unicompatibile dac: 1. n=m 2. i (1, 2, ., n), Ai i Bi sunt de acelai tip sintactic. Relaiile R1 i R2 din figura 3.1. sunt unicompatibile deoarece: 1. ambele au acelai numr de atribute; 2. atributele C1, C2, C3 din R1 (R1.C1, R1.C2, R1.C3) corespund sintactic atributelor C3, C4 i C5 (R2.C3, R2.C4, R2.C5). R1
C1 100 200 400 500 900 C2 AAA AAB ABA BBB ABB C3 500 750 250 700 400

R2
C3 500 300 400 700 900 C4 BBB BAA BBA AAA ABB C5 300 250 300 500 400

Figura 3.1. Relaiile R1 i R2 unicompatibile 3.2.1. Reuniunea Reuniunea a dou relaii R1 i R2, notat R3 R1 R2, este definit astfel: R1 R2 = {tuplu t | t R1 sau t R2}. Coninutul tabelei-reuniune R3 este prezentat n figura 3.2. Primele cinci tupluri din aceast tabel sunt preluate din R1, iar ultimele trei din R2. R3 conine opt tupluri deoarece dou din tupluri sunt comune tabelelor R1 i R2. Algebra relaional elimin automat duplicatele (tuplurile identice), n felul acesta asigurndu-se restricia de unicitate dup fiecare operaie. Reuniunea este comutativ. Singura problem neclar ar fi legat de numele atributelor n relaia rezultat, ns se poate institui regula conform creia numele atributelor relaiei-reuniune s fie numele atributelor primei relaii participante la operaie. R3
C1 100 200 400 500 C2 AAA AAB ABA BBB C3 500 750 250 700

20

900 300 400 700

ABB BAA BBA AAA

400 250 300 500

Figura 3.2. Reuniunea relaiilor R1 i R2 3.2.2. Intersecia Intersecia a dou relaii R1 i R2, notat R4 R1 R2, este definit astfel: R1 R2 = {tuplu t | t R1 i t R2}. Coninutul tabelei-intersecie este prezentat n figura 3.3. Deoarece doar dou tupluri sunt absolut identice i n R1 i n R2, tabela rezultat va fi alctuit doar din dou linii. Ca i reuniunea, intersecia este comutativ, iar numele atributelor relaiei intersecie sunt extrase din prima relaia participant la operaie. R4 C1 C2 C3 500 BBB 700 900 ABB 400 Figura 3.3. Intersecia relaiilor R1 i R2 3.2.3. Diferena Diferena a dou relaii R1 i R2, notat R5 R1 R2, este definit astfel: R1 R2 = {tuplu t | t R1 i t R2}. Coninutul tabelei-diferen (figura 3.4.) conine doar tuplurile din R1 care nu se regsesc n R2. Aadar, din rezultat sunt eliminate ultimele dou tupluri din R1, deoarece valorile acestora se regsesc i n R2 (primul i ultimul tuplu din R2). Spre deosebire de reuniune i intersecie, diferena nu este comutativ. Atributele relaieidiferen sunt cele ale primei relaii, iar tuplurile care sunt extrase din relaia-desczut nu se regsesc n relaia scztor. Pe lng asta, nu exist restricii privind cardinalitatea (numrul tuplurilor) celor dou relaii n sensul c nu este obligatoriu ca relaia desczut s conin mai multe tupluri dect cea scztor.

R5 C1 C2 100 AAA 200 AAB 400 ABA C3 500 750 250

Figura 3.4. Diferena relaiilor R1 i R2 3.2.4. Produsul cartezian Produsul cartezian dintre dou relaii R1 i R2, notat R6 R1 R2, este ansamblul tuturor tuplurilor obinute prin concatenarea fiecrei liniile din tabela R1 cu toate liniile din tabela R2. Este definit astfel: R1 R2 = {(t1, t2) | t1 R1 i t2 R2}

21

Spre deosebire de celelalte trei operaiuni precedente, produsul cartezian nu face apel la noiunea de relaii unicompatibile, iar relaia rezultat cumuleaz atributele celor dou relaii argument. n figura 3.5. este prezentat rezultatul produsului cartezian al tabelelor R1 i R2. R6 C1 C2 R1.C3 R2.C3 C4 C5 100 AAA 500 500 BBB 300 100 AAA 500 300 BAA 250 100 AAA 500 400 BBA 300 100 AAA 500 700 AAA 500 100 AAA 500 300 ABB 400 200 AAB 750 500 BBB 300 200 AAB 750 300 BAA 250 200 AAB 750 400 BBA 300 200 AAB 750 700 AAA 500 200 AAB 750 900 ABB 400 400 ABA 250 500 BBB 300 400 ABA 250 300 BAA 250 400 ABA 250 400 BBA 300 400 ABA 250 700 AAA 500 400 ABA 250 900 ABB 400 500 BBB 700 500 BBB 300 500 BBB 700 300 BAA 250 500 BBB 700 400 BBA 300 500 BBB 700 700 AAA 500 500 BBB 700 900 ABB 400 900 ABB 40 500 BBB 300 900 ABB 40 300 BAA 250 900 ABB 40 400 BBA 300 900 ABB 40 700 AAA 400 900 ABB 40 900 ABB 500 Figura 3.5. Produsul cartezian al relaiilor R1 i R2 Tabela-rezultat R6 are o structur nou cu ase atribute (trei preluate din R1 i trei din R2). Deoarece exist un atribut cu nume comun C3, pentru a deosebi cele dou apariii, acestea sunt prefixate, n antetul tabelei, cu numele relaiei din care provine atributul respectiv (R1.C3 i R2. C3). Prima linie din R6 este obinut prin unirea primului tuplu din R1 cu primul tuplu din R2, a doua din primul tuplu din R1 cu al doilea din R2 .a.m.d. Cum R1 are 5 tupluri i R2 tot 5, tabelarezultat a produsului cartezian va avea 5 * 5 = 25 tupluri. Nu prea exist situaii care s reclame folosirea direct i exclusiv a produsului cartezian. Cel mai important merit al acestuia n algebra relaional este c permite alipirea a dou relaii, fundamentnd astfel operatorul cheie care este jonciunea. 3.3. Operatorii relaionali Dac cei patru operatori prezentai n paragraful anterior sunt generali, cei din paragraful de fa sunt specifici algebrei relaionale. Sunt grupai n dou categorii: - operatori unari de restricie, care permit decupajul unei relaii, pe orizontal SELECIA i pe vertical PROIECIA;

22

- operatori binari de extensie: JONCIUNEA i DIVIZIUNEA. 3.3.1. Selecia Selecia triaz dintr-o tabel numai tuplurile care satisfac condiia specificat printr-un predicat. Se noteaz R1 SELECIE {R; expresie_logic} unde: - R este relaia R (A1, A2, ..., An) asupra creia se aplic selecia (Ai sunt atributele sale); - R1 este noua tabel obinut n urma seleciei, care va avea aceeai schem relaional cu R R1(A1, A2, ..., An) - expresie_logic este compus din operanzi care sunt nume de atribute sau constante, operatori de comparaie aritmetic (>, , <, , =, ) i operatori logici (I, SAU, NU). OBSERVAIE: Relaiile R1 i R2 folosite pentru exemplificare pe parcursul acestui subcapitol, sunt cele din figura 3.1. din subcapitolul anterior. Toate celelalte relaii folosite aici, precum i n capitolul urmtor (Limbajul de interogare SQL) sunt prezentate n anex. Exemplul 1. Care sunt liniile din R1 pentru care valorile atributului C1 sunt mai mici de 500? R SELECIE (R1; C1 > 500) R
C1 900 C2 ABB C3 500

Figura 3.6. Rezultat selecie exemplul 1 Exemplul 2. Care sunt liniile din R1 pentru care valorile atributului C3 sunt cuprinse n intervalul 250 350? R SELECIE (R1; C3 > = 250 AND C3 < = 350) R
C1 400 C2 ABA C3 250

Figura 3.7. Rezultat selecie exemplul 2 Exemplul 3. Care sunt liniile din R1 pentru care valorile atributelor C1 i C3 sunt mai mari dect 300? R SELECIE (R1; C1 > 300 AND C3 > 300) R C1 C2 C3 900 ABB 400 Figura 3.8. Rezultat selecie exemplul 3 Exemplul 4. Care sunt studenii Facultii de tiine Economice? Pentru a afla aceast informaie, mai nti trebuie s identificm n baza de date tabela (sau dup caz, tabelele) din care se extrage rezultatul. n cazul de fa, tabela este STUDENT. Apoi se stabilesc atributele din tabel, asupra crora se va aplica predicatul (atributul) de selecie. Se obine n felul acesta soluia: R SELECIE (STUDENT, facultate = Stiinte Economice) R
nr_matricol 1000 nume Popescu Ion Octavian facultate Stiinte Economice sectia CIG data_nasterii 10.10.1982 cod_localitate 0200

23

1001 1002 1003 1004 1005 1005 1006 1007 1008 1009 1010 1011

Radu Laurentiu Barbu Elena Popescu Marilena Petrescu Daniel Danciu Monica Dinescu Monica Stan Adrian Cristea Roxana Goia Simona Simionescu Dorin Stanciu Maria Radu Denisa

Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice

MG MG CIG MK CIG CIG FA CIG CIG FA CIG FA

03.12.1980 21.05.1975 03.02.1980 11.11.1973 03.04.1978 03.10.1974 17.03.1980 02.07.1978 01.01.1982 01.12.1978 19.10.1982 09.03.1970

0200 0200 1000 2000 0300 7000 0300 0200 1900 0300 0200 0300

Figura 3.9. Rezultat selecie exemplul 4 Exemplul 5. Care sunt studenii Facultii de tiine Economice, specializarea Contabilitate i Informatic de Gestiune? Tabela n care va opera operatorul de selecie este STUDENT. Predicatul de selecie va opera asupra atributelor facultate i sectia: R SELECIE (STUDENT, facultate = Stiinte Economice AND sectia = CIG) R
nr_matricol 1000 1003 1005 1005 1007 1008 1010 nume Popescu Ion Octavian Popescu Marilena Danciu Monica Dinescu Monica Cristea Roxana Goia Simona Stanciu Maria facultate Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice sectia CIG CIG CIG CIG CIG CIG CIG data_nasterii 10.10.1982 03.02.1980 03.04.1978 03.10.1974 02.07.1978 01.01.1982 19.10.1982 cod_localitate 0200 1000 0300 7000 0200 1900 0200

Figura 3.10. Rezultat selecie exemplul 5 Exemplul 6. Ce burse au fost ncasate n luna februarie 2004? Tabela n care va opera de aceast dat operatorul de selecie este tabela BURSA, iar atributul folosit este data_incasarii. R SELECIE (BURSA; data_incasarii >= 01/02/2004 AND data_incasarii <= 29/02/2004 R
nr_matricol 1001 1005 3000 1009 3002 1010 data_incasarii 02.02.2004 18.02.2004 16.02.2004 18.02.2004 20.02.2004 16.02.2004 tip_bursa Studiu Studiu Exceptionala Merit Studiu Sociala suma_incasata 1500000 1500000 2500000 2000000 1500000 1000000

Figura 3.11. Rezultat selecie exemplul 6 3.3.2. Proiecia Proiecia permite selectarea ntr-o tabel rezultat doar a atributelor dorite spre deosebire de selecie care extrage anumite linii dintr-o tabel pe baza condiiei ndeplinite de valorile unora dintre atribute. Cu alte cuvinte se realizeaz decuparea pe vertical a unei relaii. Proiecia relaiei R(A1, A2, , An) este o relaie care se obine dup parcurgerea a doi pai: 1. eliminarea din Ai a acelor atribute care nu sunt specificate

24

2. suprimarea tuplurilor identice (dublurile). Se noteaz: R1 PROIECIE {R; Aj, Ak, , Ax} Spre deosebire de R, schema relaiei R1 este alctuir numai din atributele indicate: R1 (Aj, Ak, ..., Ax). Dac dup extragerea coloanelor nu exist tupluri identice, R1 va avea acelai numr de linii ca i relaia R. n caz contrar, numrul lor va fi mai mic, n funcie de numrul dublurilor. Exemplul 7. Care sunt valorile atributului C3 n relaia R1? R PROIECIE (R1; C3) R
C3 500 750 250 700 400

Figura 3.12. Rezultat proiecie exemplul 7 Exemplul 8. Care sunt valorile combinaiei atributelor C1 i C3 n relaia R1? R PROIECIE (R1; C1, C3) R
C1 100 200 400 500 900 C3 500 750 250 700 400

Figura 3.12. Rezultat proiecie exemplul 8 Exemplul 9. Care sunt facultile preluate n baza de date? Tabela n care sunt preluate facultile este STUDENT. Singura coloan care ne intereseaz n acest caz este facultate. n prima faz se realizeaz decuparea pe vertical a coloanei respective, obinndu-se o relaie temporar notat R, iar apoi prin eliminarea duplicatelor se obine rezultatul final n relaia R. R PROIECIE (STUDENT; facultate) R
facultate Stiinte Economice Stiinte Economice Colegiul Economic Stiinte Juridice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Juridice Stiinte Economice Colegiul Economic Stiinte Economice Stiinte Economice Colegiul Economic Stiinte Economice Stiinte Juridice Stiinte Economice

R
facultate Colegiul Economic Stiinte Economice Stiinte Juridice

25

Colegiul Economic Stiinte Economice Stiinte Economice

Figura 3.13. Rezultat proiecie exemplul 9 Exemplul 10. S se identifice cota, titlul, domeniul i numrul de exemplare al fiecrei cri. Tabela care intereseaz este CARTE, iar din aceasta se decupeaz patru coloane: cota_carte, titlu, domeniu i nr_exemplare. R PROIECIE (CARTE; cota_carte, titlu, domeniu, nr_exemplare) R
cota_carte 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 titlu Sisteme expert Baze de date Conception orientee objets Contabilitate generala Economie Politica Object-Oriented Modelling Sql. Dialecte Drept comercial Politici si optiuni contabile Merise vers OMT et UML Bazele politici sociale Bazele contabilitatii Contabilitate generala Economie politica Teoria generala a dreptului Informatica de gestiune Economie politica Contabilitate de gestiune Baze contabilitatii Database Transaction Models domeniu Informatica Informatica Informatica Contabilitate Economie Informatica Informatica Drept Contabilitate Informatica Economie Contabilitate Contabilitate Economie Drept Informatica Economie Contabilitate Contabilitate Informatica nr_exemplare 24 30 12 10 9 12 5 10 60 5 10 14 100 46 89 100 120 120 100 6

Figura 3.14. Rezultat proiecie exemplul 10 3.3.3. nlnuirea consultrilor Dup cum am vzut, rezultatul unei consultri este o tabel (relaie) nou. Avnd n vedere acesta, pentru obinerea tabelei rezultat, se pot nlnui dou sau mai multe operaii redactndu-se astfel interogri complexe. Exemplul 11. Care este facultatea pe care o urmeaz studentul Barbu Elena? Folosind selecia se decupeaz din tabela STUDENT doar studentul care se numete Barbu Elena. Se obine n felul acesta o relaie nou, notat R1. Avnd n vedere c ne intereseaz doar facultatea, se aplic asupra lui R1 o proiecie i se obine relaia R2, n care se afl rspunsul la problema luat n discuie. R1 SELECIE (STUDENT, nume = Barbu Elena) R1
nr_matricol 1002 nume Barbu Elena facultate Stiinte Economice sectia MG data_nasterii 21.05.1975 cod_localitate 0200

R2 PROIECIE (R1, facultate) R2

26

nume Barbu Elena

Figura 3.15. Rezultat exemplul 11 Exemplul 12. Care sunt regiunile din care fac parte judeele Dmbovia i Vlcea? Tabela interogat este LOCALITATE. Pentru a rspunde la aceast variant pot fi formulate dou soluii. Soluia 1 figura 3.16. R1 SELECIE (LOCALITATE; judet = Dambovita OR judet = Valcea) R1
cod_localitate 0200 1000 0284 4331 nume_localitate Targoviste Ramnicu Valcea Fieni Gaesti cod_judet DB VL DB DB judet Dambovita Valcea Dambovita Dambovita regiune Muntenia Oltenia Muntenia Muntenia

R2 PROIECIE (R1; judet, regiune) R2


judet Dambovita Valcea regiune Muntenia Oltenia

Figura 3.16. Exemplul 12 soluia 1 Soluia 2 figura 3.17. R1 SELECIE (LOCALITATE; judet = Dambovita) R1
cod_localitate 0200 0284 4331 nume_localitate Targoviste Fieni Gaesti cod_judet DB DB DB judet Dambovita Dambovita Dambovita regiune Muntenia Muntenia Muntenia

R2 PROIECIE (R1; judet, regiune) R2


judet Dambovita regiune Muntenia

R3 SELECIE (LOCALITATE; judet = Valcea) R3


cod_localitate 1000 nume_localitate Ramnicu Valcea cod_judet VL judet Valcea regiune Oltenia

R4 PROIECIE (R3, judet, regiune) R4


judet Valcea regiune Oltenia

R5 R2 R4

R5
judet Dambovita regiune Muntenia

27

Valcea

Oltenia

Figura 3.17. Exemplul 12 soluia 2 Exemplul 13. Care sunt studenii Facultii de tiine Economice de la specializrile CIG i FA? Tabela interogat este STUDENT, iar rspunsul la aceast ntrebare poate fi formulat n 2 moduri. Soluia 1 figura 3.18. R1 SELECIE (STUDENT; facultate = Stiinte Economice AND sectia = CIG OR sectia = FA) R1
nr_matricol 1000 1003 1005 1005 1006 1007 1008 1009 1010 1011 nume Popescu Ion Octavian Popescu Marilena Danciu Monica Dinescu Monica Stan Adrian Cristea Roxana Goia Simona Simionescu Dorin Stanciu Maria Radu Denisa Facultate Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice sectia CIG CIG CIG CIG FA CIG CIG FA CIG FA data_nasterii 10.10.1982 03.02.1980 03.04.1978 03.10.1974 17.03.1980 02.07.1978 01.01.1982 01.12.1978 19.10.1982 09.03.1970 cod_localitate 0200 1000 0300 7000 0300 0200 1900 0300 0200 0300

R2 PROIECIE (R1; nume, sectia) R2


nume Popescu Ion Octavian Popescu Marilena Danciu Monica Dinescu Monica Stan Adrian Cristea Roxana Goia Simona Simionescu Dorin Stanciu Maria Radu Denisa sectia CIG CIG CIG CIG FA CIG CIG FA CIG FA

Figura 3.18. Exemplul 13 soluia 1 Soluia 2 figura 3.19. R1 SELECIE (STUDENT; facultate = Stiinte Economice AND sectia = CIG) R1
nr_matricol nume Facultate sectia data_nasterii cod_localitate

1000 1003 1005 1005 1007 1008 1010

Popescu Ion Octavian Popescu Marilena Danciu Monica Dinescu Monica Cristea Roxana Goia Simona Stanciu Maria

Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice

CIG CIG CIG CIG CIG CIG CIG

10.10.1982 03.02.1980 03.04.1978 03.10.1974 02.07.1978 01.01.1982 19.10.1982

0200 1000 0300 7000 0200 1900 0200

28

R2 PROIECIE (R1; nume, sectia) R2


nume Popescu Ion Octavian Popescu Marilena Danciu Monica Dinescu Monica Cristea Roxana Goia Simona Stanciu Maria sectia CIG CIG CIG CIG CIG CIG CIG

R3 SELECIE (STUDENT; facultate = Stiinte Economice AND sectia = FA) R3


nr_matricol 1006 1009 1011 nume Stan Adrian Simionescu Dorin Radu Denisa Facultate Stiinte Economice Stiinte Economice Stiinte Economice sectia FA FA FA data_nasterii 17.03.1980 01.12.1978 09.03.1970 cod_localitate 0300 0300 0300

R4 PROIECIE (R2; nume, sectia) R4


nr_matricol 1006 1009 1011 nume Stan Adrian Simionescu Dorin Radu Denisa sectia FA FA FA data_nasterii 17.03.1980 01.12.1978 09.03.1970 cod_localitate 0300 0300 0300

R5 R2 R4 R5
nume Popescu Ion Octavian Popescu Marilena Danciu Monica Dinescu Monica Cristea Roxana Goia Simona Stanciu Maria sectia CIG CIG CIG CIG CIG CIG CIG

Figura 3.19. Exemplul 13 soluia 2 Exemplul 14. Care sunt crile care au aprut att la editura Eficient i la editura Macarie? Tabela din care vor fi extrase datele este CARTE. Rezultatul se bazeaz pe intersecia relaiei care conine crile aprute la editura Eficient (R2) cu relaia care conine crile aprute la editura Macarie (R4). R1 R1 SELECIE (CARTE; editura = Eficient)
cota_carte 1114 titlu Contabilitate generala editura Eficient domeniu Contabilitate an_aparitie 1998 nr_exemplare 10 pret_unitar 265000

29

1115 1121 1122 1127

Economie Politica Bazele politici sociale Bazele contabilitatii Economie politica

Eficient Eficient Eficient Eficient

Economie Economie Contabilitate Economie

1999 1999 2002 2003

9 10 14 120

170000 160000 200000 230000

R2 PROIECIE (R2; titlu) R2


titlu Contabilitate generala Economie Politica Bazele politici sociale Bazele contabilitatii Economie politica

R3 SELECIE (CARTE; editura = Macarie) R3


cota_carte 1123 1124 1125 1126 1128 1129 titlu Contabilitate generala Economie politica Teoria generala a dreptului Informatica de gestiune Contabilitate de gestiune Baze contabilitatii editura Macarie Macarie Macarie Macarie Macarie Macarie domeniu Contabilitate Economie Drept Informatica Contabilitate Contabilitate an_aparitie 2003 2002 2000 2000 2002 2003 nr_exemplare 100 46 89 100 120 100 pret_unitar 200000 140000 175000 274000 190000 189000

R4 PROIECIE (R3; titlu) R4


titlu Contabilitate generala Economie politica Teoria generala a dreptului Informatica de gestiune Contabilitate de gestiune Baze contabilitatii

R5 R2 R4 R5
titlu Contabilitate generala Economie Politica Bazele politici sociale Economie politica Bazele contabilitatii Contabilitate generala Economie politica Teoria generala a dreptului Informatica de gestiune Contabilitate de gestiune Bazele contabilitatii editura Eficient Eficient Eficient Eficient Eficient Macarie Macarie Macarie Macarie Macarie Macarie

Figura 3.20. Exemplul 14 soluie 3.3.3. Jonciunea

30

Dup cum am vzut, produsul cartezian permite fuzionarea a dou tabele ntr-una singur ce conine toate atributele i liniile obinute prin combinarea fiecrui tuplu dintr-o relaia cu fiecare tuplu din cealalt. Jonciunea, spre deosebire de produsul cartezian care este o fuziune necondiionat a dou tabele, este o fuziune a dou relaii care au o proprietate comun. Fie dou relaii R1(A1, A2, , An) i R2(B1, B2, , Bp) i Ai i Bj dou atribute definite pe acelai domeniu i ansamblul operatorilor de comparaie {=, <, >, , , } ce pot fi aplicai celor dou atribute Ai i Bj. Jonciunea relaiei R1, prin Ai cu relaia R2, prin Bj notat R1 (Ai Bj) R2 este relaia ale crei tupluri sunt obinute prin concatenarea fiecrui tuplu al relaiei R1 cu tuplurile relaiei R2, pentru care este verificat condiia instituit ntre Ai i Bj. Se noteaz: R1 (Ai Bj) R2 = {t | t R1 R2 i t(Ai) t(Bj)}. Jonciunea este echivalent cu un produs cartezian urmat de o selecie. Aceast jonciune este cunoscut n literatura de specialitate sub denumirea de theta-jonciune. n lucrul cu bazele de date relaionale se utilizeaz cu precdere echi-jonciunea, ce reprezint un caz particular al theta-jonciunii, atunci cnd este operatorul de egalitate =. Se noteaz: R1 (Ai = Bj) R2 = {t | t R1 R2 i t(Ai) = t(Bj)}. Exemplul 15 Theta jonciune Pentru exemplificarea acestui operator se folosesc aceleai dou tabele R1 i R2. Rezultatul jonciunii (theta - jonciunii) exprimat prin expresia R JONCIUNE (R1, R2, R1.C1 > R2.C5), este obinut n 2 pai, dup cum se observ n figura urmtoare:
R1 C1 100 200 400 500 900 R2 C3 500 300 400 700 900 C2 AAA AAB ABA BBB ABB C3 500 750 250 700 400 R R1 R2 C1 C2 R1.C3 100 AAA 500 100 AAA 500 100 AAA 500 100 AAA 500 100 AAA 500 200 AAB 750 200 AAB 750 200 AAB 750 200 AAB 750 200 AAB 750 400 ABA 250 400 ABA 250 400 ABA 250 400 ABA 250 400 ABA 250 500 BBB 700 500 BBB 700 500 BBB 700 500 BBB 700 500 BBB 700 900 ABB 400 900 ABB 400 900 ABB 400 900 ABB 400 900 ABB 400 R2.C3 500 300 400 700 900 500 300 400 700 900 500 300 400 700 900 500 300 400 700 900 500 300 400 700 900 C4 BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB C5 300 250 300 500 400 300 250 300 500 400 300 250 300 500 400 300 250 300 500 400 300 250 300 400 500

C4 BBB BAA BBA AAA ABB

C5 300 250 300 500 400

R = SELECIE (R; C1 > C5) C1 C2 R1.C3 R2.C3 400 ABA 250 500 400 ABA 250 300 400 ABA 250 400 500 BBB 700 500

C4 BBB BAA BBA BBB

C5 300 250 300 300

31

500 500 500 900 900 900 900 900

BBB BBB BBB ABB ABB ABB ABB ABB

700 700 700 400 400 400 400 400

300 400 800 500 300 400 700 900

BAA BBA ABB BBB BAA BBA AAA ABB

250 300 400 300 250 300 500 400

Figura 3.21. Mecanismul de theta-joncionare exemplul 15 Exemplul 16 Echi jonciune Pentru a fi o echijonciune, operatorul de comparaie dintre cele dou atribute este, n mod obligatoriu, semnul de egalitate. R JONCIUNE (R1, R2; R1.C1 = R2.C5)

32

R1 C1 100 200 400 500 900 R2 C3 500 300 400 700 900

C2 AAA AAB ABA BBB ABB

C3 500 750 250 700 400

C4 BBB BAA BBA AAA ABB

C5 300 250 300 500 400

R R1 R2 C1 C2 100 AAA 100 AAA 100 AAA 100 AAA 100 AAA 200 AAB 200 AAB 200 AAB 200 AAB 200 AAB 400 ABA 400 ABA 400 ABA 400 ABA 400 ABA 500 BBB 500 BBB 500 BBB 500 BBB 500 BBB 900 ABB 900 ABB 900 ABB 900 ABB 900 ABB

R1.C3 500 500 500 500 500 750 750 750 750 750 250 250 250 250 250 700 700 700 700 700 400 400 400 400 400

R2.C3 500 300 400 700 900 500 300 400 700 900 500 300 400 700 900 500 300 400 700 900 500 300 400 700 900

C4 BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB

C5 300 250 300 500 400 300 250 300 500 400 300 250 300 500 400 300 250 300 500 400 300 250 300 400 500

R = SELECIE (R; C1 = C5) C1 C2 R1.C3 R2.C3 500 BBB 700 700

C4 AAA

C5 500

Figura 3.22. Echi-jonciune exemplul 16 Exemplul 17 Jonciune natural Jonciunea natural, pe lng faptul c presupune ca operatorul de comparaie s fie semnul de egalitate, implic i denumirea identic a atributelor de legtur ntre cele dou tabele. R JONCIUNE (R1, R2; R1.C3 = R2.C3) sau se poate folosi i forma simplificat, datorit faptului c ambele atribute au acelai nume R JONCIUNE (R1, R2; C3) Avnd n vedere c cele dou atribute au acelai nume, se poate considera c tabela rezultat pstreaz numai unul dintre cele dou atribute.

33

R1 C1 100 200 400 500 900 R2 C3 500 300 400 700 900

C2 AAA AAB ABA BBB ABB

C3 500 750 250 700 400

C4 BBB BAA BBA AAA ABB

C5 300 250 300 500 400

R R1 R2 C1 C2 100 AAA 100 AAA 100 AAA 100 AAA 100 AAA 200 AAB 200 AAB 200 AAB 200 AAB 200 AAB 400 ABA 400 ABA 400 ABA 400 ABA 400 ABA 500 BBB 500 BBB 500 BBB 500 BBB 500 BBB 900 ABB 900 ABB 900 ABB 900 ABB 900 ABB

R1.C3 500 500 500 500 500 750 750 750 750 750 250 250 250 250 250 700 700 700 700 700 400 400 400 400 400

R2.C3 500 300 400 700 900 500 300 400 700 900 500 300 400 700 900 500 300 400 700 900 500 300 400 700 900

C4 BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB BBB BAA BBA AAA ABB

C5 300 250 300 500 400 300 250 300 500 400 300 250 300 500 400 300 250 300 500 400 300 250 300 400 500

R = SELECIE (R; R1.C3 = R2.C3) C1 C2 C2 C3 C4 100 AAA 500 BBB 300 500 BBB 700 AAA 500 900 ABB 400 BBA 300

Figura 3.23. Jonciune natural exemplul 17 Deoarece selecia este un operator care se aplic doar unei singure tabele (operator unar), este necesar fuzionarea tabelelor din care se dorete extragerea datelor pentru obinerea unei relaii agregat, la care se aplic predicatul suplimentar de selecie. Fuzionarea tabelelor este posibil numai prin jonciune. Prin joncionarea tuturor relaiilor dintr-o baz de date se poate ajunge la o relaie universal Exemplul 18. S se afle pentru fiecare student bursier ce tip de burs primete i care este valoarea acesteia. Tabela STUDENT se joncioneaz cu tabela BURSA pe baza atributului comun (nr_matricol) iar la tabela intermediar rezultat, se aplic selecia. R1 JONCIUNE (STUDENT, BURSA, Nr_matricol) R1

34

Nr_matricol 1001 3000 1005 1005 2001 1006 1008 3002 1009 1010 1011

nume Radu Laurentiu Chivu Mihai Danciu Monica Dinescu Monica Danciu Mihaela Stan Adrian Goia Simona Balasa Maria Simionescu Dorin Stanciu Maria Radu Denisa

facultate Stiinte Economice Stiinte Juridice Stiinte Economice Stiinte Economice Colegiul Economic Stiinte Economice Stiinte Economice Stiinte Juridice Stiinte Economice Stiinte Economice Stiinte Economice

sectia MG UDR CIG CIG BIR FA CIG UDR FA CIG FA

data_nasterii 03.12.1980 20.05.1976 03.04.1978 03.10.1974 30.09.1978 17.03.1980 01.01.1982 17.09.1980 01.12.1978 19.10.1982 09.03.1970

cod_localitate 0200 7000 0300 7000 6500 0300 1900 0200 0300 0200 0300

data_incasarii 02.02.2004 16.02.2004 18.02.2004 18.02.2004 26.01.2004 30.01.2004 28.01.2004 20.02.2004 18.02.2004 16.02.2004 16.01.2004

tip_bursa Studiu Exceptionala Studiu Studiu Sociala Exceptionala Sociala Studiu Merit Sociala Sociala

suma_incasata 1500000 2500000 1500000 1500000 1000000 2500000 1000000 1500000 2000000 1000000 1000000

R2 PROIECIE (R1; nume, tip_bursa, suma_incasata) R2


nume Radu Laurentiu Chivu Mihai Danciu Monica Dinescu Monica Danciu Mihaela Stan Adrian Goia Simona Balasa Maria Simionescu Dorin Stanciu Maria Radu Denisa tip_bursa Studiu Exceptionala Studiu Studiu Sociala Exceptionala Sociala Studiu Merit Sociala Sociala suma_incasata 1500000 2500000 1500000 1500000 1000000 2500000 1000000 1500000 2000000 1000000 1000000

Figura 3.24. Exemplul 18 Exemplul 19. S se afle numele, facultate i secia studenilor care stau n cminul Miclas. Soluia 1. R1 JONCIUNE (STUDENT, STUDCAMIN; Nr_matricol) R1
Nr_matricol 1000 1004 3001 nume Popescu Ion Octavian Petrescu Daniel Croitoru Sebastian facultate Stiinte Economice Stiinte Economice Stiinte Juridice sectia CIG MK MU data_nasterii 10.10.1982 11.11.1973 24.04.1978 cod_localitate 0200 2000 0200 nume_camin Miclas Sportiv Camin nr. 1 camera 4 10 5 Strada Bdul. Independentei Ana Ipatescu Soseaua Gaesti

35

2001 1007 2002 1008 1009 2002 1010 1011

Danciu Mihaela Cristea Roxana Moraru Octavian Goia Simona Simionescu Dorin Delca Simona Stanciu Maria Radu Denisa

Colegiul Economic Stiinte Economice Colegiul Economic Stiinte Economice Stiinte Economice Colegiul Economic Stiinte Economice Stiinte Economice

BIR CIG BIR CIG FA MU CIG FA

30.09.1978 02.07.1978 07.06.1978 01.01.1982 01.12.1978 30.06.1982 19.10.1982 09.03.1970

6500 0200 6600 1900 0300 2000 0200 0300

Miclas Sportiv Miclas Sportiv Miclas Miclas Caminul nr. 2 Miclas

1 4 6 2 6 6 2 2

Bdul. Independentei Ana Ipatescu Bdul. Independentei Ana Ipatescu Bdul. Independentei Bdul. Independentei I.C. Bratianu Bdul. Independentei

R2 SELECIE (R1; nume_camin = Miclas) R2


Nr_matricol 1000 2001 2002 1009 2002 1011 nume Popescu Ion Octavian Danciu Mihaela Moraru Octavian Simionescu Dorin Delca Simona Radu Denisa facultate Stiinte Economice Colegiul Economic Colegiul Economic Stiinte Economice Colegiul Economic Stiinte Economice sectia CIG BIR BIR FA MU FA data_nasterii 10.10.1982 30.09.1978 07.06.1978 01.12.1978 30.06.1982 09.03.1970 cod_localitate 0200 6500 6600 0300 2000 0300 nume_camin Miclas Miclas Miclas Miclas Miclas Miclas camera 4 1 6 6 6 2 strada Bdul. Independentei Bdul. Independentei Bdul. Independentei Bdul. Independentei Bdul. Independentei Bdul. Independentei

R3 PROIECIE (R2; nume, facultate, sectia, nume_camin) R3


nume Popescu Ion Octavian Danciu Mihaela Moraru Octavian Simionescu Dorin Delca Simona Radu Denisa facultate Stiinte Economice Colegiul Economic Colegiul Economic Stiinte Economice Colegiul Economic Stiinte Economice sectia CIG BIR BIR FA MU FA nume_camin Miclas Miclas Miclas Miclas Miclas Miclas

Figura 3.25. Exemplul 19 soluia 1 Soluia 2. Mai nti se aplic relaia asupra tabelei STUDCAMIN iar tabela intermediar se joncioneaz cu STUDENT. R1 SELECIE (STUDCAMIN; nume_camin = Miclas) R1
nr_matricol 1000 2001 1009 2002 1011 nume_camin Miclas Miclas Miclas Miclas Miclas camera 4 1 6 6 2 strada Bdul. Independentei Bdul. Independentei Bdul. Independentei Bdul. Independentei Bdul. Independentei

R2 JONCIUNE (STUDENT, R1; Nr_matricol) R2

36

Nr_matricol 1000 2001 2002 1009 2002 1011

nume Popescu Ion Octavian Danciu Mihaela Moraru Octavian Simionescu Dorin Delca Simona Radu Denisa

facultate Stiinte Economice Colegiul Economic Colegiul Economic Stiinte Economice Colegiul Economic Stiinte Economice

sectia CIG BIR BIR FA MU FA

data_nasterii 10.10.1982 30.09.1978 07.06.1978 01.12.1978 30.06.1982 09.03.1970

cod_localitate 0200 6500 6600 0300 2000 0300

nume_camin Miclas Miclas Miclas Miclas Miclas Miclas

camera 4 1 6 6 6 2

strada Bdul. Independentei Bdul. Independentei Bdul. Independentei Bdul. Independentei Bdul. Independentei Bdul. Independentei

R3 PROIECIE (R2; nume, facultate, sectia, nume_camin) R3


nume Popescu Ion Octavian Danciu Mihaela Moraru Octavian Simionescu Dorin Delca Simona Radu Denisa facultate Stiinte Economice Colegiul Economic Colegiul Economic Stiinte Economice Colegiul Economic Stiinte Economice sectia CIG BIR BIR FA MU FA nume_camin Miclas Miclas Miclas Miclas Miclas Miclas

Figura 3.26. Exemplul 19 soluia 2 Care dintre cele dou variante este de preferat? A doua variant este mai bun dect prima, deoarece jonciunea opereaz asupra a dou tabele mai reduse ca dimensiuni (tabela STUDCAMIN deja a fost filtrat prin aplicarea predicatului de selecie). Diferena este cu att mai vizibil atunci cnd tabela STUDENT conine toi studenii dintr-o universitate. Iar dac ne gndim c naintea oricrei jonciuni se realizeaz produsul cartezian apare ndreptit amnarea jonciunii, pn cnd aceasta va opera asupra unor tabele cu un numr mai mic de linii i coloane. Exemplul 20. Care sunt crile scrise de Victor Stanciu ? Elementul de noutate n cazul acestui exemplu l reprezint faptul c se dorete obinerea unei informaii ce provine dintr-o relaie (atributul nume_carte din tabela CARTE), pe baza unei condiii aplicate altei relaii (atributul nume_autor din tabela AUTOR), iar cele dou relaii nu sunt n raport de printe copil. n asemenea situaii se recomand folosirea i a altor relaii, n cazul nostru tabela AUTORCARTE. Soluia 1: R1 JONCIUNE (CARTE, AUTORCARTE; cota_carte) R1
cota_carte 1111 1113 1114 1116 1119 1120 1122 1123 1126 1127 1128 titlu Sisteme expert Conception orientee objets Contabilitate generala Object-Oriented Modelling Politici si optiuni contabile Merise vers OMT et UML Bazele contabilitatii Contabilitate generala Informatica de gestiune Economie politica Contabilitate de gestiune editura Stiinta si Tehnica Adisson-Wesley Eficient Prentince Hall Economica InterEdition Eficient Macarie Macarie Eficient Macarie domeniu Informatica Informatica Contabilitate Informatica Contabilitate Informatica Contabilitate Contabilitate Informatica Economie Contabilitate

37

1129 1130

Baze contabilitatii Database Transaction Models

Macarie Morgan Kaufmann

Contabilitate Informatica

an_aparitie 1998 1994 1998 1996 2002 1998 2002 2003 2000 2003 2002 2003 1992

nr_exemplare 24 12 10 12 60 5 14 100 100 120 120 100 6

pret_unitar 140000 1000000 265000 600000 90000 563000 200000 200000 274000 230000 190000 189000 600000

cod_autor 11 28 44 29 66 29 44 44 78 89 44 88 12

R2

R2 JONCIUNE (R1,AUTOR; cod_autor)


cota_carte 1111 1113 1114 1116 1119 1120 1122 1123 1126 1128 1130 titlu Sisteme expert Conception orientee objets Contabilitate generala Object-Oriented Modelling Politici si optiuni contabile Merise vers OMT et UML Bazele contabilitatii Contabilitate generala Informatica de gestiune Contabilitate de gestiune Database Transaction Models editura Stiinta si Tehnica Adisson-Wesley Eficient Prentince Hall Economica InterEdition Eficient Macarie Macarie Macarie Morgan Kaufmann domeniu Informatica Informatica Contabilitate Informatica Contabilitate Informatica Contabilitate Contabilitate Informatica Contabilitate Informatica an_aparitie 1998 1994 1998 1996 2002 1998 2002 2003 2000 2002 1992 nr_exemplare 24 12 10 12 60 5 14 100 100 120 6

pret_unitar 140000 1000000 265000 600000 90000 563000 200000 200000 274000 190000 600000

cod_autor 11 28 44 29 66 29 44 44 78 44 12

nume_autor Dorin Stefanescu G. Booch Victor Stanciu J. Rumbaugh Maria Vencu J. Rumbaugh Victor Stanciu Victor Stanciu Eugen Nistor Victor Stanciu K. Elmagarmid

nationalitate Roman Francez Roman Englez Roman Englez Roman Roman Roman Roman Suedez

an_nastere 1954 1962 1950 1964 1957 1964 1950 1950 1967 1950 1960

R3 SELECIE (R2; nume_autor = Victor Stanciu) R3


cota_carte 1114 1122 1123 Titlu Contabilitate generala Bazele contabilitatii Contabilitate generala editura Eficient Eficient Macarie domeniu Contabilitate Contabilitate Contabilitate an_aparitie 1998 2002 2003 nr_exemplare 10 14 100

38

1128

Contabilitate de gestiune

Macarie

Contabilitate

2002

120

pret_unitar 265000 200000 200000 190000

cod_autor 44 44 44 44

nume_autor Victor Stanciu Victor Stanciu Victor Stanciu Victor Stanciu

nationalitate Roman Roman Roman Roman

an_nastere 1950 1950 1950 1950

R4 PROIECIE (R3; titlu) R4


titlu Contabilitate generala Bazele contabilitatii Contabilitate generala Contabilitate de gestiune

Figura 3.27. Exemplul 20 soluia 1 Soluia 2: R1 SELECIE (AUTOR, nume_autor = Victor Stanciu) R1
cod_autor 44 nume_autor Victor Stanciu nationalitate Roman an_nastere 1950

R2 PROIECIE (R1; cod_autor, nume_autor) R2


cod_autor 44 nume_autor Victor Stanciu

R3 JONCIUNE (R2,AUTORCARTE; nume_autor) R3


cod_autor 44 44 44 44 nume_autor Victor Stanciu Victor Stanciu Victor Stanciu Victor Stanciu cota_carte 1114 1122 1123 1128

R4 PROIECIE (R3; Cota_carte) R4


cota_carte 1114 1122 1123 1128

R5

R5 JONCIUNE (R4, CARTE; cota_carte)


cota_carte_a 1114 1122 1123 titlu Contabilitate generala Bazele contabilitatii Contabilitate generala editura Eficient Eficient Macarie domeniu Contabilitate Contabilitate Contabilitate an_aparitie 1998 2002 2003 nr_exemplare 10 14 100 pret_unitar 265000 200000 200000

39

1128

Contabilitate de gestiune

Macarie

Contabilitate

2002

120

190000

R6 PROIECIE (R5; titlu) R6


titlu Contabilitate generala Bazele contabilitatii Contabilitate generala Contabilitate de gestiune

Figura 3.28. Exemplul 20 soluia 2 naintea calculrii relaiei intermediare au fost eliminate nu numai tuplurile ci i atributele de prisos. Exemplul 21. Numele studenilor care au mprumutat cri din domeniul Informatic. i n acest caz se dorete obinerea unei informaii ce provine dintr-o tabel (atributul nume din tabela STUDENT) pe baza unei condiii aplicate unei alte tabele iar ntre cele dou tabele nu exist legtur printe copil. De aceast dat se folosete ca legtur tabela STUDCARTE. Soluia 1: R1 R1 JONCIUNE (STUDENT; STUDCARTE; nr_matricol)
nr_matricol 1000 1000 1000 1000 1000 2000 3000 1004 1004 1004 1008 1010 nume Popescu Ion Octavian Popescu Ion Octavian Popescu Ion Octavian Popescu Ion Octavian Popescu Ion Octavian Tudorache Octavian Chivu Mihai Petrescu Daniel Petrescu Daniel Petrescu Daniel Goia Simona Stanciu Maria facultate Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Colegiul Economic Stiinte Juridice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice sectia CIG CIG CIG CIG CIG BIR UDR MK MK MK CIG CIG data_nasterii 10.10.1982 10.10.1982 10.10.1982 10.10.1982 10.10.1982 02.04.1982 20.05.1976 11.11.1973 11.11.1973 11.11.1973 01.01.1982 19.10.1982 cod_localitate 0200 0200 0200 0200 0200 1000 7000 2000 2000 2000 1900 0200 cota_carte 1114 1120 1114 1127 1115 1126 1130 1119 1130 1115 1111 1126 data_imprumut 17.02.2004 18.02.2004 10.12.2003 16.02.2004 12.02.2004 12.02.2004 18.02.2004 18.02.2004 18.02.2004 12.02.2004 16.02.2004 17.02.2004

R2 JONCIUNE (R1, CARTE; cota_carte) R2


nr_matricol 1008 1000 1000 1004 nume Goia Simona Popescu Ion Octavian Popescu Ion Octavian Petrescu Daniel facultate Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice sectia CIG CIG CIG MK data_nasterii 01.01.1982 10.10.1982 10.10.1982 11.11.1973 cod_localitate 1900 0200 0200 2000 cota_carte 1111 1114 1114 1115 data_imprumut 16.02.2004 17.02.2004 10.12.2003 12.02.2004

40

1000 1004 1000 1010 2000 1000 3000 1004

Popescu Ion Octavian Petrescu Daniel Popescu Ion Octavian Stanciu Maria Tudorache Octavian Popescu Ion Octavian Chivu Mihai Petrescu Daniel

Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Colegiul Economic Stiinte Economice Stiinte Juridice Stiinte Economice

CIG MK CIG CIG BIR CIG UDR MK

10.10.1982 11.11.1973 10.10.1982 19.10.1982 02.04.1982 10.10.1982 20.05.1976 11.11.1973

0200 2000 0200 0200 1000 0200 7000 2000

1115 1119 1120 1126 1126 1127 1130 1130

12.02.2004 18.02.2004 18.02.2004 17.02.2004 12.02.2004 16.02.2004 18.02.2004 18.02.2004

titlu Sisteme expert Contabilitate generala Contabilitate generala Economie Politica Economie Politica Politici si optiuni contabile Merise vers OMT et UML Informatica de gestiune Informatica de gestiune Economie politica Database Transaction Models Database Transaction Models

editura Stiinta si Tehnica Eficient Eficient Eficient Eficient Economica InterEdition Macarie Macarie Eficient Morgan Kaufmann Morgan Kaufmann

domeniu Informatica Contabilitate Contabilitate Economie Economie Contabilitate Informatica Informatica Informatica Economie Informatica Informatica

an_aparitie 1998 1998 1998 1999 1999 2002 1998 2000 2000 2003 1992 1992

nr_exemplare 24 10 10 9 9 60 5 100 100 120 6 6

pret_unitar 140000 265000 265000 170000 170000 90000 563000 274000 274000 230000 600000 600000

R3 SELECIE (R2; domeniu = Informatica) R3


nr_matricol 1008 1000 1010 2000 3000 1004 nume Goia Simona Popescu Ion Octavian Stanciu Maria Tudorache Octavian Chivu Mihai Petrescu Daniel Facultate Stiinte Economice Stiinte Economice Stiinte Economice Colegiul Economic Stiinte Juridice Stiinte Economice sectia CIG CIG CIG BIR UDR MK data_nasterii 01.01.1982 10.10.1982 19.10.1982 02.04.1982 20.05.1976 11.11.1973 cod_localitate 1900 0200 0200 1000 7000 2000 cota_carte 1111 1120 1126 1126 1130 1130

data_imprumut 16.02.2004 18.02.2004 17.02.2004 12.02.2004 18.02.2004 18.02.2004

titlu Sisteme expert Merise vers OMT et UML Informatica de gestiune Informatica de gestiune Database Transaction Models Database Transaction Models

editura Stiinta si Tehnica InterEdition Macarie Macarie Morgan Kaufmann Morgan Kaufmann

domeniu Informatica Informatica Informatica Informatica Informatica Informatica

an_aparitie 1998 1998 2000 2000 1992 1992

nr_exemplare 24 5 100 100 6 6

pret_unitar 140000 563000 274000 274000 600000 600000

R4 PROIECIE (R3; nume) R4


nume Chivu Mihai Goia Simona Petrescu Daniel Popescu Ion Octavian

41

Stanciu Maria Tudorache Octavian

Figura 3.29. Exemplul 21 soluia 1 Soluia 2: R1 SELECIE (CARTE; domeniu = Informatica) R1


cota_carte 1111 1112 1113 1116 1117 1120 1126 1130 titlu Sisteme expert Baze de date Conception orientee objets Object-Oriented Modelling Sql. Dialecte Merise vers OMT et UML Informatica de gestiune Database Transaction Models editura Stiinta si Tehnica Infomega AdissonWesley Prentince Hall Polirom InterEdition Macarie Morgan Kaufmann domeniu Informatica Informatica Informatica Informatica Informatica Informatica Informatica Informatica an_aparitie 1998 2002 1994 1996 2001 1998 2000 1992 nr_exemplare 24 30 12 12 5 5 100 6 pret_unitar 140000 240000 1000000 600000 350000 563000 274000 600000

R2 JONCIUNE (R1, STUDCARTE; cota_carte) R2


cota_carte 1111 1120 1126 1126 1130 1130 titlu Sisteme expert Merise vers OMT et UML Informatica de gestiune Informatica de gestiune Database Transaction Models Database Transaction Models editura Stiinta si Tehnica InterEdition Macarie Macarie Morgan Kaufmann Morgan Kaufmann domeniu Informatica Informatica Informatica Informatica Informatica Informatica an_aparitie 1998 1998 2000 2000 1992 1992 nr_exemplare 24 5 100 100 6 6 pret_unitar 140000 563000 274000 274000 600000 600000

nr_matricol 1008 1000 1010 2000 1004 3000

data_imprumut 16.02.2004 18.02.2004 17.02.2004 12.02.2004 18.02.2004 18.02.2004

R3 PROIECIE (R2; nr_matricol) R3


nr_matricol 1008 1000 1010 2000 1004

42

3000

R4 JONCIUNE (R3, STUDENT; nr_matricol) R4


nr_matricol 1008 1000 1010 2000 1004 3000 nume Goia Simona Popescu Ion Octavian Stanciu Maria Tudorache Octavian Petrescu Daniel Chivu Mihai facultate Stiinte Economice Stiinte Economice Stiinte Economice Colegiul Economic Stiinte Economice Stiinte Juridice sectia CIG CIG CIG BIR MK UDR data_nasterii 01.01.1982 10.10.1982 19.10.1982 02.04.1982 11.11.1973 20.05.1976 cod_localitate 1900 0200 0200 1000 2000 7000

R5 PROIECIE (R4; nume) R5


nume Goia Simona Popescu Ion Octavian Stanciu Maria Tudorache Octavian Chivu Mihai Petrescu Daniel

Figura 3.30. Exemplul 21 soluia 2 Exemplul 22. Numele i secia studenilor facultii de tiine Economice care au mprumutat cartea Informatic de gestiune n perioada 15-29 februarie 2004. Relaia rezultat trebuie s conin valori ale atributelor nume i sectia din tabela STUDENT. Predicatul de selecie se aplic ns asupra tabelei CARTE (atributul nume_carte = Informatica de gestiune) i asupra tabelei STUDCARTE (atribut data_mprumut > = 15/02/2004 i data_mprumut < = 29/02/2004). R1 SELECIE (CARTE; titlu = Informatica de gestiune) R1
cota_carte 1126 titlu Informatica de gestiune editura Macarie domeniu Informatica an_aparitie 2000 nr_exemplare 100 pret_unitar 274000

R2 JONCIUNE (R1, STUD_CARTE; cota_carte) R2


cota_carte 1126 1126 titlu Informatica de gestiune Informatica de gestiune editura Macarie Macarie domeniu Informatica Informatica an_aparitie 2000 2000 nr_exemplare 100 100 pret_unitar 274000 274000

nr_matricol 1010 2000

data_imprumut 17.02.2004 12.02.2004

R3

R3 SELECIE (R2; data_imprumut > = 15/02/2004 AND data_imprumut < = 29/02/2004)


titlu editura domeniu an_aparitie nr_exemplare pret_unitar

cota_carte

43

1126

Informatica de gestiune

Macarie

Informatica

2000

100

274000

nr_matricol 1010

data_imprumut 17.02.2004

R4 PROIECIE (R3; nr_matricol) R4


nr_matricol 1010

R5 JONCIUNE (R4; STUDENT; nr_matricol) R5


nr_matricol 1010 nume Stanciu Maria facultate Stiinte Economice sectia CIG data_nasterii 19.10.1982 cod_localitate 0200

R6

R6 SELECIE (R5; facultate = Stiinte Economice)


nr_matricol 1010 nume Stanciu Maria facultate Stiinte Economice sectia CIG data_nasterii 19.10.1982 cod_localitate 0200

R7 PROIECIE (R6; nume, sectia) R7


nume Stanciu Maria sectia CIG

Figura 3.31. Exemplul 22 Exemplul 23. De la ce secii sunt studenii care au mprumutat i cartea Informatic de gestiune i cartea Contabilitate general? Rezultatul conine atributul sectia din tabela STUDENT, dar predicatul de selecie se aplic asupra tabelei CARTE. Soluia 1: R1 SELECIE (CARTE; titlu = Informatica de gestiune)
cota_carte 1126 titlu Informatica de gestiune editura Macarie domeniu Informatica an_aparitie 2000 nr_exemplare 100 pret_unitar 274000

R1

R2

R2 JONCIUNE (R1, STUD_CARTE; cota_carte)


cota_carte 1126 1126 titlu Informatica de gestiune Informatica de gestiune editura Macarie Macarie domeniu Informatica Informatica an_aparitie 2000 2000 nr_exemplare 100 100 pret_unitar 274000 274000

nr_matricol 1010

data_imprumut 17.02.2004

44

2000

12.02.2004

R3 JONCIUNE (R2, STUDENT; nr_matricol) R3


cota_carte 1126 1126 titlu Informatica de gestiune Informatica de gestiune editura Macarie Macarie domeniu Informatica Informatica an_aparitie 2000 2000 nr_exemplare 100 100 pret_unitar 274000 274000

nr_matricol 1010 2000

cota_carte 1126 1126

data_imprumut 17.02.2004 12.02.2004

nume Stanciu Maria Tudorache Octavian

facultate Stiinte Economice Colegiul Economic

sectia CIG BIR

data_nasterii 19.10.1982 02.04.1982

cod_localitate 0200 1000

R4 PROIECIE (R3; sectia) R4


sectia CIG BIR

R5 SELECIE (CARTE; titlu = Contabilitate generala) R5


cota_carte 1114 1123 titlu Contabilitate generala Contabilitate generala editura Eficient Macarie domeniu Contabilitate Contabilitate an_aparitie 1998 2003 nr_exemplare 10 100 pret_unitar 265000 200000

R6 JONCIUNE (R5, STUDCARTE; cota_carte) R6


cota_carte 1114 1114 titlu Contabilitate generala Contabilitate generala editura Eficient Eficient domeniu Contabilitate Contabilitate an_aparitie 1998 1998 nr_exemplare 10 10 pret_unitar 265000 265000

nr_matricol 1000 1010

data_imprumut 17.02.2004 10.12.2003

R7 JONCIUNE (R6, STUDENT; nr_matricol) R7


cota_carte 1114 1114 titlu Contabilitate generala Contabilitate generala editura Eficient Eficient domeniu Contabilitate Contabilitate an_aparitie 1998 1998 nr_exemplare 10 10 pret_unitar 265000 265000

nr_matricol 1010 1000

data_imprumut 10.12.2003 17.02.2004

nume Stanciu Maria Popescu Ion Octavian

facultate Stiinte Economice Stiinte Economice

sectia CIG CIG

data_nasterii 19.10.1982 10.10.1982

cod_localitate 0200 0200

R8 PROIECIE (R7; sectia) R8

45

sectia CIG

R9 R4 R8

R9
sectia CIG

Figura 3.32. Exemplul 23 soluia 1 Soluia 2: R1 SELECIE (CARTE; titlu = Informatica de gestiune) R1
cota_carte 1126 titlu Informatica de gestiune editura Macarie domeniu Informatica an_aparitie 2000 nr_exemplare 100 pret_unitar 274000

R2

R2 JONCIUNE (R1, STUD_CARTE; cota_carte)


titlu Informatica de gestiune Informatica de gestiune editura Macarie Macarie domeniu Informatica Informatica an_aparitie 2000 2000 nr_exemplare 100 100 pret_unitar 274000 274000

cota_carte 1126 1126

nr_matricol 1010 2000

data_imprumut 17.02.2004 12.02.2004

R3 JONCIUNE (R2, STUDENT; nr_matricol) R3


cota_carte_a 1126 1126 titlu Informatica de gestiune Informatica de gestiune editura Macarie Macarie domeniu Informatica Informatica an_aparitie 2000 2000 nr_exemplare 100 100 pret_unitar 274000 274000

nume Stanciu Maria Tudorache Octavian

facultate Stiinte Economice Colegiul Economic

sectia CIG BIR

data_nasterii 19.10.1982 02.04.1982

cod_localitate 0200 1000

R4

R4 SELECIE (CARTE; nume_carte = Contabilitate generala)


cota_carte 1114 1123 titlu Contabilitate generala Contabilitate generala editura Eficient Macarie domeniu Contabilitate Contabilitate an_aparitie 1998 2003 nr_exemplare 10 100 pret_unitar 265000 200000

R5 JONCIUNE (R4, STUDCARTE; cota_carte) R5


cota_carte 1114 1114 titlu Contabilitate generala Contabilitate generala editura Eficient Eficient domeniu Contabilitate Contabilitate an_aparitie 1998 1998 nr_exemplare 10 10 pret_unitar 265000 265000

nr_matricol

data_imprumut

46

1000 1010

17.02.2004 10.12.2003

R6

R6 JONCIUNE (R5, STUDENT; nr_matricol)


cota_carte 1114 1114 titlu Contabilitate generala Contabilitate generala editura Eficient Eficient domeniu Contabilitate Contabilitate an_aparitie 1998 1998 nr_exemplare 10 10 pret_unitar 265000 265000

nr_matricol 1010 1000

data_imprumut 10.12.2003 17.02.2004

nume Stanciu Maria Popescu Ion Octavian

facultate Stiinte Economice Stiinte Economice

sectia CIG CIG

data_nasterii 19.10.1982 10.10.1982

cod_localitate 0200 0200

R7

R7 JONCIUNE (R3; R6; sectia)


cota_carte 1114 1114 1126 titlu Contabilitate generala Contabilitate generala Informatica de gestiune editura Eficient Eficient Macarie domeniu Contabilitate Contabilitate Informatica an_aparitie 1998 1998 2000 nr_exemplare 10 10 100

pret_unitar 265000 265000 274000

data_imprumut 10.12.2003 17.02.2004 17.02.2004

nume Stanciu Maria Popescu Ion Octavian Stanciu Maria

facultate Stiinte Economice Stiinte Economice Stiinte Economice

sectia CIG CIG CIG

data_nasterii 19.10.1982 10.10.1982 19.10.1982

cod_localitate 0200 0200 0200

R8 PROIECIE (R7, sectia) R8


sectia CIG

Figura 3.33. Exemplul 23 soluia 2 n prima soluie s-a intersectat relaia seciilor studenilor care au mprumutat cartea Contabilitate general (R8) cu relaia studenilor care au mprumutat cartea Informatic de gestiune (R4). n cea de-a doua variant s-a operat direct jonciunea ntre R3 i R6. Exemplul 24. n ce cmin sunt cazai studenii care au mprumutat crile Informatic de gestiune i Contabilitate general, dar nu au mprumutat cartea Economie politic? Lucrurile n acest caz nu sunt att de complicate precum par la prima vedere, deoarece vom folosi elemente din exemplul anterior, plus operatorul diferen. R1 SELECIE (CARTE; titlu = Informatica de gestiune) R1
cota_carte 1126 titlu Informatica de gestiune editura Macarie domeniu Informatica an_aparitie 2000 nr_exemplare 100 pret_unitar 274000

47

R2 JONCIUNE (R1, STUD_CARTE; cota_carte) R2


cota_carte 1126 1126 titlu Informatica de gestiune Informatica de gestiune editura Macarie Macarie domeniu Informatica Informatica an_aparitie 2000 2000 nr_exemplare 100 100 pret_unitar 274000 274000

nr_matricol 1010 2000

data_imprumut 17.02.2004 12.02.2004

R3

R3 JONCIUNE (R2, STUDENT; nr_matricol)


titlu Informatica de gestiune Informatica de gestiune editura Macarie Macarie domeniu Informatica Informatica an_aparitie 2000 2000 nr_exemplare 100 100 pret_unitar 274000 274000

cota_carte 1126 1126

nr_matricol 1010 2000

data_imprumut 17.02.2004 12.02.2004

nume Stanciu Maria Tudorache Octavian

facultate Stiinte Economice Colegiul Economic

sectia CIG BIR

data_nasterii 19.10.1982 02.04.1982

cod_localitate 0200 1000

R4 JONCIUNE (R3, STUDCAMIN; nr_matricol) R4


cota_carte 1126 titlu Informatica de gestiune editura Macarie domeniu Informatica an_aparitie 2000 nr_exemplare 100 pret_unitar 274000

nr_matricol 1010

data_imprumut 17.02.2004

nume Stanciu Maria

facultate Stiinte Economice

sectia CIG

data_nasterii 19.10.1982

cod_localitate 0200

nume_camin Caminul nr. 2

camera 2

strada I.C. Bratianu

R5 PROIECIE (R4, nume_camin) R5


nume_camin Caminul nr. 2

R6 SELECIE (CARTE; nume_carte = Contabilitate general) R6


cota_carte 1114 1123 titlu Contabilitate generala Contabilitate generala editura Eficient Macarie domeniu Contabilitate Contabilitate an_aparitie 1998 2003 nr_exemplare 10 100 pret_unitar 265000 200000

R7 JONCIUNE (R6, STUDCARTE; cota_carte) R7


cota_carte 1114 1114 titlu Contabilitate generala Contabilitate generala editura Eficient Eficient domeniu Contabilitate Contabilitate an_aparitie 1998 1998 nr_exemplare 10 10 pret_unitar 265000 265000

48

nr_matricol 1000 1010

data_imprumut 17.02.2004 10.12.2003

R8

R8 JONCIUNE (R7, STUDENT; nr_matricol)


cota_carte 1114 1114 titlu Contabilitate generala Contabilitate generala editura Eficient Eficient domeniu Contabilitate Contabilitate an_aparitie 1998 1998 nr_exemplare 10 10 pret_unitar 265000 265000

nr_matricol 1010 1000

data_imprumut 10.12.2003 17.02.2004

nume Stanciu Maria Popescu Ion Octavian

facultate Stiinte Economice Stiinte Economice

sectia CIG CIG

data_nasterii 19.10.1982 10.10.1982

cod_localitate 0200 0200

R9 JONCIUNE (R8, STUDCAMIN; nr_matricol) R9


cota_carte 1114 1114 titlu Contabilitate generala Contabilitate generala editura Eficient Eficient domeniu Contabilitate Contabilitate an_aparitie 1998 1998 nr_exemplare 10 10 pret_unitar 265000 265000

nr_matricol 1010 1000

data_imprumut 10.12.2003 17.02.2004

nume Stanciu Maria Popescu Ion Octavian

facultate Stiinte Economice Stiinte Economice

sectia CIG CIG

data_nasterii 19.10.1982 10.10.1982

cod_localitate 0200 0200

nume_camin Caminul nr. 2 Miclas

camera 2 4

strada I.C. Bratianu Bdul. Independentei

R10 PROIECIE (R9; nume_camin) R10


nume_camin Caminul nr. 2 Miclas

R11 SELECIE (CARTE; nume_carte = Economie politica) R11


cota_carte 1124 1127 titlu Economie politica Economie politica editura Macarie Eficient domeniu Economie Economie an_aparitie 2002 2003 nr_exemplare 46 120 pret_unitar 140000 230000

R12

R12 JONCIUNE (R11, STUDCARTE; cota_carte)


titlu Economie politica editura Eficient domeniu Economie an_aparitie 2003 nr_exemplare 120 pret_unitar 230000

cota_carte 1127

nr_matricol

data_imprumut

49

1000

16.02.2004

R13 JONCIUNE (R12, STUDENT; nr_matricol) R13


cota_carte_a 1127 titlu Economie politica editura Eficient domeniu Economie an_aparitie 2003 nr_exemplare 120 pret_unitar 230000

nr_matricol 1000

data_imprumut 16.02.2004

nume Popescu Ion Octavian

facultate Stiinte Economice

sectia CIG

data_nasterii 10.10.1982

cod_localitate 0200

R14 JONCIUNE (R13, STUDCAMIN; nr_matricol) R14


cota_carte_a 1127 titlu Economie politica editura Eficient domeniu Economie an_aparitie 2003 nr_exemplare 120 pret_unitar 230000

nr_matrico 1000

data_imprumut 16.02.2004

nume Popescu Ion Octavian

facultate Stiinte Economice

sectia CIG

data_nasterii 10.10.1982

cod_localitate 0200

nume_camin Miclas

camera 4

strada Bdul. Independentei

R15 PROIECIE (R14; nume_camin) R15


nume_camin Miclas

R16 R5 R10 R15 R16


nume_camin Caminul nr. 2

Figura 3.34. Exemplul 24 Exemplul 25 Ce studeni studiaz la aceeai secie cu Dinescu Monica? Fa de interogrile de pn acum, condiia de selecie n acest caz este una indirect, n sensul c mai nti trebuie determinat secia la care studiaz Dinescu Monica. Apoi trebuie extrase din tabela STUDENT, liniile pentru care secia are valoarea seciei reper. R1 R1 SELECIE (STUDENT; nume = Dinescu Monica)
nume Dinescu Monica facultate Stiinte Economice sectia CIG data_nasterii 03.10.1974 cod_localitate 7000

nr_matricol 1005

R2 PROIECIE (R1; sectia) R2


sectia CIG

50

R3 JONCIUNE (R2, STUDENT; sectia) R3


nr_matricol 1000 1003 1005 1007 1008 1010 nume Popescu Ion Octavian Popescu Marilena Danciu Monica Cristea Roxana Goia Simona Stanciu Maria facultate Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice sectia CIG CIG CIG CIG CIG CIG data_nasterii 10.10.1982 03.02.1980 03.04.1978 02.07.1978 01.01.1982 19.10.1982 cod_localitate 0200 1000 0300 0200 1900 0200

R4 PROIECIE (R3; nume) R4


nume Popescu Ion Octavian Popescu Marilena Danciu Monica Cristea Roxana Goia Simona Stanciu Maria

Figura 3.35. Exemplul 25 3.3.4. Diviziunea Diviziunea este cel mai complex i mai greu de explicat dintre operatori. Codd l-a imaginat ca un operator invers produsului cartezian. Pentru al defini se pornete de la dou relaii R1(A,B) i R2(B). Diviziunea relaional R1R2 are ca rezultat o relaie definit ca ansamblul subtuplurilor R1(A), pentru care produsul lor cartezian cu R2(B) este un subansamblu al R1(A,B). Rezultatul expresiei R1R2 reprezint ctul diviziunii, ea fiind o relaie ce poate fi notat R3(A). ntr-o alt formulare ai R3 dac i numai dac bi R2 (ai, bi) R1. n continuare pentru simplitate A i B sunt considerate dou atribute, dei ele pot fi i grupe de atribute. n figura de mai jos este prezentat diviziunea relaional.

51

R1 A a1 a2 a3 a1 a3 a4 a1 a3 a6 a1 a3 a4 a1 a2 a3 a5 B b1 b1 b1 b2 b2 b2 b3 b3 b3 b4 b4 b4 b5 b5 b5 b5

R2 B b1 b2 b3 b4 R3 A a1 a2

Figura 3.36. Diviziunea relaional Determinarea relaiei R3 R1 R2 este sinonim cu a rezolva problema: care dintre a1, a2, a3, a4 i a5 apar n tupluri R1 mpreun cu toate valorile lui B din R2, respectiv b1, b2, b3, b4 i b5? Toate valorile atributului A din R1 sunt parcurse pe rnd: a1 apare cu b1 (n tuplul 1), cu b2 (n tuplul 2), cu b3 (n tuplul 7), cu b4 (n tuplul 10) i cu b5 (n tuplul 13). Prin urmare a1 ndeplinete condiie i va fi inclus n relaia R3; a2 apare cu b1 (n tuplul 2) dar nu apare cu b2 nu va face parte din R3; a3 apare cu b1 (n tuplul 3), cu b2 (n tuplul 5), cu b3 (n tuplul 8), cu b4 (n tuplul 11) i cu b5 (n tuplul 15) ndeplinete condiia i ca fi inclus n R3; a4 nu apare cu b1 nu va face parte din R3; a5 nu apare cu b1 nu va face parte din R3; n urma acestui raionament, tabele R3 va fi alctuit din dou tupluri (a1 i a3). Diviziunea relaional este deosebit de util pentru formularea consultrilor n care apare clauza (oricare ar fi) Sintez Acest capitol a realizat o prezentare detaliat nsoit de o serie de exemple practice a celor dou tipuri de operatori ai algebrei relaionale: asambliti i relaionali. Dac n primul subcapitol am caracterizat limbajele de interogare i am efectuat i o clasificare a acestora, n subcapitolul imediat urmtor, dedicat operatorilor asambliti, nu am realizat dect prezentarea fiecruia n parte (reuniune, intersecie, diferen i produs cartezian) nsoit de un singur exemplu i aceasta pentru c n partea de capitol dedicat operatorilor relaionali am revenit cu exemple detaliate. n ce privete operatorii relaionali, i-am grupat n dou categorii: unari de selecie i binari de extensie. Dac selecia extrage din tabel liniile pe baza unei condiii, proiecia permite selectarea doar a acelor atribute dorite. De asemenea, pe parcursul acestui capitol am insistat i asupra nlnuirii consultrilor, pentru c nu puine sunt cazurile n care obinerea tabelei rezultat reclam nlnuirea a dou sau

52

mai multe operaii, redactndu-se n felul acesta interogri complexe. Produsul cartezian este o fuziune necondiionat a 2 tabele, n timp ce jonciunea este o fuziune a 2 relaii care au o proprietate comun. Studiu de caz Se consider urmtoarea baz de date: PACIENT (codpacient, nume, prenume, datanasterii, localitate) PROGRAMARE (nrprogramare, dataprogramare, oraprogramare, codpacient, nrconsultatie) CONSULTATIE (nrconsultatie, tipconsultatie, codpacient, dataconsultatie) MEDICI (codmedic, numemedic, prenumemedic) MEDIC_CONSULTATIE (nrconsultatie, codmedic) TARIFE (tipconsultatie, tarif) Folosind operatorii algebrei relaionale s se determine: 1. Care sunt pacienii din Trgovite; 2. Care sunt pacienii din Trgovite i Titu; 3. Care pacieni nu sunt din Trgovite i Titu; 4. Care sunt pacienii care s-au nscut n anul 1989; 5. Care sunt tarifele mai mari de 25 RON; 6. Din ce localiti sunt pacienii din baz; 7. Care este nume i prenumele medicilor care ofer consultaii; 8. Care sunt tarifele practicate; 9. Din ce localitate sunt pacienii nscui n luna ianuarie 1990; 10. Care sunt orele pentru care sunt prevzute consultaii n data de 09.02.2006; 11. Cum se numesc pacienii din Trgovite i Moreni; 12. Care este prenumele medicilor cu numele de familie Ghionea; 13. La ce data i la ce or are programare Popa Georgeta; 14. Care sunt datele la care au fcut programare pacienii din Trgovite; 15. Numele pacienilor care au fost consultai n luna februarie 2006; 16. Data la care a fcut programare Dinescu Mircea i Vancea Ioan; 17. Numele medicilor care au acordat consultaii n data de 23.02.2006; 18. De ce medic a fost consultat Popa Georgeta; 19. Numele pacienilor consultai de Grecu Anca; 20. Nume pacienilor care au fcut programare i n luna ianuarie i n luna februarie 2006; 21. Care este tariful consultaiei pacientului Popa Georgeta; 22. Numele pacienilor care au fcut programare n data de 10.02.2006 n intervalul 14-16; 23. Datele la care au efectuat consultaii Grecu Anca i Minea Ion n luna februarie 2006; 24. Numele i prenumele medicilor care au consultat pacieni din Trgovite i Moreni dar nu din Titu; 25. Numele pacienilor consultai de Grecu Anca n luna februarie 2006; 26. Data la care au fost consultai pacienii care au fcut programare n data de 10.02.2006; 27. Nume pacienilor care au avut programare n data de 10.02.2006 n intervalul 12-14 i au fost consultai de ctre Grecu Anca. Bibliografie selectiv

53

CAPITOLUL 4 LIMBAJUL DE INTEROGARE RELAIONAL SQL Subiecte prezentate n acest capitol Prezentare general Elemente de baz ale interogrilor SQL Coloane expresii Opiunea ORDER BY Operatorii LIKE, BETWEEN, IN Theta i echijonciunea Sinonime locale i jonciunea unei tabele cu ea nsi Subconsultri Funcii agregat Gruparea tuplurilor Sintez Studiu de caz 4.1. Prezentare general n prezent SQL (Structured Query Language) este unul dintre cele mai puternice limbaje structurate pentru interogarea bazelor de date relaionale. Literele S de la Structured (structurat) i L de la Language (limbaj) sunt destul de sugestive, n schimb, litera Q de la Query (interogare), dac este analizat din punct de vedere literal, poate provoca unele confuzii n sensul c se limiteaz doar la a pune ntrebri bazei de date. Din fericire, SQL face mult mai mult dect att: se pot crea tabele, se adaug, se modific sau se terg date, se combin i se memoreaz interogrile n cadrul bazei de date. Istoria SQL ncepe n laboratoarele firmei IBM, unde limbajul a fost dezvoltat n ultimii ani ai deceniului 8, odat cu lansarea proiectului System/R. Dei este uor accesibil utilizatorilor nceptori, el nu rmne dator nici programatorilor experimentai, punndu-le la dispoziie faciliti deosebite. Datorit puterii sale relaionale, a uurinei n nelegere i utilizare, SQL a fost ales de ANSI (American National Standards Organization Organizaia pentru Standarde Naionale Americane) i apoi de ctre ISO (International Standards Organization Organizaia pentru Standarde Internaionale) drept limbaj standard pentru lucru cu baze de date relaionale. Pe parcursul crii standardul pentru SQL avut n vedere este standardul ANSI-92. Standardul SQL-92 propune 3 niveluri de conformitate: nivelul de intrare (entry level), nivelul intermediar (intermediate level) i nivelul maximal (full level). Fiecare firm i declar nivelul de conformitate al propriului SGBD n raport de SQL-92. Limbajul SQL este un limbaj neprocedural (sau declarativ), termenul de neprocedural fiind vzut mai degrab prin ce dect prin cum, n sensul c nu se specific dect ce informaie este solicitat i nu cum este obinut aceast informaie. SQL poate fi utilizat autonom (manipularea interactiv a bazei de date) sau poate fi utilizat prin inserare de comenzi SQL ntr-un limbaj de programare. Instruciunile SQL n funcie de rolul avut n manipularea datelor i a tranzaciilor se pot grupa astfel: instruciuni pentru definirea datelor care asigura descrierea structurii bazei de date; instruciuni de manipulare a datelor ce au ca scop adugarea, modificarea i tergerea nregistrrilor; instruciuni de selecie a datelor care permit consultarea bazei de date; instruciuni de procesare a tranzaciilor ce reprezint operaii multiple de manipulare a datelor; instruciuni de control al cursorului;

54

instruciuni privind controlul accesului la date. Exist trei metode de baz privind implementarea limbajului SQL: prin apelare direct (Direct Invocation) care presupune introducerea instruciunilor SQL direct de la prompter; metoda modular (Modul Language) care folosete proceduri apelate de programele aplicaiei; metoda de tip ncapsulat (Embedded SQL) care permite ncapsularea instruciunilor n codul de program. 4.2. Elemente de baz ale interogrilor SQL Modalitatea prin care, pornind de la o schem relaional, pot fi obinute diverse informaii dintr-o baz de date se numete interogare (QUERY), iar formularea unei interogri nseamn redactarea unei fraze SELECT. Termenul de interogare este oarecum impropriu. O interogare SQL nu este neaprat o ntrebare pus bazei de date. Ea poate fi i o comand pentru executarea uneia din aciunile urmtoare: - s construiasc sau s tearg o baz de date; - s insereze, s modifice sau s tearg linii sau cmpuri; - s caute n cteva tabele o anumit informaie i s returneze rezultatele ntr-o anumit ordine; - s modifice securitatea informaiilor. O fraz SELECT are un format simplu i flexibil. Cele trei clauze principale sunt SELECT, FROM i WHERE dintre care doar primele dou sunt obligatorii. Sintaxa oarecum simplificat a unei interogri SQL este urmtoarea: SELECT [ALL/DISTINCT/] lista_atribute FROM lista_tabele [WHERE criteriu_de_cutare] [GROUP BY atribut_de_grupare] [HAVING criteriu_de_grupare] [ORDER BY criteriu_de_ordonare [ASC/DESC]]; unde: lista_atribute - specific atributele ale cror valori vor fi returnate nume-tabele - specific tabelele din care se vor extrage datele ALL - specific returnarea tuturor tuplurilor care ndeplinesc condiiile precizate n blocul de cerere DISTINCT - elimin tuplurile care prezint valori duplicate coninute n atributele specificate WHERE - permite, prin precizarea unei expresii, exprimarea criteriului de selecie ORDER BY - precizeaz atributul dup care se va face ordonarea GROUP BY - folosit pentru a partiiona o relaie n grupuri, acordnd acestora valori pe un atribut sau list de atribute HAVING - folosit pentru a specifica criterii de selecie pe grupuri de tupluri n continuare este realizat o paralel ntre clauzele principale ale frazei SELECT cu operatorii algebrei relaionale prezentai n capitolul 3 Algebra relaional. Selecie i proiecie

55

Clauza SELECT n algebra relaional corespunde operatorului proiecie, ea fiind folosit pentru a desemna care sunt coloanele care vor aprea n rezultat. Clauza FROM este folosit pentru a enumera tabelele (relaiile) din care vor fi extrase informaiile aferente consultrii. Prin clauza WHERE este desemnat predicatul selectiv al algebrei relaionale, ce se aplic atributelor din relaiile care apar n clauza FROM. O consultare simpl n SQL, la modul cel mai general i simplist, poate fi prezentat astfel: SELECT C1, C2, ..., Cn FROM T1, T2, ..., Tm WHERE P Rezultatul unei astfel de fraze SQL se prezint sub o form tabelar. Aceast form poate fi o list (text), o tabel propriu-zis sau o tabel temporar, dar i o tabel derivat (imagine). Sunt i cazuri n care rezultatul poate fi obinut i ca o variabil masiv (tablou). Ci reprezint coloanele (care pot fi atribute sau expresii de atribute) rezultat); Tj tabelele ce trebuie parcurse pentru obinerea rezultatului; P predicatul (condiia) simplu sau compus ce trebuie ndeplinit de tupluri pentru a putea fi incluse n rezultat. Atunci cnd clauza WHERE nu este prezent, se consider n mod implicit c valoarea logic a predicatului P este adevrat i n consecin, toate liniile din tabela sau produsul cartezian al tabelelor specificat/specificate n clauza FROM vor fi incluse n rezultat. Dac n locul coloanelor C1, C2, ..., Cn, apare simbolul * (asterisc), rezultatul va fi format din toate atributele tabelelor specificate n clauza FROM. De asemenea, numele atributelor rezultatului sunt numele atributelor din tabela (tabelele) specificat n FROM. Dac se dorete schimbarea acestui nume rezultat se apeleaz la clauza AS. Conform restriciei de unicitate, ntr-o relaie nu pot exista dou linii identice. n schimb, n SQL, tabela obinut dintr-o consultare poate conine dou sau mai multe tupluri identice. Spre deosebire de algebra relaional, unde tuplurile identice (dublurile) sunt eliminate automat din rezultat, n SQL nu se ntmpl acelai lucru. Pentru aceasta este necesar folosirea opiunii DISTINCT. SELECT DISTINCT C1, C2, ..., Cn FROM T1, T2, ..., Tm WHERE P Din cele prezentate pn acum se poate trage concluzia c o fraz SELECT corespunde: - unei proiecii (SELECT C1), - unui produs cartezian (FROM R1 R2 ... Rm), - unei selecii algebrice (WHERE P). i conduce la obinerea unui rezultat cu n coloane, fiecare coloan fiind un atribut din T1, T2, ..., Tm sau expresie calculat pe baza unor atribute din T1, T2, ..., Tm. n continuare, pe baza exemplelor din capitolul 3, vom transpune n SQL, cteva interogri din algebra relaional. Exemplul 1. Selecie SELECT * FROM R1 WHERE C1>500 Exemplul 2. Selecie SELECT * FROM R1 WHERE C3>250 AND C3<=350 Exemplul 3. Selecie

56

SELECT * FROM R1 WHERE C1>300 AND C3>300 Exemplul 4. Care sunt studenii Facultii de tiine Economice? SELECT * FROM STUDENT WHERE facultate = Stiinte Economice Exemplul 5. Care sunt studenii Facultii de tiine Economice, specializarea Contabilitate i Informatic de Gestiune? SELECT * FROM STUDENT WHERE facultate = Stiinte Economice AND sectia = CIG Exemplul 6. Ce burse au fost ncasate n februarie 2004? Formatul general al unei constante de tip dat calendaristic este YYYY-MM-DD, interogarea n SQL-92 poate avea forma. SELECT * FROM BURSA WHERE data_ncasarii>=2004/02/01 AND data_ncasarii<=2004/02/29 n Visual FoxPro aceeai interogare este de forma: SELECT *; FROM BURSA; WHERE data_ncasarii>={^2004/02/01} AND; data_ncasarii<={^2004/02/29} Observaie: n Visual Foxpro caracterul ; este folosit pentru a specifica faptul c o comand este scris pe mai multe linii. Exemplul 7. Proiecie SELECT C3 FROM R1 Exemplul 8. Proiecie SELECT C1, C3 FROM R1 Exemplul 9. Care sunt facultile preluate n baz? SELECT facultate FROM STUDENT SQL, spre deosebire de algebra relaional, nu elimin automat duplicatele. Tabela obinut prin consultarea de mai sus are forma tabelei R (figura 3.13.). Pentru a obine rezultatul de forma tabelei R (o facultate s apar o singur dat), se folosete clauza DISTINCT. Exemplu 10. Care sunt: cota, titlul, domeniul i numr de exemplare al fiecrei cri? SELECT cota_carte, titlu, domeniu, nr_exemplare FROM CARTE

57

n acest caz nu este necesar clauza DISTINCT, deoarece cota_carte este cheia primar a tabelei CARTE. Exemplul 11. Care este facultatea pe care o urmeaz studentul Barbu Costel? SELECT facultate FROM STUDENT WHERE nume = Barbu Costel Exemplul 12. Care sunt regiunile din care fac parte judeele Dmbovia i Vlcea? SELECT judet, regiune FROM LOCALITATE WHERE judet = Dambovita OR judet = Valcea Exemplul 13. Care sunt studenii Facultii de tiine Economice de la specializrile CIG i FA? SELECT nume, sectia FROM STUDENT WHERE facultate = Stiinte Economice AND sectia = CIG OR sectia = FA Exemplul 14. Care sunt crile care au aprut la editurile Eficient i Macarie? SELECT titlu FROM CARTE WHERE editura = Eficient OR editura = Macarie Reuniune, intersecie, diferen, produs cartezian Primii trei operatori asambliti prezint operatori SQL dedicai: UNION, INTERSECT, MINUS (EXCEPT) n timp ce produsul cartezian se obine automat prin simpla enumerare a celor dou tabele n clauza FROM. Reuniunea Un rezultat identic cu tabela R3 din figura 3.2., se obine prin urmtoarea fraz SELECT: SELECT * FROM R1 UNION SELECT * FROM R2 Revenind la exemplul 13 din capitolul 3 - Care sunt studenii Facultii de tiine Economice de la specializrile CIG i FA? -, fraza SQL echivalent cu soluia 2 bazat pe reuniune este: SELECT nume FROM STUDENT WHERE facultate = Stiinte Economice AND sectia = CIG UNION SELECT nume FROM STUDENT WHERE facultate = Stiinte Economice AND sectia = FA Intersecia Raportndu-ne la exemplul din figura 3.3. , echivalentul tabelei R4 se obine n SQL prin:

58

SELECT * FROM R1 INTERSECT SELECT * FROM R2 Pentru o prim reprezentare a utilizrii interseciei, transcriem soluia din algebra relaional formulat la exemplul 14 - Care sunt crile care au aprut la editurile Eficient i Macarie? SELECT titlu FROM CARTE WHERE editura = Eficient INTERSECT SELECT tilu FROM CARTE WHERE editura = Macarie Exemplul de mai sus funcioneaz n Oracle, nu ns i n Visual FoxPro, care nu are implementat operatorul INTERSECT, astfel nct intersecia trebuie realizat folosind alte clauze i operatori. Diferena Operatorul la care ne-am atepta n acest caz ar fi MINUS. n Standardul SQL 92 i n alte cteva SGBD-uri operatorul MINUS nu exist, el fiind substituit de EXCEPT, n timp ce n alte SGBD-uri nu exist nici unul, nici altul. Tabela R5 din figura 3.4., calculat prin expresia R1 R2, n SQL se obine prin interogarea:

59

SELECT * FROM R1 EXCEPT SELECT * FROM R2 Ca i pentru INTERSECT, Visual FoxPro nu are implementat un operator SQL pentru realizarea diferenei a dou relaii. Produsul cartezian SQL nu pune la dispoziie vreun operator special dedicat produsului cartezian i asta din simplul motiv c nici nu este nevoie s o fac. Tabela R6 din figura 3.5., se obine pur i simplu prin enumerarea celor dou relaii n clauza FROM. SELECT * FROM R1, R2 4.3. Coloane expresii n multe interogri SQL o facilitate important o constituie definirea, pe lng atributele tabelelor, a unor coloane noi (virtuale), pe baza unor expresii. Clauza AS permite denumirea coloanelor calculate sau redenumirea unor coloane ale tabelelor. S lum urmtorul exemplu: Care este suma cheltuit cu achiziionarea crii Informatic de gestiune? SELECT titlu, pret_unitar, nr_exemplare, pret_unitar*nr_exemplare AS suma FROM CARTE WHERE titlu = Informatica de gestiune Rezultatul acestei interogri este prezentat n figura urmtoare:
titlu Informatica de gestiune pret_unitar 274000 nr_exemplare 100 suma 27400000

Figura 4.1. Exemplu de coloan calculat A patra coloan este denumit suma, dup cum a fost specificat n clauza AS. Valorile sale sunt determinate pe baza expresiei pret_unitar*nr_exemplare. Un alt tip de expresii este cel bazat pe concatenare, adic pe alipirea mai multor constante i variabile ntr-o coloan nou. Operatorul SQL pentru concatenare este alctuit din dou bare verticale (||). Spre exemplu, interogarea urmtoare produce rezultatul din figura 4.2. . SELECT Judeul || judet || se afl n || regiune AS exemplu_concatenare FROM LOCALITATE
exemplu_concatenare Judetul Arges se afla n Muntenia Judetul Bucuresti se afla n Muntenia Judetul Constanta se afla n Dobrogea Judetul Dambovita se afla n Muntenia Judetul Iasi se afla n Moldova Judetul Prahova se afla n Muntenia Judetul Timis se afla n Transilvania Judetul Valcea se afla n Oltenia Judetul Vaslui se afla n Moldova

60

Figura 4.2. Concatenarea unor literali i atribute ir de caractere Unele SGBD-uri, precum Visual FoxPro, nu au implementat acest operator, folosind n acest scop unul specific (n cazul VFP este +). SELECT DISTINCT "Judetul " + ALLTRIM(judet)+; " se afla n " + regiune AS; exemplu_concatenare FROM LOCALITATE S-a folosit funcia ALLTRIM() pentru a elimina toate spaiile goale din judet. Visual FoxPro folosete pentru conversia valorilor din numeric n ir de caractere funcia STR(), iar din dat calendaristic, dup caz, DTOC() sau DTOS(): SELECT ALLTRIM(Nume) + cu numrul matricol ; + ALLTRIM(STR (nr_matricol)) + s-a nscut; n data + ALLTRIM(DTOC(data_nasterii)); AS exemplu_concatenare; FROM STUDENT
exemplu_concatenare Popescu Ion Octavian cu numrul matricol 1000 s-a nscut n data 10/10/82 Radu Laurentiu cu numrul matricol 1001 s-a nscut n data 12/03/80 Tudorache Octavian cu numrul matricol 2000 s-a nscut n data 04/02/82 Chivu Mihai cu numrul matricol 3000 s-a nscut n data 05/20/76 Barbu Elena cu numrul matricol 1002 s-a nscut n data 05/21/75 Popescu Marilena cu numrul matricol 1003 s-a nscut n data 02/03/80 Petrescu Daniel cu numrul matricol 1004 s-a nscut n data 11/11/73 Danciu Monica cu numrul matricol 1005 s-a nscut n data 04/03/78 Croitoru Sebastian cu numrul matricol 3001 s-a nscut n data 04/24/78 Dinescu Monica cu numrul matricol 1005 s-a nscut n data 10/03/74 Danciu Mihaela cu numrul matricol 2001 s-a nscut n data 09/30/78 Stan Adrian cu numrul matricol 1006 s-a nscut n data 03/17/80 Cristea Roxana cu numrul matricol 1007 s-a nscut n data 07/02/78 Moraru Octavian cu numrul matricol 2002 s-a nscut n data 06/07/78 Goia Simona cu numrul matricol 1008 s-a nscut n data 01/01/82 Balasa Maria cu numrul matricol 3002 s-a nscut n data 09/17/80 Simionescu Dorin cu numrul matricol 1009 s-a nscut n data 12/01/78 Delca Simona cu numrul matricol 2002 s-a nscut n data 06/30/82 Stanciu Maria cu numrul matricol 1010 s-a nscut n data 10/19/82 Radu Denisa cu numrul matricol 1011 s-a nscut n data 03/09/70

Figura 4.3. Concatenarea unor literali cu atribute de diferite tipuri n ceea ce privete expresiile de tip dat calendaristic, modurile n care au fost implementate aceste funciuni sunt foarte eterogene de la SGBD la SGBD. S presupunem c orice carte mprumutat trebuie restituit n maximum 10 zile. Visual Fox Pro permite formularea unei soluii simple. data_imprumut fiind un atribut de tip DATE, se consider implicit dac adunm 10, c acest 10 reprezint numrul de zile. SELECT cota_carte, data_imprumut, ; data_imprumut + 10 AS data_restituire ; FROM STUDCARTE
cota_carte 1114 1115 data_imprumut 10.12.2003 12.02.2004 data_restituire 20.12.2003 22.02.2004

61

1115 1126 1111 1127 1114 1126 1130 1119 1120 1130

12.02.2004 12.02.2004 16.02.2004 16.02.2004 17.02.2004 17.02.2004 18.02.2004 18.02.2004 18.02.2004 18.02.2004

22.02.2004 22.02.2004 26.02.2004 26.02.2004 27.02.2004 27.02.2004 28.02.2004 28.02.2004 28.02.2004 28.02.2004

Figura 4.4. Restituirea crilor n 10 zile Dac am presupune c o carte mprumutat poate fi restituit peste 3 luni, interogarea de mai sus trebuie modificat astfel: SELECT cota_carte, data_imprumut, GOMONTH ; (data_imprumut, 3) AS data_restituire ; FROM STUDCARTE
cota_carte 1114 1115 1115 1126 1111 1127 1114 1126 1130 1119 1120 1130 data_imprumut 10.12.2003 12.02.2004 12.02.2004 12.02.2004 16.02.2004 16.02.2004 17.02.2004 17.02.2004 18.02.2004 18.02.2004 18.02.2004 18.02.2004 data_restituire 10.03.2004 12.05.2004 12.05.2004 12.05.2004 16.05.2004 16.05.2004 17.05.2004 17.05.2004 18.05.2004 18.05.2004 18.05.2004 18.05.2004

Figura 4.5. Restituirea crilor n 3 luni Dac vrem s punem n eviden operaiunile de adunare i scdere ntre dou date calendaristice, s lum exemplul n care ne intereseaz intervalul dintre momentul curent (data curent) i momentul mprumutrii fiecrei cri: Interogarea n Visual Fox Pro n acest caz este: SELECT cota_carte, data_imprumut, DATE() ; data_imprumut AS timp_scurs ; FROM STUDCARTE

cota_carte 1114 1115 1115 1126 1111 1127 1114 1126 1130 1119 1120

data_imprumut 10.12.2003 12.02.2004 12.02.2004 12.02.2004 16.02.2004 16.02.2004 17.02.2004 17.02.2004 18.02.2004 18.02.2004 18.02.2004

timp_scurs 117 53 53 53 49 49 48 48 47 47 47

62

1130

18.02.2004

47

Figura 4.6. Intervalul dintre 06/04/2004 (data execuiei interogrii) i data mprumutului Rezultatul scderii a dou date calendaristice este un numeric care reprezint numrul de zile. 4.4. Opiunea ORDER BY Una din caracteristicile modelului relaional este faptul c din punct de vedere informaional, nici ordinea atributelor, nici ordinea liniilor n relaii nu prezint importan. Cu toate acestea, n practic forma de prezentare a rezultatelor interogrii este foarte important. Spre exemplu o list a tuturor localitilor este cu mult mai folositoare dac este prezentat n ordine alfabetic, posibil prin clauza ORDER BY. S se obin lista localitilor n ordine alfabetic. SELECT * FROM LOCALITATE ORDER BY nume_localitate Rezultatul se prezint ca n figura 4.7.
cod_localitate 2150 0573 8721 7000 7000 8700 0284 4331 6600 0300 2000 1000 0200 1900 6500 nume_localitate .NULL. .NULL. .NULL. Bucuresti Bucuresti Constanta Fieni Gaesti Iasi Pitesti Ploiesti Ramnicu Valcea Targoviste Timisioara Vaslui cod_judet PH AG CT B B CT DB DB IS AG PH VL DB TM VS judet Prahova Arges Constanta Bucuresti Bucuresti Constanta Dambovita Dambovita Iasi Arges Prahova Valcea Dambovita Timis Vaslui regiune Muntenia Muntenia Dobrogea Muntenia Muntenia Dobrogea Muntenia Muntenia Moldova Muntenia Muntenia Oltenia Muntenia Transilvania Moldova

Figura 4.7. Localitile ordonate alfabetic Implicit aranjarea se face cresctor (ASC). Prin opiunea DESC, ordinea prezentrii se inverseaz. n plus se pot specifica mai multe coloane care s serveasc drept criterii suplimentare de ordonare. La valori egale ale primului atribut, intr n aciune criteriul de balotaj care este al doilea atribut .a.m.d. S se obin n ordinea descresctoare a editurilor i cresctoare a titlurilor, lista crilor din bibliotec. SELECT cota_carte, titlu, editura FROM CARTE ORDER BY editura DESC, titlu ASC Rezultatul este cel din figura 4.8.

63

cota_carte 1111 1116 1117 1130 1129 1128 1123 1124 1126 1125 1118 1120 1112 1122 1121 1114 1115 1127 1119 1113

editura Stiinta si Tehnica Prentince Hall Polirom Morgan Kaufmann Macarie Macarie Macarie Macarie Macarie Macarie Luminalex InterEdition Infomega Eficient Eficient Eficient Eficient Eficient Economica Adisson-Wesley

titlu Sisteme expert Object-Oriented Modelling Sql. Dialecte Database Transaction Models Baze contabilitatii Contabilitate de gestiune Contabilitate generala Economie politica Informatica de gestiune Teoria generala a dreptului Drept comercial Merise vers OMT et UML Baze de date Bazele contabilitatii Bazele politici sociale Contabilitate generala Economie Politica Economie politica Politici si optiuni contabile Conception orientee objets

Figura 4.8. Crile ordonate descresctor dup editur i cresctor dup titlu 4.5. Operatorii BETWEEN, LIKE, IN Pentru formularea predicatului de selecie, SQL permite utilizarea, pe lng clasicii >, , <, , =, i a altor operatori, dintre care noi ne vom opri doar asupra lui BETWEEN (ntre, cuprins ntre), LIKE (ca i, la fel ca) i IN (n). 4.5.1. Operatorul BETWEEN Este util pentru definirea intervalelor de valori. Care sunt studenii care s-au nscut n anul 1982. n Visual Fox Pro constantele de tip dat calendaristic trebuie ncadrate ntre acolade. SELECT * ; FROM STUDENT ; WHERE data_nasterii BETWEEN {^1982/01/01} ; and {^1982/12/31} Rspunsul este redat n figura 4.9.
nr_matricol 1000 2000 1008 2002 1010 nume Popescu Ion Octavian Tudorache Octavian Goia Simona Delca Simona Stanciu Maria facultate Stiinte Economice Colegiul Economic Stiinte Economice Colegiul Economic Stiinte Economice sectia CIG BIR CIG MU CIG data_nasterii 10.10.1982 02.04.1982 01.01.1982 30.06.1982 19.10.1982 cod_localitate 0200 1000 1900 2000 0200

Figura 4.9. Studenii nscui n anul 1982

64

Soluia la exemplul de mai sus, n condiiile n care nu se folosea BETWEEN, ar fi folosit n clauza WHERE, o condiie compus. SELECT * ; FROM STUDENT ; WHERE data_naterii > = {^1982/01/01} ; AND data_naterii < = {^1982/12/31} S se obin n ordinea apariiei, lista crilor din bibliotec care au numrul de exemplare cuprins ntre 50 i 100. SELECT titlu, an_aparitie, nr_exemplare FROM CARTE WHERE nr_exemplare BETWEEN 50 AND 100 ORDER BY an_aparitie
titlu Teoria generala a dreptului Informatica de gestiune Politici si optiuni contabile Contabilitate generala Bazele contabilitatii an_aparitie 2000 2000 2002 2003 2003 nr_exemplare 89 100 60 100 100

Figura 4.10. Crile n ordinea apariie cu numrul de exemplare ntre 50 i 100 Soluia fr BETWEEN: SELECT titlu, an_aparitie, nr_exemplare FROM CARTE WHERE nr_exemplare >= 50 AND nr_exemplare <= 100 ORDER BY an_aparitie S se obin n ordinea descresctoare a judeelor, lista localitilor cu indicativul judeului cuprins ntre DB (Dmbovia) i VL (Vlcea). SELECT cod_judet, nume_localitate, cod_localitate FROM LOCALITATE WHERE cod_judet BETWEEN DB AND VL ORDER BY cod_judet DESC

cod_judet VL TM PH PH IS DB DB DB

nume_localitate Ramnicu Valcea Timisioara Ploiesti .NULL. Iasi Targoviste Fieni Gaesti

cod_localitate 1000 1900 2000 2150 6600 0200 0284 4331

Figura 4.11. Localitile n ordine descresctoare a judeelor Cu indicativul ntre DB i VL Varianta fr BETWEEN:

65

SELECT cod_judet, nume, cod_localitate FROM LOCALITATE WHERE cod_judet > = DB AND cod_judet < = VL ORDER BY cod_judet DESC 4.5.2. Operatorul LIKE De multe ori, cnd se dorete obinerea unor informaii din baz suntem pui n postura de a nu ti cu exactitate cum se numete un student sau o carte. Acestea sunt situaiile pentru a cror rezolvare a fost gndit operatorul LIKE. Operatorul LIKE permite compararea unui atribut (expresii) cu un literal utiliznd o masc construit cu ajutorul specificatorilor multipli % sau _ . Procentul (%) substituie un ir de lungime variabil, 0-n caractere, n timp ce liniua (_) substituie un singur caracter. Care sunt crile din bibliotec care ncep cu litera C?. SELECT * FROM CARTE WHERE titlu LIKE C% Rezultatul se prezint ca n figura 4.12.
cota_carte 1113 1114 1123 1128 titlu Conception orientee objets Contabilitate generala Contabilitate generala Contabilitate de gestiune editura AdissonWesley Eficient Macarie Macarie domeniu Informatica Contabilitate Contabilitate Contabilitate an_aparitie 1994 1998 2003 2002 nr_exemplare 12 10 100 120 pret_unitar 1000000 265000 200000 190000

Figura 4.12. Crile al cror titlu ncepe cu litera C Varianta fr LIKE (n VFP): SELECT * ; FROM CARTE ; WHERE LEFT(titlu,1)='C' S-a folosit funcia LEFT() pentru a extrage prima liter din titlu. Ce cri au titlul coninnd litera l pe a treia poziie? SELECT * FROM CARTE WHERE titlu LIKE _ _ l%
cota_carte 1117 1119 titlu Sql. Dialecte Politici si optiuni contabile editura Polirom Economica domeniu Informatica Contabilitate an_aparitie 2001 2002 nr_exemplare 5 60 pret_unitar 350000 90000

Figura 4.13. Crile care au pe poziia a treia din titlu litera l. Rezultatul este vizualizat n figura 4.13. Dac exist cri al cror titlu conine litera L majuscul pe a treia poziie, acestea nu sunt extrase n rezultat. Pentru siguran, n asemenea situaii, soluia este: SELECT *

66

FROM CARTE WHERE titlu LIKE _ _ l% OR titlu LIKE _ _ L% Varianta fr LIKE (n VFP):: SELECT * ; FROM CARTE ; WHERE SUBSTR(titlu,3,1)='l' OR ; SUBSTR(titlu,3,1)='L' S-a folosit funcia SUBSTR() pentru a extrage un subir (litera L) dintr-un ir (titlu) Titlul cror cri se termin n literele te? SELECT * FROM CARTE WHERE titlu LIKE %te
cota_carte 1112 1117 Titlu Baze de date Sql. Dialecte editura Infomega Polirom domeniu Informatica Informatica an_aparitie 2002 2001 nr_exemplare 30 5 pret_unitar 240000 350000

Figura 4.14. Crile al cror titlu se termin n te. Varianta fr LIKE (n VFP): SELECT * ; FROM CARTE ; WHERE RIGHT(ALLTRIM(titlu),2)=te Observm folosirea funcie RIGHT() pentru a extrage caracterele din dreapta n combinaie cu funcia ALLTRIM().

4.5.3. Operatorul IN Atunci cnd se testeaz dac valoarea unui atribut este ncadrabil ntr-o list dat de valori, n locul folosirii abundente a operatorului OR, o soluie mult mai elegant este s se fac apel la operatorul IN. Formatul general este: expresie1 IN (expresie2, expresie3, ...) Rezultatul evalurii unui predicat ce conine acest operator va fi adevrat dac valoarea expresiei1 este cel puin egal cu una dintre valorile expresie2, expresie3, .... Care sunt studenii care urmeaz specializrile CIG, MG i MK? - fr operatorul IN SELECT * FROM STUDENT WHERE sectia = CIG OR sectia = MG OR sectia = MK - cu operatorul IN SELECT * FROM STUDENT WHERE sectia IN (CIG, MG, MK)

67

- o variant VFP: SELECT * ; FROM STUDENT ; WHERE INLIST(sectia, CIG, MG, MK)
nr_matricol 1000 1001 1002 1003 1004 1005 1005 1007 1008 1010 nume Popescu Ion Octavian Radu Laurentiu Barbu Elena Popescu Marilena Petrescu Daniel Danciu Monica Dinescu Monica Cristea Roxana Goia Simona Stanciu Maria facultate Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice Stiinte Economice sectia CIG MG MG CIG MK CIG CIG CIG CIG CIG data_nasterii 10.10.1982 03.12.1980 21.05.1975 03.02.1980 11.11.1973 03.04.1978 03.10.1974 02.07.1978 01.01.1982 19.10.1982 cod_localitate 0200 0200 0200 1000 2000 0300 7000 0200 1900 0200

Figura 4.15. Studenii de la specializrile CIG, MG i MK Care sunt crile care au aprut n anii 1999, 2001 i 2002? - fr operatorul IN SELECT * FROM CARTE WHERE an_aparitie=1999 OR an_aparitie=2001 or an_aparitie=2002 - cu operatorul IN SELECT * FROM CARTE WHERE an_aparitie IN (1999, 2001, 2002) - o variant VFP: SELECT * ; FROM CARTE ; WHERE INLIST(an_aparitie, 1999, 2001, 2002)
cota_carte 1112 1115 1117 1119 1121 1122 1124 1128 titlu Baze de date Economie Politica Sql. Dialecte Politici si optiuni contabile Bazele politici sociale Bazele contabilitatii Economie politica Contabilitate de gestiune editura Infomega Eficient Polirom Economica Eficient Eficient Macarie Macarie domeniu Informatica Economie Informatica Contabilitate Economie Contabilitate Economie Contabilitate an_aparitie 2002 1999 2001 2002 1999 2002 2002 2002 nr_exemplare 30 9 5 60 10 14 46 120 pret_unitar 240000 170000 350000 90000 160000 200000 140000 190000

Figura 4.16. Crile care au aprut n 1999, 2001 i 2002 Ce burse s-au ncasat pe 16, 18 i 20 februarie 2004? - fr operatorul IN SELECT * FROM BURSA WHERE data_incasarii = {^2004/02/16} OR data_incasarii = {^2004/02/18} OR data_incasarii = {^2004/02/20}

68

- cu operatorul IN SELECT * FROM BURSA WHERE data_incasarii IN ({^2004/02/16}, {^2004/02/18}, {^2004/02/20}) - o variant VFP: SELECT * ; FROM BURSA ; WHERE INLIST(data_incasarii, {^2004/02/16}, ; {^2004/02/18}, {^2004/02/20})
nr_matricol 1005 3000 1009 3002 1010 data_incasarii 18.02.2004 16.02.2004 18.02.2004 20.02.2004 16.02.2004 tip_bursa Studiu Exceptionala Merit Studiu Sociala suma_incasata 1500000 2500000 2000000 1500000 1000000

Figura 4.17. Bursele care s-au ncasat pe 16,18 i 20 februarie 2004 4.6. Theta i echijonciunea Dintre tipurile de jonciuni prezentate n capitolul 3, vom insista n aceast subcapitol asupra theta jonciunii i echijonciunii. SQL nu prezint clauze sau operatori speciali pentru jonciune, ns dup cum am vzut, jonciunea se constituie ca o combinaie ntre produs cartezian i selecie. Exemplul 15 al algebrei relaionale pentru theta joncionarea relaiilor R1 i R2 (figura3.19.), se scrie: SELECT * FROM R1, R2 WHERE R1.C1 > R2.C5 iar pentru echijonciunea din exemplul 16 (figura 3.20.): SELECT * FROM R1, R2 WHERE R1.C1 = R2.C5 Jonciunea natural poate fi realizat numai prin specificarea numelor atributelor n clauza SELECT a frazei de interogare. n standardul SQL-92 i n implementrile SQL ale multor SGBDuri se poate folosi o variant mai elegant, innd seama i de faptul c tot ce nseamn theta- i echijonciune reprezint pentru SQL, INNER JOIN (jonciune intern). Prin urmare, cele dou soluii de mai sus pot fi rescrise, dup cum urmeaz: SELECT * FROM R1 INNER JOIN R2 ON R1.C1 > R2.C5, respectiv SELECT * FROM R1 INNER JOIN R2 ON R1.C1 = R2.C3. Relum, pentru comparaie, exemplele din algebra relaional. Exemplul 19. S se afle numele, facultatea i secia studenilor care stau la cminul Miclas?.

69

- varianta 1 (general): SELECT NUME, facultate, sectia, STUDCAMIN.nume_camin FROM STUDENT, STUDCAMIN WHERE STUDENT.nr_matricol = STUDCAMIN.nr_matricol AND STUDCAMIN.nume_camin = Miclas - varianta 2 (Visual Fox Pro): SELECT nume, facultate, sectia, ; STUDCAMIN.nume_camin ; FROM STUDENT INNER JOIN STUDCAMIN ON ; STUDENT.nr_matricol = STUDCAMIN.nr_matricol ; AND STUDCAMIN.nume_camin = Miclas
nume Popescu Ion Octavian Danciu Mihaela Moraru Octavian Simionescu Dorin Delca Simona Radu Denisa facultate Stiinte Economice Colegiul Economic Colegiul Economic Stiinte Economice Colegiul Economic Stiinte Economice sectia CIG BIR BIR FA MU FA nume_camin Miclas Miclas Miclas Miclas Miclas Miclas

Figura 4.18. Studenii din cminul Miclas Numai atributul nume_camin a fost prefixat cu numele tabelei din care provine (STUDCAMIN). Prefixarea este obligatorie atunci cnd cmpul exist n dou sau mai multe dintre tabelele enumerate n clauza FROM. Exemplul 20. Care sunt crile scrise de Victor Stanciu? - varianta 1 (general): SELECT titlu, AUTOR.nume_autor FROM AUTOR, AUTORCARTE, CARTE WHERE AUTOR.cod_autor = AUTORCARTE.cod_autor AND AUTORCARTE.cota_carte = CARTE.cota_carte AND nume_autor = Victor Stanciu - varianta 2 (Visual Fox Pro): SELECT titlu, AUTOR.nume_autor ; FROM AUTOR INNER JOIN AUTORCARTE ON ; AUTOR.cod_autor = AUTORCARTE.cod_autor ; INNER JOIN CARTE ON AUTORCARTE.cota_carte = ; CARTE.cota_carte ; WHERE nume_autor = Victor Stanciu
titlu Contabilitate generala Bazele contabilitatii Contabilitate generala Contabilitate de gestiune nume_autor Victor Stanciu Victor Stanciu Victor Stanciu Victor Stanciu

Figura 4.19. Crile scrise de Victor Stanciu Exemplul 21. Numele studenilor care au mprumutat cri din domeniul Informatic.

70

- varianta 1 (general): SELECT nume FROM CARTE, STUDCARTE, STUDENT WHERE CARTE.cota_carte = STUDCARTE.cota_carte AND STUDCARTE.nr_matricol = STUDENT.nr_matricol AND domeniu = Informatica - varianta 2 (Visual Fox Pro): SELECT nume ; FROM CARTE INNER JOIN STUDCARTE ON ; CARTE.cota_carte = STUDCARTE.cota_carte ; INNER JOIN STUDENT ON STUDCARTE.nr_matricol = ; STUDENT.nr_matricol ; WHERE domeniu = Informatica
nume Popescu Ion Octavian Tudorache Octavian Chivu Mihai Petrescu Daniel Goia Simona Stanciu Maria

Figura 4.20. Studenii care au mprumutat cri din domeniul informatic Exemplul 22. Numele i secia studenilor Facultii de tiine Economice care au mprumutat cartea Informatica de gestiune n februarie 2004?. - varianta 1 (general): SELECT nume, sectia FROM CARTE, STUDCARTE, STUDENT WHERE CARTE.cota_carte = STUDCARTE.cota_carte AND STUDCARTE.nr_matricol = STUDENT.nr_matricol AND titlu = Informatica de gestiune AND facultate = Stiinte Economice AND data_imprumut BETWEEN 01/02/2004 AND 29/02/2004 - varianta 2 (Visual Fox Pro): SELECT nume, sectia FROM CARTE INNER JOIN STUDCARTE ON CARTE.cota_carte = STUDCARTE.cota_carte INNER JOIN STUDENT ON STUDCARTE.nr_matricol = STUDENT.nr_matricol WHERE titlu = Informatica de gestiune AND facultate = Stiinte Economice AND data_imprumut BETWEEN {^2004/02/01} AND {^2004/02/29}
nume Stanciu Maria sectia CIG

Figura 4.21. Studenii care au mprumutat cartea Informatica de gestiune n februarie 2004 Exemplul 23. De la ce secii sunt studenii care au mprumutat i cartea Informatic de gestiune i Contabilitate general? - soluia 1 - varianta 1 (nu funcioneaz n Visual Fox Pro): SELECT DISTINCT sectia FROM STUDENT, STUDCARTE, CARTE

71

WHERE STUDENT.nr_matricol = STUDCARTE.nr_matricol STUDCARTE.cota_carte = CARTE.cota_carte AND titlu Informatica de gestiune INTERSECT SELECT DISTINCT sectia FROM STUDENT, STUDCARTE, CARTE WHERE STUDENT.nr_matricol = STUDCARTE.nr_matricol STUDCARTE.cota_carte = CARTE.cota_carte AND titlu Contabilitate generala

AND =

AND =

- soluia 1 - varianta 2 (SQL - 92): SELECT DISTINCT sectia FROM STUDENT INNER JOIN STUDCARTE ON STUDENT.nr_matricol = STUDCARTE.nr_matricol INNER JOIN CARTE ON STUDCARTE.cota_carte = CARTE.cota_carte WHERE titlu = Informatica de gestiune INTERSECT SELECT DISTINCT sectia FROM STUDENT INNER JOIN STUDCARTE ON STUDENT.nr_matricol = STUDCARTE.nr_matricol INNER JOIN CARTE ON STUDCARTE.cota_carte = CARTE.cota_carte WHERE titlu = Contabilitate generala De notat folosirea clauzei DISTINCT pentru eliminarea eventualelor dubluri. Pentru variantele soluiei 2 vom avea nevoie de ceea ce se numete jonciunea unei tabele cu ea nsi, care va fi prezentat n subcapitolul urmtor. 4.7. Sinonime locale i jonciunea unei tabele cu ea nsi Lucrul cu nume lungi de tabele (STUDCARTE) i atribute (cod_localitate) prezint marele avantaj al lejeritii la citire i nelegeri rapide a logicii de derulare a interogrii. n schimb, destul de muli informaticieni nu agreaz risipa de caractere (i, implicit de timp) implicat de redactrile presupuse de folosirea numelor lungi. Pentru aceasta n frazele SELECT, tabelelor li pot asocia sinonime sau aliasuri mai scurte. Pentru exemplificare, ultima interogare se poate rescrie astfel: SELECT DISTINCT nume_camin FROM STUDENT S, STUDCARTE SC, CARTE C WHERE S.nr_matricol = SC.nr_matricol AND SC.cota_carte = C.cota_carte AND titlu = Informatic de gestiune INTERSECT ................................................................................................ Tabelei STUDENT i s-a asociat sinonimul S, STUDCARTE SC, iar pentru CARTE C. Sinonimele prefixeaz (atunci cnd este cazul) numele atributelor din clauzele SELECT i WHERE (eventual ORDER BY i GROUP BY). O operaie n care obligatoriu trebuie folosite sinonimele este joncionarea unei tabele cu ea nsi. Revenim la exemplul 25 din algebra relaional. Ce studeni studiaz la aceeai secie cu Dinescu Monica? SELECT S2.nume

72

FROM STUDENT S1, STUDENT S2 WHERE S1.sectia = S2.sectia AND S1.nume = Dinescu Monica Jonciunea unei tabele cu ea nsi presupune, de fapt, jonciunea a dou instane ale tabelei respective. Rezultatul jonciunii S1 cu S2 este o tabel intermediar, asupra creia se aplic predicatul de selecie suplimentar S1.nume = Dinescu Monica, rezultatul final fiind prezentat n figura 4.22.
nume Popescu Ion Octavian Popescu Marilena Danciu Monica Dinescu Monica Cristea Roxana Goia Simona Stanciu Maria

Figura 4.22. Numele celor de la aceeai secie cu Dinescu Monica O alt variant se prezint astfel: SELECT S2.nume FROM STUDENT S1 INNER JOIN STUDENT S2 ON S1.sectia = S2.sectia WHERE S1.nume = Dinescu Monica Am rmas datori cu formularea soluiei 2 din algebra relaional de la exemplul 22: De la ce secii sunt studenii care au mprumutat i cartea Informatic de gestiune i Contabilitate general? Joncionm o instan obinut prin jonciunea STUDENT-STUDCARTE-CARTE (n care titlu = Informatica de gestiune) cu o alt instan a aceleiai combinaii (n care titlu = Contabilitate general) - soluia 2 varianta 1 (general): SELECT DISTINCT S1.sectia FROM STUDENT S1, STUDCARTE SC1, CARTE C1, STUDENT S2, STUDCARTE SC2, CARTE C2 WHERE S1.nr_matricol = SC1.nr_matricol AND SC1.cota_carte = C1.cota_carte AND C1.titlu = Informatica de gestiune AND S2.nr_matricol = SC2.nr_matricol AND SC2.cota_carte = C2.cota_carte AND C2.titlu = Contabilitate general AND S1.sectia = S2.sectia - soluia 2 varianta 2 (Visual Fox Pro): SELECT DISTINCT S1.sectia FROM CARTE C1 INNER JOIN STUDCARTE SC1 ON C1.cota_carte = SC1.cota_carte INNER JOIN STUDENT S1 ON SC1.nr_matricol = S1.nr_matricol INNER JOIN STUDENT S2 ON S1.sectia = S2. sectia INNER JOIN STUDCARTE SC2 ON SC2.nr_matricol = S2.nr_matricol INNER JOIN CARTE C2 ON SC2.cota_carte = C2.cota_carte WHERE

73

C1.titlu = Informatica de gestiune AND C2. titlu = Contabilitate generala


sectia CIG

Figura 4.23. Secia studenilor care au mprumutat i cartea Informatic de gestiune i Contabilitate de gestiune

74

4.8. Subconsultri Una dintre cele mai importante faciliti oferite de SQL const n includerea unei consultri n alta, pe dou sau mai multe niveluri cu alte cuvinte, utilizarea subconsultrilor. Prin aceste subconsultri se obin tabele temporare intermediare ce vor fi folosite drept argumente n frazele SELECT superioare. n materie de subconsultri, cel mai utilizat operator este IN, pe care deja l-am ntlnit n capitolul precedent, dar ntr-o cu totul alt ipostaz testarea ncadrrii valorii unui atribut ntr-o list de constante. n continuare, domeniul de testare este alctuit din liniile unei tabele. Revenim la exemplul din algebra relaional: Ce studeni studiaz la aceeai secie cu Dinescu Monica? SELECT nume FROM STUDENT WHERE sectia IN (SELECT sectia FROM STUDENT WHERE nume = Dinescu Monica) n cazul acestei interogri, execuia se realizeaz n doi timpi. Mai nti se execut subconsultarea SELECT sectia FROM STUDENT WHERE nume = Dinescu Monica obinndu-se o tabel intermediar ce conine o singur linie (pe care apare CIG) i o singur coloan (sectia), ca n figura 4.24.
sectia CIG

Figura 4.24. Secia la care studiaz Dinescu Monica n cel de-al doilea pas sunt selectate liniile tabelei STUDENT care ndeplinesc condiia secia = CIG
nume Popescu Ion Octavian Popescu Marilena Danciu Monica Dinescu Monica Cristea Roxana Goia Simona Stanciu Maria

Figura 4.25. Studenii care studiaz la aceeai secie cu Dinescu Monica Observm c n rezultat a fost inclus i studentul de referin Dinescu Monica. Dac se dorete excluderea din rezultat a acestui student, fraza SELECT se modific astfel: SELECT nume FROM STUDENT WHERE sectia IN (SELECT sectia FROM STUDENT WHERE nume = Dinescu Monica) AND nume < > Dinescu Monica Ce studeni studiaz la alte secii dect Dinescu Monica?

75

SELECT nume FROM STUDENT WHERE sectia NOT IN (SELECT sectia FROM STUDENT WHERE nume = Dinescu Monica)
nume Radu Laurentiu Tudorache Octavian Chivu Mihai Barbu Elena Petrescu Daniel Croitoru Sebastian Danciu Mihaela Stan Adrian Moraru Octavian Balasa Maria Simionescu Dorin Delca Simona Radu Denisa

Figura 4.26. Studenii care studiaz la alte secii dect la cea la ca studiaz Dinescu Monica n ce cmin sunt cazai studenii care studiaz la aceeai secie cu Dinescu Monica? SELECT DISTINCT nume_camin FROM STUDCAMIN WHERE nr_matricol IN (SELECT nr_matricol FROM STUDENT WHERE sectia IN SELECT sectia FROM STUDENT WHERE nume = Dinescu Monica))
nume_camin Caminul nr. 2 Miclas Sportiv

Figura 4.27. Cminul n care stau studenii care studiaz la aceeai secie cu Dinescu Monica Rezultatul prezentat n figura 4.27. este obinut prin folosirea a trei niveluri de interogare (fraza principal, o subconsultare i o sub-subconsultare). n Visual Fox Pro aceast ultim interogare face simit prezena uneia dintre cele mai serioase limitri SQL maxim 2 niveluri de consultare (fraza principal i o interogare subordonat). Mesajul de eroare are numrul 1842: SQL: Subquery nesting in too deep. Astfel, pentru a rspunde la ntrebare, soluia de interogare trebuie reformulat: SELECT nume_camin FROM STUDENT INNER JOIN STUDCAMIN; ON STUDENT.nr_matricol = STUDCAMIN.nr_matricol; WHERE sectia IN

76

(SELECT sectia FROM STUDENT WHERE nume = Dinescu Monica) Din ce judee sunt studenii care au mprumutat cri scrise de autori de naionalitate romn? Am ales acest exemplu pentru a folosi n subconsultri ct mai multe tabele ale bazei de date SELECT judet FROM LOCALITATE WHERE cod_localitate IN (SELECT cod_localitate FROM STUDENT WHERE nr_matricol IN (SELECT nr_matricol FROM STUDCARTE WHERE cota_carte IN (SELECT cota_carte FROM CARTE WHERE cota_carte IN (SELECT cota_carte FROM AUTOR_CARTE WHERE nume_autor IN SELECT nume_autor FROM AUTOR WHERE nationalitate = roman))))) Atunci cnd rezultatul unei subconsultri se concretizeaz ntr-o tabel cu o singur coloan i o singur linie, corelarea poate fi fcut i cu operatorii de comparaie obinuii: =, >, >=, <, <=. n continuare vom ilustra aceast facilitate prin cteva exemple. Care este cel mai mic pre unitar la care s-a cumprat o carte? SELECT MIN (pret_unitar) AS maxim FROM CARTE
minim 9000

Figura 4.28. Cel mai mic pre unitar Care este cel mai mic pre unitar i care este cartea, respectiv studentul care a mprumutat cartea cu preul respectiv? SELECT titlu, pret_unitar, nume FROM CARTE C, STUDCARTE SC, STUDENT S WHERE S.nr_matricol = SC.nr_matricol AND SC.cota_carte=C.cota_carte AND pret_unitar =(SELECT MIN (pret_unitar) FROM CARTE)
titlu Politici si optiuni contabile pret_unitar 90000 nume Petrescu Daniel

Figura 4.29. Titlu crii cu cel mai mic pre

77

Care sunt cele mai mari cinci preuri unitare, crile i studenii care au mprumutat crile care au cele cinci preuri maxime? SELECT titlu, pret_unitar, nume FROM STUDENT INNER JOIN STUDCARTE ON STUDENT.nr_matricol = STUDCARTE.nr_matricol INNER JOIN CARTE ON STUDCARTE.cota_carte = CARTE.cota_carte WHERE pret_unitar > (SELECT MAX (pret_unitar) FROM CARTE WHERE pret_unitar < (SELECT MAX (pret_unitar) FROM CARTE WHERE pret_unitar < (SELECT MAX (pret_unitar) FROM CARTE WHERE pret_unitar < (SELECT MAX (pret_unitar) FROM CARTE WHERE pret_unitar < (SELECT MAX (pret_unitar) FROM CARTE) ) ) ) ) ORDER BY pret_unitar DESC Avnd n vedere nivelurile de interogare, pentru exemplul de mai sus, n Visual FoxPro nu se poate formula interogarea n aceast form. Avem ns la ndemn o soluie neverosimil de simpl bazat pe clauza TOP. SELECT TOP 5 titlu, pret_unitar, nume FROM STUDENT INNER JOIN STUDCARTE ON STUDENT.nr_matricol STUDCARTE.nr_matricol INNER JOIN CARTE ON STUDCARTE.cota_carte = CARTE.cota_carte ORDER BY pret_unitar DESC
titlu Database Transaction Models Database Transaction Models Merise vers OMT et UML Informatica de gestiune Informatica de gestiune pret_unitar 600000 600000 563000 274000 274000 nume Petrescu Daniel Chivu Mihai Popescu Ion Octavian Stanciu Maria Tudorache Octavian

Figura 4.30. Primele 5 preuri unitare Liniile tabelei sunt ordonate descresctor dup preul unitar, iar n rezultatul final sunt extrase doar primele cinci (prin TOP 5) 4.9. Funcii agregat Formatul general al unei fraze SELECT care conine funcii agregat este:

78

SELECT funcie 1, ..., funcie 2 FROM lista_tabele WHERE condiie Dac n clauza SELECT este prezent o funcie agregat, n lipsa opiunii ORDER BY, rezultatul va conine o singur linie. 4.9.1. Funcia COUNT Funcia COUNT contorizeaz valorile nenule ale unei coloane sau numrul de linii dintr-un rezultat al interogrii. Cu alte cuvinte, COUNT numr cte valori diferite de NULL are coloana specificat sau cte linii sunt. Cte cri sunt n bibliotec? SELECT COUNT(*) AS Nr_carti FROM CARTE Prezena asteriscului ca argument al funciei COUNT are ca efect numrarea tuturor liniilor tabelei CARTE. Rezultatul este prezentat n figura 4.33.
nr_carti 20

Figura 4.33. Numrul de cri din bibliotec Folosind concatenarea se poate obine un rezultat ceva mai elegant. Spre exemplu, n Visual Fox Pro fraza se scrie n forma: SELECT In biblioteca sunt + STR (COUNT (*), 4) + carti AS Rezultat FROM CARTE
Rezultat In biblioteca sunt 20 carti

Figura 4.34. Numrul de cri din bibliotec obinut prin folosirea concatenrii Tabela CARTE are cheie primar atributul cota_carte, care nu poate avea valori nule, de aceea, la fel de corect este i soluia: SELECT COUNT(cota_carte) AS Nr_carti FROM CARTE Cte linii are produsul cartezian al tabelelor STUDENT i STUDCAMIN? SELECT COUNT(*) AS Produs FROM STUDENT, STUDCAMIN
produs 200

Figura 4.35. Produsul cartezian al tabelelor STUDENT i STUDCAMIN

79

Ci studeni urmeaz cursurile Facultii de tiine Economice? SELECT COUNT(Nr_matricol) AS Nr_studenti FROM STUDENT WHERE facultate = Stiinte Economice
nr_studenti 13

Figura 4.36. Studenii de la tiine Economice Ci studeni de la Facultatea de tiine Economice sunt bursieri? SELECT COUNT (*) AS Nr_bursieri FROM STUDENT S, BURSA B WHERE S.nr_matricol = B.nr_matricol AND facultate = Stiinte Economice
nr_bursieri 8

Figura 4.37. Studenii bursieri de la tiine Economice Ci studeni stau n cmin? SELECT COUNT (*) AS Nr_caministi FROM STUDENT S, STUDCAMIN SC WHERE S.nr_matricol = SC.nr_matricol
nr_caministi 11

Figura 4.38. Studenii din cmin Care este numrul studenilor din Muntenia? SELECT COUNT (*) AS Nr_studenti FROM STUDENT S, LOCALITATE L WHERE S.cod_localitate = L.cod_localitate Muntenia
nr_studenti 17

AND

regiune

Figura 4.39. Studenii din Muntenia Din cte localiti provin studenii? Tabela LOCALITATE conine i localiti din care nu avem studeni, pentru moment. De aceea, n locul soluiei: SELECT COUNT(cod_localitate) AS Nr_localitati FROM LOCALITATE
nr_localitati

80

15

Figura 4.40. Numrul localitilor din care provin studenii de preferat ar fi folosirea variantei: SELECT COUNT(cod_localitate) AS Nr_localitati FROM STUDENT
nr_localitati 20

Figura 4.41. Numrul localitilor din care provin studenii Problema este c rezultatul obinut (20) este incorect, deoarece funcia COUNT numr toate valorile nenule. Exist ns o clauz prin care o valoare s fie luat o singur dat n calcul: DISTINCT. Rezultatul corect presupune urmtoarea variant: SELECT COUNT(DISTINCT cod_localitate) AS Nr_localitati FROM STUDENT
nr_localitati 8

Figura 4.42. Numrul localitilor din care provin studenii 4.9.2. Funcia SUM SUM este una dintre cele mai utilizate funcii n aplicaiile economice, deoarece datele financiar-contabile i cele ale evidenei tehnico-operative sunt preponderent cantitative. Ct s-a pltit fr TVA pentru cartea Informatic de gestiune? SELECT SUM (nr_exemplare*pret_unitar) AS Val_fara_TVA FROM CARTE WHERE titlu = Informatica de gestiune
val_fara_tva 27400000

Figura 4.43. Valoarea fr TVA a crii Informatic de gestiune Ct s-a pltit fr TVA, care este valoarea TVA-ului i ct s-a pltit total pentru cartea Informatica de gestiune? SELECT SUM (nr_exemplare*pret_unitar)AS Val_fara_TVA, SUM(nr_exemplare*pret_unitar*0.19) AS TVA, SUM (nr_exemplare*pret_unitar + nr_exemplare*pret_unitar*0.19) AS Val_totala, FROM CARTE WHERE titlu = Informatica de gestiune
val_fara_tva 27400000 tva 5206000 val_totala 32606000

81

Figura 4.44. Valoarea fr TVA, cu TVA i total a crii Informatic de gestiune Aceasta este o soluie atemporal, deoarece dup cum se tie, procentul de TVA (care n prezent este 19%) poate suferi n timp modificri. O vizualizare mai elegant a acestui rezultat poate fi realizat folosind urmtoarea interogare: SELECT Pentru cartea Informatica de gestiune fr TVA s-a pltit + STR (SUM (nr_exemplare* pret_unitar), 10) + valoarea TVA este + STR (SUM (nr_exemplare*pret_unitar*0.19), 10) + iar total s-au cheltuit + STR (SUM (nr_exemplare*pret_unitar + nr_exemplare*pret_unitar*0.19), 10) AS Rezultat FROM CARTE WHERE titlu = Informatica de gestiune
Rezultat Pentru cartea Informatica de gestiune fr TVA s-a pltit 27400000 valoarea TVA este 5206000 iar total s-au cheltuit 32606000

Figura 4.45 Rezultatul din figura 4.44. n forma mai descriptiv La ct se situeaz suma ncasat ca burs de studeni n data de 20.02.2004? SELECT 20.02.2004 AS DATA, SUM (suma_incasata) AS Val_bursa FROM STUDENT, BURSA WHERE STUDENT.nr_matricol = BURSA.nr_matricol AND data_incasarii = {^2004/02/20}
data 20.02.2004 val_bursa 1500000

Figura 4.46. Valoarea burselor ridicate pe 20.02.2004 Care este suma total ncasat ca burs de studenii Facultii de tiine Economice? SELECT SUM (suma_incasata) AS Suma_bursa FROM STUDENT S, BURSA B WHERE S.nr_matricol = B.nr_matricol AND facultate = Stiinte Economice
suma_bursa 12000000

Figura 4.47. Suma totala ncasata de studenii de la tiine Economice Care este suma total ncasat ca burs de studenii cminiti? SELECT SUM (suma_incasata) AS Suma_bursa FROM STUDENT S, STUDCAMIN SC, BURSA B WHERE S.nr_matricol = SC.nr_matricol AND B.nr_matricol
suma_bursa 6000000

S.nr_matricol

82

Figura 4.48. Valoarea burselor ncasate de studenii cminiti Care este valoarea medie a preului (inclusiv TVA) la care a fost achiziionat cartea Informatic de gestiune? Aceast valoare medie nu o calculm folosind funcia AVG (pe care o vom descrie ceva mai ncolo), ci se bazeaz pe raportul dintre suma pltit i numrul de exemplare nsumate pentru aceast carte. SELECT SUM (nr_exemplare*pret_unitar*1.19) (nr_exemplare) AS Pret_mediu FROM CARTE WHERE titlu = Informatica de gestiune
pret_mediu 326060

SUM

Figura 4.49. Valoarea medie a crii Informatic de gestiune 4.9.3. Funcia AVG Dup cum i spune i numele (n englez), calculeaz media aritmetic a unei coloane ntr-o tabel oarecare, prin diviziunea sumei valorilor coloanei respective la numrul de valori nenule ale acesteia. Care este valoarea medie (fr TVA) la care au fost achiziionate crile din domeniul Informatic? SELECT Valoarea medie a cartilor din domeniul Informatica AS EXPLICATIE, AVG (nr_exemplare*pret_unitar) AS Val_medie FROM CARTE WHERE domeniu = Informatica
explicatie Valoarea medie a cartilor din domeniul Informatica val_medie 8165625

Figura 4.50. Valoarea medie a crilor din domeniul Informatic Care este valoarea medie a burselor ncasate de studenii Facultii de tiine Economice? SELECT Valoarea medie a burselor AS Explicatie, AVG (suma_incasata) AS Val_medie FROM STUDENT S, BURSA B WHERE S.nr_matricol = B.nr_matricol AND facultate = Stiinte Economice
explicatie Valoarea medie a burselor val_medie 1500000

Figura 4.51. Valoarea medie a burselor de la tiine Economice Care este valoarea medie a burselor ncasate de studenii cminiti?

83

SELECT Valoarea medie a burselor AS (suma_incasata) AS Val_medie FROM STUDENT S, BURSA B, STUDCAMIN SC WHERE S.nr_matricol = B.nr_matricol AND SC.nr_matricol

Explicatie, S.nr_matricol

AVG =

explicatie Valoarea medie a burselor

val_medie 1200000

Figura 4.52. Valoarea medie a burselor studenilor cminiti Adeseori, prin aplicarea funciei AVG sau prin formularea unor expresii ce conin rapoarte ntre atribute i constante, se obin rezultate cu numeroase zecimale. Pentru a evita disconfortul unor astfel de rezultate se apeleaz la funcia ROUND. 4.9.4. Funciile MAX i MIN Cele dou funcii care determin valoarea maxim i minim, pentru o coloan (atribut) sunt deosebit de utile n diverse tipuri de analiz. Se pot folosi i pentru atribute de tip caracter, caz n care elementul de comparaie este codul ASCII al elementelor. Care este studentul cu ultimul nume, n ordine alfabetic, de la facultatea de tiine Economice? SELECT MIN (nume) AS Primul_student, MAX (nume) AS Ultimul_student FROM STUDENT WHERE facultate = Stiinte Economice
primul_student Barbu Elena ultimul_student Stanciu Maria

Figura 4.53. Primul i ultimul student n ordine alfabetic Care este primul i ultimul jude (n ordinea numelui) din care provin studenii? SELECT MIN (judet) AS Primul_judet MAX (judet) AS Ultimul_judet FROM STUDENT S, LOCALITATE L WHERE S.cod_localitate = L.cod_localitate
primul_judet Arges ultimul_judet Vaslui

Figura 4.54. Primul i ultimul jude n ordine alfabetic din care provin studeni Care este cartea cu cel mai mare numr de exemplare? SELECT titlu, MAX (nr_exemplare) AS Exemplare FROM CARTE
titlu exemplare

84

Database Transaction Models

120

Figura 4.55. Cartea cu cel mai mare numr de exemplare Care este cartea pentru care s-a pltit cel mai puin? SELECT titlu, MIN (nr_exemplare*pret_unitar) AS Val_minima FROM CARTE
titlu Database Transaction Models val_minima 27600000

Figura 4.56. Cartea pentru care s-a pltit cel mai puin Care este cel mai mare i cel mai mic pre unitar la care au fost achiziionate crile din domeniul Informatic? SELECT MAX (Pret_minim = + STR (pret_unitar, 8) + domeniu + domeniu) AS Pret_max_informatica, MIN ( pret minim = + STR (pret_unitar, 8) + domeniu + domeniu) AS pret_min_informatica FROM CARTE WHERE domeniu = Informatica
pret_max_informatica Pret_minim = 1000000 Informatica domeniu pret_min_informatica pret minim = 140000 Informatica domeniu

Figura 4.57. Preul maxim i minim din domeniul Informatic Care sunt cele mai mari dou preuri unitare la care au fost achiziionate crile din domeniu Informatic? SELECT Domeniu Informatica + MAX (Primul pret unitar + STR (C1.pret_unitar, 8) + al doilea pret unitar + STR (C2.pret_unitar, 8) AS Cele mai mari preturi unitare FROM CARTE C1, CARTE C2 WHERE C1.cota_carte = C2.cota_carte AND C1.pret_unitar > C2.pret_unitar AND C1.domeniu = Informatica
cele_mai_mari_preturi_unitare Domeniu Informatica Primul pret unitar 1000000 al doilea pret unitar 600000

Figura 4.58. Cele mai mari dou preuri pentru crile din domeniu Informatic 4.10. Gruparea tuplurilor Clauza GROUP BY formeaz grupe de tupluri ale unei relaii, pe baza valorilor comune ale unui atribut. n frazele SELECT de pn acum au fost selectate tupluri ale tabelei. Prin asocierea unei clauze HAVING la GROUP BY este posibil selectarea anumitor grupuri de tupluri, care ndeplinesc un criteriu valabil doar la nivel de grup (nu i la nivel de linie). 4.10.1. Clauza GROUP BY Rezultatul unei fraze SELECT ce conine aceast clauz se obine prin regruparea tuturor liniilor din tabele enumerate n clauza FROM, extrgndu-se cte o apariie pentru fiecare valoare distinct a coloanei/grupului de coloane.

85

Formatul general este: SELECT coloana 1, coloana 2,.., coloana n FROM lista_tabele GROUP BY coloana_de_regrupare Care este suma ncasat pe fiecare tip de burs n parte? SELECT tip_bursa, SUM (suma_incasata) AS total_bursa FROM BURSA GROUP BY tip_bursa Rezultatul se obine prin urmtoarea succesiune de operaii: - se ordoneaz liniile tabelei BURSA dup atributul de grupare tip_bursa, - se constituie un grup pentru fiecare valoare distinct a tip_bursa, - se execut funcia SUM (suma_incasata) n cadrul fiecrui grup, - se obine rezultatul al crui numr de linii coincide cu valorile distincte ale tip_bursa. Schema simplificat de execuie a interogrii este prezentat n figura 4.59.
tip_bursa Exceptionala Merit Sociala Studiu total_bursa 5000000 2000000 4000000 4500000

Figura 4.59.Totalul burselor acordate pe fiecare tip de burs n parte Care este valoarea total a burselor pentru fiecare zi n care s-au ncasat burse? SELECT data_incasarii, SUM (suma_incasata) AS Total_zi FROM BURSA GROUP BY data_incasarii
data_incasarii 16.01.2004 26.01.2004 28.01.2004 30.01.2004 02.02.2004 16.02.2004 18.02.2004 20.02.2004 total_zi 1000000 1000000 1000000 2500000 1500000 3500000 3500000 1500000

Figura 4.60. Totalul burselor acordate pe zile Care este totalul burselor pe faculti? SELECT facultate, SUM (suma_incasata) AS Total_facultate FROM STUDENT S, BURSA B WHERE S.nr_matricol = B.nr_matricol GROUP BY facultate
facultate Colegiul Economic Stiinte Economice total_facultate 1000000 12000000

86

Stiinte Juridice

4000000

Figura 4.61. Totalul burselor pe faculti Care este media burselor pe seciile facultii de tiine Economice? SELECT sectia, AVG (suma_incasata) AS Medie_sectie FROM STUDENT S, BURSA B WHERE S.nr_matricol = B.nr_matricol AND facultate = Stiinte Economice GROUP BY sectia
sectia CIG FA MG medie_sectie 1250000 1833333 1500000

Figura 4.62. Media burselor pe faculti Care este totalul burselor pe cmin, ncasate de studenii cminiti?

87

SELECT nume_camin, SUM (suma_incasata) AS Total_camin FROM STUDENT S, BURSA B, STUDCAMIN SC WHERE S.nr_matricol = SC.nr_matricol AND S.nr_matricol B.nr_matricol GROUP BY nume_camin
nume_camin Caminul nr. 2 Miclas Sportiv total_camin 1000000 4000000 1000000

Figura 4.63. Totalul burselor pe cmin Care este numrul total de exemplare i valoarea total a fiecrei cri? SELECT titlu, SUM (nr_exemplare) (pret_unitar*nr_exemplare) AS Val_totala FROM CARTE GROUP BY titlu
titlu Baze de date Bazele contabilitatii Bazele politici sociale Conception orientee objets Contabilitate de gestiune Contabilitate generala Database Transaction Models Drept comercial Economie Politica Informatica de gestiune Merise vers OMT et UML Object-Oriented Modelling Politici si optiuni contabile Sisteme expert Sql. Dialecte Teoria generala a dreptului

AS

Total_exemplare,

SUM

total_exemplare 30 114 10 12 120 110 6 10 175 100 5 12 60 24 5 89

val_totala 7200000 21700000 1600000 12000000 22800000 22650000 3600000 8000000 35570000 27400000 2815000 7200000 5400000 3360000 1750000 15575000

Figura 4.64. Numrul total i valoarea total pe fiecare carte n parte Care este numrul total de exemplare din fiecare domeniu n parte? SELECT domeniu, SUM (nr_exemplare) AS Total_exemplare FROM CARTE GROUP BY domeniu
domeniu Contabilitate Drept Economie Informatica total_exemplare 404 99 185 194

Figura 4.65. Numrul total de exemplare pe domenii Care este numrul crilor din bibliotec n funcie de naionalitatea autorilor? SELECT nationalitate, COUNT (C.cota_carte) AS Nr_carti FROM CARTE C, AUTORCARTE AC, AUTOR A

88

WHERE C.cota_carte = A.cod_autor GROUP BY nationalitate

AC.cota_carte

AND

AC.cod_autor

nationalitate Englez Francez Roman Suedez

nr_carti 2 1 7 1

Figura 4.66. Numrul crilor n funcie de naionalitatea autorilor Care este totalul burselor ncasate pe fiecare tip de burs pentru fiecare zi n care s-au ncasat burse? SELECT tip_bursa, SUM (suma_incasata) data_incasarii FROM BURSA GROUP BY tip_bursa, data_incasarii
tip_bursa Exceptionala Exceptionala Merit Sociala Sociala Sociala Sociala Studiu Studiu Studiu total_bursa 2500000 2500000 2000000 1000000 1000000 1000000 1000000 1500000 1500000 1500000 data_incasarii 30-Jan-04 16-Feb-04 18-Feb-04 16-Jan-04 26-Jan-04 28-Jan-04 16-Feb-04 02-Feb-04 18-Feb-04 20-Feb-04

AS

Total_bursa,

Figura 4.67. Total burse pe zile Care este numrul crilor din bibliotec n funcie de naionalitatea autorilor, pe domenii? SELECT nationalitate, domeniu (COUNT (cota_carte) AS Nr_carti) FROM CARTE C, AUTORCARTE AC, AUTOR A WHERE C.cota_carte = AC.cota_carte AND AC.cod_autor = A.cod_autor GROUP BY nationalitate, domeniu
nationalitate Englez Francez Roman Roman Suedez domeniu Informatica Informatica Contabilitate Informatica Informatica nr_carti 2 1 5 2 1

Figura 4.68. Crile dup naionalitatea autorilor pe domenii 4.10.2. Clauza HAVING Cea mai simpl definiie ar fi: clauza HAVING este WHERE-ul ce opereaz la nivel de grupuri. Dac WHERE acioneaz la nivel de tuplu, selectnd acele linii care ndeplinesc o condiie specificat, HAVING permite specificarea unor condiii de selecie ce se aplic grupurilor de linii create prin clauza GROUP BY.

89

Din rezultat sunt eliminate toate grupurile care nu satisfac condiia specificat. Formatul general este: SELECT coloana 1, coloana 2, ..., coloana n FROM lista_tabele GROUP BY coloana_de_regrupare HAVING criteriu_de_regrupare Care sunt zilele n care s-au ridicat cel puin 2 burse? SELECT data_incasarii, COUNT (*) AS Nr_burse FROM BURSA GROUP BY data_incasarii HAVING COUNT (*) > = 2
data_incasarii 16-Feb-04 18-Feb-04 nr_burse 2 2

Figura 4.69. Zilele n care s-au ridicat cel puin dou burse Care sunt crile pentru care s-au cheltuit peste 10.000.000 lei? SELECT titlu, SUM (pret_unitar*nr_exemplare) Suma_cheltuita FROM CARTE GROUP BY titlu HAVING SUM (pret_unitar*nr_exemplare) > 10000000
titlu Bazele contabilitatii Conception orientee objets Contabilitate de gestiune Contabilitate generala Economie Politica Informatica de gestiune Teoria generala a dreptului suma_cheltuita 21700000 12000000 22800000 22650000 35570000 27400000 15575000

AS

Figura 4.70. Crile pentru care s-au cheltuit peste 10.000.000 lei Sintez Acest capitol a avut ca obiectiv prezentarea detaliat a celui mai puternic limbaj structurat pentru interogarea bazelor de date relaionale. Dup ce n primul subcapitol am realizat prezentarea general a limbajului n subcapitolul urmtor am trecut la descrierea elementelor de baz ale interogrilor SQL (SELECT, FROM, WHERE). Tot aici am realizat (pentru o mai bun nelegere a limbajului) i o paralel ntre clauzele principale ale frazei SELECT cu operatorii algebrei relaionale prezentai n capitolul 3. Toate elementele prezentate pe parcursul acestui capitol (opiunea ORDER BY, operatorii LIKE, BETWEEN, IN, theta i echijonciunea, sinonime locale i jonciunea unei tabele cu ea nsi, subconsultri, funcii agregat, gruparea tuplurilor) pentru fundamentare au fost asociate cu o serie de exemple practice (pentru toate aceste exemple, s-au folosit tabelele din ANEX) att n standardul SQL-92 ct i n Visual FoxPro. Studiu de caz

90

Se consider urmtoarea baz de date: PACIENT (codpacient, nume, prenume, datanasterii, localitate) PROGRAMARE (nrprogramare, dataprogramare, oraprogramare, codpacient) CONSULTATIE (nrconsultatie, tipconsultatie, codpacient, dataconsultatie) MEDICI (codmedic, numemedic, prenumemedic) MEDIC_CONSULTATIE (nrconsultatie, codmedic) TARIFE (tipconsultatie, tarif) Folosind comenzi SQL s se determine: 1. Care sunt pacienii din Trgovite; 2. Care sunt pacienii din Trgovite i Titu; 3. Care pacieni nu sunt din Trgovite i Titu; 4. Care sunt pacienii care s-au nscut n anul 1989; 5. Care sunt tarifele mai mari de 25 RON; 6. Din ce localiti sunt pacienii din baz; 7. Care este nume i prenumele medicilor care ofer consultaii; 8. Care sunt tarifele practicate; 9. Din ce localitate sunt pacienii nscui n luna ianuarie 1990; 10. Care sunt orele pentru care sunt prevzute consultaii n data de 09.02.2006; 11. Cum se numesc pacienii din Trgovite i Moreni; 12. Care este prenumele medicilor cu numele de familie Ghionea; 13. La ce data i la ce or are programare Popa Georgeta; 14. Care sunt datele la care au fcut programare pacienii din Trgovite; 15. Numele pacienilor care au fost consultai n luna februarie 2006; 16. Data la care a fcut programare Dinescu Mircea i Vancea Ioan; 17. Numele medicilor care au acordat consultaii n data de 23.02.2006; 18. De ce medic a fost consultat Popa Georgeta; 19. Numele pacienilor consultai de Grecu Anca; 20. Nume pacienilor care au fcut programare i n luna ianuarie i n luna februarie 2006; 21. Care este tariful consultaiei pacientului Popa Georgeta; 22. Numele pacienilor care au fcut programare n data de 10.02.2006 n intervalul 14-16; 23. Datele la care au efectuat consultaii Grecu Anca i Minea Ion n luna februarie 2006; 24. Numele i prenumele medicilor care au consultat pacieni din Trgovite i Moreni dar nu din Titu; 25. Nume pacienilor care au avut programare n data de 10.20.2006 n intervalul 12-14 i au fost consultai de ctre Grecu Anca. 26. Numele i prenumele n ordine alfabetic al pacienilor pe localiti; 27. Numele i prenumele pacienilor pe zile de programare; 28. Numele i prenumele pacienilor pe zile de consultaie; 29. Cte consultaii a acordat Grecu Anca n luna februarie 2006; 30. Ct a primit Grecu Anca n luna februarie 2006 pentru consultaiile acordate, tiut fiind faptul c fiecare medic primete un onorariu de 10 RON pentru fiecare consultaie acordat; 31. Cte programri a fcut pacientul Popa Georgeta;

91

ANEXA 1 STRUCTURA BAZEI DE DATE FOLOSITE PENTRU EXEMPLIFICRI STUDENT nr_matricol BURSA nr_matricol nume facultate sectia data_nasterii cod_localitate

data_incasarii

tip_bursa

suma_incasata

STUDCAMIN nr_matricol nume_camin LOCALITATE cod_localitate

camera

strada

nume_localitate

cod_judet

judet

regiune

STUDCARTE nr_matricol cota_carte CARTE cota_carte titlu editura AUTORCARTE cod_autor cota_carte AUTOR cod_autor

data_imprumut

domeniu

an_aparitie nr_exemplare pret_unitar

nume_autor

nationalitate

an_nastere

92

ANEXA 2 CONINUTUL TABELELOR FOLOSITE PENTRU EXEMPLIFICRI TABELA STUDENT

TABELA BURSA

TABELA STUDCAMIN

93

TABELA LOCALITATE

TABELA STUDCARTE

94

TABELA CARTE

TABELA AUTORCARTE

95

TABELA AUTOR

96

ANEXA 3 REZOLVRILE STUDIILOR DE CAZ Studiu de caz Se consider urmtoarea baz de date: PACIENT (codpacient, nume, prenume, datanasterii, localitate) PROGRAMARE (nrprogramare, dataprogramare, oraprogramare, codpacient,nrconsultatie) CONSULTATIE (nrconsultatie, tipconsultatie, codpacient, dataconsultatie) MEDICI (codmedic, numemedic, prenumemedic) MEDIC_CONSULTATIE (nrconsultatie, codmedic) TARIFE (tipconsultatie, tarif) Folosind operatorii algebrei relaionale s se determine: 1. Care sunt pacienii din Trgovite; R1 SELECIE(PACIENT; localitate=Targoviste) 2. Care sunt pacienii din Trgovite i Titu; R1 SELECIE(PACIENT; localitate=Titu) localitate=Targoviste or

3. Care pacieni nu sunt din Trgovite i Titu; R1 SELECIE(PACIENT; localitate<>Targoviste localitate<>Titu) sau R1 SELECIE(PACIENT; localitate=Titu) R2 PACIENT R1 localitate=Targoviste

and

or

4. Care sunt pacienii care s-au nscut n anul 1989; R1 SELECIE(PACIENT; datanasterii>= datanasterii<= 31/12/1989) 5. Care sunt tarifele mai mari de 25 RON; R1 SELECIE(TARIFE; tarif>25) 6. Din ce localiti sunt pacienii din baz; R1 PROIECIE(PACIENT; localitate)

01/01/1989

and

7. Care este nume i prenumele medicilor care ofer consultaii; R1 JONCIUNE(MEDICI; MEDIC_CONSULTATIE; codmedic) R2 PROIECIE(R1; numemedic, prenumemedic) 8. Care sunt tarifele practicate; R1 PROIECIE(TARIFE; tarif) 9. Din ce localitate sunt pacienii nscui n luna ianuarie 1990; R1 SELECIE(PACIENT; datanasterii>= datanasterii<= 31/01/1990) R2 PROIECIE(R1; localitate) 01/01/1990 and

97

10. Care sunt orele pentru care sunt prevzute consultaii n data de 09.02.2006; R1 SELECIE(CONSULTATIE; dataconsultatie = 09/02/2006) R2 JONCIUNE(R1, PROGRAMARE; nrconsultatie) R3 PROIECIE(R2; oraprogramare) 11. Cum se numesc pacienii din Trgovite i Moreni; R1 SELECIE(PACIENT; localitate = Targoviste) R2 PROIECIE(R1; nume) R3 SELECIE(PACIENT; localitate = Titu) R4 PROIECIE(R3; nume) R5 R2 R4 12. Care este prenumele medicilor cu numele de familie Ghionea; R1 SELECIE(MEDICI; numemedic = Ghionea) R2 PROIECIE(R1; prenumemedic) 13. La ce data i la ce or are programare Popa Georgeta; R1 SELECIE(PACIENT; nume=Popa and prenume=Georgeta) R2 JONCIUNE(R1, PROGRAMARE; codpacient) R3 PROIECIE(R3; dataprogramare, oraprogramare) 14. Care sunt datele la care au fcut programare pacienii din Trgovite; R1 SELECIE(PACIENT; localitate = Targoviste) R2 JONCIUNE(R1, PROGRAMARE; codpacient) R3 PROIECIE(R3; dataprogramare, oraprogramare) 15. Numele pacienilor care au fost consultai n luna februarie 2006; R1 JONCIUNE(PACIENT, PROGRAMARE; codpacient) R2 JONCIUNE(R1, CONSULTATIE; nrconsultatie) R3 SELECIE(R2; dataconsultatie >= 01/02/2006 dataconsultatie <= 28/02/2006) R4 PROIECIE(R3; nume, prenume)

and

16. Data la care a fcut programare Dinescu Mircea i Vancea Ioan; R1 SELECIE(PACIENT; nume = Dinescu and prenume = Mircea) R2 JONCIUNE(R1, PROGRAMARE; codpacient) R3 PROIECIE(R2, dataprogramare) R4 SELECIE(PACIENT; nume = Vancea and prenume = Ioan) R5 JONCIUNE(R4, PROGRAMARE; codpacient) R6 PROIECIE(R5, dataprogramare) R7 R4 R6 sau R1 SELECIE(PACIENT; (nume = Dinescu and prenume Mircea) or (nume = Vancea and prenume = Ioan)) R2 JONCIUNE(R1, PROGRAMARE; codpacient) R3 PROIECIE(R2, dataprogramare) 17. Numele medicilor care au acordat consultaii n data de 23.02.2006; =

98

R1 R2 R3 R4

SELECIE(CONSULTATIE; dataconsultatie = 23/02/2006) JONCIUNE(R1, MEDIC_CONSULTATIE; nrconsultatie) JONCIUNE(R2, MEDICI; codmedic) PROIECIE(RE; numemedic, prenumemedic)

18. De ce medic a fost consultat Popa Georgeta; R1 JONCIUNE(PACIENT, CONSULTATIE; codpacient) R2 JONCIUNE(R1, MEDIC_CONSULTATIE; nrconsultatie) R3 JONCIUNE(R2, MEDICI; codmedic) R4 SELECIE(R3; nume = Popa and prenume = Georgeta) R5 PROIECIE(R4; numemedic, prenumemedic) 19. Numele pacienilor consultai de Grecu Anca; R1 SELECIE(MEDICI; numemedic = Grecu and prenumemedic = Anca) R2 JONCIUNE(R1, MEDIC_CONSULTATIE; codmedic) R3 JONCIUNE(R2, CONSULTATIE; nrconsultatie) R4 JONCIUNE(R3, PACIENT; codpacient) R5 PROIECIE(R4; nume, prenume) 20. Nume pacienilor care au fcut programare i n luna ianuarie i n luna februarie 2006; R1 JONCIUNE(PACIENT, CONSULTATIE; codpacient) R2 SELECIE(R1; dataprogramare >= 01/01/2006 and dataprogramare <= 31/01/2006) R3 SELECIE(R1; dataprogramare >= 01/02/2006 and dataprogramare <= 2831/02/2006) R4 R2 R3 R5 PROIECIE(R4; nume, prenume) 21. Care este tariful consultaiei pacientului Popa Georgeta; R1 SELECIE(PACIENT; nume = Popa Georgeta) R2 JONCIUNE(R1, CONSULTATIE; codpacient) R3 JONCIUNE(R2, TARIFE; nrconsultatie) R4 PROIECIE(R3; tarif) and prenume =

22. Numele pacienilor care au fcut programare n data de 10.02.2006 n intervalul 14-16; R1 SELECIE(PROGRAMARE; dataprogramare = 10/02/2006) R2 SELECIE(R1; oraprogramare>= 14 and oraprogramare <=16) R3 JONCIUNE(R2, PACIENT; codpacient) R4 PROIECIE(R3; nume, prenume) 23. Datele la care au efectuat consultaii Grecu Anca i Minea Ion n luna februarie 2006; R1 SELECIE(MEDICI; numemedic = Grecu and prenumemedic = Anca) R2 JONCIUNE(R1, MEDIC_CONSULTATIE; codmedic) R3 JONCIUNE(R2, CONSULTATIE; nrconsultatie) R4 SELECIE(R3; dataconsultatie >= 01/02/2006 and dataconsultatie <= 28/02/2006) R5 PROIECIE(R4; dataconsultatie) R6 SELECIE(MEDICI; numemedic = Minea and prenumemedic = Ion) R7 JONCIUNE(R6, MEDIC_CONSULTATIE; codmedic)

99

R7 JONCIUNE(R7, CONSULTATIE; nrconsultatie) R9 SELECIE(R8; dataconsultatie >= 01/02/2006 dataconsultatie <= 28/02/2006) R10 PROIECIE(R9; dataconsultatie) R11 R5 R10

and

24. Numele i prenumele medicilor care au consultat pacieni din Trgovite i Moreni dar nu din Titu; R1 JONCIUNE(MEDICI, MEDIC_CONSULTATIE; codmedic) R2 JONCIUNE(R1, CONSULTATIE; nrconsultatie) R3 JONCIUNE(R2, PACIENT; codpacient) R4 SELECIE(R3; localitate = Targoviste) R5 PROIECIE(R4; numemedic, prenumemedic) R6 SELECIE(R3; localitate = Moreni) R7 PROIECIE(R6; numemedic, prenumemedic) R8 SELECIE(R3; localitate = Titu) R9 PROIECIE(R8; numemedic, prenumemedic) R10 R5 R7 R9 Sau R1 SELECIE(PACIENT; (localitate = Targoviste localitate = Moreni) and localitate <> Titu) R2 JONCIUNE(R1, CONSULTATIE; codpacient) R3 JONCIUNE(R2, MEDIC_CONSULTATIE; nrconsultatie) R4 JONCIUNE(R3; MEDICI; codmedic) R5 PROIECIE(R4; numemedic, prenumemedic) or

25. Numele pacienilor consultai de Grecu Anca n luna februarie 2006; R1 SELECIE(MEDICI; numemedic = Grecu and prenumemedic = Anca) R2 JONCIUNE(R1, MEDIC_CONSULTATIE; codmedic) R3 JONCIUNE(R2, CONSULTATIE; nrconsultatie) R4 SELECIE(R3; dataconsultatie >= 01/02/2006 and dataconsultatie <= 28/02/2006) R5 JONCIUNE(R4, PACIENT; codpacient) R6 SELECIE(R5; nume, prenume) 26. Data la care au fost consultai pacienii care au fcut programare n data de 10.02.2006; R1 JONCIUNE(PACIENT, PROGRAMARE; codpacient) R2 SELECIE(R1; dataprogramare = 10/02/2006) R3 JONCIUNE(R2, CONSULTATIE; nrconsultatie) R4 PROIECIE(R3; dataconsultatie) 27. Nume pacienilor care au avut programare n data de 10.02.2006 n intervalul 12-14 i au fost consultai de ctre Grecu Anca. R1 JONCIUNE(PACIENT, PROGRAMARE; codpacient) R2 JONCIUNE(R1, CONSULTATIE; nrconsultatie) R3 JONCIUNE(R2, MEDIC_CONSULTATIE; nrconsultatie) R4 JONCIUNE(R3, MEDICI; codmedic) R5 SELECIE(R4; dataprogramare = 10/02/2006) R6 SELECIE(R5; oraprogramare >= 12 and oraprogramare <=16)

100

R7 SELECIE(R6; numemedic = Grecu and prenume Anca) R8 PROIECIE(R7; nume, prenume) NOT: Rezolvrile prezentate nu sunt restrictive. Pot fi avute n vedere i alte soluii.

101

Studiu de caz Se consider urmtoarea baz de date: PACIENT (codpacient, nume, prenume, datanasterii, localitate) PROGRAMARE (nrprogramare, dataprogramare, oraprogramare, codpacient) CONSULTATIE (nrconsultatie, tipconsultatie, codpacient, dataconsultatie) MEDICI (codmedic, numemedic, prenumemedic) MEDIC_CONSULTATIE (nrconsultatie, codmedic) TARIFE (tipconsultatie, tarif) Folosind comenzi SQL s se determine: 1. Care sunt pacienii din Trgovite; SELECT * FROM PACIENT WHERE localitate=Targoviste 2. Care sunt pacienii din Trgovite i Titu; SELECT * FROM PACIENT WHERE localitate=Targoviste or localitate=Titu 3. Care pacieni nu sunt din Trgovite i Titu; SELECT * FROM PACIENT WHERE localitate<>Targoviste and localitate<>Titu 4. Care sunt pacienii care s-au nscut n anul 1989; varianta general (SQL-92) SELECT * FROM PACIENT WHERE datanasterii >= 01/01/1989 and datanasterii<= 31/12/1989 varianta Visual FoxPro SELECT * FROM PACIENT WHERE datanasterii {^1989/12/31}

>=

{^1989/01/01}and sau

datanasterii<=

SELECT * FROM PACIENT WHERE datanasterii BETWEEN >= 01/01/1989 and <= 31/12/1989 5. Care sunt tarifele mai mari de 25 RON; SELECT tarif FROM TARIFE WHERE TARIF>= 25 6. Din ce localiti sunt pacienii din baz; SELECT localitate

102

FROM PACIENT 7. Care este nume i prenumele medicilor care ofer consultaii; varianta general (SQL-92) SELECT numemedic, prenumemedic FROM MEDICI, MEDIC_CONSULTATIE WHERE MEDICI.codmedic=MEDIC_CONSULTATIE.codmedic varianta VFP SELECT numemedic, prenumemedic FROM MEDICI INNER JOIN MEDIC_CONSULTATIE MEDICI.codmedic=MEDIC_CONSULTATIE.codmedic 8. Care sunt tarifele practicate; SELECT tarif FROM TARIFE 9. Din ce localitate sunt pacienii nscui n luna ianuarie 1990; varianta general (SQL-92) SELECT localitate FROM PACIENT WHERE datanasterii >= 01/01/1990 and datanasterii <= 31/01/1990 varianta VFP SELECT localitate FROM PACIENT WHERE datanasterii {^1990/12/31}

ON

>=

{^1990/01/01}

and

datanasterii

<=

sau SELECT localitate FROM PACIENT WHERE datanasterii BETWEEN >= 01/01/1990 and <= 31/01/1990 10. Care sunt orele pentru care sunt prevzute consultaii n data de 09.02.2006; SELECT oraprogramare FROM PROGRAMARE WHERE dataprogramare = 09/02/2006 11. Cum se numesc pacienii din Trgovite i Moreni; SELECT nume, prenume FROM PACIENT WHERE localitate = Targoviste or localitate = Moreni 12. Care este prenumele medicilor cu numele de familie Ghionea; SELECT prenumemedic FROM MEDICI WHERE numemedic = Ghionea 13. La ce data i la ce or are programare Popa Georgeta;

103

varianta general (SQL-92) SELECT dataprogramare, oraprogramare FROM PACIENT P, PROGRAMARE PRG WHERE P.codpacient = PRG.codpacient and (nume=Popa and prenume = Georgeta) varianta VFP SELECT dataprogramare, oraprogramare FROM PACIENT P INNER JOIN PROGRAMARE PRG ON P.codpacient = PRG.codpacient WHERE nume=Popa and prenume = Georgeta 14. Care sunt datele la care au fcut programare pacienii din Trgovite; varianta general (SQL-92) SELECT dataprogramare FROM PACIENT P, PROGRAMARE PRG WHERE P.codpacient = PRG.codpacient and localitate = Targoviste varianta VFP SELECT dataprogramare FROM PACIENT P INNER JOIN PROGRAMARE PRG ON P.codpacient = PRG.codpacient WHERE localitate = Targoviste

15. Numele pacienilor care au fost consultai n luna februarie 2006; varianta general (SQL-92) SELECT nume, prenume FROM PACIENT P, CONSULTATIE C WHERE P.codpacient = C.codpacient and (dataconsultatie 01/02/2006 and dataconsultatie <= 28/02/2006)

>=

varianta VFP SELECT nume, prenume FROM PACIENT P INNER JOIN CONSULTATIE C ON P.codpacient = C.codpacient WHERE dataconsultatie >= {^2006/02/01} and dataconsultatie <= {^2006/02/28} 16. Data la care a fcut programare Dinescu Mircea i Vancea Ioan; varianta general (SQL-92) SELECT dataprogramare FROM PACIENT P, PROGRAMARE PRG WHERE P.codpacient = PRG.codpacient and (nume = Dinescu and prenume = Mircea) and (nume = Vancea and prenume = Ioan varianta VFP SELECT dataprogramare FROM PACIENT P INNER PRG.codpacient

JOIN

PROGRAMARE

PRG

ON

P.codpacient

104

WHERE (nume = Dinescu and prenume = Mircea) Vancea and prenume = Ioan 17. Numele medicilor care au acordat consultaii n data de 23.02.2006; varianta general (SQL-92) SELECT numemedic, prenumemedic FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C WHERE M.codmedic=MC.codmedic MC.nrconsultatie=C.nrconsultatie and dataconsultatie = 23/02/2006

and (nume =

and

varianta VFP SELECT numemedic, prenumemedic FROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ON M.codmedic = MC.codmedic INNER JOIN CONSULTATIE C ON MC.NRCONSULTATIE = C.nrconsultatie and dataconsultatie = {^2006/02/23} 18. De ce medic a fost consultat Popa Georgeta; varianta general (SQL-92) SELECT numemedic, prenumemedic FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C, PACIENT P WHERE M.codmedic=MC.codmedic and MC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacient and (nume = Popa and prenume = Georgeta) varianta VFP SELECT numemedic, prenumemedic FROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ON M.codmedic = MC.codmedic INNER JOIN CONSULTATIE C ON MC.nrconsultatie = C.nrconsultatie INNER JOIN PACIENT P ON C.codpacient = P.codpacient WHERE nume = Popa and prenume = Georgeta 19. Numele pacienilor consultai de Grecu Anca; varianta general (SQL-92) SELECT numemedic, prenumemedic FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C, PACIENT P WHERE M.codmedic=MC.codmedic and MC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacient and (numemedic = Grecu and prenumemedic = Anca) varianta VFP SELECT numemedic, prenumemedic FROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ON M.codmedic = MC.codmedic INNER JOIN CONSULTATIE C ON MC.nrconsultatie = C.nrconsultatie INNER JOIN PACIENT P ON C.codpacient = P.codpacient WHERE numemedic = Grecu and prenumemedic = Anca 20. Nume pacienilor care au fcut programare i n luna ianuarie i n luna februarie 2006; varianta general (SQL-92) SELECT nume, prenume

105

FROM PACIENT P, PROGRAMARE PRG WHERE P.codpacient = PRG.codpacient and 01/01/2006 and dataprogramare <= 31/01/2006 INTERSECT SELECT nume, prenume FROM PACIENT P, PROGRAMARE PRG WHERE P.codpacient = PRG.codpacient and 01/02/2006 and dataprogramare <= 28/02/2006 varianta VFP DE VERIFICAT IN FOX

dataprogramare

>=

dataprogramare

>=

21. Care este tariful consultaiei pacientului Popa Georgeta; varianta general (SQL-92) SELECT tarif FROM PACIENT P, CONSULTATIE C, TARIFE T WHERE P.codpacient = C.codpcient and C.nrconsultatie T.nrconsultatie and (nume = Popa and prenume = Georgeta)

varianta VFP SELECT tarif FROM PACIENT P INNER JOIN CONSULTATIE C ON P.codpacient = C.codpcient INNER JOIN TARIFE T ON C.nrconsultatie = T.nrconsultatie WHERE nume = Popa and prenume = Georgeta 22. Numele pacienilor care au fcut programare n data de 10.02.2006 n intervalul 14-16; varianta general (SQL-92) SELECT nume, prenume FROM PACIENT P, PROGRAMARE PRG WHERE P.codpacient = PRG.codpacient and dataprogramare 10/02/2006 and (oraprogramare >= 14 and oraprogramare <=16)

varianta VFP SELECT nume, prenume FROM PACIENT P INNER JOIN PROGRAMARE PRG ON P.codpacient = PRG.codpacient WHERE and dataprogramare = {^2006/02/10} and (oraprogramare >= 14 and oraprogramare <=16) 23. Datele la care au efectuat consultaii Grecu Anca i Minea Ion n luna februarie 2006; varianta general (SQL-92) SELECT dataconsultatie FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C, PACIENT P WHERE M.codmedic=MC.codmedic and MC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacient and (numemedic = Grecu and prenumemedic = Anca) and (dataconsultatie >= 01/02/2006 and dataconsultatie <= 28/02/2006) INTERSECT SELECT dataconsultatie FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C, PACIENT P

106

WHERE M.codmedic=MC.codmedic and MC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacient and (numemedic = Minea and prenumemedic = Ioan) and (dataconsultatie >= 01/02/2006 and dataconsultatie <= 28/02/2006) varianta VFP SELECT dataconsultatie FROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ON M.codmedic = MC.codmedic INNER JOIN CONSULTATIE C ON MC.nrconsultatie = C.nrconsultatie INNER JOIN PACIENT P ON C.codpacient = P.codpacient WHERE (numemedic = Grecu and prenumemedic = Anca) and (numemedic = Minea and prenumemedic = Ioan) and (dataconsultatie >= {^2006/02/01} and dataconsultatie <= {^2006/02/28}) 24. Numele i prenumele medicilor care au consultat pacieni din Trgovite i Moreni dar nu din Titu; varianta general (SQL-92) SELECT numemedic, prenumemedic FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C, PACIENT P WHERE M.codmedic=MC.codmedic and MC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacient localitate = Targoviste INTERSECT SELECT numemedic, prenumemedic FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C, PACIENT P WHERE M.codmedic=MC.codmedic and MC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacient localitate = Moreni MINUS SELECT numemedic, prenumemedic FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C, PACIENT P WHERE M.codmedic=MC.codmedic and MC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacient localitate = Titu varianta VFP SELECT numemedic, prenumemedic FROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ON M.codmedic = MC.codmedic INNER JOIN CONSULTATIE C ON MC.nrconsultatie = C.nrconsultatie INNER JOIN PACIENT P ON C.codpacient = P.codpacient WHERE (localitate = Targoviste or localitate = Moreni) and localitate <> Titu

25. Nume pacienilor care au avut programare n data de 10.02.2006 n intervalul 12-14 i au fost consultai de ctre Grecu Anca.

107

varianta general (SQL-92) SELECT nume, prenume FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C, PACIENT P WHERE M.codmedic=MC.codmedic and MC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacient and dataconsultatie=10/02/2006 and (oraconsultatie>=12 and oraconsultatie <=14) and (numemedic=Grecu and prenumemedic=Anca) varianta VFP SELECT nume, prenume FROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ON M.codmedic = MC.codmedic INNER JOIN CONSULTATIE C ON MC.nrconsultatie = C.nrconsultatie INNER JOIN PACIENT P ON C.codpacient = P.codpacient WHERE dataconsultatie={^2006/02/10} and (oraconsultatie>=12 and oraconsultatie <=14) and (numemedic = Grecu and prenumemedic = Anca)

26. Numele i prenumele n ordine alfabetic al pacienilor pe localiti; SELECT nume, prenume FROM PACIENT ORDER BY nume, prenume GROUP BY localitate 27. Numele i prenumele pacienilor pe zile de programare; varianta general (SQL-92) SELECT nume, prenume FROM PACIENT P, PROGRAMARE PRG WHERE P.codpacient=PRG.codpacient GROUP BY dataprogramare varianta VFP SELECT nume, prenume FROM PACIENT P INNER P.codpacient=PRG.codpacient GROUP BY dataprogramare

JOIN

PROGRAMARE

ON

28. Numele i prenumele pacienilor pe zile de consultaie; varianta general (SQL-92) SELECT nume, prenume FROM PACIENT P, PROGRAMARE PRG, CONSULTATIE C WHERE P.codpacient=PRG.codpacient PRG.nrconsultatie=C.nrconsultatie GROUP BY dataconsultatie varianta VFP SELECT nume, prenume FROM PACIENT P INNER P.codpacient=PRG.codpacient INNER PRG.nrconsultatie=C.nrconsultatie GROUP BY dataconsultatie

and

JOIN JOIN

PROGRAMARE CONSULTATIE

ON ON

108

29. Cte consultaii a acordat Grecu Anca n luna februarie 2006; varianta general (SQL-92) SELECT COUNT(*) AS nrconsultatii FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C WHERE M.codmedic=MC.codmedic and MC.nrconsultatie=C.nrconsultatie and (dataconsultatie>=01/02/2006 and dataconsultatie<=28/02/2006) and (numemedic=Grecu and prenumemedic=Anca) varianta VFP SELECT COUNT(*) AS nrconsultatii FROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ON M.codmedic = MC.codmedic INNER JOIN CONSULTATIE C ON MC.nrconsultatie = C.nrconsultatie WHERE (dataconsultatie>={^2006/02/01} and dataconsultatie<={^2006/02/28}) and (numemedic = Grecu and prenumemedic = Anca) 30. Ct a primit Grecu Anca n luna februarie 2006 pentru consultaiile acordate, tiut fiind faptul c fiecare medic primete un onorariu de 10 RON pentru fiecare consultaie acordat; varianta general (SQL-92) SELECT COUNT(*) AS nrconsultatii, COUNT(*)*10 as onorariu FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C WHERE M.codmedic=MC.codmedic and MC.nrconsultatie=C.nrconsultatie and (dataconsultatie>=01/02/2006 and dataconsultatie<=28/02/2006) and (numemedic=Grecu and prenumemedic=Anca) varianta VFP SELECT COUNT(*) AS nrconsultatii, COUNT(*)*10 as onorariu FROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ON M.codmedic = MC.codmedic INNER JOIN CONSULTATIE C ON MC.nrconsultatie = C.nrconsultatie WHERE (dataconsultatie>={^2006/02/01} and dataconsultatie<={^2006/02/28}) and (numemedic = Grecu and prenumemedic = Anca) 31. Cte programri a fcut pacientul Popa Georgeta; varianta general (SQL-92) SELECT COUNT(*) AS programari FROM PACIENT P, PROGRAMARE PRG WHERE P.codpacient=PRG.codpacient varianta VFP SELECT COUNT(*) AS programari FROM PACIENT P INNER P.codpacient=PRG.codpacient

JOIN

PROGRAMARE

ON

NOT: Rezolvrile prezentate nu sunt restrictive. Pot fi avute n vedere i alte soluii.

109

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