Baze de Date Radu Florin 2010-2011

119
qwertyuiopasdfghjklzxcvbnmqwertyu iopasdfghjklzxcvbnmqwertyuiopasdfg hjklzxcvbnmqwertyuiopasdfghjklzxcv bnmqwertyuiopasdfghjklzxcvbnmqwe rtyuiopasdfghjklzxcvbnmqwertyuiopa sdfghjklzxcvbnmqwertyuiopasdfghjkl zxcvbnmqwertyuiopasdfghjklzxcvbnm qwertyuiopasdfghjklzxcvbnmrtyuiopa sdfghjklzxcvbnmqwertyuiopasdfghjkl zxcvbnmqwertyuiopasdfghjklzxcvbnm qwertyuiopasdfghjklzxcvbnmqwertyu iopasdfghjklzxcvbnmqwertyuiopasdfg hjklzxcvbnmqwertyuiopasdfghj klzxcv bnmqwertyuiopasdfghjklzxcvbnmqwe rtyuiopasdfghjklzxcvbnmqwertyuiopa sdfghjklzxcvbnmqwertyuiopasdfghjkl zxcvbnmqwertyuiopasdfghjklzxcvbnm qwertyuiopasdfghjklzxcvbnmrtyuiopa sdfghjklzxcvbnmqwertyuiopasdfghjkl Departamentul de Învăţământ la Distanţă şi Formare Continuă Facultatea de Ştiinţe Economice Coordonator de disciplină: Lect. univ. drd. Florin RADU

Transcript of Baze de Date Radu Florin 2010-2011

qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmrtyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmrtyuiopasdfghjklzxcvbnmqwertyuiopasdfghjkl

Departamentul de Învăţământ laDistanţă şi Formare Continuă

Facultatea de Ştiinţe Economice

Coordonator de disciplină:Lect. univ. drd. Florin RADU

2

Suport de curs – învăţământ la distanţăManagement , Anul I, Semestrul II

Prezentul curs este protejat potrivit legii dreptului de autor și orice folosire altadecât în scopuri personale este interzisă de lege sub sancțiune penală

ISBN 978-9731955-04-92010-2011

Suport de curs – învăţământ la distanţă Management, Anul I, Semestrul II

Suport de curs – învăţământ la distanţă Management, Anul I, Semestrul II

Suport de curs – învăţământ la distanţă

UVTBAZE DE DATE

3

SEMNIFICAŢIA PICTOGRAMELOR

F= INFORMAŢII DE REFERINŢĂ/CUVINTE CHEIE

= TEST DE AUTOEVALUARE

= BIBLIOGRAFIE

= TIMPUL NECESAR PENTRU STUDIUL UNEI UNITĂŢIDE ÎNVĂŢARE

= INFORMAŢII SUPLIMENTARE PUTEŢI GĂSI PEPLARFORMA ID

4

CUPRINS - Studiu individual (S.I.)

MODUL 1. INTRODUCERE IN BAZELE DE DATE / pag. 6

Obiective / pag. 6UI.1. Concepte fundamentale privind bazele de date / pag. 7

1.1. Conceptul de bază de date / pag. 71.2. Utilizatorii bazei de date / pag. 9

UI.2. Modele de reprezentare a datelor / pag. 112.1. Modelul ierarhic / pag. 112.2. Modelul reţea / pag. 132.3. Modelul relaţional / pag. 142.4. Modelul obiectual / pag. 18

UI.3. Sisteme de gestiune a bazelor de date / pag. 213.1. Funcţiile unui SGBD / pag. 213.2. Arhitectura funcţională a unui SGBD / pag. 253.3. Arhitectura operaţională a unei aplicaţii baze de date / pag. 27

Bibliografie / pag. 30

MODUL 2. ALGEBRA RELAŢIONALĂ / pag. 36

Obiective / pag. 36UI. 4. Caracterizarea generală a limbajelor de programare / pag. 37

UI.5. Operatorii asamblişti: Reuniunea, Intersecţia, Diferenţa, Produsulcartezian / pag. 39

5.1. Reuniunea / pag. 395.2. Intersecţia / pag. 405.3. Diferenţa / pag. 405.4. Produsul cartezian / pag. 41

UI. 6. Operatorii relaţionali: Selecţia, Proiecţia, Joncţiunea, Diviziunea/ pag. 43

6.1. Selecţia / pag. 436.2. Proiecţia / pag. 456.3. Înlănţuirea consultărilor / pag. 466.4. Joncţiunea / pag. 486.5. Diviziunea / pag. 55

Bibliografie / pag. 67

MODUL 3. LIMBAJUL DE INTEROGARE RELAŢIONAL SQL / pag. 68

Obiective / pag. 69UI.7. Prezentare generală; Elemente de bază ale interogărilor SQL / pag. 70

7.1. Prezentare generală / pag.707.2. Elemente de bază ale interogărilor SQL / pag. 71

UI.8. Coloane expresii; Opţiunea ORDER BY / pag. 79

5

8.1. Coloane expresii / pag. 798.2. Opţiunea ORDER BY / pag. 80

UI.9. Operatorii LIKE, BETWEEN, IN / pag. 829.1. Operatorul BETWEEN / pag. 829.2. Operatorul LIKE / pag. 839.3. Operatorul IN / pag. 84

UI.10. Theta şi echijoncţiunea / pag. 86

UI.11. Sinonime locale şi joncţiunea unei tabele cu ea însăşi / pag. 89

UI.12. Subconsultări / pag. 91

UI.13. Funcţii agregat: COUNT, SUM, AVG, MIN şi MAX / pag. 9513.1. Funcţia COUNT / pag. 9513.2. Funcţia SUM / pag. 9613.3. Funcţia AVG / pag. 9813.4. Funcţiile MAX şi MIN / pag. 99

UI.14. Gruparea tuplurilor: clauza GROUP BY şi clauza HAVING / pag. 10114.1. Clauza GROUP BY / pag. 10114.2. Clauza HAVING / pag. 103

Bibliografie / pag. 118

6

MODUL IINTRODUCERE ÎN BAZELE DE DATE

1. Cuprins2. Obiectiv general3. Obiective operaţionale4. Dezvoltarea temei5. Bibliografie selectivă

Cuprins� UI 1. Concepte fundamentale privind bazele de date: date

abstracte, modele de baze de date, independenţa datelor, limbaje de definireşi manipulare a datelor în bazele de date

= 1 ore� UI 2. Modele de reprezentare a datelor: modelul ierarhic,

modelul reţea, modelul relaţional şi modelul obiectual

= 2 ore� UI 3. Sisteme de gestiune a bazelor de date

= 1 ore

� Obiectiv general: Dobîndirea cunoştinţelor privind locul, rolulşi importanţa bazelor de date; dobândirea de cunoştinţe privind modele dereprezentare a datelor

� Obiective operaţionale: Însuşirea cunoştinţelor privindevoluţia metodelor de stoacre a informaţiilor; cunoaşterea categoriilor depersonal implicat în crearea, dezvoltarea şi exploatarea bazelor de date.Însuşirea de cunoştinţe specifice fiecărui domeniu: relaţie, legături,domeniu, tuplu, atibut, câmp, cheie primară, obiect

7

UNITATEA DE ÎNVĂŢARE 1CONCEPTE FUNDAMENTALE PRIVIND BAZELE DE DATE

1.1. Conceptul de bază de date

În cadrul oricărei întreprinderi, datele constituie o resursă organizaţională

crucială şi în consecinţă ele trebuiesc gestionate similar altor active importante.

Fără date asupra funcţionării interne şi asupra mediului extern întreprinderile nu ar

putea să se menţină în competiţie sau să reuşească în afaceri. Volumul acestor sate

este în continuă creştere. 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 legăturilor între realizările acestora

nu este o activitate deloc uşoară. 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:

fişiere, fişiere cu legături şi a culminat cu bazele de date actuale. Un fişier este un

ansamblu de înregistrări fizice, omogene din punct de vedre al conţinutului şi al

prelucrării. Fişierele conţin în cea mai mare parte elemente comune iar asocierile

dintre date nu sunt prea bine exploatate dat fiind faptul că fişierele sunt utilizate

izolat şi independent unele de altele. Soluţia fişierelor a fost specifică anilor ’60-

’70, dar mai sunt întâlnite şi în prezent în cadrul unor aplicaţii economice care

folosesc limbaje clasice şi îndeosebi limbajul COBOL.

Dominată în prezent este o altă soluţie, care constă în organizarea datelor

în baze de date. O bază de date este o colecţie organizată de date folosită în

scopul de a modela un anumit tip de organizaţie sau proces organizaţional.

În gestiunea bazelor de date există două tipuri de baze de date:

operaţionale şi analitice.

Bazele de date operaţionale constituie suportul a numeroase companii,

instituţii şi organizaţii din întreaga lume. Această categorie de baze de date este

utilizată în cazul prelucrărilor on-line a tranzacţiilor (OLTP – On Line Transaction

Processing), adică în acele situaţii în care este necesară colectarea, modificarea şi

întreţinerea zilnică a bazelor de date. Datele stocate într-o bază de date

operaţională sunt date de tip dinamic, ceea ce înseamnă că se modifică în

permanenţă şi reflectă întotdeauna informaţii actualizate la zi.

Fdefiniţia bazei dedate

8

Contrar acestora, bazele de date analitice sunt folosite în special în

prelucrările analitice on-line (OLAP – On Line Analitical Processing), când este

necesară stocarea şi urmărirea datelor istorice şi dependente de timp. O bază de

date analitice este de un real folos atunci când este necesară urmărirea tendinţelor,

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). Informaţiile 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 operaţionale ca

sursă principală de date, deci poate exista o oarecare asociere între cele două

tipuri; cu toate acestea, bazele de date operaţionale şi analitice satisfac tipuri de

necesităţi foarte concrete privind prelucrarea datelor.

1. Care sunt etapele prin care a trecut organizarea datelor?(vezi pag. 31-35)

2. Ce este o bază de date analitică? (vezi pag. 31-35)

3. Ce este o bază de date? (vezi pag. 31-35)

4. Ce este o bază de date operaţională? (vezi pag. 31-35)

5. Ce reprezintă OLTP? (vezi pag. 31-35)

9

6. Ce reprezintă OLAP? (vezi pag. 31-35)

7. Există legătură între bazele de date operaţionale şi cele analitice?(vezi pag. 31-35)

1.2. Utilizatorii bazei de date

O bază de date poate avea unul sau mai mulţi utilizatori. În funcţie de rolul

acestora distingem trei clase de utilizatori ai bazelor de date:

Ø Programatorii de aplicaţii, 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,

adăugarea de noi date, ştergerea sau modificarea datelor existente. Aceste funcţii

se execută printr-o interogare adresată SGBD-ului.

Ø Utilizatorii finali, cuprind două categorii de utilizatori:

Ø Utilizatorul expert, informatician, cunoscând limbajele de

programare şi limbajele bazelor de date;

Ø Utilizatorul neinformatician, care nu este specialist în baze de

date.

Utilizatorii finali interacţionează cu baza de date de la o staţie de lucru sau

de la un terminal, utilizând fie una din aplicaţiile menţionate la punctul precedent,

fie o interfaţă care face parte integrantă din SGBD.

Majoritatea SGBD-urilor furnizează cel puţin 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 săi alte tipuri de interfeţe î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

interfeţe grafice sunt mai uşor de folosit de utilizatorii care nu au cunoştinţe

formale în tehnologia informaţiei.

F

F

10

Ø Administratorul BD, care asigură administrarea unitară a datelor din

baza de date.

Ø Funcţiile asigurate de către 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 performanţelor şi asigurarea evoluţiei bazei de date, etc.

8. Cine sunt utilizatorii bazei de date? (vezi pag. 31-35)

9. Care sunt funcţiile asigurate de administratorul bazei de date?(vezi pag. 31-35)

F

11

UNITATEA DE ÎNVĂŢARE 2MODELE DE REPREZENTARE A DATELOR ÎN BAZELE DE DATE

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 părinte poate avea mai multe noduri

fiu, în timp de un nod fiu nu poate avea decât un singur nod părinte. Schema

ierarhiei are un singur nod rădăcină, iar pentru reprezentarea relaţiilor de tipul m:n

într-o structură de bază de date ierarhică se admite duplicate pentru instanţele

înregistrărilor fiu.

Pentru a realiza reprezentarea acestui model se folosesc diagramele de

structură care sunt formate din două elemente principale: dreptunghiuri –pentru

tipurile de înregistrări – şi linii – pentru legături. Aceste diagrame se aseamănă cu

o structură arborescentă, locul liniilor fiind luat de tipurile de înregistrare.

Pentru a pune în evidenţă legăturile care pot exista între tipurile de

înregistrări, se folosesc următoarele reprezentări grafice:

Ø relaţia 1:1 – se consideră tipurile de înregistrări CONTRIBUABIL şi

ROL. Între aceste două tipuri de înregistrări există următoarea legătură: orice

contribuabil aflat în evidenţa administraţiei financiare are deschis un singur rol,

iar fiecare rol deschis la administraţiei nu aparţine decât unui singur contribuabil.

Reprezentarea grafică a acestei legături este următoarea:

Ø relaţia 1:n – se consideră tipul de înregistrări COMANDĂ şi CLIENT.

Între aceste tipuri de înregistrări există următoarea legătură: un client emite mai

multe comenzi, în timp ce o comandă este emisă de un singur client.

Reprezentarea grafică a acestei legături este următoarea:

Ø relaţia m:n - se consideră tipul de înregistrări COMANDĂ şi

PRODUSE. Între aceste tipuri de înregistrări există următoarea legătură: o

comandă poate conţine mai multe produse, iar un produs poate fi inclus în mai

multe comenzi. Reprezentarea grafică a acestei legături este următoarea:

CONTRIBUABIL ROL

CLIENT COMANDĂ

COMANDĂ PRODUSE

F

F

F

12

O bază de date ierarhică este constituită dintr-un grup de înregistrări

interconectate prin intermediul unor legături. O înregistrare reprezintă o colecţie

de câmpuri, fiecare câmp conţinând o singură valoare, iar prin legătură se înţelege

o asociere între cele două câmpuri. Fiecare tip de înregistrare din diagrama de

structură are asociat în baza de date un anumit număr de realizări, ceea ce

înseamnă că pentru fiecare tip de înregistrare părinte pot exista nici una, una sau

mai multe înregistrări ale tipului de înregistrare fiu. De exemplu, un anumit client

nu a emis nici o comandă.

Exemplu: Se consideră o bază de date cu informaţii despre studenţii şi

specializările unei facultăţi. O specializare are mai mulţi studenţi, în schimb, un

student nu poate urma decât o singură specializare. Reprezentarea modelul

ierarhic al exemplului este prezentată mai jos:

În acest exemplu, tipului de înregistrare părinte SPECIALIZARE îi

corespund patru înregistrări: (CIG, Contabilitate), (FB, Finanţe), (MG,

Management) şi (MK, Marketing). Prima înregistrare, (CIG, Contabilitate) este

părinte pentru (120, Popa Dan, Vaslui), care este o realizare a tipului de entitate

STUDENŢI, a doua înregistrare nu are înregistrări fiu, a treia înregistrare are doi

fii (322, Radu Ioana, Arad) şi (187, Vlad Andrei, Iaşi), în timp ce ultima

înregistrare are un singur fiu (562, Sima Ileana, Titu).

10. Enumeraţi modelele de descriere a datelor. (vezi pag. 31-35)

F

13

11. Care sunt tipurile de relaţii folosite în modelul relaţional?(vezi pag. 31-35)

12. Ce este o bază de dată ierarhică? (vezi pag. 31-35)

2.2. Modelul reţea

Este un model care are la bază o structură de tip reţea. Acest model este

oarecum similar cu modelul ierarhic, în sensul că un nod părinte poate avea mai

mulţi fii, deosebirea constând în faptul că un nod fiu poate avea mai mulţi părinţi.

Ca şi modelul ierarhic şi modelul reţea foloseşte diagramele de structură, care se

aseamănă cu un graf, nodurile fiind înlocuite de tipurile de înregistrare.

Reprezentarea grafică a legăturilor care pot exista între tipurile de înregistrări

(legături 1:1, 1:n, n:m) este similară modelului ierarhic.

Exemplu: Se consideră o bază de date cu informaţii despre studenţi,

specializarea urmată de aceştia şi bursele pe care aceştia le primesc. O specializare

are mai mulţi studenţi, în schimb, un student nu poate urma decât o singură

specializare; bursa poate fi obţinută de mai mulţi studenţi, în schimb, un student

poate obţine o singură bursă.

Reprezentarea modelul reţea al exemplului este realizată în cele ce

urmează:

F

14

În acest exemplu, tipului de înregistrare părinte SPECIALIZARE îi

corespund patru înregistrări: (CIG, Contabilitate), (FA, Finanţe), (MG,

Management) şi (MK, Marketing), tipului de înregistrare BURSE trei realizări

(Studiu, 1.200.000), (Socială, 1.000.000) şi (Merit, 1.900.000), iar tipului de

înregistrare STUDENŢI patru realizări (120, Popa Dan, Vaslui), (322, Radu

Ioana, Arad) , (187, Vlad Andrei, ) şi (562, Sima Ileana, Titu). Înregistrările (CIG,

Contabilitate) – SPECIALIZARE şi (Studiu, 1.200.000) – BURSE sunt părinţi

pentru (120, Popa Dan, Studiu) – STUDENŢI. Înregistrarea (FA, Finanţe) nu are

înregistrări fiu. Înregistrarea (Socială, 1.000.000) – BURSE şi (MG,

Management) – SPECIALIZARE sunt părinţi pentru (322, Radu Ioana, Socială).

Realizarea (187, Vlad Andrei, ) are drept părinte (MG, Management), iar

înregistrarea (562, Sima Ileana, Merit) este copilul realizărilor (MK, Marketing) şi

(Merit, 1.900.000).

13. Reprezentarea grafică a legăturilor care pot exista între tipurile deînregistrări (legături 1:1, 1:n, n:m) în modelul reţea este similarămodelului ierarhic? (vezi pag. 31-35)

2.3. Modelul relaţional

Modelul relaţional a fost introdus de E. F. Codd şi reprezintă astăzi cel mai

utilizat model pentru gestionarea bazelor de date.

Modelul are la bază conceptul de relaţie definit în teoria matematică a

mulţimilor ca fiind o submulţime a produsului cartezian al mai multor mulţimi: R

a M1 x M2 x … x Mn.

Familia de mulţimi pe care este definită relaţia se numeşte domeniu, atunci

când M1 = M2 = … = Mn se spune că relaţia este omogenă. Numărul n se numeşte

gradul relaţiei, un element al relaţiei t = (m1, m2, …, mn) se numeşte tuplu, iar

numărul de tupluri indică cardinalitatea relaţiei.

Schema unei relaţii este formată din numele relaţiei, atributele acesteia şi

restricţiile de integritate.

Domeniul reprezintă mulţimea tuturor valorilor posibile care definesc o

anumită proprietate a unui obiect. Atributul reprezintă mulţimea valorilor

F

15

existente la un moment dat în coloana pe care acesta o desemnează în cadrul unei

relaţii. Într-o relaţiei pot exista mai multe atribute care să ia valori în acelaşi

domeniu.

Relaţia STUDENŢI se scrie în felul următor

Relaţiile se prezintă sub forma unor tabele, supuse următoarelor restricţii:

- fiecare coloană din tabel conţine acelaşi fel de valori;

- în tabel ordinea liniilor nu este stabilită şi în acelaşi timp nu se admit

valori duplicate;

- orice valoare este un număr sau un şir de caractere (nu are cum să fie un

ansamblu);

- orice coloană este identificată printr-un nume care reprezintă atributul

relaţiei.

O bază de date, privită din punct de vedere al modelului relaţional, este

văzută ca o colecţie de tabele (relaţii), în care fiecare coloană reprezintă un atribut

distinct, iar fiecare rând, un tuplu distinct.

Tuplurile unei relaţii se pot identifica în mod unic prin intermediul

valorilor unuia sau mai multor atribute, care joacă rolul de cheie primară a relaţiei

respective.

Orice relaţie posedă cel puţin o cheie. Când această cheie este alcătuită

dintr-un singur atribut, poartă numele de cheie simplă, iar atunci când este formată

din mai multe atribute ea se numeşte cheie compusă.

Cheia primară a unei tabele este un atribut sau un grup de atribute care

permite identificarea fără ambiguitate a fiecărui 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ă).

F

16

Cheia primară trebuie să verifice următoarele trei restricţii:

- unicitatea: o cheie identifică un singur tuplu al relaţiei;

- compoziţia minimală: atunci când cheia primară este compusă, nici un

atribut cheie nu poate fi eliminat fără distrugerea unicităţii tuplului în cadrul

relaţiei;

- valorile non-nule: valorile atributului sau ale ansamblului de atribute care

desemnează cheia primară sunt întotdeauna specificate, deci nenule; nici un

atribut din compoziţia cheii primare nu poate avea valori nule.

Dacă într-o relaţie există mai multe combinaţii de atribute care conferă

