Sunteți pe pagina 1din 119

qwertyuiopasdfghjklzxcvbnmqwertyu

iopasdfghjklzxcvbnmqwertyuiopasdfg
hjklzxcvbnmqwertyuiopasdfghjklzxcv
bnmqwertyuiopasdfghjklzxcvbnmqwe
rtyuiopasdfghjklzxcvbnmqwertyuiopa
sdfghjklzxcvbnmqwertyuiopasdfghjkl
zxcvbnmqwertyuiopasdfghjklzxcvbnm
qwertyuiopasdfghjklzxcvbnmrtyuiopa
sdfghjklzxcvbnmqwertyuiopasdfghjkl
zxcvbnmqwertyuiopasdfghjklzxcvbnm
qwertyuiopasdfghjklzxcvbnmqwertyu
iopasdfghjklzxcvbnmqwertyuiopasdfg
hjklzxcvbnmqwertyuiopasdfghjklzxcv
bnmqwertyuiopasdfghjklzxcvbnmqwe
rtyuiopasdfghjklzxcvbnmqwertyuiopa
sdfghjklzxcvbnmqwertyuiopasdfghjkl
zxcvbnmqwertyuiopasdfghjklzxcvbnm
qwertyuiopasdfghjklzxcvbnmrtyuiopa
sdfghjklzxcvbnmqwertyuiopasdfghjkl
Departamentul de nvmnt la
Distan i Formare Continu
Facultatea de tiine Economice
Coordonator de disciplin:
Lect. univ. drd. Florin RADU
2
Suport de curs nvmnt la distan
Marketing , Anul I, Semestrul II
Prezentul curs este protejat potrivit legii dreptului de autor i orice folosire alta
dect n scopuri personale este interzis de lege sub sanciune penal
ISBN 978-9731955-04-9
2010-2011
Suport de curs nvmnt la distan
Management, Anul I, Semestrul II
Suport de curs nvmnt la distan
Management, Anul I, Semestrul II
Suport de curs nvmnt la distan
UVT
BAZE DE DATE
3
SEMNIFICAIA PICTOGRAMELOR
F= INFORMAII DE REFERIN/CUVINTE CHEIE
= TEST DE AUTOEVALUARE
= BIBLIOGRAFIE
= TIMPUL NECESAR PENTRU STUDIUL UNEI UNITI
DE NVARE
= INFORMAII SUPLIMENTARE PUTEI GSI PE
PLARFORMA ID
4
CUPRINS - Studiu individual (S.I.)
MODUL 1. INTRODUCERE IN BAZELE DE DATE / pag. 6
Obiective / pag. 6
UI.1. Concepte fundamentale privind bazele de date / pag. 7
1.1. Conceptul de baz de date / pag. 7
1.2. Utilizatorii bazei de date / pag. 9
UI.2. Modele de reprezentare a datelor / pag. 11
2.1. Modelul ierarhic / pag. 11
2.2. Modelul reea / pag. 13
2.3. Modelul relaional / pag. 14
2.4. Modelul obiectual / pag. 18
UI.3. Sisteme de gestiune a bazelor de date / pag. 21
3.1. Funciile unui SGBD / pag. 21
3.2. Arhitectura funcional a unui SGBD / pag. 25
3.3. Arhitectura operaional a unei aplicaii baze de date / pag. 27
Bibliografie / pag. 30
MODUL 2. ALGEBRA RELAIONAL / pag. 36
Obiective / pag. 36
UI. 4. Caracterizarea general a limbajelor de programare / pag. 37
UI.5. Operatorii asambliti: Reuniunea, Intersecia, Diferena, Produsul
cartezian / pag. 39
5.1. Reuniunea / pag. 39
5.2. Intersecia / pag. 40
5.3. Diferena / pag. 40
5.4. Produsul cartezian / pag. 41
UI. 6. Operatorii relaionali: Selecia, Proiecia, Jonciunea, Diviziunea
/ pag. 43
6.1. Selecia / pag. 43
6.2. Proiecia / pag. 45
6.3. nlnuirea consultrilor / pag. 46
6.4. Jonciunea / pag. 48
6.5. Diviziunea / pag. 55
Bibliografie / pag. 67
MODUL 3. LIMBAJUL DE INTEROGARE RELAIONAL SQL / pag. 68
Obiective / pag. 69
UI.7. Prezentare general; Elemente de baz ale interogrilor SQL / pag. 70
7.1. Prezentare general / pag.70
7.2. Elemente de baz ale interogrilor SQL / pag. 71
UI.8. Coloane expresii; Opiunea ORDER BY / pag. 79
5
8.1. Coloane expresii / pag. 79
8.2. Opiunea ORDER BY / pag. 80
UI.9. Operatorii LIKE, BETWEEN, IN / pag. 82
9.1. Operatorul BETWEEN / pag. 82
9.2. Operatorul LIKE / pag. 83
9.3. Operatorul IN / pag. 84
UI.10. Theta i echijonciunea / pag. 86
UI.11. Sinonime locale i jonciunea unei tabele cu ea nsi / pag. 89
UI.12. Subconsultri / pag. 91
UI.13. Funcii agregat: COUNT, SUM, AVG, MIN i MAX / pag. 95
13.1. Funcia COUNT / pag. 95
13.2. Funcia SUM / pag. 96
13.3. Funcia AVG / pag. 98
13.4. Funciile MAX i MIN / pag. 99
UI.14. Gruparea tuplurilor: clauza GROUP BY i clauza HAVING / pag. 101
14.1. Clauza GROUP BY / pag. 101
14.2. Clauza HAVING / pag. 103
Bibliografie / pag. 118
6
MODUL I
INTRODUCERE N BAZELE DE DATE
1. Cuprins
2. Obiectiv general
3. Obiective operaionale
4. Dezvoltarea temei
5. Bibliografie selectiv
Cuprins
UI 1. Concepte fundamentale privind bazele de date: date
abstracte, modele de baze de date, independena datelor, limbaje de definire
i manipulare a datelor n bazele de date
= 1 ore
UI 2. Modele de reprezentare a datelor: modelul ierarhic,
modelul reea, modelul relaional i modelul obiectual
= 2 ore
UI 3. Sisteme de gestiune a bazelor de date
= 1 ore
Obiectiv general: Dobndirea cunotinelor privind locul, rolul
i importana bazelor de date; dobndirea de cunotine privind modele de
reprezentare a datelor
Obiective operaionale: nsuirea cunotinelor privind
evoluia metodelor de stoacre a informaiilor; cunoaterea categoriilor de
personal implicat n crearea, dezvoltarea i exploatarea bazelor de date.
nsuirea de cunotine specifice fiecrui domeniu: relaie, legturi,
domeniu, tuplu, atibut, cmp, cheie primar, obiect
7
UNITATEA DE NVARE 1
CONCEPTE FUNDAMENTALE PRIVIND BAZELE DE DATE
1.1. Conceptul de baz de date
n cadrul oricrei ntreprinderi, datele constituie o resurs organizaional
crucial i n consecin ele trebuiesc gestionate similar altor active importante.
Fr date asupra funcionrii interne i asupra mediului extern ntreprinderile nu ar
putea s se menin n competiie sau s reueasc n afaceri. Volumul acestor sate
este n continu cretere. Organizarea i memorarea acestor date pe suporturi
tehnice adresabile (HDD, FDD, CD) este mult facilitat de faptul, c n
majoritatea cazurilor, se opereaz cu structuri de date.
Determinarea structurilor de date i a legturilor ntre realizrile acestora
nu este o activitate deloc uoar. Ea presupune utilizarea unor modele de date i
respectiv a unor formalisme de modelare a datelor i are ca obiectiv definirea
structurilor de date de gestionat n memoria secundar.
Organizarea datelor pe memoria extern a parcurs n timp mai multe etape:
fiiere, fiiere cu legturi i a culminat cu bazele de date actuale. Un fiier este un
ansamblu de nregistrri fizice, omogene din punct de vedre al coninutului i al
prelucrrii. Fiierele conin n cea mai mare parte elemente comune iar asocierile
dintre date nu sunt prea bine exploatate dat fiind faptul c fiierele sunt utilizate
izolat i independent unele de altele. Soluia fiierelor a fost specific anilor 60-
70, dar mai sunt ntlnite i n prezent n cadrul unor aplicaii economice care
folosesc limbaje clasice i ndeosebi limbajul COBOL.
Dominat n prezent este o alt soluie, care const n organizarea datelor
n baze de date. O baz de date este o colecie organizat de date folosit n
scopul de a modela un anumit tip de organizaie sau proces organizaional.
n gestiunea bazelor de date exist dou tipuri de baze de date:
operaionale i analitice.
Bazele de date operaionale constituie suportul a numeroase companii,
instituii i organizaii din ntreaga lume. Aceast categorie de baze de date este
utilizat n cazul prelucrrilor on-line a tranzaciilor (OLTP On Line Transaction
Processing), adic n acele situaii n care este necesar colectarea, modificarea i
ntreinerea zilnic a bazelor de date. Datele stocate ntr-o baz de date
operaional sunt date de tip dinamic, ceea ce nseamn c se modific n
permanen i reflect ntotdeauna informaii actualizate la zi.
F
definiia bazei de
date
8
Contrar acestora, bazele de date analitice sunt folosite n special n
prelucrrile analitice on-line (OLAP On Line Analitical Processing), cnd este
necesar stocarea i urmrirea datelor istorice i dependente de timp. O baz de
date analitice este de un real folos atunci cnd este necesar urmrirea tendinelor,
vizualizarea datelor statistice aferente unei perioade mai lungi de timp sau
efectuarea de previziuni tactice sau strategice de afaceri. Acest tip de baz de date
stocheaz date statice, ceea ce nseamn c datele respective nu se modific
niciodat (sau foarte rar). Informaiile culese dintr-o baz de date analitic reflect
o fotografie a datelor la un anumit moment de timp.
Bazele de date analitice utilizeaz frecvent bazele de date operaionale ca
surs principal de date, deci poate exista o oarecare asociere ntre cele dou
tipuri; cu toate acestea, bazele de date operaionale i analitice satisfac tipuri de
necesiti foarte concrete privind prelucrarea datelor.
1. 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 operaional? (vezi pag. 31-35)
5. Ce reprezint OLTP? (vezi pag. 31-35)
9
6. Ce reprezint OLAP? (vezi pag. 31-35)
7. Exist legtur ntre bazele de date operaionale i cele analitice?
(vezi pag. 31-35)
1.2. Utilizatorii bazei de date
O baz de date poate avea unul sau mai muli utilizatori. n funcie de rolul
acestora distingem trei clase de utilizatori ai bazelor de date:
Programatorii de aplicaii, sunt cei care scriu programele ce utilizeaz
bazele de date. Indiferent de limbajul de programare utilizat (COBOL, C,
PASCAL), aceste programe asigur accesul la datele stocate n baza de date,
adugarea de noi date, tergerea sau modificarea datelor existente. Aceste funcii
se execut printr-o interogare adresat SGBD-ului.
Utilizatorii finali, cuprind dou categorii de utilizatori:
Utilizatorul expert, informatician, cunoscnd limbajele de
programare i limbajele bazelor de date;
Utilizatorul neinformatician, care nu este specialist n baze de
date.
Utilizatorii finali interacioneaz cu baza de date de la o staie de lucru sau
de la un terminal, utiliznd fie una din aplicaiile menionate la punctul precedent,
fie o interfa care face parte integrant din SGBD.
Majoritatea SGBD-urilor furnizeaz cel puin un procesor de limbaj de
interogare interactiv, care permite utilizatorului s adreseze SGBD-ului comenzi
de nivel nalt (ca SELECT, INSERT etc). Limbajul SQL este un limbaj tipic de
interogare. Unele sisteme ofer utilizatorilor si alte tipuri de interfee n care nu
pot adresa o comand explicit (ca SELECT), dar pot s aleag o comand dintr-
un meniu sau s completeze rubrici n structuri predefinite. Aceste meniuri sau
interfee grafice sunt mai uor de folosit de utilizatorii care nu au cunotine
formale n tehnologia informaiei.
F
F
10
Administratorul BD, care asigur administrarea unitar a datelor din
baza de date.
Funciile asigurate de ctre administratorul bazei de date sunt:
Definirea schemei conceptuale (n care sunt incluse i regulile care s
asigure integritatea datelor).
Definirea schemei interne.
Definirea schemei externe (sau sprijinirea utilizatorului final n
definirea acestora).
Definirea procedurilor de salvare i restaurare.
Definirea utilizatorilor bazei de date i a drepturilor de acces (la baza de
date sau la anumite obiecte ale bazei de date).
Supervizarea performanelor i asigurarea evoluiei bazei de date, etc.
8. Cine sunt utilizatorii bazei de date? (vezi pag. 31-35)
9. Care sunt funciile asigurate de administratorul bazei de date?
(vezi pag. 31-35)
F
11
UNITATEA DE NVARE 2
MODELE 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 printe poate avea mai multe noduri
fiu, n timp de un nod fiu nu poate avea dect un singur nod printe. Schema
ierarhiei are un singur nod rdcin, iar pentru reprezentarea relaiilor de tipul m:n
ntr-o structur de baz de date ierarhic se admite duplicate pentru instanele
nregistrrilor fiu.
Pentru a realiza reprezentarea acestui model se folosesc diagramele de
structur care sunt formate din dou elemente principale: dreptunghiuri pentru
tipurile de nregistrri i linii pentru legturi. Aceste diagrame se aseamn cu
o structur arborescent, locul liniilor fiind luat de tipurile de nregistrare.
Pentru a pune n eviden legturile care pot exista ntre tipurile de
nregistrri, se folosesc urmtoarele reprezentri grafice:
relaia 1:1 se consider tipurile de nregistrri CONTRIBUABIL i
ROL. ntre aceste dou tipuri de nregistrri exist urmtoarea legtur: orice
contribuabil aflat n evidena administraiei financiare are deschis un singur rol,
iar fiecare rol deschis la administraiei nu aparine dect unui singur contribuabil.
Reprezentarea grafic a acestei legturi este urmtoarea:
relaia 1:n se consider tipul de nregistrri COMAND i CLIENT.
ntre aceste tipuri de nregistrri exist urmtoarea legtur: un client emite mai
multe comenzi, n timp ce o comand este emis de un singur client.
Reprezentarea grafic a acestei legturi este urmtoarea:
relaia m:n - se consider tipul de nregistrri COMAND i
PRODUSE. ntre aceste tipuri de nregistrri exist urmtoarea legtur: o
comand poate conine mai multe produse, iar un produs poate fi inclus n mai
multe comenzi. Reprezentarea grafic a acestei legturi este urmtoarea:
CONTRIBUABIL ROL
CLIENT COMAND
COMAND PRODUSE
F
F
F
12
O baz de date ierarhic este constituit dintr-un grup de nregistrri
interconectate prin intermediul unor legturi. O nregistrare reprezint o colecie
de cmpuri, fiecare cmp coninnd o singur valoare, iar prin legtur se nelege
o asociere ntre cele dou cmpuri. Fiecare tip de nregistrare din diagrama de
structur are asociat n baza de date un anumit numr de realizri, ceea ce
nseamn c pentru fiecare tip de nregistrare printe pot exista nici una, una sau
mai multe nregistrri ale tipului de nregistrare fiu. De exemplu, un anumit client
nu a emis nici o comand.
Exemplu: Se consider o baz de date cu informaii despre studenii i
specializrile unei faculti. O specializare are mai muli studeni, n schimb, un
student nu poate urma dect o singur specializare. Reprezentarea modelul
ierarhic al exemplului este prezentat mai jos:
n acest exemplu, tipului de nregistrare printe SPECIALIZARE i
corespund patru nregistrri: (CIG, Contabilitate), (FB, Finane), (MG,
Management) i (MK, Marketing). Prima nregistrare, (CIG, Contabilitate) este
printe pentru (120, Popa Dan, Vaslui), care este o realizare a tipului de entitate
STUDENI, a doua nregistrare nu are nregistrri fiu, a treia nregistrare are doi
fii (322, Radu Ioana, Arad) i (187, Vlad Andrei, Iai), n timp ce ultima
nregistrare are un singur fiu (562, Sima Ileana, Titu).
10. Enumerai modelele de descriere a datelor. (vezi pag. 31-35)
F
13
11. Care sunt tipurile de relaii folosite n modelul relaional?
(vezi pag. 31-35)
12. Ce este o baz de dat ierarhic? (vezi pag. 31-35)
2.2. Modelul reea
Este un model care are la baz o structur de tip reea. Acest model este
oarecum similar cu modelul ierarhic, n sensul c un nod printe poate avea mai
muli fii, deosebirea constnd n faptul c un nod fiu poate avea mai muli prini.
Ca i modelul ierarhic i modelul reea folosete diagramele de structur, care se
aseamn cu un graf, nodurile fiind nlocuite de tipurile de nregistrare.
Reprezentarea grafic a legturilor care pot exista ntre tipurile de nregistrri
(legturi 1:1, 1:n, n:m) este similar modelului ierarhic.
Exemplu: Se consider o baz de date cu informaii despre studeni,
specializarea urmat de acetia i bursele pe care acetia le primesc. O specializare
are mai muli studeni, n schimb, un student nu poate urma dect o singur
specializare; bursa poate fi obinut de mai muli studeni, n schimb, un student
poate obine o singur burs.
Reprezentarea modelul reea al exemplului este realizat n cele ce
urmeaz:
F
14
n acest exemplu, tipului de nregistrare printe SPECIALIZARE i
corespund patru nregistrri: (CIG, Contabilitate), (FA, Finane), (MG,
Management) i (MK, Marketing), tipului de nregistrare BURSE trei realizri
(Studiu, 1.200.000), (Social, 1.000.000) i (Merit, 1.900.000), iar tipului de
nregistrare STUDENI patru realizri (120, Popa Dan, Vaslui), (322, Radu
Ioana, Arad) , (187, Vlad Andrei, ) i (562, Sima Ileana, Titu). nregistrrile (CIG,
Contabilitate) SPECIALIZARE i (Studiu, 1.200.000) BURSE sunt prini
pentru (120, Popa Dan, Studiu) STUDENI. nregistrarea (FA, Finane) nu are
nregistrri fiu. nregistrarea (Social, 1.000.000) BURSE i (MG,
Management) SPECIALIZARE sunt prini pentru (322, Radu Ioana, Social).
Realizarea (187, Vlad Andrei, ) are drept printe (MG, Management), iar
nregistrarea (562, Sima Ileana, Merit) este copilul realizrilor (MK, Marketing) i
(Merit, 1.900.000).
13. Reprezentarea grafic a legturilor care pot exista ntre tipurile de
nregistrri (legturi 1:1, 1:n, n:m) n modelul reea este similar
modelului ierarhic? (vezi pag. 31-35)
2.3. Modelul relaional
Modelul relaional a fost introdus de E. F. Codd i reprezint astzi cel mai
utilizat model pentru gestionarea bazelor de date.
Modelul are la baz conceptul de relaie definit n teoria matematic a
mulimilor ca fiind o submulime a produsului cartezian al mai multor mulimi: R
a M
1
x M
2
x x M
n
.
Familia de mulimi pe care este definit relaia se numete domeniu, atunci
cnd M
1
= M
2
= = M
n
se spune c relaia este omogen. Numrul n se numete
gradul relaiei, un element al relaiei t = (m
1
, m
2
, , m
n
) se numete tuplu, iar
numrul de tupluri indic cardinalitatea relaiei.
Schema unei relaii este format din numele relaiei, atributele acesteia i
restriciile de integritate.
Domeniul reprezint mulimea tuturor valorilor posibile care definesc o
anumit proprietate a unui obiect. Atributul reprezint mulimea valorilor
F
15
existente la un moment dat n coloana pe care acesta o desemneaz n cadrul unei
relaii. ntr-o relaiei pot exista mai multe atribute care s ia valori n acelai
domeniu.
Relaia STUDENI se scrie n felul urmtor
Relaiile se prezint sub forma unor tabele, supuse urmtoarelor restricii:
- fiecare coloan din tabel conine acelai fel de valori;
- n tabel ordinea liniilor nu este stabilit i n acelai timp nu se admit
valori duplicate;
- orice valoare este un numr sau un ir de caractere (nu are cum s fie un
ansamblu);
- orice coloan este identificat printr-un nume care reprezint atributul
relaiei.
O baz de date, privit din punct de vedere al modelului relaional, este
vzut ca o colecie de tabele (relaii), n care fiecare coloan reprezint un atribut
distinct, iar fiecare rnd, un tuplu distinct.
Tuplurile unei relaii se pot identifica n mod unic prin intermediul
valorilor unuia sau mai multor atribute, care joac rolul de cheie primar a relaiei
respective.
Orice relaie posed cel puin o cheie. Cnd aceast cheie este alctuit
dintr-un singur atribut, poart numele de cheie simpl, iar atunci cnd este format
din mai multe atribute ea se numete cheie compus.
Cheia primar a unei tabele este un atribut sau un grup de atribute care
permite identificarea fr ambiguitate a fiecrui tuplu din tabel. La alegerea unei
astfel de chei, administratorul bazei de date trebuie s aib n vedere criterii prin
care s asigure identificarea efectiv a tuplurilor (lungime, natur).
F
16
Cheia primar trebuie s verifice urmtoarele trei restricii:
- unicitatea: o cheie identific un singur tuplu al relaiei;
- compoziia minimal: atunci cnd cheia primar este compus, nici un
atribut cheie nu poate fi eliminat fr distrugerea unicitii tuplului n cadrul
relaiei;
- valorile non-nule: valorile atributului sau ale ansamblului de atribute care
desemneaz cheia primar sunt ntotdeauna specificate, deci nenule; nici un
atribut din compoziia cheii primare nu poate avea valori nule.
Dac ntr-o relaie exist mai multe combinaii de atribute care confer
unicitatea tuplului, acestea sunt denumite chei candidate. Atunci cnd o cheie
candidat nu este cheie primar este considerat cheie alternativ (secundar).
Legturile ntre tuplurile din relaii diferite se realizeaz prin atribute sau
combinaii de atribute numite chei strine (externe).
Reflectnd un aspect din realitate, relaiile se spun unor restricii, ce pot fi
de dou feluri:
restricii de integritate depind de semantica valorilor domeniilor i
impun relaiilor s se supun regulilor:
- integritatea entitii valorile cheii primare trebuie s fie diferite de zero,
pentru c altfel, cheia respectiv nu va mai fi identificator;
- integritatea referirii valorile unei chei externe trebuie s refere tuplurile
unei alte relaii.
alte restricii se aplic asupra domeniilor i reflect anumite corelaii
de ordin valoric (egalitate, inegalitate).
Avantajele modelului relaional n comparaie cu celelalte tipuri de modele
sunt:
- independena sporit a programelor de aplicaie fa de modul de
reprezentare intern a datelor i de metodele de acces la date;
- definirea unei structuri conceptuale optime, minimaliznd redundana
datelor i erorile la actualizare;
- utilizarea unor limbaje procedurale bazate pe algebra relaional i a unor
limbaje neprocedurale care contribuie la mbuntirea comunicrii dintre sistem
i neinformaticieni.
14. Din ce este format schema unei relaii? (vezi pag. 31-35)
17
15. Ce este domeniul? (vezi pag. 31-35)
16. Ce este atributul? (vezi pag. 31-35)
17. Care sunt restriciile la care sunt supuse relaiile? (vezi pag. 31-35)
18. Ce este o cheie primar? (vezi pag. 31-35)
19. Care sunt restriciile pentru cheie primar? (vezi pag. 31-35)
20. Care sunt avantajele modelului relaional? (vezi pag. 31-35)
18
2.4. Modelul obiectual
Dei n prezent cel mai utiliza model este modelul relaional, el nu
permite: descrierea unor structuri de date complexe (documente electronice, date
n format multimedia); partajarea i reutilizarea structurilor de date; declararea
prelucrrilor aferente structurilor de date (datele sunt descrise separat de
prelucrri). Rspunsul la astfel de cerine l constituie modelul orientat obiect.
Modelarea orientat obiect se bazeaz pe urmtoarele concepte: obiect,
abstractizare, ncapsulare, motenire, polimorfism.
Obiectul este definit ca o entitate cu o identitate proprie, caracterizat
printr-o stare i un comportament. Orice entitate a lumii reale este un obiect, i
invers, orice obiect reprezint o entitate a realitii. Obiectele pot comunica ntre
ele prin intermediul mesajelor.
Identitatea unui obiect este proprietatea acestuia care l distinge de alte
obiecte, ea fiind o adres logic invariabil. Dac n modelul relaional datele sunt
identificate prin valorile cheilor primare definite de utilizato, n modelul orientat
obiect, identificarea obiectelor este fcut automat de sistem la crearea acestora i
este transparent utilizatorului. Dou obiecte O
1
i O
2
sunt identice (O
1
==O
2
) dac
au acelai identificator; n schimb dou obiecte sun egale (O
1
=O
2
) dac au
aceleai valori (O
1
==O
2
, implic O
1
=O
2
, reciproca nefiind valabil).
Starea unui obiect este definit de valorile atributelor sale (realizrile). Un
atribut se definete printr-un nume i poate lua valori elementare (numeric,
alfanumeric) sau complexe (referine spre alte obiecte).
Exemplu: Clientul CL1: Cod = 678
Denumire = S.C. N&L
Localitate = Trgovite
Comanda CDA1: Numr = 17865
Data = 10/12/2003
CotaTVA = 19%
Client = CL1.
Comportamentul unui obiect este definit ca un set de operaii aplicate
obiectului respectiv. Operaiile unui obiect reprezint modalitile de rspuns la
mesajele primite din exterior de obiectul respectiv; ele sunt de regul proceduri
sau funcii ce acioneaz asupra obiectului respectiv.
19
Abstractizarea este procesul prin care obiectele care au aceleai atribute i
comportament similar sunt grupate n tipuri abstracte de obiecte numite i clase.
Obiectele devin astfel instanieri (realizri) ale claselor; n timp ce obiectele
descriu entiti ale realitii, clasele sunt reprezentri abstracte ale acestor entiti.
Exemplu: Client, Comand, Student.
ncapsularea const n capacitatea obiectelor de a conine la un loc att
date ct i operaii, dar numai o parte a acestora este vizibil din exterior. Se poate
spune c n felul aceste obiectele apar ca nite cutii negre, care ascund detaliile
de implementare, ele oferind o interfa simpl de rezolvare a unei probleme.
Motenirea este procesul prin care toate atributele i metodele vizibile ale
unei clase (numit i clas se baz) sunt preluate n mod automat de o alt clas
nrudit cu aceast (numit i subclas sau clas derivat). Clasele derivate pe
lng acestea pot conine i atribute sau metode specifice. Motenirea se constituie
ca o cale de ncurajare a partajrii i reutilizrii structurilor de date; prin
intermediul ei se pot exprima relaii deosebit de importante ntre clase, cum ar fi:
clasificarea, generalizarea sau specializarea.
Exemplu: Se consider clasa PERSOANA definit prin atributele publice (vizibile
din exterior):
CNP, NumePrenume, DataNaterii, Sex
i metoda public
ReturneazVrsta(An).
Din clasa PERSOANA pot fi derivate clasele ANGAJAT i STUDENT,
de acelai fel cu ea, fiecare student angajat fiind descris prin CNP, nume i
prenume, data naterii, sex i vrst, calculat n funcie de anul naterii.
STUDENT poate conine ca atribute specifice NumrMatricol, AnStudiu iar ca
metod proprie MediaGeneral, n timp ce clasa ANGAJAT poate fi descris prin
atributele proprii Marca, DataAngajrii i metoda ReturneazVechime().
PERSOAN
ANGAJAT STUDENT
20
Polimorfismul reprezint posibilitate unui obiect, instan a unei clase, de a
rspunde n mod diferit la primirea aceluiai mesaj. Poate fi asigurat n dou
variante:
- redefinirea metodelor motenite n clasele derivate;
- crearea unor metode cu acelai nume sar cu parametri diferii
(suprancrcarea unei metode).
Polimorfismul mrete flexibilitatea modelului orientat obiect de a
reprezenta ct mai sintetic realitatea.
21. Care sunt conceptele pe care se bazeaz modelarea orientat
obiect? (vezi pag. 31-35)
21
UNITATEA DE NVARE 3
SISTEMUL DE GESTIUNE AL BAZELOR DE DATE
O baz de date este un ansamblu organizat i structurat de date. Acest
ansamblu trebuie s permit o reprezentare fidel a datelor cu minim de
constrngeri. SGBD-ul este un instrument care permite o astfel de organizare i
manipulare a datelor. Este un ansamblu de programe care permite descrierea,
memorarea, manipularea i restaurarea datelor pentru a asigura securitatea
acestora. Se numete aplicaie baz de date sau sistem de baz de date un
ansamblu de programe construite n jurul unei baze de date i integrnd un SGBD
pentru gestiunea informaiilor.
3.1. Funciile unui SGBD
n primul rnd trebuie menionate funciile eseniale, adic cele pentru care
SGBD-ul este conceput. Ele sunt n numr de patru: descrierea datelor,
introducerea, extragerea/interogarea i actualizarea.
Descrierea datelor este acea parte care permite, nainte de introducerea
datelor, de a defini numele acestor date, structura i coninutul lor. De exemplu
baza de date a unei biblioteci comport un ansamblu de date referitoare la cri.
nainte de a putea nregistra aceste date, trebuie definit cu precizie ansamblul
informaiilor care se dorete a fi administrat cu privire la aceste cri: numrul
(cota), titlul, numrul de exemplare, etc. Trebuie, de asemenea, estimat mrimea
sau cel puin s fie definit mrimea maxim admis: 30 caractere pentru titlu, 5
pentru numr, etc.
Odat definite structurile, funcia de introducere permite tuturor
utilizatorilor inserarea de date n baz. Aceast funcie de introducere trebuie, n
plus, s asigure toate controalele posibile, al acestor date. n cazul bibliotecii,
SGBD-ul trebuie s verifice dac numrul crii este n forma cerut, dac
mrimea titlului nu depete numrul maxim de caractere prevzut, dac numrul
de exemplare este un numr ntreg pozitiv, etc.
Extragerea datelor desemneaz toate operaiile regulate sau punctuale, de
cutare i de ieire pe ecran, pe suport de hrtie sau pe un alt suport, n ntregime
sau doar n parte a informaiilor din baza de date. Se va putea, de exemplu, s se
extrag toate crile care sunt scrise de un anumit autor sau toate crile aprute n
colecia Baze de date.
F
22
n fine, funcia de actualizare trebuie s asigure modificare sistematic a
informaiilor pe msur ce acestea evolueaz. La fiecare cumprare a unei cri,
trebuie modificat numrul de exemplare al titlului corespunztor din baza de date.
Pentru c datele sunt partajate de ctre mai multe aplicaii, dezvoltarea
funciilor descrise anterior, antreneaz i alte necesiti.
Punerea n comun a unui ansamblu de date are ca i consecin necesitatea
de a prevedea controlul accesului la date. Exist dou aspecte legate de protecia
datelor. Primul privete confidenialitatea: informaia nu poate fi cunoscut de
toi. Pentru fiecare tip de informaie trebuie stabilit lista persoanelor sau a
grupurilor autorizate a le consulta. Al doilea aspect se refer la integritate:
informaia nu poate fi modificat de toi. n acest caz, se convine la definirea unui
cerc de persoane, n general foarte mic, abilitate s actualizeze informaia. SGBD-
ul trebuie s permit personalizarea accesului la baza de date. Trebuie deci s se
poat identifica utilizatorii i controla aceast identificare, ceea ce se cheam
autentificarea accesului. Dup caz, protecia se poate face la mai multe nivele:
accesul la ntreaga baz, la o parte din ea sau la un singur element al bazei.
Protecia datelor este unul din aspectele unei funcii destul de importante
care este securitatea bazei de date. La aceast funcie se adaug i funciile de
rezisten n cazul unor pene, pe care trebuie sa le furnizeze SGBD-ul. Un
program nu poate mpiedica n totalitate apariia incidentelor sau a problemelor
majore. Totui, el trebuie s fie n msur s furnizeze mecanisme care s
faciliteze recuperarea datelor n cazul n care apar probleme grave. Bazele de date
sunt utilizate pentru a evita redundana informaiilor stocate. Uneori, pentru a
minimiza consecinele legate de eventualele probleme ce pot aprea, este necesar
efectuarea de salvri ale bazei de date. Aceste salvri nu sunt nimic altceva dect
date redundante, dar, n acest caz duplicarea informaiilor este controlat de
SGBD.
SGBD-ul este dedicat manipulrii datelor. Pentru aceasta trebuie s asigure
un acces optimal la date. Dincolo de organizarea fizic a datelor, SGBD-ul
trebuie s faciliteze cutarea acestora.
n aceeai ordine de idei, SGBD-ul trebuie s faciliteze accesul la date
pentru toate programele, dar i pentru toate categoriile de utilizatori. Pentru
aceasta, el trebuie s furnizeze instrumentele care s permit interfaarea
comunicarea SGBD-ului cu alte programe. Trebuie oferit un acces direct la date
23
sub o form compatibil cu categoriile de utilizatori, de exemplu o interfa
grafic pentru nespecialiti, un limbaj de acces puternic pentru informaticieni.
O alt funcie important este controlul concurenei. ntr-adevr o baz de
date trebuie s permit accesul simultan al mai multor utilizatori, fr nici un fel
de incident. S lum exemplu unui sistem de rezervare a locurilor pentru cursele
aeriene, fondat pe o baz de date. Aceasta trebuie s permit alocarea fiecrui loc
unei singure persoane i numai uneia. O agenie conectat la baza de date
respectiv, ntreab dac a mai rmas un loc liber pentru zborul 747. I se rspunde
c a mai rmas unul singur. O alt agenie pune imediat aceeai ntrebare, nainte
ca prima agenie s fi confirmat interesul su pentru locul rmas. Locul este nc
disponibil. Prima agenie l-a rezervat. A doua, de asemenea, a ntrebat. Se produce
n acest caz o problem zis de acces concurent pe care SGBD-ul trebuie s o
previn.
Realizarea unei baze de date are drept consecin punerea n comun i
partajarea unui ansamblu de informaii. Aceast punere n comun trebuie s
respecte dou principii de independen: respectiv independena fizic i
independena logic.
Independena fizic desemneaz principiul conform cruia un program
care acceseaz datele din baz, trebuie s manipuleze aceste date ntr-un mod
abstract, independent de organizarea lor fizic. Independena logic caracterizeaz
accesul simultan al diferiilor utilizatori sau programe la aceeai baz de date.
Fiecare program trebuie s poat lucra doar asupra prii de date care dorete.
Pentru aceasta la realizarea programului se vor folosi doare datele utile acestuia.
Trebuie s se poat utiliza pentru calificarea acestor date, termeni care sunt proprii
programului, eventual diferii de cuvintele care vor fi utilizate n alte programe
sau de ali utilizatori pentru a desemna aceleai date. Mecanisme precum sub-
schema n cazul bazelor de date reea sau vederile n cazul bazelor de date
relaionale permit ceast independen logic.
22. Care sunt funciile 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 protecia datelor? (vezi pag. 31-35)
26. Care sunt cele dou principii de independen? (vezi pag. 31-35)
25
3.2. Arhitectura funcional a unui SGBD
Un SGBD este format din diferite module fiecare avnd n sarcin una sau
mai multe din funciile descrise anterior.
Figura 1.1. Arhitectura funcional a unui SGBD
Ansamblul acestor module constituie puntea de legtur ntre baza de date
stocat pe unul sau mai multe discuri magnetice i ansamblul utilizatorilor. La cel
mai nalt nivel SGBD ul conine un ansamblu de instrumente administrnd
comunicarea direct cu utilizatorii. n funcie de SGBD, oferta n termeni de
interfee este mai mult sau mai puin bogat. Editorii de SGBD-uri tind s propun
diferite limbaje de acces la baza de date, adaptate gradului de competen sau
nevoilor categoriilor de utilizatori desemnai s lucreze cu datele, interfee
interactive dispun de instrumentele necesare punerii n legtur a programelor de
acces la date scrise n limbaje de programare clasice cu baza de date.
Instrumentele respective permit munca cu datele coninute n baza de date.
SGBD-ul ofer, n plus, o interfa care permite de a aciona asupra structurii
bazelor de date i/sau asupra aspectelor tehnice, cum ar fi optimizarea bazelor,
configurarea lor. Aceast interfa este numit interfaa de administrare. Ea este
rezervat, n general, informaticienilor dau utilizatorilor foarte avizai. Este
instrumentul de munc privilegiat al administratorului bazei de date.
SGBD SGBD
Interfaa utilizator Interfaa de administrare
SGF SGBD
Gestiunea fiierelor Mecanisme specifice
SGBD
Gestiunea acceselor
SGBD
Gestiunea tranzaciilor
SGBD
Gestiunea discurilor
Discuri
F
26
Indiferent care ar fi interfaa de comunicare aleas pentru a accede la baza
de date, trebuie s existe un drept de acces la aceasta din urm. Drepturile sunt
atribuite de administrator i se concretizeaz ntr-o identificare (nume utilizator) i
o autentificare (parol). Modulul de gestiune a acceselor are n sarcin aceste
controale. El asigur n acelai timp i controlul integritii.
Altfel spus, el protejeaz datele verificnd dat toate actualizrile respect
un ansamblu de reguli numite constrngeri de integritate. Se mpiedic
modificrile care violeaz aceste constrngeri i avertizeaz utilizatorul de
problemele ntlnite. Tipurile de constrngeri admise de un SGBD vor fi descrie
mai trziu. n fine modulul de gestiune a acceselor asigur optimizarea acestora.
Astfel, n majoritatea SGBD-urilor, accesul la date este formulat n limbaje
evoluate precum SQL (Structured Query Language).
Modulul de gestiune a tranzaciilor este indispensabil pentru a asigura, n
acelai timp, buna execuie a acceselor simultane i pentru a realiza aciunile care
vor permite, n caz de pan, recuperarea datelor n cea mai bun stare posibil.
Rspunsul editorilor de SGBD-uri la aceste dou nevoi a fost cvasi unanim:
punerea la punct a unui mecanism numit tranzacie care permite definirea
ansamblului de executat totul sau nimic asupra bazei de date. Astfel, se asigur
c utilizatorii pot lucra simultan fr conflicte: cererea disponibilitii unui loc n
avion i rezervarea sa trebuie s fac pare din aceeai tranzacie. Prin acelai
mijloc, n caz de pan, nu se reia dect tranzaciile corect executate, adic
tranzaciile terminate i valide.
Toate modulele descrie pn acum sunt parte component a SGBD.
Totui, SGBD-ul nu este n relaie direct cu baza de date. Dup cum am vzut
baza de date este constituit dintr-un ansamblu de fiiere, mbogite cu structuri
zise de acces. Aceste fiiere sunt, n general, administrate de sistemul de gestiune
al fiierelor (SGF) care face parte din sistemul de operare al calculatorului: Unix,
Windows. Altfel spus, SGBD utilizeaz SGBD-ul xxx, dar poate, n anumite
cazuri, pune la dispoziie mecanisme suplimentare de organizare i acces la datele
stocate n aceste fiiere.
Ultimul strat reprezentat n figur nu este intern SGBD. El reprezint
sistemul de gestiune al intrrilor-ieirilor al sistemului de operare. El permite
convertirea comenzilor scrise n straturile superiore n ordinea citire, scriere,
deplasare i poziionare a capetelor pe discuri. Realizeaz, de asemenea, operaiile
necesare pentru cutarea i actualizarea datelor. De fapt, baze de date este stocat
27
pe disc. Totui, toate informaiile asupra datelor sunt efectuate n memoria
central. Gestiunea discurilor asigur deci toate transferurile ntre memoria
central i spaiul de stocare de pe disc.
27. Descriei grafic arhitectura funcional a unui SGBD
(vezi pag. 31-35)
3.3. Arhitectura operaional a unei aplicaii baze de date
La nceput, SGBD-urile erau concepute pentru sisteme centralizate.
Utilizatorii conectai la aceste sisteme partajau aceleai date implantate pe acelai
disc i ncrcate n acelai spaiu de memorie central.
Apariia micro-informaticii n anii 1980 a dus la realizarea de SGBD la
nivel micro. Totui, utilizatorii i-au exprimat rapid dorina de a putea interaciona
cu baza de date centralizat prin intermediul microcalculatorului. Acestea nu avea
ns puterea i securitatea marilor sisteme.
F
28
La nceputul anilor 1990 apare conceptul de arhitectur client/server. Se
consider c o aplicaie informatic comport n general trei tipuri de tratamente:
gestiunea datelor (cutare, actualizare), logica aplicativ care nseamn calcule,
reflecii i n cele din urm prezentarea rezultatelor. Se vorbete de client/server
de ndat ce aceste tratamente sunt repartizate ntre cel puin dou calculatoare.
Este evident faptul c gestiunea datelor este mai bine asigurat de marile sisteme.
n schimb, prezentarea rezultatelor este mai mulumitoarea via un microcalculator.
Cea mai clasic arhitectur client/server poate fi descris dup cum
urmeaz:
- client este microcalculatorul care emite cererile de acces la baza de date
situat pe un server;
- cererea este executat pe server care remite clientului liniile rezultat;
- acest rezultat este afiat pe postul client, de exemplu prin intermediului
unui tabel.
Figura 1.2. Arhitectura client server
Acest tip de funcionare este eficace n msura n care fiecare dintre cei doi
efectueaz sarcina pentru care este cel mai adaptat: prezentarea rezultatelor este
efectuat de ctre client, gestiunea datelor (coerena, integritatea) este asigurat de
server.
Logica aplicativ poate fi executat fie de client, fie de server. Totui, n
primul caz, inconvenientul este c ansamblul de date uneori voluminos tranziteaz
reeaua. Dac numrul utilizatorilor este foarte mare, reeaua poate fi foarte
ncrcat.
Server
Client 1 Client 2 Client n
Cererea client ctre server
Rspunsul serverului ctre client
29
n cazul n care logic aplicativ este efectuat de server, acesta poate fi
foarte solicitat de un mare numr de utilizatori simultan. n ciuda acestor
inconveniente, arhitecturi de acest tip sunt nc foarte utilizate n ntreprinderi. n
aceste configuraii, conexiunea ntre programe este realizat de programe de
comunicare numite middlewares.
Pentru a rezolva inconvenientul citat mai sus, de acum nainte se
realizeaz arhitecturi pe 3 niveluri. Cele 3 componente care sunt gestiunea datelor,
logica aplicativ i prezentarea rezultatelor sunt repartizate ntre trei calculatoare:
serverul de date, serverul de aplicaie i postul client:
Figura 1.3. Arhitectura pe 3 niveluri
28. Descriei grafic arhitectura client/server. (vezi pag. 31-35)
Server
Client 1 Client 2 Client n
Server de aplicaie
30
29. Descriei grafic arhitectura pe 3 niveluri. (vezi pag. 31-35)
BIBLIOGRAFIE SELECTIV
I. Tratate i monografii.
1. Michael Hernandez Proiectarea bazelor de date, Editura Teora,
Bucureti, 2003
2. Mariana Miloescu Baze de date n Visual FoxPro, Editura Teora,
2003
3. Marin Fotache, Proiectarea bazelor de date, Editura Polirom, Iai, 2005
4. Grupul BDASEIG, Baze de date. Fundamente teoretice i practice,
Editura Infomega, Bucureti, 2002
5. Florin Radu, Baze de date, Editura Bibliotheca, Trgovite, 2007
31
Rezolvarea testelor de autoevaluare
1. Care sunt etapele prin care a trecut organizarea datelor?
a.fiiere
b.fiiere cu legturi
c.bazele de date actuale
2. Ce este o baz de date analitic?
Bazele de date analitice sunt folosite n special n prelucrrile analitice
on-line (OLAP On Line Analitical Processing), cnd este necesar
stocarea i urmrirea datelor istorice i dependente de timp
3. Ce este o baz de date?
O baz de date este o colecie organizat de date folosit n scopul de a
modela un anumit tip de organizaie sau proces organizaional
4. Ce este o baz de date operaional?
Baza de date operaional este utilizat n cazul prelucrrilor on-line a
tranzaciilor (OLTP On Line Transaction Processing), adic n acele
situaii n care este necesar colectarea, modificarea i ntreinerea
zilnic a bazelor de date
5. Ce reprezint OLTP?
OLTP On Line Transaction Processing
6. Ce reprezint OLAP?
OLAP On Line Analitical Processing
7. Exist legtur ntre bazele de date operaionale i cele analitice?
Bazele de date analitice utilizeaz frecvent bazele de date operaionale
ca surs principal de date, deci poate exista o oarecare asociere ntre
cele dou tipuri; cu toate acestea, bazele de date operaionale i
analitice satisfac tipuri de necesiti foarte concrete privind prelucrarea
datelor.
8. Cine sunt utilizatorii bazei de date?
a.Programatorii de aplicaii
b.Utilizatorii finali
c.Administratorul BD
32
9. Care sunt funciile asigurate de administratorul bazei de date?
a. Definirea schemei conceptuale
b.Definirea schemei interne.
c.Definirea schemei externe
d.Definirea procedurilor de salvare i restaurare.
10. Enumerai modelele de descriere a datelor
a.modelul ierarhic
b.modelul reea
c.modelul relaional
d.modelul obiectual;
11. Care sunt tipurile de relaii folosite n modelul relaional?
a.relaia 1:1
b.relaia 1:n
c.relaia m:n
12. Ce este o baz de dat ierarhic?
O baz de date ierarhic este constituit dintr-un grup de nregistrri
interconectate prin intermediul unor legturi
13. Reprezentarea grafic a legturilor care pot exista ntre tipurile de
nregistrri (legturi 1:1, 1:n, n:m) n modelul reea este similar
modelului ierarhic?
DA
14. Din ce este format schema unei relaii?
Schema unei relaii este format din numele relaiei, atributele acesteia
i restriciile de integritate.
15. Ce este domeniul?
Domeniul reprezint mulimea tuturor valorilor posibile care definesc o
anumit proprietate a unui obiect
16. Ce este atributul?
Atributul reprezint mulimea valorilor existente la un moment dat n
coloana pe care acesta o desemneaz n cadrul unei relaii
17. Care sunt restriciile la care sunt supuse relaiile?
a. fiecare coloan din tabel conine acelai fel de valori;
b.n tabel ordinea liniilor nu este stabilit i n acelai timp nu se admit
valori duplicate;
c.orice valoare este un numr sau un ir de caractere;
d.orice coloan este identificat printr-un nume care reprezint
atributul relaiei.
33
18. Ce este o cheie primar?
Cheia primar a unei tabele este un atribut sau un grup de atribute care
permite identificarea fr ambiguitate a fiecrui tuplu din tabel
19. Care sunt restriciile pentru cheie primar?
a.unicitatea
b.compoziia minimal
c.valorile non-nule
20. Care sunt avantajele modelului relaional?
a.independena sporit a programelor de aplicaie fa de modul de
reprezentare intern a datelor i de metodele de acces la date;
b.definirea unei structuri conceptuale optime, minimaliznd redundana
datelor i erorile la actualizare;
c.utilizarea unor limbaje procedurale bazate pe algebra relaional i a
unor limbaje neprocedurale care contribuie la mbuntirea
comunicrii dintre sistem i neinformaticieni.
21. Care sunt conceptele pe care se bazeaz modelarea orientat obiect?
Modelarea orientat obiect se bazeaz pe urmtoarele concepte: obiect,
abstractizare, ncapsulare, motenire, polimorfism.
22. Care sunt funciile unui SGBD?
a.descrierea datelor
b.introducerea datelor
c.extragerea/interogarea datelor
d.actualizarea datelor
23. Care sunt cele dou principii de independen?
Independena fizic i independena logic
34
24. Descriei grafic arhitectura funcional a unui SGBD
25. Ce presupune descrierea datelor?
Descrierea datelor este acea parte care permite, nainte de introducerea
datelor, de a defini numele acestor date, structura i coninutul lor. De
exemplu baza de date a unei biblioteci comport un ansamblu de date
referitoare la cri.
26. n ce const extragerea datelor?
Extragerea datelor desemneaz toate operaiile regulate sau punctuale,
de cutare i de ieire pe ecran, pe suport de hrtie sau pe un alt suport,
n ntregime sau doar n parte a informaiilor din baza de date.
27. Ce implic protecia datelor?
Exist dou aspecte legate de protecia datelor. Primul privete
confidenialitatea: informaia nu poate fi cunoscut de toi. Pentru
fiecare tip de informaie trebuie stabilit lista persoanelor sau a
grupurilor autorizate a le consulta. Al doilea aspect se refer la
integritate: informaia nu poate fi modificat de toi. n acest caz, se
convine la definirea unui cerc de persoane, n general foarte mic,
abilitate s actualizeze informaia.
35
28. Descriei grafic arhitectura client/server.
29. Descriei grafic arhitectura pe 3 niveluri.
36
M.2. ALGEBRA RELAIONAL
1. Cuprins
2. Obiectiv general
3. Obiective operaionale
4. Dezvoltarea temei
5. Bibliografie selectiv
Cuprins
UI. 4. Caracterizarea general a limbajelor de programare;
= 1 or
UI. 5. Operatorii asambliti: Reuniunea, Intersecia,
Diferena, Produsul cartezian;
= 1 or
UI. 6. Operatorii relaionali: Selecia, Proiecia, Jonciunea,
Diviziunea
= 10 ore
Obiectiv general: Dobndirea cunotinelor cu privire la
operatorii algebrei relaionale
Obiective operaionale: Cunoaterea modului de aplicare a
operatorilor asambliti (reuniune, intersecie, produs cartezian, diferen) i
a celor relaionali (selecie, proiecie, jonciune, diviziune)
37
UNITATEA DE NVARE 4
CARACTERIZARE GENERAL A LIMBAJELOR DE INTEROGARE
Bazele de date relaionale au ca principal obiectiv acoperirea nevoilor
informaionale ale conducerii firmei la toate nivelurile ierarhice. Pn la
consacrarea definitiv a SGBDR-urilor, extragerea informaiilor dorite din baza de
date se realiza n principal prin aplicaii dezvoltate exclusiv prin intermediul
limbajelor procedurale, n care se precizau att datele dorite, ct i metodele de
cutare i de extragere a acestora. Generalizarea SGBDR-urilor este strns legat
de elaborarea i implementarea unor limbaje performante pentru manipularea
bazelor de date limbajele de interogare.
Limbajele relaionale sunt limbaje neprocedurale, n sensul c utilizatorul
definete doar datele ce trebuie extrase din baza de date, sarcina cutrii i
extragerii fiind n sarcina exclusiv a SGBD-ului.
Limbajele de manipulare a datelor, plecnd de la cele dou modaliti de
definire a unei relaii (ca predicat aplicat asupra unor domenii i ca ansamblu de
tupluri), sunt grupate n dou mari categorii:
limbaje predicative bazate pe teoria predicatelor;
limbaje asambliste bazate pe teoria ansamblurilor (a tuplurilor).
La rndul lor limbajele predicative sunt mprite n:
limbaje care au la baz calculul relaional asupra tuplurilor;
limbaje n care calculul relaional se aplic doar asupra domeniilor.
Pentru limbajele de manipulare a datelor bazate pe calculul predicatelor,
elementul definitoriu l constituie noiunea de variabil, noiune ce poate fi
asociat att tuplurilor, ct i domeniilor.
O alt clasificare este cea care realizeaz o delimitare ntre limbajele non-
grafice i cele grafice. Prima categorie permite realizarea unei consultri, prin
dispunerea succesiv a operatorilor, atributelor i relaiilor, n timp ce a doua
categorie permite redactarea consultrii n mod interactiv, prin afiarea pe ecran a
unui sistem de meniuri i elemente de dialog din care opiunile pot fi selectate i
modificate uor cu ajutorul mouse-ului
Exist o serie de caracteristici comune tuturor limbajelor de interogare:
rezultatul consultrii este o nou relaie ce poate servi, n continuare, ca
argument ntr-o nou consultare;
F
38
operatoriile relaionali se aplic relaiilor considerate n totalitatea lor,
adic tuturor tuplurilor care alctuiesc relaiile respective;
logica operatorilor se bazeaz pe valorile atributelor, aceasta constituind
singurul mod de acces la baza de date. Accesul total independent de limbaj este
asigurat prin compararea valorilor atributelor definite pe domenii compatibile.
Pentru a se realiza o consultare ntr-un limbaj relaional, nainte de toate
trebuie parcurs o faz de analiz, pentru determinarea rezultatului, a legturilor
dintre tabele precum i a eventualelor restricii ce trebuie respectate.
Algebra relaional cuprinde dou tipuri de operatori: asambliti
(REUNIUNE, INTERSECIE, DIFEREN, PRODUS CARTEZIAN) i
relaionali (SELECIE, PROIECIE, JONCIUNE, DIVIZIUNE).
ntr-o alt clasificare se face diferena ntre operatorii fundamentali,
ireductibili (reuniunea, diferena, produsul cartezian, selecia i proiecia) i
operatorii derivai, a cror funcionalitate poate fi realizat prin combinarea
operatorilor fundamentali (intersecia, jonciunea i diviziunea).
Pe parcursul acestui capitol se vor folosi notaiile:
t un tuplu al unei relaii (o linie a unei tabele) i
t(A), un subtuplu al relaiei R, relativ la atributul A (valoarea atributului
A n linia t).
Ca i calculul relaional, algebra relaional, servete ca punct de referin
n caracterizarea unui limbaj ca fiind complet sau incomplet, din punct de vedere
relaional. Dac un limbaj permite exprimarea tuturor operatorilor amintii
anterior i ofer cel puin facilitii algebrei relaionale, se poate spune despre
respectivul limbaj c este un limbaj complet relaional.
F
39
UNITATEA DE NVARE 5
OPERATORII ASAMBLITI
Trei dintre operatorii asambliti reuniune (), intersecie () i
diferen () pot opera numai cu dou relaii unicompatibile.
Ce nelegem prin relaii unicompatibile?
Fie R1 (A1, A2, .., An) i R2 (B1, B2,.., Bm) dou relaii. Spunem
despre R1 i R2 c sunt unicompatibile dac:
1. n=m
2. " i (1, 2, ., n), Ai i Bi sunt de acelai tip sintactic.
Relaiile R1 i R2 din figura 3.1. sunt unicompatibile deoarece:
1. ambele au acelai numr de atribute;
2. atributele C1, C2, C3 din R1 (R1.C1, R1.C2, R1.C3) corespund
sintactic atributelor C3, C4 i C5 (R2.C3, R2.C4, R2.C5).
R1 R2
C1 C2 C3 C3 C4 C5
100 AAA 500 500 BBB 300
200 AAB 750 300 BAA 250
400 ABA 250 400 BBA 300
500 BBB 700 700 AAA 500
900 ABB 400 900 ABB 400
Figura 1. Relaiile R1 i R2 unicompatibile
5.1. Reuniunea
Reuniunea a dou relaii R1 i R2, notat R3 R1 R2, este definit
astfel:
R1 R2 = {tuplu t | t R1 sau t R2}.
Coninutul tabelei-reuniune R3 este prezentat n figura 2. Primele cinci
tupluri din aceast tabel sunt preluate din R1, iar ultimele trei din R2. R3 conine
opt tupluri deoarece dou din tupluri sunt comune tabelelor R1 i R2. Algebra
relaional elimin automat duplicatele (tuplurile identice), n felul acesta
asigurndu-se restricia de unicitate dup fiecare operaie.
Reuniunea este comutativ. Singura problem neclar ar fi legat de
numele atributelor n relaia rezultat, ns se poate institui regula conform creia
numele atributelor relaiei-reuniune s fie numele atributelor primei relaii
participante la operaie.
F
40
R3
C1 C2 C3
100 AAA 500
200 AAB 750
400 ABA 250
500 BBB 700
900 ABB 400
300 BAA 250
400 BBA 300
700 AAA 500
Figura 2. Reuniunea relaiilor R1 i R2
5.2. Intersecia
Intersecia a dou relaii R1 i R2, notat R4 R1 R2, este definit
astfel:
R1 R2 = {tuplu t | t R1 i t R2}.
Coninutul tabelei-intersecie este prezentat n figura 3.3. Deoarece doar
dou tupluri sunt absolut identice i n R1 i n R2, tabela rezultat va fi alctuit
doar din dou linii.
Ca i reuniunea, intersecia este comutativ, iar numele atributelor relaiei
intersecie sunt extrase din prima relaia participant la operaie.
R4
C1 C2 C3
500 BBB 700
900 ABB 400
Figura 3. Intersecia relaiilor R1 i R2
5.3. Diferena
Diferena a dou relaii R1 i R2, notat R5 R1 R2, este definit
astfel:
R1 R2 = {tuplu t | t R1 i t R2}.
Coninutul tabelei-diferen (figura 3.4.) conine doar tuplurile din R1,
care nu se regsesc n R2. Aadar, din rezultat sunt eliminate ultimele dou tupluri
din R1, deoarece valorile acestora se regsesc i n R2 (primul i ultimul tuplu din
R2).
Spre deosebire de reuniune i intersecie, diferena nu este comutativ.
Atributele relaiei-diferen sunt cele ale primei relaii, iar tuplurile care sunt
extrase din relaia-desczut nu se regsesc n relaia scztor. Pe lng asta, nu
F
F
41
exist restricii privind cardinalitatea (numrul tuplurilor) celor dou relaii n
sensul c nu este obligatoriu ca relaia desczut s conin mai multe tupluri dect
cea scztor.
R5
C1 C2 C3
100 AAA 500
200 AAB 750
400 ABA 250
Figura 4. Diferena relaiilor R1 i R2
5.4. Produsul cartezian
Produsul cartezian dintre dou relaii R1 i R2, notat R6 R1 R2, este
ansamblul tuturor tuplurilor obinute prin concatenarea fiecrei liniile din tabela
R1 cu toate linie din tabela R2. Este definit astfel:
R1 R2 = {(t
1
, t
2
) | t
1
R1 i t
2
R2}
Spre deosebire de celelalte trei operaiuni precedente, produsul cartezian
nu face apel la noiunea de relaii unicompatibile, iar relaia rezultat cumuleaz
atributele celor dou relaii argument.
n figura 3.5. este prezentat rezultatul produsului cartezian al tabelelor R1
i R2.
R6
C1 C2 R1.C3 R2.C3 C4 C5
100
100
100
100
100
AAA
AAA
AAA
AAA
AAA
500
500
500
500
500
500
300
400
700
300
BBB
BAA
BBA
AAA
ABB
300
250
300
500
400
200
200
200
200
200
AAB
AAB
AAB
AAB
AAB
750
750
750
750
750
500
300
400
700
900
BBB
BAA
BBA
AAA
ABB
300
250
300
500
400
400
400
400
400
400
ABA
ABA
ABA
ABA
ABA
250
250
250
250
250
500
300
400
700
900
BBB
BAA
BBA
AAA
ABB
300
250
300
500
400
500
500
500
500
BBB
BBB
BBB
BBB
700
700
700
700
500
300
400
700
BBB
BAA
BBA
AAA
300
250
300
500
F
42
500 BBB 700 900 ABB 400
900
900
900
900
900
ABB
ABB
ABB
ABB
ABB
40
40
40
40
40
500
300
400
700
900
BBB
BAA
BBA
AAA
ABB
300
250
300
400
500
Figura 5. Produsul cartezian al relaiilor R1 i R2
Tabela-rezultat R6 are o structur nou cu ase atribute (trei preluate din
R1 i trei din R2). Deoarece exist un atribut cu nume comun C3, pentru a deosebi
cele dou apariii, acestea sunt prefixate, n antetul tabelei, cu numele relaiei din
care provine atributul respectiv (R1.C3 i R2. C3).
Prima linie din R6 este obinut prin unirea primului tuplu din R1 cu
primul tuplu din R2, a doua din primul tuplu din R1 cu al doilea din R2 .a.m.d.
Cum R1 are 5 tupluri i R2 tot 5, tabela-rezultat a produsului cartezian va avea 5 *
5 = 25 tupluri.
Nu prea exist situaii care s reclame folosirea direct i exclusiv a
produsului cartezian. Cel mai important merit al acestuia n algebra relaional
este c permite alipirea a dou relaii, fundamentnd astfel operatorul cheie care
este jonciunea.
43
UNITATEA DE NVARE 6
OPERATORII RELAIONALI
Dac cei patru operatori prezentai n paragraful anterior sunt generali, cei
din paragraful de fa sunt specifici algebrei relaionale.
Sunt grupai n dou categorii:
- operatori unari de restricie, care permit decupajul unei relaii, pe
orizontal SELECIA i pe vertical PROIECIA;
- operatori binari de extensie: JONCIUNEA i DIVIZIUNEA.
6.1. Selecia
Selecia triaz dintr-o tabel numai tuplurile care satisfac condiia
specificat printr-un predicat.
Se noteaz
R1 SELECIE {R; expresie_logic}
unde:
- R este relaia R (A1, A2, ..., An) asupra creia se aplic selecia (Ai sunt
atributele sale);
- R1 este noua tabel obinut n urma seleciei, care va avea aceeai
schem relaional cu R R1(A1, A2, ..., An)
- expresie_logic este compus din operanzi care sunt nume de atribute
sau constante, operatori de comparaie aritmetic (>, , <, , =, ) i operatori
logici (I, SAU, NU).
OBSERVAIE: Relaiile R1 i R2 folosite pentru exemplificare pe
parcursul acestui subcapitol, sunt cele din figura 3.1. din subcapitolul
anterior. Toate celelalte relaii folosite aici, precum i n capitolul urmtor
(Limbajul de interogare SQL) sunt prezentate n anex.
Exemplul 1. Care sunt liniile din R1 pentru care valorile atributului C1
sunt mai mici de 500?
R SELECIE (R1; C1 > 500)
R
C1 C2 C3
900 ABB 500
Figura 6. Rezultat selecie exemplul 1
F
44
Exemplul 2. Care sunt liniile din R1 pentru care valorile atributului C3
sunt cuprinse n intervalul 250 350?
R SELECIE (R1; C3 > = 250 AND C3 < = 350)
R
C1 C2 C3
400 ABA 250
Figura 7. Rezultat selecie exemplul 2
Exemplul 3. Care sunt liniile din R1 pentru care valorile atributelor C1 i
C3 sunt mai mari dect 300?
R SELECIE (R1; C1 > 300 AND C3 > 300)
R
C1 C2 C3
900 ABB 40
Figura 8. Rezultat selecie exemplul 3
Exemplul 4. Care sunt studenii Facultii de tiine Economice?
Pentru a afla aceast informaie, mai nti trebuie s identificm n baza de
date tabela (sau dup caz, tabelele) din care se extrage rezultatul. n cazul de fa,
tabela este STUDENT. Apoi se stabilesc atributele din tabel, asupra crora se va
aplica predicatul (atributul) de selecie. Se obine n felul acesta soluia:
R SELECIE (STUDENT, facultate = Stiinte
Economice)
Exemplul 5. Care sunt studenii Facultii de tiine Economice,
specializarea Contabilitate i Informatic de Gestiune?
Tabela n care va opera operatorul de selecie este STUDENT. Predicatul
de selecie va opera asupra atributelor facultate i sectia:
R SELECIE (STUDENT, facultate = Stiinte
Economice AND sectia = CIG)
Exemplul 6. Ce burse au fost ridicate n luna februarie 2004?
Tabela n care va opera de aceast dat operatorul de selecie este tabela
BURSA, iar atributul folosit este data_incasarii.
R SELECIE (BURSA; data_incasarii >= 01/02/2004
AND data_incasarii <= 29/02/2004
45
6.2. Proiecia
Proiecia permite selectarea ntr-o tabel rezultat doar a atributelor dorite
spre deosebire de selecie care extrage anumite linii dintr-o tabel pe baza
condiiei ndeplinite de valorile unora dintre atribute. Cu alte cuvinte se realizeaz
decuparea pe vertical a unei relaii.
Proiecia relaiei R(A1, A2, , An) este o relaie care se obine dup
parcurgerea a doi pai:
1. eliminarea din Ai a acelor atribute care nu sunt specificate
2. suprimarea tuplurilor identice (dublurile).
Se noteaz:
R1 PROIECIE {R; Aj, Ak, , Ax}
Spre deosebire de R, schema relaiei R1 este alctuir numai din atributele
indicate: R1 (Aj, Ak, ..., Ax). Dac dup extragerea coloanelor nu exist tupluri
identice, R1 va avea acelai numr de linii ca i relaia R. n caz contrar, numrul
lor va fi mai mic, n funcie de numrul dublurilor.
Exemplul 7. Care sunt valorile atributului C3 n relaia R1?
R PROIECIE (R1; C3)
R
C3
500
750
250
700
400
Figura 9. Rezultat proiecie exemplul 7
Exemplul 8. Care sunt valorile combinaiei atributelor C1 i C3 n relaia
R1?
R PROIECIE (R1; C1, C3)
R
C1 C3
100
200
400
500
900
500
750
250
700
400
Figura 10. Rezultat proiecie exemplul 8
Exemplul 9. Care sunt facultile preluate n baza de date?
Tabela n care sunt preluate facultile este STUDENT. Singura coloan
care ne intereseaz n acest caz este facultate.
F
46
n prima faz se realizeaz decuparea pe vertical a coloanei respective,
obinndu-se o relaie temporar notat R, iar apoi prin eliminarea duplicatelor se
obine rezultatul final n relaia R.
R PROIECIE (STUDENT; facultate)
R
facultate
Stiinte Economice
Stiinte Economice
Colegiul Economic
Stiinte Juridice
Stiinte Economice
Stiinte Economice
Stiinte Economice
Stiinte Economice
R
Stiinte 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 proiecie exemplul 9
Exemplul 10. S se identifice cota, titlul, domeniul i numrul de
exemplare al fiecrei cri.
Tabela care intereseaz este CARTE, iar din aceasta se decupeaz patru
coloane: cota_carte, titlu, domeniu i nr_exemplare.
R PROIECIE (CARTE; cota_carte, titlu, domeniu,
nr_exemplare)
6.3. nlnuirea consultrilor
Dup cum am vzut, rezultatul unei consultri este o tabel (relaie) nou.
Avnd n vedere acesta, pentru obinerea tabelei rezultat, se pot nlnui dou sau
mai multe operaii redactndu-se astfel interogri complexe.
Exemplul 11. Care este facultatea pe care o urmeaz studentul Barbu
Elena?
F
47
n cazul de fa soluia este relativ simpl. Folosind selecia se decupeaz
din tabela STUDENT doar studentul care se numete Barbu Elena. Se obine n
felul acesta o relaie nou, notat R1. Avnd n vedere c ne intereseaz doar
facultatea, se aplic asupra lui R1 o proiecie i se obine relaia R2, n care se afl
rspunsul la problema luat n discuie.
R1 SELECIE (STUDENT, nume = Barbu Elena)
R2 PROIECIE (R1, facultate)
Exemplul 12. Care sunt regiunile din care fac parte judeele Dmbovia i
Vlcea?
Tabela interogat este LOCALITATE. Pentru a rspunde la aceast
variant pot fi formulate dou soluii.
Soluia 1.
R1 SELECIE (LOCALITATE; judet = Dambovita OR
judet = Valcea)
R2 PROIECIE (R1; judet, regiune)
Soluia 2.
R1 SELECIE (LOCALITATE; judet = Dambovita)
R2 PROIECIE (R1; judet, regiune)
R3 SELECIE (LOCALITATE; judet = Valcea)
R4 PROIECIE (R3, judet, regiune)
R5 R2 R4
Exemplul 13. Care sunt studenii Facultii de tiine Economice de la
specializrile CIG i FA?
Tabela interogat este STUDENT, iar rspunsul la aceast ntrebare poate
fi formulat n 2 moduri.
Soluia 1.
R1 SELECIE (STUDENT; facultate = Stiinte
Economice AND sectia = CIG OR sectia =
FA)
R2 PROIECIE (R1; nume, sectia)
Soluia 2.
R1 SELECIE (STUDENT; facultate = Stiinte
Economice AND sectia = CIG)
R2 PROIECIE (R1; nume, sectia)
R3 SELECIE (STUDENT; facultate = Stiinte
Economice AND sectia = FA)
R4 PROIECIE (R2; nume, sectia)
R5 R2 R4
Exemplul 14. Care sunt crile care au aprut i la editurile Eficient i
Macarie?
48
Tabela din care vor fi extrase datele este CARTE. Rezultatul se bazeaz pe
intersecia relaiei care conine crile aprute la editura Eficient (R2) cu crile
aprute la editura Macarie (R4).
R1 SELECIE (CARTE; editura = Eficient)
R2 PROIECIE (R2; titlu)
R3 SELECIE (CARTE; editura = Macarie)
R4 PROIECIE (R3; titlu)
R5 R2 R4
6.4. Jonciunea
Dup cum am vzut, produsul cartezian permite fuzionarea a dou tabele
ntr-una singur ce conine toate atributele i liniile obinute prin combinarea
fiecrui tuplu dintr-o relaia cu fiecare tuplu din cealalt.
Jonciunea spre deosebire de produsul cartezian care este o fuziune
necondiionat a dou tabele, este o fuziune a dou relaii care au o proprietate
comun. Fie dou relaii R1(A1, A2, , An) i R2(B1, B2, , Bp) i Ai i Bj
dou atribute definite pe acelai domeniu i q ansamblul operatorilor de
comparaie {=, <, >, , , } ce pot fi aplicai celor dou atribute Ai i Bj.
Jonciunea relaiei R1, prin Ai cu relaia R2, prin Bj notat
R1 (Ai q Bj) R2
este relaia ale crei tupluri sunt obinute prin concatenarea fiecrui tuplu al
relaiei R1 cu tuplurile relaiei R2, pentru care este verificat condiia q instituit
ntre Ai i Bj. Se noteaz:
R1 (Ai q Bj) R2 = {t | t R1 R2 i t(Ai) q t(Bj)}.
Jonciunea este echivalent cu un produs cartezian urmat de o selecie.
Aceast jonciune este cunoscut n literatura de specialitate sub denumirea de
theta-jonciune. n lucrul cu bazele de date relaionale se utilizeaz cu precdere
echi-jonciunea, ce reprezint un caz particular al theta-jonciunii, atunci cnd q
este operatorul de egalitate =. Se noteaz:
R1 (Ai = Bj) R2 = {t | t R1 R2 i t(Ai) = t(Bj)}.
Exemplul 15 Theta jonciune
Pentru exemplificarea acestui operator se folosesc aceleai dou tabele R1
i R2. Rezultatul jonciunii (theta - jonciunii) exprimat prin expresia
R JONCIUNE (R1, R2, R1.C1 > R2.C5),
este obinut n 2 pai, dup cum se observ n figura urmtoare:
F
49
R1 R R1 R2
C1 C2 C3 C1 C2 R1.C3 R2.C3 C4 C5
100 AAA 500 100 AAA 500 500 BBB 300
200 AAB 750 100 AAA 500 300 BAA 250
400 ABA 250 100 AAA 500 400 BBA 300
500 BBB 700 100 AAA 500 700 AAA 500
900 ABB 400 100 AAA 500 300 ABB 400
200 AAB 750 500 BBB 300
R2
200 AAB 750 300 BAA 250
C3 C4 C5 200 AAB 750 400 BBA 300
500 BBB 300 200 AAB 750 700 AAA 500
300 BAA 250 200 AAB 750 900 ABB 400
400 BBA 300 400 ABA 250 500 BBB 300
700 AAA 500 400 ABA 250 300 BAA 250
900 ABB 400 400 ABA 250 400 BBA 300
400 ABA 250 700 AAA 500
400 ABA 250 900 ABB 400
500 BBB 700 500 BBB 300
500 BBB 700 300 BAA 250
500 BBB 700 400 BBA 300
500 BBB 700 700 AAA 500
R = SELECIE (R; C1 > C5)
500 BBB 700 900 ABB 400
C1 C2 R1.C3 R2.C3 C4 C5 900 ABB 400 500 BBB 300
400 ABA 250 500 BBB 300 900 ABB 400 300 BAA 250
400 ABA 250 300 BAA 250 900 ABB 400 400 BBA 300
400 ABA 250 400 BBA 300 900 ABB 400 700 AAA 400
500 BBB 700 500 BBB 300 900 ABB 400 900 ABB 500
500 BBB 700 300 BAA 250
500 BBB 700 400 BBA 300
500 BBB 700 800 ABB 400
900 ABB 400 500 BBB 300
900 ABB 400 300 BAA 250
900 ABB 400 400 BBA 300
900 ABB 400 700 AAA 500
900 ABB 400 900 ABB 400
Figura 12. Mecanismul de theta-joncionare exemplul 15
Exemplul 16 Echi jonciune
Pentru a fi o echijonciune, operatorul de comparaie dintre cele dou
atribute este, n mod obligatoriu, semnul de egalitate.
R JONCIUNE (R1, R2; R1.C1 = R2.C5)
50
R1 R R1 R2
C1 C2 C3 C1 C2 R1.C3 R2.C3 C4 C5
100 AAA 500 100 AAA 500 500 BBB 300
200 AAB 750 100 AAA 500 300 BAA 250
400 ABA 250 100 AAA 500 400 BBA 300
500 BBB 700 100 AAA 500 700 AAA 500
900 ABB 400 100 AAA 500 300 ABB 400
200 AAB 750 500 BBB 300
R2
200 AAB 750 300 BAA 250
C3 C4 C5 200 AAB 750 400 BBA 300
500 BBB 300 200 AAB 750 700 AAA 500
300 BAA 250 200 AAB 750 900 ABB 400
400 BBA 300 400 ABA 250 500 BBB 300
700 AAA 500 400 ABA 250 300 BAA 250
900 ABB 400 400 ABA 250 400 BBA 300
400 ABA 250 700 AAA 500
400 ABA 250 900 ABB 400
500 BBB 700 500 BBB 300
500 BBB 700 300 BAA 250
500 BBB 700 400 BBA 300
500 BBB 700 700 AAA 500
500 BBB 700 900 ABB 400
900 ABB 400 500 BBB 300
900 ABB 400 300 BAA 250
900 ABB 400 400 BBA 300
900 ABB 400 700 AAA 400
900 ABB 400 900 ABB 500
R = SELECIE (R; C1 = C5)
C1 C2 R1.C3 R2.C3 C4 C5
500 BBB 700 700 AAA 500
Figura 13. Echi-jonciune exemplul 16
Exemplul 17 Jonciune natural
Jonciunea natural, pe lng faptul c presupune ca operatorul de
comparaie s fie semnul de egalitate, implic i denumirea identic a atributelor
de legtur ntre cele dou tabele.
R JONCIUNE (R1, R2; R1.C3 = R2.C3) sau se poate folosi
i forma simplificat, datorit faptului c ambele atribute au acelai nume
R JONCIUNE (R1, R2; C3)
Avnd n vedere c cele dou atribute au acelai nume, se poate considera
c tabela rezultat pstreaz numai unul dintre cele dou atribute.
51
R1 R R1 R2
C1 C2 C3 C1 C2 R1.C3 R2.C3 C4 C5
100 AAA 500 100 AAA 500 500 BBB 300
200 AAB 750 100 AAA 500 300 BAA 250
400 ABA 250 100 AAA 500 400 BBA 300
500 BBB 700 100 AAA 500 700 AAA 500
900 ABB 400 100 AAA 500 300 ABB 400
200 AAB 750 500 BBB 300
R2
200 AAB 750 300 BAA 250
C3 C4 C5 200 AAB 750 400 BBA 300
500 BBB 300 200 AAB 750 700 AAA 500
300 BAA 250 200 AAB 750 900 ABB 400
400 BBA 300 400 ABA 250 500 BBB 300
700 AAA 500 400 ABA 250 300 BAA 250
900 ABB 400 400 ABA 250 400 BBA 300
400 ABA 250 700 AAA 500
400 ABA 250 900 ABB 400
500 BBB 700 500 BBB 300
500 BBB 700 300 BAA 250
500 BBB 700 400 BBA 300
500 BBB 700 700 AAA 500
500 BBB 700 900 ABB 400
900 ABB 400 500 BBB 300
900 ABB 400 300 BAA 250
900 ABB 400 400 BBA 300
900 ABB 400 700 AAA 400
900 ABB 400 900 ABB 500
R = SELECIE (R; R1.C3 = R2.C3)
C1 C2 C2 C3 C4
100 AAA 500 BBB 300
500 BBB 700 AAA 500
900 ABB 400 BBA 300
Figura 14. Jonciune natural exemplul 17
Deoarece selecia este un operator care se aplic doar unei singure tabele
(operator unar), este necesar fuzionarea tabelelor din care se dorete extragerea
datelor pentru obinerea unei relaii agregat, la care se aplic predicatul
suplimentar de selecie. Fuzionarea tabelelor este posibil numai prin jonciune.
Prin joncionarea tuturor relaiilor dintr-o baz de date se poate ajunge la o relaie
universal
Exemplul 18. S se afle pentru fiecare student bursier ce tip de burs
primete i care este valoarea acesteia.
Tabela STUDENT se joncioneaz cu tabela BURSA pe baza atributului
comun (nr_matricol) iar la tabela intermediar rezultat, se aplic selecia.
52
R1 JONCIUNE (STUDENT, BURSA, Nr_matricol)
R2 PROIECIE (R1; nume, tip_bursa,
suma_incasata)
Exemplul 19. S se afle numele, facultate i secia studenilor care stau n
cminul Miclas.
Soluia 1.
R1 JONCIUNE (STUDENT, STUDCAMIN; Nr_matricol)
R2 SELECIE (R1; nume_camin = MICLAS)
R3 PROIECIE (R2; nume, facultate, sectia,
nume_camin)
Soluia 2.
Mai nti se aplic relaia asupra tabelei STUDCAMIN iar tabela
intermediar se joncioneaz cu STUDENT.
R1 SELECIE (STUDCAMIN; nume_camin = Miclas)
R2 JONCIUNE (STUDENT, R1; Nr_matricol)
R3 PROIECIE (R2; nume, facultate, sectia,
nume_camin)
Care dintre cele dou variante este de preferat? A doua variant este mai
bun dect prima, deoarece jonciunea opereaz asupra a dou tabele mai reduse
ca dimensiuni (tabela STUDCAMIN deja a fost filtrat prin aplicarea predicatului
de selecie). Diferena este cu att mai vizibil atunci cnd tabela STUDENT
conine toi studenii dintr-o universitate. Iar dac ne gndim c naintea oricrei
jonciuni se realizeaz produsul cartezian apare ndreptit amnarea jonciunii,
pn cnd aceasta va opera asupra unor tabele cu un numr mai mic de linii i
coloane.
Exemplul 20. Care sunt crile scrise de Victor Stanciu ?
Elementul de noutate n cazul acestui exemplu l reprezint faptul c se
dorete obinerea unei informaii ce provine dintr-o relaie (atributul
nume_carte din tabela CARTE), pe baza unei condiii aplicate altei relaii
(atributul nume_autor din tabela AUTOR), iar cele dou relaii nu sunt n
raport de printe copil. n asemenea situaii se recomand folosirea i a altor
relaii, n cazul nostru tabela AUTORCARTE.
Soluia 1:
R1 JONCIUNE (CARTE, AUTORCARTE; cota_carte)
R2 JONCIUNE (R1,AUTOR; nume_autor)
R3 SELECIE (R2; nume_autor = Victor Stanciu)
R4 PROIECIE (R3; titlu)
53
Soluia 2:
R1 SELECIE (AUTOR, nume_autor = Victor
Stanciu)
R2 PROIECIE (R1; nume_autor)
R3 JONCIUNE (R2,AUTORCARTE; nume_autor)
R4 PROIECIE (R3; Cota_carte)
R5 JONCIUNE (R4, CARTE; cota_carte)
R6 PROIECIE (R5; titlu)
naintea calculrii relaiei intermediare au fost eliminate nu numai tuplurile
ci i atributele de prisos.
Exemplul 21. Numele studenilor care au mprumutat cri din domeniul
Informatic.
i n acest caz se dorete obinerea unei informaii ce provine dintr-o
tabel (atributul nume din tabela STUDENT) pe baza unei condiii aplicate unei
alte tabele iar ntre cele dou tabele nu exist legtur printe copil. De aceast
dat se folosete ca legtur tabela STUDCARTE.
Soluia 1:
R1 JONCIUNE (STUDENT; STUDTCARTE; nr_matricol)
R2 JONCIUNE (R1, CARTE; cota_carte)
R3 SELECIE (R2; domeniu = Informatica)
R4 PROIECIE (R3; nume)
Soluia 2:
R1 SELECIE (CARTE; domeniu = Informatica)
R2 JONCIUNE (R1, STUDCARTE; cota_carte)
R3 PROIECIE (R2; nr_matricol)
R4 JONCIUNE (R3, STUDENT; nr_matricol)
R5 PROIECIE (R4; nume)
Exemplul 22. Numele i secia studenilor facultii de tiine Economice
care au mprumutat cartea Informatic de gestiune n perioada 15-29 februarie
2004.
Relaia rezultat trebuie s conin valori ale atributelor nume i sectia
din tabela STUDENT. Predicatul de selecie se aplic ns asupra tabelei CARTE
(atributul nume_carte = Informatica de gestiune) i asupra tabelei
STUDCARTE (atribut data_mprumut > = 15/02/2004 i < = 29/02/2004).
R1 SELECIE (CARTE; titlu = Informatica de
gestiune)
R2 JONCIUNE (R1, STUD_CARTE; cota_carte)
R3 SELECIE (R2; data_imprumut > = 15/02/2004
AND data_imprumut < = 29/02/2004)
R4 PROIECIE (R3; nr_matricol)
54
R5 JONCIUNE (R4; STUDENT; nr_matricol)
R6 SELECIE (R5; facultate = Stiinte
Economice)
R7 PROIECIE (R6; nume, sectia)
Exemplul 23. De la ce secii sunt studenii care au mprumutat i cartea
Informatic de gestiune i Contabilitate general?
Rezultatul conine atributul secia din tabela STUDENT, dar predicatul de
selecie se aplic asupra tabelei produse.
Soluia 1:
R1 SELECIE (CARTE; nume_carte = Informatica de
gestiune)
R2 JONCIUNE (R1, STUD_CARTE; cota_carte)
R3 JONCIUNE (R2, STUDENT; nr_matricol)
R4 PROIECIE (R3; sectia)
R5 SELECIE (CARTE; nume_carte = Contabilitate
generala)
R6 JONCIUNE (R5, STUDCARTE; cota_carte)
R7 JONCIUNE (R6, STUDENT; nr_matricol)
R8 PROIECIE (R7; SECTIA)
R9 R4 R8
Soluia 2:
R1 SELECIE (CARTE; titlu = Informatica de
gestiune)
R2 JONCIUNE (R1, STUD_CARTE; cota_carte)
R3 JONCIUNE (R2, STUDENT; nr_matricol)
R4 SELECIE (CARTE; nume_carte = Contabilitate
generala)
R5 JONCIUNE (R4, STUDCARTE; cota_carte)
R6 JONCIUNE (R5, STUDENT; nr_matricol)
R7 JONCIUNE (R3; R6; sectia)
R8 PROIECIE (R7, sectia)
n prima soluie s-a intersectat relaia seciilor studenilor care au
mprumutat cartea Contabilitate general (R8). n cea de-a doua variant s-a
operat direct jonciunea ntre R3 i R6.
Exemplul 24. n ce cmin sunt cazai studenii care au mprumutat crile
Informatic de gestiune i Contabilitate general, dar nu au mprumutat
cartea Economie politic?
Lucrurile n acest caz nu sunt att de complicate precum par la prima
vedere, deoarece vom folosi elemente din exemplul anterior, plus operatorul
diferen.
55
R1 SELECIE (CARTE; titlu = Informatica de
gestiune)
R2 JONCIUNE (R1, STUD_CARTE; cota_carte)
R3 JONCIUNE (R2, STUDENT; nr_matricol)
R4 JONCIUNE (R3, STUDCAMIN; nr_matricol)
R5 PROIECIE (R4, nume_camin)
R6 SELECIE (CARTE; nume_carte = Contabilitate
general)
R7 JONCIUNE (R6, STUDCARTE; cota_carte)
R8 JONCIUNE (R7, STUDENT; nr_matricol)
R9 JONCIUNE (R8, STUDCAMIN; nr_matricol)
R10 PROIECIE (R9; nume_camin)
R11 SELECIE (CARTE; nume_carte = Economie
politica)
R12 JONCIUNE (R11, STUDCARTE; cota_carte)
R13 JONCIUNE (R12, STUDENT; nr_matricol)
R14 JONCIUNE (R13, STUDCAMIN; nr_matricol)
R15 PROIECIE (R14; nume_camin)
R16 R5 R10 R15
Exemplul 25
Ce studeni studiaz la aceeai secie cu Dinescu Monica?
Fa de interogrile de pn acum, condiia de selecie n acest caz este una
indirect, n sensul c mai nti trebuie determinat secia la care studiaz Dinescu
Monica. Apoi trebuie extrase din tabela STUDENT, liniile pentru care secia are
valoarea seciei reper.
R1 SELECIE (STUDENT; nume = Dinescu Monica)
R2 PROIECIE (R1; sectia)
R3 JONCIUNE (R2, STUDENT; sectia)
R4 PROIECIE (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
pornete de la dou relaii R1(A,B) i R2(B). Diviziunea relaional R1R2 are ca
rezultat o relaie definit ca ansamblul subtuplurilor R1(A), pentru care produsul
lor cartezian cu R2(B) este un subansamblu al R1(A,B).
Rezultatul expresiei R1R2 reprezint ctul diviziunii, ea fiind o relaie ce
poate fi notat R3(A). ntr-o alt formulare a
i
R3 dac i numai dac " b
i
R2
$ (a
i
, b
i
) R1.
F
56
n continuare pentru simplitate A i B sunt considerate dou atribute, dei
ele pot fi i grupe de atribute. n figura de mai jos este prezentat diviziunea
relaional.
R1
A B
a1 b1
a2 b1
a3 b1
a1 b2
a3 b2 R2
a4 b2 B
a1 b3 b1 R3
a3 b3 b2 A
a6 b3 b3 a1
a1 b4 b4 a2
a3 b4
a4 b4
a1 b5
a2 b5
a3 b5
a5 b5
Figura 15. Diviziunea relaional
Determinarea relaiei R3 R1 R2 este sinonim cu a rezolva problema:
care dintre a1, a2, a3, a4 i a5 apar n tupluri R1 mpreun cu toate valorile
lui B din R2, respectiv b1, b2, b3, b4 i b5?
Toate valorile atributului A din R1 sunt parcurse pe rnd:
a1 apare cu b1 (n tuplul 1), cu b2 (n tuplul 2), cu b3 (n tuplul 7), cu
b4 (n tuplul 10) i cu b5 (n tuplul 13). Prin urmare a1 ndeplinete condiie i va
fi inclus n relaia R3;
a2 apare cu b1 (n tuplul 2) dar nu apare cu b2 nu va face parte din
R3;
a3 apare cu b1 (n tuplul 3), cu b2 (n tuplul 5), cu b3 (n tuplul 8), cu
b4 (n tuplul 11) i cu b5 (n tuplul 15) ndeplinete condiia i ca fi inclus n
R3;
a4 nu apare cu b1 nu va face parte din R3;
a5 nu apare cu b1 nu va face parte din R3;
57
n urma acestui raionament, tabele R3 va fi alctuit din dou tupluri (a1
i a3).
Diviziunea relaional este deosebit de util pentru formularea
consultrilor n care apare clauza " (oricare ar fi)
Test de evaluare
Se consider urmtoarea baz de date:
PACIENT (codpacient, nume, prenume, datanasterii,
localitate)
PROGRAMARE (nrprogramare, dataprogramare,
oraprogramare, codpacient)
CONSULTATIE (nrconsultatie, tipconsultatie,
codpacient, dataconsultatie)
MEDICI (codmedic, numemedic, prenumemedic)
MEDIC_CONSULTATIE (nrconsultatie, codmedic)
TARIFE (tipconsultatie, tarif)
Folosind operatorii algebrei relaionale s se determine:
1. Care sunt pacienii din Trgovite; (vezi pag. 63-67)
2. Care sunt pacienii din Trgovite i Titu; (vezi pag. 63-67)
3. Care pacieni nu sunt din Trgovite i Titu; (vezi pag. 63-67)
4. Care sunt pacienii care s-au nscut n anul 1989; (vezi pag. 63-67)
58
5. Care sunt tarifele mai mari de 25 RON; (vezi pag. 63-67)
6. Din ce localiti sunt pacienii din baz; (vezi pag. 63-67)
7. Care este nume i prenumele medicilor care ofer consultaii;
(vezi pag. 63-67)
8. Care sunt tarifele practicate; (vezi pag. 63-67)
9. Din ce localitate sunt pacienii nscui n luna ianuarie 1990;
(vezi pag. 63-67)
10. Care sunt orele pentru care sunt prevzute consultaii n data de
09.02.2006; (vezi pag. 63-67)
59
11. Cum se numesc pacienii din Trgovite 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 fcut programare pacienii din
Trgovite; (vezi pag. 63-67)
15. Numele pacienilor care au fost consultai n luna februarie 2006;
(vezi pag. 63-67)
16. Data la care a fcut programare Dinescu Mircea i Vancea Ioan;
(vezi pag. 63-67)
60
17. Numele medicilor care au acordat consultaii 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 pacienilor consultai de Grecu Anca; (vezi pag. 63-67)
20. Nume pacienilor care au fcut programare i n luna ianuarie i n
luna februarie 2006; (vezi pag. 63-67)
61
21. Care este tariful consultaiei pacientului Popa Georgeta;
(vezi pag. 63-67)
22. Numele pacienilor care au fcut programare n data de 10.02.2006
n intervalul 14-16; (vezi pag. 63-67)
23. Datele la care au efectuat consultaii Grecu Anca i Minea Ion n
luna februarie 2006; (vezi pag. 63-67)
62
24. Numele i prenumele medicilor care au consultat pacieni din
Trgovite i Moreni dar nu din Titu; (vezi pag. 63-67)
25. Numele pacienilor consultai de Grecu Anca n luna februarie
2006; (vezi pag. 63-67)
63
26. Data la care au fost consultai pacienii care au fcut programare n
data de 10.02.2006; (vezi pag. 63-67)
27. Nume pacienilor care au avut programare n data de 10.20.2006 n
intervalul 12-14 i au fost consultai de ctre Grecu Anca.
(vezi pag. 63-67)
Rezolvare tem de autoevaluare
1. Care sunt pacienii din Trgovite;
R1 SELECIE(PACIENT; localitate=Targoviste)
2. Care sunt pacienii din Trgovite i Titu;
R1 SELECIE(PACIENT; localitate=Targoviste or
localitate=Titu)
3. Care pacieni nu sunt din Trgovite i Titu;
R1 SELECIE(PACIENT; localitate<>Targoviste and
localitate<>Titu)
sau
R1 SELECIE(PACIENT; localitate=Targoviste or
localitate=Titu)
R2 PACIENT R1
64
4. Care sunt pacienii care s-au nscut n anul 1989;
R1 SELECIE(PACIENT; datanasterii>= 01/01/1989 and
datanasterii<= 31/12/1989)
5. Care sunt tarifele mai mari de 25 RON;
R1 SELECIE(TARIFE; tarif>25)
6. Din ce localiti sunt pacienii din baz;
R1 PROIECIE(PACIENT; localitate)
7. Care este nume i prenumele medicilor care ofer consultaii;
R1 JONCIUNE(MEDICI; MEDIC_CONSULTATIE;
codmedic)
R2 PROIECIE(R1; numemedic, prenumemedic)
8. Care sunt tarifele practicate;
R1 PROIECIE(TARIFE; tarif)
9. Din ce localitate sunt pacienii nscui n luna ianuarie 1990;
R1 SELECIE(PACIENT; datanasterii>= 01/01/1990 and
datanasterii<= 31/01/1990)
R2 PROIECIE(R1; localitate)
10. Care sunt orele pentru care sunt prevzute consultaii n data de
09.02.2006;
R1 SELECIE(CONSULTATIE; dataconsultatie = 09/02/2006)
R2 JONCIUNE(R1, PROGRAMARE; nrconsultatie)
R3 PROIECIE(R2; oraprogramare)
11. Cum se numesc pacienii din Trgovite i Moreni;
R1 SELECIE(PACIENT; localitate = Targoviste)
R2 PROIECIE(R1; nume)
R3 SELECIE(PACIENT; localitate = Titu)
R4 PROIECIE(R3; nume)
R5 R2 R4
12. Care este prenumele medicilor cu numele de familie Ghionea;
R1 SELECIE(MEDICI; numemedic = Ghionea)
R2 PROIECIE(R1; prenumemedic)
13. La ce data i la ce or are programare Popa Georgeta;
R1 SELECIE(MEDICI; numemedic = Ghionea)
R2 PROIECIE(R1; prenumemedic)
14. Care sunt datele la care au fcut programare pacienii din
Trgovite;
R1 SELECIE(PACIENT; localitate = Targoviste)
R2 JONCIUNE(R1, PROGRAMARE; codpacient)
R3 PROIECIE(R3; dataprogramare, oraprogramare)
65
15. Numele pacienilor care au fost consultai n luna februarie 2006;
R1 JONCIUNE(PACIENT, PROGRAMARE; codpacient)
R2 JONCIUNE(R1, CONSULTATIE; nrconsultatie)
R3 SELECIE(R2; dataconsultatie >= 01/02/2006 and
dataconsultatie <= 28/02/2006)
R4 PROIECIE(R3; nume, prenume)
16. Data la care a fcut programare Dinescu Mircea i Vancea Ioan;
R1 SELECIE(PACIENT; nume = Dinescu and prenume =
Mircea)
R2 JONCIUNE(R1, PROGRAMARE; codpacient)
R3 PROIECIE(R2, dataprogramare)
R4 SELECIE(PACIENT; nume = Vancea and prenume =
Ioan)
R5 JONCIUNE(R4, PROGRAMARE; codpacient)
R6 PROIECIE(R5, dataprogramare)
R7 R4 R6
17. Numele medicilor care au acordat consultaii n data de 23.02.2006;
R1 SELECIE(CONSULTATIE; dataconsultatie = 23/02/2006)
R2 JONCIUNE(R1, MEDIC_CONSULTATIE; nrconsultatie)
R3 JONCIUNE(R2, MEDICI; codmedic)
R4 PROIECIE(RE; numemedic, prenumemedic)
18. De ce medic a fost consultat Popa Georgeta;
R1 JONCIUNE(PACIENT, CONSULTATIE; codpacient)
R2 JONCIUNE(R1, MEDIC_CONSULTATIE; nrconsultatie)
R3 JONCIUNE(R2, MEDICI; codmedic)
R4 SELECIE(R3; nume = Popa and prenume = Georgeta)
R5 PROIECIE(R4; numemedic, prenumemedic)
19. Numele pacienilor consultai de Grecu Anca;
R1 SELECIE(MEDICI; numemedic = Grecu and
prenumemedic =
Anca)
R2 JONCIUNE(R1, MEDIC_CONSULTATIE; codmedic)
R3 JONCIUNE(R2, CONSULTATIE; nrconsultatie)
R4 JONCIUNE(R3, PACIENT; codpacient)
R5 PROIECIE(R4; nume, prenume)
20. Nume pacienilor care au fcut programare i n luna ianuarie i n
luna februarie 2006;
R1 JONCIUNE(PACIENT, CONSULTATIE; codpacient)
R2 SELECIE(R1; dataprogramare >= 01/01/2006 and
dataprogramare <= 31/01/2006)
R3 SELECIE(R1; dataprogramare >= 01/02/2006 and
dataprogramare <= 2831/02/2006)
R4 R2 R3
R5 PROIECIE(R4; nume, prenume)
66
21. Care este tariful consultaiei pacientului Popa Georgeta;
R1 SELECIE(PACIENT; nume = Popa and prenume =
Georgeta)
R2 JONCIUNE(R1, CONSULTATIE; codpacient)
R3 JONCIUNE(R2, TARIFE; nrconsultatie)
R4 PROIECIE(R3; tarif)
22. Numele pacienilor care au fcut programare n data de 10.02.2006
n intervalul 14-16;
R1 SELECIE(PROGRAMARE; dataprogramare =
10/02/2006)
R2 SELECIE(R1; oraprogramare>= 14 and oraprogramare
<=16)
R3 JONCIUNE(R2, PACIENT; codpacient)
R4 PROIECIE(R3; nume, prenume)
23. Datele la care au efectuat consultaii Grecu Anca i Minea Ion n
luna februarie 2006;
R1 SELECIE(MEDICI; numemedic = Grecu and
prenumemedic =
Anca)
R2 JONCIUNE(R1, MEDIC_CONSULTATIE; codmedic)
R3 JONCIUNE(R2, CONSULTATIE; nrconsultatie)
R4 SELECIE(R3; dataconsultatie >= 01/02/2006 and
dataconsultatie <= 28/02/2006)
R5 PROIECIE(R4; dataconsultatie)
R6 SELECIE(MEDICI; numemedic = Minea and
prenumemedic =
Ion)
R7 JONCIUNE(R6, MEDIC_CONSULTATIE; codmedic)
R7 JONCIUNE(R7, CONSULTATIE; nrconsultatie)
R9 SELECIE(R8; dataconsultatie >= 01/02/2006 and
dataconsultatie <= 28/02/2006)
R10 PROIECIE(R9; dataconsultatie)
R11 R5 R10
24. Numele i prenumele medicilor care au consultat pacieni din
Trgovite i Moreni dar nu din Titu;
R1 JONCIUNE(MEDICI, MEDIC_CONSULTATIE;
codmedic)
R2 JONCIUNE(R1, CONSULTATIE; nrconsultatie)
R3 JONCIUNE(R2, PACIENT; codpacient)
R4 SELECIE(R3; localitate = Targoviste)
R5 PROIECIE(R4; numemedic, prenumemedic)
R6 SELECIE(R3; localitate = Moreni)
R7 PROIECIE(R6; numemedic, prenumemedic)
R8 SELECIE(R3; localitate = Titu)
R9 PROIECIE(R8; numemedic, prenumemedic)
R10 R5 R7 R9
67
25. Numele pacienilor consultai de Grecu Anca n luna februarie
2006;
R1 SELECIE(MEDICI; numemedic = Grecu and
prenumemedic =
Anca)
R2 JONCIUNE(R1, MEDIC_CONSULTATIE; codmedic)
R3 JONCIUNE(R2, CONSULTATIE; nrconsultatie)
R4 SELECIE(R3; dataconsultatie >= 01/02/2006 and
dataconsultatie <= 28/02/2006)
R5 JONCIUNE(R4, PACIENT; codpacient)
R6 SELECIE(R5; nume, prenume)
26. Data la care au fost consultai pacienii care au fcut programare n
data de 10.02.2006;
R1 JONCIUNE(PACIENT, PROGRAMARE; codpacient)
R2 SELECIE(R1; dataprogramare = 10/02/2006)
R3 JONCIUNE(R2, CONSULTATIE; nrconsultatie)
R4 PROIECIE(R3; dataconsultatie)
27. Nume pacienilor care au avut programare n data de 10.20.2006 n
intervalul 12-14 i au fost consultai de ctre Grecu Anca.
R1 JONCIUNE(PACIENT, PROGRAMARE; codpacient)
R2 JONCIUNE(R1, CONSULTATIE; nrconsultatie)
R3 JONCIUNE(R2, MEDIC_CONSULTATIE; nrconsultatie)
R4 JONCIUNE(R3, MEDICI; codmedic)
R5 SELECIE(R4; dataprogramare = 10/02/2006)
R6 SELECIE(R5; oraprogramare >= 12 and oraprogramare
<=16)
R7 SELECIE(R6; numemedic = Grecu and prenume
Anca)
R8 PROIECIE(R7; nume, prenume)
BIBLIOGRAFIE SELECTIV
1. Michael Hernandez Proiectarea bazelor de date, Editura Teora,
Bucureti, 2003
2. Mariana Miloescu Baze de date n Visual FoxPro, Editura Teora,
2003
3. Marin Fotache, Proiectarea bazelor de date, Editura Polirom, Iai, 2005
4. Grupul BDASEIG, Baze de date. Fundamente teoretice i practice,
Editura Infomega, Bucureti, 2002
5. Florin Radu, Baze de date, Editura Bibliotheca, Trgovite, 2007
68
M.3. LIMBAJUL DE INTEROGARE
RELAIONAL SQL.
1. Cuprins
2. Obiectiv general
3. Obiective operaionale
4. Dezvoltarea temei
5. Bibliografie selectiv
Cuprins
UI.7. Prezentare general; Elemente de baz ale interogrilor
SQL;
= 0,5 ore
UI.8. Coloane expresii; Opiunea ORDER BY;
= 0,5 ore
UI.9. Operatorii LIKE, BETWEEN, IN;
= 2 ore
UI.10. Theta i echijonciunea;
= 3 ore
UI.11. Sinonime locale i jonciunea unei tabele cu ea nsi;
= 1 ore
UI.12. Subconsultri;
= 2 ore
UI.13. Funcii agregat: COUNT, SUM, AVG, MIN i MAX);
= 2 ore
UI.14. Gruparea tuplurilor: clauza GROUP BY i clauza
HAVING
= 1 ore
69
Obiectiv general: Dobndirea cunotinelor fundamentale
privind limbajul relaional de interogare SQL
Obiective operaionale: nsuirea cunotinelor privind
elementele de baz ale SQL, modul de operare al unei fraze SELECT
impreun cu clauzele obligatorii i cele opionale: FROM, WHERE,
ORDER BY, GROUP BY sau HAVING
70
UNITATEA DE NVARE 7
PREZENTARE GENERAL; ELEMENTE DE BAZ ALE
INTEROGRILOR
7.1. Prezentare general
n prezent SQL (Structured Query Language) este unul dintre cele mai
puternice limbaje structurate pentru interogarea bazelor de date relaionale.
Literele S de la Structured (structurat) i L de la Language (limbaj) sunt destul de
sugestive, n schimb, litera Q de la Query (interogare), dac este analizat din
punct de vedere literal, poate provoca unele confuzii n sensul c se limiteaz doar
la a pune ntrebri bazei de date. Din fericire, SQL face mult mai mult dect att:
se pot crea tabele, se adaug, se modific sau se terg date, se combin i se
memoreaz interogrile n cadrul bazei de date.
Istoria SQL ncepe n laboratoarele firmei IBM, unde limbajul a fost
dezvoltat n ultimii ani ai deceniului 8, odat cu lansarea proiectului System/R.
Dei este uor accesibil utilizatorilor nceptori, el nu rmne dator nici
programatorilor experimentai, punndu-le la dispoziie faciliti deosebite.
Datorit puterii sale relaionale, a uurinei n nelegere i utilizare, SQL a
fost ales de ANSI (American National Standards Organization Organizaia
pentru Standarde Naionale Americane) i apoi de ctre ISO (International
Standards Organization Organizaia pentru Standarde Internaionale) drept
limbaj standard pentru lucru cu baze de date relaionale.
Pe parcursul 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 vzut mai degrab prin ce dect prin cum, n sensul c nu se
specific dect ce informaie este solicitat i nu cum este obinut aceast
informaie.
SQL poate fi utilizat autonom (manipularea interactiv a bazei de date) sau
poate fi utilizat prin inserare de comenzi SQL ntr-un limbaj de programare.
71
Instruciunile SQL n funcie de rolul avut n manipularea datelor i a
tranzaciilor se pot grupa astfel:
instruciuni pentru definirea datelor care asigura descrierea structurii
bazei de date;
instruciuni de manipulare a datelor ce au ca scop adugarea,
modificarea i tergerea nregistrrilor;
instruciuni de selecie a datelor care permit consultarea bazei de date;
instruciuni de procesare a tranzaciilor ce reprezint operaii multiple
de manipulare a datelor;
instruciuni de control al cursorului;
instruciuni privind controlul accesului la date.
Exist trei metode de baz privind implementarea limbajului SQL:
prin apelare direct (Direct Invocation) care presupune introducerea
instruciunilor SQL direct de la prompter;
metoda modular (Modul Language) care folosete proceduri apelate de
programele aplicaiei;
metoda de tip ncapsulat (Embedded SQL) care permite ncapsularea
instruciunilor n codul de program.
7.2. Elemente de baz ale interogrilor SQL
Modalitatea prin care, pornind de la o schem relaional, pot fi obinute
diverse informaii dintr-o baz de date se numete interogare (QUERY), iar
formularea unei interogri nseamn redactarea unei fraze SELECT.
Termenul de interogare este oarecum impropriu. O interogare SQL nu este
neaprat o ntrebare pus bazei de date. Ea poate fi i o comand pentru
executarea uneia din aciunile urmtoare:
- s construiasc sau s tearg o baz de date;
- s insereze, s modifice sau s tearg linii sau cmpuri;
- s caute n cteva tabele o anumit informaie i s returneze rezultatele
ntr-o anumit ordine;
- s modifice securitatea informaiilor.
O fraz SELECT are un format simplu i flexibil. Cele trei clauze
principale sunt SELECT, FROM i WHERE dintre care doar primele dou sunt
obligatorii.
F
F
72
Sintaxa oarecum simplificat a unei interogri SQL este urmtoarea:
SELECT [ALL/DISTINCT/] lista_atribute
FROM nume-tabele
[WHERE criteriu_de_cutare]
[GROUP BY atribut_de_grupare]
[HAVING criteriu_de_grupare]
[ORDER BY criteriu_de_ordonare [ASC/DESC]];
unde:
lista_atribute - specific atributele ale cror valori vor fi returnate
nume-tabele - specific tabelele din care se vor extrage datele
ALL - specific returnarea tuturor tuplurilor care
ndeplinesc condiiile precizate n blocul de cerere
DISTINCT - elimin tuplurile care prezint valori duplicate
coninute n atributele specificate
WHERE - permite, prin precizarea unei expresii, exprimarea
criteriului de selecie
ORDER BY - precizeaz atributul dup care se va face ordonarea
GROUP BY - folosit pentru a partiiona o relaie n grupuri,
acordnd acestora valori pe un atribut sau list de
atribute
HAVING - folosit pentru a specifica criterii de selecie pe
grupuri de tupluri
n continuare este realizat o paralel ntre clauzele principale ale frazei
SELECT cu operatorii algebrei relaionale prezentai n capitolul 3 Algebra
relaional.
Selecie i proiecie
Clauza SELECT n algebra relaional corespunde operatorului proiecie,
ea fiind folosit pentru a desemna care sunt coloanele care vor aprea n rezultat.
Clauza FROM este folosit pentru a enumera tabelele (relaiile) din care vor fi
extrase informaiile aferente consultrii. Prin clauze WHERE este desemnat
predicatul selectiv al algebrei relaionale, ce se aplic atributelor din relaiile care
apar n clauza FROM.
O consultare simpl n SQL, la modul cel mai general i simplist, poate fi
prezentat astfel:
F
73
SELECT C1, C2, ..., Cn
FROM T1, T2, ..., Tm
WHERE P
Rezultatul unei astfel de fraze SQL se prezint sub o form tabelar.
Aceast form poate fi o list (text), o tabel propriu-zis sau o tabel temporar,
dar i o tabel derivat (imagine). Sunt i cazuri n care rezultatul poate fi obinut
i ca o variabil masiv (tablou).
Ci reprezint coloanele (care pot fi atribute sau expresii de atribute -
rezultat);
Tj tabelele ce trebuie parcurse pentru obinerea rezultatului;
P predicatul (condiia) simplu sau compus ce trebuie ndeplinit de tupluri
pentru a putea fi incluse n rezultat.
Atunci cnd clauza WHERE nu este prezent, se consider n mod implicit
c valoarea logic a predicatului P este adevrat i n consecin, toate liniile
din tabela sau produsul cartezian al tabelelor specificat/specificate n clauza
FROM vor fi incluse n rezultat.
Dac n locul coloanelor C1, C2, ..., Cn, apare simbolul *
(asterisc), rezultatul va fi format din toate atributele tabelelor specificate n clauza
FROM. De asemenea, numele atributelor rezultatului sunt numele atributelor din
tabela (tabelele) specificat n FROM. Dac se dorete schimbarea acestui nume
rezultat se apeleaz la clauza AS.
Conform restriciei de unicitate, ntr-o relaie nu pot exista dou linii
identice. n schimb, n SQL, tabela obinut dintr-o consultare poate conine dou
sau mai multe tupluri identice.
Spre deosebire de algebra relaional, unde tuplurile identice (dublurile)
sunt eliminate automat din rezultat, n SQL nu se ntmpl acelai lucru. Pentru
aceasta este necesar folosirea opiunii DISTINCT.
SELECT DISTINCT C1, C2, ..., Cn
FROM T1, T2, ..., Tm
WHERE P
Din cele prezentate pn acum se poate trage concluzia c o fraz SELECT
corespunde:
- unei proiecii (SELECT C1),
- unui produs cartezian (FROM R1 R2 ... Rm),
- unei selecii algebrice (WHERE P).
74
i conduce la obinerea unui rezultat cu n coloane, fiecare coloan fiind un
atribut din T1, T2, ..., Tm sau expresie calculat pe baza unor atribute din
T1, T2, ..., Tm.
n continuare vom transpune n SQL, cteva interogri din algebra
relaional.
Exemplul 1. Selecie
SELECT *
FROM R1
WHERE C1>500
Exemplul 2. Selecie
SELECT *
FROM R1
WHERE C3>250 AND C3<=350
Exemplul 3. Selecie
SELECT *
FROM R1
WHERE C1>300 AND C3>300
Exemplul 4. Care sunt studenii Facultii de tiine Economice?
SELECT *
FROM STUDENT
WHERE facultate = Stiinte Economice
Exemplul 5. Care sunt studenii Facultii de tiine Economice,
specializarea Contabilitate i Informatic de Gestiune?
SELECT *
FROM STUDENT
WHERE facultate = Stiinte Economice AND
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 BURSA
WHERE data_ncasarii>=2004/02/01 AND
data_ncasarii<=2004/02/29
n Visual FoxPro aceeai interogare este de forma:
75
SELECT *;
FROM BURSA;
WHERE data_ncasarii>={^2004/02/01} AND;
data_ncasarii<={^2004/02/29}
Observaie: n Visual Foxpro caracterul ; este folosit pentru a specifica
faptul c o comand este scris pe mai multe linii.
Exemplul 7. Proiecie
SELECT C3
FROM R1
Exemplul 8. Proiecie
SELECT C1, C3
FROM R1
Exemplul 9. Care sunt facultile preluate n baz?
SELECT facultate
FROM STUDENT
SQL, spre deosebire de algebra relaional, nu elimin automat
duplicatele. Tabela obinut prin consultarea de mai sus are forma tabelei R
(figura 3.13.). Pentru a obine rezultatul de forma tabelei R (o facultate s apar o
singur dat), se folosete clauza DISTINCT.
Exemplu 10. Care sunt: cota, titlul, domeniul i numr de exemplare al
fiecrei cri?
SELECT cota_carte, titlu, domeniu, nr_exemplare
FROM CARTE
n acest caz nu este necesar clauza DISTINCT, deoarece cota_carte
este cheia primar a tabelei CARTE.
Exemplul 11. Care este facultatea pe care o urmeaz studentul Barbu
Costel?
SELECT facultate
FROM STUDENT
WHERE nume = Barbu Costel
Exemplul 12. Care sunt regiunile din care fac parte judeele Dmbovia i
Vlcea?
76
SELECT judet, regiune
FROM LOCALITATE
WHERE judet = Dambovita OR JUDE = Valcea
Exemplul 13. Care sunt studenii Facultii de tiine Economice de la
specializrile CIG i FA?
SELECT nume, sectia
FROM STUDENT
WHERE facultate = Stiinte Economice AND sectia =
CIG OR sectia = FA
Exemplul 14. Care sunt crile care au aprut la editurile Eficient i
Macarie?
SELECT titlu
FROM CARTE
WHERE editura = Eficient OR editura = Macarie
Reuniune, intersecie, diferen, produs cartezian
Primii trei operatori asambliti prezint operatori SQL dedicai: UNION,
INTERSECT, MINUS (EXTRACT) n timp ce produsul cartezian se obine
automat prin simpla enumerare a celor dou tabele n clauza FROM.
Reuniunea
Un rezultat identic cu tabela R3 din figura 3.2., se obine prin urmtoarea
fraz SELECT:
SELECT *
FROM R1
UNION
SELECT *
FROM R2
Revenind la exemplul 13 din capitolul 3 - Care sunt studenii Facultii de
tiine Economice de la specializrile CIG i FA? -, fraza SQL echivalent cu
soluia 2 bazat pe reuniune este:
SELECT nume
FROM STUDENT
WHERE facultate = Stiinte Economice AND sectia =
CIG
UNION
SELECT nume
FROM STUDENT
WHERE facultate = Stiinte Economice AND sectia =
FA
F
77
Intersecia
Raportndu-ne la exemplul din figura 33. , echivalentul tabelei R4 se
obine n SQL prin:
SELECT *
FROM R1
INTERSECT
SELECT *
FROM R2
Pentru o prim reprezentare a utilizrii interseciei, transcriem soluia din
algebra relaional formulat la exemplul 14 - Care sunt crile care au aprut la
editurile Eficient i Macarie?
SELECT titlu
FROM CARTE
WHERE editura = Eficient
INTERSECT
SELECT tilu
FROM CARTE
WHERE editura = Macarie
Exemplul de mai sus funcioneaz n Oracle, nu ns i n Visual FoxPro,
care nu are implementat operatorul INTERSECT, astfel nct intersecia trebuie
realizat folosind alte clauze i operatori.
Diferena
Operatorul la care ne-am atepta n acest caz ar fi MINUS. n Standardul
SQL 92 i n alte cteva SGBD-uri operatorul MINUS nu exist, el fiind
substituit de EXCEPT, n timp ce n alte SGBD-uri nu exist nici unul, nici altul.
Tabela R5 din figura 3.4., calculat prin expresia R1 R2, n SQL se obine prin
interogarea:
SELECT *
FROM R1
EXCEPT
SELECT *
FROM R2
Ca i pentru INTERSECT, Visual FoxPro nu are implementat un operator
SQL pentru realizarea diferenei a dou relaii.
Avnd n vedere faptul c intersecia nu este un operator fundamental,
fraza SELECT ce realizeaz intersecia se poate formula cu ajutorul diferenei
astfel:
F
F
78
SELECT *
FROM R1
EXCEPT
(SELECT *
FROM R1
EXCEPT
SELECT *
FROM R2)
Produsul cartezian
SQL nu pune la dispoziie vreun operator special dedicat produsului
cartezian i asta din simplul motiv c nici nu este nevoie s o fac. Tabela R6 din
figura 3.5., se obine pur i simplu prin enumerarea celor dou relaii n clauza
FROM.
SELECT *
FROM R1, R2
F
79
UNITATEA DE NVARE
COLOANE EXPRESII; OPIUNEA ORDER BY
8.1. Coloane expresii
n multe interogri SQL o facilitate important o constituie definirea, pe
lng atributele tabelelor, a unor coloane noi (virtuale), pe baza unor expresii.
Clauza AS permite denumirea coloanelor calculate sau redenumirea unor coloane
ale tabelelor.
S lum urmtorul exemplu:
Care este suma cheltuit cu achiziionarea crii Informatic de
gestiune?
SELECT titlu, pret_unitar, nr_exemplare,
pret_unitar*nr_exemplare AS suma
FROM CARTE
WHERE titlu = Informatica de gestiune
A patra coloan este denumit suma, dup cum a fost specificat n clauza
AS. Valorile sale sunt determinate pe baza expresiei
pret_unitar*nr_exemplare.
Un alt tip de expresii este cel bazat pe concatenare, adic pe alipirea mai
multor constante i variabile ntr-o coloan nou. Operatorul SQL pentru
concatenare este alctuit din dou bare verticale (||). Spre exemplu, interogarea
urmtoare produce rezultatul din figura 4.2. .
SELECT Judeul || judet || se afl n ||
regiune AS exemplu_concatenare
FROM LOCALITATE
Unele SGBD-uri, precum Visual FoxPro, nu au implementat acest
operator, folosind n acest scop unul specific (n cazul VFP este +).
SELECT DISTINCT "Judetul " + ALLTRIM(judet)+;
" se afla n " + regiune AS;
exemplu_concatenare FROM LOCALITATE
S-a folosit funcia ALLTRIM() pentru a elimina toate spaiile goale din
judet. Visual FoxPro folosete pentru conversia valorilor din numeric n ir de
caractere funcia STR(), iar din dat calendaristic, dup caz, DTOC() sau
DTOS():
80
SELECT ALLTRIM(Nume) + cu numrul matricol ;
+ ALLTRIM(STR (nr_matricol)) + s-a nscut;
n data + ALLTRIM(DTOC(data_nasterii));
AS exemplu_concatenare;
FROM STUDENT
n ceea ce privete expresiile de tip dat calendaristic, modurile n care au
fost implementate aceste funciuni sunt foarte eterogene de la SGBD la SGBD.
S presupunem c orice carte mprumutat trebuie restituit n maximum
10 zile.
Visual Fox Pro permite formularea unei soluii simple. data_imprumut
fiind un atribut de tip DATE, se consider implicit dac adunm 10, c acest 10
reprezint numrul de zile.
SELECT cota_carte, data_imprumut, ;
data_imprumut + 10 AS data_restituire ;
FROM STUDCARTE
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 operaiunile de adunare i scdere ntre
dou date calendaristice, s lum exemplul n care ne intereseaz intervalul dintre
momentul curent (data curent) i momentul mprumutrii fiecrei cri:
Interogarea n Visual Fox Pro n acest caz este:
SELECT cota_carte, data_imprumut, DATE() ;
data_imprumut AS timp_scurs ;
Rezultatul scderii a dou date calendaristice este un numeric care
reprezint numrul de zile dintre cele dou date.
8.2. Opiunea ORDER BY
Una din caracteristicile modelului relaional este faptul c din punct de
vedere informaional, nici ordinea atributelor, nici ordinea liniilor n relaii nu
prezint importan. Cu toate acestea, n practic forma de prezentare a
rezultatelor interogrii este foarte important. Spre exemplu o list a tuturor
F
81
localitilor este cu mult mai folositoare dac este prezentat n ordine alfabetic,
posibil prin clauza ORDER BY.
S se obin lista localitilor n ordine alfabetic.
SELECT *
FROM LOCALITATE
ORDER BY nume_localitate
Implicit aranjarea se face cresctor (ASC). Prin opiunea DESC, ordinea
prezentrii se inverseaz. n plus se pot specifica mai multe coloane care s
serveasc drept criterii suplimentare de ordonare. La valori egale ale primului
atribut, intr n aciune criteriul de balotaj care este al doilea atribut .a.m.d.
S se obin n ordinea descresctoare a editurilor i cresctoare a
titlurilor, lista crilor din bibliotec.
SELECT cota_carte, titlu, editura
FROM CARTE
ORDER BY editura DESC, titlu ASC
82
UNITATEA DE NVARE 9
OPERATORII BETWEEN, LIKE, IN
Pentru formularea predicatului de selecie, SQL permite utilizarea, pe
lng clasicii >, , <, , =, i a altor operatori, dintre care noi ne vom opri
doar asupra lui BETWEEN (ntre, cuprins ntre), LIKE (ca i, la fel ca) i IN (n).
9.1. Operatorul BETWEEN
Este util pentru definirea intervalelor de valori.
Care sunt studenii care s-au nscut n anul 1982.
n Visual Fox Pro constantele de tip dat calendaristic trebuie ncadrate
ntre acolade.
SELECT * ;
FROM STUDENT ;
WHERE data_nasterii BETWEEN {^1982/01/01} ;
and {^1982/12/31}
Soluia la exemplul de mai sus, n condiiile n care nu se folosea
BETWEEN, ar fi folosit n clauza WHERE, o condiie compus.
SELECT * ;
FROM STUDENT ;
WHERE data_naterii > = {^1982/01/01} ;
AND data_naterii < = {^1982/12/31}
S se obin n ordinea apariiei, lista crilor din bibliotec cu numrul
de exemplare cuprins ntre 50 i 100.
SELECT titlu, an_aparitie, nr_exemplare
FROM CARTE
WHERE nr_exemplare BETWEEN 50 AND 100
ORDER BY an_aparitie
Soluia fr BETWEEN:
SELECT titlu, an_aparitie, nr_exemplare
FROM CARTE
WHERE nr_exemplare >= 50
AND nr_exemplare <= 100
ORDER BY an_aparitie
S se obin n ordinea descresctoare a judeelor, lista localitilor cu
indicativul judeului cuprins ntre DB (Dmbovia) i VL (Vlcea).
F
83
SELECT cod_judet, nume_localitate,
cod_localitate
FROM LOCALITATE
WHERE cod_judet BETWEEN DB AND VL
ORDER BY cod_judet DESC
Varianta fr BETWEEN:
SELECT cod_judet, nume, cod_localitate
FROM LOCALITATE
WHERE cod_judet > = DB
AND cod_judet < = VL
ORDER BY cod_judet DESC
9.2. Operatorul LIKE
De multe ori, cnd se dorete obinerea unor informaii din baz suntem
pui n postura de a nu ti cu exactitate cum se numete un student sau o carte.
Acestea sunt situaiile pentru a cror rezolvare a fost gndit operatorul LIKE.
Operatorul LIKE permite compararea unui atribut (expresii) cu un literal
utiliznd o masc construit cu ajutorul specificatorilor multipli % sau _ .
Procentul (%) substituie un ir de lungime variabil, 0-n caractere, n timp ce
liniua (_) substituie un singur caracter.
Care sunt crile din bibliotec care ncep cu litera C?.
SELECT *
FROM CARTE
WHERE titlu LIKE C%
Varianta fr LIKE (n VFP):
SELECT * ;
FROM CARTE ;
WHERE LEFT(titlu,1)='C'
S-a folosit funcia LEFT() pentru a extrage prima liter din titlu.
Ce cri au titlul coninnd litera l pe a treia poziie?
SELECT *
FROM CARTE
WHERE titlu LIKE __l%
Dac exist cri al cror titlu conine litera L majuscul pe a treia
poziie, acestea nu sunt extrase n rezultat. Pentru siguran, n asemenea situaii,
soluia este:
F
84
SELECT *
FROM CARTE
WHERE titlu LIKE __l% OR titlu LIKE __L%
Varianta fr LIKE (n VFP)::
SELECT * ;
FROM CARTE ;
WHERE SUBSTR(titlu,3,1)='l' OR ;
SUBSTR(titlu,3,1)='L'
S-a folosit funcia SUBSTR() pentru a extrage un subir (litera L) dintr-un
ir (titlu)
Titlul cror cri se termin n literele te?
SELECT *
FROM CARTE
WHERE titlu LIKE %te
Varianta fr LIKE (n VFP):
SELECT * ;
FROM CARTE ;
WHERE RIGHT(ALLTRIM(titlu),2)=te
Observm folosirea funcie RIGHT() pentru a extrage caracterele din
dreapta n combinaie cu funcia ALLTRIM().
9.3. Operatorul IN
Atunci cnd se testeaz dac valoarea unui atribut este ncadrabil ntr-o
list dat de valori, n locul folosirii abundente a operatorului OR, o soluie mult
mai elegant este s se fac apel la operatorul IN.
Formatul general este:
expresie1 IN (expresie2, expresie3, ...)
Rezultatul evalurii unui predicat ce conine acest operator va fi adevrat
dac valoarea expresiei1 este cel puin egal cu una dintre valorile
expresie2, expresie3, ....
Care sunt studenii care urmeaz specializrile CIG, MG i MK?
- fr operatorul IN
SELECT *
FROM STUDENT
WHERE sectia = CIG OR sectia = MG
F
85
OR sectia = MK
- cu operatorul IN
SELECT *
FROM STUDENT
WHERE sectia IN (CIG, MG, MK)
- o variant VFP:
SELECT * ;
FROM STUDENT ;
WHERE INLIST(sectia, CIG, MG, MK)
Care sunt crile care au aprut n anii 1999, 2001 i 2002?
- fr operatorul IN
SELECT *
FROM CARTE
WHERE an_aparitie=1999 OR an_aparitie=2001
or an_aparitie=2002
- cu operatorul IN
SELECT *
FROM CARTE
WHERE an_aparitie IN (1999, 2001, 2002)
- o variant VFP:
SELECT * ;
FROM CARTE ;
WHERE INLIST(an_aparitie, 1999, 2001, 2002)
Ce burse s-au ncasat pe 16, 18 i 20 februarie 2004?
- fr operatorul IN
SELECT *
FROM BURSA
WHERE data_incasarii = {^2004/02/16}
OR data_incasarii = {^2004/02/18}
OR data_incasarii = {^2004/02/20}
- cu operatorul IN
SELECT *
FROM BURSA
WHERE 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 NVARE 10
THETA I ECHIJONCIUNEA
Dintre tipurile de jonciuni, vom insista n aceast subcapitol asupra theta
jonciunii i echijonciunii. SQL nu prezint clauze sau operatori speciali pentru
jonciune, ns dup cum am vzut, jonciunea se constituie ca o combinaie ntre
produs cartezian i selecie.
Exemplul 15 al algebrei relaionale pentru theta joncionarea relaiilor R1
i R2 (figura3.19.), se scrie:
SELECT *
FROM R1, R2
WHERE R1.C1 > R2.C5
iar pentru echijonciunea din exemplul 16 (figura 3.20.):
SELECT *
FROM R1, R2
WHERE R1.C1 = R2.C5
Jonciunea natural poate fi realizat numai prin specificarea numelor
atributelor n clauza SELECT a frazei de interogare. n standardul SQL-92 i n
implementrile SQL ale multor SGBD-uri se poate folosi o variant mai elegant,
innd seama i de faptul c tot ce nseamn theta- i echijonciune reprezint
pentru SQL, INNER JOIN (jonciune intern).
Prin urmare, cele dou soluii de mai sus pot fi rescrise, dup cum
urmeaz:
SELECT *
FROM R1 INNER JOIN R2 ON R1.C1 > R2.C5,
respectiv
SELECT *
FROM R1 INNER JOIN R2 ON R1.C1 = R2.C3.
Relum, pentru comparaie, exemplele din algebra relaional.
Exemplul 19. S se afle numele, facultatea i secia studenilor care stau
la cminul Miclas?.
- varianta 1 (general):
SELECT NUME, facultate, sectia,
STUDCAMIN.nume_camin
FROM STUDENT, STUDCAMIN
WHERE STUDENT.nr_matricol =
STUDCAMIN.nr_matricol AND
STUDCAMIN.nume_camin = Miclas
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 cnd cmpul exist n
dou sau mai multe dintre tabelele enumerate n clauza FROM.
Exemplul 20. Care sunt crile scrise de Victor Stanciu?
- varianta 1 (general):
SELECT titlu, AUTOR.nume_autor
FROM AUTOR, AUTORCARTE, CARTE
WHERE AUTOR.cod_autor =
AUTORCARTE.cod_autor AND
AUTORCARTE.cota_carte = CARTE.cota_carte
AND nume_autor = Victor Stanciu
- varianta 2 (Visual Fox Pro):
SELECT titlu, AUTOR.nume_autor ;
FROM AUTOR INNER JOIN AUTORCARTE ON ;
AUTOR.cod_autor = AUTORCARTE.cod_autor ;
INNER JOIN CARTE ON AUTORCARTE.cota_carte = ;
CARTE.cota_carte ;
WHERE nume_autor = Niculae Feleag
Exemplul 21. Numele studenilor care au mprumutat cri din domeniul
Informatic.
- varianta 1 (general):
SELECT nume
FROM CARTE, STUDCARTE, STUDENT
WHERE CARTE.cota_carte = STUDCARTE.cota_carte AND
STUDCARTE.nr_matricol = STUDENT.nr_matricol AND
domeniu = Informatica
- varianta 2 (Visual Fox Pro):
SELECT nume ;
FROM CARTE INNER JOIN STUDCARTE ON ;
CARTE.cota_carte = STUDCARTE.cota_carte ;
INNER JOIN STUDENT ON STUDCARTE.nr_matricol = ;
STUDENT.nr_matricol ;
WHERE domeniu = Informatica
Exemplul 22. Numele i secia studenilor Facultii de tiine Economice
care au mprumutat cartea Informatica de gestiune n februarie 2004?.
- varianta 1 (general):
SELECT nume, sectia
FROM CARTE, STUDCARTE, STUDENT
89
WHERE CARTE.cota_carte = STUDCARTE.cota_carte AND
STUDCARTE.nr_matricol = STUDENT.nr_matricol AND
titlu = Informatica de gestiune AND facultate =
Stiinte Economice AND data_imprumut BETWEEN
01/02/2004 AND 29/02/2004
- varianta 2 (Visual Fox Pro):
SELECT nume, sectia
FROM CARTE INNER JOIN STUDCARTE ON
CARTE.cota_carte = STUDCARTE.cota_carte INNER JOIN
STUDENT ON STUDCARTE.nr_matricol =
STUDENT.nr_matricol
WHERE titlu = Informatica de gestiune AND
facultate = Stiinte Economice AND data_imprumut
BETWEEN {^2004/02/01} AND {^2004/02/29}
Exemplul 23. De la ce secii sunt studenii care au mprumutat i cartea
Informatic de gestiune i Contabilitate general?
- soluia 1 - varianta 1 (nu funcioneaz n Visual Fox Pro):
SELECT DISTINCT sectia
FROM STUDENT, STUDCARTE, CARTE
WHERE STUDENT.nr_matricol = STUDCARTE.nr_matricol
AND STUDCARTE.cota_carte = CARTE.cota_carte AND
titlu = Informatica de gestiune
INTERSECT
SELECT sectia
FROM STUDENT, STUDCARTE, CARTE
WHERE STUDENT.nr_matricol = STUDCARTE.nr_matricol
AND STUDCARTE.cota_carte = CARTE.cota_carte AND
titlu = Contabilitate generala
- soluia 1 - varianta 2 (SQL - 92):
SELECT DISTINCT sectia
FROM STUDENT INNER JOIN STUDCARTE ON
STUDENT.nr_matricol = STUDCARTE.nr_matricol INNER
JOIN CARTE ON STUDCARTE.cota_carte =
CARTE.cota_carte
WHERE titlu = Informatica de gestiune
INTERSECT
SELECT DISTINCT sectia
FROM STUDENT INNER JOIN STUDCARTE ON
STUDENT.nr_matricol = STUDCARTE.nr_matricol INNER
JOIN CARTE ON STUDCARTE.cota_carte =
CARTE.cota_carte
WHERE titlu = Contabilitate generala
De notat folosirea clauzei DISTINCT pentru eliminarea eventualelor
dubluri. Pentru variantele soluiei 2 vom avea nevoie de ceea ce se numete
jonciunea unei tabele cu ea nsi, care va fi prezentat n subcapitolul urmtor.
90
UNITATEA DE NVARE 11
SINONIME LOCALE I JONCIUNEA UNEI TABELE CU EA NSI
Lucrul cu nume lungi de tabele (STUDCARTE) i atribute
(cod_localitate) prezint marele avantaj al lejeritii la citire i nelegeri
rapide a logicii de derulare a interogrii. n schimb, destul de muli informaticieni
nu agreaz risipa de caractere (i, implicit de timp) implicat de redactrile
presupuse de folosirea numelor lungi.
Pentru aceasta n frazele SELECT, tabelelor li pot asocia sinonime sau
aliasuri mai scurte. Pentru exemplificare, ultima interogare se poate rescrie astfel:
SELECT DISTINCT nume_camin
FROM STUDENT S, STUDCARTE S1, CARTE C, STUDCAMIN S2
WHERE
S.nr_matricol = S2.nr_matricol AND
S.nr_matricol = S1.nr_matricol AND
S1.cota_carte = C.cota_carte AND
titlu = Informatic de gestiune
INTERSECT
................................................................................................
Tabelei STUDENT i s-a asociat sinonimul S, STUDCARTE S1, CARTE
C, iar pentru STUDCAMIN S2. Sinonimele prefixeaz (atunci cnd este cazul)
numele atributelor din clauzele SELECT i WHERE (eventual ORDER BY i
GROUP BY).
O operaie n care obligatoriu trebuie folosite sinonimele este joncionarea
unei tabele cu ea nsi.
Revenim la exemplul 25 din algebra relaional.
Ce studeni studiaz la aceeai secie cu Dinescu Monica?
SELECT S2.nume
FROM STUDENT S1, STUDENT S2
WHERE S1.sectia = S2.sectia AND S1.nume = Dinescu
Monica
Jonciunea unei tabele cu ea nsi presupune, de fapt, jonciunea a dou
instane ale tabelei respective. Rezultatul jonciunii S1 cu S2 este o tabel
intermediar, asupra creia se aplic predicatul de selecie suplimentar S1.nume
= Dinescu Monica.
O alt variant se prezint astfel:
F
91
SELECT S2.nume
FROM STUDENT S1 INNER JOIN STUDENT S2 ON S1.sectia
= S2.sectia
WHERE S1.nume = Dinescu Monica
Am rmas datori cu formularea soluiei 2 din algebra relaional de la
exemplul 22:
De la ce secii sunt studenii care au mprumutat i cartea Informatic de
gestiune i Contabilitate general?
Joncionm o instan obinut prin jonciunea STUDENT-STUDCARTE-
CARTE (n care titlu = Informatica de gestiune) cu o alt
instan a aceleiai combinaii (n care titlu = Contabilitate
general)
- soluia 2 varianta 1 (general):
SELECT DISTINCT S1.sectia
FROM STUDENT S1, STUDCARTE SC1, CARTE C1, STUDENT
S2, STUDCARTE SC2, CARTE C2
WHERE
S1.nr_matricol = SC1.nr_matricol AND
SC1.cota_carte = C1.cota_carte AND
C1.titlu = Informatica de gestiune AND
S2.nr_matricol = SC2.nr_matricol AND
SC2.cota_carte = C2.cota_carte AND
C2.titlu = Contabilitate general AND
S1.sectia = S2.sectia
- soluia 2 varianta 2 (Visual Fox Pro):
SELECT DISTINCT S1.sectia
FROM CARTE C1
INNER JOIN STUDCARTE SC1 ON
C1.cota_carte = SC1.cota_carte
INNER JOIN STUDENT S1 ON SC1.nr_matricol
= S1.nr_matricol
INNER JOIN STUDENT S2 ON S1.sectia = S2.
sectia
INNER JOIN STUDCARTE SC2 ON
SC2.nr_matricol = S2.nr_matricol
INNER JOIN CARTE C2 ON SC2.cota_carte =
C2.cota_carte
WHERE
C1.titlu = Informatica de gestiune AND
C2. titlu = Contabilitate generala
92
UNITATEA DE NVARE 12
SUBCONSULTRI
Una dintre cele mai importante faciliti oferite de SQL const n
includerea unei consultri n alta, pe dou sau mai multe niveluri cu alte cuvinte,
utilizarea subconsultrilor. Prin aceste subconsultri se obin tabele temporare
intermediare ce vor fi folosite drept argumente n frazele SELECT superioare.
n materie de subconsultri, cel mai utilizat operator este IN, pe care deja
l-am ntlnit n capitolul precedent, dar ntr-o cu totul alt ipostaz testarea
ncadrrii valorii unui atribut ntr-o list de constante.
Revenim la exemplul din algebra relaional: Ce studeni studiaz la
aceeai secie cu Dinescu Monica?
SELECT nume
FROM STUDENT
WHERE sectia IN
(SELECT sectia
FROM STUDENT
WHERE nume = Dinescu Monica)
n cazul acestei interogri, execuia se realizeaz n doi timpi. Mai nti se
execut subconsultarea
SELECT sectia
FROM STUDENT
WHERE nume = Dinescu Monica
obinndu-se o tabel intermediar ce conine o singur linie (pe care apare CIG)
i o singur coloan (sectia).
n cel de-al doilea pas sunt selectate liniile tabelei STUDENT care
ndeplinesc condiia secia = CIG
Observm c n rezultat a fost inclus i studentul de referin Dinescu
Monica. Dac se dorete excluderea din rezultat a acestui student, fraza SELECT
se modific astfel:
SELECT nume
FROM STUDENT
WHERE sectia IN
(SELECT sectia
FROM STUDENT
WHERE nume = Dinescu Monica)
AND nume < > Dinescu Monica
Ce studeni studiaz la alte secii dect Dinescu Monica?
F
93
SELECT nume
FROM STUDENT
WHERE sectia NOT IN
(SELECT sectia
FROM STUDENT
WHERE nume = Dinescu Monica)
n ce cmin sunt cazai studenii care studiaz la aceeai secie cu
Dinescu Monica?
SELECT DISTINCT nume_camin
FROM STUDCAMIN
WHERE nr_matricol IN
(SELECT nr_matricol
FROM STUDENT
WHERE sectia IN
SELECT sectia
FROM STUDENT
WHERE nume = Dinescu Monica))
Rezultatul este obinut prin folosirea a trei niveluri de interogare (fraza
principal, o subconsultare i o sub-subconsultare).
n Visual Fox Pro aceast ultim interogare face simit prezena uneia
dintre cele mai serioase limitri SQL maxim 2 niveluri de consultare (fraza
principal i o interogare subordonat). Mesajul de eroare are numrul 1842: SQL:
Subquery nesting in too deep.
Astfel, pentru a rspunde la ntrebare, soluia de interogare trebuie
reformulat:
SELECT nume_camin
FROM STUDENT INNER JOIN STUDCAMIN;
ON STUDENT.nr_matricol = STUDCAMIN.nr_matricol;
WHERE sectia IN
(SELECT sectia
FROM STUDENT
WHERE nume = Dinescu Monica)
Din ce judee sunt studenii care au mprumutat cri scrise de autori de
naionalitate romn?
Am ales acest exemplu pentru a folosi n subconsultri ct mai multe
tabele ale bazei de date
SELECT judet
FROM LOCALITATE
WHERE cod_localitate IN
(SELECT cod_localitate IN
94
FROM STUDENT
WHERE cota_carte IN
(SELECT nr_matricol
FROM STUDCARTE
WHERE cota_carte IN
(SELECT cota_carte
FROM CARTE
WHERE cota_carte IN
(SELECT cota_carte
FROM AUTOR_CARTE
WHERE nume_autor IN
SELECT nume_autor
FROM AUTOR
WHERE natioanlitate = roman)))))
Atunci cnd rezultatul unei subconsultri se concretizeaz ntr-o tabel cu
o singur coloan i o singur linie, corelarea poate fi fcut i cu operatorii de
comparaie obinuii: =, >, >=, <, <=.
n continuare vom ilustra aceast facilitate prin cteva exemple.
Care este cel mai mic pre unitar la care s-a cumprat o carte?
SELECT MIN (pret_unitar) AS maxim
FROM CARTE
Care este cel mai mic pre unitar i care este cartea, respectiv studentul
care a mprumutat cartea cu preul respectiv?
SELECT titlu, pret_unitar, nume
FROM CARTE C, STUDCARTE SC, STUDENT S
WHERE S.nr_matricol = SC.nr_matricol
AND SC.cota_carte=C.cota_carte AND
pret_unitar =(SELECT MIN (pret_unitar)
FROM CARTE)
Care sunt cele mai mari cinci preuri unitare, crile i studenii care au
mprumutat crile care au cele cinci preuri maxime?
SELECT titlu, pret_unitar, nume
FROM STUDENT INNER JOIN STUDCARTE ON
STUDENT.nr_matricol = STUDCARTE.nr_matricol
INNER JOIN CARTE ON STUDCARTE.cota_carte =
CARTE.cota_carte
WHERE pret_unitar >
(SELECT MAX (pret_unitar)
FROM CARTE
WHERE pret_unitar <
(SELECT MAX (pret_unitar)
FROM CARTE
WHERE pret_unitar <
(SELECT MAX (pret_unitar)
FROM CARTE
WHERE pret_unitar <
95
(SELECT MAX (pret_unitar)
FROM CARTE
WHERE pret_unitar <
(SELECT MAX (pret_unitar)
FROM CARTE)))))
ORDER BY pret_unitar DESC
Avnd n vedere nivelurile de interogare, pentru exemplul de mai sus, n
Visual FoxPro nu se poate formula interogarea n aceast form. Avem ns la
ndemn o soluie neverosimil de simpl bazat pe clauza TOP.
SELECT TOP 5 titlu, pret_unitar, nume
FROM STUDENT INNER JOIN STUDCARTE ON
STUDENT.nr_matricol = STUDCARTE.nr_matricol
INNER JOIN CARTE ON STUDCARTE.cota_carte =
CARTE.cota_carte
ORDER BY pret_unitar DESC
Liniile tabelei sunt ordonate descresctor dup preul unitar, iar n rezultatul
final sunt extrase doar primele cinci (prin TOP 5)
96
UNITATEA DE NVARE 13
FUNCII AGREGAT
Formatul general al unei fraze SELECT care conine funcii agregat este:
SELECT funcie 1, ..., funcie 2
FROM lista_tabele
WHERE condiie
Dac n clauza SELECT este prezent o funcie agregat, n lipsa opiunii
ORDER BY, rezultatul va conine o singur linie.
13.1. Funcia COUNT
Funcia COUNT contorizeaz valorile nenule ale unei coloane sau numrul
de linii dintr-un rezultat al interogrii. Cu alte cuvinte, COUNT numr cte valori
diferite de NULL are coloana specificat sau cte linii sunt.
Cte cri sunt n bibliotec?
SELECT COUNT(*) AS Nr_carti
FROM CARTE
Prezena asteriscului ca argument al funciei COUNT are ca efect
numrarea tuturor liniilor tabelei CARTE.
Folosind concatenarea se poate obine un rezultat ceva mai elegant. Spre
exemplu, n Visual Fox Pro fraza se scrie n forma:
SELECT In biblioteca sunt + STR (COUNT (*), 4)
+ carti AS Rezultat
FROM CARTE
Tabela CARTE are cheie primar atributul cota_carte, care nu poate
avea valori nule, de aceea, la fel de corect este i soluia:
SELECT COUNT(cota_carte) AS Nr_carti
FROM CARTE
Cte linii are produsul cartezian al tabelelor STUDENT i STUDCAMIN?
SELECT COUNT(*) AS Produs
FROM STUDENT, STUDCAMIN
Ci studeni urmeaz cursurile Facultii de tiine Economice?
SELECT COUNT(Nr_matricol) AS Nr_studenti
FROM STUDENT
WHERE facultate = Stiinte Economice
F
97
Ci studeni de la Facultatea de tiine Economice sunt bursieri?
SELECT COUNT (*) AS Nr_bursieri
FROM STUDENT S, BURSA B
WHERE S.nr_matricol = B.nr_matricol AND facultate
= Stiinte Economice
Ci studeni stau n cmin?
SELECT COUNT (*) AS Nr_caministi
FROM STUDENT S, STUDCAMIN SC
WHERE S.nr_matricol = SC.nr_matricol
Care este numrul studenilor din Muntenia?
SELECT COUNT (*) AS Nr_studenti
FROM STUDENT S, LOCALITATE L
WHERE S.cod_localitate = L.cod_localitate AND
regiune = Muntenia
Din cte localiti provin studenii?
Tabela LOCALITATE conine i localiti din care nu avem studeni,
pentru moment.
De aceea, n locul soluiei:
SELECT COUNT(cod_localitate) AS Nr_localitati
FROM LOCALITATE
de preferat ar fi folosirea variantei:
SELECT COUNT(cod_localitate) AS Nr_localitati
FROM STUDENT
Problema este c rezultatul obinut (20) este incorect, deoarece funcia
COUNT numr toate valorile nenule. Exist ns o clauz prin care o valoare s
fie luat o singur dat n calcul: DISTINCT. Rezultatul corect (nr.) presupune
urmtoarea variant:
SELECT COUNT(DISTINCT cod_localitate) AS Nr_localitati
FROM STUDENT
13.2. Funcia SUM
SUM este una dintre cele mai utilizate funcii n aplicaiile economice,
deoarece datele financiar-contabile i cele ale evidenei tehnico-operative sunt
preponderent cantitative.
F
98
Ct s-a pltit fr TVA pentru cartea Informatic de gestiune?
SELECT SUM (nr_exemplare*pret_unitar)
AS Val_fara_TVA
FROM CARTE
WHERE titlu = Informatica de gestiune
Ct s-a pltit fr TVA, care este valoarea TVA-ului i ct s-a pltit total
pentru cartea Informatica de gestiune?
SELECT SUM (nr_exemplare*pret_unitar)AS
Val_fara_TVA, SUM(nr_exemplare*pret_unitar*0.19)
AS TVA, SUM (nr_exemplare*pret_unitar +
nr_exemplare*pret_unitar*0.19) AS Val_totala,
FROM CARTE
WHERE titlu = Informatica de gestiune
Aceasta este o soluie atemporal, deoarece dup cum se tie, procentul de
TVA (care n prezent este 19%) poate suferi n timp modificri. O vizualizare mai
elegant a acestui rezultat poate fi realizat folosind urmtoarea interogare:
SELECT Pentru cartea Informatica de gestiune fr
TVA s-a pltit + STR (SUM (nr_exemplare*
pret_unitar), 10) + valoarea TVA este + STR
(SUM (nr_exemplare*pret_unitar*0.16), 10) +
iar total s-au cheltuit + STR (SUM
(nr_exemplare*pret_unitar +
nr_exemplare*pret_unitar*0.16), 10) AS Rezultat
FROM CARTE
WHERE titlu = Informatica de gestiune
La ct se situeaz suma ncasat ca burs de studeni n data de
20.02.2004?
SELECT 20.02.2004 AS DATA, SUM (SUMA_incasata)
AS Val_bursa
FROM STUDENT, BURSA
WHERE STUDENT.nr_matricol = BURSA.nr_matricol AND
data_incasarii = {^2004/02/20}
Care este suma total ncasat ca burs de studenii Facultii de tiine
Economice?
SELECT SUM (suma_incasata) AS Suma_bursa
FROM STUDENT S, BURSA B
WHERE S.nr_matricol = B.nr_matricol AND facultate
= Stiinte Economice
99
Care este suma total ncasat ca burs de studenii cminiti?
SELECT SUM (suma_incasata) AS Suma_bursa
FROM STUDENT S, STUDCAMIN SC, BURSA B
WHERE S.nr_matricol = SC.nr_matricol AND
S.nr_matricol = B.nr_matricol
Care este valoarea medie a preului (inclusiv TVA) la care a fost
achiziionat cartea Informatic de gestiune?
Aceast valoare medie nu o calculm folosind funcia AVG (pe care o vom
descrie ceva mai ncolo), ci se bazeaz pe raportul dintre suma pltit i numrul
de exemplare nsumate pentru aceast carte.
SELECT SUM (nr_exemplare*pret_unitar*1.19) / SUM
(nr_exemplare) AS Pret_mediu
FROM CARTE
WHERE titlu = Informatica de gestiune
13.3. Funcia AVG
Dup cum i spune i numele (n englez), calculeaz media aritmetic a
unei coloane ntr-o tabel oarecare, prin diviziunea sumei valorilor coloanei
respective la numrul de valori nenule ale acesteia.
Care este valoarea medie (fr TVA) la care au fost achiziionate crile
din domeniul Informatic?
SELECT Valoarea medie a cartilor din domeniul
Informatica AS EXPLICATIE, AVG
(nr_exemplare*pret_unitar) AS Val_medie
FROM CARTE
WHERE domeniu = Informatica
Care este valoarea medie a burselor ncasate de studenii Facultii de
tiine Economice?
SELECT Valoarea medie a burselor AS Explicatie,
AVG (suma_incasata) AS Val_medie
FROM STUDENT S, BURSA B
WHERE S.nr_matricol = B.nr_matricol AND facultate
= Stiinte Economice
Care este valoarea medie a burselor ncasate de studenii cminiti?
SELECT Valoarea medie a burselor AS Explicatie,
AVG (suma_incasata) AS Val_medie
F
100
FROM STUDENT S, BURSA B, STUDCAMIN SC
WHERE S.nr_matricol = B.nr_matricol AND
S.nr_matricol = SC.nr_matricol
Adeseori, prin aplicarea funciei AVG sau prin formularea unor expresii ce
conin rapoarte ntre atribute i constante, se obin rezultate cu numeroase
zecimale. Pentru a evita disconfortul unor astfel de rezultate se apeleaz la funcia
ROUND.
13.4. Funciile MAX i MIN
Cele dou funcii care determin valoarea maxim i minim, pentru o
coloan (atribut) sunt deosebit de utile n diverse tipuri de analiz.
Se pot folosi i pentru atribute de tip caracter, caz n care elementul de
comparaie este codul ASCII al elementelor.
Care este studentul cu ultimul nume, n ordine alfabetic, de la facultatea
de tiine Economice?
SELECT MIN (nume) AS Primul_student,
MAX (nume) AS Ultimul_student
FROM STUDENT
WHERE facultate = Stiinte Economice
Care este primul i ultimul jude (n ordinea numelui) din care provin
studenii?
SELECT MIN (judet) AS Primul_judet
MAX (judet) AS Ultimul_judet
FROM STUDENT S, LOCALITATE L
WHERE S.cod_localitate = L.cod_localitate
Care este cartea cu cel mai mare numr de exemplare?
SELECT titlu, MAX (nr_exemplare) AS Exemplare
FROM CARTE
Care este cartea pentru care s-a pltit cel mai puin?
SELECT titlu, MIN (nr_exemplare*pret_unitar) AS
Val_minima
FROM CARTE
F
101
Care este cel mai mare i cel mai mic pre unitar la care au fost
achiziionate crile din domeniul Informatic?
SELECT MAX (Pret_minim = + STR (pret_unitar, 8)
+ domeniu + domeniu) AS Pret_max_informatica, MIN (
pret minim = + STR (pret_unitar, 8) + domeniu +
domeniu) AS pret_min_informatica
FROM CARTE
WHERE domeniu = Informatica
Care sunt cele mai mari dou preuri unitare la care au fost achiziionate
crile din domeniu Informatic?
SELECT Domeniu Informatica + MAX (Primul pret
unitar + STR (C1.pret_unitar, 8) + al doilea pret
unitar + STR (C2.pret_unitar, 8) AS Cele mai mari
preturi unitare
FROM CARTE C1, CARTE C2
WHERE C1.cota_carte = C2.cota_carte AND
C1.pret_unitar > C2.pret_unitar AND C1.domeniu =
Informatica
102
UNITATEA DE NVARE 14
Gruparea tuplurilor: clauza GROUP BY i clauza HAVING
Clauza GROUP BY formeaz grupe de tupluri ale unei relaii, pe baza
valorilor comune ale unui atribut. n frazele SELECT de pn acum au fost
selectate tupluri ale tabelei. Prin asocierea unei clauze HAVING la GROUP BY
este posibil selectarea anumitor grupuri de tupluri, care ndeplinesc un criteriu
valabil doar la nivel de grup (nu i la nivel de linie).
14.1. Clauza GROUP BY
Rezultatul unei fraze SELECT ce conine aceast clauz se obine prin
regruparea tuturor liniilor din tabele enumerate n clauza FROM, extrgndu-se
cte o apariie pentru fiecare valoare distinct a coloanei/grupului de coloane.
Formatul general este:
SELECT coloana 1, coloana 2,.., coloana n
FROM lista_tabele
GROUP BY coloana_de_regrupare
Care este suma ncasat pe fiecare tip de burs n parte?
SELECT tip_bursa, SUM (suma_incasata) AS
total_bursa
FROM BURSA
GROUP BY tip_bursa
Rezultatul se obine prin urmtoarea succesiune de operaii:
- se ordoneaz liniile tabelei BURSA dup atributul de grupare
tip_bursa,
- se constituie un grup pentru fiecare valoare distinct a tip_bursa,
- se execut funcia SUM (suma_incasata) n cadrul fiecrui grup,
- se obine rezultatul al crui numr de linii coincide cu valorile distincte
ale tip_bursa.
Care este valoarea total a burselor pentru fiecare zi n care s-au ncasat
burse?
F
103
SELECT data_incasarii, SUM (suma_incasata) AS
Total_zi
FROM BURSA
GROUP BY data_incasarii
Care este totalul burselor pe faculti?
SELECT facultate, SUM (suma_incasata) AS
Total_facultate
FROM STUDENT S, BURSA B
WHERE S.nr_matricol = B.nr_matricol
GROUP BY facultate
Care este media burselor pe seciile facultii de tiine Economice?
SELECT sectia, AVG (suma_incasata) AS Medie_sectie
FROM STUDENT S, BURSA B
WHERE S.nr_matricol = B.nr_matricol AND facultate
= Stiinte Economice
GROUP BY sectia
Care este totalul burselor pe cmin, ncasate de studenii cminiti?
SELECT nume_camin, SUM (suma_incasata) AS
Total_camin
FROM STUDENT S, BURSA B, STUDCAMIN SC
WHERE S.nr_matricol = SC.nr_matricol AND
S.nr_matricol = B.nr_matricol
GROUP BY nume_camin
Care este numrul total de exemplare i valoarea total a fiecrei cri?
SELECT titlu, SUM (nr_exemplare) AS
Total_exemplare, SUM (pret_unitar*nr_exemplare) AS
Val_totala
FROM CARTE
GROUP BY titlu
Care este numrul total de exemplare din fiecare domeniu n parte?
SELECT domeniu, SUM (nr_exemplare) AS
Total_exemplare
FROM CARTE
GROUP BY domeniu
Care este numrul crilor din bibliotec n funcie de naionalitatea
autorilor?
SELECT nationalitate, COUNT (C.cota_carte) AS
Nr_carti
104
FROM CARTE C, AUTORCARTE AC, AUTOR A
WHERE C.cota_carte = AC.cota_carte AND
AC.cod_autor = A.cod_autor
GROUP 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_incasarii
FROM BURSA
GROUP BY tip_bursa, data_incasarii
Care este numrul crilor din bibliotec n funcie de naionalitatea
autorilor, pe domenii?
SELECT nationalitate, domeniu (COUNT (cota_carte)
AS Nr_carti)
FROM CARTE C, AUTORCARTE AC, AUTOR A
WHERE C.cota_carte = AC.cota_carte AND
AC.cod_autor = A.cod_autor
GROUP BY nationalitate, domeniu
14.2. Clauza HAVING
Cea mai simpl definiie ar fi: clauza HAVING este WHERE-ul ce opereaz
la nivel de grupuri. Dac WHERE acioneaz la nivel de tuplu, selectnd acele linii
care ndeplinesc o condiie specificat, HAVING permite specificarea unor condiii
de selecie ce se aplic grupurilor de linii create prin clauza GROUP BY.
Din rezultat sunt eliminate toate grupurile care nu satisfac condiia
specificat. Formatul general este:
SELECT coloana 1, coloana 2, ..., coloana n
FROM lista_tabele
GROUP BY coloana_de_regrupare
HAVING criteriu_de_regrupare
Care sunt zilele n care s-au ridicat cel puin 2 burse?
SELECT data_incasarii, COUNT (*) AS Nr_burse
FROM BURSA
GROUP BY data_incasarii
HAVING COUNT (*) > = 2
Care sunt crile pentru care s-au cheltuit peste 10.000.000 lei?
F
105
SELECT titlu, SUM (pret_unitar*nr_exemplare) AS
Suma_cheltuita
FROM CARTE
GROUP BY titlu
HAVING SUM (pret_unitar*nr_exemplare) > 10000000
Tem de autoevaluare
Studiu de caz
Se consider urmtoarea baz de date:
PACIENT (codpacient, nume, prenume, datanasterii,
localitate)
PROGRAMARE (nrprogramare, dataprogramare,
oraprogramare, codpacient)
CONSULTATIE (nrconsultatie, tipconsultatie,
codpacient, dataconsultatie)
MEDICI (codmedic, numemedic, prenumemedic)
MEDIC_CONSULTATIE (nrconsultatie, codmedic)
TARIFE (tipconsultatie, tarif)
Folosind comenzi SQL s se determine:
1. Care sunt pacienii din Trgovite; (vezi pag. 111-118)
2. Care sunt pacienii din Trgovite i Titu; (vezi pag. 111-118)
3. Care pacieni nu sunt din Trgovite i Titu; (vezi pag. 111-118)
4. Care sunt pacienii care s-au nscut n anul 1989 (vezi pag. 111-118)
106
5. Care sunt tarifele mai mari de 25 RON; (vezi pag. 111-118)
6. Din ce localiti sunt pacienii din baz; (vezi pag. 111-118)
7. Care este nume i prenumele medicilor care ofer consultaii;
(vezi pag. 111-118)
8. Care sunt tarifele practicate; (vezi pag. 111-118)
9. Din ce localitate sunt pacienii nscui n luna ianuarie 1990;
(vezi pag. 111-118)
10. Care sunt orele pentru care sunt prevzute consultaii n data de
09.02.2006; (vezi pag. 111-118)
107
11. Cum se numesc pacienii din Trgovite 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 fcut programare pacienii din Trgovite;
(vezi pag. 111-118)
15. Numele pacienilor care au fost consultai n luna februarie 2006;
(vezi pag. 111-118)
16. Data la care a fcut programare Dinescu Mircea i Vancea Ioan;
(vezi pag. 111-118)
108
17. Numele medicilor care au acordat consultaii 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 pacienilor consultai de Grecu Anca; (vezi pag. 111-118)
20. Nume pacienilor care au fcut programare i n luna ianuarie i n luna
februarie 2006; (vezi pag. 111-118)
21. Care este tariful consultaiei pacientului Popa Georgeta;
(vezi pag. 111-118)
109
22. Numele pacienilor care au fcut programare n data de 10.02.2006 n
intervalul 14-16; (vezi pag. 111-118)
23. Datele la care au efectuat consultaii Grecu Anca i Minea Ion n luna
februarie 2006; (vezi pag. 111-118)
24. Numele i prenumele medicilor care au consultat pacieni din Trgovite
i Moreni dar nu din Titu; (vezi pag. 111-118)
25. Data la care au fost consultai pacienii care au fcut programare n data
de 10.02.2006; (vezi pag. 111-118)
110
26. Nume pacienilor care au avut programare n data de 10.20.2006 n
intervalul 12-14 i au fost consultai de ctre Grecu Anca.
(vezi pag. 111-118)
27. Numele pacienilor care sunt din aceeai 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 pacienilor pe localiti;
(vezi pag. 111-118)
111
Rezolvare tem de autoevaluare
1. Care sunt pacienii din Trgovite;
SELECT *
FROM PACIENT
WHERE localitate=Targoviste
2. Care sunt pacienii din Trgovite i Titu;
SELECT *
FROM PACIENT
WHERE localitate=Targoviste or localitate=Titu
3. Care pacieni nu sunt din Trgovite i Titu;
SELECT *
FROM PACIENT
WHERE localitate<>Targoviste and localitate<>Titu
4. Care sunt pacienii care s-au nscut n anul 1989
varianta general (SQL-92)
SELECT *
FROM PACIENT
WHERE datanasterii >= 01/01/1989 and datanasterii<= 31/12/1989
varianta Visual FoxPro
SELECT *
FROM PACIENT
WHERE datanasterii >= {^1989/01/01}and datanasterii<=
{^1989/12/31}
5. Care sunt tarifele mai mari de 25 RON;
SELECT tarif
FROM TARIFE
WHERE TARIF>= 25
6. Din ce localiti sunt pacienii din baz;
SELECT localitate
FROM PACIENT
7. Care este nume i prenumele medicilor care ofer consultaii;
varianta general (SQL-92)
SELECT numemedic, prenumemedic
FROM MEDICI, MEDIC_CONSULTATIE
WHERE MEDICI.codmedic=MEDIC_CONSULTATIE.codmedic
varianta VFP
SELECT numemedic, prenumemedic
FROM MEDICI INNER JOIN MEDIC_CONSULTATIE ON
MEDICI.codmedic=MEDIC_CONSULTATIE.codmedic
112
8. Care sunt tarifele practicate;
SELECT tarif
FROM TARIFE
9. Din ce localitate sunt pacienii nscui n luna ianuarie 1990;
varianta general (SQL-92)
SELECT localitate
FROM PACIENT
WHERE datanasterii >= 01/01/1990 and datanasterii <= 31/01/1990
varianta VFP
SELECT localitate
FROM PACIENT
WHERE datanasterii >= {^1990/01/01} and datanasterii <=
{^1990/12/31}
10. Care sunt orele pentru care sunt prevzute consultaii n data de
09.02.2006;
SELECT oraprogramare
FROM PROGRAMARE
WHERE dataprogramare = 09/02/2006
11. Cum se numesc pacienii din Trgovite i Moreni;
SELECT nume, prenume
FROM PACIENT
WHERE localitate = Targoviste or localitate = Moreni
12. Care este prenumele medicilor cu numele de familie Ghionea;
SELECT prenumemedic
FROM MEDICI
WHERE numemedic = Ghionea
13. La ce data i la ce or are programare Popa Georgeta;
varianta general (SQL-92)
SELECT dataprogramare, oraprogramare
FROM PACIENT P, PROGRAMARE PRG
WHERE P.codpacient = PRG.codpacient and (nume=Popa and
prenume = Georgeta)
varianta VFP
SELECT dataprogramare, oraprogramare
FROM PACIENT P INNER JOIN PROGRAMARE PRG ON
P.codpacient =
PRG.codpacient
WHERE nume=Popa and prenume = Georgeta
14. Care sunt datele la care au fcut programare pacienii din Trgovite;
varianta general (SQL-92)
SELECT dataprogramare
FROM PACIENT P, PROGRAMARE PRG
WHERE P.codpacient = PRG.codpacient and localitate = Targoviste
113
varianta VFP
SELECT dataprogramare
FROM PACIENT P INNER JOIN PROGRAMARE PRG ON
P.codpacient =
PRG.codpacient
WHERE localitate = Targoviste
15. Numele pacienilor care au fost consultai n luna februarie 2006;
varianta general (SQL-92)
SELECT nume, prenume
FROM PACIENT P, CONSULTATIE C
WHERE P.codpacient = C.codpacient and (dataconsultatie >=
01/02/2006 and dataconsultatie <= 28/02/2006)
varianta VFP
SELECT nume, prenume
FROM PACIENT P INNER JOIN CONSULTATIE C ON P.codpacient
=
C.codpacient
WHERE dataconsultatie >= {^2006/02/01} and dataconsultatie <=
{^2006/02/28}
16. Data la care a fcut programare Dinescu Mircea i Vancea Ioan;
varianta general (SQL-92)
SELECT dataprogramare
FROM PACIENT P, PROGRAMARE PRG
WHERE P.codpacient = PRG.codpacient and (nume = Dinescu and
prenume = Mircea) and (nume = Vancea and prenume = Ioan
varianta VFP
SELECT dataprogramare
FROM PACIENT P INNER JOIN PROGRAMARE PRG ON
P.codpacient =PRG.codpacient WHERE (nume = Dinescu and
prenume = Mircea) and (nume =Vancea and prenume = Ioan
17. Numele medicilor care au acordat consultaii n data de 23.02.2006;
varianta general (SQL-92)
SELECT numemedic, prenumemedic
FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C
WHERE M.codmedic=MC.codmedic and
MC.nrconsultatie=C.nrconsultatie
and dataconsultatie = 23/02/2006
varianta VFP
SELECT numemedic, prenumemedic
FROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ON
M.codmedic =
MC.codmedic INNER JOIN CONSULTATIE C ON
MC.NRCONSULTATIE =
C.nrconsultatie and dataconsultatie = {^2006/02/23}
114
18. De ce medic a fost consultat Popa Georgeta;
varianta general (SQL-92)
SELECT numemedic, prenumemedic
FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C,
PACIENT P
WHERE M.codmedic=MC.codmedic and
MC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacient
and (nume = Popa and prenume = Georgeta)
varianta VFP
SELECT numemedic, prenumemedic
FROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ON
M.codmedic =
MC.codmedic INNER JOIN CONSULTATIE C ON MC.nrconsultatie =
C.nrconsultatie INNER JOIN PACIENT P ON C.codpacient =
P.codpacient
WHERE nume = Popa and prenume = Georgeta
19. Numele pacienilor consultai de Grecu Anca;
varianta general (SQL-92)
SELECT numemedic, prenumemedic
FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C,
PACIENT P
WHERE M.codmedic=MC.codmedic and
MC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacient
and (numemedic = Grecu and prenumemedic = Anca)
varianta VFP
SELECT numemedic, prenumemedic
FROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ON
M.codmedic =
MC.codmedic INNER JOIN CONSULTATIE C ON MC.nrconsultatie =
C.nrconsultatie INNER JOIN PACIENT P ON C.codpacient =
P.codpacient
WHERE numemedic = Grecu and prenumemedic = Anca
20. Nume pacienilor care au fcut programare i n luna ianuarie i n luna
februarie 2006;
SELECT nume, prenume
FROM PACIENT P, PROGRAMARE PRG
WHERE P.codpacient = PRG.codpacient and dataprogramare >=
01/01/2006 and dataprogramare <= 31/01/2006
INTERSECT
SELECT nume, prenume
FROM PACIENT P, PROGRAMARE PRG
WHERE P.codpacient = PRG.codpacient and dataprogramare >=
01/02/2006 and dataprogramare <= 28/02/2006
21. Care este tariful consultaiei pacientului Popa Georgeta;
varianta general (SQL-92)
SELECT tarif
FROM PACIENT P, CONSULTATIE C, TARIFE T
WHERE P.codpacient = C.codpcient and C.nrconsultatie =
T.nrconsultatie and (nume = Popa and prenume = Georgeta)
115
varianta VFP
SELECT tarif
FROM PACIENT P INNER JOIN CONSULTATIE C ON P.codpacient
=
C.codpcient INNER JOIN TARIFE T ON C.nrconsultatie =
T.nrconsultatie
WHERE nume = Popa and prenume = Georgeta
22. Numele pacienilor care au fcut programare n data de 10.02.2006 n
intervalul 14-16;
varianta general (SQL-92)
SELECT nume, prenume
FROM PACIENT P, PROGRAMARE PRG
WHERE P.codpacient = PRG.codpacient and dataprogramare =
10/02/2006 and (oraprogramare >= 14 and oraprogramare <=16)
varianta VFP
SELECT nume, prenume
FROM PACIENT P INNER JOIN PROGRAMARE PRG ON
P.codpacient =PRG.codpacient
WHERE and dataprogramare = {^2006/02/10} and (oraprogramare
>=14 and oraprogramare <=16)
23. Datele la care au efectuat consultaii Grecu Anca i Minea Ion n luna
februarie 2006;
varianta general (SQL-92)
SELECT dataconsultatie
FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C,
PACIENT P
WHERE M.codmedic=MC.codmedic and
MC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacient
and (numemedic = Grecu and prenumemedic = Anca) and
(dataconsultatie >= 01/02/2006 and dataconsultatie <=
28/02/2006)
INTERSECT
SELECT dataconsultatie
FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C,
PACIENT P WHERE M.codmedic=MC.codmedic and
MC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacient
and (numemedic = Minea and prenumemedic = Ioan) and
(dataconsultatie >= 01/02/2006 and dataconsultatie <=
28/02/2006)
varianta VFP
SELECT dataconsultatie
FROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ON
M.codmedic =
MC.codmedic INNER JOIN CONSULTATIE C ON MC.nrconsultatie =
C.nrconsultatie INNER JOIN PACIENT P ON C.codpacient =
P.codpacient
WHERE (numemedic = Grecu and prenumemedic = Anca) and
(numemedic = Minea and prenumemedic = Ioan) and
(dataconsultatie >= {^2006/02/01} and dataconsultatie <=
{^2006/02/28})
116
24. Numele i prenumele medicilor care au consultat pacieni din Trgovite
i Moreni dar nu din Titu;
varianta general (SQL-92)
SELECT numemedic, prenumemedic
FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C,
PACIENT P
WHERE M.codmedic=MC.codmedic and
MC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacient
localitate = Targoviste
INTERSECT
SELECT numemedic, prenumemedic
FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C,
PACIENT P
WHERE M.codmedic=MC.codmedic and
MC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacient
localitate = Moreni
MINUS
SELECT numemedic, prenumemedic
FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C,
PACIENT P
WHERE M.codmedic=MC.codmedic and
MC.nrconsultatie=C.nrconsultatie and C.codpacient = P.codpacient
localitate = Titu
varianta VFP
SELECT numemedic, prenumemedic
FROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ON
M.codmedic =
MC.codmedic INNER JOIN CONSULTATIE C ON MC.nrconsultatie =
C.nrconsultatie INNER JOIN PACIENT P ON C.codpacient =
P.codpacient
WHERE (localitate = Targoviste or localitate = Moreni) and
localitate <> Titu
25. Data la care au fost consultai pacienii care au fcut programare n data
de 10.02.2006;
varianta general (SQL-92)
SELECT nume, prenume
FROM PACIENT P, PROGRAMARE PRG
WHERE P.codpacient=PRG.codpacient
GROUP BY dataprogramare
varianta VFP
SELECT nume, prenume
FROM PACIENT P INNER JOIN PROGRAMARE ON
P.codpacient=PRG.codpacient
GROUP BY dataprogramare
117
26. Nume pacienilor care au avut programare n data de 10.20.2006 n
intervalul 12-14 i au fost consultai de ctre Grecu Anca.
varianta general (SQL-92)
SELECT nume, prenume
FROM PACIENT P, PROGRAMARE PRG
WHERE P.codpacient=PRG.codpacient
GROUP BY dataprogramare
varianta VFP
SELECT nume, prenume
FROM PACIENT P INNER JOIN PROGRAMARE ON
P.codpacient=PRG.codpacient
GROUP BY dataprogramare
27. Numele pacienilor care sunt din aceeai localitate cu Popa Georgeta;
varianta general (SQL-92)
SELECT nume, prenume
FROM PACIENT P, PROGRAMARE PRG, CONSULTATIE C
WHERE P.codpacient=PRG.codpacient and
PRG.nrconsultatie=C.nrconsultatie
GROUP BY dataconsultatie
varianta VFP
SELECT nume, prenume
FROM PACIENT P INNER JOIN PROGRAMARE ON
P.codpacient=PRG.codpacient INNER JOIN CONSULTATIE ON
PRG.nrconsultatie=C.nrconsultatie
GROUP BY dataconsultatie
28. Numele medicilor care au prenumele Anca;
varianta general (SQL-92)
SELECT COUNT(*) AS nrconsultatii
FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C
WHERE M.codmedic=MC.codmedic and
MC.nrconsultatie=C.nrconsultatie and
(dataconsultatie>=01/02/2006 and dataconsultatie<=28/02/2006)
and (numemedic=Grecu and prenumemedic=Anca)
varianta VFP
SELECT COUNT(*) AS nrconsultatii
FROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ON
M.codmedic =
MC.codmedic INNER JOIN CONSULTATIE C ON MC.nrconsultatie =
C.nrconsultatie WHERE (dataconsultatie>={^2006/02/01} and
dataconsultatie<={^2006/02/28}) and (numemedic = Grecu and
prenumemedic = Anca)
118
29. Numele i prenumele n ordine alfabetic al pacienilor pe localiti;
varianta general (SQL-92)
SELECT COUNT(*) AS nrconsultatii, COUNT(*)*10 as onorariu
FROM MEDICI M, MEDIC_CONSULTATIE MC, CONSULTATIE C
WHERE M.codmedic=MC.codmedic and
MC.nrconsultatie=C.nrconsultatie and
(dataconsultatie>=01/02/2006 and dataconsultatie<=28/02/2006)
and (numemedic=Grecu and prenumemedic=Anca)
varianta VFP
SELECT COUNT(*) AS nrconsultatii, COUNT(*)*10 as onorariu
FROM MEDICI M INNER JOIN MEDIC_CONSULTATIE MC ON
M.codmedic =
MC.codmedic INNER JOIN CONSULTATIE C ON MC.nrconsultatie =
C.nrconsultatie WHERE (dataconsultatie>={^2006/02/01} and
dataconsultatie<={^2006/02/28}) and (numemedic = Grecu and
prenumemedic = Anca)
BIBLIOGRAFIE SELECTIV
I. Tratate i monografii.
1. Michael Hernandez Proiectarea bazelor de date, Editura Teora,
Bucureti, 2003
2. Mariana Miloescu Baze de date n Visual FoxPro, Editura Teora,
2003
3. Marin Fotache, Proiectarea bazelor de date, Editura Polirom, Iai, 2005
4. Grupul BDASEIG, Baze de date. Fundamente teoretice i practice,
Editura Infomega, Bucureti, 2002
5. Florin Radu, Baze de date, Editura Bibliotheca, Trgovite, 2007
119
ANEXA 1
STRUCTURA BAZEI DE DATE FOLOSITE PENTRU EXEMPLIFICRI
STUDENT
nr_matricol nume facultate sectia data_nasterii cod_localitate
BURSA
nr_matricol data_incasarii tip_bursa suma_incasata
STUDCAMIN
nr_matricol nume_camin camera strada
LOCALITATE
cod_localitate nume_localitate cod_judet judet regiune
STUDCARTE
nr_matricol cota_carte data_imprumut
CARTE
cota_carte titlu editura domeniu an_aparitie nr_exemplare pret_unitar
AUTORCARTE
cod_autor cota_carte
AUTOR
cod_autor nume_autor nationalitate an_nastere

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