Documente Academic
Documente Profesional
Documente Cultură
aa aoiazva
njesnj BUJOQ
J.HVH ntiids
C UP R I NS
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:
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;
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;
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).
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
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;
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;
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:
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.
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
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:
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