unicitatea tuplului, acestea sunt denumite chei candidate. Atunci când o cheie

candidată nu este cheie primară este considerată cheie alternativă (secundară).

Legăturile între tuplurile din relaţii diferite se realizează prin atribute sau

combinaţii de atribute numite chei străine (externe).

Reflectând un aspect din realitate, relaţiile se spun unor restricţii, ce pot fi

de două feluri:

Ø restricţii de integritate – depind de semantica valorilor domeniilor şi

impun relaţiilor să se supună regulilor:

- integritatea entităţii – 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 relaţii.

Ø alte restricţii – se aplică asupra domeniilor şi reflectă anumite corelaţii

de ordin valoric (egalitate, inegalitate).

Avantajele modelului relaţional în comparaţie cu celelalte tipuri de modele

sunt:

- independenţa sporită a programelor de aplicaţie faţă de modul de

reprezentare internă a datelor şi de metodele de acces la date;

- definirea unei structuri conceptuale optime, minimalizând redundanţa

datelor şi erorile la actualizare;

- utilizarea unor limbaje procedurale bazate pe algebra relaţională şi a unor

limbaje neprocedurale care contribuie la îmbunătăţirea comunicării dintre sistem

şi neinformaticieni.

14. Din ce este formată schema unei relaţii? (vezi pag. 31-35)

17

15. Ce este domeniul? (vezi pag. 31-35)

16. Ce este atributul? (vezi pag. 31-35)

17. Care sunt restricţiile la care sunt supuse relaţiile? (vezi pag. 31-35)

18. Ce este o cheie primară? (vezi pag. 31-35)

19. Care sunt restricţiile pentru cheie primară? (vezi pag. 31-35)

20. Care sunt avantajele modelului relaţional? (vezi pag. 31-35)

18

2.4. Modelul obiectual

Deşi în prezent cel mai utiliza model este modelul relaţional, el nu

permite: descrierea unor structuri de date complexe (documente electronice, date

în format multimedia); partajarea şi reutilizarea structurilor de date; declararea

prelucrărilor aferente structurilor de date (datele sunt descrise separat de

prelucrări). Răspunsul la astfel de cerinţe îl constituie modelul orientat obiect.

Modelarea orientată obiect se bazează pe următoarele concepte: obiect,

abstractizare, încapsulare, moştenire, 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 realităţii. 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 relaţional datele sunt

identificate prin valorile cheilor primare definite de utilizato, în modelul orientat

obiect, identificarea obiectelor este făcută automat de sistem la crearea acestora şi

este transparentă utilizatorului. Două obiecte O1 şi O2 sunt identice (O1==O2) dacă

au acelaşi identificator; în schimb două obiecte sun egale (O1=O2) dacă au

aceleaşi valori (O1==O2, implică O1=O2, reciproca nefiind valabilă).

Starea unui obiect este definită de valorile atributelor sale (realizările). Un

atribut se defineşte printr-un nume şi poate lua valori elementare (numeric,

alfanumeric) sau complexe (referinţe spre alte obiecte).

Exemplu: Clientul CL1: Cod = 678

Denumire = „S.C. N&L”

Localitate = „Târgovişte”

Comanda CDA1: Număr = 17865

Data = 10/12/2003

CotaTVA = 19%

Client = CL1.

Comportamentul unui obiect este definit ca un set de operaţii aplicate

obiectului respectiv. Operaţiile unui obiect reprezintă modalităţile de răspuns la

mesajele primite din exterior de obiectul respectiv; ele sunt de regulă proceduri

sau funcţii ce acţionează asupra obiectului respectiv.

19

Abstractizarea este procesul prin care obiectele care au aceleaşi atribute şi

comportament similar sunt grupate în tipuri abstracte de obiecte numite şi clase.

Obiectele devin astfel instanţieri (realizări) ale claselor; în timp ce obiectele

descriu entităţi ale realităţii, clasele sunt reprezentări abstracte ale acestor entităţi.

Exemplu: Client, Comandă, Student.

Încapsularea constă în capacitatea obiectelor de a conţine la un loc atât

date cât şi operaţii, dar numai o parte a acestora este vizibilă din exterior. Se poate

spune că în felul aceste obiectele apar ca nişte „cutii negre”, care ascund detaliile

de implementare, ele oferind o interfaţă simplă de rezolvare a unei probleme.

Moştenirea 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

lângă acestea pot conţine şi atribute sau metode specifice. Moştenirea se constituie

ca o cale de încurajare a partajării şi reutilizării structurilor de date; prin

intermediul ei se pot exprima relaţii 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, DataNaşterii, Sex

şi metoda publică

ReturneazăVârsta(An).

Din clasa PERSOANA pot fi derivate clasele ANGAJAT şi STUDENT,

de acelaşi fel cu ea, fiecare student angajat fiind descris prin CNP, nume şi

prenume, data naşterii, sex şi vârstă, calculată în funcţie de anul naşterii.

STUDENT poate conţine ca atribute specifice NumărMatricol, AnStudiu iar ca

metodă proprie MediaGenerală, în timp ce clasa ANGAJAT poate fi descrisă prin

atributele proprii Marca, DataAngajării şi metoda ReturneazăVechime().

PERSOANĂ

ANGAJAT STUDENT

20

Polimorfismul reprezintă posibilitate unui obiect, instanţă a unei clase, de a

răspunde în mod diferit la primirea aceluiaşi mesaj. Poate fi asigurat în două

variante:

- redefinirea metodelor moştenite în clasele derivate;

- crearea unor metode cu acelaşi nume sar cu parametri diferiţi

(supraîncărcarea unei metode).

Polimorfismul măreşte flexibilitatea modelului orientat obiect de a

reprezenta cât mai sintetic realitatea.

21. Care sunt conceptele pe care se bazează modelarea orientatăobiect? (vezi pag. 31-35)

21

UNITATEA DE ÎNVĂŢARE 3SISTEMUL 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

constrângeri. 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 numeşte aplicaţie bază de date sau sistem de bază de date un

ansamblu de programe construite în jurul unei baze de date şi integrând un SGBD

pentru gestiunea informaţiilor.

3.1. Funcţiile unui SGBD

În primul rând trebuie menţionate funcţiile esenţiale, adică cele pentru care

SGBD-ul este conceput. Ele sunt în număr 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 conţinutul lor. De exemplu

baza de date a unei biblioteci comportă un ansamblu de date referitoare la cărţi.

Înainte de a putea înregistra aceste date, trebuie definit cu precizie ansamblul

informaţiilor care se doreşte a fi administrat cu privire la aceste cărţi: numărul

(cota), titlul, numărul de exemplare, etc. Trebuie, de asemenea, estimată mărimea

sau cel puţin să fie definită mărimea maximă admisă: 30 caractere pentru titlu, 5

pentru număr, etc.

Odată definite structurile, funcţia de introducere permite tuturor

utilizatorilor inserarea de date în bază. Această funcţie de introducere trebuie, în

plus, să asigure toate controalele posibile, al acestor date. În cazul bibliotecii,

SGBD-ul trebuie să verifice dacă numărul cărţii este în forma cerută, dacă

mărimea titlului nu depăşeşte numărul maxim de caractere prevăzut, dacă numărul

de exemplare este un număr întreg pozitiv, etc.

Extragerea datelor desemnează toate operaţiile regulate sau punctuale, de

căutare şi de ieşire pe ecran, pe suport de hârtie sau pe un alt suport, în întregime

sau doar în parte a informaţiilor din baza de date. Se va putea, de exemplu, să se

extragă toate cărţile care sunt scrise de un anumit autor sau toate cărţile apărute în

colecţia „Baze de date”.

F

22

În fine, funcţia de actualizare trebuie să asigure modificare sistematică a

informaţiilor pe măsură ce acestea evoluează. La fiecare cumpărare a unei cărţi,

trebuie modificat numărul de exemplare al titlului corespunzător din baza de date.

Pentru că datele sunt partajate de către mai multe aplicaţii, dezvoltarea

funcţiilor descrise anterior, antrenează şi alte necesităţi.

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 protecţia

datelor. Primul priveşte confidenţialitatea: informaţia nu poate fi cunoscută de

toţi. Pentru fiecare tip de informaţie trebuie stabilită lista persoanelor sau a

grupurilor autorizate a le consulta. Al doilea aspect se referă la integritate:

informaţia nu poate fi modificată de toţi. În acest caz, se convine la definirea unui

cerc de persoane, în general foarte mic, abilitate să actualizeze informaţia. 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, protecţia se poate face la mai multe nivele:

accesul la întreaga bază, la o parte din ea sau la un singur element al bazei.

Protecţia datelor este unul din aspectele unei funcţii destul de importante

care este securitatea bazei de date. La această funcţie se adaugă şi funcţiile de

rezistenţă în cazul unor pene, pe care trebuie sa le furnizeze SGBD-ul. Un

program nu poate împiedica în totalitate apariţia incidentelor sau a problemelor

majore. Totuşi, el trebuie să fie în măsură să furnizeze mecanisme care să

faciliteze recuperarea datelor în cazul în care apar probleme grave. Bazele de date

sunt utilizate pentru a evita redundanţa informaţiilor stocate. Uneori, pentru a

minimiza consecinţele legate de eventualele probleme ce pot apărea, este necesar

efectuarea de salvări ale bazei de date. Aceste salvări nu sunt nimic altceva decât

date redundante, dar, în acest caz duplicarea informaţiilor este controlată de

SGBD.

SGBD-ul este dedicat manipulării datelor. Pentru aceasta trebuie să asigure

un „acces optimal” la date. Dincolo de organizarea fizică a datelor, SGBD-ul

trebuie să faciliteze căutarea acestora.

În aceeaşi 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ă interfaţarea –

comunicarea – SGBD-ului cu alte programe. Trebuie oferit un acces direct la date

23

sub o formă compatibilă cu categoriile de utilizatori, de exemplu o interfaţă

grafică pentru nespecialişti, un limbaj de acces puternic pentru informaticieni.

O altă funcţie importantă este controlul concurenţei. Într-adevăr o bază de

date trebuie să permită accesul simultan al mai multor utilizatori, fără nici un fel

de incident. Să luăm exemplu unui sistem de rezervare a locurilor pentru cursele

aeriene, fondat pe o bază de date. Aceasta trebuie să permită alocarea fiecărui loc

unei singure persoane şi numai uneia. O agenţie conectată la baza de date

respectivă, întreabă dacă a mai rămas un loc liber pentru zborul 747. I se răspunde

că a mai rămas unul singur. O altă agenţie pune imediat aceeaşi întrebare, înainte

ca prima agenţie să fi confirmat interesul său pentru locul rămas. Locul este încă

disponibil. Prima agenţie 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ă.

Realizarea unei baze de date are drept consecinţă punerea în comun şi

partajarea unui ansamblu de informaţii. Această punere în comun trebuie să

respecte două principii de independenţă: respectiv independenţa fizică şi

independenţa logică.

Independenţa fizică desemnează principiul conform căruia un program

care accesează datele din bază, trebuie să manipuleze aceste date într-un mod

abstract, independent de organizarea lor fizică. Independenţa logică caracterizează

accesul simultan al diferiţilor utilizatori sau programe la aceeaşi bază de date.

Fiecare program trebuie să poată lucra doar asupra părţii de date care doreşte.

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 diferiţi de cuvintele care vor fi utilizate în alte programe

sau de alţi utilizatori pentru a desemna aceleaşi date. Mecanisme precum sub-

schema în cazul bazelor de date reţea sau vederile în cazul bazelor de date

relaţionale permit ceastă independenţă logică.

22. Care sunt funcţiile unui SGBD? (vezi pag. 31-35)

F

24

23. Ce presupune descrierea datelor? (vezi pag. 31-35)

24. În ce constă extragerea datelor? (vezi pag. 31-35)

25. Ce implică protecţia datelor? (vezi pag. 31-35)

26. Care sunt cele două principii de independenţă? (vezi pag. 31-35)

25

3.2. Arhitectura funcţională a unui SGBD

Un SGBD este format din diferite module fiecare având în sarcină una sau

mai multe din funcţiile descrise anterior.

Figura 1.1. Arhitectura funcţională a unui SGBD

Ansamblul acestor module constituie puntea de legătură între baza de date

stocată pe unul sau mai multe discuri magnetice şi ansamblul utilizatorilor. La cel

mai înalt nivel SGBD –ul conţine un ansamblu de instrumente administrând

comunicarea directă cu utilizatorii. În funcţie de SGBD, oferta în termeni de

interfeţe este mai mult sau mai puţin bogată. Editorii de SGBD-uri tind să propună

diferite limbaje de acces la baza de date, adaptate gradului de competenţă sau

nevoilor categoriilor de utilizatori desemnaţi să lucreze cu datele, interfeţe

interactive dispun de instrumentele necesare punerii în legătură a programelor de

acces la date – scrise n limbaje de programare clasice – cu baza de date.

Instrumentele respective permit munca cu datele conţinute în baza de date.

SGBD-ul oferă, în plus, o interfaţă care permite de a acţiona asupra structurii

bazelor de date şi/sau asupra aspectelor tehnice, cum ar fi optimizarea bazelor,

configurarea lor. Această interfaţă este numită „interfaţa de administrare”. Ea este

rezervată, în general, informaticienilor dau utilizatorilor foarte avizaţi. Este

instrumentul de muncă privilegiat al administratorului bazei de date.

SGBD SGBD Interfaţa utilizator Interfaţa de administrare

SGF SGBDGestiunea fişierelor Mecanisme specifice

SGBDGestiunea acceselor

SGBDGestiunea tranzacţiilor

SGBDGestiunea discurilor

Discuri

F

26

Indiferent care ar fi interfaţa 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 acelaşi timp şi controlul integrităţii.

Altfel spus, el protejează datele verificând dată toate actualizările respectă

un ansamblu de reguli numite constrângeri de integritate. Se împiedică

modificările care violează aceste constrângeri şi avertizează utilizatorul de

problemele întâlnite. Tipurile de constrângeri admise de un SGBD vor fi descrie

mai târziu. Î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 tranzacţiilor este indispensabil pentru a asigura, în

acelaşi timp, buna execuţie a acceselor simultane şi pentru a realiza acţiunile care

vor permite, în caz de pană, recuperarea datelor în cea mai bună stare posibilă.

Răspunsul editorilor de SGBD-uri la aceste două nevoi a fost cvasi unanim:

punerea la punct a unui mecanism numit „tranzacţie” care permite definirea

ansamblului de executat „totul sau nimic” asupra bazei de date. Astfel, se asigură

că utilizatorii pot lucra simultan fără conflicte: cererea disponibilităţii unui loc în

avion şi rezervarea sa trebuie să facă pare din aceeaşi tranzacţie. Prin acelaşi

mijloc, în caz de pană, nu se reia decât tranzacţiile corect executate, adică

tranzacţiile terminate şi valide.

Toate modulele descrie până acum sunt parte componentă a SGBD.

Totuşi, SGBD-ul nu este în relaţie directă cu baza de date. După cum am văzut

baza de date este constituită dintr-un ansamblu de fişiere, îmbogăţite cu structuri

zise de acces. Aceste fişiere sunt, în general, administrate de sistemul de gestiune

