Sunteți pe pagina 1din 40

myw JQ VINVWOU laiivaNnd vnnima aft

aa aoiazva
njesnj BUJOQ
J.HVH ntiids
C UP R I NS

I BAZE DE DATE §1 SGBD


1. Notiuni generale referitoare la baze de date §i SGBD .. 7
1.1. Sistem de gesthme a bazelor de date (SGBD) 8
1.1.2. Arhitectura, obiectivele §i func{iile unui
SGBD 8
1.2. Clasificarea bazelor de date 12
1.3. Baze de date cu structuri ierarhice §i retea 14
1.4. Baze de date relationale 15
1.5. Baze de date orientate pe obiecte 23
1.6. Baze de date distribute (BDD) 28
1.6.1. Obiecte §i caracteristici generale 28
1.6.2. Proiectarea unei baze de date distribuite .... 35
1.6.3. Administrarea BDD (baza de date
distribuite) 40
1.7. Baze de date inteligente sau avansate .„.... 42
1.7.1. B aze de date deductive /. 42
Teste de autoevaluare 46
II LIMBAJUL SQL
2. Caracteristici generale 47
2.1. Notiuni de baza referitoare la SQL 50
2.2. Blocurile componente ale operajiei de regasire a
datelor: SELECT §i FROM 51
2.3. Operatori utilizati in SQL 55
2.3.1. Operatori caracter 69
2.3.2. Operatori logici 71
• ' /
2.3.3. Operatori pentru multimi 72
2.4. Functii in SQL 76
2.4.1. Functii pentru calculul totalurilor 77
5
2.4.2. Functii dedicate pentru data calendaristica §i
ora 82 I. BAZE DE DATE §1 SGBD
2.4.3. Functii aritmetice 87
2.4.4. Functii caracter 93
2.5. Clauze utilizate in SQL 101
2.6. Joncfiuni 105
2.6.1. Subinterogari 107
2.7. Instructiuni de manipulare a datelor 109 1. Notiuni generate referitoare la baze de date ji SGBD
2.8. Importul §i exportul datelor 117 Complexitatea problemelor care apar in activitatea unei unitati
2.9. Crearea §i intrefinerea tabelelor 119 economice implica prelucrarea operativa a datelor §i obtinerea de
2.10. Crearea view-urilor §i a indec§ilor 128 rezultate (informatii) care sunt suportul deciziei managerilor.
2.10.1. Modul de creare §i utilizare a view-urilor .. 128 Volumul acestor date este in continua cre§tere, ceea ce
2.10.2. Utilizarea indec?ilor 132 determina necesitatea organizarii §i memorarii lor pe suporturi tehnice
2.10.3. Utilizarea grupurilor de alocare (clusters) 135 adresabile, organizare care poate fi facuta in fi§iere sau in baze de
2.11. Controlul tranzacjiilor 136
2.12. Securitatea bazelor de date 139 date.
Fi§ierele reprezinta colec^ii de date omogene din punct de vedere
2.13. SQL incapsulat 140
al continutului, colectii care reprezinta inregistrari fizice. O
2.14. Utilizarea variabilelor 147
inregistrare fizica poate confine una-sau mai multe inregistrari logice.
2.15. Comenzi SQL 148
Inregistrarea logica este definitiva ca o unitate de prelucrare din
2.16. Proceduri rezidente 152
punct de vedere al programului utilizator. Organizarea datelor in
2.16.1. Crearea §i Utilizarea procedurilor rezidente 152
fi§iere §i accesul la ele sunt asigurate de un set de programe dedicate
2.16.2. Utilizarea parametrilor intr-o procedure
care sunt reunite sub denumirea de Sistem de Gestiunz a Fi§ierelor
rezidenta 154
2.16.3. §tergerea unei proceduri rezidente 154 (SGF), components a sistemului de operare (SO), /
Conceptul de baza de date porne§te de la ideea ca exista un fi§ier
2.16.4. Imbricarea procedurilor rezidente 155
2.17. Gruparea celor mai uzuale instruc^iuni SQL 157 de descriere globala a datelor, prin care se realizeaza independenta
programelor fata de date §i a acestora fa|a de programe. Astfel, putem
Teste de autoevaluare 164
III. Notiuni de SQL Server spune ca o baza de date este o colec{ie de date (Ki) aflate in
3.1. Arhitectura Client/Server 165 interdependent, impreuna cu descrierea datelor §i a rela^iilor dintre
3.1.1.ClasificareaarhitecturilorC/S 166 ele(B = (K 1 ,K 2 )).
3.1.2. Client/Server WEB 168 Acest ansamblu structurat de date contine structuri de date legate
3.2. Notiuni de baza pentru SQL Server 168 functional intre ele.
3.2.1. Baze de date SQL Server 169 Datele organizate in astfel de colec^ii trebuie sa fie interogabile
3.2.2. InitiereinT_SQL12 170 prin conjinut dupa orice fel de criterii §i trebuie sa ofere posibilitatea
Teste de autoevaluare 179 regasirii structurii datelor.
Bibliografie 180 Descrierea unei baze de date presupune:
- determinarea structurilor de date;
II. LIMBAJUL SQL
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? 2. Caracteristici generale
6. Ce se intelege prin structura relationala a datelor? Limbajul SQL (Structured Query Language - limbaj struc-
7. Enuntati restrictiile de integritate ale modelului relational. turat de interogare) este utilizat pentru manipularea §i regasirea datelor
8. Care sunt formele normale ale relatiilor? din bazele de date rela{ionale. El apare in deceniul 8 al secolului XX,
9. Care sunt regulile lui Codd privind cerintele pe care trebuie sa cand s-a lansat prima versiune Oracle §i SQL/DS la IBM.
le satisfaca un SGBDR? SQL-ul pune la dispozitia programatorului sau a unui
10. Defmiti conceptele de baza ale unei baze de date orientate pe administrator de baze de date urmatoarele facilitati:
obiecte.
> posibilitatea de modificare a structurii bazei de date;
11. Principiile SGBD-OO.
12. Care sunt caracteristicile generale ale unei baze de date > posibilitatea schimbarii valorilor de configurare pentru
securitatea sistemului;
distribuite?
13. Care sunt functiile dictionarului de date global §i ale unui > permite stabilirea §i modificarea drepturilor date
utilizatorilor asupra bazelor de date sau a tabelelor;
SGBDD?
14. Ce se intelege prin fragmentarea datelor? > permite interogarea unei baze ae date;
15. Defmiti fragmentarea orizontala, verticala §i mixta a datelor. > ofera facilitati multiple referitoare la actualizarea
16. Ce se intelege prin abordarea ascendenta §i descendenta? continutului unei baze de date.
17. Ce sunt tehnicile de reprezentare a cererilor intr-o BDD? Microsoft Query este un instrument de interogare furnizat o
18. Ce se in^elege prin baze de date inteligente sau avansate? data cu aplicatiile Microsoft Windows, cum sunt: Visual C++
19. Ce sunt bazele de date deductive? §i Visual Basic, folosind standardul ODBC (Open Data Base
20. Ce tipuri de integrare a BD Deductive cu diverse tehnologii Connectivity) pentru a transfera instructiuni SQL la un
cunoa§teti? program driver, care proceseaza instructiunile inainte de a le
transfera unui sistem de baze de date. In fond, ODBC este o
biblioteca de functii proiectata pentru a oferi interfata de
programare a aplicatiilor (Application Programming Interface
- API), care sa asigure dreptul pentru sistemele de baze de
date. Comunicarea cu baza de date se face prin intermediul
unui program driver de biblioteca, iar in cazul in care aceasta
este situata la distanta, va fi necesar un program driver de
retea.

46 47
> Apelul direct, care presupune ca alegerea este facuta de
eel ce implementeaza programul.
Cea mai utilizata forma de SQL este cea incapsulata,
cunoscuta sub denumirea de static SQL §i care presupune ca
Incarcare program instructiunea SQL este compilata in cadrul aplicajiei §i nu poate fi
driver ODBC modificata in timpul execu|iei programului.
Standardul ANSI 1992 (SQL 92) a extins limbajul care a
devenit standard international §i ^are astfel definite trei niveluri:
Procese apeluri ODBC, examinare introductiv, intermediar, complet. in plus fata de SQL 89, acesta a
cereri SQL, returneaza rezultate introdus urmatoarele facilitate
- conectarile la bazele de date;
- cursoare derulante;
- SQL dinamic; \ jonctiuni externe.
Sursa de date
(SGBD pe care se bazeaza sistemul) De§i performantele acestui tip de SQL nu ating nivelul SQL
incapsulat, el asigura totu§i programatorului de aplicatii un grad sporit
Caracteristic ODBC este faptul ca functiile sale nu sunt de flexibilitate, concretizat intr-o interfata de nivel apel (ODBC) §i
specifice furnizorului bazei de date §i, cu mici modificari, programul biblioteca bazei de date Sybase. Cand se utilizeaza ODBC, se
scris pentru a utiliza o baza de date Access poate utiliza §i o alta, completeaza o variabila cu instructiunea SQL a utilizatorului, dupa
numita Informix. care se apeleaza functia pentru transmiterea instructiunii SQL bazei de
Utilizarea SQL in programarea aplicatiilor date. Eventualele erori, precum §i rezultatele se returneaza
SQL-ul poate fi utilizat in doua moduri intr-un program aplicativ: programului prin folosirea altor apeluri de functii proiectate special
- SQL incapsulat; pentru asemenea scopuri.
- Interfata de nivel 'apeP pentru SQL. Rezultatele sunt returnate prin operada denumita Megarea
Primul standard utilizat pentru SQL a fost ANSI 1986, apoi variabilelor' (binding).
ANSI 1989, care defme§te trei tipuri de realizare a unei interfere SQL, Pentru a elucida problemele legate de limbajul SQL, vom
intr-un program de aplicatii, §i anume: trata, mai intai, regulile generale de sintaxa ale limbajului, precum §i
operatiile de regasire a datelor.
> Limbajul modular, presupune utilizarea de proceduri in
O alta parte importanta o vor reprezenta expresiile, conditiile
cadrul programelor, proceduri care pot fi apelate de §i operatorii utilizati de SQL.
programul de aplicatii §i care returneaza valori in program
Un capitol special va trata functiile SQL, apoi clauzele §i
prin transmitere de parametri; jonctiunile. SQL, fund dedicat interogarilor; ne vom ocupa de sub-
> SQL incapsulat, care folose§te instructiuni SQL I
interogari, pentru a ne opri apoi la instructiuni de manipulare a
incapsulate in codul program. Datorita acestui fapt apare datelor.
necesitatea utilizarii unui precompilator pentru procesarea
Un capitol distinct §i de o mare importanta il constituie crea-
instructiunilor SQL; rea §i intretinerea tabelelor, precum §i crearea view-urilor §i a indec§ilor.
48 49
In final, vom aborda cele mai importante probleme legate de > SELECT;
securitatea bazelor de date. > FROM;
> WHERE.
2.1. Notiuni de baza referitoare la SQL
O interogare SQL nu este neaparat o intrebare pusa bazei de 2.2. Blocurile componente ale operatiei de regasire a datelor:
date, ci, eel mai adesea, o comanda pentru executarea uneia dintre SELECT^ FROM
actiunilede maijos: SELECT <NUME DE COLOANA>
> sa construiasca sau sa §tearga o baza de date; Daca s-a introdus cuvantul SELECT in sistem, s-ar putea
> sa insereze, sa modifice sau sa §tearga linii sau campuri; intampla urmatorul lucru:
> sa caute in tabele o anumita informatie §i sa returneze
Comanda: SQL> SELECT;\:
rezultatele intr-o anumita ordine;
> sa modifice securitatea informatiilor;
SELECT
> o simpla interogare (intrebare).
ERROR at line 1:
Reguli de sintaxa pentru SQL
ORA-00936: missing expresion
Exemplu:
Semnul asterisc de dinaintea ultimei linii indica locul in care
SELECT NUME, PROD.J, PROD_2 Oracle? crede ca a avut loc eroarea. Expresia de raspuns va cere
FROM DEN clauza FROM:
WHERE NUME = 'IOANA';
In acest exemplu, toate cuvintele scrise cu litere mari ar putea FROM <TABEL>
fi scrise §i cu litere mici, astfel:
select nume, prod_l, prod_2 Impreuna, aceste doua instructiuni incep sa deblocheze lucrul
from den cu date.
where nume = 'loana'; Vom considera o baza de date MATERIALS ca model pe care
o vom folosi pentru urmatoarele cateve exemple. Folosim aceasta baza
De remarcat este faptul ca nu toate variantele de implementare de date pentru a ilustra functiile de baza ale cuvintelor cheie SELECT
a SQL diferentiaza literele mari de literele mici. De aceea, SELECT $i FROM.
sau select ar putea genera o eroare. Totu§i alinierea §i folosirea Baza de date model: MATERIALE
literelor mari fac ca instructiunile sa fie mai u§or de citit
Este important sa retinem semnul punct §i virgula (;) de la Nr. inreg Mat Cant
sfar§itul expresiei. Acest semn indica programului SQL in linie de 1 MAT1 10
comanda ca interogarea este terminata. Literele mari se folosesc 2 MAT 2 150
pentru comenzi ca de exemplu: 3 MATS 270
4 MAT 4 125
50 51
Comanda: SQL> SELECT * FROM MATERIALE;
Comanda: SELECT Mat, Cant, Nrjnreg
Nr. inreg Mat Cant FROM MATERIALE;
Rezultat: 1 MAT1 10 Selectarea coloanelor individuate
2 MAT 2 150 Daca selectam doar doua coloane, introducem de la tastatura
3 MATS 270 urmatoarea instructiune:
4 MAT 4 125 Comanda: SQL> SELECT Nrjni^g, Cant, FROM MATERIALE;
4 rows selected
Acest exemplu arata ca baza de date model. Semnul asterisc (*) Rezultat. Nrjnreg Cant
transmite bazei de date comanda de a returna toate coloanele asociate 1 10
cu tabelul dat descris in clauza FROM. Ele sunt returnate intr-o ordine 2 150
hotarata de baza de date. 3 270
Semnul punct §i virgula de la sfar§itul instrucjiunii informeaza 4 125
interpretorul ca s-a terminat de scris interogarea. Unele variante de 4 rows selected
implementare a SQL nu folosesc pe post de terminator semnul punct
§i virgula. De exemplu, Microsoft Query §i .produsul ISQL al firmei Acum sunt afi§ate coloanele cerute din tabel. Observati ca
Borland nu folosesc nici un semn terminator, deoarece interogarea s-au folosit literele mari §i mici in interogare. Acestea nu au nici un
este introdusa intr-o caseta de editare §i este executata atunci cand se efect asupra rezultatului.
apasa un buton. Produsul SQL*PLUS, al firmei Oracle, nu executa
interogarea pana cand nu gase§te un semn de punct ?i virgula. Selectarea altor tabele
Cand coloanele nu se afi§eaza in alta ordine, se introduce de la Sa presupunem ca dispunem de un tabel numit DEPOZITE cu
tastatura comanda: urmatoarea structura:
Numarul_depozitului Denumire Suma
Comanda: SQL> SELECT Mat, Cant, Nrjnreg FROM 1
MATERIALE; Depmat 150000
2 Depprod 295000
3 Depscule 2000000
Rezultat: Mat Cant Nrjnreg
MAT1 10 1 Vom schimba clauza FROM pentru tabelul dorit.
MAT 2 150 2
MATS 270 3 Comanda: SQL> SELECT * FROM DEPOZITE;
MAT 4 125 4
4 rows selected Rezultat: Numarul depozitului Denumire Suma
1 Depmat 150000
Numele de coloane sunt separate prin cate o virgula, cu un 2
spatiu dupa ultimul nume de coloana §i inainte de urmatoarea clauza Depprod 295000
3 Depscule 2000000
(in acest caz FROM). Instructiunea ar putea fi scrisa, de asemenea, 3 rows selected
astfel:
52
53
Facand o singura modificare, dispunem de o noua sursa de Conceptul de interogari selective in SQL se bazeaza pe ideea
date. submultimilor. O interogare selectiva returneaza o submultime de
Expresii date.
Expresia returneaza o valoare §i poate trata tipuri
diferite, cum ar fi §ir, numeric sau logic. De fapt, aproape orice Clauza WHERE
urmeaza o clauza (de exemplu, SELECT sau FROM) este o
expresie. Sintaxa clauzei WHERE este:

SELECT (Prenume +' '+Nume_de_familie) WHERE <condifie de cautare>


FROM CARTEJDEJTELEFON;
Impreuna cu SELECT si FROM, WHERE este cea mai
(Prenume +' '+Nume_de_familie) este o expresie care returneaza folosita clauza in SQL. Aceasta clauza face interogarile selective. Fara
numele complet din baza de date CARTEJDE_TELEFON. O clauza WHERE, eel mai util lucru pe care il putem face cu o
completare utila pentru aceasta interogare ar putea fi: interogare este sa afisam baza de date. De exemplu, folosind SELECT
si FROM, introducem comanda:
WHERE Nume_de_familie = 'Popescu '
Comanda: SQL> SELECT * FROM MATERIALS,
Rezultat: Va lista tabelul MATERIALS
Conditia Nume_de_familie = 'Popescu' este un exemplu de
expresie logica (Nume_de_familie = 'Popescu' va fi falsa sau
adevarata in funcfie de conditia =). Daca dorim un anumit material din tabelul MATERIALS,
putem introduce comanda:
Conditii
Comanda: SQL > SELECT *
Pentru a regasi un anumit element sau grup de elemente in
baza de date, sunt necesare una sau mai multe conditii. in exempluh FROM MATERIALS
anterior, conditia este: Nume_de_familie = 'Popescu '. WHERE Mat = 'MATT;
Daca problema cere sa gasim toate persoanele dintr-o firma
care au lucrat in ultima luna mai mult de 80 de ore, putem introduce Rezultat: Nrjnreg Mat Cant
conditia: Numarul_de_ore > 80. 1 MAT 1 10
1 row selected
Conditiile fac posibile interogarile selective. In cea mai
obi§nuita forma a lor, ele se compun dintr-o variabila, o constants §i
un operator de comparare. In primul exemplu variabila este
Nume_de_familie, constanta este Popescu §i operatorul de comparare 2.3. Operatori utilizati in SQL
este =. In al doilea exemplu, variabila este Numarul_de_ore, constanta Operator!i se impart in §ase grupe distincte: aritmetici, de
este 80 §i operatorul de comparare este >. comparare, caracter, logici, pentru multimi §i alti operatori.

54
55
Operator!! aritmetici
Daca se introduce comanda:
Operatorii aritmetici sunt plus (+), minus (-), imparfire (/),
inmultire (*) §i modulo (%). Primii patru sunt descri§i chiar prin Comanda:
numele lor. Ultimul, modulo, returneza restul intreg al unei impar|iri. SQL> SELECT Denumire, Pret_unitar,
De exemplu: Pref_unitar + 150
7 %3=2 FROM PREJ;
9 %3=0
Operatorul modulo nu accepta tipuri de date care conjin Aceasta comanda adauga 150 de unita^i monetare la fiecare
pref §i genereaza urmatorul rezultat:
zecimale, ca, de exemplu, tipul real sau number.
Daca se plaseaza cajiva operator) aritmetici intr-o expresie
fara paranteze, ei sunt tratafi in ordinea urmatoare: inmuljire, Rezultat: Denumire Pret_unitar Pref_unitar
impartire, modulo, adunare, apoi scadere. De exemplu, expresia: + 150
Mere 20000 20150
3*6+7/5 Portocale 17000 17150
va fi egala cu: 18 +1,4 = 19,4 Banane 30000 30150
Pere 15000 15150
Totu§i, expresia: 3 * (6 +7) / 5 Prune 10000 10150
vafiegalacu: 3 * 13/5 = 39/5 = 7,8 Struguri 25000 25150
Trebuie urmarit cu atentie unde sunt puse parantezele, SQL permite crearea unor coloane virtuale sau derivate prin
deoarece expresia face exact ce este scris in loc sa faca ce dore§te combinarea sau modificarea coloanelor existente, in cazul nostru
programatorul. coloana Pret_unitar +150.
Plus(+) Reintroducem comanda:
Semnul plus poate fi folosit in doua moduri diferite:
Comanda: SQL> SELECT * FROM PRET; are ca rezultat:
Comanda: SQL> SELECT * FROM PRET;
Pentru a afi§a tabelul PRET Denumire Pret_unitar
Mere 20000
Portocale 17000
Rezultat: Denumire Pret_unitar Banane 30000
Mere 20000 Pere
Portocale 17000 15000
Prune 10000
Banane 30000 Struguri
Pere 15000 25000
Prune 10000 6 rows selected
Struguri 25000 Aceasta interogare confirma ca datele originare nu au fost
6 rows selected modificate §i ca tabelul rezultat din interogarea anterioara nu este o
56
57
parte permanenta a bazei de date. Pret_unitar + 150 este un cap de In unele versiuni de implementare a SQL, semnul plus are §i
label neconcludent, §i atunci il modificam introducand comanda: functia suplimentara de operator caracter.
Comanda: SQL> SELECT Denumire, Pret_unitar, (Pret_unitar +
Minus (-)
150)Pret_modif
Minus are, de asemenea, doua moduri de folosire. Poate fi
FROM PRET;
folosit pentru schimbarea semnului unui numar. Sa consideram tabelul
Pentru a obtine: EXEMPLU:
Rezultat: Denumire Pret_unitar Pret_modif
Mere 20000 20150 SQL> SELECT * FROM EXEMPLU;
Portocale 17000 17150
Banane 30000 30150 Rezulta Stat Temp max Temp min
Pere 15000 15150 AA -20 110
Prune 10000 10150 AF 100 100
Struguri 25000 25150 BC 25 88
BD -60 201
6 rows selected BF -15 200
Astfel se pot crea noi coloane care se pot redenumi in timpul Putem manipula aceste date folosind comanda:
executiei. Redenumirea coloanelor se face folosind sintaxa:
<nume_coloana> alias. Unele versiuni de SQL folosesc sintaxa: SQL> SELECT Stat, -Temp_max Minime, -Temp_min
<nume_coloana = alias>. Exemplul precedent ar trebui scris astfel: Maxime
SQL> SELECT Denumire = Produs, Pret_unitar, Pret_unitar FROM EXEMPLU;
+ 150 = Pret_modif
FROM PRET; Stat Temp max Temp_min
Are ca efect: AA 20 -110
AF -100 -100
Produs Pret_unitar Pret_modif BC -25 -88
Mere 20000 20150 BD 60 -201
Portocale 17000 17150 BF 15 -200
Banane 30000 30150 5 rows selected
Pere 15000 15150 Se observa folosirea alias-urilor pentru corectarea datelor
Prune 10000 10150 introduse incorect.
Struguri 25000 25150 Celalalt mod vizibil de utilizare a semnului minus este
scaderea valorilor unei coloane. De exemplu:
6 rows selected

58 59
SQL> SELECT Stat, Temp_max Minime, Temp_min Putem vedea efectele unei vanzari la jumatate de pret,
Maxime, (Temp_min - Temp_max) Diferenta introducand comanda:
FROM EXEMPLU; SQL > SELECT Denumire, Pret_unitar, (Pret_unitar/2)
Pret_de_vanzare
Stat Temp_max Temp_min Diferen- FROM PRET;
ta
AA 20 -110 Denumire Pre{_unitar
AF -100 -100 Mere 10000
BC -25 Portocale 8500
BD 60 -201 Banane 15000
BF 15 -200 Pere 7500
5 rows selected Prune 5000
Struguri 12500
Prin folosirea eronata a semnului minus intr-un camp caracter
se obfine: 6 rows selected
SQL> SELECT -Stat FROM EXEMPLU; Inmultire (*)
Rezultatul este: ERROR: Operarorul de inmul^ire, este de asemenea simplu. Folosind
ORA-01722: invalid number tabela PRET, introducem comanda:
no row selected
Mesajul de eroare variaza in functie de implementarea SQL, SQL> SELECT * FROM PRET;
dar rezultatul este acela§i. Pref_unitar
Are ca rezultat: Denumire
Mere 20000
impartire (/) Portocale 17000
Semnul de impartire are un singur mod clar de folosire. Banane 30000
Utilizand tabela PRET din paginile anterioare, introducem comanda: Pere 15000
Prune 10000
SQL > SELECT * FROM PRET; 5 Struguri 25000
Denumire Pret_unitar 6 rows selected
Mere 20000
Portocale 17000 Urmatoarea interogare modifica tabelul PRET pentru a
Banane 30000 reflecta o cre§tere a valorilor din coloana Pret_unitar de doua ori:
Pere 15000
Prune 10000
Struguri 25000

60 61
SQL> SELECT Denumire, Pret unitar, Pret_unitar*2
Pret_nou Num Numit Rest mod
FROM Pret; 100 5 0
7 3 1
20 4 0
Denumire Pret unitar Pret nou 90 7 6
Mere 20000 40000 75 2 1
Portocale 17000 34000 125 5 0
Banane 30000 60000
Pere 15000 30000 Unele versiuni de implementare a SQL folosesc operatorul
Prune 10000 20000 modulo ca pe o func^ie, MOD. Instructiunea:
Struguri 25000 50000
6 rows selected SQL> SELECT Num, Numit, MOD (Num, Numit) Rest_mod
FROM REST;
Modulo (%)
Acest operator returneaza restul intreg al operatiei de va produce un rezultat identic cu eel dinainte.
impartire. Folosind tabelul REST, se introduce comanda:
Prioritatea operatorilor
SQL> SELECT * FROM REST; Pentru a determina prioritatea operatorilor aritmetici, folosim
Num Numit tabelul EX2 §i vom introduce comanda:
100 5
7 3 SQL> SELECT * FROM EX2;
20 4
90 7 El E2 E3
75 2 10 15 12
125 5 14 25 70
3 7 2
6 rows selected 3 rows selected
Daca vom utiliza comenzile:
La tabel se va adauga o coloana, numita Rest_mod, pentru a
se pastra valorile operatiei Num%Numit.
SQL> SELECT
2. E1+E2*E3
SQL> SELECT Num, Numit, Num%Numit Rest_jnod 3.(E1+E2)*E3
FROM REST; 4. E1+(E2*E3)
FROM EX2

62 63
o coloana numerica. Daca valoarea NULL era in coloana Denumire, ar
rezultatul va fi: fi fost imposibil de specificat diferenfa dintre NULL §i spatiu.
Vom incerca sa gasim valoarea NULL:
E1+E2*E3 (E1+E2)*E3 E1+(E2*E3)
300 300 190 SQL> SELECT*
2750 2750 1764 FROM PRET
20 20 17 WHERE Pret_unitar IS NULL;

Operator! de com parade Dupa executarea comenzii rezulta;


Dupa cum arata §i numele lor, operatorii de comparable Denumire Pre|_unitar
compara expresiile §i returneaza una din urmatoarele trei valori: Struguri
TRUE (adevarat), FALSE (fals), sau UNKNOWN (necunoscut).
Pentru a injelege nojiunea UNKNOWN (necunoscut), trebuie s-o Daca insa se folose§te semnul '=' vom avea:
asociem conceptului NULL (nul). in termenii folositi pentru baze de
date, NULL semnifica absenta datelor dintr-un camp. Nu inseamna ca SQL> SELECT*
o coloana contine o valoare zero sau un spatiu. Un zero sau un spajiu FROM PRET
sunt valori. NULL inseamna ca in campul respectiv nu se gase§te WHERE Pret_unitar = NULL;
nimic. Daca face|i o comparajie de genul camp = no §i camp este
NULL, comparajia va returna UNKOWN. In multe versiuni de SQL Vom avea ca rezultat: no rows selected.
este schimbat UNKOWN cu FALSE §i este asigurat un operator IS
NULL (este nul) pentru a testa conditia NULL. Nu s-a gasit nimic, deoarece comparatia Pret_unitar = NULL
Tabelul PRET a fost modificat pentru a avea o valoare NULL returneaza valoarea FALSE datorita faptului ca rezultatul este
in campul Pret_unitar pentru produsul struguri. Tabelul va arata astfel: necunoscut. Se poate utiliza §i valoarea IS NULL, inlocuind
instructiunea WHERE cu WHERE Pret_unitar IS NULL, in acest caz
SQL> SELECT * FROM PRET; vom primi ca raspuns al comenzii toate liniile in care exista o valoare
Denumire Pret_unitar NULL 1 .
Mere . 20000
Portocale 17000 Egal(=)
Banane 30000 In exemplul anterior s-a observat unul din modurile posibile
Pere 15000 de utilizare a semnului egal. S-a observat ca unele versiuni de
Prune 10000 implementare a SQL au folosit semnul '=' in clauza SELECT pentru
Struguri atribuirea unor alias-uri. In clauza WHERE semnul = este eel mai
utilizat operator de comparare, care, folosit singur, devine un mod
6 rows selected facil de selectare a unei valori din mai multe existente.
Se observa ca nu este tiparit nimic in campul cu valoarea
NULL. Este o observatie demna de retinut in acest caz, deoarece este 1 Perkins J., Bryan M., SQL far a profes or in 14 zile, Editura Teora,
Bucure§ti, 1998.
64 65
SQL> SELECT * FROM AGENDA; Nume Prenume NrTel Varsta
GEORGESCU ANDREI 7781122 35
Nume Prenume NrTel Varsta
VASILE OCTAVIAN 2313277 45
MARINESCU BOGDAN 6332421 22
POP RADU 7732512 25 FLORIN OPREA 2303179 29
GEORGESCU ANDREI 7781122 35
VASILE OCTAVIAN 2313277 45
FLORIN OPREA 2303179 29 Cu aceasta modificare sunt listate inregistrarile care respecta
conditia Varsta mai mare sau egala cu 29.
Vom cauta linia OPREA utilizand comanda:
Mai mic decat (<) si Mai mic sau egal (<=)
Acesti operatori de comparare actioneaza in acelasi mod, dar
SQL> SELECT*
in sens invers.
FROM AGENDA
WHERE Prenume = 'OPREA ';
SQL> SELECT*
FROM AGENDA
Nume Prenume NrTel Varsta WHERE Varsta <'29';
FLORIN OPREA 2303179 29
Nume Prenume NrTel Varsta
Mai mare decat (>) si Mai mare sau egal (>=) MARINESCU BOGDAN 6332421 22
Operatorul mai mare decat (>) actioneaza in felul urmator: POP RADU 7732512 25

SQL> SELECT*
FROM AGENDA SQL> SELECT*
WHERE Varsta > '29'; FROM AGENDA
WHERE Varsta <='29';
Nume Prenume NrTel Varsta
GEORGESCU ANDREI 7781122 35 Nume Prenume NrTel Varsta
MARINESCU BOGDAN 6332421 22
VASILE OCTAVIAN 2313277 45 POP RADU 7732512 25
FLORIN OPREA 2303179 29
SQL> SELECT*
FROM AGENDA
WHERE Varsta > = '29';
66 67
Inegalitati (<> sau !=)
Pentru excluderea anumitor date dintr-un tabel se folose§te 2.3.1. Operatori caracter
simbolul de inegalitate, care poate fi <> sau !=, in functie de versiunea
de SQL implementata. Pentru a gasi toate persoanele care nu au In afara operatorilor amintiji anterior exista §i operator!
caracter, dintre care vom aprofunda: LIKE, UNDERSCORE,
Prenumele ANDREI, se scrie comanda: Concatenarea.
SQL> SELECT*
LIKE presupune a gasi intr-o baza de date acele inregistrari
FROM AGENDA
care nu corespund in totalitate unui model.
WHERE Prenume <> 'ANDREI';
Forma sa este urmatoarea:
SQL> SELECT*
Prenume NrTel Varsta FROM nume baza de date
Nume
WHERE nume-camp LIKE expresie;
MARINESCU BOGDAN 6332421 22
POP RADU 7732512 25 De multe ori, in expresia care urmeaza dupa LIKE apare
VASILE OCTAVIAN 2313277 45 semnul de modulo (%), care are rolul de caracter de inlocuire.
FLORIN OPREA .2303179 29 Exemplu:
SQL> SELECT*
FROM AGENDA
Pentru a gasi toate persoanele care nu au numele VASILE se WHERE Nume LIKE 'G%';
introduce comanda
Nume Prenume NrTel Varsta
SQL> SELECT *
GEORGESCU ANDREI 7781122 35
FROM AGENDA
WHERE Nume != 'VASILE';
Executia acestei comenzi are ca efect aparitia acelor
Nume Prenume NrTel Varsta inregistrari in care Numele incepe cu litera G. De remarcar ca LIKE
BOGDAN 6332421 22 diferentiaza literele mari de literele mici.
MARINESCU
POP RADU 7732512 25
GEORGESCU ANDREI 7781122 35 UNDERSCORE. Este un caracter de inlocuire doar pentru un
FLORIN OPREA 2303179 29 singur caracter. Pentru tabelul AGENDA creat anterior vom
exemplifica acest operator:
Se observa ca s-au utilizat atat simbolul o, cat §i simbolul !=
obtinandu-se practic acela§i rezultat.

68 69
SQL> SELECT*
FROM AGENDA
WHERE Nume LIKE 'POJ; 2.3.2. Operatori logici
Operatorii logici sunt urmatorii: AND, OR, NOT.
Nume Prenume NrTel Varsta Operatorul AND utilizat intre doua expresii presupune ca ambele sa
POP RADU 7732512 25 fie adevarate pentru ca acestea sa returneze valoarea de adevar TRUE.
Daca oricare dintre expresii este falsa, AND va returna valoarea
intr-o instruetiune SELECT pot aparea mai multe semne FALSE.
underscore. Exemplu: pentru un tabel ANGAJATI trebuie sa vedem daca sunt
De asemenea, se poate regasi o inregistrare sau mai multe salariati cu vechime mai mare de 10 ani care, §i-au luat mai mult de 20
dupa un caracter situat oriunde in §irul de caractere. de zile libere.
Exemplu:
SQL> SELECT*
SQL> SELECT* FROM ANGAJATI;
FROM AGENDA
WHERE Nume LIKE '_OJ; Nume Prenume Adresa Vechime Zflejibere
Ceea ce are ca efect gasirea tuturor inregistrarilor care au MARINESCU BOGDAN BUCURESTI 5 17
litera O ca al doilea caracter al numelui. POP RADU ORADEA 11 6
GEORGESCU ANDREI TIMI§OARA 20 25
Concatenarea presupune reunirea a doua sau mai multe §iruri VASILE OCTAVIAN BUCURE§TI 15 10
de caractere. Pentru concatenare se folose§te simbolul // sau +. Vom
lua un exemplu tot pe tabelul creat anterior AGENDA.
SQL> SELECT FROM ANGAJATI
SQL> SELECT Nume // Prenume Nume_Complet WHERE Vechime >=10
FROM AGENDA; AND ZileJibere >20;

Rezultatul va fi: Nume Prenume Adresa Vechime Zile_libere


Nume_Complet GEORGESCU ANDREI TIMI§OARA 20 25
MARINESCU BOGDAN
POPRADU
GEORGESCU ANDREI Operatorul OR
VASILE OCTAVIAN Este utilizat pentru insumarea unei serii de conditii. Cand eel
FLORIN OPREA putin una dintre conditii este adevarata, OR returneaza valoarea
Nu toate versiunile de SQL admit semnul '+' pentru TRUE.
concatenare. Folosind acela§i exemplu de mai sus, se dore§te lista cu
salariati care au vechime mai mare de 10 ani sau salariati care §i-au
luat mai mult de 20 de zile de libere. Instructiunea este urmatoarea:
70
71
SQL> SELECT*
FROM STUD;
SQL> SELECT FROM ANGAJATI Nume
WHERE Vechime >=10 lonescu
ORZileJibere>20; Sima
Pavel
Nume Prenume Adresa Vechime Pop
POP RADU ORADEA 11 Ilie
GEORGESCU ANDREI TIM§OARA 20 Stan
VASILE OCTAVIAN BUCURE§TI 15 State
7 rows selected
Operatorui NOT
In cazul aplicarii unei condijii care are valoarea TRUE, SQL> SELECT*
operatorul NOT o va schimba in FALSE. In situa^ia in care conditia FROM STUD2;
care urmeaza operatorului NOT are valoarea FALSE, ea va deveni Nume
TRUE. Pentru a selecta din tabelul AGENDA persoanele ce au lonescu
prenume care nu incep cu litera A, putem scrie instruc$iunea: Sima
Pavel
SQL> SELECT* Georgescu
Petrescu
FROM AGENDA Stan
WHERE Prenume NOT LIKE 'A'; State
7 rows selected
Nume Prenume NrTel Se determina studentii care au nume diferite in cele doua serii:
MARINESCU BOGDAN 6332421
SQL> SELECT Nume FROM STUD
POP RADU 7732512 UNION
VASILE OCTAVIAN 2313277 SELECT Nume FROM STUD2;
FLORIN OPREA 2303179
Nume
lonescu
2.3.3. Operatoripentru multimi Sima
Pavel
UNION §i UNION ALL
Georgescu
UNION returneaza rezultatele a doua interogari, mai putin Petrescu
Pop
liniile duplicate. Urmatoarele doua tabele reprezinta listele studentilor Ilie
din doua serii: Stan
State
9 rows selected
72 73
Nume
Georgescu
INTERSECT Petrescu
Operatorul INTERSECT (intersectie) returneaza numai liniile
comune gasite in arnbele interogari. Pentru a arata lista studentilor 2 rows selected
care fac parte din ambele grupe, se introduce comanda:
Alti operatori, IN §i BETWEEN
Cei doi operatori IN (in) §i BETWEEN asigura folosirea unei
SQL> SELECT Nume FROM STUD
forme scurte pentru funcjii diverse.
INTERSECT
SELECT Nume FROM STUD2; SQL> SELECT *
FROM AGENDA
Nume WHERE Nume = 'POP'
lonescu OR
Sima Nume = 'VASILE'
Pavel OR
Stan Nume ='FLORIN';
State
Nume Prenume NrTel VSrsta
5 rows selected
POP RADU 7732512 25
VASILE OCTAVIAN 2313277 45
MINUS
Minus (cea de diferen^a) returneaza liniile din prima FLORIN OPREA 2303179 29
interogare care nu fac parte din a doua interogare. 3 rows selected
Are acelasi efect comanda:
SQL> SELECT Nume FROM STUD
MINUS SQL> SELECT*
SELECT Nume FROM STUD2; FROM AGENDA
WHERE Nume IN ('POP', 'VASILE', 'FLORIN');
Nume
Pop BETWEEN
Hie Daca dorim un anumit grup de inregistrari din tabelul PRET,
2 rows selected putem introduce comanda:
Aceasta interogare afi§eaza studentii care nu fac parte din SQL> SELECT *
prima interogare: FROM PRET
WHERE Pret_unitar > 15000
SQL> SELECT Nume FROM STUD2 AND
MINUS Pret_unitar < 30000;
SELECT Nume FROM STUD; 75
74
2.4.1. Functii pentru calculul totalurilor
Denumire Pref_unitar
20000 Aceste functii se mai numesc functii de grup. Ele returneaza o
Mere
valoare bazata pe valorile unei coloane.
Portocale 17000
Se considers tabelul STUDENTI
Banane 30000
Struguri 25000
SQL> SELECT*
4 rows selected FROM STUDENTI;
Folosind BETWEEN se poate scrie:
CodStud Nume An Grupa Media
SQL> SELECT* 32 Ion Die 1 109 7.25
FROM PRET 67 Popa Vlad 1 109 8.20
WHERE Pret_unitar BETWEEN 15000 AND 30000; 65 Pop luliu 1 109 9.15
87 Alexandra Ion 1 109 8.14
Rezultatul va fi ca §i eel anterior. 77 Popescu Dana 1 109 6.17
52 Sima Victor 1 109 7.90
2AFunetiiiiiSQL 100 Marcut Marius 1 109 9.95
Caracteristicile generale ale functiilor 7 rows selected
Functiile din SQL permit executarea calculului sumei pe o
coloana sau conversia tuturor caracterelor unui §ir in litere mari. Ele se COUNT
clasifica in: Functia COUNT returneaza numarul de linii care respecta
conditia din clauza WHERE. Presupunem ca dorim sa cunoastem cati
> Functii pentru calculul totalurilor. student! au avut media sub 8.50. Se introduce comanda:
> Functii pentru data calendaristica §i ora.
> Functii aritmetice. SQL> SELECT COUNT(*)
> Functii caracter. FROM STUDENTI
> Functii de conversie. WHERE Media < 8.50;
> Functii diverse.
Aceste functii dezvolta capacitatea de manipulare a CodStud Nume An Grupa Media
informatiilor regasite pe baza functiilor de baza ale SQL. Primele cinci 32 Ion Eie 1 109 7.25
functii, COUNT, SUM, AVG, MAX §i MIN, sunt functii pentru 67 Popa Vlad 1 109 8.20
calculul totalurilor §i sunt definite in standardul ANSI. Majoritatea 87 Alexandra Ion 1 109 8.14
versiunilor implementate in SQL au extins aceste functii pentru a 77 Popescu Dana 1 109 6.17
ingloba §i restul functiilor1. 52 Sima Victor 1 109 7.90
5 rows selected

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


76 77
Pentru a face expresia mai u§or de injeles, putem utiliza un Pentru a obtine mai multe sume in aceea§i instructiune,
alias: formatul general este:

SQL> SELECT COUNT(*) Medie_ceruta SQL> SELECT SUM (nume_variabilal) nume_var_sum 1,


FROM STUDENTI [SUM (nume_variabila2) nume var_sum2 ]
WHERE Media < 8.50 Medie_ceruta; FROM nume_tabel;

Acela§i lucru se ob{ine inlocuind semnul * cu numele unei Functia SUM are efect numai asupra campurilor numerice.
coloane. Daca ea este utilizata pentru un camp afanumeric se obtine:
SQL> SELECT COUNT( Media) Medie_ceruta
FROM STUDENTI SQL> SELECT SUM (Nume)
WHERE Media < 8.50 Medie_ceruta; FROM STUDENTI;
ERROR:
Daca se utilizeaza functia COUNT fira clauza WHERE, ca in ORA- 01722: invalid number
exemplul urmator: No rows selected
SQL> SELECT COUNT(*) Este normal, deoarece suma unui grup de nume nu are sens.
FROM STUDENTI;
AVG
COUNT(*) Aceasta functie calculeaza valoarea medie a unei coloane.
Este destinata calculului mediei aritmetice. Pentru a calcula media pe
grupa, vom scrie instructiunea:
functia va returna numarul inregistrarilor din tabel.
SQL> SELECT AVG (Media) Media_gr
SUM FROM STUDENTI:
Functia SUM returneaza suma tuturor valorilor dintr-o
coloana. MAX
Pentru tabelul PRET, daca vrem sa calculam suma Aceasta functie returneaza valoarea maxima dintr-un §ir de
preturilor/Kg pentru produsele date, vom scrie: numere (o coloana a tabelului).

SQL> SELECT SUM (Pret_unitar) Total Exemplu:


FROM PREJ; SQL> SELECT MAX (Media)
FROM STUDENTI;
Total
117000 MAX (Media)

9.95
78 79
Daca scriem: returneaza numele care are caracterul de inceput eel mai
SQL> SELECT Nume apropiat de inceputul alfabetului. Aceasta func^ie poate fi folosita in
FROM STUDENTI combinatie cu functia MAX pentru a obtine un interval de valori.
WHERE Media = MAX (Media);
SQL> SELECT MIN (Media), MAX (Media)
ERROR at line : FROM STUDENJI;
ORA-00934: group function is not allowed here
MIN (Media) MAX(Media)
SQL avertizeaza utilizarea incorecta a functiei MAX.
6.17 9.95
Ce se intampla daca utilizam aceea§i operate asupra unei
coloane ne-numerice? Acest mod de sortare a informalilor poate fi folositor cand se
utilizeaza functii statistice.
SQL> SELECT MAX (Nume) Functiile descrise anterior sunt caracteristice standardului
FROM STUDENTI; ANSI. Vom analiza, in continuare, func{ii care au devenit standarde
de facto, fiind prezente in toate versiunile importante de SQL.
Functia MAX returneaza eel mai mare §ir de caractere (care
este eel mai apropiat de litera Z) §i, ca atare, deducem ca MAX este o VARIANCE
functie care lucreaza atat cu caractere, cat §i cu numere. Aceasta functie are ca rezultat dispersia, adica patratul unei
deviatii standard.
MIN
MIN opereaza in acela§i mod ca MAX, cu exceptia faptului ca SQL> SELECT VARIANCE (Media)
returneaza cea mai mica valoare dintr-o coloana. Daca se dore§te FROM STUDENTI;
aflarea celei mai mici medii din grupa se va scrie instructiunea:
Daca se aplica unui §ir de caractere:
SQL> SELECT MDSf (Media)
FROM STUDENJI;
SQL> SELECT VARIANCE (Nume)
MIN (Media) FROM STUDENTI;

6.17 ERROR:
ORA- 01722: invalid number
Instructiunea: SQL> SELECT MIN (Nume) No rows selected
FROM STUDENTI;
functia VARIANCE va semnala eroare, deoarece opereaza
numai cu numere, sau cu variabile de tip numeric.

80 81
STDDEV
Ultima functie de grup analizata, STDDEV, calculeaza Tip__proiect Data_inceput Data_sfar§it
abaterea sau deviatia standard a unei coloane de numere (sau variabile Organizare l-Apr-99 10-Apr-99
numerice), a§a cum este demonstrat in exemplul urmator: Fundatie 12-Apr-99 14-Iun-99
Structura 15-Iun-99 19-Aug-99
SQL> SELECT STDDEV (Media) Zidarie 20-Aug-99 24-Sept-99
FROM STUDENT!; Acoperi? 25-Sept-99 9-Dec-99
Amenajari 10-Dec-99 31-Dec-99
Cand prime§te ca argument un §ir, func^ia returneaza eroare. 6 rows selected

SQL> SELECT STDDEV (Nume) ADD^MONTHS (Adauga luni)


FROM STUDENJI;
Aceasta functie adauga un numar de luni la o data
ERROR: calendaristica specificata. De exemplu, sa consideram ca a intervenit o
ORA- 01722: invalid number intarziere in project §i proiectul a fost decalat cu o luna. Realizam un
No rows selected tabel introducand comanda:

Aceste functii totalizatoare pot fi folosite in combinatie unele SQL> SELECT Tip_proiect,
cu altele: Data__inceput,
Data_sfar§it Data_sfDep,
SQL> SELECT COUNT (*) ADD_MONTHS (Data_sfar?it, 2),
AVG (Media) FROM PROIECT;
MIN (Media)
MAX (Media) Tip_proiect Data_inceput Data__sfDep
STDDEV (Media) Organizare l-Apr-99 10-Mai-99
VARIANCE (Media) Fundatie 12-Apr-99 14-M-99
FROM STUDENTI; Structura 15-Iun-99 19-Sept-99
Zidarie 20-Aug-99 24-Oct-99
2.4.2.Funcfii dedicate pentru data calendaristica §i ora Acoperi§ 25-Sept-99 9-Ian-OO
Marea majoritate a implementarilor SQL au functii care Amenajari 10-Dec-99 31-Ian-OO
6 rows selected
permit conceptul de data calendaristica §i ora. Se va folosi tabelul
PROIECT pentru a exemplifica modul de lucru cu aceste functii.
Functia ADD_MONTHS opereaza, de asemenea, §i in afara
clauzei select. Introducand comanda:
SQL> SELECT *
FROM PROIECT;

82 83
SQL> SELECT Tip_proiect PMTREI__Luni SQL> SELECT Tip_proiect, Datajnceput, Data_sfar§it,
FROM PROJECT MONTHS_BETWEEN(Data_inceput, Data_sfar§it)
WHERE ADDJMONTHS (Datajnceput, 3)> Diferenta
Data_sfar§it; FROM PROJECT;

Tip_proiect NEWJHME (Ora noua)


Organizare Daca se dore§te a se corecta ora in functie de ora unui anumit
Fundatie teritoriu, se va utiliza functia NEW_TIME. Mai jos este prezentata
Structura lista cu fusele orare care se pot utiliza cu aceasta functie:
Zidarie
Abreviere Fus Orar
Functia opereaza cu tipuri de data caracter sau numeric, AST sau ADT Atlantic Standard sau Daylight Time (ora de
insotita de o pereche de functii ajutatoare, TO CHAR ?i TO DATE. vara)
BST sau BDT Bering Standard sau Daylight Time (ora de
LAST_DAY . , vara)
Aceasa functie intoarce ca rezultat ultima zi a unei lum CST sau CDT Central Stendard sau Daylight Time (ora de
specificate. De exemplu, daca se dore?te aflarea ultimei zile a lunii din vara)
coloana Data_sfar§it, introducem comanda: EST sau EDT Eastern Standard sau Daylight Time (ora de
vara)
SQL> SELECT Data_sfar§it, Last_Day (Data_sfar?it), GMT Greenwich Mean Time sau Daylight Time (ora
FROM PROECT; de vara)
HST sau HDT Alaska Hawaii Standard sau Daylight Time (ora
de vara)
Data_sfar$it Last_Day (Data__sfar§it)
MST sau MDT Mountain Standard sau Daylight Time (ora de
10-Apr-99 30-Apr
vara)
14-Iun-99 30-Iun
NST Newfoundland Standard Time sau Daylight
19-Aug-99 31-Aug
Time (ora de vara)
24-Sept-99 30-Sept
31-Dec PST sau PDT Pacific Standard sau Daylight Time (ora de
9-Dec-99 vara)
31-Dec-99 31-Dec
YST sau YDT Yukon Standard sau Daylight Time (ora de
6 rows selected
vara)

MONTHS_BETWEEN (Lunile dintre)


Pentru a afla cate luni sunt intre luna x $i luna y, se poate.
folosi functia MONTHS_BETWEEN astfel:
85
84
Ora se poate modifica astfel: SYSDATE
Functia SYSDATE (data si ora calendaristica a sistemului)
SQL> SELECT Data_sfarsit EOT returneaza data si ora calendaristica a sistemului.
NEW_TIME (Data_sfarsit, 'EDT', 'PDT')
FROM PROJECT; SQL> SELECT DISTINCT SYSDATE
FROM PROffiCT;
Data_sfar§it NEW_TIME(Data_sfar$it)
Ol-Apr-99 31-Mar 09PM Daca se cere o anumita analiza a stadiului unui project se
Ol-Mai-99 30-Apr09PM introduce comanda:
30-Mai-99 29-Mai 09 PM
24-Iun-99 29-Iun 09 PM SQL> SELECT *
9-Sept-99 01-Sept 09 PM FROM PROffiCT
31-Ian-99 16-Ian 09 PM WHERE Data_de_inceput > SYSDATE;
6 rows selected
2.4.3. Funcfii aritmetice
Toate orele sunt acum transfejate in noul fus orar s.i datele
calendaristice sunt modificate corespunzator. Majoritatea versiunilor de SQL furnizeaza functii aritmetice
similare cu cele prezentate in aceasta secfiune. Pentru exemplele care
NEXT_DAY urmeaza vom folosi tabelul EXNUM.
Functia NEXT_DAY gaseste numele primei zile din
saptamana egala sau ulterioara unei date calendaristice specificate. Sa SQL> SELECT*
presupunem ca trebuie sa trimitem o situate in prima zi de vineri care FROM EXNUM;
urmeaza unui eveniment. Pentru aceasta introducem comanda:
A B
SQL> SELECT Datajnceput, 3.22 5
NEXT_DAY (Datajnceput, 'Friday') -10 0.202
FROM PROffiCT; 7 9
care va avea rezultatul: -44.253 32
14 54
Data_inceput Data_sfDep -9 6.1
Ol-Apr-99 07-Apr-99 6 rows selected
02-Apr-99 07-Mai-99
15-Mai-99 19-Mai-99
Ol-Iun-99 02-Iun-99
25-Iul-99 07-Sept-99
10-Sept-99 08-Ian-OO

86 87
ABS si:
Functia ABS returneaza valoarea absoluta a unui numar SQL> SELECT A, FLOOR (A) Lim_inf
indicat, ca in exemplul urmator: FROM EXNUM;

SQL> SELECT ABS (A) Val_abs A Lim_inf


FROM EXNUM; 3.22 4
-10 1
Val.abs 7 9
3.22 -44.253 32
10 14 54
7 -9 9
44.253 6 rows selected
14
9 COS, COSH, SIN, SINH, TAN, TANK
6 rows selected Funcjiile COS, SIN, TAN ofera baza pentru numeroase
operatii trigonometrice. Func{iile COSH, SINH, TANH returneaza
Aceasta functie transform^ toate numerele negative in numere valorile hiperbolice ale argumentelor primite ca parametri. Toate
pozitive si lasa numerele pozitive neschimbate. aceste funcfii opereaza presupunand ca argumentul de intrare A are
valoarea in radiani. De exemplu, instrucfiunea:
CEIL ?i FLOOR
Prima dintre aceste funcfii, CEIL, returneaza eel mai mic SQL> SELECT A, COS (A)
numar intreg care este mai mare sau egal cu un argument dat. A doua, FROM EXNUM;
FLOOR, face exact operatia inversa, returnand eel mai mare numar
intreg care este egal sau mai mic cu un argument dat. De exemplu: Deoarece 360 de grade = 2 n radiani, instructiunea se mai
scne:
SQL> SELECT B, CEIL (B) Lim_sup
FROM EXNUM; SQL> SELECT A, COS (A*0.01745329251994)
FROM EXNUM;
B Lim_sup
5 5 Functiile trigonometrice opereaza dupa cum urmeaza:
0.202 1
9 9 SQL> SELECT A, COS (A*0.017453),
32 32 COSH (A*0.17453)
54 54 FROM EXNUM;
6.1 7
6 rows selected

88 89
SQL> SELECT A, SIN (A*0.017453), returnand logaritmul primului argument calculat in baza celui de-al
SINK (A* 0.017453) doilea argument.
FROM EXNUM;
SQL> SELECT B, LOG (B, 10)
FROM EXNUM;
SQL> SELECT A, TAN (A*0.017453),
TANH (A* 0.017453) returneaza logaritmii valorilor din coloana B calculati in baza
FROM EXNUM; 10.

EXP MOD
Pentru a ridica o constanta V la o putere se utilizeaza functia Standardul ANSI pentru operatorul modulo, %, este
EXP. Introducand instructiunea: implementat uneori ca functia MOD. Interogarea:

SQL> SELECT A, EXP (A) SQL> SELECT A, B, MOD (A, B)


FROM EXNUM; FROMEXNUM1;

constanta e este ridicata la puterile date de valorile din A B MOD (A,B)


coloana A a tabelei EXNUM. 3.25 5 3.25
-10 .202 1.92
LN §i LOG 7 3 1
Aceste doua functii se refera la logaritmi. Prima, LN, 9 4 1
returneaza logaritmul natural al argumentului primit ca valoare de 4 rows selected
intrare. Se introduce instructiunea:
returneaza un label care afiseaza restul impartirii lui A la B.
SQL> SELECT A, LN (A)
FROM EXNUM; POWER
Pentru a ridica un numar la putere, se utilizeaza func{ia
ERROR: POWER. In aceasta functie, primul argument este ridicat la puterea
ORA- 01428: argument '-10' is out of range, deoarece exprimata prin al doilea argument.
argumentul trebuie sa fie pozitiv.
Ca atare, instructiunea se va scrie SQL> SELECT A, B, POWER (A, B)
FROM EXNUM 1;
SQL> SELECT A, LN (ABS(A))
FROM EXNUM;
ERROR:
Se observa incapsularea functiei ABS in interiorul apelului ORA - 01428: argument '-10' is out of range
functiei LN. Cealalta functie logaritmica, LOG, preia doua argumente,
90 91
La prima vedere, s-ar parea ca primul argument nu poate avea
valori negative. Dar acest lucru este adevarat, deoarece un numar, cum A
ar fi -10, poate fi ridicat la o putere, ceea ce inseamna ca in aceasta 3.25
func^ie, daca primul argument este negativ, al doilea trebuie sa fie 7
intreg. Se poate indeplini aceasta condijie prin folosirea functiei CEIL 14
sau FLOOR: 3 rows selected

SQL> SELECT A, CEIL (B), POWER (A, CEIL(B)) SQRT


FROMEXNUM1; Functia SQRT returneaza radacina patrata a argumentului
primit. Deoarece radacina patrata a unui numar negativ nu este
SIGN definita, nu putem folosi aceasta func{ie pentru numere negative.
Functia SIGN returneaza valoarea -1 daca argumentul primit
este mai mic decat 0, 0 daca argumentul primit este egal cu 0 si 1 daca
argumentul sau este mai mare decat 0, asa cum se arata in exemplul SQL> SELECT A, SQRT (A)
urmator: FROM EXNUM2;

SQL> SELECT A, SIGN A, ERROR:


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

A SIGN (A) Rezolvam aceasta eroare prin folosirea functiei ABS:


3.25 1
-10 -1 SQL> SELECT A, SQRT (ABS (A))
7 1 FROM EXNUM2;
-44.253 -1
14 1 2.4.4. Funcfii caracter
0 0 O parte din versiunile de SQL pun la dispozitie functii pentru
6 rows selected manipularea caracterelor si a sirurilor de caractere. Pentru
exemplificare vom face referire la tabelul STUDENTI:
De asemenea, se poate utiliza funcjia SIGN intr-o clauza
SELECT WHERE, ca in exemplul urmator:
SQL> SELECT * FROM STUDENT!;
SQL> SELECT A,
FROM EXNUM2 CodStud Nume An Grupa Media
WHERE SIGN (A) =1; 32 Ion Die 1 109 7.25
67 Popa Vlad 1 109 8.20
65 Pop luliu 1 109 9.15
92 93
1 109 8.14
87 Alexandra Ion 6.17 Nume si Prenume de Familie
77 Popescu Dana 1 109
1 109 7.90 MARINESCU BOGDAN
52 Sima Victor
1 109 9.95 POP RADU
100 MarcuJ Marius
7 rows selected GEORGESCU ANDREI
VASILE OCTAVIAN
FLORIN OPREA
CHR
Functia CHR returneaza caracterul echivalent cu numarul
folosit ca argument. Caracterul este returnat in functie de setul de 5 rows selected
caractere din numele campului care apartine bazei de date. Pentru
acest exemplu, campul din baza de date este stabilit in codul ASCII. De retinut din exemplul anterior este faptul ca s-au folosit
Coloana CodStud include numerele: ghilimelele pentru a delimita expresia 'Nume §i Prenume de Familie',
$i ca, in al doilea rand, chiar daca tabelul arata ca doua coloane
SQL> SELECT CodStud, CHR (CodStud) distincte, ceea ce este afi§at nu este decat o coloana.
FROM STUDENTI;
INITCAP
CodStud CHR (CodStud) Aceasta functie conflgureaza un cuvant astfel: prima litera din
32 cuvant este litera mare, iar toate celelalte sunt caractere mici.
67 C
65 A SQL> SELECT Nume Vechi, INIT (Nume) Nou
87 W FROMAGENDA;
77 M
52 4 Vechi Nou
100 D
MARINESCU Marinescu
7 rows selected Pop
POP
GEORGESCU Georgescu
Spajiul aparut pe linia lui 32 indica faptul ca acesta este codul
VASILE Vasile
spajiului in setul de caractere ASCII. FLORIN Florin

CONCAT 5 rows selected


Func^ia CONCAT este echivalenta semnului //. Vom folosi
tabelul AGENDA:
SQL> SELECT CONCAT (Nume, Prenume) 'Nume §i
Prenume de Familie'
FROM AGENDA;
95
94
LOWER ?i UPPER LPAD §i RPAD
LOWER modifica toate caracterele in litere mici, iar UPPER
realizeaza operatia inversa. Folosind functia UPDATE, vom Aceste doua functii primesc minim doua §i maxim trei
transforma una din valori in caractere mici: argumente. Primul este §irul de caractere cu care trebuie sa opereze.
Al doilea argument este caracterul de umplere al spatiilor adaugate. Al
treilea argument are ca valoare prestabilita spatiu sau poate fi un
SQL> UPDATE AGENDA singur caracter sau un §ir de caractere. Daca introducem instructiunea:
SET Nume = 'marinescu'
WHERE Nume = 'MARINESCU'; SQL> SELECT Nume, LPAD (Nume, 20, '*')
FROM AGENDA;
1 row updated
Utilizand aceasta functie, cele 20 de caractere nu vor fi numai
SQL> SELECT Nume '*' ci §i caracterele care formeaza campul Nume.
FROM AGENDA;
SQL> SELECT Nume, RPAD (Nume, 20,' *')
FROM AGENDA;
Nume
marinescu LTRIM §i RTRIM
POP Aceste functii primesc unul sau doua argumente. Primul
GEORGESCU argument este un §ir de caractere. Al doilea argument optional este un
VASILE caracter sau un ?ir de caractere sau are valoarea prestabilita spatiu.
FLORIN Daca pentru al doilea argument se utilizeaza o valoare diferita de
5 rows selected spatiu, aceste functii de aliniere vor alinia respectivul caracter in
acela§i mod in care aliniaza §i spatiile.
Putem scrie urmatoarea comanda:
SQL> SELECT Nume, RTRIM (Nume)
SQL> SELECT Nume, UPPER (Nume), LOWER (Nume) FROM AGENDA;
FROM AGENDA;
Pentru aliniere se poate scrie instructiunea:
Nume UPPER (Nume) LOWER (Nume)
marinescu MARINESCU marinescu SQL> SELECT Nume, RPAD (RTRIM (Nume), 20,'*')
POP pop FROM AGENDA;
POP
GEORGESCU GEORGESCU georgescu
VASILE vasile Folosirea functiei LTRIM:
VASILE
FLORIN FLORIN florin
5 rows selected SQL> SELECT Nume, LTRIM (Nume, 'P')
FROM AGENDA;
96 97
LTRIM (Nume)
Nume
Nume Modific
MARINESCU MARINESCU
POP OP MARINESCU MARINESCU
GEORGESCU GEORGESCU POP POP
VASILE VASILE GEORGESCU GEORGESCU
FLORIN FLORIN VASILE **SILE
5 rows selected FLORIN FLORIN
5 rows selected
REPLACE
Functia REPLACE executa operatiuni de Tnlocuire. Din cele Daca al doilea argument are valoarea NULL, sirul destinatie
trei argumente ale sale, primul este sjrul care trebuie cautat. Al doilea nu este modificat.
argument este cheia de cautare. Ultimul argument este sirul optional Exemplu:
de inlocuire. Daca al treilea argument lipseste sau este NULL, toate
SQL> SELECT Nume, REPLACE (Nume, NULL) Mdfi
secventele identice cu cheia de cautare din sirul respectiv sunt
FROM AGENDA;
eliminate si nu sunt Tnlocuite cu nimic.

SQL> SELECT Nume, REPLACE (Nume, 'VA') Modific Nume Mdfi


FROM AGENDA; MARINESCU MARINESCU
POP POP
Modific GEORGESCU GEORGESCU
Nume
MARINESCU VASILE VASILE
MARINESCU
POP FLORIN FLORIN
POP
GEORGESCU GEORGESCU 5 rows selected
VASILE SILE
FLORIN FLORIN SUBSTR
Aceasta funcjie are trei argumente si permite preluarea unei
5 rows selected parfi din sirul destinatie. Primul argument este sirul destinatie. Al
doilea argument este pozitia primului caracter ce trebuie afisat. Al
Daca exista un al treilea argument, acesta inlocuieste toate treilea argument semnific5 numjirul de caractere care trebuie tiparite la
secven^ele identice cu cheia de cautare din sirul respectiv, in acest caz, iesire.
exemplul urmator va avea ca rezultat:
SQL> SELECT Nume, SUBSTR (Nume, 2, 3)
SQL> SELECT Nume, REPLACE (Nume, 'VA', '**') FROM AGENDA;
Modific
FROM AGENDA;

98 99
Daca se utilizeaza un numar negativ pentru al doilea Nume LENGH (RTRIM (Nume)
argument, punctul de inceput este dat de numerotarea fata de sfar§itul MARINESCU 9
cuvantului: POP 3
SQL> SELECT Nume, SUBSTR (Nume, -1,2) GEORGESCU 9
FROM AGENDA; VASILE 6
FLORIN 6
TRANSLATE
Functia TRANSLATE prime§te, de asemenea, trei argumente. 5 rows selected
Primul este §irul destinatie. Apoi, este §irul FROM, urmat de §irul TO.
Elementele §irului destinatie, care sunt identice cu §irul FROM, sunt Se folose§te functia RTRIM pentru returnarea lungimii
inlocuite cu elementele corespondente din §irul TO. valoarilor existente in camp, nu lungimea existenta a campului Nume.

INSTR FUNCTII DE CONVERSIE


Se folose§te pentru a gasi intr-un §ir un anumit caracter. Sunt trei functii de conversie care pun la dispozitie o metoda
Primul argument al acestei functii este §irul destinatie. Al doilea rapida de convertire a unui tip de data in alt tip de data.
argument este caracterul care trebuie gasit. Urmatoarele doua
argumente sunt numere ce reprezinta locul de unde incepe cautarea in TO_CHAR
§ir §i, respectiv, al catelea element este eel identic cu caracterul ce Modul uzual de operare a acestei functii este conversia unui
trebuie afloat. numar intr-un caracter. Alte implementari ale limbajului folosesc
aceasta functie pentru a converti in caracter alte tipuri de date, ca de
SQL> SELECT Nume, INSTR (Nume,' O',l, 2) exemplu DATE.
FROM AGENDA;
TO_NUMBER
Rezultatul acestei comenzi este ca returneaza un numar care Aceasta functie este perechea functiei TO_CHAR §i prime§te
reprezinta primul element identic cu O incepand cu al doilea caracter. ca parametru un §ir pe care il converte§te intr-un numar.
In cazul in care nu se specifica al treilea §i al patrulea caracter, acestea
au valoarea prestabilita 1. Daca al treilea argument este negativ, 2.5. Clauze utilizate in SQL
cautarea incepe de la sfar§itul cuvantului catre inceputul acestuia.
Acest capitol va avea ca obiect elucidarea urmatoarelor
LENGH clauze:
Functia LENGH returneaza lungimea singurului argument
(camp) caracter pe care il prime§te. > WHERE;
> STARTING WITH;
SQL> SELECT Nume, LENGH (RTRIM (Nume) > ORDER BY;
> GROUP BY;
FROM AGENDA; > HAVING;
101
100
Pentru a in^elege utilizarea acestor clauze, vom prezenta
sintaxa generala a inslructiunii SELECT: Clauza ORDER BY
Cand, apare necesilalea ca rezullalele inlerogarii sa fie
SELECT [DISTINCT / ALL] { * prezenlale inlr-o anumila ordine, se ulilizeaza clauza ORDER BY.
I { [schema.] (label I vedere I instantaneu }.*
Inslrucliunea SELECT FROM ofera o lisla, iar in cazul in care nu s-a
I expresie} [AS] c_alias] defmil o cheie primara, inlerogarea va aparea in ordinea inlroducerii
[, {[schema.] (label I vedere I inslanlaneu}.*
inregislrarilor. Sa luam in considerare labelul STUDENTI. Clauza
I expresie} [AS] c_alias] ] } ORDER BY ofera o meloda de ordonare a rezullalelor operaliilor. De
FROM [schema.] (label I vedere I inslanlaneu} [@ dblink]
exemplu, daca dorim ordonarea lislei dupa codul sludenlului,
procedam in modul urmalor:
[,[schema.] (label I vedere I inslanlaneu} [@ dblink]
... SQL> SELECT *
[WHERE condilie] FROM STUDENJI
[GROUP BY expresie [, expresie]...[HEAVING condilie] ]
ORDER BY CodSlud;
[{UNION I UNION ALL I INTERSECT I MINUS} SELECT
comanda] CodStud Nume An Grupa Media
[ORDER BY {expresie | pozilie } [ASC | DESC] 32 Ion Hie 1 109 7.25
[, {expresie | pozilie} [ASC | DESC] ] ...]
52 Sima Victor 1 109 7.90
65 Pop luliu 1 109 9.15
67 Popa Vlad 1 109 8.20
Clauza WHERE 77 Popescu Dana 1 109 6.17
Ulilizand doar SELECT §i FROM, acliunea esle limilala la
87 Alexandra Ion 1 109 8.14
relurnarea luluror liniilor din label. Exisla insa cuvanlul cheie 100 1
Marcuf Marius 109 9.95
WHERE penlru slabilirea de selectii asupra labelului. Penlru a gasi
7 rows selected
lo^i sludenjii al caror cod are o valoare mai mare de 70 vom scrie:
Clauza GROUP BY
SQL> SELECT* Pentru exemplificare ne vom folosi de tabela PRET:
FROM STUDENTI
WHERE CodSlud> 70; Denumire Pre|_unitar
Mere 20000
Clauza STARTING WITH Portocale 17000
Clauza STARTING WITH esle o complelare la clauza
Banane 30000
WHERE §i opereaza la fel ca LIKE (<exp>%). Pere 15000
Prune 10000
SQL> SELECT Nume Struguri 25000
FROM STUDENTI
WHERE Nume STARTING WITH (TO');
103
102
2.6. Jonctiuni

Notiuni §i objective ale jonctiunilor


Introducand comanda: O caracteristica de baza a SQL-ului este capacitatea de
grupare §i manipulare a datelor din mai multe tabele. Tabelele foarte
SQL> SELECT Denumire, SUM (PreUinitar) Total complexe care contin multe campuri §i multe inregistrari sunt mult
FROM PRET mai greu de intretinut decat cele mici §i specifice. Or, tocmai acest
GROUP BY Denumire; avantaj il ofera functia JOIN din SQL. Jonctiunile pe care le pune la
dispozitie SQL-ul sunt 1 :
Total > Jonctiuni externe.
> Joncduni stanga.
117000 > Jonctiuni dreapta.
> Echi-joncduni.
Clauza HAVING > Non-echi-joncduni.
Consideram un tabel denumit PERSONAL, care contine > Joncdunea unui tabel cu el insu§i (auto-joncdunea).
urmatoarele campuri: Nume, LocMunca, Salariu, putem grupa
personalul pe compartimente §i vom afi§a salariul mediu pentru Regula de baza a jonctiunilor este aceea ca ele 'lipesc'
fiecare compartiment in parte. Se va folosi instruc^iunea: tabelele. Pentru tabelele care intra in joncdune se folosesc alias-uri
pentru a le deosebi.
SQL> SELECT LocMunca, AVG (Salariu) De exemplu:
FROM PERSONAL
GROUP BY LocMunca; FROM PRODUSE P, BENEFICIARIB

Utilizand comanda: Echi-joncdunea sau Jonctiunile echivalente folosesc clauza


WHERE pentru a selecta liniile combinate cu egalitatea dorita.
SQL> SELECT LocMunca, AVG (Salariu) Forma generala poate fi:
FROM PERSONAL
GROUP BY LocMunca SQL> SELECT alias 1.camp 1, [aliasl.campl,...],
HAVING AVG (Salariu) < 3000000; alias2.camp2, [alias2.camp2,...]
WHERE <condide intre campuri ale celor
se pot obtine acele locuri de munca unde media salariului este mai doua alias-uri>
mica de 3000000. Diferenta intre echi-joncdune §i non-echi-jonctiune este aceea
Clauza HAVING permite folosirea de functii totalizatoare ca prima utilizeaza semnul egal in instrucdunea WHERE, in timp ce
intr-o instructiune de comparare, asigurand pentru functiile non-echi-joncdunea folose^te oricare alt semn de comparatie in afara
totalizatoare ceea ce WHERE asigura pentru inregistrarile individuate. de egal, de exemplu:... WHERE P.CantP > B.CantP.

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


104 105
Exista, de asemenea, jonctiuni externe care sunt
complementare jonctiunilor interne. Jonctiunea interna este aceea in 2.6.1. Subinterogari
care liniile unui tabel sunt combinate cu liniile altui tabel,
reprezentand un numar total de linii dat de produsul numarului de linii O subinterogare este o interogare ale carei rezultate sunt
din fiecare tabel, linii folosite pentru a determina rezultatul unei clauze transmise ca argumente unei alte interogari. Ele sunt elementele de
legatura intre mai multe interogari.
WHERE.
O jonctiune interna are ca format general: O subinterogare are urmatoarea sintaxa:

SQL> SELECT *
SQL> SELECT alias 1.camp 1, [alias 1.camp 1,...],
alias2.camp2, [alias2.camp2,...] FROM TABEL 1
FROM TABEL alias 1 WHERE TABELl.Coloana_X =
JOIN TABEL2 ON TABEL2.camp <conditie> (SELECT Coloana_Y
FROM TABEL 2
O jonctiune externa are aceea§i forma, numai ca inaintea WHERE Coloana_Y = Valoare)
cuvantului cheie JOIN apare RIGHT OUTHER sau LEFT OUTHER.
Exemplu: Se observa ca a doua interogare este plasata in interiorul celei
dintai.
SQL> SELECT P.CantProd, P.DenProd, B.DenBenef, Avem tabelele COMPONENTS ?i COMENZI:
B.AdesaB SQL> SELECT *
FROM PRODUSE P
RIGHT OUTER JOIN BENEFICIARIB ON FROM COMPONENTS;
PRODUSE.CantProd = 150000
Nr__comp Denumire Pret
51 Ambreiaj
Sau pentru Jonctiunea externa stanga: 350000
69 Placute frana 79000
31 Amortizoare
SQL> SELECT P.CantProd, P.DenProd, B.DenBenef, 400000
35 Cablu frana 47000
B.AdesaB 14
FROM PRODUSE P Anvelope 545000
9 Carburator
LEFT OUTER JOIN BENEFICIARI B ON 290000
6 rows selected
PRODUSE.CantProd = 150000

Jonctiunea unui tabel cu el insu§i se comporta ca JOIN-ul pe


SQL> SELECT*
FROM COMENZI;
doua tabele diferite.

106 107
2.7. Instructiuni de manipulate a datelor
Conceptele anterioare au stabilit cum se pot regasi anumite
Obser- date dintr-o baza de date folosind orice criteriu imaginabil de selectie.
Data com Nume Nr_comp Cant Din moment ce datele au fost gasite, ele pot fi folosite intr-un program
vatii
Achitat aplicativ sau intr-un program de editare pentru utilizator. Problema
15-Mai-1999 Coml 51 este cum pot fi introduse informatiile intr-o baza de date. Se vor studia
Com2 35 Achitat
19-Mai-1999 trei instructiuni SQL care permit manipularea datelor intr-un tabel al
Com3 14 Achitat
2-Sapt-1999 unei baze de date. Acestea sunt:
3 rows selected
> INSERT;
Cele doua tabele folosesc in comun campul cu numele > UPDATE;
Nr_comp. Sa presupunem ca nu §tim §i nu dorim sa §tim valoarea > DELETE.
Nr_comp, dar am dori sa operam cu Denumirea componentei. SQL pune la dispozitie instructiuni pentru manipularea datelor
Folosind o subinterogare, s-ar putea introduce: impreuna cu programe de aplicatii, care permit utilizatorului sa editeze
date folosind instrumente de lucru proprii aplicatiei. Programatorul
SQL> SELECT* SQL trebuie sa fie capabil sa returneze datele din baza de date
FROM COMENZI folosind SQL. De asemenea, majoritatea sistemelor de baze de date de
WHERE Nr_comp = mari dimensiuni nu sunt proiectate fara a se tine seama de proiectantul
(Select Nr__comp sau programatorul de baze de date. Deoarece aceste sisteme sunt
FROM COMPONENTE create pentru a fi utilizate in medii multiuser de mare volum,
WHERE Denumire LIKE 'Cablu frana'); principala etapa de proiectare este bazata pe programul de optimizare
a interogarilor §i pe motoarele de regasire a datelor. In toate operatiile
Data_com Nume Nr_comp Cant Obser- de manipulare a bazelor de date care trebuie executate pot fi folosite
vatii aceste trei instructiuni. !n plus, majoritatea sistemelor de baze de date
19-Mai-1999 Com2 35 5 Achitat relationale pun la dispozitie §i instrumente pentru importul §i exportul
datelor. Aceste date sunt memorate in mod obi§nuit intr-un format
Imbricarea subinterogarilor limitat de tip fi§ier text. Deseori, un format de fi§ier memorat
Imbricarea este operatia de lipire a mai multor subinterogari in pastreaza informatii despre tabelul care se importa.
serie, forma generala fiind:
Instrucfiunea INSERT
SQL> SELECT * Instructiunea INSERT (Insereaza) este asociata operatiei de
FROM TABEL introducere a datelor intr-o baza de date. Ea poate fi:
WHERE INSERT...VALUES
(subinterogare 1 (subinterogare2(subinterogare3); §i
INSERT...SELECT
Exista §i subinterogari corelate, care permit folosirea unei
referinte externe.
108 109
Instructiunea INSERT...VALUES Pentru adaugarea unei informatii in acest tabel, utilizam
instructiunea INSERT...VALUES este utilizata la instructiunea:
introducerea datelor mtr-un label, inregistrare cu inregistrare. Este SQL> INSERT INTO STUDENTI
utila pentru operatii care presupun lucrul cu tabele care au inregistrari (CodStud, Nume, An, Grupa Media)
putine. VALUES (66, 'DimaPetre', 1, 109, 7.10);
Forma generala a comenzii este: 1 row created
SQL> INSERT INTO TABEL
Pentru a verifica adaugarea acestei noi inregistrari, vom utiliza
(coll,co!2, co!3,...) instructiunea:
VALUES (valoarel, valoarel, valoareB,...)
Functia principals a acestei instruc^iuni este adaugarea unei SQL> SELECT*
inregistrari intr-un tabel folosind coloanele menjionate §i valorile FROM STUDENTI;
corespondente. La inserarea datelor intr-un tabel prin folosirea acestei
instructiuni, trebuie respectate urmatoarele reguli: CodStud Nume An Grupa Media
> valorile folosite trebuie sa aiba acela§i tip de data ca §i 32 Ion Die 1
1 109 7.25
campurile in care sunt adaugate; 67 Popa Vlad 1
1 109 8.20
> dimensiunea datei introduse'trebuie sa fie mai mica decat 65 Pop luliu 1
1 109 9.15
dimensiunea coloanei. De exemplu, un §ir de 25 de 87 Alexandru Ion 1
1 109 8.14
caractere nu poate fi scris intr-un camp de 10 caractere; 77 Popescu Dana 1 109 6.17
> localizarea datei in lista VALUES trebuie sa corespunda 52 Sima Victor 1
1 109 7.90
locatiei din lista de coloane in care este adaugata (adica, 100 Marcut Marius 1
1 109 9.95
prima valoare trebuie sa fie introdusa in prima coloana, a 66 Dima Petre 11 109 7.10
doua valoare in a doua coloana §i a§a mai departe). (A se 8 rows selected
intelege prin coloana campul din inregistrare).
Sa presupunem ca facem referire la tabelul STUDENTI: Atunci cand folosim instructiunea INSERT, numele de
coloane nu sunt obligatorii. Daca nu sunt introduse numele de
SQL> SELECT * coloane, SQL aliniaza valorile cu numerele de coloane
FROM STUDENTI; corespunzatoare. SQL insereaza prima valoare in prima coloana, a
CodStud Nume An Grupa Media doua valoare in a doua coloana §i a§a mai departe.
32 Ion Hie 1 109 7.25
67 Popa Vlad 1 109 8.20
65 Pop luliu 1 109 9.15 Inserarea valorilor NULL
87 Alexandru Ion 1 109 8.14 Cand este creata o coloana, i se poate atribui cateva
77 Popescu Dana 1 109 6.17 caracteristici. Una dintre aceste caracteristici este aceea ca respectiva
52 Sima Victor 1 109 7.90 coloana ar putea avea (sau nu) capacitatea de a contine valori NULL.
100 Marcut Marius 1 109 9.95 O valoare NULL inseamna ca valoarea este vida. Nu este nici zero, in
7 rows selected cazul unui intreg, nici spatiu, in cazul unui §ir. In locul acestora nu
110 111
exista nici un fel de data in coloana inregistrarii respective. Cand Deoarece combinarile in tabelele multiple sunt mai lente in executie,
coloana are definitia NOT NULL inseamna ca acestei coloane nu i se decat interogarile simple, este mult mai rapida executarea interogarii
permite sa contina valori NULL, deci ea trebuie sa contina o valoare. SELECT intr-un tabel de cautare decat executia unei interogari
Instructiunea INSERT este anulata in cazul in care aceasta combinate. Tabelele de cautare sunt memorate adesea pe mediile
regula nu este respectata §i se receptioneaza un mesaj de descriere a client/server pentru a reduce traficul pe retea.
erorii aparute. Sistemele de baze de date accepta, de asemenea, tabele
Sa presupunem ca, in exemplul precedent, coloana NUME a temporare. Tabelele temporare exista numai pe perioada cat
fost definita cu caracteristica NOT NULL. Introducerea instructiunii: utilizatorul este conectat la baza de date §i sunt §terse la terminarea
acestei legaturi. Instructiunea INSERT...SELECT poate prelua iejirea
SQL> INSERT INTO STUDENTI unei instructiuni SELECT obi§nuite pentru a insera valorile
VALUES (102, NULL, 1, 109, 8.70). corespunzatoare intr-un tabel temporar.
Sintaxa unei instructiuni INSERT...SELECT este urmatoarea:
va genera:
SQL> INSERT INTO TABEL (col 1, co!2,...)
INSERT INTO STUDENTI SELECT Coll,Co!2,...
* FROM TABEL
ERROR at line 1: WHERE conditie de cautare;
ORA-01400: mandatory (NOT NULL) column is missing or Este important de retinut ca ie§irea unei interogari standard de
NULL during insert tip SELECT devine intrare intr-un alt tabel al unei baze de date.
Acelea§i reguli se aplica in cazul instructiunii INSERT...VALUES.
Inserarea valorilor unice Vom copia continutul tabelului STUDENTI intr-un tabel
Multe sisteme de gestiune a bazelor de date permit crearea denumit GRUPAST:
unei coloane cu atributul UNIQUE. Aceasta inseamna ca, in tabelul
respectiv, valorile din coloana respectiva trebuie sa fie completate in SQL> CREATE TABLE GRUPAST
mod unic §i, ca atare, nu pot aparea mai mult de o singura data. (CodStud NUMBER, Nume CHAR (20)
Aceasta configurare poate genera probleme la inserarea sau An NUMBER, Grupa NUMBER
actualizarea valorilor intr-o baza de date existenta. Media NUMBER);

Instrucfiunea INSERT... SELECT Aceasta instructiune a creat noul tabel GRUPAST. Pentru a
Instructiunea INSERT...VALUES este utila la adaugarea completa acest tabel cu datele din tabelul STUDENTI, vom proceda
inregistrarilor simple intr-un tabel al bazei de date, dar are evident astfel:
restrictive sale. In cazul tabelelor cu iregistrari foarte numeroase, este SQL> INSERT INTO GRUPAST
mult mai indicata utilizarea instructiunii INSERT...SELECT. Aceasta (CodSud, Nume, An, Grupa, Media)
instructiune permite utilizatorului sa copieze intr-un tabel informa^i SELECT CodSud, Nume, An, Grupa, Media
dintr-un alt tabel sau grup de tabele. Deseori, pentru cre§terea FROM STUDENTI;
performantei sunt create tabele de cautare. Tabelele de cautare pot
contine date care cuprind mai multe tabele din mai multe baze de date. 7 rows created
112 113
Sunt cateva reguli care trebuie respectate la folosirea
instructiunii INSERT...SELECT: CodStud Nume An Grupa
66 Media
Dima Petre 1 109 8.0
> instructiunea SELECT nu poate selecta linii din tabelul
care a fost inserat; Daca se omite clauza WHERE, toate inregistrarile din tabelul
> numarul de coloane din instructiunea INSERT...SELECT STUDENTl vor fi actualizate cu valoarea data, adica la Media 8.0.
trebuie sa fie egal cu numarul de coloane returnate de Unele sisteme de baze de date pun la dispozitie o extensie la
instructiunea SELECT; sintaxa standard a instructiunii UPDATE. De exemplu, limbajul
> tipurile de date ale coloanelor din instructiunea INSERT Transact-SQL al sistemului SQL Server permite programatorului sa
INTO trebuie sa fie acelea§i cu tipurile de date ale actualizeze continutul unui tabel pe baza confinutului altor cateva
coloanelor returnate de instructiunea SELECT. tabele, prin folosirea clauzei FROM. Sintaxa extinsa arata astfel:

Instructiunea UPDATE SQL> UPDATE TABEL


Instructiunea UPDATE (Actualizeaza) are rolul de a actualiza SET Coll =Valoarel
valorile unui tabel, dar este folosita §i pentru modificarea valorilor din [Col2 = Valoare2]...
inregistrarile existente. Sintaxa instructiunii UPDATE este FROM LISTA_TABELE
urmatoarea: WHERE conditie de cautare

SQL> UPDATE TABEL Tipul datelor rezultate din evaluarea expresiei trebuie sa fie
SET Coll =Valoarel acela§i cu tipul de data al campului care este modificat. De asemenea,
[Col2 = Valoare2]... dimensiunea (lungimea) valorii trebuie sa fie corespunzatoare cu
WHERE conditie de cautare campul care este modificat.
La obtinerea rezultatelor in valoarea calculata pot rezulta doua
Aceasta instructiune verifica in primul rand clauza WHERE. situatii: trunchirea §i depa?irea zonei de memorie. Trunchirea apare
Pentru toate inregistrarile din tabelul dat in care clauza WHERE este atunci cand sistemul de baze de date converte§te, de exemplu, un
evaluata la valoarea TRUE., valoarea corespunzatoare este actualizata. numar fractionar intr-un numar intreg. Depa§irea zonei de memorie
apare atunci cand valoarea rezultata este mai mare decat capacitatea
SQL> UPDATE STUDENTl (campului) coloanei modificate. Aceasta va determina semnalarea
SETMedie = 8.0 unei erori de depa§ire din partea sistemului de baze de date.
WHERE Nume = ' Dima Petre'; Unele sisteme de baze de date rezolva aceste probleme, ca de
exemplu Oracle?, care face conversia numarului in notatie
Pentru a confirma modificarea efectuata in tabelul exponentials.
STUDENTl vom introduce instructiunea:

SQL> SELECT*
FROM STUDENTl
WHERE Nume = 'Dima Petre';
114 115
Instructiunea DELETE SQL> DELETE FROM STUDENTI
La fel de frecvent ca §i adaugarea de date intr-o baza de date, WHERE Media < 9.0;
apare necesitatea de §tergere a altor date pe baza unei anumite operatii
din program. Sintaxa instructiunii DELETE (§terge) este urmatoarea: Pentru a vedea rezultatul actiunii acestei instructiuni, utilizam
urmatoarea comanda:
SQL> DELETE FROM TABEL
WHERE conditie SQL> SELECT*
FROM STUDENTI;
Inaintea executiei instructiunii DELETE nu apare prompt-ul.
In limbajul SQL, atunci cand se anunta sistemul de administrare a CodStud Nume An Grupa Media
bazei de date §tergerea unui grup de inregistrari dintr-un tabel, aceasta 65 Pop luliu 1 109 9.15
comanda se executa fara a cere confirmarea utilizatorului. 100 Marcut Marius 1 109 9.95
In functie de folosirea sau nu a clauzei SELECT in cadrul 2 rows selected
instructiunii DELETE, SQL poate executa urmatoarele operatii:
Pentru a annula §tergerile efectuate cu instructiunea
> §tergerea unor linii individuale; DELETE,vom proceda astfel:
> §tergerea unor linii multiple;
> §tergerea tuturor liniilor; SQL> INSERT GRUPAST
> nici o linie §tearsa. SELECT * FROM STUDENTI
DROP TABLE STUDENT!;
Clauza DELETE are urmatoarele caracteristici:
CREATE TABLE construie§te un tabel nou in formatul dat,
> Instructiunea DELETE nu poate fi folosita pentru iar DROP TABLE §terge tabelul respectiv. Instructiunea DROP
§tergerea unei valori dintr-un camp individual (pentru TABLE elimina un tabel pentru totdeauna, in timp ce DELETE
aceasta se folose§te instructiunea UPDATE). Instructiunea FROM <TABEL> §terge numai inregistrarile dintr-un tabel.
DELETE §terge inregistrari complete dintr-un singur
tabel. 2.8. Importul $i exportul datelor
> Ca §i instructiunile INSERT §i UPDATE, opefatia de
Instructiunile INSERT, UPDATE §i DELETE sunt utile intr-un
§tergere a inregistrarilor dintr-un singur tabel poate
program de baze de date. Ele sunt folosite impreuna cu instructiunea
determina aparitia unor probleme de integritate
SELECT pentru a crea baza pentru celelalte operatii cu baza de date.
referentiala in cadrul altor tabele. Acest aspect trebuie
De obicei, sistemele de baze de date permit importul §i
retinut atunci cand se modifica datele dintr-o baza de date.
exportul de date folosind formatul de fi§ier text ASCII; deci, aceasta
> Prin folosirea instructiunii DELETE se pot §terge numai
nu este caracteristica limbajului SQL. Exista produse software pentru
inregistrari din tabel, nu §i tabelul. Pentru eliminarea unui
exportul/importul de date care sunt continute in pachetele de programe
tabel se folose^te instructiunea DROP TABLE. Microsoft ACCESS, Microsoft $i Sybase SQL.

116 117
Exemplu:
DECLARE @ varmat INT Teste de autoevaluare
DECLARE @ varpret FLOAT
PRINT 'Lista preturilor mai man ca 1000000' 1. Ce se intelege prin arhitectura Client/Server?
DECLARE C_mat FOR SELECT * FROM Materiale 2. Clasificati arhitecturile Client/Server.
OPEN C_mat 3. Care sunt caracteristicile unui Client/Server WEB?
FETCH FIRST FROM C_mat INTO @varmat, ©varpret 4. Care sunt nivelurile pe care este organizata o baza de date SQL
WHILE (@@ sqlstatus = 0) Server?
BEGIN 5. Gate tipuri de comenzi se cunosc in T_SQL 12?
IF (@varpret > 1000000) 6. Scrieti comanda de creare a unei baze de date denumite
BEGIN CALITATE §i apoi scrieti comanda de §tergere a acesteia.
PRINT @ varmat 7. Cum se face declararea unei variabile in TJSQL?
END 8. Creati un tabel numit SITSTUD care se refera la situatia
FETCH NEXT FROM C_mat INTO @varmat, ©varpret studentilor dintr-o facultate §i are drept campuri: CODSTUD, NUME,
END ADRESA, FACULTATE, AN, GRUPA.
9. Cate tipuri de date cunoa§teti in T_SQL?
In acest exemplu sunt afi§ate toate codurile de materiale pentru J 10. Cu ce comanda se face crearea unui view?
care pretul este mai mare cu 1.000.000 lei. 11. Scrieti comenzile de creare §i de §tergere a procedurii
S-au declarat doua variabile @varmat pentru codul materialului 1 CALCUL.
ca intreg §i @varpret virgula mobila (FLOAT). S-a creat un cursor | 12. Care este definitia unei tranzactii?
Cjnat dupa care parcurgem inregistrarile din tabela Materiale. 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