03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

40
myw JQ VINVWOU laiivaNnd vnnima aft aa aoiazva njesnj BUJOQ J.HVH ntiids

Transcript of 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

Page 1: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

myw JQ VINVWOU laiivaNnd vnnima aft

aa aoiazva

njesnj BUJOQ

J.HVH ntiids

Page 2: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

C U P R I N S

• ' /

I BAZE DE DATE §1 SGBD1. Notiuni generale referitoare la baze de date §i SGBD .. 7

1.1. Sistem de gesthme a bazelor de date (SGBD) 81.1.2. Arhitectura, obiectivele §i func{iile unui

SGBD 81.2. Clasificarea bazelor de date 121.3. Baze de date cu structuri ierarhice §i retea 141.4. Baze de date relationale 151.5. Baze de date orientate pe obiecte 231.6. Baze de date distribute (BDD) 28

1.6.1. Obiecte §i caracteristici generale 281.6.2. Proiectarea unei baze de date distribuite .... 351.6.3. Administrarea BDD (baza de date

distribuite) 401.7. Baze de date inteligente sau avansate .„.... 42

1.7.1. B aze de date deductive /. 42Teste de autoevaluare 46

II LIMBAJUL SQL2. Caracteristici generale 47

2.1. Notiuni de baza referitoare la SQL 502.2. Blocurile componente ale operajiei de regasire a

datelor: SELECT §i FROM 512.3. Operatori utilizati in SQL 55

2.3.1. Operatori caracter 692.3.2. Operatori logici 712.3.3. Operatori pentru multimi 72

2.4. Functii in SQL 762.4.1. Functii pentru calculul totalurilor 77

5

Page 3: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

2.4.2. Functii dedicate pentru data calendaristica §iora 82

2.4.3. Functii aritmetice 872.4.4. Functii caracter 93

2.5. Clauze utilizate in SQL 1012.6. Joncfiuni 105

2.6.1. Subinterogari 1072.7. Instructiuni de manipulare a datelor 1092.8. Importul §i exportul datelor 1172.9. Crearea §i intrefinerea tabelelor 1192.10. Crearea view-urilor §i a indec§ilor 128

2.10.1. Modul de creare §i utilizare a view-urilor .. 1282.10.2. Utilizarea indec?ilor 1322.10.3. Utilizarea grupurilor de alocare (clusters) 135

2.11. Controlul tranzacjiilor 1362.12. Securitatea bazelor de date 1392.13. SQL incapsulat 1402.14. Utilizarea variabilelor 1472.15. Comenzi SQL 1482.16. Proceduri rezidente 152

2.16.1. Crearea §i Utilizarea procedurilor rezidente 1522.16.2. Utilizarea parametrilor intr-o procedure

rezidenta 1542.16.3. §tergerea unei proceduri rezidente 1542.16.4. Imbricarea procedurilor rezidente 155

2.17. Gruparea celor mai uzuale instruc^iuni SQL 157Teste de autoevaluare 164

III. Notiuni de SQL Server3.1. Arhitectura Client/Server 165

3.1.1.ClasificareaarhitecturilorC/S 1663.1.2. Client/Server WEB 168

3.2. Notiuni de baza pentru SQL Server 1683.2.1. Baze de date SQL Server 1693.2.2. InitiereinT_SQL12 170

Teste de autoevaluare 179Bibliografie 180

I. BAZE DE DATE §1 SGBD

1. Notiuni generate referitoare la baze de date ji SGBD

Complexitatea problemelor care apar in activitatea unei unitatieconomice implica prelucrarea operativa a datelor §i obtinerea derezultate (informatii) care sunt suportul deciziei managerilor.

Volumul acestor date este in continua cre§tere, ceea cedetermina necesitatea organizarii §i memorarii lor pe suporturi tehniceadresabile, organizare care poate fi facuta in fi§iere sau in baze dedate.

Fi§ierele reprezinta colec^ii de date omogene din punct de vedereal continutului, colectii care reprezinta inregistrari fizice. Oinregistrare fizica poate confine una-sau mai multe inregistrari logice.

Inregistrarea logica este definitiva ca o unitate de prelucrare dinpunct de vedere al programului utilizator. Organizarea datelor infi§iere §i accesul la ele sunt asigurate de un set de programe dedicatecare sunt reunite sub denumirea de Sistem de Gestiunz a Fi§ierelor(SGF), components a sistemului de operare (SO), /

Conceptul de baza de date porne§te de la ideea ca exista un fi§ierde descriere globala a datelor, prin care se realizeaza independentaprogramelor fata de date §i a acestora fa|a de programe. Astfel, putemspune ca o baza de date este o colec{ie de date (Ki) aflate ininterdependent, impreuna cu descrierea datelor §i a rela^iilor dintreele(B = (K1,K2 )).

Acest ansamblu structurat de date contine structuri de date legatefunctional intre ele.

Datele organizate in astfel de colec^ii trebuie sa fie interogabileprin conjinut dupa orice fel de criterii §i trebuie sa ofere posibilitatearegasirii structurii datelor.

Descrierea unei baze de date presupune:- determinarea structurilor de date;

Page 4: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

Teste de autoevaluare

1. Defmiti notiunea de fi§ier.2. Ce se intelege prin conceptul de baza de date?3. Ce obiective §i functii are un SGBD?4. Clasificati bazele de date.5. Ce presupune structura arborescenta?6. Ce se intelege prin structura relationala a datelor?7. Enuntati restrictiile de integritate ale modelului relational.8. Care sunt formele normale ale relatiilor?9. Care sunt regulile lui Codd privind cerintele pe care trebuie sa

le satisfaca un SGBDR?10. Defmiti conceptele de baza ale unei baze de date orientate pe

obiecte.11. Principiile SGBD-OO.12. Care sunt caracteristicile generale ale unei baze de date

distribuite?13. Care sunt functiile dictionarului de date global §i ale unui

SGBDD?14. Ce se intelege prin fragmentarea datelor?15. Defmiti fragmentarea orizontala, verticala §i mixta a datelor.16. Ce se intelege prin abordarea ascendenta §i descendenta?17. Ce sunt tehnicile de reprezentare a cererilor intr-o BDD?18. Ce se in^elege prin baze de date inteligente sau avansate?19. Ce sunt bazele de date deductive?20. Ce tipuri de integrare a BD Deductive cu diverse tehnologii

cunoa§teti?

46

II. LIMBAJUL SQL

2. Caracteristici generale

Limbajul SQL (Structured Query Language - limbaj struc-turat de interogare) este utilizat pentru manipularea §i regasirea datelordin bazele de date rela{ionale. El apare in deceniul 8 al secolului XX,cand s-a lansat prima versiune Oracle §i SQL/DS la IBM.

SQL-ul pune la dispozitia programatorului sau a unuiadministrator de baze de date urmatoarele facilitati:

> posibilitatea de modificare a structurii bazei de date;> posibilitatea schimbarii valorilor de configurare pentru

securitatea sistemului;> permite stabilirea §i modificarea drepturilor date

utilizatorilor asupra bazelor de date sau a tabelelor;> permite interogarea unei baze ae date;> ofera facilitati multiple referitoare la actualizarea

continutului unei baze de date.

Microsoft Query este un instrument de interogare furnizat odata cu aplicatiile Microsoft Windows, cum sunt: Visual C++§i Visual Basic, folosind standardul ODBC (Open Data BaseConnectivity) pentru a transfera instructiuni SQL la unprogram driver, care proceseaza instructiunile inainte de a letransfera unui sistem de baze de date. In fond, ODBC este obiblioteca de functii proiectata pentru a oferi interfata deprogramare a aplicatiilor (Application Programming Interface- API), care sa asigure dreptul pentru sistemele de baze dedate. Comunicarea cu baza de date se face prin intermediulunui program driver de biblioteca, iar in cazul in care aceastaeste situata la distanta, va fi necesar un program driver deretea.

47

Page 5: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

Incarcare programdriver ODBC

Procese apeluri ODBC, examinarecereri SQL, returneaza rezultate

Sursa de date(SGBD pe care se bazeaza sistemul)

Caracteristic ODBC este faptul ca functiile sale nu suntspecifice furnizorului bazei de date §i, cu mici modificari, programulscris pentru a utiliza o baza de date Access poate utiliza §i o alta,numita Informix.

Utilizarea SQL in programarea aplicatiilorSQL-ul poate fi utilizat in doua moduri intr-un program aplicativ:- SQL incapsulat;- Interfata de nivel 'apeP pentru SQL.Primul standard utilizat pentru SQL a fost ANSI 1986, apoi

ANSI 1989, care defme§te trei tipuri de realizare a unei interfere SQL,intr-un program de aplicatii, §i anume:

> Limbajul modular, presupune utilizarea de proceduri incadrul programelor, proceduri care pot fi apelate deprogramul de aplicatii §i care returneaza valori in programprin transmitere de parametri;

> SQL incapsulat, care folose§te instructiuni SQLincapsulate in codul program. Datorita acestui fapt aparenecesitatea utilizarii unui precompilator pentru procesareainstructiunilor SQL;

48

I

> Apelul direct, care presupune ca alegerea este facuta deeel ce implementeaza programul.

Cea mai utilizata forma de SQL este cea incapsulata,cunoscuta sub denumirea de static SQL §i care presupune cainstructiunea SQL este compilata in cadrul aplicajiei §i nu poate fimodificata in timpul execu|iei programului.

Standardul ANSI 1992 (SQL 92) a extins limbajul care adevenit standard international §i ^are astfel definite trei niveluri:introductiv, intermediar, complet. in plus fata de SQL 89, acesta aintrodus urmatoarele facilitate

- conectarile la bazele de date;- cursoare derulante;- SQL dinamic; \ jonctiuni externe.

De§i performantele acestui tip de SQL nu ating nivelul SQLincapsulat, el asigura totu§i programatorului de aplicatii un grad sporitde flexibilitate, concretizat intr-o interfata de nivel apel (ODBC) §ibiblioteca bazei de date Sybase. Cand se utilizeaza ODBC, secompleteaza o variabila cu instructiunea SQL a utilizatorului, dupacare se apeleaza functia pentru transmiterea instructiunii SQL bazei dedate. Eventualele erori, precum §i rezultatele se returneazaprogramului prin folosirea altor apeluri de functii proiectate specialpentru asemenea scopuri.

Rezultatele sunt returnate prin operada denumita Megareavariabilelor' (binding).

Pentru a elucida problemele legate de limbajul SQL, vomtrata, mai intai, regulile generale de sintaxa ale limbajului, precum §ioperatiile de regasire a datelor.

O alta parte importanta o vor reprezenta expresiile, conditiile§i operatorii utilizati de SQL.

Un capitol special va trata functiile SQL, apoi clauzele §ijonctiunile. SQL, fund dedicat interogarilor; ne vom ocupa de sub-interogari, pentru a ne opri apoi la instructiuni de manipulare adatelor.

Un capitol distinct §i de o mare importanta il constituie crea-rea §i intretinerea tabelelor, precum §i crearea view-urilor §i a indec§ilor.

49

Page 6: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

In final, vom aborda cele mai importante probleme legate desecuritatea bazelor de date.

2.1. Notiuni de baza referitoare la SQL

O interogare SQL nu este neaparat o intrebare pusa bazei dedate, ci, eel mai adesea, o comanda pentru executarea uneia dintreactiunilede maijos:

> sa construiasca sau sa §tearga o baza de date;> sa insereze, sa modifice sau sa §tearga linii sau campuri;> sa caute in tabele o anumita informatie §i sa returneze

rezultatele intr-o anumita ordine;> sa modifice securitatea informatiilor;> o simpla interogare (intrebare).

Reguli de sintaxa pentru SQL

Exemplu:

SELECT NUME, PROD.J, PROD_2FROM DENWHERE NUME = 'IOANA';

In acest exemplu, toate cuvintele scrise cu litere mari ar puteafi scrise §i cu litere mici, astfel:

select nume, prod_l, prod_2from denwhere nume = 'loana';

De remarcat este faptul ca nu toate variantele de implementarea SQL diferentiaza literele mari de literele mici. De aceea, SELECTsau select ar putea genera o eroare. Totu§i alinierea §i folosirealiterelor mari fac ca instructiunile sa fie mai u§or de citit

Este important sa retinem semnul punct §i virgula (;) de lasfar§itul expresiei. Acest semn indica programului SQL in linie decomanda ca interogarea este terminata. Literele mari se folosescpentru comenzi ca de exemplu:

50

> SELECT;> FROM;> WHERE.

2.2. Blocurile componente ale operatiei de regasire a datelor:SELECT^ FROM

SELECT <NUME DE COLOANA>

Daca s-a introdus cuvantul SELECT in sistem, s-ar puteaintampla urmatorul lucru:

Comanda: SQL> SELECT;\:

SELECT

ERROR at line 1:ORA-00936: missing expresion

Semnul asterisc de dinaintea ultimei linii indica locul in careOracle? crede ca a avut loc eroarea. Expresia de raspuns va cereclauza FROM:

FROM <TABEL>

Impreuna, aceste doua instructiuni incep sa deblocheze lucrulcu date.

Vom considera o baza de date MATERIALS ca model pe careo vom folosi pentru urmatoarele cateve exemple. Folosim aceasta bazade date pentru a ilustra functiile de baza ale cuvintelor cheie SELECT$i FROM.

Baza de date model: MATERIALE

Nr. inreg1234

MatMAT1MAT 2MATSMAT 4

Cant10150270125

51

Page 7: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

SQL> SELECT * FROM MATERIALE;

Nr. inreg1234

MatMAT1MAT 2MATSMAT 4

Cant10150270125

Comanda:

Rezultat:

4 rows selectedAcest exemplu arata ca baza de date model. Semnul asterisc (*)

transmite bazei de date comanda de a returna toate coloanele asociatecu tabelul dat descris in clauza FROM. Ele sunt returnate intr-o ordinehotarata de baza de date.

Semnul punct §i virgula de la sfar§itul instrucjiunii informeazainterpretorul ca s-a terminat de scris interogarea. Unele variante deimplementare a SQL nu folosesc pe post de terminator semnul punct§i virgula. De exemplu, Microsoft Query §i .produsul ISQL al firmeiBorland nu folosesc nici un semn terminator, deoarece interogareaeste introdusa intr-o caseta de editare §i este executata atunci cand seapasa un buton. Produsul SQL*PLUS, al firmei Oracle, nu executainterogarea pana cand nu gase§te un semn de punct ?i virgula.

Cand coloanele nu se afi§eaza in alta ordine, se introduce de latastatura comanda:

Comanda:

Rezultat:

SQL> SELECT Mat, Cant, Nrjnreg FROMMATERIALE;

MatMAT1MAT 2MATSMAT 4

4 rows selected

Cant10150270125

Nrjnreg1234

Numele de coloane sunt separate prin cate o virgula, cu unspatiu dupa ultimul nume de coloana §i inainte de urmatoarea clauza(in acest caz FROM). Instructiunea ar putea fi scrisa, de asemenea,astfel:52

Comanda: SELECT Mat, Cant, NrjnregFROM MATERIALE;

Selectarea coloanelor individuateDaca selectam doar doua coloane, introducem de la tastatura

urmatoarea instructiune:

Comanda: SQL> SELECT Nrjni^g, Cant, FROM MATERIALE;

Rezultat. Nrjnreg Cant1 102 1503 2704 125

4 rows selected

Acum sunt afi§ate coloanele cerute din tabel. Observati cas-au folosit literele mari §i mici in interogare. Acestea nu au nici unefect asupra rezultatului.

Selectarea altor tabeleSa presupunem ca dispunem de un tabel numit DEPOZITE cu

urmatoarea structura:

Numarul_depozitului123

Denumire SumaDepmat 150000Depprod 295000Depscule 2000000

Vom schimba clauza FROM pentru tabelul dorit.

Comanda:

Rezultat:

SQL> SELECT * FROM DEPOZITE;

Numarul depozitului123

3 rows selected

DenumireDepmatDepprodDepscule

Suma150000295000

2000000

53

Page 8: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

Facand o singura modificare, dispunem de o noua sursa dedate.

ExpresiiExpresia returneaza o valoare §i poate trata tipuri

diferite, cum ar fi §ir, numeric sau logic. De fapt, aproape oriceurmeaza o clauza (de exemplu, SELECT sau FROM) este oexpresie.

SELECT (Prenume +' '+Nume_de_familie)FROM CARTEJDEJTELEFON;

(Prenume +' '+Nume_de_familie) este o expresie care returneazanumele complet din baza de date CARTEJDE_TELEFON. Ocompletare utila pentru aceasta interogare ar putea fi:

WHERE Nume_de_familie = 'Popescu '

Conditia Nume_de_familie = 'Popescu' este un exemplu deexpresie logica (Nume_de_familie = 'Popescu' va fi falsa sauadevarata in funcfie de conditia =).

ConditiiPentru a regasi un anumit element sau grup de elemente in

baza de date, sunt necesare una sau mai multe conditii. in exempluhanterior, conditia este: Nume_de_familie = 'Popescu '.

Daca problema cere sa gasim toate persoanele dintr-o firmacare au lucrat in ultima luna mai mult de 80 de ore, putem introduceconditia: Numarul_de_ore > 80.

Conditiile fac posibile interogarile selective. In cea maiobi§nuita forma a lor, ele se compun dintr-o variabila, o constants §iun operator de comparare. In primul exemplu variabila esteNume_de_familie, constanta este Popescu §i operatorul de comparareeste =. In al doilea exemplu, variabila este Numarul_de_ore, constantaeste 80 §i operatorul de comparare este >.

54

Conceptul de interogari selective in SQL se bazeaza pe ideeasubmultimilor. O interogare selectiva returneaza o submultime dedate.

Clauza WHERE

Sintaxa clauzei WHERE este:

WHERE <condifie de cautare>

Impreuna cu SELECT si FROM, WHERE este cea maifolosita clauza in SQL. Aceasta clauza face interogarile selective. Faraclauza WHERE, eel mai util lucru pe care il putem face cu ointerogare este sa afisam baza de date. De exemplu, folosind SELECTsi FROM, introducem comanda:

Comanda: SQL> SELECT * FROM MATERIALS,Rezultat: Va lista tabelul MATERIALS

Daca dorim un anumit material din tabelul MATERIALS,putem introduce comanda:

Comanda: SQL > SELECT *FROM MATERIALSWHERE Mat = 'MATT;

Rezultat: Nrjnreg Mat Cant1 MAT 1 10

1 row selected

2.3. Operatori utilizati in SQL

Operator!i se impart in §ase grupe distincte: aritmetici, decomparare, caracter, logici, pentru multimi §i alti operatori.

55

Page 9: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

Operator!! aritmeticiOperatorii aritmetici sunt plus (+), minus (-), imparfire (/),

inmultire (*) §i modulo (%). Primii patru sunt descri§i chiar prinnumele lor. Ultimul, modulo, returneza restul intreg al unei impar|iri.De exemplu:

7 % 3 = 29 % 3 = 0

Operatorul modulo nu accepta tipuri de date care conjinzecimale, ca, de exemplu, tipul real sau number.

Daca se plaseaza cajiva operator) aritmetici intr-o expresiefara paranteze, ei sunt tratafi in ordinea urmatoare: inmuljire,impartire, modulo, adunare, apoi scadere. De exemplu, expresia:

3 * 6 + 7 / 5va fi egala cu: 18 +1,4 = 19,4

Totu§i, expresia: 3 * (6 +7) / 5vafiegalacu: 3 * 13/5 = 39/5 = 7,8

Trebuie urmarit cu atentie unde sunt puse parantezele,deoarece expresia face exact ce este scris in loc sa faca ce dore§teprogramatorul.

Plus(+)Semnul plus poate fi folosit in doua moduri diferite:

Comanda: SQL> SELECT * FROM PRET;

Pentru a afi§a tabelul PRET

Daca se introduce comanda:

Rezultat: DenumireMere

PortocaleBanane

PerePrune

Struguri6 rows selected

Pret_unitar200001700030000150001000025000

56

Comanda: SQL> SELECT Denumire, Pret_unitar,Pref_unitar + 150FROM PREJ;

Aceasta comanda adauga 150 de unita^i monetare la fiecarepref §i genereaza urmatorul rezultat:

Rezultat: Denumire Pret_unitar Pref_unitar

MerePortocaleBananePerePruneStruguri

200001700030000150001000025000

+ 150201501715030150151501015025150

SQL permite crearea unor coloane virtuale sau derivate princombinarea sau modificarea coloanelor existente, in cazul nostrucoloana Pret_unitar +150.

Reintroducem comanda:

Comanda: SQL> SELECT * FROM PRET; are ca rezultat:

DenumireMere

PortocaleBanane

PerePrune

Struguri

6 rows selected

Pret_unitar200001700030000150001000025000

Aceasta interogare confirma ca datele originare nu au fostmodificate §i ca tabelul rezultat din interogarea anterioara nu este o

57

Page 10: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

parte permanenta a bazei de date. Pret_unitar + 150 este un cap delabel neconcludent, §i atunci il modificam introducand comanda:

Comanda: SQL> SELECT Denumire, Pret_unitar, (Pret_unitar +150)Pret_modifFROM PRET;

Pentru a obtine:

Rezultat: Denumire Pret_unitar Pret_modifMere 20000 20150

Portocale 17000 17150Banane 30000 30150

Pere 15000 15150Prune 10000 10150

Struguri 25000 25150

6 rows selected

Astfel se pot crea noi coloane care se pot redenumi in timpulexecutiei. Redenumirea coloanelor se face folosind sintaxa:<nume_coloana> alias. Unele versiuni de SQL folosesc sintaxa:<nume_coloana = alias>. Exemplul precedent ar trebui scris astfel:

SQL> SELECT Denumire = Produs, Pret_unitar, Pret_unitar+ 150 = Pret_modifFROM PRET;

Are ca efect:

Produs Pret_unitar Pret_modifMere 20000 20150

Portocale 17000 17150Banane 30000 30150

Pere 15000 15150Prune 10000 10150

Struguri 25000 25150

6 rows selected

58

In unele versiuni de implementare a SQL, semnul plus are §ifunctia suplimentara de operator caracter.

Minus (-)Minus are, de asemenea, doua moduri de folosire. Poate fi

folosit pentru schimbarea semnului unui numar. Sa consideram tabelulEXEMPLU:

SQL> SELECT * FROM EXEMPLU;

Rezulta StatAAAFBCBDBF

Temp max-2010025-60-15

Temp min11010088

201200

Putem manipula aceste date folosind comanda:

SQL> SELECT Stat, -Temp_max Minime, -Temp_minMaxime

FROM EXEMPLU;

StatAAAFBCBDBF

Temp max20

-100-256015

Temp_min-110-100-88

-201-200

5 rows selected

Se observa folosirea alias-urilor pentru corectarea datelorintroduse incorect.

Celalalt mod vizibil de utilizare a semnului minus estescaderea valorilor unei coloane. De exemplu:

59

Page 11: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

SQL> SELECT Stat, Temp_max Minime, Temp_minMaxime, (Temp_min - Temp_max) DiferentaFROM EXEMPLU;

Stat

AAAFBC -25BD 60BF 15

5 rows selected

Temp_max Temp_min Diferen-ta

-110-100

20-100

-201-200

Putem vedea efectele unei vanzari la jumatate de pret,introducand comanda:

SQL > SELECT Denumire, Pret_unitar, (Pret_unitar/2)Pret_de_vanzareFROM PRET;

Denumire Pre{_unitarMere 10000

Portocale 8500Banane 15000

Prin folosirea eronata a semnului minus intr-un camp caracterse obfine:

SQL> SELECT -Stat FROM EXEMPLU;

Rezultatul este: ERROR:ORA-01722: invalid numberno row selected

Mesajul de eroare variaza in functie de implementarea SQL,dar rezultatul este acela§i.

impartire (/)Semnul de impartire are un singur mod clar de folosire.

Utilizand tabela PRET din paginile anterioare, introducem comanda:

SQL > SELECT * FROM PRET;

Denumire Pret_unitarMere 20000

Portocale 17000Banane 30000

Pere 15000Prune 10000

Struguri 25000

PerePrune

Struguri

6 rows selected

7500500012500

Inmultire (*)Operarorul de inmul^ire, este de asemenea simplu. Folosind

tabela PRET, introducem comanda:

SQL> SELECT * FROM PRET;

Are ca rezultat: DenumireMere

PortocaleBanane

PerePrune

5 Struguri6 rows selected

Pref_unitar200001700030000150001000025000

Urmatoarea interogare modifica tabelul PRET pentru areflecta o cre§tere a valorilor din coloana Pret_unitar de doua ori:

60 61

Page 12: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

SQL> SELECTPret_nouFROM Pret;

DenumireMere

PortocaleBanane

PerePrune

Struguri

6 rows selected

Denumire, Pret unitar,

Pret unitar Pret nou20000 4000017000 3400030000 6000015000 3000010000 2000025000 50000

Pret_unitar*2

Modulo (%)Acest operator returneaza restul intreg al operatiei de

impartire. Folosind tabelul REST, se introduce comanda:

SQL> SELECT * FROM REST;

Num Numit100 57 320 490 775 2125 5

6 rows selected

La tabel se va adauga o coloana, numita Rest_mod, pentru ase pastra valorile operatiei Num%Numit.

SQL> SELECT Num, Numit, Num%Numit Rest_jnodFROM REST;

62

Num1007209075125

Numit534725

Rest mod010610

Unele versiuni de implementare a SQL folosesc operatorulmodulo ca pe o func^ie, MOD. Instructiunea:

SQL> SELECT Num, Numit, MOD (Num, Numit) Rest_modFROM REST;

va produce un rezultat identic cu eel dinainte.

Prioritatea operatorilorPentru a determina prioritatea operatorilor aritmetici, folosim

tabelul EX2 §i vom introduce comanda:

SQL> SELECT * FROM EX2;

El10143

E215257

E312702

3 rows selectedDaca vom utiliza comenzile:

SQL> SELECT2. E1+E2*E33.(E1+E2)*E34. E1+(E2*E3)

FROM EX2

63

Page 13: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

rezultatul va fi:

E1+E2*E3300275020

(E1+E2)*E3300275020

E1+(E2*E3)1901764

17

Operator! de com paradeDupa cum arata §i numele lor, operatorii de comparable

compara expresiile §i returneaza una din urmatoarele trei valori:TRUE (adevarat), FALSE (fals), sau UNKNOWN (necunoscut).Pentru a injelege nojiunea UNKNOWN (necunoscut), trebuie s-oasociem conceptului NULL (nul). in termenii folositi pentru baze dedate, NULL semnifica absenta datelor dintr-un camp. Nu inseamna cao coloana contine o valoare zero sau un spatiu. Un zero sau un spajiusunt valori. NULL inseamna ca in campul respectiv nu se gase§tenimic. Daca face|i o comparajie de genul camp = no §i camp esteNULL, comparajia va returna UNKOWN. In multe versiuni de SQLeste schimbat UNKOWN cu FALSE §i este asigurat un operator ISNULL (este nul) pentru a testa conditia NULL.

Tabelul PRET a fost modificat pentru a avea o valoare NULLin campul Pret_unitar pentru produsul struguri. Tabelul va arata astfel:

SQL> SELECT * FROM PRET;

DenumireMere

PortocaleBanane

PerePrune

Struguri

6 rows selected

Pret_unitar. 20000

17000300001500010000

Se observa ca nu este tiparit nimic in campul cu valoareaNULL. Este o observatie demna de retinut in acest caz, deoarece este

64

o coloana numerica. Daca valoarea NULL era in coloana Denumire, arfi fost imposibil de specificat diferenfa dintre NULL §i spatiu.

Vom incerca sa gasim valoarea NULL:

SQL> SELECT*FROM PRETWHERE Pret_unitar IS NULL;

Dupa executarea comenzii rezulta;Denumire Pre|_unitar

Struguri

Daca insa se folose§te semnul '=' vom avea:

SQL> SELECT*FROM PRETWHERE Pret_unitar = NULL;

Vom avea ca rezultat: no rows selected.

Nu s-a gasit nimic, deoarece comparatia Pret_unitar = NULLreturneaza valoarea FALSE datorita faptului ca rezultatul estenecunoscut. Se poate utiliza §i valoarea IS NULL, inlocuindinstructiunea WHERE cu WHERE Pret_unitar IS NULL, in acest cazvom primi ca raspuns al comenzii toate liniile in care exista o valoareNULL1.

Egal(=)In exemplul anterior s-a observat unul din modurile posibile

de utilizare a semnului egal. S-a observat ca unele versiuni deimplementare a SQL au folosit semnul '=' in clauza SELECT pentruatribuirea unor alias-uri. In clauza WHERE semnul = este eel maiutilizat operator de comparare, care, folosit singur, devine un modfacil de selectare a unei valori din mai multe existente.

1 Perkins J., Bryan M., SQL far a profes or in 14 zile, Editura Teora,Bucure§ti, 1998.

65

Page 14: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

SQL> SELECT * FROM AGENDA;

Nume Prenume NrTel

MARINESCU BOGDAN 6332421POP RADU 7732512

GEORGESCU ANDREI 7781122VASILE OCTAVIAN 2313277FLORIN OPREA 2303179

Vom cauta linia OPREA utilizand comanda:

SQL> SELECT*FROM AGENDAWHERE Prenume = 'OPREA ';

Nume Prenume NrTel

FLORIN OPREA 2303179

Mai mare decat (>) si Mai mare sau egal (>=)Operatorul mai mare decat (>) actioneaza in felul

SQL> SELECT*FROM AGENDAWHERE Varsta > '29';

Nume Prenume NrTel

GEORGESCU ANDREI 7781122

VASILE OCTAVIAN 2313277

SQL> SELECT*FROM AGENDAWHERE Varsta > = '29';

Varsta

2225354529

Varsta

29

urmator:

Varsta

35

45

66

Nume

GEORGESCU

VASILE

FLORIN

Prenume

ANDREI

OCTAVIAN

OPREA

NrTel

7781122

2313277

2303179

Varsta

35

45

29

Cu aceasta modificare sunt listate inregistrarile care respectaconditia Varsta mai mare sau egala cu 29.

Mai mic decat (<) si Mai mic sau egal (<=)Acesti operatori de comparare actioneaza in acelasi mod, dar

in sens invers.

SQL> SELECT*FROM AGENDAWHERE Varsta <'29';

Nume Prenume NrTel VarstaMARINESCU BOGDAN 6332421 22

POP RADU 7732512 25

SQL> SELECT*FROM AGENDAWHERE Varsta <='29';

NumeMARINESCU

POPFLORIN

PrenumeBOGDAN

RADUOPREA

NrTel

633242177325122303179

Varsta222529

67

Page 15: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

Inegalitati (<> sau !=)Pentru excluderea anumitor date dintr-un tabel se folose§te

simbolul de inegalitate, care poate fi <> sau !=, in functie de versiuneade SQL implementata. Pentru a gasi toate persoanele care nu auPrenumele ANDREI, se scrie comanda:

SQL> SELECT*FROM AGENDAWHERE Prenume <> 'ANDREI';

NumeMARINESCU

POPVASILEFLORIN

PrenumeBOGDAN

RADUOCTAVIAN

OPREA

NrTel633242177325122313277

.2303179

Varsta22254529

Pentru a gasi toate persoanele care nu au numele VASILE seintroduce comanda

SQL> SELECT *FROM AGENDAWHERE Nume != 'VASILE';

NumeMARINESCU

POPGEORGESCU

FLORIN

PrenumeBOGDAN

RADUANDREIOPREA

NrTel6332421773251277811222303179

Varsta22253529

Se observa ca s-au utilizat atat simbolul o, cat §i simbolul !=obtinandu-se practic acela§i rezultat.

68

2.3.1. Operatori caracter

In afara operatorilor amintiji anterior exista §i operator!caracter, dintre care vom aprofunda: LIKE, UNDERSCORE,Concatenarea.

LIKE presupune a gasi intr-o baza de date acele inregistraricare nu corespund in totalitate unui model.

Forma sa este urmatoarea:

SQL> SELECT*FROM nume baza de dateWHERE nume-camp LIKE expresie;

De multe ori, in expresia care urmeaza dupa LIKE aparesemnul de modulo (%), care are rolul de caracter de inlocuire.

Exemplu:

SQL> SELECT*FROM AGENDAWHERE Nume LIKE 'G%';

NumeGEORGESCU

PrenumeANDREI

NrTel7781122

Varsta35

Executia acestei comenzi are ca efect aparitia acelorinregistrari in care Numele incepe cu litera G. De remarcar ca LIKEdiferentiaza literele mari de literele mici.

UNDERSCORE. Este un caracter de inlocuire doar pentru unsingur caracter. Pentru tabelul AGENDA creat anterior vomexemplifica acest operator:

69

Page 16: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

SQL> SELECT*FROM AGENDAWHERE Nume LIKE 'POJ;

NumePOP

PrenumeRADU

NrTel7732512

Varsta25

intr-o instruetiune SELECT pot aparea mai multe semneunderscore.

De asemenea, se poate regasi o inregistrare sau mai multedupa un caracter situat oriunde in §irul de caractere.

Exemplu:

SQL> SELECT*FROM AGENDAWHERE Nume LIKE '_OJ;

Ceea ce are ca efect gasirea tuturor inregistrarilor care aulitera O ca al doilea caracter al numelui.

Concatenarea presupune reunirea a doua sau mai multe §iruride caractere. Pentru concatenare se folose§te simbolul // sau +. Vomlua un exemplu tot pe tabelul creat anterior AGENDA.

SQL> SELECT Nume // Prenume Nume_CompletFROM AGENDA;

Rezultatul va fi:Nume_Complet

MARINESCU BOGDANPOPRADU

GEORGESCU ANDREIVASILE OCTAVIAN

FLORIN OPREANu toate versiunile de SQL admit semnul '+' pentru

concatenare.

70

2.3.2. Operatori logici

Operatorii logici sunt urmatorii: AND, OR, NOT.Operatorul AND utilizat intre doua expresii presupune ca ambele safie adevarate pentru ca acestea sa returneze valoarea de adevar TRUE.Daca oricare dintre expresii este falsa, AND va returna valoareaFALSE.Exemplu: pentru un tabel ANGAJATI trebuie sa vedem daca suntsalariati cu vechime mai mare de 10 ani care, §i-au luat mai mult de 20de zile libere.

SQL> SELECT*FROM ANGAJATI;

Vechime Zflejibere5 1711 620 2515 10

SQL> SELECT FROM ANGAJATIWHERE Vechime >=10AND Zile Jibere >20;

Nume Prenume Adresa Vechime Zile_libereGEORGESCU ANDREI TIMI§OARA 20 25

Operatorul OREste utilizat pentru insumarea unei serii de conditii. Cand eel

putin una dintre conditii este adevarata, OR returneaza valoareaTRUE.

Folosind acela§i exemplu de mai sus, se dore§te lista cusalariati care au vechime mai mare de 10 ani sau salariati care §i-auluat mai mult de 20 de zile de libere. Instructiunea este urmatoarea:

71

NumeMARINESCU

POPGEORGESCU

VASILE

PrenumeBOGDAN

RADUANDREI

OCTAVIAN

AdresaBUCURESTI

ORADEATIMI§OARABUCURE§TI

Page 17: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

SQL> SELECT FROM ANGAJATIWHERE Vechime >=10ORZileJibere>20;

NumePOP

GEORGESCUVASILE

Prenume Adresa VechimeRADU ORADEA 11

ANDREI TIM§OARA 20OCTAVIAN BUCURE§TI 15

Operatorui NOTIn cazul aplicarii unei condijii care are valoarea TRUE,

operatorul NOT o va schimba in FALSE. In situa^ia in care conditiacare urmeaza operatorului NOT are valoarea FALSE, ea va deveniTRUE. Pentru a selecta din tabelul AGENDA persoanele ce auprenume care nu incep cu litera A, putem scrie instruc$iunea:

SQL> SELECT*FROM AGENDAWHERE Prenume NOT LIKE 'A';

NumeMARINESCU

POPVASILEFLORIN

PrenumeBOGDAN

RADUOCTAVIAN

OPREA

NrTel6332421773251223132772303179

2.3.3. Operatoripentru multimi

UNION §i UNION ALLUNION returneaza rezultatele a doua interogari, mai putin

liniile duplicate. Urmatoarele doua tabele reprezinta listele studentilordin doua serii:

72

SQL> SELECT*FROM STUD;

Numelonescu

SimaPavelPopIlieStanState

7 rows selected

SQL> SELECT*FROM STUD2;

Numelonescu

SimaPavel

GeorgescuPetrescu

StanState

7 rows selected

Se determina studentii care au nume diferite in cele doua serii:

SQL> SELECT Nume FROM STUDUNIONSELECT Nume FROM STUD2;

Numelonescu

SimaPavel

GeorgescuPetrescu

PopIlieStanState

9 rows selected73

Page 18: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

INTERSECTOperatorul INTERSECT (intersectie) returneaza numai liniile

comune gasite in arnbele interogari. Pentru a arata lista studentilorcare fac parte din ambele grupe, se introduce comanda:

SQL> SELECT Nume FROM STUDINTERSECTSELECT Nume FROM STUD2;

Numelonescu

SimaPavelStanState

5 rows selected

MINUSMinus (cea de diferen^a) returneaza liniile din prima

interogare care nu fac parte din a doua interogare.

SQL> SELECT Nume FROM STUDMINUSSELECT Nume FROM STUD2;

NumePopHie

2 rows selected

Aceasta interogare afi§eaza studentii care nu fac parte dinprima interogare:

SQL> SELECT Nume FROM STUD2MINUSSELECT Nume FROM STUD;

74

NumeGeorgescuPetrescu

2 rows selected

Alti operatori, IN §i BETWEENCei doi operatori IN (in) §i BETWEEN asigura folosirea unei

forme scurte pentru funcjii diverse.

SQL> SELECT *FROM AGENDAWHERE Nume = 'POP'ORNume = 'VASILE'ORNume ='FLORIN';

Nume

POPVASILEFLORIN

Prenume

RADUOCTAVIAN

OPREA

NrTel773251223132772303179

VSrsta

254529

3 rows selected

Are acelasi efect comanda:

SQL> SELECT*FROM AGENDAWHERE Nume IN ('POP', 'VASILE', 'FLORIN');

BETWEENDaca dorim un anumit grup de inregistrari din tabelul PRET,

putem introduce comanda:

SQL> SELECT *FROM PRETWHERE Pret_unitar > 15000ANDPret_unitar < 30000;

75

Page 19: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

DenumireMere

PortocaleBananeStruguri

4 rows selected

Pref_unitar20000170003000025000

Folosind BETWEEN se poate scrie:

SQL> SELECT*FROM PRETWHERE Pret_unitar BETWEEN 15000 AND 30000;

Rezultatul va fi ca §i eel anterior.

2AFunetiiiiiSQL

Caracteristicile generale ale functiilorFunctiile din SQL permit executarea calculului sumei pe o

coloana sau conversia tuturor caracterelor unui §ir in litere mari. Ele seclasifica in:

> Functii pentru calculul totalurilor.> Functii pentru data calendaristica §i ora.> Functii aritmetice.> Functii caracter.> Functii de conversie.> Functii diverse.

Aceste functii dezvolta capacitatea de manipulare ainformatiilor regasite pe baza functiilor de baza ale SQL. Primele cincifunctii, COUNT, SUM, AVG, MAX §i MIN, sunt functii pentrucalculul totalurilor §i sunt definite in standardul ANSI. Majoritateaversiunilor implementate in SQL au extins aceste functii pentru aingloba §i restul functiilor1.

Perkins J., Bryan M., op. cit.76

2.4.1. Functii pentru calculul totalurilor

Aceste functii se mai numesc functii de grup. Ele returneaza ovaloare bazata pe valorile unei coloane.

Se considers tabelul STUDENTI

SQL> SELECT*FROM STUDENTI;

CodStud326765877752100

NumeIon Die

Popa VladPop luliu

Alexandra IonPopescu DanaSima Victor

Marcut Marius7 rows selected

An1111111

Grupa109109109109109109109

Media7.258.209.158.146.177.909.95

COUNTFunctia COUNT returneaza numarul de linii care respecta

conditia din clauza WHERE. Presupunem ca dorim sa cunoastem catistudent! au avut media sub 8.50. Se introduce comanda:

SQL> SELECT COUNT(*)FROM STUDENTIWHERE Media < 8.50;

CodStud3267877752

NumeIon Eie

Popa VladAlexandra IonPopescu DanaSima Victor

5 rows selected

An11111

Grupa109109109109109

Media7.258.208.146.177.90

77

Page 20: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

Pentru a face expresia mai u§or de injeles, putem utiliza unalias:

SQL> SELECT COUNT(*) Medie_cerutaFROM STUDENTIWHERE Media < 8.50 Medie_ceruta;

Acela§i lucru se ob{ine inlocuind semnul * cu numele uneicoloane.

SQL> SELECT COUNT( Media) Medie_cerutaFROM STUDENTIWHERE Media < 8.50 Medie_ceruta;

Daca se utilizeaza functia COUNT fira clauza WHERE, ca inexemplul urmator:

SQL> SELECT COUNT(*)FROM STUDENTI;

COUNT(*)

functia va returna numarul inregistrarilor din tabel.

SUMFunctia SUM returneaza suma tuturor valorilor dintr-o

coloana.Pentru tabelul PRET, daca vrem sa calculam suma

preturilor/Kg pentru produsele date, vom scrie:

SQL> SELECT SUM (Pret_unitar) TotalFROM PREJ;

Total117000

78

Pentru a obtine mai multe sume in aceea§i instructiune,formatul general este:

SQL> SELECT SUM (nume_variabilal) nume_var_sum 1,[SUM (nume_variabila2) nume var_sum2 ]FROM nume_tabel;

Functia SUM are efect numai asupra campurilor numerice.Daca ea este utilizata pentru un camp afanumeric se obtine:

SQL> SELECT SUM (Nume)FROM STUDENTI;

ERROR:ORA- 01722: invalid numberNo rows selected

Este normal, deoarece suma unui grup de nume nu are sens.

AVGAceasta functie calculeaza valoarea medie a unei coloane.

Este destinata calculului mediei aritmetice. Pentru a calcula media pegrupa, vom scrie instructiunea:

SQL> SELECT AVG (Media) Media_grFROM STUDENTI:

MAXAceasta functie returneaza valoarea maxima dintr-un §ir de

numere (o coloana a tabelului).

Exemplu:SQL> SELECT MAX (Media)

FROM STUDENTI;

MAX (Media)

9.9579

Page 21: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

Daca scriem:SQL> SELECT Nume

FROM STUDENTIWHERE Media = MAX (Media);

ERROR at line :ORA-00934: group function is not allowed here

SQL avertizeaza utilizarea incorecta a functiei MAX.

Ce se intampla daca utilizam aceea§i operate asupra uneicoloane ne-numerice?

SQL> SELECT MAX (Nume)FROM STUDENTI;

Functia MAX returneaza eel mai mare §ir de caractere (careeste eel mai apropiat de litera Z) §i, ca atare, deducem ca MAX este ofunctie care lucreaza atat cu caractere, cat §i cu numere.

MINMIN opereaza in acela§i mod ca MAX, cu exceptia faptului ca

returneaza cea mai mica valoare dintr-o coloana. Daca se dore§teaflarea celei mai mici medii din grupa se va scrie instructiunea:

SQL> SELECT MDSf (Media)FROM STUDENJI;

MIN (Media)

6.17

Instructiunea: SQL> SELECT MIN (Nume)FROM STUDENTI;

80

returneaza numele care are caracterul de inceput eel maiapropiat de inceputul alfabetului. Aceasta func^ie poate fi folosita incombinatie cu functia MAX pentru a obtine un interval de valori.

SQL> SELECT MIN (Media), MAX (Media)FROM STUDENJI;

MIN (Media) MAX(Media)

6.17 9.95

Acest mod de sortare a informalilor poate fi folositor cand seutilizeaza functii statistice.

Functiile descrise anterior sunt caracteristice standarduluiANSI. Vom analiza, in continuare, func{ii care au devenit standardede facto, fiind prezente in toate versiunile importante de SQL.

VARIANCEAceasta functie are ca rezultat dispersia, adica patratul unei

deviatii standard.

SQL> SELECT VARIANCE (Media)FROM STUDENTI;

Daca se aplica unui §ir de caractere:

SQL> SELECT VARIANCE (Nume)FROM STUDENTI;

ERROR:ORA- 01722: invalid numberNo rows selected

functia VARIANCE va semnala eroare, deoarece opereazanumai cu numere, sau cu variabile de tip numeric.

81

Page 22: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

STDDEVUltima functie de grup analizata, STDDEV, calculeaza

abaterea sau deviatia standard a unei coloane de numere (sau variabilenumerice), a§a cum este demonstrat in exemplul urmator:

SQL> SELECT STDDEV (Media)FROM STUDENT!;

Cand prime§te ca argument un §ir, func^ia returneaza eroare.

SQL> SELECT STDDEV (Nume)FROM STUDENJI;

ERROR:ORA- 01722: invalid numberNo rows selected

Aceste functii totalizatoare pot fi folosite in combinatie unelecu altele:

SQL> SELECT COUNT (*)AVG (Media)MIN (Media)MAX (Media)STDDEV (Media)VARIANCE (Media)FROM STUDENTI;

2.4.2.Funcfii dedicate pentru data calendaristica §i ora

Marea majoritate a implementarilor SQL au functii carepermit conceptul de data calendaristica §i ora. Se va folosi tabelulPROIECT pentru a exemplifica modul de lucru cu aceste functii.

SQL> SELECT *FROM PROIECT;

82

Tip__proiectOrganizare

FundatieStructuraZidarie

Acoperi?Amenajari

6 rows selected

Data_inceputl-Apr-99

12-Apr-9915-Iun-99

20-Aug-9925-Sept-9910-Dec-99

Data_sfar§it10-Apr-9914-Iun-9919-Aug-9924-Sept-999-Dec-9931-Dec-99

ADD^MONTHS (Adauga luni)

Aceasta functie adauga un numar de luni la o datacalendaristica specificata. De exemplu, sa consideram ca a intervenit ointarziere in project §i proiectul a fost decalat cu o luna. Realizam untabel introducand comanda:

SQL> SELECT Tip_proiect,Data__inceput,Data_sfar§it Data_sfDep,ADD_MONTHS (Data_sfar?it, 2),FROM PROIECT;

Tip_proiectOrganizare

FundatieStructuraZidarie

Acoperi§Amenajari

6 rows selected

Data_inceputl-Apr-9912-Apr-9915-Iun-99

20-Aug-9925-Sept-9910-Dec-99

Data__sfDep10-Mai-9914-M-99

19-Sept-9924-Oct-999-Ian-OO

31-Ian-OO

Functia ADD_MONTHS opereaza, de asemenea, §i in afaraclauzei select. Introducand comanda:

83

Page 23: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

SQL> SELECT Tip_proiect PMTREI__LuniFROM PROJECTWHERE ADDJMONTHS (Datajnceput, 3)>Data_sfar§it;

Tip_proiectOrganizare

FundatieStructuraZidarie

Functia opereaza cu tipuri de data caracter sau numeric,insotita de o pereche de functii ajutatoare, TO CHAR ?i TO DATE.

LAST_DAY . ,Aceasa functie intoarce ca rezultat ultima zi a unei lum

specificate. De exemplu, daca se dore?te aflarea ultimei zile a lunii dincoloana Data_sfar§it, introducem comanda:

SQL> SELECT Data_sfar§it, Last_Day (Data_sfar?it),FROM PROECT;

Data_sfar$it10-Apr-9914-Iun-9919-Aug-9924-Sept-999-Dec-9931-Dec-99

6 rows selected

Last_Day (Data__sfar§it)30-Apr30-Iun31-Aug30-Sept31-Dec31-Dec

MONTHS_BETWEEN (Lunile dintre)Pentru a afla cate luni sunt intre luna x $i luna y, se poate.

folosi functia MONTHS_BETWEEN astfel:

84

SQL> SELECT Tip_proiect, Datajnceput, Data_sfar§it,MONTHS_BETWEEN(Data_inceput, Data_sfar§it)DiferentaFROM PROJECT;

NEWJHME (Ora noua)Daca se dore§te a se corecta ora in functie de ora unui anumit

teritoriu, se va utiliza functia NEW_TIME. Mai jos este prezentatalista cu fusele orare care se pot utiliza cu aceasta functie:

AbreviereAST sau ADT

BST sau BDT

CST sau CDT

EST sau EDT

GMT

HST sau HDT

MST sau MDT

NST

PST sau PDT

YST sau YDT

Fus OrarAtlantic Standard sau Daylight Time (ora devara)Bering Standard sau Daylight Time (ora devara)Central Stendard sau Daylight Time (ora devara)Eastern Standard sau Daylight Time (ora devara)Greenwich Mean Time sau Daylight Time (orade vara)Alaska Hawaii Standard sau Daylight Time (orade vara)Mountain Standard sau Daylight Time (ora devara)Newfoundland Standard Time sau DaylightTime (ora de vara)Pacific Standard sau Daylight Time (ora devara)Yukon Standard sau Daylight Time (ora devara)

85

Page 24: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

Ora se poate modifica astfel:

SQL> SELECT Data_sfarsit EOTNEW_TIME (Data_sfarsit, 'EDT', 'PDT')FROM PROJECT;

Data_sfar§it NEW_TIME(Data_sfar$it)Ol-Apr-99Ol-Mai-9930-Mai-9924-Iun-999-Sept-9931-Ian-996 rows selected

31-Mar 09PM30-Apr09PM29-Mai 09 PM29-Iun 09 PM01-Sept 09 PM16-Ian 09 PM

Toate orele sunt acum transfejate in noul fus orar s.i datelecalendaristice sunt modificate corespunzator.

NEXT_DAYFunctia NEXT_DAY gaseste numele primei zile din

saptamana egala sau ulterioara unei date calendaristice specificate. Sapresupunem ca trebuie sa trimitem o situate in prima zi de vineri careurmeaza unui eveniment. Pentru aceasta introducem comanda:

SQL> SELECT Datajnceput,NEXT_DAY (Datajnceput, 'Friday')FROM PROffiCT;

care va avea rezultatul:

Data_inceputOl-Apr-9902-Apr-9915-Mai-99Ol-Iun-9925-Iul-9910-Sept-99

Data_sfDep07-Apr-9907-Mai-9919-Mai-9902-Iun-9907-Sept-9908-Ian-OO

86

SYSDATEFunctia SYSDATE (data si ora calendaristica a sistemului)

returneaza data si ora calendaristica a sistemului.

SQL> SELECT DISTINCT SYSDATEFROM PROffiCT;

Daca se cere o anumita analiza a stadiului unui project seintroduce comanda:

SQL> SELECT *FROM PROffiCTWHERE Data_de_inceput > SYSDATE;

2.4.3. Funcfii aritmetice

Majoritatea versiunilor de SQL furnizeaza functii aritmeticesimilare cu cele prezentate in aceasta secfiune. Pentru exemplele careurmeaza vom folosi tabelul EXNUM.

SQL> SELECT*FROM EXNUM;

A3.22-107

-44.25314-9

6 rows selected

B5

0.2029

32546.1

87

Page 25: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

ABSFunctia ABS returneaza valoarea absoluta a unui numar

indicat, ca in exemplul urmator:

SQL> SELECT ABS (A) Val_absFROM EXNUM;

Val.abs3.22107

44.253149

6 rows selected

Aceasta functie transform^ toate numerele negative in numerepozitive si lasa numerele pozitive neschimbate.

CEIL ?i FLOORPrima dintre aceste funcfii, CEIL, returneaza eel mai mic

numar intreg care este mai mare sau egal cu un argument dat. A doua,FLOOR, face exact operatia inversa, returnand eel mai mare numarintreg care este egal sau mai mic cu un argument dat. De exemplu:

SQL> SELECT B, CEIL (B) Lim_supFROM EXNUM;

B5

0.202932546.1

6 rows selected

Lim_sup51932547

88

si:SQL> SELECT A, FLOOR (A) Lim_inf

FROM EXNUM;

A3.22-107

-44.25314-9

6 rows selected

Lim_inf41932549

COS, COSH, SIN, SINH, TAN, TANKFuncjiile COS, SIN, TAN ofera baza pentru numeroase

operatii trigonometrice. Func{iile COSH, SINH, TANH returneazavalorile hiperbolice ale argumentelor primite ca parametri. Toateaceste funcfii opereaza presupunand ca argumentul de intrare A arevaloarea in radiani. De exemplu, instrucfiunea:

SQL> SELECT A, COS (A)FROM EXNUM;

scne:Deoarece 360 de grade = 2 n radiani, instructiunea se mai

SQL> SELECT A, COS (A*0.01745329251994)FROM EXNUM;

Functiile trigonometrice opereaza dupa cum urmeaza:

SQL> SELECT A, COS (A*0.017453),COSH (A*0.17453)FROM EXNUM;

89

Page 26: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

SQL> SELECT A, SIN (A*0.017453),SINK (A* 0.017453)FROM EXNUM;

SQL> SELECT A, TAN (A*0.017453),TANH (A* 0.017453)FROM EXNUM;

EXPPentru a ridica o constanta V la o putere se utilizeaza functia

EXP. Introducand instructiunea:

SQL> SELECT A, EXP (A)FROM EXNUM;

constanta e este ridicata la puterile date de valorile dincoloana A a tabelei EXNUM.

LN §i LOGAceste doua functii se refera la logaritmi. Prima, LN,

returneaza logaritmul natural al argumentului primit ca valoare deintrare. Se introduce instructiunea:

SQL> SELECT A, LN (A)FROM EXNUM;

ERROR:ORA- 01428: argument '-10' is out of range, deoarece

argumentul trebuie sa fie pozitiv.Ca atare, instructiunea se va scrie

SQL> SELECT A, LN (ABS(A))FROM EXNUM;

Se observa incapsularea functiei ABS in interiorul apeluluifunctiei LN. Cealalta functie logaritmica, LOG, preia doua argumente,90

returnand logaritmul primului argument calculat in baza celui de-aldoilea argument.

SQL> SELECT B, LOG (B, 10)FROM EXNUM;

returneaza logaritmii valorilor din coloana B calculati in baza10.

MODStandardul ANSI pentru operatorul modulo, %, este

implementat uneori ca functia MOD. Interogarea:

SQL> SELECT A, B, MOD (A, B)FROMEXNUM1;

A3.25-1079

4 rows selected

B5

.20234

MOD (A,B)3.251.92

11

returneaza un label care afiseaza restul impartirii lui A la B.

POWERPentru a ridica un numar la putere, se utilizeaza func{ia

POWER. In aceasta functie, primul argument este ridicat la putereaexprimata prin al doilea argument.

SQL> SELECT A, B, POWER (A, B)FROM EXNUM 1;

ERROR:ORA - 01428: argument '-10' is out of range

91

Page 27: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

La prima vedere, s-ar parea ca primul argument nu poate aveavalori negative. Dar acest lucru este adevarat, deoarece un numar, cumar fi -10, poate fi ridicat la o putere, ceea ce inseamna ca in aceastafunc^ie, daca primul argument este negativ, al doilea trebuie sa fieintreg. Se poate indeplini aceasta condijie prin folosirea functiei CEILsau FLOOR:

SQL> SELECT A, CEIL (B), POWER (A, CEIL(B))FROMEXNUM1;

SIGNFunctia SIGN returneaza valoarea -1 daca argumentul primit

este mai mic decat 0, 0 daca argumentul primit este egal cu 0 si 1 dacaargumentul sau este mai mare decat 0, asa cum se arata in exemplulurmator:

SQL> SELECT A, SIGN A,FROMEXNUM2;

A SIGN (A)3.25 1-10 -17 1

-44.253 -114 10 0

6 rows selected

De asemenea, se poate utiliza funcjia SIGN intr-o clauzaSELECT WHERE, ca in exemplul urmator:

SQL> SELECT A,FROM EXNUM2WHERE SIGN (A) =1;

92

A3.25

714

3 rows selected

SQRTFunctia SQRT returneaza radacina patrata a argumentului

primit. Deoarece radacina patrata a unui numar negativ nu estedefinita, nu putem folosi aceasta func{ie pentru numere negative.

SQL> SELECT A, SQRT (A)FROM EXNUM2;

ERROR:ORA - 01428: argument '-10' is out of range.

Rezolvam aceasta eroare prin folosirea functiei ABS:

SQL> SELECT A, SQRT (ABS (A))FROM EXNUM2;

2.4.4. Funcfii caracter

O parte din versiunile de SQL pun la dispozitie functii pentrumanipularea caracterelor si a sirurilor de caractere. Pentruexemplificare vom face referire la tabelul STUDENTI:

SQL> SELECT * FROM STUDENT!;

CodStud326765

NumeIon Die

Popa VladPop luliu

An111

Grupa109109109

Media7.258.209.15

93

Page 28: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

87 Alexandra Ion77 Popescu Dana52 Sima Victor100 MarcuJ Marius

7 rows selected

1111

109109109109

8.146.177.909.95

CHRFunctia CHR returneaza caracterul echivalent cu numarul

folosit ca argument. Caracterul este returnat in functie de setul decaractere din numele campului care apartine bazei de date. Pentruacest exemplu, campul din baza de date este stabilit in codul ASCII.Coloana CodStud include numerele:

SQL> SELECT CodStud, CHR (CodStud)FROM STUDENTI;

CodStud326765877752100

CHR (CodStud)

CAWM4D

7 rows selected

Spajiul aparut pe linia lui 32 indica faptul ca acesta este codul

spajiului in setul de caractere ASCII.

CONCATFunc^ia CONCAT este echivalenta semnului //. Vom folosi

tabelul AGENDA:

SQL> SELECT CONCAT (Nume, Prenume) 'Nume §iPrenume de Familie'FROM AGENDA;

94

Nume si Prenume de FamilieMARINESCU BOGDAN

POP RADUGEORGESCU ANDREI

VASILE OCTAVIANFLORIN OPREA

5 rows selected

De retinut din exemplul anterior este faptul ca s-au folositghilimelele pentru a delimita expresia 'Nume §i Prenume de Familie',$i ca, in al doilea rand, chiar daca tabelul arata ca doua coloanedistincte, ceea ce este afi§at nu este decat o coloana.

INITCAPAceasta functie conflgureaza un cuvant astfel: prima litera din

cuvant este litera mare, iar toate celelalte sunt caractere mici.

SQL> SELECT Nume Vechi, INIT (Nume) NouFROMAGENDA;

VechiMARINESCU

POPGEORGESCU

VASILEFLORIN

5 rows selected

Nou

MarinescuPop

GeorgescuVasileFlorin

95

Page 29: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

LOWER ?i UPPERLOWER modifica toate caracterele in litere mici, iar UPPER

realizeaza operatia inversa. Folosind functia UPDATE, vomtransforma una din valori in caractere mici:

SQL> UPDATE AGENDASET Nume = 'marinescu'WHERE Nume = 'MARINESCU';

1 row updated

SQL> SELECT NumeFROM AGENDA;

Nume

marinescuPOP

GEORGESCUVASILEFLORIN

5 rows selected

Putem scrie urmatoarea comanda:

SQL> SELECT Nume, UPPER (Nume), LOWER (Nume)FROM AGENDA;

Nume UPPER (Nume) LOWER (Nume)

marinescuPOP

GEORGESCUVASILEFLORIN

MARINESCUPOP

GEORGESCUVASILEFLORIN

marinescupop

georgescuvasileflorin

5 rows selected

96

LPAD §i RPADAceste doua functii primesc minim doua §i maxim trei

argumente. Primul este §irul de caractere cu care trebuie sa opereze.Al doilea argument este caracterul de umplere al spatiilor adaugate. Altreilea argument are ca valoare prestabilita spatiu sau poate fi unsingur caracter sau un §ir de caractere. Daca introducem instructiunea:

SQL> SELECT Nume, LPAD (Nume, 20, '*')FROM AGENDA;

Utilizand aceasta functie, cele 20 de caractere nu vor fi numai'*' ci §i caracterele care formeaza campul Nume.

SQL> SELECT Nume, RPAD (Nume, 20,' *')FROM AGENDA;

LTRIM §i RTRIMAceste functii primesc unul sau doua argumente. Primul

argument este un §ir de caractere. Al doilea argument optional este uncaracter sau un ?ir de caractere sau are valoarea prestabilita spatiu.Daca pentru al doilea argument se utilizeaza o valoare diferita despatiu, aceste functii de aliniere vor alinia respectivul caracter inacela§i mod in care aliniaza §i spatiile.

SQL> SELECT Nume, RTRIM (Nume)FROM AGENDA;

Pentru aliniere se poate scrie instructiunea:

SQL> SELECT Nume, RPAD (RTRIM (Nume), 20,'*')FROM AGENDA;

Folosirea functiei LTRIM:

SQL> SELECT Nume, LTRIM (Nume, 'P')FROM AGENDA;

97

Page 30: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

NumeMARINESCU

POPGEORGESCU

VASILEFLORIN

5 rows selected

LTRIM (Nume)

MARINESCUOP

GEORGESCUVASILEFLORIN

REPLACEFunctia REPLACE executa operatiuni de Tnlocuire. Din cele

trei argumente ale sale, primul este sjrul care trebuie cautat. Al doileaargument este cheia de cautare. Ultimul argument este sirul optionalde inlocuire. Daca al treilea argument lipseste sau este NULL, toatesecventele identice cu cheia de cautare din sirul respectiv sunteliminate si nu sunt Tnlocuite cu nimic.

SQL> SELECT Nume, REPLACE (Nume, 'VA') ModificFROM AGENDA;

NumeMARINESCU

POPGEORGESCU

VASILEFLORIN

5 rows selected

Modific

MARINESCUPOP

GEORGESCUSILE

FLORIN

Daca exista un al treilea argument, acesta inlocuieste toatesecven^ele identice cu cheia de cautare din sirul respectiv, in acest caz,exemplul urmator va avea ca rezultat:

SQL> SELECT Nume, REPLACE (Nume, 'VA', '**')ModificFROM AGENDA;

98

NumeMARINESCU

POPGEORGESCU

VASILEFLORIN

5 rows selected

Modific

MARINESCUPOP

GEORGESCU**SILE

FLORIN

Daca al doilea argument are valoarea NULL, sirul destinatienu este modificat.Exemplu:

SQL> SELECT Nume, REPLACE (Nume, NULL) MdfiFROM AGENDA;

NumeMARINESCU

POPGEORGESCU

VASILEFLORIN

5 rows selected

Mdfi

MARINESCUPOP

GEORGESCUVASILEFLORIN

SUBSTRAceasta funcjie are trei argumente si permite preluarea unei

parfi din sirul destinatie. Primul argument este sirul destinatie. Aldoilea argument este pozitia primului caracter ce trebuie afisat. Altreilea argument semnific5 numjirul de caractere care trebuie tiparite laiesire.

SQL> SELECT Nume, SUBSTR (Nume, 2, 3)FROM AGENDA;

99

Page 31: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

Daca se utilizeaza un numar negativ pentru al doileaargument, punctul de inceput este dat de numerotarea fata de sfar§itul

cuvantului:SQL> SELECT Nume, SUBSTR (Nume, -1,2)

FROM AGENDA;

TRANSLATEFunctia TRANSLATE prime§te, de asemenea, trei argumente.

Primul este §irul destinatie. Apoi, este §irul FROM, urmat de §irul TO.Elementele §irului destinatie, care sunt identice cu §irul FROM, suntinlocuite cu elementele corespondente din §irul TO.

INSTRSe folose§te pentru a gasi intr-un §ir un anumit caracter.

Primul argument al acestei functii este §irul destinatie. Al doileaargument este caracterul care trebuie gasit. Urmatoarele douaargumente sunt numere ce reprezinta locul de unde incepe cautarea in§ir §i, respectiv, al catelea element este eel identic cu caracterul ce

trebuie afloat.

SQL> SELECT Nume, INSTR (Nume,' O',l, 2)FROM AGENDA;

Rezultatul acestei comenzi este ca returneaza un numar carereprezinta primul element identic cu O incepand cu al doilea caracter.In cazul in care nu se specifica al treilea §i al patrulea caracter, acesteaau valoarea prestabilita 1. Daca al treilea argument este negativ,cautarea incepe de la sfar§itul cuvantului catre inceputul acestuia.

LENGHFunctia LENGH returneaza lungimea singurului argument

(camp) caracter pe care il prime§te.

SQL> SELECT Nume, LENGH (RTRIM (Nume)

FROM AGENDA;

100

Nume LENGH (RTRIM (Nume)MARINESCU 9

POP 3GEORGESCU 9

VASILE 6FLORIN 6

5 rows selected

Se folose§te functia RTRIM pentru returnarea lungimiivaloarilor existente in camp, nu lungimea existenta a campului Nume.

FUNCTII DE CONVERSIESunt trei functii de conversie care pun la dispozitie o metoda

rapida de convertire a unui tip de data in alt tip de data.

TO_CHARModul uzual de operare a acestei functii este conversia unui

numar intr-un caracter. Alte implementari ale limbajului folosescaceasta functie pentru a converti in caracter alte tipuri de date, ca deexemplu DATE.

TO_NUMBERAceasta functie este perechea functiei TO_CHAR §i prime§te

ca parametru un §ir pe care il converte§te intr-un numar.

2.5. Clauze utilizate in SQL

Acest capitol va avea ca obiect elucidarea urmatoarelorclauze:

> WHERE;> STARTING WITH;> ORDER BY;> GROUP BY;> HAVING;

101

Page 32: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

Pentru a in^elege utilizarea acestor clauze, vom prezenta

sintaxa generala a inslructiunii SELECT:

SELECT [DISTINCT / ALL] { *I { [schema.] (label I vedere I instantaneu }.*I expresie} [AS] c_alias][, {[schema.] (label I vedere I inslanlaneu}.*I expresie} [AS] c_alias] ] }

FROM [schema.] (label I vedere I inslanlaneu} [@ dblink]

[,[schema.] (label I vedere I inslanlaneu} [@ dblink]

...[WHERE condilie][GROUP BY expresie [, expresie]...[HEAVING condilie] ][{UNION I UNION ALL I INTERSECT I MINUS} SELECT

comanda][ORDER BY {expresie | pozilie } [ASC | DESC]

[, {expresie | pozilie} [ASC | DESC] ] ...]

Clauza WHEREUlilizand doar SELECT §i FROM, acliunea esle limilala la

relurnarea luluror liniilor din label. Exisla insa cuvanlul cheieWHERE penlru slabilirea de selectii asupra labelului. Penlru a gasilo^i sludenjii al caror cod are o valoare mai mare de 70 vom scrie:

SQL> SELECT*FROM STUDENTIWHERE CodSlud> 70;

Clauza STARTING WITHClauza STARTING WITH esle o complelare la clauza

WHERE §i opereaza la fel ca LIKE (<exp>%).

SQL> SELECT NumeFROM STUDENTIWHERE Nume STARTING WITH (TO');

102

Clauza ORDER BYCand, apare necesilalea ca rezullalele inlerogarii sa fie

prezenlale inlr-o anumila ordine, se ulilizeaza clauza ORDER BY.Inslrucliunea SELECT FROM ofera o lisla, iar in cazul in care nu s-adefmil o cheie primara, inlerogarea va aparea in ordinea inlroduceriiinregislrarilor. Sa luam in considerare labelul STUDENTI. ClauzaORDER BY ofera o meloda de ordonare a rezullalelor operaliilor. Deexemplu, daca dorim ordonarea lislei dupa codul sludenlului,procedam in modul urmalor:

SQL> SELECT *FROM STUDENJIORDER BY CodSlud;

CodStud325265677787100

NumeIon Hie

Sima VictorPop luliuPopa Vlad

Popescu DanaAlexandra IonMarcuf Marius

An1111111

Grupa109109109109109109109

Media7.257.909.158.206.178.149.95

7 rows selected

Clauza GROUP BYPentru exemplificare ne vom folosi de tabela PRET:

DenumireMere

PortocaleBanane

PerePrune

Struguri

Pre|_unitar200001700030000150001000025000

103

Page 33: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

Introducand comanda:

SQL> SELECT Denumire, SUM (PreUinitar) TotalFROM PRETGROUP BY Denumire;

Total

117000

Clauza HAVINGConsideram un tabel denumit PERSONAL, care contine

urmatoarele campuri: Nume, LocMunca, Salariu, putem grupapersonalul pe compartimente §i vom afi§a salariul mediu pentrufiecare compartiment in parte. Se va folosi instruc^iunea:

SQL> SELECT LocMunca, AVG (Salariu)FROM PERSONALGROUP BY LocMunca;

Utilizand comanda:

SQL> SELECT LocMunca, AVG (Salariu)FROM PERSONALGROUP BY LocMuncaHAVING AVG (Salariu) < 3000000;

se pot obtine acele locuri de munca unde media salariului este maimica de 3000000.

Clauza HAVING permite folosirea de functii totalizatoareintr-o instructiune de comparare, asigurand pentru functiiletotalizatoare ceea ce WHERE asigura pentru inregistrarile individuate.

104

2.6. Jonctiuni

Notiuni §i objective ale jonctiunilorO caracteristica de baza a SQL-ului este capacitatea de

grupare §i manipulare a datelor din mai multe tabele. Tabelele foartecomplexe care contin multe campuri §i multe inregistrari sunt multmai greu de intretinut decat cele mici §i specifice. Or, tocmai acestavantaj il ofera functia JOIN din SQL. Jonctiunile pe care le pune ladispozitie SQL-ul sunt1:

> Jonctiuni externe.> Joncduni stanga.> Jonctiuni dreapta.> Echi-joncduni.> Non-echi-joncduni.> Joncdunea unui tabel cu el insu§i (auto-joncdunea).

Regula de baza a jonctiunilor este aceea ca ele 'lipesc'tabelele. Pentru tabelele care intra in joncdune se folosesc alias-uripentru a le deosebi.

De exemplu:

FROM PRODUSE P, BENEFICIARIB

Echi-joncdunea sau Jonctiunile echivalente folosesc clauzaWHERE pentru a selecta liniile combinate cu egalitatea dorita.

Forma generala poate fi:

SQL> SELECT alias 1.camp 1, [aliasl.campl,...],alias2.camp2, [alias2.camp2,...]WHERE <condide intre campuri ale celordoua alias-uri>

Diferenta intre echi-joncdune §i non-echi-jonctiune este aceeaca prima utilizeaza semnul egal in instrucdunea WHERE, in timp cenon-echi-joncdunea folose^te oricare alt semn de comparatie in afarade egal, de exemplu:... WHERE P.CantP > B.CantP.

Perkins J., Bryan M., op.cit.

105

Page 34: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

Exista, de asemenea, jonctiuni externe care suntcomplementare jonctiunilor interne. Jonctiunea interna este aceea incare liniile unui tabel sunt combinate cu liniile altui tabel,reprezentand un numar total de linii dat de produsul numarului de liniidin fiecare tabel, linii folosite pentru a determina rezultatul unei clauzeWHERE.

O jonctiune interna are ca format general:

SQL> SELECT alias 1.camp 1, [alias 1.camp 1,...],alias2.camp2, [alias2.camp2,...]FROM TABEL alias 1JOIN TABEL2 ON TABEL2.camp <conditie>

O jonctiune externa are aceea§i forma, numai ca inainteacuvantului cheie JOIN apare RIGHT OUTHER sau LEFT OUTHER.

Exemplu:

SQL> SELECT P.CantProd, P.DenProd, B.DenBenef,B.AdesaBFROM PRODUSE PRIGHT OUTER JOIN BENEFICIARIB ONPRODUSE.CantProd = 150000

Sau pentru Jonctiunea externa stanga:

SQL> SELECT P.CantProd, P.DenProd, B.DenBenef,B.AdesaBFROM PRODUSE PLEFT OUTER JOIN BENEFICIARI B ONPRODUSE.CantProd = 150000

Jonctiunea unui tabel cu el insu§i se comporta ca JOIN-ul pedoua tabele diferite.

106

2.6.1. Subinterogari

O subinterogare este o interogare ale carei rezultate sunttransmise ca argumente unei alte interogari. Ele sunt elementele delegatura intre mai multe interogari.

O subinterogare are urmatoarea sintaxa:

SQL> SELECT *FROM TABEL 1WHERE TABELl.Coloana_X =(SELECT Coloana_YFROM TABEL 2WHERE Coloana_Y = Valoare)

dintai.Se observa ca a doua interogare este plasata in interiorul celei

Avem tabelele COMPONENTS ?i COMENZI:

SQL> SELECT *FROM COMPONENTS;

Nr__comp51693135149

6 rows selected

DenumireAmbreiaj

Placute franaAmortizoareCablu franaAnvelope

Carburator

Pret3500007900040000047000545000290000

SQL> SELECT*FROM COMENZI;

107

Page 35: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

Data com Nume Nr_comp Cant

15-Mai-199919-Mai-19992-Sapt-1999

ComlCom2Com3

3 rows selected

513514

Obser-vatii

AchitatAchitatAchitat

Cele doua tabele folosesc in comun campul cu numeleNr_comp. Sa presupunem ca nu §tim §i nu dorim sa §tim valoareaNr_comp, dar am dori sa operam cu Denumirea componentei.Folosind o subinterogare, s-ar putea introduce:

SQL> SELECT*FROM COMENZIWHERE Nr_comp =(Select Nr__compFROM COMPONENTEWHERE Denumire LIKE 'Cablu frana');

Data_com

19-Mai-1999

Nume

Com2

Nr_comp Cant Obser-vatii

35 5 Achitat

Imbricarea subinterogarilorImbricarea este operatia de lipire a mai multor subinterogari in

serie, forma generala fiind:

SQL> SELECT *FROM TABELWHERE(subinterogare 1 (subinterogare2(subinterogare3);

Exista §i subinterogari corelate, care permit folosirea unei

referinte externe.108

2.7. Instructiuni de manipulate a datelor

Conceptele anterioare au stabilit cum se pot regasi anumitedate dintr-o baza de date folosind orice criteriu imaginabil de selectie.Din moment ce datele au fost gasite, ele pot fi folosite intr-un programaplicativ sau intr-un program de editare pentru utilizator. Problemaeste cum pot fi introduse informatiile intr-o baza de date. Se vor studiatrei instructiuni SQL care permit manipularea datelor intr-un tabel alunei baze de date. Acestea sunt:

> INSERT;> UPDATE;> DELETE.

SQL pune la dispozitie instructiuni pentru manipularea datelorimpreuna cu programe de aplicatii, care permit utilizatorului sa editezedate folosind instrumente de lucru proprii aplicatiei. ProgramatorulSQL trebuie sa fie capabil sa returneze datele din baza de datefolosind SQL. De asemenea, majoritatea sistemelor de baze de date demari dimensiuni nu sunt proiectate fara a se tine seama de proiectantulsau programatorul de baze de date. Deoarece aceste sisteme suntcreate pentru a fi utilizate in medii multiuser de mare volum,principala etapa de proiectare este bazata pe programul de optimizarea interogarilor §i pe motoarele de regasire a datelor. In toate operatiilede manipulare a bazelor de date care trebuie executate pot fi folositeaceste trei instructiuni. !n plus, majoritatea sistemelor de baze de daterelationale pun la dispozitie §i instrumente pentru importul §i exportuldatelor. Aceste date sunt memorate in mod obi§nuit intr-un formatlimitat de tip fi§ier text. Deseori, un format de fi§ier memoratpastreaza informatii despre tabelul care se importa.

Instrucfiunea INSERTInstructiunea INSERT (Insereaza) este asociata operatiei de

introducere a datelor intr-o baza de date. Ea poate fi:INSERT...VALUES

§iINSERT...SELECT

109

Page 36: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

Instructiunea INSERT...VALUESinstructiunea INSERT...VALUES este utilizata la

introducerea datelor mtr-un label, inregistrare cu inregistrare. Esteutila pentru operatii care presupun lucrul cu tabele care au inregistrari

putine.Forma generala a comenzii este:

SQL> INSERT INTO TABEL(coll,co!2, co!3,...)VALUES (valoarel, valoarel, valoareB,...)

Functia principals a acestei instruc^iuni este adaugarea uneiinregistrari intr-un tabel folosind coloanele menjionate §i valorilecorespondente. La inserarea datelor intr-un tabel prin folosirea acesteiinstructiuni, trebuie respectate urmatoarele reguli:

> valorile folosite trebuie sa aiba acela§i tip de data ca §icampurile in care sunt adaugate;

> dimensiunea datei introduse'trebuie sa fie mai mica decatdimensiunea coloanei. De exemplu, un §ir de 25 decaractere nu poate fi scris intr-un camp de 10 caractere;

> localizarea datei in lista VALUES trebuie sa corespundalocatiei din lista de coloane in care este adaugata (adica,prima valoare trebuie sa fie introdusa in prima coloana, adoua valoare in a doua coloana §i a§a mai departe). (A seintelege prin coloana campul din inregistrare).

Sa presupunem ca facem referire la tabelul STUDENTI:

SQL> SELECT *FROM STUDENTI;

CodStud Nume326765877752100

Ion HiePopa VladPop luliu

Alexandru IonPopescu DanaSima Victor

Marcut Marius7 rows selected

An1111111

Grupa109109109109109109109

Media7.258.209.158.146.177.909.95

110

Pentru adaugarea unei informatii in acest tabel, utilizaminstructiunea:

SQL> INSERT INTO STUDENTI(CodStud, Nume, An, Grupa Media)VALUES (66, 'DimaPetre', 1, 109, 7.10);

1 row created

Pentru a verifica adaugarea acestei noi inregistrari, vom utilizainstructiunea:

SQL> SELECT*FROM STUDENTI;

CodStud32676587775210066

NumeIon Die

Popa VladPop luliu

Alexandru IonPopescu DanaSima Victor

Marcut MariusDima Petre

8 rows selected

An11111111

An11111111

Grupa109109109109109109109109

Media7.258.209.158.146.177.909.957.10

Atunci cand folosim instructiunea INSERT, numele decoloane nu sunt obligatorii. Daca nu sunt introduse numele decoloane, SQL aliniaza valorile cu numerele de coloanecorespunzatoare. SQL insereaza prima valoare in prima coloana, adoua valoare in a doua coloana §i a§a mai departe.

Inserarea valorilor NULLCand este creata o coloana, i se poate atribui cateva

caracteristici. Una dintre aceste caracteristici este aceea ca respectivacoloana ar putea avea (sau nu) capacitatea de a contine valori NULL.O valoare NULL inseamna ca valoarea este vida. Nu este nici zero, incazul unui intreg, nici spatiu, in cazul unui §ir. In locul acestora nu

111

Page 37: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

exista nici un fel de data in coloana inregistrarii respective. Candcoloana are definitia NOT NULL inseamna ca acestei coloane nu i sepermite sa contina valori NULL, deci ea trebuie sa contina o valoare.

Instructiunea INSERT este anulata in cazul in care aceastaregula nu este respectata §i se receptioneaza un mesaj de descriere aerorii aparute.

Sa presupunem ca, in exemplul precedent, coloana NUME afost definita cu caracteristica NOT NULL. Introducerea instructiunii:

SQL> INSERT INTO STUDENTIVALUES (102, NULL, 1, 109, 8.70).

va genera:

INSERT INTO STUDENTI*

ERROR at line 1:ORA-01400: mandatory (NOT NULL) column is missing orNULL during insert

Inserarea valorilor uniceMulte sisteme de gestiune a bazelor de date permit crearea

unei coloane cu atributul UNIQUE. Aceasta inseamna ca, in tabelulrespectiv, valorile din coloana respectiva trebuie sa fie completate inmod unic §i, ca atare, nu pot aparea mai mult de o singura data.Aceasta configurare poate genera probleme la inserarea sauactualizarea valorilor intr-o baza de date existenta.

Instrucfiunea INSERT... SELECTInstructiunea INSERT...VALUES este utila la adaugarea

inregistrarilor simple intr-un tabel al bazei de date, dar are evidentrestrictive sale. In cazul tabelelor cu iregistrari foarte numeroase, estemult mai indicata utilizarea instructiunii INSERT...SELECT. Aceastainstructiune permite utilizatorului sa copieze intr-un tabel informa^idintr-un alt tabel sau grup de tabele. Deseori, pentru cre§tereaperformantei sunt create tabele de cautare. Tabelele de cautare potcontine date care cuprind mai multe tabele din mai multe baze de date.112

Deoarece combinarile in tabelele multiple sunt mai lente in executie,decat interogarile simple, este mult mai rapida executarea interogariiSELECT intr-un tabel de cautare decat executia unei interogaricombinate. Tabelele de cautare sunt memorate adesea pe mediileclient/server pentru a reduce traficul pe retea.

Sistemele de baze de date accepta, de asemenea, tabeletemporare. Tabelele temporare exista numai pe perioada catutilizatorul este conectat la baza de date §i sunt §terse la terminareaacestei legaturi. Instructiunea INSERT...SELECT poate prelua iejireaunei instructiuni SELECT obi§nuite pentru a insera valorilecorespunzatoare intr-un tabel temporar.

Sintaxa unei instructiuni INSERT...SELECT este urmatoarea:

SQL> INSERT INTO TABEL (col 1, co!2,...)SELECT Coll,Co!2,...FROM TABELWHERE conditie de cautare;

Este important de retinut ca ie§irea unei interogari standard detip SELECT devine intrare intr-un alt tabel al unei baze de date.Acelea§i reguli se aplica in cazul instructiunii INSERT...VALUES.

Vom copia continutul tabelului STUDENTI intr-un tabeldenumit GRUPAST:

SQL> CREATE TABLE GRUPAST(CodStud NUMBER, Nume CHAR (20)An NUMBER, Grupa NUMBERMedia NUMBER);

Aceasta instructiune a creat noul tabel GRUPAST. Pentru acompleta acest tabel cu datele din tabelul STUDENTI, vom procedaastfel:

SQL> INSERT INTO GRUPAST(CodSud, Nume, An, Grupa, Media)SELECT CodSud, Nume, An, Grupa, MediaFROM STUDENTI;

7 rows created113

Page 38: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

Sunt cateva reguli care trebuie respectate la folosireainstructiunii INSERT...SELECT:

> instructiunea SELECT nu poate selecta linii din tabelulcare a fost inserat;

> numarul de coloane din instructiunea INSERT...SELECTtrebuie sa fie egal cu numarul de coloane returnate deinstructiunea SELECT;

> tipurile de date ale coloanelor din instructiunea INSERTINTO trebuie sa fie acelea§i cu tipurile de date alecoloanelor returnate de instructiunea SELECT.

Instructiunea UPDATEInstructiunea UPDATE (Actualizeaza) are rolul de a actualiza

valorile unui tabel, dar este folosita §i pentru modificarea valorilor dininregistrarile existente. Sintaxa instructiunii UPDATE esteurmatoarea:

SQL> UPDATE TABELSET Coll =Valoarel[Col2 = Valoare2]...WHERE conditie de cautare

Aceasta instructiune verifica in primul rand clauza WHERE.Pentru toate inregistrarile din tabelul dat in care clauza WHERE esteevaluata la valoarea TRUE., valoarea corespunzatoare este actualizata.

SQL> UPDATE STUDENTlSETMedie = 8.0WHERE Nume = ' Dima Petre';

Pentru a confirma modificarea efectuata in tabelulSTUDENTl vom introduce instructiunea:

SQL> SELECT*FROM STUDENTlWHERE Nume = 'Dima Petre';

114

CodStud66

NumeDima Petre

An1

Grupa109

Media8.0

Daca se omite clauza WHERE, toate inregistrarile din tabelulSTUDENTl vor fi actualizate cu valoarea data, adica la Media 8.0.

Unele sisteme de baze de date pun la dispozitie o extensie lasintaxa standard a instructiunii UPDATE. De exemplu, limbajulTransact-SQL al sistemului SQL Server permite programatorului saactualizeze continutul unui tabel pe baza confinutului altor catevatabele, prin folosirea clauzei FROM. Sintaxa extinsa arata astfel:

SQL> UPDATE TABELSET Coll =Valoarel[Col2 = Valoare2]...FROM LISTA_TABELEWHERE conditie de cautare

Tipul datelor rezultate din evaluarea expresiei trebuie sa fieacela§i cu tipul de data al campului care este modificat. De asemenea,dimensiunea (lungimea) valorii trebuie sa fie corespunzatoare cucampul care este modificat.

La obtinerea rezultatelor in valoarea calculata pot rezulta douasituatii: trunchirea §i depa?irea zonei de memorie. Trunchirea apareatunci cand sistemul de baze de date converte§te, de exemplu, unnumar fractionar intr-un numar intreg. Depa§irea zonei de memorieapare atunci cand valoarea rezultata este mai mare decat capacitatea(campului) coloanei modificate. Aceasta va determina semnalareaunei erori de depa§ire din partea sistemului de baze de date.

Unele sisteme de baze de date rezolva aceste probleme, ca deexemplu Oracle?, care face conversia numarului in notatieexponentials.

115

Page 39: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

Instructiunea DELETELa fel de frecvent ca §i adaugarea de date intr-o baza de date,

apare necesitatea de §tergere a altor date pe baza unei anumite operatiidin program. Sintaxa instructiunii DELETE (§terge) este urmatoarea:

SQL> DELETE FROM TABELWHERE conditie

Inaintea executiei instructiunii DELETE nu apare prompt-ul.In limbajul SQL, atunci cand se anunta sistemul de administrare abazei de date §tergerea unui grup de inregistrari dintr-un tabel, aceastacomanda se executa fara a cere confirmarea utilizatorului.

In functie de folosirea sau nu a clauzei SELECT in cadrulinstructiunii DELETE, SQL poate executa urmatoarele operatii:

> §tergerea unor linii individuale;> §tergerea unor linii multiple;> §tergerea tuturor liniilor;> nici o linie §tearsa.

Clauza DELETE are urmatoarele caracteristici:

> Instructiunea DELETE nu poate fi folosita pentru§tergerea unei valori dintr-un camp individual (pentruaceasta se folose§te instructiunea UPDATE). InstructiuneaDELETE §terge inregistrari complete dintr-un singur

tabel.> Ca §i instructiunile INSERT §i UPDATE, opefatia de

§tergere a inregistrarilor dintr-un singur tabel poatedetermina aparitia unor probleme de integritatereferentiala in cadrul altor tabele. Acest aspect trebuieretinut atunci cand se modifica datele dintr-o baza de date.

> Prin folosirea instructiunii DELETE se pot §terge numaiinregistrari din tabel, nu §i tabelul. Pentru eliminarea unuitabel se folose^te instructiunea DROP TABLE.

116

SQL> DELETE FROM STUDENTIWHERE Media < 9.0;

Pentru a vedea rezultatul actiunii acestei instructiuni, utilizamurmatoarea comanda:

SQL> SELECT*FROM STUDENTI;

CodStud Nume An65 Pop luliu 1100 Marcut Marius 1

2 rows selected

Grupa109109

Media9.159.95

Pentru a annula §tergerile efectuate cu instructiuneaDELETE,vom proceda astfel:

SQL> INSERT GRUPASTSELECT * FROM STUDENTIDROP TABLE STUDENT!;

CREATE TABLE construie§te un tabel nou in formatul dat,iar DROP TABLE §terge tabelul respectiv. Instructiunea DROPTABLE elimina un tabel pentru totdeauna, in timp ce DELETEFROM <TABEL> §terge numai inregistrarile dintr-un tabel.

2.8. Importul $i exportul datelor

Instructiunile INSERT, UPDATE §i DELETE sunt utile intr-unprogram de baze de date. Ele sunt folosite impreuna cu instructiuneaSELECT pentru a crea baza pentru celelalte operatii cu baza de date.

De obicei, sistemele de baze de date permit importul §iexportul de date folosind formatul de fi§ier text ASCII; deci, aceastanu este caracteristica limbajului SQL. Exista produse software pentruexportul/importul de date care sunt continute in pachetele de programeMicrosoft ACCESS, Microsoft $i Sybase SQL.

117

Page 40: 03. Manual arhitectura baze date SQL._Doina Fusaru_pag.46-pag117

Exemplu:DECLARE @ varmat INTDECLARE @ varpret FLOATPRINT 'Lista preturilor mai man ca 1000000'DECLARE C_mat FOR SELECT * FROM MaterialeOPEN C_matFETCH FIRST FROM C_mat INTO @varmat, ©varpretWHILE (@@ sqlstatus = 0)BEGIN

IF (@varpret > 1000000)BEGIN

PRINT @ varmatENDFETCH NEXT FROM C_mat INTO @varmat, ©varpretEND

In acest exemplu sunt afi§ate toate codurile de materiale pentru Jcare pretul este mai mare cu 1.000.000 lei.

S-au declarat doua variabile @varmat pentru codul materialului 1ca intreg §i @varpret virgula mobila (FLOAT). S-a creat un cursor |Cjnat dupa care parcurgem inregistrarile din tabela Materiale.

Teste de autoevaluare

1. Ce se intelege prin arhitectura Client/Server?2. Clasificati arhitecturile Client/Server.3. Care sunt caracteristicile unui Client/Server WEB?4. Care sunt nivelurile pe care este organizata o baza de date SQL

Server?5. Gate tipuri de comenzi se cunosc in T_SQL 12?6. Scrieti comanda de creare a unei baze de date denumite

CALITATE §i apoi scrieti comanda de §tergere a acesteia.7. Cum se face declararea unei variabile in TJSQL?8. Creati un tabel numit SITSTUD care se refera la situatia

studentilor dintr-o facultate §i are drept campuri: CODSTUD, NUME,ADRESA, FACULTATE, AN, GRUPA.

9. Cate tipuri de date cunoa§teti in T_SQL?10. Cu ce comanda se face crearea unui view?11. Scrieti comenzile de creare §i de §tergere a procedurii

CALCUL.12. Care este definitia unei tranzactii?13. Scrieti modelul de constructie a unei tranzactii?14. Ce se intelege prin declarator?15. Ce instructiune se folose§te pentru a realiza o structura

alternativa?16. Care este instructiunea specifica unei structuri repetitive?17. Ce rol are cursorul in SQL?18. Scrieti comanda de creare §i deschidere a unui cursor.19. Cu ce comanda se realizeaza parcurgerea cursondui?20. Prin ce comanda se realizeaza eliberarea memoriei alocate

pentru cursor?

178 179