al fişierelor (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 dispoziţie mecanisme suplimentare de organizare şi acces la datele

stocate în aceste fişiere.

Ultimul strat reprezentat în figură nu este intern SGBD. El reprezintă

sistemul de gestiune al intrărilor-ieşirilor al sistemului de operare. El permite

convertirea comenzilor scrise în straturile superiore în ordinea citire, scriere,

deplasare şi poziţionare a capetelor pe discuri. Realizează, de asemenea, operaţiile

necesare pentru căutarea şi actualizarea datelor. De fapt, baze de date este stocată

27

pe disc. Totuşi, toate informaţiile asupra datelor sunt efectuate în memoria

centrală. Gestiunea discurilor asigură deci toate transferurile între memoria

centrală şi spaţiul de stocare de pe disc.

27. Descrieţi grafic arhitectura funcţională a unui SGBD(vezi pag. 31-35)

3.3. Arhitectura operaţională a unei aplicaţii baze de date

La început, SGBD-urile erau concepute pentru sisteme centralizate.

Utilizatorii conectaţi la aceste sisteme partajau aceleaşi date implantate pe acelaşi

disc şi încărcate în acelaşi spaţiu de memorie centrală.

Apariţia micro-informaticii în anii 1980 a dus la realizarea de SGBD la

nivel micro. Totuşi, utilizatorii şi-au exprimat rapid dorinţa de a putea interacţiona

cu baza de date centralizată prin intermediul microcalculatorului. Acestea nu avea

însă puterea şi securitatea marilor sisteme.

F

28

La începutul anilor 1990 apare conceptul de arhitectură client/server. Se

consideră că o aplicaţie informatică comportă în general trei tipuri de tratamente:

gestiunea datelor (căutare, actualizare), logica aplicativă care înseamnă calcule,

reflecţii şi în cele din urmă prezentarea rezultatelor. Se vorbeşte de client/server

de îndată ce aceste tratamente sunt repartizate între cel puţin două calculatoare.

Este evident faptul că gestiunea datelor este mai bine asigurată de marile sisteme.

În schimb, prezentarea rezultatelor este mai mulţumitoarea 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 afişat pe postul client, de exemplu prin intermediului

unui tabel.

Figura 1.2. Arhitectura client server

Acest tip de funcţionare este eficace în măsura în care fiecare dintre cei doi

efectuează sarcina pentru care este cel mai adaptat: prezentarea rezultatelor este

efectuată de către client, gestiunea datelor (coerenţa, integritatea) este asigurată de

server.

Logica aplicativă poate fi executată fie de client, fie de server. Totuşi, în

primul caz, inconvenientul este că ansamblul de date uneori voluminos tranzitează

reţeaua. Dacă numărul utilizatorilor este foarte mare, reţeaua poate fi foarte

încărcată.

Server

Client 1 Client 2 Client n� � � � � � �

Cererea client către serverRăspunsul serverului către client

29

În cazul în care logic aplicativă este efectuată de server, acesta poate fi

foarte solicitat de un mare număr de utilizatori simultan. În ciuda acestor

inconveniente, arhitecturi de acest tip sunt încă foarte utilizate în întreprinderi. În

aceste configuraţii, 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 aplicaţie şi postul client:

Figura 1.3. Arhitectura pe 3 niveluri

28. Descrieţi grafic arhitectura client/server. (vezi pag. 31-35)

Server

Client 1 Client 2 Client n� � � � � � �

Server de aplicaţie

30

29. Descrieţi grafic arhitectura pe 3 niveluri. (vezi pag. 31-35)

BIBLIOGRAFIE SELECTIVĂ

I. Tratate şi monografii.

1. Michael Hernandez – Proiectarea bazelor de date, Editura Teora,

Bucureşti, 2003

2. Mariana Miloşescu – Baze de date în Visual FoxPro, Editura Teora,

2003

3. Marin Fotache, Proiectarea bazelor de date, Editura Polirom, Iaşi, 2005

4. Grupul BDASEIG, Baze de date. Fundamente teoretice şi practice,

Editura Infomega, Bucureşti, 2002

5. Florin Radu, Baze de date, Editura Bibliotheca, Târgovişte, 2007

31

Rezolvarea testelor de autoevaluare

1. Care sunt etapele prin care a trecut organizarea datelor?

a.fişiereb.fişiere cu legăturic.bazele de date actuale

2. Ce este o bază de date analitică?

Bazele de date analitice sunt folosite în special în prelucrările analiticeon-line (OLAP – On Line Analitical Processing), când este necesarăstocarea şi urmărirea datelor istorice şi dependente de timp

3. Ce este o bază de date?

O bază de date este o colecţie organizată de date folosită în scopul de amodela un anumit tip de organizaţie sau proces organizaţional

4. Ce este o bază de date operaţională?

Baza de date operaţională este utilizată în cazul prelucrărilor on-line atranzacţiilor (OLTP – On Line Transaction Processing), adică în acelesituaţii în care este necesară colectarea, modificarea şi întreţinereazilnică a bazelor de date

5. Ce reprezintă OLTP?

OLTP – On Line Transaction Processing

6. Ce reprezintă OLAP?

OLAP – On Line Analitical Processing

7. Există legătură între bazele de date operaţionale şi cele analitice?

Bazele de date analitice utilizează frecvent bazele de date operaţionaleca sursă principală de date, deci poate exista o oarecare asociere întrecele două tipuri; cu toate acestea, bazele de date operaţionale şianalitice satisfac tipuri de necesităţi foarte concrete privind prelucrareadatelor.

8. Cine sunt utilizatorii bazei de date?

a.Programatorii de aplicaţiib.Utilizatorii finalic.Administratorul BD

32

9. Care sunt funcţiile asigurate de administratorul bazei de date?a. Definirea schemei conceptualeb.Definirea schemei interne.c.Definirea schemei externed.Definirea procedurilor de salvare şi restaurare.

10. Enumeraţi modelele de descriere a datelor

a.modelul ierarhicb.modelul reţeac.modelul relaţionald.modelul obiectual;

11. Care sunt tipurile de relaţii folosite în modelul relaţional?

a.relaţia 1:1b.relaţia 1:nc.relaţia m:n

12. Ce este o bază de dată ierarhică?

O bază de date ierarhică este constituită dintr-un grup de înregistrăriinterconectate prin intermediul unor legături

13. Reprezentarea grafică a legăturilor care pot exista între tipurile deînregistrări (legături 1:1, 1:n, n:m) în modelul reţea este similarămodelului ierarhic?

DA

14. Din ce este formată schema unei relaţii?

Schema unei relaţii este formată din numele relaţiei, atributele acesteiaşi restricţiile de integritate.

15. Ce este domeniul?

Domeniul reprezintă mulţimea tuturor valorilor posibile care definesc oanumită proprietate a unui obiect

16. Ce este atributul?

Atributul reprezintă mulţimea valorilor existente la un moment dat încoloana pe care acesta o desemnează în cadrul unei relaţii

17. Care sunt restricţiile la care sunt supuse relaţiile?

a. fiecare coloană din tabel conţine acelaşi fel de valori;b.în tabel ordinea liniilor nu este stabilită şi în acelaşi timp nu se admit

valori duplicate;c.orice valoare este un număr sau un şir de caractere;d.orice coloană este identificată printr-un nume care reprezintă

atributul relaţiei.

33

18. Ce este o cheie primară?

Cheia primară a unei tabele este un atribut sau un grup de atribute carepermite identificarea fără ambiguitate a fiecărui tuplu din tabelă

19. Care sunt restricţiile pentru cheie primară?

a.unicitateab.compoziţia minimalăc.valorile non-nule

20. Care sunt avantajele modelului relaţional?

a.independenţa sporită a programelor de aplicaţie faţă de modul dereprezentare internă a datelor şi de metodele de acces la date;

b.definirea unei structuri conceptuale optime, minimalizând redundanţadatelor şi erorile la actualizare;

c.utilizarea unor limbaje procedurale bazate pe algebra relaţională şi aunor limbaje neprocedurale care contribuie la îmbunătăţireacomunicării dintre sistem şi neinformaticieni.

21. Care sunt conceptele pe care se bazează modelarea orientată obiect?

Modelarea orientată obiect se bazează pe următoarele concepte: obiect,abstractizare, încapsulare, moştenire, polimorfism.

22. Care sunt funcţiile unui SGBD?

a.descrierea datelorb.introducerea datelorc.extragerea/interogarea datelord.actualizarea datelor

23. Care sunt cele două principii de independenţă?

Independenţa fizică şi independenţa logică

34

24. Descrieţi grafic arhitectura funcţională a unui SGBD

25. Ce presupune descrierea datelor?

Descrierea datelor este acea parte care permite, înainte de introducereadatelor, de a defini numele acestor date, structura şi conţinutul lor. Deexemplu baza de date a unei biblioteci comportă un ansamblu de datereferitoare la cărţi.

26. În ce constă extragerea datelor?

Extragerea datelor desemnează toate operaţiile regulate sau punctuale,de căutare şi de ieşire pe ecran, pe suport de hârtie sau pe un alt suport,în întregime sau doar în parte a informaţiilor din baza de date.

27. Ce implică protecţia datelor?

Există două aspecte legate de protecţia datelor. Primul priveşteconfidenţialitatea: informaţia nu poate fi cunoscută de toţi. Pentrufiecare tip de informaţie trebuie stabilită lista persoanelor sau agrupurilor autorizate a le consulta. Al doilea aspect se referă laintegritate: informaţia nu poate fi modificată de toţi. În acest caz, seconvine la definirea unui cerc de persoane, în general foarte mic,abilitate să actualizeze informaţia.

35

28. Descrieţi grafic arhitectura client/server.

29. Descrieţi grafic arhitectura pe 3 niveluri.

36

M.2. ALGEBRA RELAŢIONALĂ

1. Cuprins2. Obiectiv general3. Obiective operaţionale4. Dezvoltarea temei5. Bibliografie selectivă

Cuprins

� UI. 4. Caracterizarea generală a limbajelor de programare;

= 1 oră� UI. 5. Operatorii asamblişti: Reuniunea, Intersecţia,

Diferenţa, Produsul cartezian;

= 1 oră� UI. 6. Operatorii relaţionali: Selecţia, Proiecţia, Joncţiunea,

Diviziunea

= 10 ore

� Obiectiv general: Dobândirea cunoştinţelor cu privire laoperatorii algebrei relaţionale

� Obiective operaţionale: Cunoaşterea modului de aplicare aoperatorilor asamblişti (reuniune, intersecţie, produs cartezian, diferenţă) şia celor relaţionali (selecţie, proiecţie, joncţiune, diviziune)

37

UNITATEA DE ÎNVĂŢARE 4CARACTERIZARE GENERALĂ A LIMBAJELOR DE INTEROGARE

Bazele de date relaţionale au ca principal obiectiv acoperirea nevoilor

informaţionale ale conducerii firmei la toate nivelurile ierarhice. Până la

consacrarea definitivă a SGBDR-urilor, extragerea informaţiilor dorite din baza de

date se realiza în principal prin aplicaţii dezvoltate exclusiv prin intermediul

limbajelor procedurale, în care se precizau atât datele dorite, cât şi metodele de

căutare şi de extragere a acestora. Generalizarea SGBDR-urilor este strâns legată

de elaborarea şi implementarea unor limbaje performante pentru manipularea

bazelor de date – limbajele de interogare.

Limbajele relaţionale sunt limbaje neprocedurale, în sensul că utilizatorul

defineşte doar datele ce trebuie extrase din baza de date, sarcina căutării şi

extragerii fiind în sarcina exclusivă a SGBD-ului.

Limbajele de manipulare a datelor, plecând de la cele două modalităţi de

definire a unei relaţii (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 rândul lor limbajele predicative sunt împărţite în:

Ø limbaje care au la bază calculul relaţional asupra tuplurilor;

Ø limbaje în care calculul relaţional se aplică doar asupra domeniilor.

Pentru limbajele de manipulare a datelor bazate pe calculul predicatelor,

elementul definitoriu îl constituie noţiunea de variabilă, noţiune ce poate fi

asociată atât tuplurilor, cât şi domeniilor.

O altă clasificare este cea care realizează o delimitare între limbajele non-

grafice şi cele grafice. Prima categorie permite realizarea unei consultări, prin

dispunerea succesivă a operatorilor, atributelor şi relaţiilor, în timp ce a doua

categorie permite redactarea consultării în mod interactiv, prin afişarea pe ecran a

unui sistem de meniuri şi elemente de dialog din care opţiunile pot fi selectate şi

modificate uşor cu ajutorul mouse-ului

Există o serie de caracteristici comune tuturor limbajelor de interogare:

Ø rezultatul consultării este o nouă relaţie ce poate servi, în continuare, ca

argument într-o nouă consultare;

F

38

Ø operatoriile relaţionali se aplică relaţiilor considerate în totalitatea lor,

adică tuturor tuplurilor care alcătuiesc relaţiile 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 relaţional, înainte de toate

trebuie parcursă o fază de analiză, pentru determinarea rezultatului, a legăturilor

dintre tabele precum şi a eventualelor restricţii ce trebuie respectate.

Algebra relaţională cuprinde două tipuri de operatori: asamblişti

(REUNIUNE, INTERSECŢIE, DIFERENŢĂ, PRODUS CARTEZIAN) şi

relaţionali (SELECŢIE, PROIECŢIE, JONCŢIUNE, DIVIZIUNE).

Într-o altă clasificare se face diferenţa între operatorii fundamentali,

ireductibili (reuniunea, diferenţa, produsul cartezian, selecţia şi proiecţia) şi

operatorii derivaţi, a căror funcţionalitate poate fi realizată prin combinarea

operatorilor fundamentali (intersecţia, joncţiunea şi diviziunea).

Pe parcursul acestui capitol se vor folosi notaţiile:

Ø t – un tuplu al unei relaţii (o linie a unei tabele) şi

Ø t(A), un subtuplu al relaţiei R, relativ la atributul A (valoarea atributului

A în linia t).

Ca şi calculul relaţional, algebra relaţională, serveşte ca punct de referinţă

în caracterizarea unui limbaj ca fiind complet sau incomplet, din punct de vedere

relaţional. Dacă un limbaj permite exprimarea tuturor operatorilor amintiţi

anterior şi oferă cel puţin facilităţii algebrei relaţionale, se poate spune despre

respectivul limbaj că este un limbaj complet relaţional.

F

39

UNITATEA DE ÎNVĂŢARE 5OPERATORII ASAMBLIŞTI

Trei dintre operatorii asamblişti reuniune („È”), intersecţie („Ç”) şi

diferenţă (–) pot opera numai cu două relaţii unicompatibile.

Ce înţelegem prin relaţii unicompatibile?

Fie R1 (A1, A2, ….., An) şi R2 (B1, B2,….., Bm) două relaţii. Spunem

despre R1 şi R2 că sunt unicompatibile dacă:

1. n=m

2. " i Î (1, 2, …., n), Ai şi Bi sunt de acelaşi tip sintactic.

Relaţiile R1 şi R2 din figura 3.1. sunt unicompatibile deoarece:

1. ambele au acelaşi număr 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 R2C1 C2 C3 C3 C4 C5100 AAA 500 500 BBB 300200 AAB 750 300 BAA 250400 ABA 250 400 BBA 300500 BBB 700 700 AAA 500900 ABB 400 900 ABB 400

Figura 1. Relaţiile R1 şi R2 unicompatibile

5.1. Reuniunea

Reuniunea a două relaţii R1 şi R2, notată R3 ¬ R1 È R2, este definită

astfel:

R1 È R2 = {tuplu t | t Î R1 sau t Î R2}.

Conţinutul tabelei-reuniune R3 este prezentat în figura 2. Primele cinci

tupluri din această tabelă sunt preluate din R1, iar ultimele trei din R2. R3 conţine

opt tupluri deoarece două din tupluri sunt comune tabelelor R1 şi R2. Algebra

relaţională elimină automat duplicatele (tuplurile identice), în felul acesta

asigurându-se restricţia de unicitate după fiecare operaţie.

Reuniunea este comutativă. Singura problemă neclară ar fi legată de

numele atributelor în relaţia rezultat, însă se poate institui regula conform căreia

numele atributelor relaţiei-reuniune să fie numele atributelor primei relaţii

participante la operaţie.

F

40

R3C1 C2 C3

100 AAA 500200 AAB 750400 ABA 250500 BBB 700900 ABB 400300 BAA 250400 BBA 300700 AAA 500

Figura 2. Reuniunea relaţiilor R1 şi R2

5.2. Intersecţia

Intersecţia a două relaţii R1 şi R2, notată R4 ¬ R1 Ç R2, este definită

astfel:

R1 Ç R2 = {tuplu t | t Î R1 şi t Î R2}.

Conţinutul tabelei-intersecţie este prezentat în figura 3.3. Deoarece doar

două tupluri sunt absolut identice şi în R1 şi în R2, tabela rezultat va fi alcătuită

doar din două linii.

Ca şi reuniunea, intersecţia este comutativă, iar numele atributelor relaţiei

intersecţie sunt extrase din prima relaţia participantă la operaţie.

R4C1 C2 C3

500 BBB 700900 ABB 400

Figura 3. Intersecţia relaţiilor R1 şi R2

5.3. Diferenţa

Diferenţa a două relaţii R1 şi R2, notată R5 ¬ R1 – R2, este definită

astfel:

R1 – R2 = {tuplu t | t Î R1 şi t Ï R2}.

Conţinutul tabelei-diferenţă (figura 3.4.) conţine doar tuplurile din R1,

care nu se regăsesc în R2. Aşadar, din rezultat sunt eliminate ultimele două tupluri

din R1, deoarece valorile acestora se regăsesc şi în R2 (primul şi ultimul tuplu din

R2).

Spre deosebire de reuniune şi intersecţie, diferenţa nu este comutativă.

Atributele relaţiei-diferenţă sunt cele ale primei relaţii, iar tuplurile care sunt

extrase din relaţia-descăzut nu se regăsesc în relaţia scăzător. Pe lângă asta, nu

F

F

41

există restricţii privind cardinalitatea (numărul tuplurilor) celor două relaţii în

sensul că nu este obligatoriu ca relaţia descăzut să conţină mai multe tupluri decât

cea scăzător.

R5C1 C2 C3

100 AAA 500200 AAB 750400 ABA 250

Figura 4. Diferenţa relaţiilor R1 şi R2

5.4. Produsul cartezian

Produsul cartezian dintre două relaţii R1 şi R2, notat R6 ¬ R1 Ä R2, este

ansamblul tuturor tuplurilor obţinute prin concatenarea fiecărei liniile din tabela

R1 cu toate linie din tabela R2. Este definit astfel:

R1 Ä R2 = {(t1, t2) | t1 Î R1 şi t2 Î R2}

Spre deosebire de celelalte trei operaţiuni precedente, produsul cartezian

nu face apel la noţiunea de relaţii unicompatibile, iar relaţia rezultat cumulează

atributele celor două relaţii argument.

În figura 3.5. este prezentat rezultatul produsului cartezian al tabelelor R1

şi R2.

R6C1 C2 R1.C3 R2.C3 C4 C5100100100100100

AAAAAAAAAAAAAAA

500500500500500

500300400700300

BBBBAABBAAAAABB

300250300500400

200200200200200

AABAABAABAABAAB

750750750750750

500300400700900

BBBBAABBAAAAABB

300250300500400

400400400400400

ABAABAABAABAABA

250250250250250

500300400700900

BBBBAABBAAAAABB

300250300500400

500500500500

BBBBBBBBBBBB

700700700700

500300400700

BBBBAABBAAAA

300250300500

F

42

500 BBB 700 900 ABB 400900900900900900

ABBABBABBABBABB

4040404040

500300400700900

BBBBAABBAAAAABB

300250300400500

Figura 5. Produsul cartezian al relaţiilor 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ă apariţii, acestea sunt prefixate, în antetul tabelei, cu numele relaţiei din

care provine atributul respectiv (R1.C3 şi R2. C3).

Prima linie din R6 este obţinută 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, tabela-rezultat a produsului cartezian va avea 5 *

5 = 25 tupluri.

Nu prea există situaţii care să reclame folosirea directă şi exclusivă a

produsului cartezian. Cel mai important merit al acestuia în algebra relaţională

este că permite alipirea a două relaţii, fundamentând astfel operatorul cheie care

este joncţiunea.

43

UNITATEA DE ÎNVĂŢARE 6OPERATORII RELAŢIONALI

Dacă cei patru operatori prezentaţi în paragraful anterior sunt generali, cei

din paragraful de faţă sunt specifici algebrei relaţionale.

Sunt grupaţi în două categorii:

- operatori unari de restricţie, care permit decupajul unei relaţii, pe

orizontală SELECŢIA şi pe verticală PROIECŢIA;

- operatori binari de extensie: JONCŢIUNEA şi DIVIZIUNEA.

6.1. Selecţia

Selecţia triază dintr-o tabelă numai tuplurile care satisfac condiţia

specificată printr-un predicat.

Se notează

R1 ← SELECŢIE {R; expresie_logică}

unde:

- R este relaţia R (A1, A2, ..., An) asupra căreia se aplică selecţia (Ai sunt

atributele sale);

- R1 este noua tabelă obţinută în urma selecţiei, care va avea aceeaşi

schemă relaţională cu R – R1(A1, A2, ..., An)

- expresie_logică este compusă din operanzi care sunt nume de atribute

sau constante, operatori de comparaţie aritmetică (>, ³, <, £, =, ¹) şi operatori

logici (ŞI, SAU, NU).

OBSERVAŢIE: Relaţiile R1 şi R2 folosite pentru exemplificare pe

parcursul acestui subcapitol, sunt cele din figura 3.1. din subcapitolul

anterior. Toate celelalte relaţii folosite aici, precum şi în capitolul următor

(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 ← SELECŢIE (R1; C1 > 500)

RC1 C2 C3900 ABB 500

Figura 6. Rezultat selecţie – exemplul 1

F

44

Exemplul 2. Care sunt liniile din R1 pentru care valorile atributului C3

sunt cuprinse în intervalul 250 – 350?

R ← SELECŢIE (R1; C3 > = 250 AND C3 < = 350)

RC1 C2 C3400 ABA 250

Figura 7. Rezultat selecţie – exemplul 2

Exemplul 3. Care sunt liniile din R1 pentru care valorile atributelor C1 şi

C3 sunt mai mari decât 300?R ← SELECŢIE (R1; C1 > 300 AND C3 > 300)

R

C1 C2 C3900 ABB 40

Figura 8. Rezultat selecţie – exemplul 3

Exemplul 4. Care sunt studenţii Facultăţii de Ştiinţe Economice?

Pentru a afla această informaţie, mai întâi trebuie să identificăm î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 cărora se va

aplica predicatul (atributul) de selecţie. Se obţine în felul acesta soluţia:R ← SELECŢIE (STUDENT, facultate = „Stiinte Economice”)

Exemplul 5. Care sunt studenţii Facultăţii de Ştiinţe Economice,

specializarea Contabilitate şi Informatică de Gestiune?

Tabela în care va opera operatorul de selecţie este STUDENT. Predicatul

de selecţie va opera asupra atributelor facultate şi sectia:

R ← SELECŢIE (STUDENT, facultate = „Stiinte Economice” AND sectia = „CIG”)

Exemplul 6. Ce burse au fost ridicate în luna februarie 2004?

Tabela în care va opera de această dată operatorul de selecţie este tabela

BURSA, iar atributul folosit este data_incasarii.

R ← SELECŢIE (BURSA; data_incasarii >= 01/02/2004 AND data_incasarii <= 29/02/2004

45

6.2. Proiecţia

Proiecţia permite selectarea într-o tabelă rezultat doar a atributelor dorite

spre deosebire de selecţie care extrage anumite linii dintr-o tabelă pe baza

condiţiei îndeplinite de valorile unora dintre atribute. Cu alte cuvinte se realizează

„decuparea” pe verticală a unei relaţii.

Proiecţia relaţiei R(A1, A2, …, An) este o relaţie care se obţine după

parcurgerea a doi paşi:

1. eliminarea din Ai a acelor atribute care nu sunt specificate

2. suprimarea tuplurilor identice (dublurile).

Se notează:

R1 ← PROIECŢIE {R; Aj, Ak, …, Ax}

Spre deosebire de R, schema relaţiei R1 este alcătuiră numai din atributele

indicate: R1 (Aj, Ak, ..., Ax). Dacă după extragerea coloanelor nu există tupluri

identice, R1 va avea acelaşi număr de linii ca şi relaţia R. În caz contrar, numărul

lor va fi mai mic, în funcţie de numărul dublurilor.

Exemplul 7. Care sunt valorile atributului C3 în relaţia R1?

R ← PROIECŢIE (R1; C3)

RC3500750250700400

Figura 9. Rezultat proiecţie – exemplul 7

Exemplul 8. Care sunt valorile combinaţiei atributelor C1 şi C3 în relaţia

R1?

R ← PROIECŢIE (R1; C1, C3)

RC1 C3100200400500900

500750250700400

Figura 10. Rezultat proiecţie – exemplul 8

Exemplul 9. Care sunt facultăţile preluate în baza de date?

Tabela în care sunt preluate facultăţile este STUDENT. Singura coloană

care ne interesează în acest caz este facultate.

F

46

În prima fază se realizează decuparea pe verticală a coloanei respective,

obţinându-se o relaţie temporară notată R’, iar apoi prin eliminarea duplicatelor se

obţine rezultatul final în relaţia R.R ← PROIECŢIE (STUDENT; facultate)

R’facultate

Stiinte Economice

Stiinte Economice

Colegiul Economic

Stiinte Juridice

Stiinte Economice

Stiinte Economice

Stiinte Economice

Stiinte Economice RStiinte Juridice facultate

Stiinte Economice Colegiul Economic

Colegiul Economic Stiinte Economice

Stiinte Economice Stiinte Juridice

Stiinte Economice

Colegiul Economic

Stiinte Economice

Stiinte Juridice

Stiinte Economice

Colegiul Economic

Stiinte Economice

Stiinte Economice

Figura 11. Rezultat proiecţie – exemplul 9

Exemplul 10. Să se identifice cota, titlul, domeniul şi numărul de

exemplare al fiecărei cărţi.

Tabela care interesează este CARTE, iar din aceasta se decupează patru

coloane: cota_carte, titlu, domeniu şi nr_exemplare.

R ← PROIECŢIE (CARTE; cota_carte, titlu, domeniu, nr_exemplare)

6.3. Înlănţuirea consultărilor

După cum am văzut, rezultatul unei consultări este o tabelă (relaţie) nouă.

Având în vedere acesta, pentru obţinerea tabelei rezultat, se pot înlănţui două sau

mai multe operaţii redactându-se astfel interogări complexe.

Exemplul 11. Care este facultatea pe care o urmează studentul Barbu

Elena?

F

47

În cazul de faţă soluţia este relativ simplă. Folosind selecţia se decupează

din tabela STUDENT doar studentul care se numeşte Barbu Elena. Se obţine în

felul acesta o relaţie nouă, notată R1. Având în vedere că ne interesează doar

facultatea, se aplică asupra lui R1 o proiecţie şi se obţine relaţia R2, în care se află

răspunsul la problema luată în discuţie.R1 ← SELECŢIE (STUDENT, nume = „Barbu Elena”)R2 ← PROIECŢIE (R1, facultate)

Exemplul 12. Care sunt regiunile din care fac parte judeţele Dâmboviţa şi

Vâlcea?

Tabela interogată este LOCALITATE. Pentru a răspunde la această

variantă pot fi formulate două soluţii.

Soluţia 1.R1 ← SELECŢIE (LOCALITATE; judet = „Dambovita” OR judet = „Valcea”)R2 ← PROIECŢIE (R1; judet, regiune)Soluţia 2.R1 ← SELECŢIE (LOCALITATE; judet = „Dambovita”)R2 ← PROIECŢIE (R1; judet, regiune)R3 ← SELECŢIE (LOCALITATE; judet = „Valcea”)R4 ← PROIECŢIE (R3, judet, regiune)R5 ← R2 È R4

Exemplul 13. Care sunt studenţii Facultăţii de Ştiinţe Economice de la

specializările CIG şi FA?

Tabela interogată este STUDENT, iar răspunsul la această întrebare poate

fi formulat în 2 moduri.

Soluţia 1.R1 ← SELECŢIE (STUDENT; facultate = „Stiinte

Economice” AND sectia = „CIG” OR sectia =„FA”)

R2 ← PROIECŢIE (R1; nume, sectia)Soluţia 2.R1 ← SELECŢIE (STUDENT; facultate = „Stiinte

Economice” AND sectia = „CIG”)R2 ← PROIECŢIE (R1; nume, sectia)R3 ← SELECŢIE (STUDENT; facultate = „Stiinte

Economice” AND sectia = „FA”)R4 ← PROIECŢIE (R2; nume, sectia)R5 ← R2 È R4

Exemplul 14. Care sunt cărţile care au apărut şi la editurile Eficient şi

Macarie?

48

Tabela din care vor fi extrase datele este CARTE. Rezultatul se bazează pe

intersecţia relaţiei care conţine cărţile apărute la editura Eficient (R2) cu cărţile

apărute la editura Macarie (R4).R1 ← SELECŢIE (CARTE; editura = „Eficient”)R2 ← PROIECŢIE (R2; titlu)R3 ← SELECŢIE (CARTE; editura = „Macarie”)R4 ← PROIECŢIE (R3; titlu)R5 ← R2 Ç R4

6.4. Joncţiunea

După cum am văzut, produsul cartezian permite fuzionarea a două tabele

într-una singură ce conţine toate atributele şi liniile obţinute prin combinarea

fiecărui tuplu dintr-o relaţia cu fiecare tuplu din cealaltă.

Joncţiunea spre deosebire de produsul cartezian care este o fuziune

necondiţionată a două tabele, este o fuziune a două relaţii care au o proprietate

comună. Fie două relaţii R1(A1, A2, …, An) şi R2(B1, B2, …, Bp) şi Ai şi Bj

două atribute definite pe acelaşi domeniu şi q ansamblul operatorilor de

comparaţie {=, <, >, ≤, ≥, ¹} ce pot fi aplicaţi celor două atribute Ai şi Bj.

Joncţiunea relaţiei R1, prin Ai cu relaţia R2, prin Bj notată

R1 (Ai q Bj) R2

este relaţia ale cărei tupluri sunt obţinute prin concatenarea fiecărui tuplu al

relaţiei R1 cu tuplurile relaţiei R2, pentru care este verificată condiţia q instituită

între Ai şi Bj. Se notează:

R1 (Ai q Bj) R2 = {t | t Î R1 Ä R2 şi t(Ai) q t(Bj)}.

Joncţiunea este echivalentă cu un produs cartezian urmat de o selecţie.

Această joncţiune este cunoscută în literatura de specialitate sub denumirea de

theta-joncţiune. În lucrul cu bazele de date relaţionale se utilizează cu precădere

echi-joncţiunea, ce reprezintă un caz particular al theta-joncţiunii, atunci când q

este operatorul de egalitate „=”. Se notează:

R1 (Ai = Bj) R2 = {t | t Î R1 Ä R2 şi t(Ai) = t(Bj)}.

Exemplul 15 – Theta – joncţiune

Pentru exemplificarea acestui operator se folosesc aceleaşi două tabele R1

şi R2. Rezultatul joncţiunii (theta - joncţiunii) exprimată prin expresia

R ← JONCŢIUNE (R1, R2, R1.C1 > R2.C5),

este obţinut în 2 paşi, după cum se observă în figura următoare:

F

49

R1 R’ ¬ R1 Ä R2C1 C2 C3 C1 C2 R1.C3 R2.C3 C4 C5100 AAA 500 100 AAA 500 500 BBB 300200 AAB 750 100 AAA 500 300 BAA 250400 ABA 250 100 AAA 500 400 BBA 300500 BBB 700 100 AAA 500 700 AAA 500900 ABB 400 100 AAA 500 300 ABB 400

200 AAB 750 500 BBB 300R2 200 AAB 750 300 BAA 250

C3 C4 C5 200 AAB 750 400 BBA 300500 BBB 300 200 AAB 750 700 AAA 500300 BAA 250 200 AAB 750 900 ABB 400400 BBA 300 400 ABA 250 500 BBB 300700 AAA 500 400 ABA 250 300 BAA 250900 ABB 400 400 ABA 250 400 BBA 300

400 ABA 250 700 AAA 500400 ABA 250 900 ABB 400500 BBB 700 500 BBB 300500 BBB 700 300 BAA 250500 BBB 700 400 BBA 300500 BBB 700 700 AAA 500

R = SELECŢIE (R’; C1 > C5) 500 BBB 700 900 ABB 400C1 C2 R1.C3 R2.C3 C4 C5 900 ABB 400 500 BBB 300400 ABA 250 500 BBB 300 900 ABB 400 300 BAA 250400 ABA 250 300 BAA 250 900 ABB 400 400 BBA 300400 ABA 250 400 BBA 300 900 ABB 400 700 AAA 400500 BBB 700 500 BBB 300 900 ABB 400 900 ABB 500500 BBB 700 300 BAA 250500 BBB 700 400 BBA 300500 BBB 700 800 ABB 400900 ABB 400 500 BBB 300900 ABB 400 300 BAA 250900 ABB 400 400 BBA 300900 ABB 400 700 AAA 500900 ABB 400 900 ABB 400

Figura 12. Mecanismul de theta-joncţionare – exemplul 15

Exemplul 16 – Echi – joncţiune

Pentru a fi o echi–joncţiune, operatorul de comparaţie dintre cele două

atribute este, în mod obligatoriu, semnul de egalitate.R ← JONCŢIUNE (R1, R2; R1.C1 = R2.C5)

50

R1 R’ ¬ R1 Ä R2C1 C2 C3 C1 C2 R1.C3 R2.C3 C4 C5100 AAA 500 100 AAA 500 500 BBB 300200 AAB 750 100 AAA 500 300 BAA 250400 ABA 250 100 AAA 500 400 BBA 300500 BBB 700 100 AAA 500 700 AAA 500900 ABB 400 100 AAA 500 300 ABB 400

200 AAB 750 500 BBB 300R2 200 AAB 750 300 BAA 250C3 C4 C5 200 AAB 750 400 BBA 300500 BBB 300 200 AAB 750 700 AAA 500300 BAA 250 200 AAB 750 900 ABB 400400 BBA 300 400 ABA 250 500 BBB 300700 AAA 500 400 ABA 250 300 BAA 250900 ABB 400 400 ABA 250 400 BBA 300

400 ABA 250 700 AAA 500400 ABA 250 900 ABB 400500 BBB 700 500 BBB 300500 BBB 700 300 BAA 250500 BBB 700 400 BBA 300500 BBB 700 700 AAA 500500 BBB 700 900 ABB 400900 ABB 400 500 BBB 300900 ABB 400 300 BAA 250900 ABB 400 400 BBA 300900 ABB 400 700 AAA 400900 ABB 400 900 ABB 500

R = SELECŢIE (R’; C1 = C5)C1 C2 R1.C3 R2.C3 C4 C5500 BBB 700 700 AAA 500

Figura 13. Echi-joncţiune – exemplul 16

Exemplul 17 – Joncţiune naturală

Joncţiunea naturală, pe lângă faptul că presupune ca operatorul de

comparaţie să fie semnul de egalitate, implică şi denumirea identică a atributelor

de legătură între cele două tabele.

R ← JONCŢIUNE (R1, R2; R1.C3 = R2.C3) sau se poate folosi

şi forma simplificată, datorită faptului că ambele atribute au acelaşi numeR ← JONCŢIUNE (R1, R2; C3)

Având în vedere că cele două atribute au acelaşi nume, se poate considera

că tabela rezultat păstrează numai unul dintre cele două atribute.

51

R1 R’ ¬ R1 Ä R2C1 C2 C3 C1 C2 R1.C3 R2.C3 C4 C5100 AAA 500 100 AAA 500 500 BBB 300200 AAB 750 100 AAA 500 300 BAA 250400 ABA 250 100 AAA 500 400 BBA 300500 BBB 700 100 AAA 500 700 AAA 500900 ABB 400 100 AAA 500 300 ABB 400

200 AAB 750 500 BBB 300R2 200 AAB 750 300 BAA 250C3 C4 C5 200 AAB 750 400 BBA 300500 BBB 300 200 AAB 750 700 AAA 500300 BAA 250 200 AAB 750 900 ABB 400400 BBA 300 400 ABA 250 500 BBB 300700 AAA 500 400 ABA 250 300 BAA 250900 ABB 400 400 ABA 250 400 BBA 300

400 ABA 250 700 AAA 500400 ABA 250 900 ABB 400500 BBB 700 500 BBB 300500 BBB 700 300 BAA 250500 BBB 700 400 BBA 300500 BBB 700 700 AAA 500500 BBB 700 900 ABB 400900 ABB 400 500 BBB 300900 ABB 400 300 BAA 250900 ABB 400 400 BBA 300900 ABB 400 700 AAA 400900 ABB 400 900 ABB 500

R = SELECŢIE (R’; R1.C3 = R2.C3)C1 C2 C2 C3 C4100 AAA 500 BBB 300500 BBB 700 AAA 500900 ABB 400 BBA 300

Figura 14. Joncţiune naturală – exemplul 17

Deoarece selecţia este un operator care se aplică doar unei singure tabele

(operator unar), este necesară fuzionarea tabelelor din care se doreşte extragerea

datelor pentru obţinerea unei relaţii agregat, la care se aplică predicatul

suplimentar de selecţie. Fuzionarea tabelelor este posibilă numai prin joncţiune.

Prin joncţionarea tuturor relaţiilor dintr-o bază de date se poate ajunge la o relaţie

universală

Exemplul 18. Să se afle pentru fiecare student bursier ce tip de bursă

primeşte şi care este valoarea acesteia.

Tabela STUDENT se joncţionează cu tabela BURSA pe baza atributului

comun (nr_matricol) iar la tabela intermediară rezultată, se aplică selecţia.

52

R1 ← JONCŢIUNE (STUDENT, BURSA, Nr_matricol)

R2 ← PROIECŢIE (R1; nume, tip_bursa,suma_incasata)

Exemplul 19. Să se afle numele, facultate şi secţia studenţilor care stau în

căminul Miclas.

Soluţia 1.R1 ← JONCŢIUNE (STUDENT, STUDCAMIN; Nr_matricol)R2 ← SELECŢIE (R1; nume_camin = „MICLAS”)R3 ← PROIECŢIE (R2; nume, facultate, sectia,

nume_camin)Soluţia 2.

Mai întâi se aplică relaţia asupra tabelei STUDCAMIN iar tabela

intermediară se joncţionează cu STUDENT.R1 ← SELECŢIE (STUDCAMIN; nume_camin = „Miclas”)R2 ← JONCŢIUNE (STUDENT, R1; Nr_matricol)R3 ← PROIECŢIE (R2; nume, facultate, sectia,

nume_camin)

Care dintre cele două variante este de preferat? A doua variantă este mai

bună decât prima, deoarece joncţiunea operează asupra a două tabele mai reduse

ca dimensiuni (tabela STUDCAMIN deja a fost filtrată prin aplicarea predicatului

de selecţie). Diferenţa este cu atât mai vizibilă atunci când tabela STUDENT

conţine toţi studenţii dintr-o universitate. Iar dacă ne gândim că înaintea oricărei

joncţiuni se realizează produsul cartezian apare îndreptăţită amânarea joncţiunii,

până când aceasta va opera asupra unor tabele cu un număr mai mic de linii şi

coloane.

Exemplul 20. Care sunt cărţile scrise de Victor Stanciu ?

Elementul de noutate în cazul acestui exemplu îl reprezintă faptul că se

doreşte obţinerea unei informaţii ce provine dintr-o relaţie (atributul

nume_carte din tabela CARTE), pe baza unei condiţii aplicate altei relaţii

(atributul nume_autor din tabela AUTOR), iar cele două relaţii nu sunt în

raport de părinte – copil. În asemenea situaţii se recomandă folosirea şi a altor

relaţii, în cazul nostru tabela AUTORCARTE.

Soluţia 1:R1 ← JONCŢIUNE (CARTE, AUTORCARTE; cota_carte)R2 ← JONCŢIUNE (R1,AUTOR; nume_autor)R3 ← SELECŢIE (R2; nume_autor = „Victor Stanciu”)R4 ← PROIECŢIE (R3; titlu)

53

Soluţia 2:R1 ← SELECŢIE (AUTOR, nume_autor = „Victor

Stanciu”)R2 ← PROIECŢIE (R1; nume_autor)R3 ← JONCŢIUNE (R2,AUTORCARTE; nume_autor)R4 ← PROIECŢIE (R3; Cota_carte)R5 ← JONCŢIUNE (R4, CARTE; cota_carte)R6 ← PROIECŢIE (R5; titlu)Înaintea calculării relaţiei intermediare au fost eliminate nu numai tuplurile

ci şi atributele de prisos.

Exemplul 21. Numele studenţilor care au împrumutat cărţi din domeniul

Informatică.

Şi în acest caz se doreşte obţinerea unei informaţii ce provine dintr-o

tabelă (atributul nume din tabela STUDENT) pe baza unei condiţii aplicate unei

alte tabele iar între cele două tabele nu există legătură părinte – copil. De această

dată se foloseşte ca legătură tabela STUDCARTE.

Soluţia 1:R1← JONCŢIUNE (STUDENT; STUDTCARTE; nr_matricol)R2 ← JONCŢIUNE (R1, CARTE; cota_carte)R3 ← SELECŢIE (R2; domeniu = „Informatica”)R4 ← PROIECŢIE (R3; nume)Soluţia 2:R1 ← SELECŢIE (CARTE; domeniu = „Informatica”)R2 ← JONCŢIUNE (R1, STUDCARTE; cota_carte)R3 ← PROIECŢIE (R2; nr_matricol)R4 ← JONCŢIUNE (R3, STUDENT; nr_matricol)R5 ← PROIECŢIE (R4; nume)

Exemplul 22. Numele şi secţia studenţilor facultăţii de Ştiinţe Economice

care au împrumutat cartea Informatică de gestiune în perioada 15-29 februarie

2004.

Relaţia rezultat trebuie să conţină valori ale atributelor nume şi sectia

din tabela STUDENT. Predicatul de selecţie se aplică însă asupra tabelei CARTE

(atributul nume_carte = „Informatica de gestiune”) şi asupra tabelei

STUDCARTE (atribut data_împrumut > = 15/02/2004 şi < = 29/02/2004).

R1 ← SELECŢIE (CARTE; titlu = „Informatica degestiune”)

R2 ← JONCŢIUNE (R1, STUD_CARTE; cota_carte)R3 ← SELECŢIE (R2; data_imprumut > = 15/02/2004

AND data_imprumut < = 29/02/2004)R4 ← PROIECŢIE (R3; nr_matricol)

54

R5 ← JONCŢIUNE (R4; STUDENT; nr_matricol)R6 ← SELECŢIE (R5; facultate = „Stiinte

Economice”)R7 ← PROIECŢIE (R6; nume, sectia)

Exemplul 23. De la ce secţii sunt studenţii care au împrumutat şi cartea

Informatică de gestiune şi Contabilitate generală?

Rezultatul conţine atributul secţia din tabela STUDENT, dar predicatul de

selecţie se aplică asupra tabelei produse.

Soluţia 1:R1 ← SELECŢIE (CARTE; nume_carte = „Informatica de

gestiune”)R2 ← JONCŢIUNE (R1, STUD_CARTE; cota_carte)R3 ← JONCŢIUNE (R2, STUDENT; nr_matricol)R4 ← PROIECŢIE (R3; sectia)R5 ← SELECŢIE (CARTE; nume_carte = „Contabilitate

generala”)R6 ← JONCŢIUNE (R5, STUDCARTE; cota_carte)

R7 ← JONCŢIUNE (R6, STUDENT; nr_matricol)R8 ← PROIECŢIE (R7; SECTIA)R9 ← R4 Ç R8Soluţia 2:R1 ← SELECŢIE (CARTE; titlu = „Informatica de

gestiune”)R2 ← JONCŢIUNE (R1, STUD_CARTE; cota_carte)R3 ← JONCŢIUNE (R2, STUDENT; nr_matricol)R4 ← SELECŢIE (CARTE; nume_carte = „Contabilitate

generala”)R5 ← JONCŢIUNE (R4, STUDCARTE; cota_carte)R6 ← JONCŢIUNE (R5, STUDENT; nr_matricol)R7 ← JONCŢIUNE (R3; R6; sectia)R8 ← PROIECŢIE (R7, sectia)

În prima soluţie s-a intersectat relaţia secţiilor studenţilor care au

împrumutat cartea „Contabilitate generală” (R8). În cea de-a doua variantă s-a

operat direct joncţiunea între R3 şi R6.

Exemplul 24. În ce cămin sunt cazaţi studenţii care au împrumutat cărţile

„Informatică de gestiune” şi „Contabilitate generală”, dar nu au împrumutat

cartea „Economie politică”?

Lucrurile în acest caz nu sunt atât de complicate precum par la prima

vedere, deoarece vom folosi elemente din exemplul anterior, plus operatorul

diferenţă.

55

R1 ← SELECŢIE (CARTE; titlu = „Informatica degestiune”)

R2 ← JONCŢIUNE (R1, STUD_CARTE; cota_carte)R3 ← JONCŢIUNE (R2, STUDENT; nr_matricol)R4 ← JONCŢIUNE (R3, STUDCAMIN; nr_matricol)R5 ← PROIECŢIE (R4, nume_camin)R6 ← SELECŢIE (CARTE; nume_carte = „Contabilitate

generală”)R7 ← JONCŢIUNE (R6, STUDCARTE; cota_carte)R8 ← JONCŢIUNE (R7, STUDENT; nr_matricol)R9 ← JONCŢIUNE (R8, STUDCAMIN; nr_matricol)R10 ← PROIECŢIE (R9; nume_camin)R11 ← SELECŢIE (CARTE; nume_carte = „Economie

politica”)R12 ← JONCŢIUNE (R11, STUDCARTE; cota_carte)R13 ← JONCŢIUNE (R12, STUDENT; nr_matricol)R14 ← JONCŢIUNE (R13, STUDCAMIN; nr_matricol)R15 ← PROIECŢIE (R14; nume_camin)R16 ← R5 Ç R10 – R15

Exemplul 25

Ce studenţi studiază la aceeaşi secţie cu Dinescu Monica?

Faţă de interogările de până acum, condiţia de selecţie în acest caz este una

indirectă, în sensul că mai întâi trebuie determinată secţia la care studiază Dinescu

Monica. Apoi trebuie extrase din tabela STUDENT, liniile pentru care secţia are

valoarea secţiei reper.R1 ← SELECŢIE (STUDENT; nume = „Dinescu Monica”)R2 ← PROIECŢIE (R1; sectia)R3 ← JONCŢIUNE (R2, STUDENT; sectia)R4 ← PROIECŢIE (R3; nume)

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

porneşte de la două relaţii R1(A,B) şi R2(B). Diviziunea relaţională R1¸R2 are ca

rezultat o relaţie definită ca ansamblul subtuplurilor R1(A), pentru care produsul

lor cartezian cu R2(B) este un subansamblu al R1(A,B).

Rezultatul expresiei R1¸R2 reprezintă câtul diviziunii, ea fiind o relaţie ce

poate fi notată R3(A). Într-o altă formulare ai Î R3 dacă şi numai dacă " bi Î R2

® $ (ai, bi) Î R1.F

56

În continuare pentru simplitate A şi B sunt considerate două atribute, deşi

ele pot fi şi grupe de atribute. În figura de mai jos este prezentată diviziunea

relaţională.

R1A Ba1 b1a2 b1a3 b1a1 b2a3 b2 R2a4 b2 Ba1 b3 b1 R3a3 b3 ¸ b2 Aa6 b3 b3 a1a1 b4 b4 a2a3 b4a4 b4a1 b5a2 b5a3 b5a5 b5

Figura 15. Diviziunea relaţională

Determinarea relaţiei 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 rând:

Ø 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 îndeplineşte condiţie şi va

fi inclus în relaţia 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) Þ îndeplineşte condiţia ş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;

57

În urma acestui raţionament, tabele R3 va fi alcătuită din două tupluri (a1

şi a3).

Diviziunea relaţională este deosebit de utilă pentru formularea

consultărilor în care apare clauza " („oricare ar fi”)

Test de evaluare

Se consideră următoarea 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 operatorii algebrei relaţionale să se determine:

1. Care sunt pacienţii din Târgovişte; (vezi pag. 63-67)

2. Care sunt pacienţii din Târgovişte şi Titu; (vezi pag. 63-67)

3. Care pacienţi nu sunt din Târgovişte şi Titu; (vezi pag. 63-67)

4. Care sunt pacienţii care s-au născut în anul 1989; (vezi pag. 63-67)

58

5. Care sunt tarifele mai mari de 25 RON; (vezi pag. 63-67)

6. Din ce localităţi sunt pacienţii din bază; (vezi pag. 63-67)

7. Care este nume şi prenumele medicilor care oferă consultaţii;(vezi pag. 63-67)

8. Care sunt tarifele practicate; (vezi pag. 63-67)

9. Din ce localitate sunt pacienţii născuţi în luna ianuarie 1990;(vezi pag. 63-67)

10. Care sunt orele pentru care sunt prevăzute consultaţii în data de09.02.2006; (vezi pag. 63-67)

59

11. Cum se numesc pacienţii din Târgovişte şi Moreni;(vezi pag. 63-67)

12. Care este prenumele medicilor cu numele de familie Ghionea;(vezi pag. 63-67)

13. La ce data şi la ce oră are programare Popa Georgeta;(vezi pag. 63-67)

14. Care sunt datele la care au făcut programare pacienţii dinTârgovişte; (vezi pag. 63-67)

15. Numele pacienţilor care au fost consultaţi în luna februarie 2006;(vezi pag. 63-67)

16. Data la care a făcut programare Dinescu Mircea şi Vancea Ioan;(vezi pag. 63-67)

60

17. Numele medicilor care au acordat consultaţii în data de 23.02.2006;(vezi pag. 63-67)

18. De ce medic a fost consultată Popa Georgeta; (vezi pag. 63-67)

19. Numele pacienţilor consultaţi de Grecu Anca; (vezi pag. 63-67)

20. Nume pacienţilor care au făcut programare şi în luna ianuarie şi înluna februarie 2006; (vezi pag. 63-67)

61

21. Care este tariful consultaţiei pacientului Popa Georgeta;(vezi pag. 63-67)

22. Numele pacienţilor care au făcut programare în data de 10.02.2006în intervalul 14-16; (vezi pag. 63-67)

23. Datele la care au efectuat consultaţii Grecu Anca şi Minea Ion înluna februarie 2006; (vezi pag. 63-67)

62

24. Numele şi prenumele medicilor care au consultat pacienţi dinTârgovişte şi Moreni dar nu din Titu; (vezi pag. 63-67)

25. Numele pacienţilor consultaţi de Grecu Anca în luna februarie2006; (vezi pag. 63-67)

63

26. Data la care au fost consultaţi pacienţii care au făcut programare îndata de 10.02.2006; (vezi pag. 63-67)

27. Nume pacienţilor care au avut programare în data de 10.20.2006 înintervalul 12-14 şi au fost consultaţi de către Grecu Anca.

(vezi pag. 63-67)

Rezolvare temă de autoevaluare

1. Care sunt pacienţii din Târgovişte;

R1 ← SELECŢIE(PACIENT; localitate=”Targoviste”)2. Care sunt pacienţii din Târgovişte şi Titu;

R1 ← SELECŢIE(PACIENT; localitate=”Targoviste” orlocalitate=”Titu”)3. Care pacienţi nu sunt din Târgovişte şi Titu;

R1 ← SELECŢIE(PACIENT; localitate<>”Targoviste” andlocalitate<>”Titu”)

sau

R1 ← SELECŢIE(PACIENT; localitate=”Targoviste” orlocalitate=”Titu”)R2 ← PACIENT – R1

64

4. Care sunt pacienţii care s-au născut în anul 1989;

R1 ← SELECŢIE(PACIENT; datanasterii>= 01/01/1989 anddatanasterii<= 31/12/1989)

5. Care sunt tarifele mai mari de 25 RON;

R1 ← SELECŢIE(TARIFE; tarif>25)

6. Din ce localităţi sunt pacienţii din bază;

R1 ← PROIECŢIE(PACIENT; localitate)7. Care este nume şi prenumele medicilor care oferă consultaţii;

R1 ← JONCŢIUNE(MEDICI; MEDIC_CONSULTATIE;codmedic)R2 ← PROIECŢIE(R1; numemedic, prenumemedic)8. Care sunt tarifele practicate;

R1 ← PROIECŢIE(TARIFE; tarif)9. Din ce localitate sunt pacienţii născuţi în luna ianuarie 1990;

R1 ← SELECŢIE(PACIENT; datanasterii>= 01/01/1990 anddatanasterii<= 31/01/1990)R2 ← PROIECŢIE(R1; localitate)10. Care sunt orele pentru care sunt prevăzute consultaţii în data de

09.02.2006;

R1 ← SELECŢIE(CONSULTATIE; dataconsultatie = 09/02/2006)R2 ← JONCŢIUNE(R1, PROGRAMARE; nrconsultatie)R3 ← PROIECŢIE(R2; oraprogramare)11. Cum se numesc pacienţii din Târgovişte şi Moreni;

R1 ← SELECŢIE(PACIENT; localitate = ”Targoviste”)R2 ← PROIECŢIE(R1; nume)R3 ← SELECŢIE(PACIENT; localitate = ”Titu”)R4 ← PROIECŢIE(R3; nume)R5 ← R2 È R412. Care este prenumele medicilor cu numele de familie Ghionea;

R1 ← SELECŢIE(MEDICI; numemedic = „Ghionea”)R2 ← PROIECŢIE(R1; prenumemedic)13. La ce data şi la ce oră are programare Popa Georgeta;

R1 ← SELECŢIE(MEDICI; numemedic = „Ghionea”)R2 ← PROIECŢIE(R1; prenumemedic)14. Care sunt datele la care au făcut programare pacienţii din

Târgovişte;

R1 ← SELECŢIE(PACIENT; localitate = „Targoviste”)R2 ← JONCŢIUNE(R1, PROGRAMARE; codpacient)R3 ← PROIECŢIE(R3; dataprogramare, oraprogramare)

65

15. Numele pacienţilor care au fost consultaţi în luna februarie 2006;

R1 ← JONCŢIUNE(PACIENT, PROGRAMARE; codpacient)R2 ← JONCŢIUNE(R1, CONSULTATIE; nrconsultatie)R3 ← SELECŢIE(R2; dataconsultatie >= 01/02/2006 anddataconsultatie <= 28/02/2006)R4 ← PROIECŢIE(R3; nume, prenume)

16. Data la care a făcut programare Dinescu Mircea şi Vancea Ioan;

R1 ← SELECŢIE(PACIENT; nume = „Dinescu” and prenume =„Mircea”)R2 ← JONCŢIUNE(R1, PROGRAMARE; codpacient)R3 ← PROIECŢIE(R2, dataprogramare)R4 ← SELECŢIE(PACIENT; nume = „Vancea” and prenume =„Ioan”)R5 ← JONCŢIUNE(R4, PROGRAMARE; codpacient)R6 ← PROIECŢIE(R5, dataprogramare)R7 ← R4 È R6

17. Numele medicilor care au acordat consultaţii în data de 23.02.2006;

R1 ← SELECŢIE(CONSULTATIE; dataconsultatie = 23/02/2006)R2 ← JONCŢIUNE(R1, MEDIC_CONSULTATIE; nrconsultatie)R3 ← JONCŢIUNE(R2, MEDICI; codmedic)R4 ← PROIECŢIE(RE; numemedic, prenumemedic)18. De ce medic a fost consultată Popa Georgeta;

R1 ← JONCŢIUNE(PACIENT, CONSULTATIE; codpacient)R2 ← JONCŢIUNE(R1, MEDIC_CONSULTATIE; nrconsultatie)R3 ← JONCŢIUNE(R2, MEDICI; codmedic)R4 ← SELECŢIE(R3; nume = „Popa” and prenume = „Georgeta”)R5 ← PROIECŢIE(R4; numemedic, prenumemedic)19. Numele pacienţilor consultaţi de Grecu Anca;

R1 ← SELECŢIE(MEDICI; numemedic = „Grecu” andprenumemedic =„Anca”)R2 ← JONCŢIUNE(R1, MEDIC_CONSULTATIE; codmedic)R3 ← JONCŢIUNE(R2, CONSULTATIE; nrconsultatie)R4 ← JONCŢIUNE(R3, PACIENT; codpacient)R5 ← PROIECŢIE(R4; nume, prenume)20. Nume pacienţilor care au făcut programare şi în luna ianuarie şi în

luna februarie 2006;R1 ← JONCŢIUNE(PACIENT, CONSULTATIE; codpacient)R2 ← SELECŢIE(R1; dataprogramare >= 01/01/2006 anddataprogramare <= 31/01/2006)R3 ← SELECŢIE(R1; dataprogramare >= 01/02/2006 anddataprogramare <= 2831/02/2006)R4 ← R2 ∩ R3R5 ← PROIECŢIE(R4; nume, prenume)

66

21. Care este tariful consultaţiei pacientului Popa Georgeta;

R1 ← SELECŢIE(PACIENT; nume = „Popa” and prenume =„Georgeta”)R2 ← JONCŢIUNE(R1, CONSULTATIE; codpacient)R3 ← JONCŢIUNE(R2, TARIFE; nrconsultatie)R4 ← PROIECŢIE(R3; tarif)

22. Numele pacienţilor care au făcut programare în data de 10.02.2006în intervalul 14-16;

R1 ← SELECŢIE(PROGRAMARE; dataprogramare =10/02/2006)R2 ← SELECŢIE(R1; oraprogramare>= 14 and oraprogramare<=16)R3 ← JONCŢIUNE(R2, PACIENT; codpacient)R4 ← PROIECŢIE(R3; nume, prenume)23. Datele la care au efectuat consultaţii Grecu Anca şi Minea Ion în

luna februarie 2006;

R1 ← SELECŢIE(MEDICI; numemedic = „Grecu” andprenumemedic =„Anca”)R2 ← JONCŢIUNE(R1, MEDIC_CONSULTATIE; codmedic)R3 ← JONCŢIUNE(R2, CONSULTATIE; nrconsultatie)R4 ← SELECŢIE(R3; dataconsultatie >= 01/02/2006 anddataconsultatie <= 28/02/2006)R5 ← PROIECŢIE(R4; dataconsultatie)R6 ← SELECŢIE(MEDICI; numemedic = „Minea” andprenumemedic =„Ion”)R7 ← JONCŢIUNE(R6, MEDIC_CONSULTATIE; codmedic)R7 ← JONCŢIUNE(R7, CONSULTATIE; nrconsultatie)R9 ← SELECŢIE(R8; dataconsultatie >= 01/02/2006 anddataconsultatie <= 28/02/2006)R10 ← PROIECŢIE(R9; dataconsultatie)R11 ← R5 ∩ R1024. Numele şi prenumele medicilor care au consultat pacienţi din

Târgovişte şi Moreni dar nu din Titu;

R1 ← JONCŢIUNE(MEDICI, MEDIC_CONSULTATIE;codmedic)R2 ← JONCŢIUNE(R1, CONSULTATIE; nrconsultatie)R3 ← JONCŢIUNE(R2, PACIENT; codpacient)R4 ← SELECŢIE(R3; localitate = „Targoviste”)R5 ← PROIECŢIE(R4; numemedic, prenumemedic)R6 ← SELECŢIE(R3; localitate = „Moreni”)R7 ← PROIECŢIE(R6; numemedic, prenumemedic)R8 ← SELECŢIE(R3; localitate = „Titu”)R9 ← PROIECŢIE(R8; numemedic, prenumemedic)R10 ← R5 ∩ R7 – R9

67

25. Numele pacienţilor consultaţi de Grecu Anca în luna februarie2006;

R1 ← SELECŢIE(MEDICI; numemedic = „Grecu” andprenumemedic =„Anca”)R2 ← JONCŢIUNE(R1, MEDIC_CONSULTATIE; codmedic)R3 ← JONCŢIUNE(R2, CONSULTATIE; nrconsultatie)R4 ← SELECŢIE(R3; dataconsultatie >= 01/02/2006 anddataconsultatie <= 28/02/2006)R5 ← JONCŢIUNE(R4, PACIENT; codpacient)R6 ← SELECŢIE(R5; nume, prenume)26. Data la care au fost consultaţi pacienţii care au făcut programare în

data de 10.02.2006;

R1 ← JONCŢIUNE(PACIENT, PROGRAMARE; codpacient)R2 ← SELECŢIE(R1; dataprogramare = 10/02/2006)R3 ← JONCŢIUNE(R2, CONSULTATIE; nrconsultatie)R4 ← PROIECŢIE(R3; dataconsultatie)27. Nume pacienţilor care au avut programare în data de 10.20.2006 în

intervalul 12-14 şi au fost consultaţi de către Grecu Anca.

R1 ← JONCŢIUNE(PACIENT, PROGRAMARE; codpacient)R2 ← JONCŢIUNE(R1, CONSULTATIE; nrconsultatie)R3 ← JONCŢIUNE(R2, MEDIC_CONSULTATIE; nrconsultatie)R4 ← JONCŢIUNE(R3, MEDICI; codmedic)R5 ← SELECŢIE(R4; dataprogramare = 10/02/2006)R6 ← SELECŢIE(R5; oraprogramare >= 12 and oraprogramare<=16)R7 ← SELECŢIE(R6; numemedic = „Grecu” and prenume„Anca”)R8 ← PROIECŢIE(R7; nume, prenume)

BIBLIOGRAFIE SELECTIVĂ

1. Michael Hernandez – Proiectarea bazelor de date, Editura Teora,

Bucureşti, 2003

2. Mariana Miloşescu – Baze de date în Visual FoxPro, Editura Teora,

2003

3. Marin Fotache, Proiectarea bazelor de date, Editura Polirom, Iaşi, 2005

4. Grupul BDASEIG, Baze de date. Fundamente teoretice şi practice,

Editura Infomega, Bucureşti, 2002

5. Florin Radu, Baze de date, Editura Bibliotheca, Târgovişte, 2007

68

M.3. LIMBAJUL DE INTEROGARERELAŢIONAL SQL.

1. Cuprins2. Obiectiv general3. Obiective operaţionale4. Dezvoltarea temei5. Bibliografie selectivă

Cuprins

� UI.7. Prezentare generală; Elemente de bază ale interogărilorSQL;

= 0,5 ore� UI.8. Coloane expresii; Opţiunea ORDER BY;

= 0,5 ore� UI.9. Operatorii LIKE, BETWEEN, IN;

= 2 ore� UI.10. Theta şi echijoncţiunea;

= 3 ore� UI.11. Sinonime locale şi joncţiunea unei tabele cu ea însăşi;

= 1 ore� UI.12. Subconsultări;

= 2 ore� UI.13. Funcţii agregat: COUNT, SUM, AVG, MIN şi MAX);

= 2 ore� UI.14. Gruparea tuplurilor: clauza GROUP BY şi clauza

HAVING

= 1 ore

69

� Obiectiv general: Dobîndirea cunoştinţelor fundamentaleprivind limbajul relaţional de interogare SQL

� Obiective operaţionale: Însuşirea cunoştinţelor privindelementele de bază ale SQL, modul de operare al unei fraze SELECTimpreună cu clauzele obligatorii şi cele opţionale: FROM, WHERE,ORDER BY, GROUP BY sau HAVING

70

UNITATEA DE ÎNVĂŢARE 7PREZENTARE GENERALĂ; ELEMENTE DE BAZĂ ALE

INTEROGĂRILOR

7.1. Prezentare generală

În prezent SQL (Structured Query Language) este unul dintre cele mai

puternice limbaje structurate pentru interogarea bazelor de date relaţionale.

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 întrebări bazei de date. Din fericire, SQL face mult mai mult decât atât:

se pot crea tabele, se adaugă, se modifică sau se şterg date, se combină şi se

memorează interogările î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.

Deşi este uşor accesibil utilizatorilor începători, el nu rămâne dator nici

programatorilor experimentaţi, punându-le la dispoziţie facilităţi deosebite.

Datorită puterii sale relaţionale, a uşurinţei în înţelegere şi utilizare, SQL a

fost ales de ANSI (American National Standards Organization – Organizaţia

pentru Standarde Naţionale Americane) şi apoi de către ISO (International

Standards Organization – Organizaţia pentru Standarde Internaţionale) drept

limbaj standard pentru lucru cu baze de date relaţionale.

Pe parcursul acestui curs 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 văzut mai degrabă prin ce decât prin cum, în sensul că nu se

specifică decât ce informaţie este solicitată şi nu cum este obţinută această

informaţie.

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.

71

Instrucţiunile SQL în funcţie de rolul avut în manipularea datelor şi a

tranzacţiilor se pot grupa astfel:

Ø instrucţiuni pentru definirea datelor care asigura descrierea structurii

bazei de date;

Ø instrucţiuni de manipulare a datelor ce au ca scop adăugarea,

modificarea şi ştergerea înregistrărilor;

Ø instrucţiuni de selecţie a datelor care permit consultarea bazei de date;

Ø instrucţiuni de procesare a tranzacţiilor ce reprezintă operaţii multiple

de manipulare a datelor;

Ø instrucţiuni de control al cursorului;

Ø instrucţiuni privind controlul accesului la date.

Există trei metode de bază privind implementarea limbajului SQL:

Ø prin apelare directă (Direct Invocation) care presupune introducerea

instrucţiunilor SQL direct de la prompter;

Ø metoda modulară (Modul Language) care foloseşte proceduri apelate de

programele aplicaţiei;

Ø metoda de tip încapsulat (Embedded SQL) care permite încapsularea

instrucţiunilor în codul de program.

7.2. Elemente de bază ale interogărilor SQL

Modalitatea prin care, pornind de la o schemă relaţională, pot fi obţinute

diverse informaţii dintr-o bază de date se numeşte interogare (QUERY), iar

formularea unei interogări înseamnă redactarea unei fraze SELECT.

Termenul de interogare este oarecum impropriu. O interogare SQL nu este

neapărat o întrebare pusă bazei de date. Ea poate fi şi o comandă pentru

executarea uneia din acţiunile următoare:

- să construiască sau să şteargă o bază de date;

- să insereze, să modifice sau să şteargă linii sau câmpuri;

- să caute în câteva tabele o anumită informaţie şi să returneze rezultatele

într-o anumită ordine;

- să modifice securitatea informaţiilor.

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.

F

F

72

Sintaxa oarecum simplificată a unei interogări SQL este următoarea:

SELECT [ALL/DISTINCT/] lista_atributeFROM nume-tabele[WHERE criteriu_de_căutare][GROUP BY atribut_de_grupare][HAVING criteriu_de_grupare][ORDER BY criteriu_de_ordonare [ASC/DESC]];

unde:lista_atribute - specifică atributele ale căror valori vor fi returnatenume-tabele - specifică tabelele din care se vor extrage dateleALL - specifică returnarea tuturor tuplurilor care

îndeplinesc condiţiile precizate în blocul de cerereDISTINCT - elimină tuplurile care prezintă valori duplicate

conţinute în atributele specificateWHERE - permite, prin precizarea unei expresii, exprimarea

criteriului de selecţieORDER BY - precizează atributul după care se va face ordonareaGROUP BY - folosit pentru a partiţiona o relaţie în grupuri,

acordând acestora valori pe un atribut sau listă de

atribute

HAVING - folosit pentru a specifica criterii de selecţie pe

grupuri de tupluri

În continuare este realizată o paralelă între clauzele principale ale frazei

SELECT cu operatorii algebrei relaţionale prezentaţi în capitolul 3 Algebra

relaţională.

Selecţie şi proiecţie

Clauza SELECT în algebra relaţională corespunde operatorului proiecţie,

ea fiind folosită pentru a desemna care sunt coloanele care vor apărea în rezultat.

Clauza FROM este folosită pentru a enumera tabelele (relaţiile) din care vor fi

extrase informaţiile aferente consultării. Prin clauze WHERE este desemnat

predicatul selectiv al algebrei relaţionale, ce se aplică atributelor din relaţiile care

apar în clauza FROM.

O consultare simplă în SQL, la modul cel mai general şi simplist, poate fi

prezentată astfel:

F

73

SELECT C1, C2, ..., CnFROM T1, T2, ..., TmWHERE PRezultatul 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 obţinut

şi ca o variabilă masiv (tablou).

Ci – reprezintă coloanele (care pot fi atribute sau expresii de atribute -

rezultat);

Tj – tabelele ce trebuie parcurse pentru obţinerea rezultatului;

P – predicatul (condiţia) simplu sau compus ce trebuie îndeplinit de tupluri

pentru a putea fi incluse în rezultat.

Atunci când clauza WHERE nu este prezentă, se consideră în mod implicit

că valoarea logică a predicatului P este „adevărat” ş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 doreşte schimbarea acestui nume

rezultat se apelează la clauza AS.

Conform restricţiei de unicitate, într-o relaţie nu pot exista două linii

identice. În schimb, în SQL, tabela obţinută dintr-o consultare poate conţine două

sau mai multe tupluri identice.

Spre deosebire de algebra relaţională, unde tuplurile identice (dublurile)

sunt eliminate automat din rezultat, în SQL nu se întâmplă acelaşi lucru. Pentru

aceasta este necesară folosirea opţiunii DISTINCT.

SELECT DISTINCT C1, C2, ..., CnFROM T1, T2, ..., TmWHERE PDin cele prezentate până acum se poate trage concluzia că o frază SELECT

corespunde:

- unei proiecţii (SELECT C1),

- unui produs cartezian (FROM R1 Ä R2 Ä ... Ä Rm),

- unei selecţii algebrice (WHERE P).

74

şi conduce la obţinerea 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 vom transpune în SQL, câteva interogări din algebra

relaţională.

Exemplul 1. SelecţieSELECT *FROM R1WHERE C1>500

Exemplul 2. SelecţieSELECT *FROM R1WHERE C3>250 AND C3<=350

Exemplul 3. Selecţie

SELECT *FROM R1WHERE C1>300 AND C3>300

Exemplul 4. Care sunt studenţii Facultăţii de Ştiinţe Economice?SELECT *FROM STUDENTWHERE facultate = „Stiinte Economice”

Exemplul 5. Care sunt studenţii Facultăţii de Ştiinţe Economice,

specializarea Contabilitate şi Informatică de Gestiune?SELECT *FROM STUDENTWHERE facultate = „Stiinte Economice” AND

specializare = „CIG”

Exemplul 6. Ce burse au fost ridicate î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 BURSAWHERE data_încasarii>=’2004/02/01’ AND

data_încasarii<=’2004/02/29’

În Visual FoxPro aceeaşi interogare este de forma:

75

SELECT *;FROM BURSA;WHERE data_încasarii>={^2004/02/01} AND;

data_încasarii<={^2004/02/29}

Observaţie: În Visual Foxpro caracterul ; este folosit pentru a specifica

faptul că o comandă este scrisă pe mai multe linii.

Exemplul 7. ProiecţieSELECT C3FROM R1

Exemplul 8. ProiecţieSELECT C1, C3FROM R1

Exemplul 9. Care sunt facultăţile preluate în bază?

SELECT facultateFROM STUDENT

SQL, spre deosebire de algebra relaţională, nu elimină automat

duplicatele. Tabela obţinută prin consultarea de mai sus are forma tabelei R’

(figura 3.13.). Pentru a obţine rezultatul de forma tabelei R (o facultate să apară o

singură dată), se foloseşte clauza DISTINCT.

Exemplu 10. Care sunt: cota, titlul, domeniul şi număr de exemplare al

fiecărei cărţi?SELECT cota_carte, titlu, domeniu, nr_exemplareFROM CARTE

Î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 facultateFROM STUDENTWHERE nume = „Barbu Costel”

Exemplul 12. Care sunt regiunile din care fac parte judeţele Dâmboviţa şi

Vâlcea?

76

SELECT judet, regiuneFROM LOCALITATEWHERE judet = „Dambovita” OR JUDEŢ = „Valcea”

Exemplul 13. Care sunt studenţii Facultăţii de Ştiinţe Economice de la

specializările CIG şi FA?SELECT nume, sectiaFROM STUDENTWHERE facultate = „Stiinte Economice” AND sectia =

„CIG” OR sectia = „FA”

Exemplul 14. Care sunt cărţile care au apărut la editurile Eficient şi

Macarie?SELECT titluFROM CARTEWHERE editura = „Eficient” OR editura = „Macarie”

Reuniune, intersecţie, diferenţă, produs cartezian

Primii trei operatori asamblişti prezintă operatori SQL dedicaţi: UNION,

INTERSECT, MINUS (EXTRACT) în timp ce produsul cartezian se obţine

automat prin simpla enumerare a celor două tabele în clauza FROM.

Reuniunea

Un rezultat identic cu tabela R3 din figura 3.2., se obţine prin următoarea

frază SELECT:

SELECT *FROM R1

UNIONSELECT *FROM R2

Revenind la exemplul 13 din capitolul 3 - Care sunt studenţii Facultăţii de

Ştiinţe Economice de la specializările CIG şi FA? -, fraza SQL echivalentă cu

soluţia 2 bazată pe reuniune este:SELECT numeFROM STUDENTWHERE facultate = „Stiinte Economice” AND sectia =

„CIG”UNIONSELECT numeFROM STUDENTWHERE facultate = „Stiinte Economice” AND sectia =

„FA”

F

77

Intersecţia

Raportându-ne la exemplul din figura 33. , echivalentul tabelei R4 se

obţine în SQL prin:SELECT *FROM R1

INTERSECTSELECT *FROM R2

Pentru o primă reprezentare a utilizării intersecţiei, transcriem soluţia din

algebra relaţională formulată la exemplul 14 - Care sunt cărţile care au apărut la

editurile Eficient şi Macarie?SELECT titluFROM CARTEWHERE editura = „Eficient”INTERSECTSELECT tiluFROM CARTEWHERE editura = „Macarie”

Exemplul de mai sus funcţionează în Oracle, nu însă şi în Visual FoxPro,

care nu are implementat operatorul INTERSECT, astfel încât intersecţia trebuie

realizată folosind alte clauze şi operatori.

Diferenţa

Operatorul la care ne-am aştepta în acest caz ar fi MINUS. În Standardul

SQL – 92 şi în alte câteva 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 obţine prin

interogarea:SELECT *FROM R1

EXCEPTSELECT *FROM R2

Ca şi pentru INTERSECT, Visual FoxPro nu are implementat un operator

SQL pentru realizarea diferenţei a două relaţii.

Având în vedere faptul că intersecţia nu este un operator fundamental,

fraza SELECT ce realizează intersecţia se poate formula cu ajutorul diferenţei

astfel:

F

F

78

SELECT *FROM R1

EXCEPT(SELECT *FROM R1

EXCEPTSELECT *FROM R2)

Produsul cartezian

SQL nu pune la dispoziţie 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 obţine pur şi simplu prin enumerarea celor două relaţii în clauza

FROM.

SELECT *FROM R1, R2

F

79

UNITATEA DE ÎNVĂŢARECOLOANE EXPRESII; OPŢIUNEA ORDER BY

8.1. Coloane expresii

În multe interogări SQL o facilitate importantă o constituie definirea, pe

lângă atributele tabelelor, a unor coloane noi (virtuale), pe baza unor expresii.

Clauza AS permite denumirea coloanelor calculate sau redenumirea unor coloane

ale tabelelor.

Să luăm următorul exemplu:

Care este suma cheltuită cu achiziţionarea cărţii „Informatică de

gestiune”? SELECT titlu, pret_unitar, nr_exemplare,

pret_unitar*nr_exemplare AS sumaFROM CARTEWHERE titlu = „Informatica de gestiune”

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 alcătuit din două bare verticale (||). Spre exemplu, interogarea

următoare produce rezultatul din figura 4.2. .SELECT „Judeţul ” || judet || „ se află în ” ||regiune AS exemplu_concatenareFROM LOCALITATE

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 funcţia ALLTRIM() pentru a elimina toate spaţiile goale din

judet. Visual FoxPro foloseşte pentru conversia valorilor din numeric în şir de

caractere funcţia STR(), iar din dată calendaristică, după caz, DTOC() sau

DTOS():

80

SELECT ALLTRIM(Nume) + „ cu numărul matricol ” ;+ ALLTRIM(STR (nr_matricol)) + „ s-a născut;în data ” + ALLTRIM(DTOC(data_nasterii));AS exemplu_concatenare;FROM STUDENT

În ceea ce priveşte expresiile de tip dată calendaristică, modurile în care au

fost implementate aceste funcţiuni 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 soluţii simple. data_imprumut

fiind un atribut de tip DATE, se consideră implicit dacă adunăm 10, că acest 10

reprezintă numărul de zile.SELECT cota_carte, data_imprumut, ;data_imprumut + 10 AS data_restituire ; FROM STUDCARTE

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

Dacă vrem să punem în evidenţă operaţiunile de adunare şi scădere între

două date calendaristice, să luăm exemplul în care ne interesează intervalul dintre

momentul curent (data curentă) şi momentul împrumutării fiecărei cărţi:

Interogarea în Visual Fox Pro în acest caz este:SELECT cota_carte, data_imprumut, DATE() ;– data_imprumut AS timp_scurs ;Rezultatul scăderii a două date calendaristice este un numeric care

reprezintă numărul de zile dintre cele două date.

8.2. Opţiunea ORDER BY

Una din caracteristicile modelului relaţional este faptul că din punct de

vedere informaţional, nici ordinea atributelor, nici ordinea liniilor în relaţii nu

prezintă importanţă. Cu toate acestea, în practică forma de prezentare a

rezultatelor interogării este foarte importantă. Spre exemplu o listă a tuturor

F

81

localităţilor este cu mult mai folositoare dacă este prezentată în ordine alfabetică,

posibilă prin clauza ORDER BY.

Să se obţină lista localităţilor în ordine alfabetică.SELECT *FROM LOCALITATEORDER BY nume_localitate

Implicit aranjarea se face crescător (ASC). Prin opţiunea DESC, ordinea

prezentării 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 acţiune criteriul de „balotaj” care este al doilea atribut ş.a.m.d.

Să se obţină în ordinea descrescătoare a editurilor şi crescătoare a

titlurilor, lista cărţilor din bibliotecă.

SELECT cota_carte, titlu, edituraFROM CARTEORDER BY editura DESC, titlu ASC

82

UNITATEA DE ÎNVĂŢARE 9OPERATORII BETWEEN, LIKE, IN

Pentru formularea predicatului de selecţie, SQL permite utilizarea, pe

lângă „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).

9.1. Operatorul BETWEEN

Este util pentru definirea intervalelor de valori.

Care sunt studenţii care s-au născut î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}

