Documente Academic
Documente Profesional
Documente Cultură
CUPRINS
1 Introducere ................................................................................................... 4
1.1
1.2
3.2.3
Instruciunea UPDATE .......................................................................... 67
3.2.4
Instruciunea DELETE ........................................................................... 69
3.3
PUNCTE DE VEDERE I PROCEDURI CATALOGATE ............................................. 70
3.3.1
Instruciunea CREATE VIEW................................................................. 70
3.3.2
Instruciunea CREATE PROCEDURE ................................................... 72
3.3.3
Instruciunea EXECUTE ........................................................................ 73
3.4
TRANZACII ..................................................................................................... 73
3.4.1
Instruciunile BEGIN, COMMIT i ROLLBACK ................................... 73
1 Introducere
Aceast carte, dedicat programrii n SQL ANSI-92 [0], este conceput ca dicionar frazeologic de MSJetSQL i folosit la laboratoarele cursului universitar de Proiectarea i interogarea conceptual a bazelor de date [1]. Prezentarea urmrete ndeaproape topica documentaiei Microsoft Corporation pentru MSJetSQL versiunea 4 [2],
motorul de baze de date (bd) ales pentru implementarea celor peste 125 de exemple de
programare SQL propuse, rezolvate i discutate n lucrare.
Seciunea 1.1 prezint pe scurt motivele alegerii MSJetSQL pentru ilustrarea
programrii n SQL. Seciunea 1.2 prezint structura i cele dou coninuturi propuse
pentru baza de date Domnitori, care sunt utilizate drept exemplu pe tot parcursul crii
(vezi i [1]). Capitolul 2 este dedicat sublimbajului de definiie a datelor, iar capitolul 3
celui de manipulare a datelor. Capitolul 4 evideniaz diferenele notabile ale MSJetSQL
fa de standardul SQL ANSI-92. Lucrarea se ncheie cu capitolele dedicate problemelor
propuse spre rezolvare, comentariilor i listei referinelor bibliografice.
Cartea este nsoit de o dischet coninnd bd Domnitori, precum i toate cele
aproape 130 de programe prezentate n carte.
De fapt, MSJetSQL este o component de sine stttoare, accesibil tuturor componentelor suitei Office.
Acronimul englez pentru Institutul Naional American de Standarde, un etalon mondial n domeniu.
3
Exemple: MS Visual FoxPro, Oracle, Sybase SQL Server, DB/2, NonStopSQL, CA-OpenIngres etc.
4
Dar nu numai: de exemplu, MS Jet este folosit i de Visual Basic, precum i de orice alt component a
Office care are nevoie de acces la o bd de tip .mdb, .adp etc.
5
De fapt, odat cu versiunea 2000, mai exist n Office un motor, cu adevrat de tip client/server, n
ntregime compatibil cu MS SQL Server i anume Microsoft Data Engine (MSDE).
2
activ Access i nici de modelul programatic obiectual DAO, ci numai de cel ADO i de
furnizorul Jet OLE DB6 (e.g. gestiunea grupurilor, utilizatorilor i privilegiilor acestora,
tabele derivate, proceduri catalogate, tranzacii etc.), dar i pentru a oferi o imagine ct
mai complet asupra programrii efective n Access, unele dintre exemplele ce urmeaz
fac apel i la VBA7.8
Conveniile notaionale folosite n prezentarea sintaxei MSJSQL sunt urmtoarele:
Cuvintele rezervate sunt scrise cu majuscule.
Variabilele sunt scrise cu litere mici, italice.
Clauzele opionale sunt nchise n paranteze drepte.
, semnific eventuala repetare de oricte ori a clauzei precedente.
Clauzele la alegere (doar una dintre) sunt nchise n acolade i separate ntre
ele prin |.
Prescurtrile i.e. nseamn adic, iar e.g. nseamn de exemplu.
DAO, ADO, ADOX i OLE DB sunt tehnologii de programare curent Microsoft (vezi [2], [3], ]4]).
Visual Basic for Applications (VBA), limbajul de programare al Access (derivat din Visual Basic), este
prezentat i el la laborator, att n sine, ct i cuplat cu MSJSQL ncorporat.
8
Windows, Access, MS SQL Server, Jet SQL, Transact-SQL, Office, Word, Excel, Powerpoint, Outlook,
Publisher, Visual FoxPro, Visual Basic i VBA sunt produse i mrci nregistrate al corporaiei Microsoft.
Sybase SQL Server aparine corporaiei Sybase, Oracle i PL/SQL corporaiei Oracle, DB/2 corporaiei
IBM, NonStopSQL corporaiei Tandem, iar CA-OpenIngres corporaiei Computer Associates.
9
De fapt, versiunile curente de MSJetSQL nu suport propriu-zis aceste instruciuni, dei ele figureaz n
documentaia aferent; grupurile, utilizatorii i privilegiile acestora sunt gestionate doar extern, de
utilitarul Wrkgadm.exe sau programatic, via ADOX i furnizorul Jet OLE DB. Prezentm totui i aceste
instruciuni ntru completitudine ANSI.
7
Din cea de-a doua, fac parte nou instruciuni: CREATE USER, CREATE GROUP,
ADD USER, ALTER USER, ALTER DATABASE, GRANT, REVOKE, DROP
USER i DROP GROUP.
PERSOANE (Nume)
Nume
Moarte Necropol
Alexandru Aldea
1436
Ana
Anca
Basarab I
1352
Cmpulung
Basarab epelu
Clara
Dan I
1386
Dan II
1431
Elena
Elisabeta
Laiot Basarab
1477
Maria
Maria Voichia
1511
Mtu tefan cel Mare
Mihail I
1420
Mihnea cel Ru
1509
Mircea
1447
Mircea cel Btrn
1418
Cozia
Mircea Ciobanul
1559
Neagoe Basarab
1521
Curtea Arge
Nicolae Alexandru
1364
Cmpulung
Radu cel Frumos
Radu cel Mare
1508
Dealu
Radu de la Afumai
1529
Curtea Arge
Radu I
1384
Radu II Pleuvul
1427
Radu Paisie
Ruxandra
Stanca
1530
Curtea Arge
Teodosie
Vlad
Vlad Clugrul
1495
Vlad cel Tnr
1512
Vlad Dracul
1447
Vlad epe
1477
Snagov
Vlad Uzurpatorul
1396
Vladislav II
1456
Vladislav Vlaicu
1377
Curtea Arge
MAMA (Copil) Mama Nume, Copil Nume,
Mama
Mama
Copil
Clara
Ana
Clara
Anca
Elena
Vlad
Maria
Vladislav Vlaicu
Maria
Radu I
Maria
Elisabeta
Mtu tefan cel Mare Vlad epe
Mtu tefan cel Mare Radu cel Frumos
Mtu tefan cel Mare Mircea
Mtu tefan cel Mare Vlad Clugrul
- Dan II, Radu II Pleuvul, Laiot Basarab, Vlad Clugrul
au domnit, de fapt, de mai multe ori
- au mai domnit, ns extrem de scurt timp fiecare, Mircea
i Basarab II
- Elena, soia lui Vlad epe, a fost fiica lui Iancu de
Hunedoara i sora lui Matei Corvin
- Maria Voichia a fost soia lui tefan cel Mare
- Stanca a fost soia lui tefni, domn al Moldovei, fiu al
lui Bogdan III
PERSOANE (Nume)
Nume
Moarte Necropol
Alexandru
1496
Bistria
Alexandru cel Bun
1432
Bistria
Alexndrel
Ana Neaca
Bistria
Anastasia
Rdui
Bogdan
1407
Rdui
Bogdan I
1365
Rdui
Bogdan II
1451
Rdui
Bogdan III
1517
Putna
Bogdnel
1477
Putna
Elena
Evdochia
1467
Ilia
1445
Ilie
1472
Putna
Iuga Vod
1400
Lacu
1374
Rdui
Margareta Losoncz
1410
Baia
Margareta Muata
1393
Siret
Maria
1518
Putna
Maria de Mangop
1477
Putna
Maria Oltea Basarab
Maria Rare din Hrlu
Maria Voichia
1511
Putna
Mariana
Mtu tefan cel Mare
Petru Aron
1470
Petru II
Petru Muat
1391
Rdui
Petru Ptracu
1480
Putna
Petru Rare
1546
Probota
Ringala Maria
Roman I
1394
Rdui
Roman II
Sor Petru Muat?
tefan cel Mare
1504
Putna
tefan I
1399
Rdui
tefan II
1447
MAMA (Copil) Mama Nume, Copil Nume,
Mama
Mama
Copil
Ana Neaca
Ilia
Anastasia
Alexandru cel Bun
Evdochia
Alexandru
Evdochia
Elena
Evdochia
Petru Ptracu
Margareta Muata
Petru Muat
Margareta Muata
Roman I
Margareta Muata
Sor Petru Muat?
Maria de Mangop
Ilie
Maria de Mangop
Bogdnel
Maria Oltea Basarab
tefan cel Mare
Maria Rare din Hrlu Petru Rare
Maria Voichia
Bogdan III
Maria Voichia
Maria
Mariana
Petru Aron
Sor Petru Muat?
tefan I
Sor Petru Muat?
Iuga Vod
10) Pentru a afla ultima valoare generat automat pentru o coloan incremental
trebuie folosit instruciunea (vezi 3.1.1): SELECT @@IDENTITY. De remarcat
c nu se poate specifica vreo tabel anume: se returneaz mereu ultima valoare
generat pentru ultima tabel pentru care s-a fcut acest lucru!
11) O parte din tipurile de date (nu doar primitive) admit sinonime.
12) Pentru echivalena cu i diferenele fa de tipurile de date standard ANSI vezi
capitolul 4.
Exemplul 1 Urmtoarea subrutin VBA creeaz tabela DOMNII 10:
Sub CreateTableDomnii()
Dim conDb As ADODB.Connection
On Error GoTo err_point
Set conDb = Application.CurrentProject.Connection
conDb.Execute "CREATE TABLE Domnii (Domnitor " _
& "CHAR(64), DeLa LONG PRIMARY KEY, La LONG " _
& "UNIQUE, CONSTRAINT KSD FOREIGN KEY " _
& "(Domnitor) REFERENCES Persoane " _
& "ON UPDATE CASCADE ON DELETE SET NULL);"
conDb.Close
Set conDb = Nothing
End Sub
Instruciunea urmtoare nu va reui s defineasc tabela CAPITALE (vezi
figura 13) deoarece n definiie este referit tabela necunoscut LOCALITI:
CREATE TABLE Capitale ([#C] COUNTER (0,2),
Capitala CHAR(32), An CHAR(4)
PRIMARY KEY, CONSTRAINT KSC FOREIGN KEY
(Capitala) REFERENCES Localiti);
Instruciunea urmtoare ns va genera aceast tabel:11
(Q001)CREATE TABLE Capitale ([#C] COUNTER (0,2),
Capitala CHAR(32), An CHAR(4)PRIMARY KEY);
De remarcat c structura sa include i cheia surogat #C, cu valori automat
generate incremental, pentru care s-au cerut valoarea iniial 0 i incrementul 2
(deci prima linie introdus va avea cod 0, a doua 2, a treia 4 etc.).
2.1.2 Clauza CONSTRAINT
Clauza CONSTRAINT permite definirea unui fiier index (deci i a unei chei) sau a
unei legturi ntre tabela curent i o alt tabel, i.e. a unei chei strine, adic a unei
dependene de incluziune (DIN). Un fiier index poate fi definit pentru un singur atribut
sau pentru un grup de atribute al unei relaii. Sintaxa pentru primul caz este urmtoarea:
CONSTRAINT nume {PRIMARY KEY | UNIQUE | NOT NULL |
REFERENCES tabelastrin [(coloanstrin1)]
[ON UPDATE {CASCADE | SET NULL}]
[ON DELETE {CASCADE | SET NULL}]}
Sintaxa pentru cel de-al doilea caz este urmtoarea:
10
n acest exemplu de programare, se observ c instruciunea SQL este transmis drept parametru de tip
ir de caractere unei metode (Execute) a obiectului de tip conexiune (la o bd) ADO numit conDb,
iniializat la bd curent. Caracterul _ de la sfritul unei linii indic continuarea acesteia pe linia
urmtoare; & este operatorul de concatenare iruri de caractere.
11
De notat c, dac un nume conine caractere speciale (precum #, spaiu, semne de punctuaie etc.),
conform conveniilor de numire ale MS Jet el trebuie nchis ntre paranteze ptrate. n mod standard,
instruciunile generate automat de sistem conin parantezele ptrate chiar dac acest lucru nu este
obligatoriu.
11
n Access, orice asemenea declaraie are ca efect memorarea relaiei aferente ntre tabele i a referinei
de integritate corespunztoare (i.e. a DIN; vezi opiunea de meniu \Tools\Relationships).
13
De remarcat c, din nou incredibil, motorul MSJet al Access nu impune aciclicitatea referinelor de
integritate (ceea ce nici mcar MS SQL Server nu face, de altfel!)! Astfel, de exemplu, dac atributul A al
tabelei TA refer atributul B al tabelei TB, care, la rndul su refer atributul A al TA, atunci nu se pot
introduce nici un fel de date n nici una din aceste dou tabele (n TA pentru c nu exist deja n TB, iar n
TB pentru c nu exist deja n TA)!
12
Deoarece Access deduce (din cheile tabelelor implicate) natura relaiilor binare (i nu permite nici
mcar ulterior modificarea lor explicit), n acest caz (i n orice asemenea cazuri similare) trebuie
dezactivat forarea automat a referinei integritilor (vezi opiunea de meniu \Tools\Relationships i
proprietile relaiei, care se pot obine cu un clic dreapta pe arcul corespunztor). n caz contrar, cum
relaia aceasta este eronat considerat injectiv i nu doar funcional (deoarece att Nume, ct i Copil
sunt chei!), nu se va putea introduce nici o persoan (neexistnd deja tatl ei), dar nici vreun tat
(neexistnd deja persoana reprezentnd copilul su)! Evident, DIN corespunztoare trebuie apoi impus
prin program! Vestea cea bun este c dac Nume nu este explicitat (vezi, de exemplu, declaraia
urmtoare pentru tabela de mame), aceast eroare nu se mai manifest (i.e. natura relaiei este corect
dedus ca fiind de tip 1- i nu 1-1)!! Vestea proast este, evident, aceea c pentru injectiviti
impunerea automat a DIN este greit tratat, deci e preferabil renunarea la ele prin consolidare ntr-o
unic tabel (conform principiului propagrii cheilor [1]).
15
Dei n documentaia MSJetSQL clauzele ON UPDATE i ON DELETE figureaz ca fiind suportate,
implementarea propriu-zis nu le accept! Ele sunt implementate exclusiv programatic, via ADOX i
furnizorul Jet OLE DB (e.g. vezi exemplul 1).
13
14
15
16
16
Sub DropIndexTata()
Dim dbs As DAO.Database
Set dbs = CurrentDb()
dbs.Execute "DROP INDEX Tata ON Tata;"
Set dbs = Nothing
End Sub
Instruciunea urmtoare nu va reui s tearg indexul cu numele Tata,
deoarece un asemenea index nu mai exist (el fiind deja ters de subrutina de
mai sus DropIndexTata):
(Q012)DROP INDEX Tata ON Tata;
Instruciunea urmtoare nu va reui s tearg tabela PERSOANE, deoarece
aceasta este implicat cel puin n definiia unei relaii cu o alt tabel (vezi
exemplul 2):
(Q013)DROP TABLE Persoane;
Variabil Descriere
utilizator Numele noului utilizator de adugat n fiierul de informaii despre
utilizatori la grupul grup.
grup
Numele grupului la care sunt adugai utilizatorii utilizator.
Observaii:
1) Din momentul adugrii sale la un grup, utilizatorul capt automat toate
drepturile ce au fost garantate acelui grup.
2) Orice utilizator trebuie adugat ntotdeauna i grupului implicit Users; n caz
contrar, el nu va putea lucra cu Access pe acea main, deoarece nu va avea nici
mcar privilegiul de citire a tabelelor sistem ale Jet!
3) Aceast instruciune nu este suportat nici de interfaa interactiv Access i nici
de modelul programatic obiectual DAO, ci numai de cel ADO/ADOX i de
furnizorul Jet OLE DB.
Exemplul 7 Urmtoarea instruciune adaug utilizatorii numii Vlad, Miron
i Diana la grupul de utilizatori numit Curios:
(Q016)ADD USER Vlad, Miron, Diana TO Curios;
18
Mulimea containerelor este una dintre cele standard ale obiectului Database oferite de ierarhia de
clase a MS Jet. Un obiect de tip container conine dou mulimi: una de documente (de exemplu: forme,
rapoarte, pagini web de acces la date, macro-uri, module de program etc.) i cealalt de proprieti ale
acestora (de exemplu: nume, tip, valoare, indicatorul boolean care precizeaz dac proprietatea respectiv
este sau nu motenit etc.).
19
Privilegiu
SELECT
DELETE
INSERT
UPDATE
DROP
SELECTSECURITY
UPDATESECURITY
UPDATEIDENTITY
CREATE
SELECTSCHEMA
SCHEMA
UPDATEOWNER
ALLPRIVILEGES
CREATEDB
EXCLUSIVECONNECT
CONNECT
ADMINDB
Aplicare
tabele, obiecte, containere
tabele, obiecte, containere
tabele, obiecte, containere
tabele, obiecte, containere
tabele, obiecte, containere
tabele, obiecte, containere
tabele, obiecte, containere
tabele
tabele, obiecte, containere
tabele, obiecte, containere
tabele, obiecte, containere
tabele, obiecte, containere
toate
bd
bd
bd
bd
Descriere
citire schem i date
tergere date
inserare date
modificare date
tergere definiie din schem
citire privilegii
modificare privilegii
modificare valori Autonumber
creare definiii n schem
citire definiii schem
modificare definiii schem
modificare proprietar
toate privilegiile
creare bd
deschidere bd n mod exclusiv
deschidere bd n mod partajat
administrare bd
Exemplul 9 Urmtoarea instruciune garanteaz tuturor utilizatorilor grupului cu numele Curios dreptul de a interoga, terge, aduga i modifica tuplii
tabelei DOMNII:
(Q019)GRANT SELECT, DELETE, INSERT, UPDATE ON TABLE
Domnii TO Curios;
Urmtoarea instruciune garanteaz utilizatorului Vlad dreptul de a
deschide n mod exclusiv bd curent:
(Q020)GRANT EXCLUSIVECONNECT ON DATABASE TO Vlad;
2.8
Instruciunea REVOKE
unor tabele, respectiv tergerea de tupli din tabelele existente. A treia categorie este
alctuit din dou instruciuni: EXECUTE i TRANSACTION.
Deoarece sunt folosite de mai multe instruciuni, am factorizat prezentarea a cinci
operaii (produs cartezian; INNER, LEFT i RIGHT JOIN; UNION) i a dou declaraii
(PARAMETERS i WITH OWNERACCESS OPTION). Clauza PROCEDURE nu este
prezentat, deoarece ea mai este nc suportat doar din considerente de compatibilitate
cu vechile programe, fiind nlocuit cu instruciunea omonim mai puternic din LDD.
Dei fac parte din LDD, prezentm abia n acest capitol instruciunile CREATE
VIEW i CREATE PROCEDURE, deoarece ambele se bazeaz pe SELECT.
5) Pentru a selecta toate coloanele unei tabele se poate folosi *18; instruciunea:
(Q026)SELECT * FROM TATA;
este echivalent cu instruciunea:
(Q027)SELECT TATA.Tata, TATA.Copil FROM TATA;
6) Dac nu exist posibilitatea nici unei ambiguiti, se poate omite numele tabelei
din lista int a instruciunii; de exemplu, (Q026) i (Q027) sunt echivalente cu:
(Q028)SELECT Tata, Copil FROM TATA;
7) Dac ns sunt posibile ambiguiti, atunci ele trebuie eliminate prin folosirea
numelui tabelelor; aceasta este obligatoriu, chiar dac nu ar exista ambiguiti, n
clauza ON a operatorilor JOIN (e.g. vezi exemplul 12).
8) Dac se dorete redenumirea unei coloane sau pentru a asigna un nume unei
coloane rezultate n urma evalurii unei expresii (ceea ce este obligatoriu!) se
folosete cuvntul rezervat AS; de exemplu, pentru a calcula durata fiecrei
domnii n parte i a obine rezultatul n ordinea descresctoare a acesteia (iar n
caz de durate egale, n ordinea cronologic), se poate folosi urmtoarea instruciune (rezultatul aplicrii ei asupra bd din figura 2 este prezentat n figura 3):
(Q029)SELECT Domnitor, La DeLa AS Durata, DeLa, La
FROM Domnii
ORDER BY La DeLa DESC, DeLa;
9) Dac este nevoie de folosirea unei aceleiai tabele de mai multe ori ntr-o
instruciune SELECT, atunci fiecare dintre apariiile duble ale acesteia trebuie
redenumite unic; pentru a calcula domnia imediat succesoare a fiecrei domnii,
se poate folosi urmtoarea instruciune (rezultatul aplicrii ei asupra bd din
figura 2 este prezentat n figura 4):
(Q030)SELECT Domnii.Domnitor AS Predecesor,
Succesiuni.Domnitor AS Succesor, Domnii.La
FROM Domnii INNER JOIN Domnii AS Succesiuni
ON Domnii.La = Succesiuni.DeLa
ORDER BY Domnii.La;
10) Pentru performane mai bune i utilizare mai uoar, se recomand folosirea
tabelelor legate n locul referirii unei bd externe cu ajutorul clauzei IN.
3.1.1.1
Evident c ([1]) instruciunea SQL SELECT * FROM r; reprezint interogarea unitate 1X, 1X(r) = r,
r I(X).
23
Predecesor
Bogdan I
Lacu
Petru Muat
Roman I
tefan I
Iuga Vod
Alexandru cel Bun
Ilia
tefan II
Ilia
tefan II
Roman II
Petru II
Bogdan II
Petru Aron
Alexndrel
Petru Aron
Succesor
Lacu
Petru Muat
Roman I
tefan I
Iuga Vod
Alexandru cel Bun
Ilia
tefan II
Ilia
tefan II
Roman II
Petru II
Bogdan II
Petru Aron
Alexndrel
Petru Aron
tefan cel Mare
Exemplul 12
Urmtoarele dou instruciuni sunt echivalente19 i au ca rezultat relaia
coninnd toate domniile, n ordinea alfabetic a domnitorilor (rezultatul
lor pentru bd din figura 2 este prezentat n figura 5):
(Q031)SELECT * FROM Domnii ORDER BY Domnitor;
(Q032)SELECT ALL * FROM Domnii ORDER BY Domnitor;
Urmtoarea instruciune are ca rezultat mulimea tuturor domniilor de
copii de domnitori restrns la numele copiilor domni (ceea ce, ca atare,
devine o list!), n ordine alfabetic (rezultatul ei pentru bd din figura 1
este prezentat n figura 6a):
(Q033)SELECT Tata.Copil AS CopilDomnitor
FROM Tata INNER JOIN Domnii
ON Tata.Copil = Domnii.Domnitor
ORDER BY Tata.Copil;
Se observ n figura 6a c, din cauza faptului c SQL nu elimin automat
duplicatele din rezultat, precum i datorit domniilor multiple, numele unor
19
n fapt, n momentul salvrii unei interogri, MSJetSQL chiar terge automat predicatul ALL!
24
La
1365
1374
1391
1394
1399
1400
1432
1433
1435
1442
1447
1448
1449
1451
1452
1455
1457
domnitori se repet (aprnd cte o dat pentru fiecare dintre domniile lor).
Evident c mult mai natural i interesant din acest punct de vedere ar fi
ns mulimea copiilor de domnitori care au domnit i ei la rndul lor; prin
adugarea predicatului DISTINCT la instruciunea de mai sus se obine
exact acest rezultat (prezentat n figura 6b):
(Q034)SELECT DISTINCT Tata.Copil AS CopilDomnitor
FROM Tata INNER JOIN Domnii
ON Tata.Copil = Domnii.Domnitor
ORDER BY Tata.Copil;
n mod dual, instruciunea urmtoare are ca rezultat mulimea domnitorilor
ce au avut cel puin un copil (vezi figura 7 pentru bd din figura 1):
(Q035)SELECT DISTINCTROW Domnitor AS DomniTai
FROM Persoane INNER JOIN (Tata INNER JOIN
Domnii ON Tata.Tata = Domnii.Domnitor)
ON Persoane.Nume = Domnii.Domnitor
ORDER BY Domnitor;
n absena predicatului DISTINCTROW ns, n loc de cei 13 tupli din
figura 7, s-ar obine 42 de tupli, din cauza dublurilor ce ar aprea ca urmare
a faptului c unii domnitori au domnit de mai multe ori, precum i a faptului
c unii domnitori au avut mai muli copii (de exemplu, att Mircea cel
Btrn ct i Vlad Dracul ar aprea fiecare de cte opt ori, deoarece ambii
au domnit de cte dou ori i au avut cte patru copii).
De remarcat c, n acest caz, rezultatul ar fi acelai dac s-ar nlocui
DISTINCTROW cu DISTINCT, ceea ce ns nu este adevrat n general
(vezi urmtoarele dou interogri i problema 2).
Aparent, pentru a obine acest rezultat, ar fi suficient doar join-ul ntre
DOMNII i TATA, conform urmtoarei instruciuni:
(Q036)SELECT DISTINCTROW Domnitor AS DomniTai
FROM Tata INNER JOIN Domnii
ON Tata.Tata = Domnii.Domnitor
ORDER BY Domnitor;
n acest caz ns, rezultatul conine dubluri (i anume, pentru fiecare
domnitor, cte o apariie per domnie, deci pe lng tuplii din figura 7, ar mai
aprea nc cte unul cu Dan II, Mircea cel Btrn, Vlad Dracul i Vlad
epe) deoarece DISTINCTROW face proiecia doar pe tabela TATA
(eliminnd deci doar dublurile datorate domnitorilor cu mai muli copii) i
nu i pe DOMNII. Cum n PERSOANE exist un singur tuplu per domnitor,
(Q035) apeleaz i la joinul cu aceast tabel pentru ca DISTINCTROW s
elimine i dublurile datorate domniilor multiple.
Urmtoarea instruciune ns (al crui rezultat pentru bd din figura 1 este
exact cel din figura 7, obinut, mai complicat, de (Q035)!), constituie un
exemplu al diferenei ntre predicatele DISTINCT i DISTINCTROW.
(Q037)SELECT DISTINCT Domnitor AS DomniTai
FROM Tata INNER JOIN Domnii
ON Tata.Tata = Domnii.Domnitor
ORDER BY Domnitor;
Instruciunea urmtoare ofer doar primele 10 domnii avnd cele mai lungi
durate dintre cele ale tuturor domniilor memorate de bd (figura 8a prezint rezultatul ei pentru bd din figura 1):
25
Domnitor
Alexandru cel Bun
Alexndrel
Bogdan I
Bogdan II
Ilia
Ilia
Iuga Vod
Lacu
Petru Aron
Petru Aron
Petru II
Petru Muat
Roman I
Roman II
tefan cel Mare
tefan I
tefan II
tefan II
DeLa
1400
1452
1363
1449
1432
1435
1399
1365
1451
1455
1448
1374
1391
1447
1457
1394
1433
1442
La
1432
1455
1365
1451
1433
1442
1400
1374
1452
1457
1449
1391
1394
1448
1504
1399
1435
1447
CopilDomnitor
Alexandru Aldea
Basarab epelu
Dan I
Dan II
Dan II
Laiot Basarab
Mihail I
Mircea cel Btrn
Mircea cel Btrn
Nicolae Alexandru
Radu cel Frumos
Radu cel Mare
Radu I
Radu II Pleuvul
Vlad Clugrul
Vlad Dracul
Vlad Dracul
Vlad epe
Vlad epe
Vlad Uzurpatorul
Vladislav II
Vladislav II
Vladislav Vlaicu
CopilDomnitor
Alexandru Aldea
Basarab epelu
Dan I
Dan II
Laiot Basarab
Mihail I
Mircea cel Btrn
Nicolae Alexandru
Radu cel Frumos
Radu cel Mare
Radu I
Radu II Pleuvul
Vlad Clugrul
Vlad Dracul
Vlad epe
Vlad Uzurpatorul
Vladislav II
Vladislav Vlaicu
DomniTai
Basarab I
Basarab epelu
Dan I
Dan II
Laiot Basarab
Mircea cel Btrn
Nicolae Alexandru
Radu cel Frumos
Radu cel Mare
Radu I
Vlad Clugrul
Vlad Dracul
Vlad epe
Figura 7 Primii
domnitori Basarabi
ce au avut copii,
n ordine alfabetic
a) cu dubluri datorate
multiplelor domnii
Figura 6 Copiii primilor
domnitori Basarabi care au
domnit i ei la rndul lor
Domnitor
Durata
Basarab I
42
Mircea cel Btrn
22
Vlad Clugrul
14
Vladislav Vlaicu
13
Radu cel Mare
13
Nicolae Alexandru
12
Radu cel Frumos
11
Vladislav II
9
Mircea cel Btrn
8
Radu I
7
DeLa
1310
1396
1481
1364
1495
1352
1462
1447
1386
1377
La
1352
1418
1495
1377
1508
1364
1473
1456
1394
1384
Domnitor
Durata DeLa La
Basarab I
42 1310 1352
Mircea cel Btrn
22 1396 1418
Vlad Clugrul
14 1481 1495
b) primele 10%
b) fr dubluri (cu
Domnitor Durata DeLa
nume distincte)
Vladislav II
Vlad epe
Dan I
La
1 1442 1443
1 1476 1477
2 1384 1386
c) ultimele 10%
a) primele 10
Domnitor
Durata
Basarab I
42
Nicolae Alexandru
12
Vladislav Vlaicu
13
DeLa
1310
1352
1364
La
1352
1364
1377
26
11) Evident c operatorii LEFT i RIGHT JOIN, ca i cel de JOIN sunt operatori
compui. Pentru definiia lor exact, detalii i exemple vezi operatorul UNION
(subseciunea 3.1.3).
Exemplul 13
Urmtoarea instruciune calculeaz copiii domnitorilor aflai n via la
(sau care au decedat n acelai an cu) momentul terminrii domniilor prinilor lor (rezultatul ei pentru bd din figura 1 este prezentat n figura 9):
(Q044)SELECT DISTINCT Domnii.Domnitor, Tata.Copil
FROM (Domnii INNER JOIN Persoane
ON Domnii.La<=Persoane.Moarte) INNER JOIN
Tata ON (Persoane.Nume=Tata.Copil) AND
(Domnii.Domnitor=Tata.Tata)
ORDER BY Domnii.Domnitor, Tata.Copil;
Urmtoarea instruciune calculeaz domnitorii i prinii lor (figura 10
prezint rezultatul ei pentru bd din figura 1):
(Q045)SELECT DISTINCT Domnitor, Mama, Tata
FROM (Mama RIGHT JOIN Domnii
ON Mama.Copil=Domnii.Domnitor) LEFT JOIN
Tata ON Domnii.Domnitor=Tata.Copil
ORDER BY Domnii.Domnitor;
Urmtoarea instruciune calculeaz copiii domnitorilor i mamele lor
(rezultatul ei pentru bd din figura 1 este prezentat n figura 11):
(Q046)SELECT DISTINCT Tata.Copil, Domnitor, Mama
FROM (Mama RIGHT JOIN Tata
ON Mama.Copil = Tata.Copil) INNER JOIN
Domnii ON Tata.Tata = Domnii.Domnitor
ORDER BY Tata.Copil;
Urmtoarea instruciune ns, cu care am dori s calculm domnitorii,
eventualii lor copii, inclusiv anul morii i mamele acestora, este eronat
(mesajul de eroare preciznd c ea are joinuri externe ambigue):
(Q047)SELECT DISTINCT Domnii.Domnitor, Tata.Copil,
Persoane.Moarte, Mama.Mama
FROM ((Domnii LEFT JOIN Tata
ON Domnii.Domnitor = Tata.Tata) LEFT JOIN
Mama ON Tata.Copil = Mama.Copil) INNER JOIN
Persoane ON Tata.Copil = Persoane.Nume
ORDER BY Domnii.Domnitor, Tata.Copil;
Acest lucru este de ateptat, deoarece e posibil s existe domnitori fr copii
i deci INNER JOIN-ul nu este definit. Ca atare, n loc de INNER JOIN este
nevoie tot de un LEFT JOIN (rezultatul fiind prezentat n figura 12):
(Q048)SELECT DISTINCT Domnii.Domnitor, Tata.Copil,
Persoane.Moarte, Mama.Mama
FROM ((Domnii LEFT JOIN Tata
ON Domnii.Domnitor = Tata.Tata) LEFT JOIN
Mama ON Tata.Copil = Mama.Copil) LEFT JOIN
Persoane ON Tata.Copil = Persoane.Nume
ORDER BY Domnii.Domnitor, Tata.Copil;
3.1.1.3
Clauza WHERE
Domnitor
Nume
Basarab I
Nicolae Alexandru
Basarab epelu
Neagoe Basarab
Dan I
Dan II
Dan I
Vlad Uzurpatorul
Dan II
Laiot Basarab
Dan II
Vladislav II
Mircea cel Btrn
Alexandru Aldea
Mircea cel Btrn
Mihail I
Mircea cel Btrn
Radu II Pleuvul
Mircea cel Btrn
Vlad Dracul
Nicolae Alexandru Radu I
Nicolae Alexandru Vladislav Vlaicu
Radu cel Frumos
Maria Voichia
Radu cel Mare
Mircea Ciobanul
Radu cel Mare
Radu de la Afumai
Radu I
Dan I
Radu I
Mircea cel Btrn
Vlad Clugrul
Radu cel Mare
Vlad Clugrul
Vlad cel Tnr
Vlad Dracul
Mircea
Vlad Dracul
Vlad Clugrul
Vlad Dracul
Vlad epe
Vlad epe
Mihnea cel Ru
Figura 9 Copiii domnitorilor Basarabi nc n via n anul terminrii domniilor prinilor lor
Domnitor
Alexandru Aldea
Basarab I
Basarab epelu
Dan I
Dan II
Laiot Basarab
Mihail I
Mircea cel Btrn
Nicolae Alexandru
Radu cel Frumos
Radu cel Mare
Radu I
Radu II Pleuvul
Vlad Clugrul
Vlad Dracul
Vlad epe
Vlad Uzurpatorul
Vladislav II
Vladislav Vlaicu
Figura 10
Mama
Tata
Mircea cel Btrn
Laiot Basarab
Radu I
Dan I
Dan II
Mircea cel Btrn
Radu I
Basarab I
Mtu tefan cel Mare
Vlad Dracul
Vlad Clugrul
Maria
Nicolae Alexandru
Mircea cel Btrn
Mtu tefan cel Mare
Vlad Dracul
Mircea cel Btrn
Mtu tefan cel Mare
Vlad Dracul
Dan I
Dan II
Maria
Nicolae Alexandru
Primii domnitori Basarabi i prinii lor
30
Copil
Domnitor
Mama
Alexandru Aldea
Mircea cel Btrn
Ana
Nicolae Alexandru Clara
Anca
Nicolae Alexandru Clara
Basarab epelu
Laiot Basarab
Dan I
Radu I
Dan II
Dan I
Elisabeta
Nicolae Alexandru Maria
Laiot Basarab
Dan II
Maria Voichia
Radu cel Frumos
Mihail I
Mircea cel Btrn
Mihnea cel Ru
Vlad epe
Mircea
Vlad Dracul
Mtu tefan cel Mare
Mircea cel Btrn Radu I
Mircea Ciobanul
Radu cel Mare
Neagoe Basarab
Basarab epelu
Nicolae Alexandru Basarab I
Radu cel Frumos
Vlad Dracul
Mtu tefan cel Mare
Radu cel Mare
Vlad Clugrul
Radu de la Afumai Radu cel Mare
Radu I
Nicolae Alexandru Maria
Radu II Pleuvul
Mircea cel Btrn
Radu Paisie
Radu cel Mare
Vlad
Vlad epe
Elena
Vlad Clugrul
Vlad Dracul
Mtu tefan cel Mare
Vlad cel Tnr
Vlad Clugrul
Vlad Dracul
Mircea cel Btrn
Vlad epe
Vlad Dracul
Mtu tefan cel Mare
Vlad Uzurpatorul Dan I
Vladislav II
Dan II
Vladislav Vlaicu
Nicolae Alexandru Maria
Figura 11 Copiii domnitorilor Basarabi i prinii lor
Observaii:
1) Dac clauza WHERE lipsete, rezultatul conine toi tuplii tabelelor implicate.
2) Dac este prezent, clauza WHERE urmeaz obligatoriu dup clauza FROM.
3) WHERE folosete i la eliminarea tuplilor ce nu trebuie grupai (vezi 3.1.1.6).
4) Se pot conecta cu AND i OR n WHERE maxim 40 de expresii atomice.
5) Literalii de tip date calendaristice trebuie folosii n format U.S. (i.e.#ll/zz/aa#,
adic n ordinea lun, zi, an, separate ntre ele de /), chiar dac versiunea Jet
folosit nu este de tip U.S. Dac Windows este configurat pentru o alt limb, ale
crei formate pentru date difer de cele U.S., se poate folosi ns funcia VBA
DateValue, care convertete formatul de dat curent n cel U.S.
6) Dac vreun atribut referit n criteriu este de tip GUID20, criteriu are o sintax
diferit (n care acoladele i liniuele de unire sunt eseniale); de exemplu:
20
31
Domnitor
Copil
MoarteCopil
Mama
Alexandru Aldea
Basarab I
Nicolae Alexandru
1364
Basarab epelu
Neagoe Basarab
1521
Dan I
Dan II
1431
Dan I
Vlad Uzurpatorul
1396
Dan II
Laiot Basarab
1477
Dan II
Vladislav II
1456
Laiot Basarab
Basarab epelu
Mihail I
Mircea cel Btrn Alexandru Aldea
1436
Mircea cel Btrn Mihail I
1420
Mircea cel Btrn Radu II Pleuvul
1427
Mircea cel Btrn Vlad Dracul
1447
Nicolae Alexandru Ana
Clara
Nicolae Alexandru Anca
Clara
Nicolae Alexandru Elisabeta
Maria
Nicolae Alexandru Radu I
1384
Maria
Nicolae Alexandru Vladislav Vlaicu
1377
Maria
Radu cel Frumos Maria Voichia
1511
Radu cel Mare
Mircea Ciobanul
1559
Radu cel Mare
Radu de la Afumai
1529
Radu cel Mare
Radu Paisie
Radu I
Dan I
1386
Radu I
Mircea cel Btrn
1418
Radu II Pleuvul
Vlad Clugrul
Radu cel Mare
1508
Vlad Clugrul
Vlad cel Tnr
1512
Vlad Dracul
Mircea
1447
Mtu tefan cel Mare
Vlad Dracul
Radu cel Frumos
Mtu tefan cel Mare
Vlad Dracul
Vlad Clugrul
1495
Mtu tefan cel Mare
Vlad Dracul
Vlad epe
1477
Mtu tefan cel Mare
Vlad epe
Mihnea cel Ru
1509
Vlad epe
Vlad
Elena
Vlad Uzurpatorul
Vladislav II
Vladislav Vlaicu
Figura 12 Primii domnitori Basarabi, copiii lor, mamele i anul morii acestora
WHERE ReplicaID={GUID{12345678-90AB-CDEF-1234-567890ABCDEF}}
32
a. ara Romneasc
b. Moldova
Figura 13 Capitalele rii Romneti i Moldovei, cu anii aproximativi de stabilire a lor
Domnitor
Basarab I
Vladislav Vlaicu
Mihail I
Capitala
Cmpulung Muscel
Curtea de Arge
Trgovite
Domnitor
Bogdan I
Petru Muat
Capitala
Siret
Suceava
a. ara Romneasc
b. Moldova
Figura 14 Rezultatele interogrii (Q049) asupra relaiilor din figurile 13 i 1, respectiv 2
Observaii:
1) listachar poate include aproape toate caracterele ANSI;. pentru a include i
caracterele folosite drept metacaractere (i.e. [, ?, _, #, *), apariiile acestora trebuie
nchise n paranteze drepte; listachar nu poate include metacaracterul ].
2) n listachar se pot specifica nu doar caractere, ci i intervale de caractere ale
cror limite sunt separate prin -; de exemplu, [A-Z] reprezint orice liter mare;
pot fi incluse mai multe intervale, folosind mai multe liniue despritoare ': de
exemplu, [a-zA-Z0-9] semnific orice caracter alfanumeric (i.e. litere mari, mici i
cifre).
3) ! este considerat drept metacaracter doar n construcii de tip [!listachar], unde
are rolul operatorului logic de negaie.
4) este considerat drept metacaracter doar n construcii de tip [!listachar], cu
excepia eventualelor sale apariii ca prim (dup [ sau [!), respectiv ultim
caracter al grupului (nainte de ]), caz n care este considerat drept caracter.
5) n specificarea intervalelor de caractere este obligatorie ordonarea lexicografic
cresctoare: de exemplu, intervalele [A-Z] sau [0-100] sunt valide, n timp ce
intervalele [Z-A] sau [100-0] sunt considerate drept invalide.
6) Secvena de caractere [ ] este ignorat, fiind considerat totuna cu irul vid .
Exemplul 15 Urmtoarea instruciune calculeaz submulimea domniilor
acelor domnitori al cror nume conine subirul vlad i care i-au nceput
domnia n secolul XV (rezultatul ei este prezentat n figura 15):
(Q051)SELECT * FROM Domnii WHERE (Domnitor LIKE
'*vlad*' AND DeLa LIKE '14??');
Domnitor
Vlad Dracul
Vladislav II
Vlad Dracul
Vladislav II
Vlad epe
Vlad epe
Vlad Clugrul
DeLa
1436
1442
1443
1447
1456
1476
1481
La
1442
1443
1447
1456
1462
1477
1495
3.1.1.4.2 Operatorul IN
Operatorul IN implementeaz predicatul de apartenen la o mulime discret (i.e.
determin dac valoarea unei expresii este egal cu vreuna dintre valorile unei liste de
expresii). Sintaxa sa este urmtoarea:
expr [NOT] IN (val1, val2, . . .).
Semnificaia variabilelor utilizate este urmtoarea:
Variabil
Descriere
expr
Expresie identificnd atributul de evaluat.
val1, val2, ... List de expresii cu a cror valoare se compar valoarea expr.
Observaii:
1) Dac valoarea expr este printre cele ale listei val1, val2, . . ., atunci IN are
valoarea adevrat, iar altfel fals.
2) Evident, NOT IN are semantica dual celei lui IN.
3) abloanele folosind metacaracterele nu se pot utiliza n IN.
34
Nume
Moarte Necropol
Bogdan III
1517 Putna
Bogdnel
1477 Putna
Ilie
1472 Putna
Maria
1518 Putna
Maria de Mangop
1477 Putna
Maria Voichia
1511 Putna
Petru Ptracu
1480 Putna
tefan cel Mare
1504 Putna
Anastasia
Rdui
Bogdan
1407 Rdui
Bogdan I
1365 Rdui
Bogdan II
1451 Rdui
Lacu
1374 Rdui
Petru Muat
1391 Rdui
Roman I
1394 Rdui
tefan I
1399 Rdui
Figura 16 Muatini nhumai n bisericile din Putna i Rdui
3.1.1.5
Funciile de agregare
tuplii rezultatului (ignornd doar eventualele valori nule, ceea ce, pentru
acest exemplu, nu este cazul):
(Q056)SELECT Count(Domnitor) AS NrDomni FROM Domnii;
Pentru a calcula numrul domnitorilor este nevoie de doi pai: se salveaz
sub un nume oarecare (de exemplu: Q057) instruciunea urmtoare (care
calculeaz toi domnitorii, eliminnd ns duplicatele datorate domniilor
multiple):
(Q057)SELECT DISTINCT Domnitor FROM Domnii;
n al doilea pas, se execut urmtoarea instruciune asupra ei i nu asupra
DOMNII (rezultatele aplicrii acestei instruciuni sunt prezentate n figura
18 c i d):
(Q058)SELECT Count(*) AS NrDomni FROM Q057;
De reinut c expr nu poate conine predicatele DISTINCT,
DISTINCTROW sau TOP (i de aceea este nevoie de doi pai:
Count(DISTINCT Domnitor) este ilegal).
Aplicat bd din figura 2, urmtoarea instruciune calculeaz numrul de
Muatini nhumai n cea mai veche catedral-panteon a Moldovei
(Rdui):
(Q059)SELECT Count(Necropol) AS NrPersoane
FROM Persoane
WHERE (((Necropol)=Rdui));
Rezultatul ei este prezentat n figura 19a; desigur c dac ar fi aplicat bd din
figura 1, numrul respectiv ar fi 0; figura 19b prezint ns rezultatul aplicrii
asupra bd din figura 1 a instruciunii similare celei de mai sus, unde s-a nlocuit
Rdui cu Cmpulung (catedrala echivalent pentru ara Romneasc).
Urmtoarea instruciune calculeaz numrul persoanelor pentru care este
memorat i locul nhumrii (rezultatele ei pentru bd din figurile 1 i 2 sunt
prezentate n figura 20); de observat c valorile nule nu sunt numrate:
(Q060)SELECT Count(Necropol) AS NrNecropol
FROM Persoane;
Urmtoarea instruciune calculeaz numrul persoanelor pentru care este
memorat mcar una din informaiile privind anul morii i locul nhumrii
(rezultatele ei pentru bd din figurile 1 i 2 sunt prezentate n figura 21); de
observat c tuplii avnd valori nule n amndou coloanele nu sunt numrai:
(Q061)SELECT Count([Moarte] & [Necropol]) AS
NrMoarteNecropol FROM Persoane;
3.1.1.5.3 Funciile First i Last
Aceste funcii ofer o valoare (indicat de argumentul lor) din primul, respectiv
ultimul tuplu al operandului interogrii. Sintaxa lor este First(expr), respectiv
Last(expr), unde expr reprezint o expresie ir de caractere identificnd valorile
numerice a cror selecie se dorete.
Observaii:
1) Operanzii expr pot fi nume de atribute, constante sau funcii VBA (dar nu alte
funcii de agregare SQL).
2) Primul i ultimul tuplu al unei tabele sunt considerate n ordinea cheii primare a
acesteia, iar n absena ei, n ordinea cronologic a memorrii lor n tabel. Chiar
dac n interogare este prezent clauza ORDER BY, deoarece selecia primului,
respectiv ultimului tuplu se face naintea ordonrii, rezultatul obinut de aplicarea
First sau Last este acelai ca i n absena acestei clauze.
37
DurataMedie
7,83
DurataMedie
8,25
a) ara Romneasc
b) Moldova
Figura 17 Durata medie (n ani) a domniilor din primele dou secole ale Principatelor
Romneti
NrDomni
19
NrDomnii
18
NrDomnii
24
NrDomni
15
a) ara Romneasc
b) Moldova
c) ara Romneasc
d) Moldova
Figura 18 Numrul de domnii i domnitori din primele dou secole ale Principatelor Romneti
NrPersoane
8
NrNecropol
9
NrPersoane
2
a) Rdui
b) Cmpulung Muscel
Figura 19 Numrul de persoane din
familiile domnitoare nhumate n
primele catedrale-panteon romneti
NrNecropol
22
a) Basarabi
b) Muatini
Figura 20 Numrul de persoane din familiile
domnitoare pentru care este precizat locul
nhumrii
NrMoarteNecropol
27
NrMoarteNecropol
25
a) ara Romneasc
b) Moldova
Figura 21 Numrul de persoane pentru care e precizat anul morii sau necropola
Fondator
Bogdan I
Fondator
Basarab I ntemeietorul
a) ara Romneasc
Figura 22 Fondatorii primelor dinastii ale Principatelor Romne
b) Moldova
DurataMax
47
DurataMax
42
a) ara Romneasc
b) Moldova
Figura 23 Duratele maxime de domnie n primelor dou secole ale Principatelor Romne
DevStdDurateDomnii
12,4534427085091
DevStdDurateDomnii
8,85756861328945
a) ara Romneasc
b) Moldova
Figura 24 Deviaiile standard pentru duratele domniilor din figura 1, respectiv 2
TotalAni
141
TotalAni
198
a) ara Romneasc
b) Moldova
Figura 25 Totalul duratelor domniilor n ara Romneasc i Moldova conform datelor din
figura 1, respectiv 2
VarDurateDomnii
155,088235294118
VarDurateDomnii
78,4565217391304
a) ara Romneasc
b) Moldova
Figura 26 Variana pentru duratele domniilor din figura 1, respectiv 2
38
Exemplul 20 Cel mai simplu mod de a calcula fondatorul dinastiei este oferit
de urmtoarea instruciune:
(Q062)SELECT First(Domnitor) AS Fondator
FROM Domnii;
Rezultatul ei (prezentat n figura 22) se bazeaz evident pe faptul c
atributul DeLa este cheie primar i deci domniile sunt oferite de bd n
ordinea lor cronologic.
Instruciunea urmtoare nu este nici mcar acceptat de sistem (eroarea
semnalat: expresia [La]-[DeLa] nu este inclus n nici o agregare):
(Q063)SELECT Last(La-DeLa) AS DurataMax FROM Domnii
ORDER BY La-DeLa;
Este acceptat n schimb instruciunea:
(Q064)SELECT Last(La-DeLa) AS DurataMax FROM Domnii
ORDER BY Last(La-DeLa);
care este ns evident lipsit de sens (ordonate dup durata memorat de
ultimul tuplu?!?) i care, desigur, ntoarce durata ultimei domnii din tabel,
ceea ce s-ar obine i fr clauza ORDER BY, cu instruciunea:
(Q065)SELECT Last(La-DeLa) AS DurataMax FROM Domnii;
Cu ajutorul urmtoarei instruciuni, bazat din nou pe cheia primar DeLa,
se poate calcula totalul duratelor domniilor de interes (rezultatul este prezentat n figura 25):
(Q066)SELECT Last(La)-First(DeLa) AS TotalAni
FROM Domnii;
3.1.1.5.4 Funciile Min i Max
Funciile Min i Max calculeaz valoarea minim, respectiv maxim a unei mulimi
de valori. Sintaxa lor este Min(expr), respectiv Max(expr), unde expr reprezint o
expresie ir de caractere identificnd valorile numerice pentru care se dorete calculul
minimului, respectiv maximului.
Observaii:
1) Operanzii expr pot fi nume de atribute, constante sau funcii VBA (dar nu alte
funcii de agregare SQL).
2) n absena clauzei GROUP BY, este considerat ntreaga tabel rezultat pentru a
calcula un unic minim sau maxim; n prezena ei, se calculeaz cte un minim,
respectiv maxim per grup.
Exemplul 21 Urmtoarea instruciune calculeaz durata maxim a domniilor
(figura 23 prezint rezultatul ei pentru bd din figura 1 i 2):
(Q067)SELECT Max(La-DeLa) AS DurataMax FROM Domnii;
3.1.1.5.5 Funciile StDev i StDevP
Funciile StDev i StDevP calculeaz valoarea deviaiei standard21 pentru o
populaie, respectiv un eantion de populaie reprezentate ca o mulime de valori ale
unui atribut al relaiei rezultat a unei interogri. Sintaxa lor este StDev(expr), respectiv
StDevP(expr), unde expr reprezint o expresie ir de caractere identificnd valorile
numerice pentru care se dorete calculul deviaiei standard corespunztoare.
21
Deviaia standard este un parametru ce indic modul n care o funcie probabilistic este centrat n
jurul mediei ei i care este egal cu rdcina ptrat din deviaia de la medie; este folosit pentru a descrie
ct de departe variaz valorile unei mulimi n raport cu media lor aritmetic.
39
Observaii:
1) Operanzii expr pot fi nume de atribute, constante sau funcii VBA (dar nu alte
funcii de agregare SQL).
2) Dac relaia rezultat al interogrii ce memoreaz populaia conine mai puin de
doi tupli (respectiv nici un tuplu, n cazul eantioanelor de populaie) funcia
ntoarce valoarea NULL (ce indic imposibilitatea calculrii deviaiei standard).
Exemplul 22 Urmtoarea instruciune calculeaz deviaia standard a duratei
domniilor (rezultatele ei sunt prezentate n figura 24):
(Q068)SELECT StDev(La-DeLa) AS DevStdDurateDomnii
FROM Domnii;
3.1.1.5.6 Funcia Sum
Funcia Sum calculeaz suma unei mulimi de valori numerice. Sintaxa ei este
Sum(expr), unde expr reprezint o expresie ir de caractere identificnd valorile
numerice pentru care se dorete calculul sumei.
Observaii:
1) Operanzii expr pot fi nume de atribute, constante sau funcii VBA (dar nu alte
funcii de agregare SQL).
2) Valorile NULL sunt ignorate.
3) n absena clauzei GROUP BY, este considerat ntreaga tabel rezultat pentru a
calcula suma; n prezena ei, se calculeaz cte o sum per grup.
Exemplul 23 Cu ajutorul urmtoarei instruciuni, de data aceasta fcnd
complet abstracie de cheia primar a tabelei (aa cum este normal!), se
poate calcula totalul duratelor domniilor de interes (rezultatul pentru bd din
figurile 1 i 2 este prezentat n figura 25):
(Q069)SELECT Sum(La-Dela) AS TotalAni FROM Domnii;
3.1.1.5.7 Funciile Var i VarP
Funciile Var i VarP calculeaz valoarea varianei22 pentru o populaie, respectiv
un eantion de populaie reprezentate ca o mulime de valori ale unui atribut al relaiei
rezultat a unei interogri.
Sintaxa lor este Var(expr), respectiv VarP(expr), unde expr reprezint o expresie ir
de caractere identificnd valorile numerice pentru care se dorete calculul varianei
corespunztoare.
Observaii:
1) Operanzii expr pot fi nume de atribute, constante sau funcii VBA (dar nu alte
funcii de agregare SQL).
2) Dac relaia rezultat al interogrii ce memoreaz populaia conine mai puin de
doi tupli, funciile ntorc valoarea NULL (ce indic imposibilitatea calculrii
varianei).
Exemplul 24 Urmtoarea instruciune calculeaz variana duratei domniilor
(rezultatele ei sunt prezentate n figura 26):
(Q070)SELECT Var(La-DeLa) AS VarDurateDomnii
FROM Domnii;
22
Variana este egal cu ptratul deviaiei standard; este i ea o msur a distanei cu care valorile unei
mulimi se ndeprteaz de medie.
40
3.1.1.6
Clauza GROUP BY
GROUP BY Mama
ORDER BY Max(La-DeLa) DESC, Mama;
Pentru a calcula capitala curent n momentul nceperii fiecrei domnii
(vezi figura 29) este nevoie de doi pai: nti se calculeaz pentru fiecare
domnie maximul dintre toi anii de stabilire a capitalei cu ajutorul
urmtoarei instruciuni (de notat i obligativitatea calificrii operandului
Max cu numele tabelei: n lipsa acestuia, datorit faptului c rezultatul
expresiei corespunztoare se numete tot An, SQL raporteaz o eroare
sintactic de definire circular!):
(Q073)SELECT Max(CInt(Capitala.An)) AS An,
Domnitor, DeLa, La
FROM Domnii, Capitale
WHERE (CInt(An)<=DeLa)
GROUP BY Domnitor, DeLa, La;
Apoi, salvnd interogarea de mai sus sub un nume oarecare (de exemplu,
Q073), se obine rspunsul dorit cu ajutorul instruciunii urmtoare (care
nlocuiete anii stabilirii capitalelor cu nsei capitalele):
(Q074)SELECT Domnitor, DeLa, La, Capitala
FROM Capitale INNER JOIN Q073
ON CInt(Capitale.An) = Q073.An
ORDER BY DeLa;
Urmtoarea instruciune calculeaz numrul total al anilor de domnie
pentru fiecare voievod n parte, prezentndu-i n ordinea descresctoare a
totalurilor, iar n caz de egalitate, n ordinea cresctoare a numelor
(rezultatele ei sunt prezentate n figura 30):
(Q075)SELECT Domnitor, Sum(La-DeLa) AS TotalAniDomnie
FROM Domnii GROUP BY Domnitor
ORDER BY Sum(La-DeLa) DESC, Domnitor;
Urmtoarea instruciune nu calculeaz corect numrul de copii ai
domnitorilor, deoarece predicatul DISTINCT se aplic dup funcia de
agregare Count (i nu invers; vezi 3.1.1.5.2); ca atare, pentru domnitorii ce
au avut mai multe domnii, numrul de copii avui se multiplic, n mod
eronat, cu numrul domniilor:
(Q076)SELECT DISTINCT Domnitor, Count(Copil) AS
NrCopii
FROM Tata RIGHT JOIN Domnii
ON Tata.Tata = Domnii.Domnitor
GROUP BY Domnitor
ORDER BY Count(Copil) DESC, Domnitor;
Pentru a calcula corect numrul copiilor, este nevoie deci de doi pai: se
salveaz nti sub un nume oarecare (de exemplu: Q077) instruciunea:
(Q077)SELECT DISTINCT Domnitor, Copil
FROM Tata RIGHT JOIN Domnii
ON Tata.Tata = Domnii.Domnitor;
dup care, urmtoarea instruciune (al crei rezultat este prezentat n figura
31) calculeaz numrul copiilor, oferit n ordine descresctoare (iar n caz de
egalitate, n ordinea alfabetic a domnitorilor):
(Q078)SELECT Domnitor, Count(Copil) AS NrCopii
FROM Q077 GROUP BY Domnitor
ORDER BY Count(Copil) DESC, Domnitor;
42
NrDomnii
Domnitor
1 Alexandru Aldea
1 Basarab I
1 Basarab epelu
1 Dan I
1 Laiot Basarab
1 Mihail I
1 Nicolae Alexandru
1 Radu cel Frumos
1 Radu cel Mare
1 Radu I
1 Radu II Pleuvul
1 Vlad Clugrul
1 Vlad Uzurpatorul
1 Vladislav Vlaicu
2 Dan II
2 Mircea cel Btrn
2 Vlad Dracul
2 Vlad epe
2 Vladislav II
NrDomnii
Domnitor
1 Alexandru cel Bun
1 Alexndrel
1 Bogdan I
1 Bogdan II
1 Iuga Vod
1 Lacu
1 Petru II
1 Petru Muat
1 Roman I
1 Roman II
1 tefan cel Mare
1 tefan I
2 Ilia
2 Petru Aron
2 tefan II
b) Moldova
a) ara Romneasc
Figura 27 Numrul domniilor per domnitor pentru bd din figurile 1 i 2
Mama
MaxDomnieCopii
Mtu
14
tefan cel Mare
Maria
13
Clara
Elena
a) ara Romneasc
Mama
MaxDomnieCopii
Maria Oltea Basarab
47
Anastasia
32
Margareta Muata
17
Ana Neaca
7
Sor Petru Muat?
5
Mariana
2
Evdochia
Maria de Mangop
Maria Rare din Hrlu
Maria Voichia
b) Moldova
Figura 28 Maximum domniilor pentru copiii fiecrei mame din bd prezentate n figurile 1 i 2
De remarcat c, atunci cnd numr doar valori NULL, funcia Count are
drept rezultat, n mod corect, valoarea 0 (i nu 1): altfel spus, apariia unui
NULL nu este numrat ca atare, ci ea semnalizeaz mulimea vid.
3.1.1.7
Clauza HAVING
Clauza HAVING specific care dintre tuplii grupai de clauza GROUP BY sunt
reinui n final pentru rezultatul interogrii; sintaxa ei este urmtoarea:
SELECT listacoloane FROM expresietabele [WHERE criteriu]
GROUP BY listacoloanegrupare
[HAVING criteriugrupare]
43
Domnitor
Basarab I
Nicolae Alexandru
Vladislav Vlaicu
Radu I
Dan I
Mircea cel Btrn
Vlad Uzurpatorul
Mircea cel Btrn
Mihail I
Dan II
Radu II Pleuvul
Dan II
Alexandru Aldea
Vlad Dracul
Vladislav II
Vlad Dracul
Vladislav II
Vlad epe
Radu cel Frumos
Laiot Basarab
Vlad epe
Basarab epelu
Vlad Clugrul
Radu cel Mare
DeLa
1310
1352
1364
1377
1384
1386
1394
1396
1418
1420
1424
1426
1431
1436
1442
1443
1447
1456
1462
1473
1476
1477
1481
1495
La
Capitala
1352 Cmpulung Muscel
1364 Cmpulung Muscel
1377 Cmpulung Muscel
1384 Curtea de Arge
1386 Curtea de Arge
1394 Curtea de Arge
1396 Curtea de Arge
1418 Curtea de Arge
1420 Curtea de Arge
1424 Trgovite
1425 Trgovite
1431 Trgovite
1436 Trgovite
1442 Trgovite
1443 Trgovite
1447 Trgovite
1456 Trgovite
1462 Trgovite
1473 Trgovite
1476 Trgovite
1477 Trgovite
1481 Trgovite
1495 Trgovite
1508 Trgovite
Domnitor
DeLa La Capitala
Bogdan I
1363 1365 Siret
Lacu
1365 1374 Siret
Petru Muat
1374 1391 Siret
Roman I
1391 1394 Suceava
tefan I
1394 1399 Suceava
Iuga Vod
1399 1400 Suceava
Alexandru cel Bun 1400 1432 Suceava
Ilia
1432 1433 Suceava
tefan II
1433 1435 Suceava
Ilia
1435 1442 Suceava
tefan II
1442 1447 Suceava
Roman II
1447 1448 Suceava
Petru II
1448 1449 Suceava
Bogdan II
1449 1451 Suceava
Petru Aron
1451 1452 Suceava
Alexndrel
1452 1455 Suceava
Petru Aron
1455 1457 Suceava
tefan cel Mare
1457 1504 Suceava
b) Moldova
a) ara Romneasc
Figura 29 Capitalele Principatelor Romne pentru domniile secolelor XIV i XV
Domnitor
TotalAniDomnie
Basarab I
42
Mircea cel Btrn
30
Vlad Clugrul
14
Radu cel Mare
13
Vladislav Vlaicu
13
Nicolae Alexandru
12
Radu cel Frumos
11
Vlad Dracul
10
Vladislav II
10
Dan II
9
Radu I
7
Vlad epe
7
Alexandru Aldea
5
Basarab epelu
4
Laiot Basarab
3
Dan I
2
Mihail I
2
Radu II Pleuvul
2
Vlad Uzurpatorul
2
Domnitor
TotalAniDomnie
tefan cel Mare
47
Alexandru cel Bun
32
Petru Muat
17
Lacu
9
Ilia
8
tefan II
7
tefan I
5
Alexndrel
3
Petru Aron
3
Roman I
3
Bogdan I
2
Bogdan II
2
Iuga Vod
1
Petru II
1
Roman II
1
b) Moldova
a) ara Romneasc
Figura 30 Duratele domniilor Basarabe i Muatine din secolele XIV i XV
44
Domnitor
Nicolae Alexandru
Mircea cel Btrn
Vlad Dracul
Radu cel Mare
Dan I
Dan II
Radu I
Vlad Clugrul
Vlad epe
Basarab I
Basarab epelu
Laiot Basarab
Radu cel Frumos
Alexandru Aldea
Mihail I
Radu II Pleuvul
Vlad Uzurpatorul
Vladislav II
Vladislav Vlaicu
NrCopii
5
4
4
3
2
2
2
2
2
1
1
1
1
0
0
0
0
0
0
Domnitor
tefan cel Mare
Alexandru cel Bun
Bogdan I
Ilia
Roman I
Bogdan II
Alexndrel
Iuga Vod
Lacu
Petru Aron
Petru II
Petru Muat
Roman II
tefan I
tefan II
NrCopii
8
6
2
2
2
1
0
0
0
0
0
0
0
0
0
b) Moldova
a) ara Romneasc
Figura 31 Numrul de copii ai primilor domnitori Basarabi i Muatini
NrCopii
4
3
2
2
2
2
2
2
Domnitor
NrCopii
Alexandru cel Bun
4
tefan cel Mare
3
Bogdan I
2
Roman I
2
b) Moldova
a) ara Romneasc
Figura 32 Numrul copiilor de domni ce au supravieuit tailor lor, pentru domnitorii cu cel
puin 2 copii supravieuindu-le
3.1.1.8
Clauza ORDER BY
Clauza ORDER BY ordoneaz tuplii rezultatului dup valorile unei liste de atribute,
n ordine cresctoare sau descresctoare pentru fiecare din acestea; sintaxa ei este
urmtoarea:
SELECT listacoloane FROM expresietabele [WHERE ] [GROUP BY ]
[HAVING ] [ORDER BY coloana1 [ASC | DESC][, coloana2 [ASC | DESC]][, ]]
Semnificaia variabilelor utilizate este urmtoarea:
Variabil
Descriere
listacoloane
Numele atributelor rezultatului.
expresietabele Tabela sau compunerea joinurilor asupra tabelelor operanzi.
coloana1,
Numele atributelor (sau expresii algebrice construite peste atribute)
coloana2
dup care se face sortarea, n aceast ordine.
Observaii:
1) Ordinea de sortare pentru coloana1, coloana2 este precizat de predicatele ASC
(pentru ascendent, cresctor; e.g. de la A la Z i de la 0 la 9) i DESC (pentru
46
2)
3)
4)
5)
6)
7)
3.1.1.9
Declaraia PARAMETERS
Domnitor
Dan I
Dan II
Mircea cel Btrn
Nicolae Alexandru
Radu cel Mare
Radu I
Vlad Clugrul
Vlad Dracul
NrCopii
2
2
4
2
2
2
2
3
Domnitor
NrCopii
Alexandru cel Bun
4
Bogdan I
2
Roman I
2
tefan cel Mare
3
b) Moldova
a) ara Romneasc
Figura 33 Tabelele din figura 32 n ordinea alfabetic a domnitorilor
O fereastr Windows se zice semi-modal daca este afiat deasupra tuturor celorlalte ferestre deschise
n acel moment, fr butoane de minimizare (dar avndu-l pe cel de nchidere) i nu permite continuarea
execuiei programului curent pn cnd utilizatorul nu o nchide sau nu introduce de la tastatur valoarea
ateptat de fereastr, urmat de apsarea butonului OK (dup care fereastra se nchide automat, paseaz
valoarea tastat de utilizator programului, iar acesta i poate n sfrit relua execuia). Dac valoarea
tastat nu are valide valoarea i/sau tipul de dat, atunci este afiat un mesaj de eroare corespunztor i se
ateapt reintroducerea altei valori; acest lucru se repet ori de cte ori este nevoie (pn cnd utilizatorul
introduce o valoare valid sau nchide fereastra). Dac fereastra este nchis (fie din butonul OK ori
Cancel, fie din cel standard de nchidere al oricrei ferestre) fr s fi specificat vreo valoare, execuia
este abandonat.
48
DeLa
1396
1418
1420
1424
1426
1431
La
1418
1420
1424
1425
1431
1436
Domnitor
tefan II
Roman II
Petru II
Bogdan II
Petru Aron
Alexndrel
Petru Aron
DeLa
1442
1447
1448
1449
1451
1452
1455
La
1447
1448
1449
1451
1452
1455
1457
11) Dac rezultatul subinterogrii include o valoare NULL, atunci forma NOT IN va
ntoarce rezultatul NULL (evident, acest lucru nu se ntmpl i pentru forma IN).
12) Predicatul [NOT] EXISTS (echivalent: comparaia cu mulimea vid) se folosete n
comparaii booleene pentru a decide dac subinterogarea are ca rezultat mulimea
vid sau nu.
13) n subinterogri se pot folosi i sinonime (doar opional precedate de cuvntul
rezervat AS) ale tabelelor referite n clauza FROM a instruciunii gazd (pentru
corelarea dinamic a tuplilor subinterogrii cu cei ai instruciunii gazd).
14) Subinterogrile al cror rezultat este o relaie cu mai multe atribute nu pot fi folosite
dect n clauzele WHERE i HAVING. n asemenea cazuri, operandul stng al
comparaiei trebuie s fie tot un tuplu (evident avnd aceeai aritate i tipuri
compatibile de date cu cel al rezultatului subinterogrii) care, sintactic, trebuie scris
ca o list nchis ntre paranteze, cu elementele separate prin virgule. Comparaiile
se fac desigur tuplu cu tuplu (i.e. simultan pe toate atributele acestora).
15) Atributele definite de o subinterogare nu pot fi folosite n clauza GROUP BY.
16) O subinterogare nu poate defini o reuniune (UNION) sau o interogare tabular
ncruciat (TRANSFORM).
Exemplul 29
Urmtoarea instruciune calculeaz abaterea (liniar a) duratei domniilor
de la media acestora (vezi figura 35):
(Q084)SELECT Domnii.*, La-DeLa AS Durata,
(SELECT Avg(La-DeLa) As DurataMedie
FROM Domnii) AS DurataMedie,
La-DeLa-DurataMedie AS Abatere
FROM Domnii ORDER BY La-DeLa, DeLa;
Urmtoarea instruciune calculeaz domniile mai scurte dect cel puin una
dintre domniile unuia din copiii domnitorului respectiv (vezi figura 36):
(Q085)SELECT * FROM Domnii AS D
WHERE (((La-DeLa)<Any
(SELECT La-DeLa AS Durata
FROM Domnii INNER JOIN Tata
ON Tata.Copil=Domnii.Domnitor
WHERE (Tata.Tata=D.Domnitor))))
ORDER BY D.DeLa;
De remarcat c MS Jet calculeaz ns eronat duala instruciunii de mai sus
(n care ANY este nlocuit cu ALL, pentru domniile mai scurte dect toate
cele ale copiilor domnitorului respectiv): probabil c subinterogarea nu se mai
calculeaz n acest caz dinamic, pentru fiecare tuplu al interogrii gazd n
parte, ci static, o singur dat nainte de calculul tuplilor interogrii gazd,
ceea ce elimin practic filtrul constituit de clauza WHERE i, n consecin,
rezultatul conine n mod eronat i domniile domnitorilor fr copii!
Urmtoarea instruciune calculeaz domniile strict mai lungi dect toate
cele ale copiilor lor ajuni domnitori la rndul lor (vezi figura 37):
(Q086)SELECT DISTINCT d.*
FROM Domnii AS d INNER JOIN Tata
ON d.Domnitor=Tata.Tata
WHERE ((La-DeLa)>All
(SELECT La-DeLa AS Durata
FROM Domnii INNER JOIN Tata
ON Tata.Copil=Domnii.Domnitor
WHERE (d.Domnitor=Tata.Tata)) AND EXISTS
51
52
Domnitor
Vladislav II
Vlad epe
Dan I
Vlad Uzurpatorul
Mihail I
Radu II Pleuvul
Laiot Basarab
Dan II
Vlad Dracul
Basarab epelu
Dan II
Alexandru Aldea
Vlad Dracul
Vlad epe
Radu I
Mircea cel Btrn
Vladislav II
Radu cel Frumos
Nicolae Alexandru
Vladislav Vlaicu
Radu cel Mare
Vlad Clugrul
Mircea cel Btrn
Basarab I
DeLa
1442
1476
1384
1394
1418
1424
1473
1420
1443
1477
1426
1431
1436
1456
1377
1386
1447
1462
1352
1364
1495
1481
1396
1310
Domnitor
DeLa La
Nicolae Alexandru 1352 1364
Radu I
1377 1384
Dan I
1384 1386
Dan II
1420 1424
Dan II
1426 1431
Vlad Dracul
1436 1442
Vlad Dracul
1443 1447
Laiot Basarab
1473 1476
Domnitor
DeLa La
Basarab I
1310 1352
Mircea cel Btrn 1386 1394
Mircea cel Btrn 1396 1418
Vlad Clugrul
1481 1495
Figura 37 Primele domnii Basarabe
strict mai lungi dect toate cele ale
domnitorilor copii ai acestor domni
53
Domnitor
Basarab I
Dan I
Dan I
Dan II
Dan II
Laiot Basarab
Mircea cel Btrn
Mircea cel Btrn
Mircea cel Btrn
Mircea cel Btrn
Nicolae Alexandru
Nicolae Alexandru
Radu I
Radu I
Vlad Clugrul
Vlad Dracul
Vlad Dracul
Vlad Dracul
Copil
Nicolae Alexandru
Dan II
Vlad Uzurpatorul
Laiot Basarab
Vladislav II
Basarab epelu
Alexandru Aldea
Mihail I
Radu II Pleuvul
Vlad Dracul
Radu I
Vladislav Vlaicu
Dan I
Mircea cel Btrn
Radu cel Mare
Radu cel Frumos
Vlad Clugrul
Vlad epe
Domnitor
Alexandru cel Bun
Alexandru cel Bun
Alexandru cel Bun
Alexandru cel Bun
Alexandru cel Bun
Bogdan I
Bogdan II
Ilia
Ilia
Roman I
Copil
Bogdan II
Ilia
Petru Aron
Petru II
tefan II
Lacu
tefan cel Mare
Alexndrel
Roman II
Alexandru cel Bun
b) Moldova
a) ara Romneasc
Figura 38 Domnitori cu copiii lor ce au ajuns i ei domnitori la rndu-le
54
Domnitor
Alexandru Aldea
Basarab epelu
Mihail I
Radu cel Frumos
Radu cel Mare
Radu II Pleuvul
Vlad epe
Vlad Uzurpatorul
Vladislav II
Vladislav Vlaicu
Domnitor
Alexndrel
Iuga Vod
Lacu
Petru Aron
Petru II
Petru Muat
Roman II
tefan cel Mare
tefan I
tefan II
Domnitor
Basarab I
Dan I
Dan II
Laiot Basarab
Mircea cel Btrn
Nicolae Alexandru
Radu I
Vlad Clugrul
Vlad Dracul
Domnitor
Alexandru cel Bun
Ilia
Bogdan I
Bogdan II
Roman I
a) ara Romneasc
b) Moldova
Figura 40 Domnitori cu cel puin un copil ajuns
i el domnitor la rndul su
a) ara Romneasc
b) Moldova
Figura 39 Domnitori fr vreun copil
care s fi domnit i el la rndul su
Total
Domnitor
42 Basarab I
30 Mircea cel Btrn
14 Vlad Clugrul
13 Radu cel Mare
13 Vladislav Vlaicu
12 Nicolae Alexandru
11 Radu cel Frumos
Domnitor
Durata
Dan I
2
Dan II
5
Dan II
4
Laiot Basarab
3
Nicolae Alexandru
12
Radu I
7
Vlad Dracul
6
Vlad Dracul
4
58
Printe
Mircea cel Btrn
Nicolae Alexandru
Clara
Nicolae Alexandru
Clara
Laiot Basarab
Radu I
Dan I
Nicolae Alexandru
Maria
Dan II
Radu cel Frumos
Mircea cel Btrn
Vlad epe
Vlad Dracul
Mtu tefan cel Mare
Radu I
Radu cel Mare
Basarab epelu
Basarab I
Vlad Dracul
Mtu tefan cel Mare
Vlad Clugrul
Radu cel Mare
Nicolae Alexandru
Maria
Mircea cel Btrn
Radu cel Mare
Neagoe Basarab
Neagoe Basarab
Neagoe Basarab
Vlad epe
Elena
Vlad Dracul
Mtu tefan cel Mare
Vlad Clugrul
Mircea cel Btrn
Vlad Dracul
Mtu tefan cel Mare
Dan I
Dan II
Nicolae Alexandru
Maria
Copil
Alexandru Aldea
Ana
Ana
Anca
Anca
Basarab epelu
Dan I
Dan II
Elisabeta
Elisabeta
Laiot Basarab
Maria Voichia
Mihail I
Mihnea cel Ru
Mircea
Mircea
Mircea cel Btrn
Mircea Ciobanul
Neagoe Basarab
Nicolae Alexandru
Radu cel Frumos
Radu cel Frumos
Radu cel Mare
Radu de la Afumai
Radu I
Radu I
Radu II Pleuvul
Radu Paisie
Ruxandra
Stanca
Teodosie
Vlad
Vlad
Vlad Clugrul
Vlad Clugrul
Vlad cel Tnr
Vlad Dracul
Vlad epe
Vlad epe
Vlad Uzurpatorul
Vladislav II
Vladislav Vlaicu
Vladislav Vlaicu
59
Observaii:
1) Lista int a instrSELECT conine atributele tabelei iniiale ale cror valori vor
constitui axa y a tabulrii ncruciate.
2) Adesea este util ca lista int a instrSELECT s conin i un atribut calculat cu
ajutorul fciedeagregare care s ofere rezultatul agregrii respective i pentru
fiecare din liniile relaiei generate prin tabulare ncruciat (de exemplu, dac
funcia de agregare este Sum, s-ar putea obine astfel pentru fiecare linie i suma
tuturor sumelor din noile coloane generate).
3) Valorile atribpivot sunt folosite drept numele noilor atribute generate.
4) Ordinea noilor atribute generate este cea cresctoare a valorilor atribpivot.
5) Dac atribpivot conine i valori nule, atunci se va genera corespunztor i un
nou atribut numit <> (care este plasat naintea tuturor celorlalte).
6) Lista valoare1, valoare2, ... a clauzei opionale IN se poate folosi pentru a
elimina din valorile atribpivot pe cele nedorite sau, dimpotriv, pentru a aduga
noi valori, inexistente n momentul execuiei instruciunii TRANSFORM (de
exemplu, pentru a asigura mereu o aceeai structur a relaiei generate,
indiferent de valorile de moment ale atribpivot, necesar unui raport bazat pe
aceast relaie).
7) instrSELECT trebuie s conin obligatoriu clauza GROUP BY (evident,
deoarece fciedeagregare oblig la aceasta!); n schimb, n mod inexplicabil, ea
nu poate conine clauza HAVING!!
8) instrSELECT poate include subinterogri doar n clauza WHERE.
9) Rezultatul unei tabulri ncruciate se poate afia/tipri, dar nu poate fi salvat ca
o tabel permanent! (i.e. instrSELECT nu poate fi de tip SELECT ... INTO).
Exemplul 32 Figura 45a prezint tabela BTLII (creat cu ajutorul
instruciunii SQL cerute de problema 5 i avnd cheia format din toate cele
6 atribute ale sale!) ce memoreaz principalele btlii duse de domnitorii
Basarabi n primele dou secole de istorie ale dinastiei lor.
Urmtoarea instruciune de tabulare ncruciat calculeaz, pentru fiecare
domnitor, totalul btliilor mpotriva fiecrui duman n parte (rezultatul
este prezentat n figura 45b):
(Q104)TRANSFORM Count(Btlii.An) AS NrBtlii
SELECT Domn, Count(An) AS Total
FROM Btlii
GROUP BY Domn
PIVOT Duman;
De remarcat c dac n instruciunea de mai sus s-ar nlocui An cu
Victorie, rezultatul ar fi absolut acelai (deoarece Count numr toate
apariiile nenule ale valorilor, distincte sau nu); dimpotriv (din cauza
valorilor nule pe care Count le ignor), dac s-ar nlocui An cu Loc sau
Inamic, doar schema rspunsului i coninutul primei sale coloane ar fi
aceleai, n timp ce coninutul celorlalte ar diferi.
Dac se dorete o privire mai detaliat asupra acestor totaluri, n sensul
defalcrii lor pe victorii, respectiv nfrngeri, instruciunea necesar este
evident urmtoarea (rezultatul ei este prezentat n figura 45c):
(Q105)TRANSFORM Count(An) AS NrBtlii
SELECT Domn, Victorie, Count(An) AS Total
FROM Btlii GROUP BY Domn, Victorie
PIVOT Duman;
61
Q102
Ctitor
Alexandru cel Bun
Petru Rare
tefan cel Mare
Alexandru cel Bun
Petru Rare
Alexandru cel Bun
Petru Muat
Petru Rare
tefan cel Mare
Petru Rare
tefan cel Mare
Alexandru cel Bun
Bogdan I
tefan cel Mare
Petru Rare
tefan cel Mare
Ctitorie
Bistria
Bistria
Bistria
Moldovia
Moldovia
Neam
Neam
Neam
Neam
Probota
Putna
Rdui
Rdui
Rdui
Vorone
Vorone
An
1407
1532
1485
1402
1532
1420
1380
1533
1497
1530
1466
1410
1359
1479
1534
1488
Ctitor
Bistria Moldovia Neam Probota Putna Rdui Vorone
Alexandru cel Bun
1407
1402 1420
1410
Bogdan I
1359
Petru Muat
1380
Petru Rare
1532
1532 1533
1530
1534
tefan cel Mare
1485
1497
1466
1479
1488
c) tabela obinut din cea iniial prin tabulare ncruciat
Figura 44 Cteva dintre cele mai importante ctitorii ale primilor Muatini
An
Domn
1324 Basarab I
1328 Basarab I
1330 Basarab I
1360 Nicolae Alexandru
1368 Vladislav Vlaicu
1369 Vladislav Vlaicu
1371 Vladislav Vlaicu
1377 Radu I
1386 Mircea cel Btrn
1388 Mircea cel Btrn
1389 Mircea cel Btrn
1391 Mircea cel Btrn
1393 Mircea cel Btrn
1394 Mircea cel Btrn
1395 Mircea cel Btrn
1395 Mircea cel Btrn
1396 Mircea cel Btrn
1396 Mircea cel Btrn
1397 Mircea cel Btrn
1400 Mircea cel Btrn
1401 Mircea cel Btrn
1403 Mircea cel Btrn
1404 Mircea cel Btrn
1417 Mircea cel Btrn
1420 Mihail I
1423 Dan II
1425 Dan II
1427 Dan II
1428 Dan II
1429 Dan II
1442 Vlad Dracul
1444 Vlad Dracul
1445 Vlad Dracul
1447 Vlad Dracul
1448 Vlad epe
1448 Vlad epe
1448 Vladislav II
1456 Vlad epe
1457 Vlad epe
1460 Vlad epe
1461 Vlad epe
1462 Vlad epe
1462 Vlad epe
1462 Vlad epe
1462 Vlad epe
1469 Radu cel Frumos
1471 Radu cel Frumos
1473 Radu cel Frumos
1474 Radu cel Frumos
1475 Laiot Basarab
1476 Vlad epe
1477 Vlad epe
1481 Basarab epelu
1482 Basarab epelu
Duman
ttari
ttari
Posada
unguri
ttari
Ialomia
unguri
Vidin
turci
Crmen
turci
unguri
Severin
unguri
Hrova
turci
Isaccea
turci
turci
Vidin
turci
Rovine
turci
Turnu
unguri
Curtea de Arge turci
Nicopole
turci
Dmbovia
munteni
turci
moldoveni
turci
Chilia
turci
Silistra
turci
turci
turci
turci
Vidin
turci
turci
Golubac
turci
Chilia
moldoveni
unguri
Varna
turci
turci
transilvneni
munteni
transilvneni
Kossovopolje
turci
munteni
Braov
transilvneni
Braov
transilvneni
Giurgiu
turci
munteni
Trgovite
turci
Brila
turci
Turnu
turci
moldoveni
Soci
moldoveni
Vodnu
moldoveni
moldoveni
Vaslui
moldoveni
munteni
Snagov
munteni
Rmnic
moldoveni
Crciuna
moldoveni
Loc
Inamic
Firuz-bey
Baiazid Ildirim
Sigismund de Luxemburg
Vlad Uzurpatorul
Baiazid Ildirim
Vlad Uzurpatorul
Iuga Vod
Evrenos-bey
Radu II Pleuvul
Alexandru cel Bun
Vladislav I
Murad II
Iancu de Hunedoara
Vladislav II
Iancu de Hunedoara
Vladislav II
Dan cel Tnr
Radu cel Frumos
Mahomed II
Mahomed II
tefan cel Mare
tefan cel Mare
tefan cel Mare
tefan cel Mare
tefan cel Mare
Laiot Basarab
Laiot Basarab
tefan cel Mare
tefan cel Mare
63
Victorie
Yes
Yes
Yes
Yes
Yes
Yes
No
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Yes
Yes
Yes
No
No
Yes
No
Yes
No
Yes
No
No
Yes
Yes
Yes
Yes
No
Yes
Yes
No
No
No
No
No
No
Yes
No
No
No
Domn
Total moldoveni munteni ttari transilvneni turci unguri
Basarab I
3
2
1
Basarab epelu
2
2
Dan II
5
1
4
Laiot Basarab
1
1
Mihail I
1
1
Mircea cel Btrn
16
1
1
12
2
Nicolae Alexandru
1
1
Radu cel Frumos
4
4
Radu I
1
1
Vlad Dracul
4
1
2
1
Vlad epe
12
5
3
4
Vladislav II
1
1
Vladislav Vlaicu
3
2
1
Figura 45b Totalul btliilor purtate de primii Basarabi, clasificate pe dumani
Domn
Victorie Total moldoveni munteni ttari transilvneni turci unguri
Basarab I
Yes
3
2
1
Basarab epelu
No
2
2
Dan II
Yes
3
3
Dan II
No
2
1
1
Laiot Basarab
No
1
1
Mihail I
No
1
1
Mircea cel Btrn
Yes
10
1
1
7
1
Mircea cel Btrn
No
6
5
1
Nicolae Alexandru
Yes
1
1
Radu cel Frumos
No
4
4
Radu I
Yes
1
1
Vlad Dracul
Yes
2
1
1
Vlad Dracul
No
2
1
1
Vlad epe
Yes
8
3
2
3
Vlad epe
No
4
2
1
1
Vladislav II
No
1
1
Vladislav Vlaicu
Yes
2
1
1
Vladislav Vlaicu
No
1
1
Figura 45c Totalul victoriilor i nfrngerilor primilor Basarabi, pe dumani
Observaii:
1) La salvarea noii tabele, atributele acesteia motenesc doar tipul de dat i
dimensiunea atributelor iniiale din care provin (respectiv cele standard corespunztoare rezultatelor pentru atribute calculate). Evident c orice alte modificri ale schemei sale se pot face ns ulterior cu ajutorul instruciunilor LDD
ALTER TABLE, CREATE INDEX i DROP.
2) Spre deosebire de instruciunea LDD similar CREATE TABLE (destinat n
special crerii tabelelor fundamentale, dei aceasta nu este obligatoriu), care
creeaz o tabel vid, SELECT...INTO este evident destinat crerii de tabele
derivate i specificrii simultane a cte unui coninut (n general nevid) al lor.
64
orice tuplu avnd o valoare n afara acestui interval pentru oricare din aceste
dou atribute ar fi respins).
5) Dac se folosete a doua form sintactic fr lista atrib1, atrib2,..., atunci lista
valoare1, valoare2,... trebuie s includ cte o valoare pentru fiecare dintre
atributele int (n caz contrar, adugarea tuplului eueaz).
Exemplul 34 S completm tabela COPII din figura 46 cu toi ceilali copii
Muatini cunoscui din figura 2, plus Ana, cel de-al noulea copil al lui
tefan cel Mare, nelegitim, nhumat la mnstirea Bistria, a crui mam, an
natere i deces nu se cunosc (i care nu apare n tabelele PERSOANE i
TATA din figura 2). Pentru a aduga <Ana lui tefan, tefan cel Mare> este
nevoie de instruciunea urmtoare:
(Q107)INSERT INTO Copii ( Copil, Tata )
VALUES (Ana lui tefan, tefan cel Mare);
Urmtoarea instruciune adaug la tabela COPII i copiii (din MAMA) care
nu au tat cunoscut:
(Q108)INSERT INTO Copii ( Copil, Mama )
SELECT Mama.Copil, Mama.Mama
FROM Mama LEFT JOIN Tata
ON Mama.Copil = Tata.Copil
WHERE (((Tata.Copil) Is Null));
Se observ c n figura 47 (care prezint noul coninut al COPII obinut ca
rezultat al celor dou instruciuni INSERT INTO de mai sus), fa de figura
46, au mai fost adugai ase copii (Ana lui tefan, Iuga Vod, Petru Muat,
Roman I, Sor Petru Muat? i tefan I) i c acum tabela COPII conine
toi copiii Muatini din figura 2, plus Ana lui tefan cel Mare.
3.2.3 Instruciunea UPDATE
Sintaxa instruciunii pentru modificarea valorilor atributelor este urmtoarea:
UPDATE int SET atrib1 = nouvaloare1 [, atrib2 = nouvaloare2 [,...]]
[clauzWHERE];
Semnificaia variabilelor utilizate este urmtoarea:
Variabil
Descriere
int
Numele unei tabele sau interogri salvate ai crei tupli se modific.
atrib1, atrib2,... Numele atributelor din schema int ale cror valori se modific
conform nouvaloare1, nouvaloare2,....
nouvaloare1,
Expresii evaluabile (n contextul instruciunii) la valori avnd tipul de
nouvaloare2,... dat identic sau compatibil cu cel al atrib1, atrib2,....
clauzWHERE Clauz WHERE (vezi 3.1.1.3) pe care trebuie s o satisfac tuplii ale
cror valori sunt modificate.
Observaii:
1) Dac int este o interogare, atunci rezultatul acesteia trebuie s fie actualizabil;
n caz contrar, nu se modific nici un tuplu! (pentru exemple de interogri neactualizabile vezi observaia 2 de la 3.2.2). n plus, atributele atrib1, atrib2,... trebuie s fie i ele actualizabile (nu pot fi evident modificate atributele calculate!).
2) Modificarea tuplilor reuete doar dac nu sunt nclcate constrngerile de
integritate ale tabelelor int (vezi observaia 4 de la 3.2.2).
3) nouvaloare1, nouvaloare2,... pot evident conine nume de atribute ale int;
de exemplu, pentru a crete cu 10% valoarea unui atribut Salariu, se poate scrie
SET Salariu = Salariu * 1,1; sau, pentru a recalcula atributul Total
din valorile atributelor Suma i ProcentTVA:
67
69
Copil
Alexandru
Alexandru cel Bun
Bogdan III
Bogdnel
Elena
Ilia
Ilie
Iuga Vod
Maria
Petru Aron
Petru Muat
Petru Ptracu
Petru Rare
Roman I
Sor Petru Muat?
tefan cel Mare
tefan I
Tata
tefan cel Mare
Roman I
tefan cel Mare
tefan cel Mare
tefan cel Mare
Alexandru cel Bun
tefan cel Mare
Mama
Evdochia
Anastasia
Maria Voichia
Maria de Mangop
Evdochia
Ana Neaca
Maria de Mangop
Sor Petru Muat?
tefan cel Mare
Maria Voichia
Alexandru cel Bun Mariana
Margareta Muata
tefan cel Mare
Evdochia
tefan cel Mare
Maria Rare din Hrlu
Margareta Muata
Margareta Muata
Bogdan II
Maria Oltea Basarab
Sor Petru Muat?
71
3.4 Tranzacii
3.4.1 Instruciunile BEGIN, COMMIT i ROLLBACK
Sintaxa instruciunilor de iniiere i ncheiere a tranzaciilor explicite este, respectiv:
Iniierea unei noi tranzacii:
BEGINTRANS
ncheierea normal a tranzaciei curente (nsoit de salvarea rezultatelor ei n
bd):
COMMITTRANS
ncheierea anormal a tranzaciei curente (nsoit de renunarea la rezultatele
execuiei sale curente asupra bd):
ROLLBACK [TRANSACTION | WORK]
Observaii:
1) Tranzaciile explicite nu sunt iniiate automat (implicit), ci doar explicit, la
execuia BEGINTRANS.
2) n MSJSQL, tranzaciile explicite (numite prescurtat de acum ncolo tranzacii)
pot fi ncapsulate n alte tranzacii pe maxim 5 nivele de adncime.
3) Tranzaciile nu sunt admise pentru tabele legate (i.e. neaparinnd bd curente).
4) Practic, modificrile cerute asupra bd de instruciunile ce se afl ntre o
instruciune BEGINTRANS i instruciunea corespunztoare COMMITTRANS
nu se fac direct asupra bd, ci n fiiere de manevr sistem memornd o copie a
24
n MSJSQL se pot executa proceduri catalogate numai programatic, via ADO i Jet OLE DB.
73
5)
6)
7)
8)
75
_
_
_
_
Exit_point:
conDb.Close
Set conDb = Nothing
Exit Sub
Err_point:
MsgBox Err.Description
conDb.RollbackTrans
Resume Exit_point
End Sub
Domn
Basarab I
Basarab I
Basarab epelu
Dan II
Dan II
Dan II
Laiot Basarab
Mihail I
Mircea cel Btrn
Mircea cel Btrn
Mircea cel Btrn
Mircea cel Btrn
Mircea cel Btrn
Nicolae Alexandru
Radu cel Frumos
Radu I
Vlad Dracul
Vlad Dracul
Vlad Dracul
Vlad Dracul
Vlad epe
Vlad epe
Vlad epe
Vlad epe
Vladislav II
Vladislav Vlaicu
Vladislav Vlaicu
Vladislav Vlaicu
25
De notat c Access folosete codificarea: 0 pentru False, -1 (complementul bit cu bit al 0) pentru True.
76
77
10
11
12
13
14
completarea valorilor acestor noi atribute cu referine ctre atributul #AM din tabela AEZMINTE de la problema 6, cu proprietatea c valorile corespunztoare ale atributelor Necropol, respectiv Ctitorie sunt egale cu cele ale atributului
Aezmnt
definirea cheilor strine astfel construite #Necropola, respectiv #Ctitorie
tergerea atributelor Necropol din tabela PERSOANE, respectiv Ctitorie din
tabela Ctitorii.
Scriei instruciuni SQL pentru a calcula primii 10, respectiv primii 10% dintre
domnitorii care au purtat cele mai multe btlii, respectiv repurtat cele mai multe
victorii (Domn, NrBtlii; respectiv Domn, NrVictorii); calculai coninutul
acestor interogri pentru bd din figura 45a.
Scriei instruciuni SQL pentru a calcula media numrului de btlii, respectiv de
victorii i abaterile de la medie pentru fiecare domnitor; calculai coninutul
acestor interogri pentru bd din figura 45a.
Se poate calcula capitala curent n momentul nceperii fiecrei domnii (vezi
Q074 din exemplul 25 i figura 29) cu o singur instruciune SQL folosind
subinterogri? Justificai rspunsul.
Scriei o instruciune SQL coninnd subinterogri pentru a calcula domnii care sau luptat cu ali domni din aceeai dinastie; calculai coninutul acestei interogri
pentru bd din figurile 45a i 1.
Scriei o instruciune SQL pentru a calcula tabularea ncruciat dual celei din
figura 45b (i.e. cu dumani pe axa y i domnitori pe axa x).
Scriei o instruciune SQL pentru a calcula tabularea ncruciat a numrului de
btlii ale fiecrui domn n fiecare an (i.e. avnd Domn pe axa y i anii btliilor
pe axa x); calculai coninutul acestei interogri pentru bd din figura 45a.
Scriei o instruciune SQL pentru a crea o tabel care s memoreze, pentru fiecare
domnitor, ctitoriile sale din acelai an cu btliile purtate de acetia; calculai
coninutul acestei tabele pentru bd din figurile 45a i 51.
CTITORII (CtitorCtitorieAn) CtitorNume
Ctitor
Ctitorie
An
Basarab I
Negru Vod 1330
Nicolae Alexandru Negru Vod 1360
Vladislav Vlaicu
Vodia
1370
Radu cel Mare
Vodia
1500
Radu I
Tismana
1377
Dan I
Tismana
1384
Mircea cel Btrn
Tismana
1386
Mircea cel Btrn
Tismana
1396
Radu cel Mare
Tismana
1495
Mircea cel Btrn
Cozia
1388
Mircea cel Btrn
Cotmeana
1389
Alexandru Aldea
Dealu
1431
Radu cel Mare
Dealu
1501
Mircea cel Btrn
Snagov
1396
Vladislav II
Snagov
1448
Vlad epe
Snagov
1462
Vlad epe
Snagov
1476
Vlad epe
Govora
1460
Vlad Clugrul
Govora
1490
Radu cel Mare
Govora
1496
Figura 51 Cteva dintre cele mai importante ctitorii ale primilor Basarabi
79
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Scriei instruciuni SQL pentru a insera n tabela BTLII cte un tuplu simetric
pentru fiecare inamic dintre domnitorii moldoveni; calculai coninutul tabelei dup execuia lor pentru bd din figurile 45a i 1.
Scriei o instruciune SQL pentru a terge din tabela BTLII toi tuplii pentru
care dumanii sunt romni; calculai coninutul tabelei dup execuia acestei
instruciuni pentru bd din figura 45a.
S se traduc n SQL interogrile LMDMEA prezentate n seciunea 1.4, precum i
cele cerute de problema 1.8 din [1].
Scriei instruciunea SQL corespunztoare pentru calculul domnitorilor i
prinilor acestora, cu condiia ca mcar unul dintre prini s fie cunoscut;
calculai rspunsurile acestora pentru bd din figurile 1 i 2.
Scriei instruciunea SQL pentru aflarea domnitorilor al cror nume ncepe cu
tefan i calculai rezultatul ei pentru bd din figura 2.
Scriei instruciunea SQL pentru calculul mulimii domnitorilor care au avut
copii.
Scriei instruciunile SQL corespunztoare cu i fr subinterogri pentru calculul
perechilor (Domnitor, Copil) selectnd doar domnitorii cu cel puin doi copii ce
au domnit i ei la rndul lor de cel puin 2 ori i, de fiecare din aceste di, mcar
cte 2 ani.
Scriei instruciunile SQL corespunztoare cu i fr subinterogri pentru calculul
perechilor (Domnitor, Copil) selectnd doar domnitorii cu cel puin doi copii ce
au domnit i ei la rndul lor i care, n plus, au avut numele mai mic (lexicografic)
dect cel al unuia dintre copiii si.
a. Scriei instruciunile SQL corespunztoare cu i fr subinterogri pentru
calculul perechilor (Domnitor, Copil) selectnd doar domnitorii i copiii care au
avut cel puin la fel de muli copii domnitori pe ci a avut i copilul
corespunztor.
b. Idem, nlocuind copiii cu nepoii.
Scriei instruciunile SQL corespunztoare cu i fr subinterogri pentru calculul
perechilor (Domnitor, Copil) selectnd doar domnitorii ai cror copii au domnit cu
toii.
Scriei instruciunile SQL corespunztoare cu i fr subinterogri pentru calculul
perechilor (Domnitor, Copil) selectnd doar domnitorii care au avut cel puin un
strnepot domnitor.
Scriei o instruciune SQL pentru a calcula tabularea ncruciat a mediei anilor
ctitoriilor asupra tabelei din figura 51, cu ctitorii pe axa y i ctitori pe axa x.
a. Scriei instruciunile SQL corespunztoare cu i fr subinterogri pentru
calculul nchiderii tranzitive a relaiei TATA i calculai rspunsurile aferente bd
din figura 1 i 2.
b. idem pentru relaia MAMA.
Demonstrai c nchiderile tranzitive nu sunt unicele interogri cu sens pe care
limbajele complete nu trebuie s fie capabile s le exprime, dei rezultatele lor
conin doar valori memorate de bd i sunt invariante la orice automorfism al
coninutului acesteia (Indicaie: considerai tabela TATA din figura 1 i ncercai
s scriei instruciunile SQL pentru calculul perechilor de frai, astfel nct
rezultatul s nu conin nici o pereche (f,g), dac el deja conine o pereche (g,f).
Scriei apoi un program n orice limbaj de programare, de exemplu VBA,
Transact-SQL, PL/SQL, C etc.- care realizeaz acest lucru. Generalizai!).
a. Scriei instruciunea SQL parametrizat pentru calculul urmailor de ordin cel
mult doi al unui domnitor oarecare (indicaie: rspunsul va trebui s includ toi
copiii si, precum i toi copiii acestora i, evident, nimic altceva; folosii
operatorul de reuniune).
80
30
31
32
33
34
35
36
37
38
b. Scriei instruciunea similar pentru ordinul trei (indicaie: folosii de dou ori
operatorul de reuniune!).
c. Proiectai algoritmul i implementai programul corespunztor n SQL i un
limbaj gazd de nivel nalt oarecare (i.e. VBA, VB, C++, C#, Java etc.) sau ntr-un
SQL CH-complet (i.e. QL, Transact-SQL, PL/SQL etc.) pentru parametrizarea
instruciunii de mai sus nu doar cu domnitorul, ci i cu ordinul dorit, astfel:
ordinul poate lua orice valoare natural n i dac aceasta este strict pozitiv, atunci
se calculeaz toi urmaii pn la generaia n, iar dac n=0, atunci se calculeaz
nchiderea tranzitiv a acestei relaii (indicaii: folosii o bucl while i o tabel
temporar n care, la fiecare pas i, 1in, se adaug urmaii de nivel i; nainte de
orice nou iteraie, cu excepia primei, asigurai-v c n iteraia precedent s-a
mai calculat cel puin un nou urma, iar n caz contrar oprii imediat buclarea,
pentru c s-a calculat deja nchiderea tranzitiv!).
a. Proiectai bd necesar gestionrii de ctre un SGBD relaional a utilizatorilor,
grupurilor de utilizatori i privilegiilor acestora, conform facilitilor oferite de
sublimbajul SQL de definiie a datelor.
b. Scriei instruciunea SQL pentru calculul urmtorului rspuns asupra acestei bd:
Care sunt utilizatorii ce fac parte din cel puin dou grupuri, fiecare dintre
acestea avnd mcar cte trei utilizatori? (indicaie: folosii subinterogri).
a. Proiectai cadrul unei familii parametrizate de instruciuni SQL pentru calculul
diferenei a dou coninuturi de relaii folosind predicatul IsNull.
b. Similar, acelai lucru pentru calculul diferenei simetrice.
a. ncercai s proiectai, programai n SQL i testai o instruciune SELECT cu o
clauz WHERE n care lista operatorului IN este un parametru. De ce credei c
testele nu reuesc? (indicaie: revedei tipurile de date oferite de motoarele
relaionale).
b. Proiectai totui o soluie pur SQL (ANSI-92) a acestei probleme (indicaie:
folosii o tabel temporar care s memoreze valorile actuale ale parametrului).
a. Proiectai o bd relaional n FNDC (vezi [1]) pentru gestiunea sistemului de
fiiere Windows, n contextul unei reele de calculatoare, n care fiecare calculator
poate avea mai multe discuri virtuale; mai intereseaz i serverele de baze de date
eventual gzduite de aceste calculatoare, bd gestionate de acestea i fiierele care
le memoreaz.
b. Scriei un program pentru calculul tuturor fiierelor existente n reea, ordonate
cresctor dup calea lor (indicaie: vezi indicaiile de la problema 29c!).
c. Scriei un program pentru calculul cii complete (i.e. de tipul \\calculator\drive
virtual:\...\nume fiier.extensie) a unui fiier oarecare (indicaie: i aceasta este tot
o problem de tip nchidere tranzitiv!).
d. Scriei instruciunea SQL corespunztoare interogrii: Care sunt fiierele ce nu
particip la memorarea nici unei baze de date? (indicaie: folosii predicatul
IsNull).
Scriei procedura VBA pentru crearea tabelei CTITORII din figura 44a (vezi i 5).
Scriei procedura VBA pentru crearea tabelei BTLII din figura 45a (vezi i 5).
Pornind de la exemplul 33 (i anume interogarea (Q119)), artai c singura
alternativ de a calcula diferena a dou mulimi n SQL necesit recursul la o
tabel temporar i la sublimbajul de manipulare a datelor.
Proiectai i scriei o procedur catalogat SQL pentru calculul diferenei simetrice
a dou tabele oarecare (considerate drept parametri).
Proiectai i scriei procedurile catalogate SQL pentru calculul i afiarea tuturor
indexilor injectivi non-minimali dintr-o bd (dat drept parametru) memorat pe un
tip de server la alegerea Dvs. (e.g. MS SQL Server, Oracle, IBM DB/2 etc.).
81
39
40
82