Soluţia la exemplul de mai sus, în condiţiile în care nu se folosea

BETWEEN, ar fi folosit în clauza WHERE, o condiţie compusă.

SELECT * ;FROM STUDENT ;WHERE data_naşterii > = {^1982/01/01} ;AND data_naşterii < = {^1982/12/31}

Să se obţină în ordinea apariţiei, lista cărţilor din bibliotecă cu numărul

de exemplare cuprins între 50 şi 100.

SELECT titlu, an_aparitie, nr_exemplareFROM CARTEWHERE nr_exemplare BETWEEN 50 AND 100ORDER BY an_aparitie

Soluţia fără BETWEEN:

SELECT titlu, an_aparitie, nr_exemplareFROM CARTEWHERE nr_exemplare >= 50AND nr_exemplare <= 100ORDER BY an_aparitie

Să se obţină în ordinea descrescătoare a judeţelor, lista localităţilor cu

indicativul judeţului cuprins între DB (Dâmboviţa) şi VL (Vâlcea).

F

83

SELECT cod_judet, nume_localitate,cod_localitateFROM LOCALITATEWHERE cod_judet BETWEEN „DB” AND „VL”ORDER BY cod_judet DESC

Varianta fără BETWEEN:

SELECT cod_judet, nume, cod_localitateFROM LOCALITATEWHERE cod_judet > = “DB”AND cod_judet < = “VL”ORDER BY cod_judet DESC

9.2. Operatorul LIKE

De multe ori, când se doreşte obţinerea unor informaţii din bază suntem

puşi în postura de a nu şti cu exactitate cum se numeşte un student sau o carte.

Acestea sunt situaţiile pentru a căror rezolvare a fost gândit operatorul LIKE.

Operatorul LIKE permite compararea unui atribut (expresii) cu un literal

utilizând o „mască” construită cu ajutorul specificatorilor multipli % sau _ .

Procentul (%) substituie un şir de lungime variabilă, 0-n caractere, în timp ce

liniuţa (_) substituie un singur caracter.

Care sunt cărţile din bibliotecă care încep cu litera „C”?.SELECT *FROM CARTEWHERE titlu LIKE „C%”

Varianta fără LIKE (în VFP):

SELECT * ;FROM CARTE ;WHERE LEFT(titlu,1)='C'

S-a folosit funcţia LEFT() pentru a extrage prima literă din titlu.

Ce cărţi au titlul conţinând litera „l „ pe a treia poziţie?SELECT *FROM CARTEWHERE titlu LIKE „__l%”

Dacă există cărţi al căror titlu conţine litera „L” majusculă pe a treia

poziţie, acestea nu sunt extrase în rezultat. Pentru siguranţă, în asemenea situaţii,

soluţia este:

F

84

SELECT *FROM CARTEWHERE titlu LIKE „__l%” OR titlu LIKE „__L%”

Varianta fără LIKE (în VFP)::

SELECT * ;FROM CARTE ;WHERE SUBSTR(titlu,3,1)='l' OR ;SUBSTR(titlu,3,1)='L'

S-a folosit funcţia SUBSTR() pentru a extrage un subşir (litera L) dintr-un

şir (titlu)

Titlul căror cărţi se termină în literele „te”?SELECT *FROM CARTEWHERE titlu LIKE „%te”

Varianta fără LIKE (în VFP):

SELECT * ;FROM CARTE ;WHERE RIGHT(ALLTRIM(titlu),2)=„te”

Observăm folosirea funcţie RIGHT() pentru a extrage caracterele din

dreapta în combinaţie cu funcţia ALLTRIM().

9.3. Operatorul IN

Atunci când se testează dacă valoarea unui atribut este încadrabilă într-o

listă dată de valori, în locul folosirii abundente a operatorului OR, o soluţie mult

mai elegantă este să se facă apel la operatorul IN.

Formatul general este:

expresie1 IN (expresie2, expresie3, ...)

Rezultatul evaluării unui predicat ce conţine acest operator va fi adevărat

dacă valoarea expresiei1 este cel puţin egală cu una dintre valorile

expresie2, expresie3, ....

Care sunt studenţii care urmează specializările CIG, MG şi MK?

- fără operatorul IN

SELECT *FROM STUDENTWHERE sectia = „CIG” OR sectia = „MG”

F

85

OR sectia = „MK”

- cu operatorul IN

SELECT *FROM STUDENTWHERE sectia IN („CIG”, „MG”, „MK”)

- o variantă VFP:SELECT * ;FROM STUDENT ;WHERE INLIST(sectia, „CIG”, „MG”, „MK”)

Care sunt cărţile care au apărut în anii 1999, 2001 şi 2002?

- fără operatorul IN

SELECT *FROM CARTEWHERE an_aparitie=1999 OR an_aparitie=2001or an_aparitie=2002

- cu operatorul IN

SELECT *FROM CARTEWHERE an_aparitie IN (1999, 2001, 2002)

- o variantă VFP:

SELECT * ;FROM CARTE ;WHERE INLIST(an_aparitie, 1999, 2001, 2002)

Ce burse s-au încasat pe 16, 18 şi 20 februarie 2004?

- fără operatorul IN

SELECT *FROM BURSAWHERE data_incasarii = {^2004/02/16}OR data_incasarii = {^2004/02/18}OR data_incasarii = {^2004/02/20}

- cu operatorul IN

SELECT *FROM BURSAWHERE data_incasarii IN ({^2004/02/16},{^2004/02/18}, {^2004/02/20})

86

- o variantă VFP:SELECT * ;FROM BURSA ;WHERE INLIST(data_incasarii, {^2004/02/16}, ;{^2004/02/18}, {^2004/02/20})

87

UNITATEA DE ÎNVĂŢARE 10THETA ŞI ECHIJONCŢIUNEA

Dintre tipurile de joncţiuni, vom insista în aceast subcapitol asupra theta –

joncţiunii şi echijoncţiunii. SQL nu prezintă clauze sau operatori speciali pentru

joncţiune, însă după cum am văzut, joncţiunea se constituie ca o combinaţie între

produs cartezian şi selecţie.

Exemplul 15 al algebrei relaţionale pentru theta – joncţionarea relaţiilor R1

şi R2 (figura3.19.), se scrie:SELECT *FROM R1, R2WHERE R1.C1 > R2.C5

iar pentru echijoncţiunea din exemplul 16 (figura 3.20.):SELECT *FROM R1, R2WHERE R1.C1 = R2.C5

Joncţiunea naturală poate fi realizată numai prin specificarea numelor

atributelor în clauza SELECT a frazei de interogare. În standardul SQL-92 şi în

implementările SQL ale multor SGBD-uri se poate folosi o variantă mai elegantă,

ţinând seama şi de faptul că tot ce înseamnă theta- şi echijoncţiune reprezintă

pentru SQL, INNER JOIN (joncţiune internă).

Prin urmare, cele două soluţii de mai sus pot fi rescrise, după cum

urmează:SELECT *FROM R1 INNER JOIN R2 ON R1.C1 > R2.C5,

respectivSELECT *FROM R1 INNER JOIN R2 ON R1.C1 = R2.C3.

Reluăm, pentru comparaţie, exemplele din algebra relaţională.

Exemplul 19. Să se afle numele, facultatea şi secţia studenţilor care stau

la căminul Miclas?.

- varianta 1 (generală):SELECT NUME, facultate, sectia,STUDCAMIN.nume_caminFROM STUDENT, STUDCAMINWHERE STUDENT.nr_matricol =STUDCAMIN.nr_matricol ANDSTUDCAMIN.nume_camin = „Miclas”

F

88

- 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”Numai atributul nume_camin a fost prefixat cu numele tabelei din care

provine (STUDCAMIN). Prefixarea este obligatorie atunci când câmpul există în

două sau mai multe dintre tabelele enumerate în clauza FROM.

Exemplul 20. Care sunt cărţile scrise de Victor Stanciu?

- varianta 1 (generală):SELECT titlu, AUTOR.nume_autorFROM AUTOR, AUTORCARTE, CARTEWHERE AUTOR.cod_autor =AUTORCARTE.cod_autor ANDAUTORCARTE.cota_carte = CARTE.cota_carteAND 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 = „Niculae Feleagă”

Exemplul 21. Numele studenţilor care au împrumutat cărţi din domeniul

Informatică.

- varianta 1 (generală):SELECT numeFROM CARTE, STUDCARTE, STUDENTWHERE CARTE.cota_carte = STUDCARTE.cota_carte ANDSTUDCARTE.nr_matricol = STUDENT.nr_matricol ANDdomeniu = „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”

Exemplul 22. Numele şi secţia studenţilor Facultăţii de Ştiinţe Economice

care au împrumutat cartea Informatica de gestiune în februarie 2004?.

- varianta 1 (generală):SELECT nume, sectiaFROM CARTE, STUDCARTE, STUDENT

89

WHERE CARTE.cota_carte = STUDCARTE.cota_carte ANDSTUDCARTE.nr_matricol = STUDENT.nr_matricol ANDtitlu = „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, sectiaFROM CARTE INNER JOIN STUDCARTE ONCARTE.cota_carte = STUDCARTE.cota_carte INNER JOINSTUDENT ON STUDCARTE.nr_matricol =STUDENT.nr_matricolWHERE titlu = „Informatica de gestiune” ANDfacultate = „Stiinte Economice” AND data_imprumutBETWEEN {^2004/02/01} AND {^2004/02/29}

Exemplul 23. De la ce secţii sunt studenţii care au împrumutat şi cartea

Informatică de gestiune şi Contabilitate generală?

- soluţia 1 - varianta 1 (nu funcţionează în Visual Fox Pro):SELECT DISTINCT sectiaFROM STUDENT, STUDCARTE, CARTEWHERE STUDENT.nr_matricol = STUDCARTE.nr_matricolAND STUDCARTE.cota_carte = CARTE.cota_carte ANDtitlu = „Informatica de gestiune”INTERSECTSELECT sectiaFROM STUDENT, STUDCARTE, CARTEWHERE STUDENT.nr_matricol = STUDCARTE.nr_matricolAND STUDCARTE.cota_carte = CARTE.cota_carte ANDtitlu = „Contabilitate generala”- soluţia 1 - varianta 2 (SQL - 92):SELECT DISTINCT sectiaFROM STUDENT INNER JOIN STUDCARTE ONSTUDENT.nr_matricol = STUDCARTE.nr_matricol INNERJOIN CARTE ON STUDCARTE.cota_carte =CARTE.cota_carteWHERE titlu = „Informatica de gestiune”INTERSECTSELECT DISTINCT sectiaFROM STUDENT INNER JOIN STUDCARTE ONSTUDENT.nr_matricol = STUDCARTE.nr_matricol INNERJOIN CARTE ON STUDCARTE.cota_carte =CARTE.cota_carteWHERE titlu = „Contabilitate generala”

De notat folosirea clauzei DISTINCT pentru eliminarea eventualelor

dubluri. Pentru variantele soluţiei 2 vom avea nevoie de ceea ce se numeşte

joncţiunea unei tabele cu ea însăşi, care va fi prezentată în subcapitolul următor.

90

UNITATEA DE ÎNVĂŢARE 11SINONIME LOCALE ŞI JONCŢIUNEA UNEI TABELE CU EA ÎNSĂŞI

Lucrul cu nume lungi de tabele (STUDCARTE) şi atribute

(cod_localitate) prezintă marele avantaj al lejerităţii la citire şi înţelegeri

rapide a logicii de derulare a interogării. În schimb, destul de mulţi informaticieni

nu agrează risipa de caractere (şi, implicit de timp) implicată de redactările

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_caminFROM STUDENT S, STUDCARTE S1, CARTE C, STUDCAMIN S2WHERE

S.nr_matricol = S2.nr_matricol ANDS.nr_matricol = S1.nr_matricol ANDS1.cota_carte = C.cota_carte ANDtitlu = „Informatică de gestiune”

INTERSECT................................................................................................

Tabelei STUDENT i s-a asociat sinonimul S, STUDCARTE S1, CARTE

C, iar pentru STUDCAMIN S2. Sinonimele prefixează (atunci când este cazul)

numele atributelor din clauzele SELECT şi WHERE (eventual ORDER BY şi

GROUP BY).

O operaţie în care obligatoriu trebuie folosite sinonimele este joncţionarea

unei tabele cu ea însăşi.

Revenim la exemplul 25 din algebra relaţională.

Ce studenţi studiază la aceeaşi secţie cu Dinescu Monica?SELECT S2.numeFROM STUDENT S1, STUDENT S2WHERE S1.sectia = S2.sectia AND S1.nume = „Dinescu

Monica”

Joncţiunea unei tabele cu ea însăşi presupune, de fapt, joncţiunea a două

instanţe ale tabelei respective. Rezultatul joncţiunii S1 cu S2 este o tabelă

intermediară, asupra căreia se aplică predicatul de selecţie suplimentar S1.nume

= „Dinescu Monica”.

O altă variantă se prezintă astfel:

F

91

SELECT S2.numeFROM STUDENT S1 INNER JOIN STUDENT S2 ON S1.sectia= S2.sectiaWHERE S1.nume = „Dinescu Monica”

Am rămas datori cu formularea soluţiei 2 din algebra relaţională de la

exemplul 22:

De la ce secţii sunt studenţii care au împrumutat şi cartea „Informatică de

gestiune” şi „Contabilitate generală”?

Joncţionăm o instanţă obţinută prin joncţiunea STUDENT-STUDCARTE-

CARTE (în care titlu = „Informatica de gestiune”) cu o altă

instanţă a aceleiaşi combinaţii (în care titlu = „Contabilitate

generală”)

- soluţia 2 – varianta 1 (generală):SELECT DISTINCT S1.sectiaFROM STUDENT S1, STUDCARTE SC1, CARTE C1, STUDENTS2, STUDCARTE SC2, CARTE C2WHERE

S1.nr_matricol = SC1.nr_matricol ANDSC1.cota_carte = C1.cota_carte ANDC1.titlu = „Informatica de gestiune” ANDS2.nr_matricol = SC2.nr_matricol ANDSC2.cota_carte = C2.cota_carte ANDC2.titlu = „Contabilitate generală” ANDS1.sectia = S2.sectia

- soluţia 2 – varianta 2 (Visual Fox Pro):SELECT DISTINCT S1.sectiaFROM CARTE C1

INNER JOIN STUDCARTE SC1 ONC1.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 ONSC2.nr_matricol = S2.nr_matricol

INNER JOIN CARTE C2 ON SC2.cota_carte =C2.cota_carteWHERE

C1.titlu = „Informatica de gestiune” ANDC2. titlu = „Contabilitate generala”

92

UNITATEA DE ÎNVĂŢARE 12SUBCONSULTĂRI

Una dintre cele mai importante facilităţi oferite de SQL constă în

includerea unei consultări în alta, pe două sau mai multe niveluri – cu alte cuvinte,

utilizarea subconsultărilor. Prin aceste subconsultări se obţin tabele temporare

intermediare ce vor fi folosite drept „argumente” în frazele SELECT superioare.

În materie de subconsultări, cel mai utilizat operator este IN, pe care deja

l-am întâlnit în capitolul precedent, dar într-o cu totul altă ipostază – testarea

încadrării valorii unui atribut într-o listă de constante.

Revenim la exemplul din algebra relaţională: Ce studenţi studiază la

aceeaşi secţie cu „Dinescu Monica”?

SELECT numeFROM STUDENTWHERE sectia IN

(SELECT sectiaFROM STUDENTWHERE nume = „Dinescu Monica”)

În cazul acestei interogări, execuţia se realizează în doi timpi. Mai întâi se

execută subconsultareaSELECT sectiaFROM STUDENTWHERE nume = „Dinescu Monica”

obţinându-se o tabelă intermediară ce conţine o singură linie (pe care apare CIG)

şi o singură coloană (sectia).

În cel de-al doilea pas sunt selectate liniile tabelei STUDENT care

îndeplinesc condiţia secţia = „CIG”

Observăm că în rezultat a fost inclus şi studentul de referinţă – Dinescu

Monica. Dacă se doreşte excluderea din rezultat a acestui student, fraza SELECT

se modifică astfel:SELECT numeFROM STUDENTWHERE sectia IN

(SELECT sectiaFROM STUDENTWHERE nume = „Dinescu Monica”)AND nume < > „Dinescu Monica”

Ce studenţi studiază la alte secţii decât „Dinescu Monica”?

F

93

SELECT numeFROM STUDENTWHERE sectia NOT IN

(SELECT sectiaFROM STUDENTWHERE nume = „Dinescu Monica”)

În ce cămin sunt cazaţi studenţii care studiază la aceeaşi secţie cu

„Dinescu Monica”?

SELECT DISTINCT nume_caminFROM STUDCAMINWHERE nr_matricol IN

(SELECT nr_matricolFROM STUDENTWHERE sectia IN

SELECT sectiaFROM STUDENTWHERE nume = „Dinescu Monica”))

Rezultatul este obţinut prin folosirea a trei niveluri de interogare (fraza

principală, o subconsultare şi o sub-subconsultare).

În Visual Fox Pro această ultimă interogare face simţită prezenţa uneia

dintre cele mai serioase limitări SQL – maxim 2 niveluri de consultare (fraza

principală şi o interogare subordonată). Mesajul de eroare are numărul 1842: SQL:

Subquery nesting in too deep.

Astfel, pentru a răspunde la întrebare, soluţia de interogare trebuie

reformulată:SELECT nume_caminFROM STUDENT INNER JOIN STUDCAMIN;ON STUDENT.nr_matricol = STUDCAMIN.nr_matricol;WHERE sectia IN

(SELECT sectiaFROM STUDENTWHERE nume = „Dinescu Monica”)

Din ce judeţe sunt studenţii care au împrumutat cărţi scrise de autori de

naţionalitate română?

Am ales acest exemplu pentru a folosi în subconsultări cât mai multe

tabele ale bazei de dateSELECT judetFROM LOCALITATEWHERE cod_localitate IN

(SELECT cod_localitate IN

94

FROM STUDENTWHERE cota_carte IN

(SELECT nr_matricolFROM STUDCARTEWHERE cota_carte IN

(SELECT cota_carteFROM CARTEWHERE cota_carte IN (SELECT cota_carte FROM AUTOR_CARTE WHERE nume_autor IN

SELECT nume_autor FROM AUTOR WHERE natioanlitate = „roman”)))))

Atunci când rezultatul unei subconsultări se concretizează într-o tabelă cu

o singură coloană şi o singură linie, corelarea poate fi făcută şi cu operatorii de

comparaţie obişnuiţi: =, >, >=, <, <=.

În continuare vom ilustra această facilitate prin câteva exemple.

Care este cel mai mic preţ unitar la care s-a cumpărat o carte?SELECT MIN (pret_unitar) AS maximFROM CARTE

Care este cel mai mic preţ unitar şi care este cartea, respectiv studentul

care a împrumutat cartea cu preţul respectiv?

SELECT titlu, pret_unitar, numeFROM CARTE C, STUDCARTE SC, STUDENT SWHERE S.nr_matricol = SC.nr_matricolAND SC.cota_carte=C.cota_carte AND

pret_unitar =(SELECT MIN (pret_unitar) FROM CARTE)

Care sunt cele mai mari cinci preţuri unitare, cărţile şi studenţii care au

împrumutat cărţile care au cele cinci preţuri maxime?SELECT titlu, pret_unitar, numeFROM STUDENT INNER JOIN STUDCARTE ONSTUDENT.nr_matricol = STUDCARTE.nr_matricol

INNER JOIN CARTE ON STUDCARTE.cota_carte =CARTE.cota_carte

WHERE pret_unitar >(SELECT MAX (pret_unitar)FROM CARTEWHERE pret_unitar <

(SELECT MAX (pret_unitar)FROM CARTEWHERE pret_unitar <

(SELECT MAX (pret_unitar)FROM CARTEWHERE pret_unitar <

95

(SELECT MAX (pret_unitar)FROM CARTEWHERE pret_unitar <(SELECT MAX (pret_unitar) FROM CARTE)))))

ORDER BY pret_unitar DESC

Având în vedere nivelurile de interogare, pentru exemplul de mai sus, în

Visual FoxPro nu se poate formula interogarea în această formă. Avem însă la

îndemână o soluţie neverosimil de simplă bazată pe clauza TOP.

SELECT TOP 5 titlu, pret_unitar, numeFROM STUDENT INNER JOIN STUDCARTE ONSTUDENT.nr_matricol = STUDCARTE.nr_matricolINNER JOIN CARTE ON STUDCARTE.cota_carte =CARTE.cota_carteORDER BY pret_unitar DESC

Liniile tabelei sunt ordonate descrescător după preţul unitar, iar în rezultatul

final sunt extrase doar primele cinci (prin TOP 5)

96

UNITATEA DE ÎNVĂŢARE 13FUNCŢII AGREGAT

Formatul general al unei fraze SELECT care conţine funcţii agregat este:

SELECT funcţie 1, ..., funcţie 2FROM lista_tabeleWHERE condiţie

Dacă în clauza SELECT este prezentă o funcţie agregat, în lipsa opţiunii

ORDER BY, rezultatul va conţine o singură linie.

13.1. Funcţia COUNT

Funcţia COUNT contorizează valorile nenule ale unei coloane sau numărul

de linii dintr-un rezultat al interogării. Cu alte cuvinte, COUNT numără câte valori

diferite de NULL are coloana specificată sau câte linii sunt.

Câte cărţi sunt în bibliotecă?SELECT COUNT(*) AS Nr_cartiFROM CARTE

Prezenţa asteriscului ca argument al funcţiei COUNT are ca efect

numărarea tuturor liniilor tabelei CARTE.

Folosind concatenarea se poate obţine 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 RezultatFROM CARTE

Tabela CARTE are cheie primară atributul cota_carte, care nu poate

avea valori nule, de aceea, la fel de corectă este şi soluţia:SELECT COUNT(cota_carte) AS Nr_cartiFROM CARTE

Câte linii are produsul cartezian al tabelelor STUDENT şi STUDCAMIN?SELECT COUNT(*) AS ProdusFROM STUDENT, STUDCAMIN

Câţi studenţi urmează cursurile Facultăţii de Ştiinţe Economice?SELECT COUNT(Nr_matricol) AS Nr_studentiFROM STUDENTWHERE facultate = „Stiinte Economice”

F

97

Câţi studenţi de la Facultatea de Ştiinţe Economice sunt bursieri?

SELECT COUNT (*) AS Nr_bursieriFROM STUDENT S, BURSA BWHERE S.nr_matricol = B.nr_matricol AND facultate

= „Stiinte Economice”

Câţi studenţi stau în cămin?SELECT COUNT (*) AS Nr_caministiFROM STUDENT S, STUDCAMIN SCWHERE S.nr_matricol = SC.nr_matricol

Care este numărul studenţilor din Muntenia?

SELECT COUNT (*) AS Nr_studentiFROM STUDENT S, LOCALITATE LWHERE S.cod_localitate = L.cod_localitate AND

regiune = „Muntenia”

Din câte localităţi provin studenţii?

Tabela LOCALITATE conţine şi localităţi din care nu avem studenţi,

pentru moment.

De aceea, în locul soluţiei:SELECT COUNT(cod_localitate) AS Nr_localitatiFROM LOCALITATE

de preferat ar fi folosirea variantei:SELECT COUNT(cod_localitate) AS Nr_localitatiFROM STUDENT

Problema este că rezultatul obţinut (20) este incorect, deoarece funcţia

COUNT numără toate valorile nenule. Există însă o clauză prin care o valoare să

fie luată o singură dată în calcul: DISTINCT. Rezultatul corect (nr.) presupune

următoarea variantă:

SELECT COUNT(DISTINCT cod_localitate) AS Nr_localitatiFROM STUDENT

13.2. Funcţia SUM

SUM este una dintre cele mai utilizate funcţii în aplicaţiile economice,

deoarece datele financiar-contabile şi cele ale evidenţei tehnico-operative sunt

preponderent cantitative.F

98

Cât s-a plătit fără TVA pentru cartea „Informatică de gestiune”?

SELECT SUM (nr_exemplare*pret_unitar)AS Val_fara_TVAFROM CARTEWHERE titlu = „Informatica de gestiune”

Cât s-a plătit fără TVA, care este valoarea TVA-ului şi cât s-a plătit total

pentru cartea „Informatica de gestiune”?SELECT SUM (nr_exemplare*pret_unitar)ASVal_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”

Aceasta este o soluţie atemporală, deoarece după cum se ştie, procentul de

TVA (care în prezent este 19%) poate suferi în timp modificări. O vizualizare mai

elegantă a acestui rezultat poate fi realizată folosind următoarea interogare:

SELECT „Pentru cartea Informatica de gestiune fărăTVA s-a plătit” + STR (SUM (nr_exemplare*pret_unitar), 10) + „ valoarea TVA este” + STR(SUM (nr_exemplare*pret_unitar*0.16), 10) + „iar total s-au cheltuit” + STR (SUM(nr_exemplare*pret_unitar +nr_exemplare*pret_unitar*0.16), 10) AS RezultatFROM CARTEWHERE titlu = „Informatica de gestiune”

La cât se situează suma încasată ca bursă de studenţi în data de

20.02.2004?SELECT „20.02.2004” AS DATA, SUM (SUMA_incasata)

AS Val_bursaFROM STUDENT, BURSAWHERE STUDENT.nr_matricol = BURSA.nr_matricol AND

data_incasarii = {^2004/02/20}

Care este suma totală încasată ca bursă de studenţii Facultăţii de Ştiinţe

Economice?SELECT SUM (suma_incasata) AS Suma_bursaFROM STUDENT S, BURSA BWHERE S.nr_matricol = B.nr_matricol AND facultate

= „Stiinte Economice”

99

Care este suma totală încasată ca bursă de studenţii căminişti?SELECT SUM (suma_incasata) AS Suma_bursaFROM STUDENT S, STUDCAMIN SC, BURSA BWHERE S.nr_matricol = SC.nr_matricol AND

S.nr_matricol = B.nr_matricol

Care este valoarea medie a preţului (inclusiv TVA) la care a fost

achiziţionată cartea „Informatică de gestiune”?

Această valoare medie nu o calculăm folosind funcţia AVG (pe care o vom

descrie ceva mai încolo), ci se bazează pe raportul dintre suma plătită şi numărul

de exemplare însumate pentru această carte.

SELECT SUM (nr_exemplare*pret_unitar*1.19) / SUM(nr_exemplare) AS Pret_mediu

FROM CARTEWHERE titlu = „Informatica de gestiune”

13.3. Funcţia 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 numărul de valori nenule ale acesteia.

Care este valoarea medie (fără TVA) la care au fost achiziţionate cărţile

din domeniul Informatică?SELECT „Valoarea medie a cartilor din domeniul

Informatica” AS EXPLICATIE, AVG(nr_exemplare*pret_unitar) AS Val_medie

FROM CARTEWHERE domeniu = „Informatica”

Care este valoarea medie a burselor încasate de studenţii Facultăţii de

Ştiinţe Economice?

SELECT „Valoarea medie a burselor” AS Explicatie,AVG (suma_incasata) AS Val_medie

FROM STUDENT S, BURSA BWHERE S.nr_matricol = B.nr_matricol AND facultate

= „Stiinte Economice”

Care este valoarea medie a burselor încasate de studenţii căminişti?SELECT „Valoarea medie a burselor” AS Explicatie,

AVG (suma_incasata) AS Val_medie

F

100

FROM STUDENT S, BURSA B, STUDCAMIN SCWHERE S.nr_matricol = B.nr_matricol AND

S.nr_matricol = SC.nr_matricol

Adeseori, prin aplicarea funcţiei AVG sau prin formularea unor expresii ce

conţin rapoarte între atribute şi constante, se obţin rezultate cu numeroase

zecimale. Pentru a evita disconfortul unor astfel de rezultate se apelează la funcţia

ROUND.

13.4. Funcţiile MAX şi MIN

Cele două funcţii 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

comparaţie este codul ASCII al elementelor.

Care este studentul cu ultimul nume, în ordine alfabetică, de la facultatea

de Ştiinţe Economice?SELECT MIN (nume) AS Primul_student,

MAX (nume) AS Ultimul_studentFROM STUDENTWHERE facultate = „Stiinte Economice”

Care este primul şi ultimul judeţ (în ordinea numelui) din care provin

studenţii?SELECT MIN (judet) AS Primul_judet

MAX (judet) AS Ultimul_judetFROM STUDENT S, LOCALITATE LWHERE S.cod_localitate = L.cod_localitate

Care este cartea cu cel mai mare număr de exemplare?SELECT titlu, MAX (nr_exemplare) AS ExemplareFROM CARTE

Care este cartea pentru care s-a plătit cel mai puţin?SELECT titlu, MIN (nr_exemplare*pret_unitar) AS

Val_minimaFROM CARTE

F

101

Care este cel mai mare şi cel mai mic preţ unitar la care au fost

achiziţionate cărţile 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 CARTEWHERE domeniu = „Informatica”

Care sunt cele mai mari două preţuri unitare la care au fost achiziţionate

cărţile din domeniu Informatică?

SELECT „Domeniu Informatica” + MAX („Primul pretunitar” + STR (C1.pret_unitar, 8) + „al doilea pretunitar” + STR (C2.pret_unitar, 8) AS „Cele mai maripreturi unitare”

FROM CARTE C1, CARTE C2WHERE C1.cota_carte = C2.cota_carte AND

C1.pret_unitar > C2.pret_unitar AND C1.domeniu =„Informatica”

102

UNITATEA DE ÎNVĂŢARE 14Gruparea tuplurilor: clauza GROUP BY şi clauza HAVING

Clauza GROUP BY formează grupe de tupluri ale unei relaţii, pe baza

valorilor comune ale unui atribut. În frazele SELECT de până 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).

14.1. Clauza GROUP BY

Rezultatul unei fraze SELECT ce conţine această clauză se obţine prin

regruparea tuturor liniilor din tabele enumerate în clauza FROM, extrăgându-se

câte o apariţie pentru fiecare valoare distinctă a coloanei/grupului de coloane.

Formatul general este:

SELECT coloana 1, coloana 2,.., coloana nFROM lista_tabeleGROUP BY coloana_de_regrupare

Care este suma încasată pe fiecare tip de bursă în parte?SELECT tip_bursa, SUM (suma_incasata) AS

total_bursaFROM BURSAGROUP BY tip_bursa

Rezultatul se obţine prin următoarea succesiune de operaţii:

- se ordonează liniile tabelei BURSA după atributul de grupare

tip_bursa,

- se constituie un grup pentru fiecare valoare distinctă a tip_bursa,

- se execută funcţia SUM (suma_incasata) în cadrul fiecărui grup,

- se obţine rezultatul al cărui număr de linii coincide cu valorile distincte

ale tip_bursa.

Care este valoarea totală a burselor pentru fiecare zi în care s-au încasat

burse?

F

103

SELECT data_incasarii, SUM (suma_incasata) ASTotal_zi

FROM BURSAGROUP BY data_incasarii

Care este totalul burselor pe facultăţi?

SELECT facultate, SUM (suma_incasata) ASTotal_facultate

FROM STUDENT S, BURSA BWHERE S.nr_matricol = B.nr_matricolGROUP BY facultate

Care este media burselor pe secţiile facultăţii de Ştiinţe Economice?

SELECT sectia, AVG (suma_incasata) AS Medie_sectieFROM STUDENT S, BURSA BWHERE S.nr_matricol = B.nr_matricol AND facultate

= „Stiinte Economice”GROUP BY sectia

Care este totalul burselor pe cămin, încasate de studenţii căminişti?

SELECT nume_camin, SUM (suma_incasata) ASTotal_camin

FROM STUDENT S, BURSA B, STUDCAMIN SCWHERE S.nr_matricol = SC.nr_matricol AND

S.nr_matricol = B.nr_matricolGROUP BY nume_camin

Care este numărul total de exemplare şi valoarea totală a fiecărei cărţi?SELECT titlu, SUM (nr_exemplare) AS

Total_exemplare, SUM (pret_unitar*nr_exemplare) ASVal_totala

FROM CARTEGROUP BY titlu

Care este numărul total de exemplare din fiecare domeniu în parte?SELECT domeniu, SUM (nr_exemplare) AS

Total_exemplareFROM CARTEGROUP BY domeniu

Care este numărul cărţilor din bibliotecă în funcţie de naţionalitatea

autorilor?SELECT nationalitate, COUNT (C.cota_carte) AS

Nr_carti

104

FROM CARTE C, AUTORCARTE AC, AUTOR AWHERE C.cota_carte = AC.cota_carte AND

AC.cod_autor = A.cod_autorGROUP BY nationalitate

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) AS

Total_bursa, data_incasariiFROM BURSAGROUP BY tip_bursa, data_incasarii

Care este numărul cărţilor din bibliotecă în funcţie de naţionalitatea

autorilor, pe domenii?SELECT nationalitate, domeniu (COUNT (cota_carte)

AS Nr_carti)FROM CARTE C, AUTORCARTE AC, AUTOR AWHERE C.cota_carte = AC.cota_carte AND

AC.cod_autor = A.cod_autorGROUP BY nationalitate, domeniu

14.2. Clauza HAVING

Cea mai simplă definiţie ar fi: clauza HAVING este WHERE-ul ce operează

la nivel de grupuri. Dacă WHERE acţionează la nivel de tuplu, selectând acele linii

care îndeplinesc o condiţie specificată, HAVING permite specificarea unor condiţii

de selecţie ce se aplică grupurilor de linii create prin clauza GROUP BY.

Din rezultat sunt eliminate toate grupurile care nu satisfac condiţia

specificată. Formatul general este:SELECT coloana 1, coloana 2, ..., coloana nFROM lista_tabeleGROUP BY coloana_de_regrupareHAVING criteriu_de_regrupare

Care sunt zilele în care s-au ridicat cel puţin 2 burse?

SELECT data_incasarii, COUNT (*) AS Nr_burseFROM BURSAGROUP BY data_incasariiHAVING COUNT (*) > = 2

Care sunt cărţile pentru care s-au cheltuit peste 10.000.000 lei?

F

105

SELECT titlu, SUM (pret_unitar*nr_exemplare) ASSuma_cheltuita

FROM CARTEGROUP BY titluHAVING SUM (pret_unitar*nr_exemplare) > 10000000

Temă de autoevaluare

Studiu de caz Se consideră următoarea 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 pacienţii din Târgovişte; (vezi pag. 111-118)

2. Care sunt pacienţii din Târgovişte şi Titu; (vezi pag. 111-118)

3. Care pacienţi nu sunt din Târgovişte şi Titu; (vezi pag. 111-118)

4. Care sunt pacienţii care s-au născut în anul 1989 (vezi pag. 111-118)

106

5. Care sunt tarifele mai mari de 25 RON; (vezi pag. 111-118)

6. Din ce localităţi sunt pacienţii din bază; (vezi pag. 111-118)

7. Care este nume şi prenumele medicilor care oferă consultaţii;(vezi pag. 111-118)

8. Care sunt tarifele practicate; (vezi pag. 111-118)

9. Din ce localitate sunt pacienţii născuţi în luna ianuarie 1990;(vezi pag. 111-118)

10. Care sunt orele pentru care sunt prevăzute consultaţii în data de09.02.2006; (vezi pag. 111-118)

107

11. Cum se numesc pacienţii din Târgovişte şi Moreni; (vezi pag. 111-118)

12. Care este prenumele medicilor cu numele de familie Ghionea;(vezi pag. 111-118)

13. La ce data şi la ce oră are programare Popa Georgeta; (vezi pag. 111-118)

14. Care sunt datele la care au făcut programare pacienţii din Târgovişte;(vezi pag. 111-118)

15. Numele pacienţilor care au fost consultaţi în luna februarie 2006;(vezi pag. 111-118)

16. Data la care a făcut programare Dinescu Mircea şi Vancea Ioan;(vezi pag. 111-118)

108

17. Numele medicilor care au acordat consultaţii în data de 23.02.2006;(vezi pag. 111-118)

18. De ce medic a fost consultată Popa Georgeta; (vezi pag. 111-118)

19. Numele pacienţilor consultaţi de Grecu Anca; (vezi pag. 111-118)

20. Nume pacienţilor care au făcut programare şi în luna ianuarie şi în lunafebruarie 2006; (vezi pag. 111-118)

21. Care este tariful consultaţiei pacientului Popa Georgeta;(vezi pag. 111-118)

109

22. Numele pacienţilor care au făcut programare în data de 10.02.2006 înintervalul 14-16; (vezi pag. 111-118)

23. Datele la care au efectuat consultaţii Grecu Anca şi Minea Ion în lunafebruarie 2006; (vezi pag. 111-118)

24. Numele şi prenumele medicilor care au consultat pacienţi din Târgovişteşi Moreni dar nu din Titu; (vezi pag. 111-118)

25. Data la care au fost consultaţi pacienţii care au făcut programare în datade 10.02.2006; (vezi pag. 111-118)

110

26. Nume pacienţilor care au avut programare în data de 10.20.2006 înintervalul 12-14 şi au fost consultaţi de către Grecu Anca.

(vezi pag. 111-118)

27. Numele pacienţilor care sunt din aceeaşi localitate cu Popa Georgeta;(vezi pag. 111-118)

28. Numele medicilor care au prenumele Anca; (vezi pag. 111-118)

29. Numele şi prenumele în ordine alfabetică al pacienţilor pe localităţi;(vezi pag. 111-118)

111

Rezolvare temă de autoevaluare

1. Care sunt pacienţii din Târgovişte;

SELECT *FROM PACIENTWHERE localitate=Targoviste”2. Care sunt pacienţii din Târgovişte şi Titu;

SELECT *FROM PACIENTWHERE localitate=Targoviste” or localitate=”Titu”3. Care pacienţi nu sunt din Târgovişte şi Titu;

SELECT *FROM PACIENTWHERE localitate<>Targoviste” and localitate<>”Titu”4. Care sunt pacienţii care s-au născut în anul 1989

Ø varianta generală (SQL-92)SELECT *FROM PACIENTWHERE datanasterii >= 01/01/1989 and datanasterii<= 31/12/1989

Ø varianta Visual FoxProSELECT *FROM PACIENTWHERE datanasterii >= {^1989/01/01}and datanasterii<={^1989/12/31}

5. Care sunt tarifele mai mari de 25 RON;

SELECT tarifFROM TARIFEWHERE TARIF>= 256. Din ce localităţi sunt pacienţii din bază;

SELECT localitateFROM PACIENT7. Care este nume şi prenumele medicilor care oferă consultaţii;

Ø varianta generală (SQL-92)SELECT numemedic, prenumemedicFROM MEDICI, MEDIC_CONSULTATIEWHERE MEDICI.codmedic=MEDIC_CONSULTATIE.codmedic

Ø varianta VFPSELECT numemedic, prenumemedicFROM MEDICI INNER JOIN MEDIC_CONSULTATIE ONMEDICI.codmedic=MEDIC_CONSULTATIE.codmedic

112

8. Care sunt tarifele practicate;

SELECT tarifFROM TARIFE9. Din ce localitate sunt pacienţii născuţi în luna ianuarie 1990;

Ø varianta generală (SQL-92)SELECT localitateFROM PACIENTWHERE datanasterii >= 01/01/1990 and datanasterii <= 31/01/1990Ø varianta VFPSELECT localitateFROM PACIENTWHERE datanasterii >= {^1990/01/01} and datanasterii <={^1990/12/31}10. Care sunt orele pentru care sunt prevăzute consultaţii în data de

09.02.2006;

SELECT oraprogramareFROM PROGRAMAREWHERE dataprogramare = 09/02/200611. Cum se numesc pacienţii din Târgovişte şi Moreni;

SELECT nume, prenumeFROM PACIENTWHERE localitate = „Targoviste” or localitate = „Moreni”12. Care este prenumele medicilor cu numele de familie Ghionea;

SELECT prenumemedicFROM MEDICIWHERE numemedic = „Ghionea”13. La ce data şi la ce oră are programare Popa Georgeta;

Ø varianta generală (SQL-92)SELECT dataprogramare, oraprogramareFROM PACIENT P, PROGRAMARE PRGWHERE P.codpacient = PRG.codpacient and (nume=”Popa” andprenume = „Georgeta”)

Ø varianta VFPSELECT dataprogramare, oraprogramareFROM PACIENT P INNER JOIN PROGRAMARE PRG ONP.codpacient =PRG.codpacientWHERE nume=”Popa” and prenume = „Georgeta”14. Care sunt datele la care au făcut programare pacienţii din Târgovişte;

Ø varianta generală (SQL-92)SELECT dataprogramareFROM PACIENT P, PROGRAMARE PRGWHERE P.codpacient = PRG.codpacient and localitate = „Targoviste”

113

Ø varianta VFPSELECT dataprogramareFROM PACIENT P INNER JOIN PROGRAMARE PRG ONP.codpacient =PRG.codpacientWHERE localitate = „Targoviste”15. Numele pacienţilor care au fost consultaţi în luna februarie 2006;

Ø varianta generală (SQL-92)SELECT nume, prenumeFROM PACIENT P, CONSULTATIE CWHERE P.codpacient = C.codpacient and (dataconsultatie >=01/02/2006 and dataconsultatie <= 28/02/2006)Ø varianta VFPSELECT nume, prenumeFROM PACIENT P INNER JOIN CONSULTATIE C ON P.codpacient=C.codpacientWHERE dataconsultatie >= {^2006/02/01} and dataconsultatie <={^2006/02/28}16. Data la care a făcut programare Dinescu Mircea şi Vancea Ioan;

Ø varianta generală (SQL-92)SELECT dataprogramareFROM PACIENT P, PROGRAMARE PRGWHERE P.codpacient = PRG.codpacient and (nume = „Dinescu” andprenume = „Mircea”) and (nume = „Vancea” and prenume = „Ioan”Ø varianta VFPSELECT dataprogramareFROM PACIENT P INNER JOIN PROGRAMARE PRG ONP.codpacient =PRG.codpacient WHERE (nume = „Dinescu” andprenume = „Mircea”) and (nume =„Vancea” and prenume = „Ioan”17. Numele medicilor care au acordat consultaţii în data de 23.02.2006;

Ø varianta generală (SQL-92)SELECT numemedic, prenumemedicFROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE CWHERE M.codmedic=MC.codmedic andMC.nrconsultatie=C.nrconsultatieand dataconsultatie = 23/02/2006Ø varianta VFPSELECT numemedic, prenumemedicFROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ONM.codmedic =MC.codmedic INNER JOIN CONSULTATIE C ONMC.NRCONSULTATIE =C.nrconsultatie and dataconsultatie = {^2006/02/23}

114

18. De ce medic a fost consultată Popa Georgeta;

Ø varianta generală (SQL-92)SELECT numemedic, prenumemedicFROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C,PACIENT PWHERE M.codmedic=MC.codmedic andMC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacientand (nume = „Popa” and prenume = „Georgeta”)Ø varianta VFPSELECT numemedic, prenumemedicFROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ONM.codmedic =MC.codmedic INNER JOIN CONSULTATIE C ON MC.nrconsultatie =C.nrconsultatie INNER JOIN PACIENT P ON C.codpacient =P.codpacientWHERE nume = „Popa” and prenume = „Georgeta”19. Numele pacienţilor consultaţi de Grecu Anca;

Ø varianta generală (SQL-92)SELECT numemedic, prenumemedicFROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C,PACIENT PWHERE M.codmedic=MC.codmedic andMC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacientand (numemedic = „Grecu” and prenumemedic = „Anca”)Ø varianta VFPSELECT numemedic, prenumemedicFROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ONM.codmedic =MC.codmedic INNER JOIN CONSULTATIE C ON MC.nrconsultatie =C.nrconsultatie INNER JOIN PACIENT P ON C.codpacient =P.codpacientWHERE numemedic = „Grecu” and prenumemedic = „Anca”20. Nume pacienţilor care au făcut programare şi în luna ianuarie şi în luna

februarie 2006;

SELECT nume, prenumeFROM PACIENT P, PROGRAMARE PRGWHERE P.codpacient = PRG.codpacient and dataprogramare >=01/01/2006 and dataprogramare <= 31/01/2006INTERSECTSELECT nume, prenumeFROM PACIENT P, PROGRAMARE PRGWHERE P.codpacient = PRG.codpacient and dataprogramare >=01/02/2006 and dataprogramare <= 28/02/200621. Care este tariful consultaţiei pacientului Popa Georgeta;Ø varianta generală (SQL-92)SELECT tarifFROM PACIENT P, CONSULTATIE C, TARIFE TWHERE P.codpacient = C.codpcient and C.nrconsultatie =T.nrconsultatie and (nume = „Popa” and prenume = „Georgeta”)

115

Ø varianta VFPSELECT tarifFROM PACIENT P INNER JOIN CONSULTATIE C ON P.codpacient=C.codpcient INNER JOIN TARIFE T ON C.nrconsultatie =T.nrconsultatieWHERE nume = „Popa” and prenume = „Georgeta”22. Numele pacienţilor care au făcut programare în data de 10.02.2006 în

intervalul 14-16;

Ø varianta generală (SQL-92)SELECT nume, prenumeFROM PACIENT P, PROGRAMARE PRGWHERE P.codpacient = PRG.codpacient and dataprogramare =10/02/2006 and (oraprogramare >= 14 and oraprogramare <=16)Ø varianta VFPSELECT nume, prenumeFROM PACIENT P INNER JOIN PROGRAMARE PRG ONP.codpacient =PRG.codpacientWHERE and dataprogramare = {^2006/02/10} and (oraprogramare>=14 and oraprogramare <=16)23. Datele la care au efectuat consultaţii Grecu Anca şi Minea Ion în luna

februarie 2006;

Ø varianta generală (SQL-92)SELECT dataconsultatieFROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C,PACIENT PWHERE M.codmedic=MC.codmedic andMC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacientand (numemedic = „Grecu” and prenumemedic = „Anca”) and(dataconsultatie >= 01/02/2006 and dataconsultatie <=28/02/2006)INTERSECTSELECT dataconsultatieFROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C,PACIENT P WHERE M.codmedic=MC.codmedic andMC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacientand (numemedic = „Minea” and prenumemedic = „Ioan”) and(dataconsultatie >= 01/02/2006 and dataconsultatie <=28/02/2006)Ø varianta VFPSELECT dataconsultatieFROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ONM.codmedic =MC.codmedic INNER JOIN CONSULTATIE C ON MC.nrconsultatie =C.nrconsultatie INNER JOIN PACIENT P ON C.codpacient =P.codpacientWHERE (numemedic = „Grecu” and prenumemedic = „Anca”) and(numemedic = „Minea” and prenumemedic = „Ioan”) and(dataconsultatie >= {^2006/02/01} and dataconsultatie <={^2006/02/28})

116

24. Numele şi prenumele medicilor care au consultat pacienţi din Târgovişteşi Moreni dar nu din Titu;

Ø varianta generală (SQL-92)SELECT numemedic, prenumemedicFROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C,PACIENT PWHERE M.codmedic=MC.codmedic andMC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacientlocalitate = „Targoviste”INTERSECTSELECT numemedic, prenumemedicFROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C,PACIENT PWHERE M.codmedic=MC.codmedic andMC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacientlocalitate = „Moreni”MINUSSELECT numemedic, prenumemedicFROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C,PACIENT PWHERE M.codmedic=MC.codmedic andMC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacientlocalitate = „Titu”

Ø varianta VFPSELECT numemedic, prenumemedicFROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ONM.codmedic =MC.codmedic INNER JOIN CONSULTATIE C ON MC.nrconsultatie =C.nrconsultatie INNER JOIN PACIENT P ON C.codpacient =P.codpacientWHERE (localitate = „Targoviste” or localitate = „Moreni”) andlocalitate <> „Titu”25. Data la care au fost consultaţi pacienţii care au făcut programare în data

de 10.02.2006;

Ø varianta generală (SQL-92)SELECT nume, prenumeFROM PACIENT P, PROGRAMARE PRGWHERE P.codpacient=PRG.codpacientGROUP BY dataprogramare

Ø varianta VFPSELECT nume, prenumeFROM PACIENT P INNER JOIN PROGRAMARE ONP.codpacient=PRG.codpacientGROUP BY dataprogramare

117

26. Nume pacienţilor care au avut programare în data de 10.20.2006 înintervalul 12-14 şi au fost consultaţi de către Grecu Anca.

Ø varianta generală (SQL-92)SELECT nume, prenumeFROM PACIENT P, PROGRAMARE PRGWHERE P.codpacient=PRG.codpacientGROUP BY dataprogramare

Ø varianta VFPSELECT nume, prenumeFROM PACIENT P INNER JOIN PROGRAMARE ONP.codpacient=PRG.codpacientGROUP BY dataprogramare27. Numele pacienţilor care sunt din aceeaşi localitate cu Popa Georgeta;

Ø varianta generală (SQL-92)SELECT nume, prenumeFROM PACIENT P, PROGRAMARE PRG, CONSULTATIE CWHERE P.codpacient=PRG.codpacient andPRG.nrconsultatie=C.nrconsultatieGROUP BY dataconsultatie

Ø varianta VFPSELECT nume, prenumeFROM PACIENT P INNER JOIN PROGRAMARE ONP.codpacient=PRG.codpacient INNER JOIN CONSULTATIE ONPRG.nrconsultatie=C.nrconsultatieGROUP BY dataconsultatie28. Numele medicilor care au prenumele Anca;

Ø varianta generală (SQL-92)SELECT COUNT(*) AS nrconsultatiiFROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE CWHERE M.codmedic=MC.codmedic andMC.nrconsultatie=C.nrconsultatie and(dataconsultatie>=01/02/2006 and dataconsultatie<=28/02/2006)and (numemedic=”Grecu” and prenumemedic=”Anca”)

Ø varianta VFPSELECT COUNT(*) AS nrconsultatiiFROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ONM.codmedic =MC.codmedic INNER JOIN CONSULTATIE C ON MC.nrconsultatie =C.nrconsultatie WHERE (dataconsultatie>={^2006/02/01} anddataconsultatie<={^2006/02/28}) and (numemedic = „Grecu” andprenumemedic = „Anca”)

118

29. Numele şi prenumele în ordine alfabetică al pacienţilor pe localităţi;

Ø varianta generală (SQL-92)SELECT COUNT(*) AS nrconsultatii, COUNT(*)*10 as onorariuFROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE CWHERE M.codmedic=MC.codmedic andMC.nrconsultatie=C.nrconsultatie and(dataconsultatie>=01/02/2006 and dataconsultatie<=28/02/2006)and (numemedic=”Grecu” and prenumemedic=”Anca”)

Ø varianta VFPSELECT COUNT(*) AS nrconsultatii, COUNT(*)*10 as onorariuFROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ONM.codmedic =MC.codmedic INNER JOIN CONSULTATIE C ON MC.nrconsultatie =C.nrconsultatie WHERE (dataconsultatie>={^2006/02/01} anddataconsultatie<={^2006/02/28}) and (numemedic = „Grecu” andprenumemedic = „Anca”)

BIBLIOGRAFIE SELECTIVĂ

I. Tratate şi monografii.

1. Michael Hernandez – Proiectarea bazelor de date, Editura Teora,

Bucureşti, 2003

2. Mariana Miloşescu – Baze de date în Visual FoxPro, Editura Teora,

2003

3. Marin Fotache, Proiectarea bazelor de date, Editura Polirom, Iaşi, 2005

4. Grupul BDASEIG, Baze de date. Fundamente teoretice şi practice,

Editura Infomega, Bucureşti, 2002

5. Florin Radu, Baze de date, Editura Bibliotheca, Târgovişte, 2007

119

ANEXA 1STRUCTURA BAZEI DE DATE FOLOSITE PENTRU EXEMPLIFICĂRI

STUDENTnr_matricol nume facultate sectia data_nasterii cod_localitate

BURSAnr_matricol data_incasarii tip_bursa suma_incasata

STUDCAMINnr_matricol nume_camin camera strada

LOCALITATEcod_localitate nume_localitate cod_judet judet regiune

STUDCARTEnr_matricol cota_carte data_imprumut

CARTEcota_carte titlu editura domeniu an_aparitie nr_exemplare pret_unitar

AUTORCARTEcod_autor cota_carte

AUTORcod_autor nume_autor nationalitate an_nastere