Sunteți pe pagina 1din 42

5.

SQL
n acest capitol vor fi prezentate pe larg comanda de interogare a datelor SELECT, comenzile
de manipulare a datelor INSERT, UPDATE, DELETE, precum i comanda TRUNCATE.
5.1. Comanda SELECT
Interogarea datelor stocate n baza de date este considerat cea mai important facilitate a
unui SGBD. n SQL ea se realizeaz prin intermediul comenzii SELECT. Comanda SELECT
este folosit doar pentru interogarea datelor, ea neputndu-le modifica. Aa cum am vzut mai
nainte, comanda SELECT implementeaz toi operatorii algebrei relaionale. O instruciune
SELECT cuprinde n mod obligatoriu cuvntul cheie FROM. Cu alte cuvinte, sintaxa
minimal pentru comanda SELECT este:
SELECT atribute
FROM obiect
Dup cuvntul cheie SELECT se specific lista atributelor ce urmeaz a fi returnate ca
rezultat al interogrii, iar dup cuvntul FROM se precizeaz obiectele (tabele, vederi,
sinonime) din care se vor selecta aceste atribute.
5.1.1. Atributele comenzii SELECT
In lista de atribute pot aprea:
toate coloanele din tabel sau vedere (in ordinea n care au fost definite n comanda
CREATE TABLE/CREATE VIEW) prin utilizarea semnului *:
SQL> SELECT *
FROM profesor;
COD
--100
101
102
103
104
105
106

NUME
--------GHEORGHIU
MARIN
GEORGESCU
IONESCU
ALBU
VOINEA
STANESCU

PRENUME
--------TEFAN
VLAD
CRISTIANA
VERONICA
GHEORGHE
MIRCEA
MARIA

DATA_NAST
--------ll-AUG-46
19-APR-45
30-OCT-51
15-NOV-65
05-DEC-69

GRAD
---PROF
PROF
CONF
ASIST
LECT
ASIST
ASIST

EF
--100
100
102
100
100
103

SALARIU PRIMA
------- ----3000
3500
2500
2800
200
1500
2200
2500
1200
150
1200
600

COD_CATEDRA
----------10
20
30
10
20
10
20

numele coloanelor separate prin virgul. Acestea vor aprea n rezultatul interogrii n
ordinea n care sunt specificate:

SQL> SELECT nume, prenume, salariu


FROM profesor;
NUME
--------GHEORGHIU
MARIN
GEORGESCU
IONESCU

PRENUME
------TEFAN
VLAD
CRISTIANA
VERONICA

SALARIU
------3000
2500
2800
1500

ALBU
VOINEA
STANESCU

GHEORGHE
MIRCEA
MRIA

2200
1200
1200

atribute rezultate din evaluarea unor expresii. Aceste expresii pot conine nume de
coloane, constante, operatori sau funcii.
5.1.2. Operatori aritmetici

Operatorii aritmetici pot fi folosii pentru a crea expresii avnd tipul de date numeric sau date
calendaristice. Operatorii aritmetici sunt + (adunare), - (scdere ), * (nmulire), / (mprire).
Ordinea de preceden a operatorilor poate fi schimbat cu ajutorul parantezelor.
De exemplu dac n tabela profesor ne intereseaz s calculm impozitul aferent salariilor,
tiind c acesta este de 38%, putem scrie urmtoarea interogare:
SQL> SELECT nume, salariu, salariu*0.38
FROM profesor;
NUME
SALARIU
---------GHEORGHIU
3000
MARIN
2500
GEORGESCU
2800
IONESCU
1500
ALBU
2200
VOINEA
1200
STANESCU
1200

SALARIU*0.38
-----------1140
950
1064
570
836
456
456

5.1.3. Aliasuri de coloane


Pentru exemplul anterior observm c n momentul afirii rezultatelor, se mai utilizeaz
numele coloanelor ca antet. Cnd acest lucru poate face dificil nelegerea rezultatelor, se
poate schimba antetul prin atribuirea altor nume coloanelor (numite 'alias'-uri ale coloanei).
Acest lucru se realizeaz specificnd alias-ul dup numele coloanei. In cazul n care alias-ul
conine spaii sau caractere speciale cum ar fi + sau -, acesta se va specifica ntre ghilimele.
In exemplul de mai jos alias-ul "DATA NATERE" conine spaii deci este specificat ntre
ghilimele n timp ce alias-ul impozit nu conine spaii sau caractere speciale deci nu trebuie
specificai obligatoriu intre ghilimele.
SQL> SELECT nume, data_nast "DATA NATERE", salariu,
salariu*0.38 impozit
FROM profesor;
NUME
---GHEORGHIU
MARIN
GEORGESCU
IONESCU
ALBU
VOINEA

DATA NATERE
-----------ll-AUG-46
19-APR-45
30-OCT-51
15-NOV-65

SALARIU
------3000
2500
2800
1500
2200
1200

IMPOZIT
------1140
950
1064
570
836
456

STANESCU

05-DEC-69

1200

456

5.1.4. Operatorul de concatenare


Operatorul de concatenare, notat | |, permite legarea coloanelor cu alte coloane, expresii
aritmetice sau valori constante pentru a crea o expresie de tip ir de caractere. De exemplu,
pentru a combina codul, numele si prenumele unui profesor, separate printr-un spaiu, se
folosete urmtoarea interogare:
SQL> SELECT cod || ' ' || nume || ' ' || prenume detalii
FROM profesor;
DETALII
------100 GHEORGHIU TEFAN
101 MARIN VLAD
102 GEORGESCU CRISTIANA
103 IONESCU VERONlCA
104 ALBU GHEORGHE
105 VOINEA MIRCEA
106 STANESCU MRIA
5.1.5. Convertirea valorilor Null cu ajutorul funciei NVL
Dac la o nregistrare pentru o anumit coloan valoarea este necunoscut sau neaplicabil,
atunci aceasta este Null. Aceast valoare nu trebuie confundat cu zero sau irul de caractere
format dintr-un spaiu. Aa cum am vzut n exemplele de pn acum, dac o anumit valoare
este Null, nu se va afia nimic. Pentru expresiile aritmetice, dac una dintre valorile
componente este Null, atunci i rezultatul expresiei este Null. De exemplu, pentru a calcula
salariul total, ce reprezint suma dintre coloanele salariu i prima putem folosi interogarea:
SQL> SELECT nume, salariu, prima,salariu+prima "SALARIU TOTAL"
FROM profesor;
NUME
---GHEORGHIU
MARIN
GEORGESCU
IONESCU
ALBU
VOINEA
STANESCU

SALARIU
------3000
2500
2800
1500
2200
1200
1200

PRIMA
----3500

SALARIU TOTAL
------------6500

200

3000

2500
150
600

4700
1350
1800

Observm ca pentru acele nregistrri care au avut valoarea Null n cmpul prima expresia
ce calculeaz salariul total returneaz tot valoarea Null.
Pentru a obine un rezultat diferit de Null, valorile Null trebuiesc convertite ntr-un numr (n
cazul de fa 0) nainte de a aplica operatorul aritmetic. Aceast convertire se poate realiza
prin intermediul funciei NVL. Funcia NVL are dou argumente. Dac valoarea primului
argument nu este Null, atunci NVL ntoarce aceast valoare; altfel, ea intoarce valoarea celui
de-al doilea argument. Cele dou argumente pot avea orice tip de date. Dac tipurile de date

ale celor dou argumente difer, Oracle ncerc s converteasc, al doilea argument la tipul de
date al primului. De exemplu, pentru a putea calcula salariul total al tuturor cadrelor didactice,
trebuie s convertim valoarea Null din coloana prima a tabelei professor n valoarea 0
folosind NVL (prima, 0):
SQL> SELECT nume, salariu, prima, salariu+NVL(prima,0)"SALARIU
TOTAL" FROM profesor;
NUME
---GHEORGHIU
MARIN
GEORGESCU
IONESCU
ALBU
VOINEA
STANESCU

SALARIU
------3000
2500
2800
1500
2200
1200
1200

PRIMA
----3500
200
2500
150
600

SALARIU TOTAL
------------6500
2500
3000
1500
4700
1350
1800

5.1.6. Prevenirea selectrii nregistrrilor duplicate


O comand SELECT care nu cuprinde cuvntul cheie DISTINCT va afia toate nregistrrile
care rezult din interogare, indiferent dac unele dintre ele sunt identice. De exemplu,
interogarea de mai jos va returna urmtoarele rezultate:
SQL> SELECT grad
FROM profesor;
GRAD
---PROF
PROF
CONF
ASIST
LECT
ASIST
ASIST
In cazul folosirii cuvntului cheie DISTINCT nregisrarile duplicat sunt eliminate, afindu-se
numai prima apariie a valorilor cmpurilor specificate n lista de atribute. De exemplu:
SQL> SELECT DISTINCT grad
FROM profesor;
GRAD
---ASIST
CONF
LECT
PROF

Dac lista de atribute conine mai multe coloane, operatorul DISTINCT va afecta toate
coloanele selectate. Urmtorul exemplu va afia toate combinaiile de valori care sunt diferite
pentru coloanele grad i cod_catedra.
SQL> SELECT DISTINCT grad, cod_catedra
FROM profesor;
GRAD COD_CATEDRA
---- ----------ASIST
10
ASIST
20
CONF
30
LECT
20
PROF
10
PROF
20
5.1.7. Clauza ORDER BY
In mod normal, n urma interogrii nregistrrile rezultate apar n aceeai ordine n care au
fost introduse n baza de date. Pentru a modifica ordinea de afiare se utilizeaz clauza
ORDER BY, care sorteaz nregistrrile dup valorile din una sau mai multe coloane. Aceast
clauz este urmat de numele coloanelor dup care se va face sortarea. De asemenea, este
posibil s se identifice coloana dintr-o clauz ORDER BY folosind n locul numelui coloanei
un numr ordinal ce reprezint poziia coloanei n rezultat (de la stnga la dreapta). Aceast
facilitate face posibil ordonarea rezultatului interogrii n funcie de un atribut al clauzei
SELECT care poate fi o expresie complex, fr a mai rescrie acea expresie.
Nu exist nici o limit a numrului de coloane n funcie de care se poate face sortarea. Nu
este obligatoriu ca ordinea de sortare s se fac n funcie de o coloan care s fie afiat, dar
n acest caz nu se mai poate folosi numrul de ordine al coloanei n loc de numele acesteia,
nregistrrile vor fi sortate mai nti in funcie de primul cmp specificat dup clauza ORDER
BY, apoi, nregistrile care au aceeai valoare n acest prim cmp sunt sortate n funcie de
valoarea celui de-al doilea cmp specificat dup clauza ORDER BY, s.a.m.d.
De exemplu, pentru a sorta ascendent nregistrarile n funcie de impozitul pe salariu folosim
interogarea:
SQL> SELECT nume, salariu*0.38
FROM profesor
ORDER BY salariu*0.38;
care este echivalent cu:
SQL> SELECT nume, salariu*0.38
FROM profesor
ORDER BY 2;
NUME
---VOINEA
STANESCU
IONESCU
ALBU

SALARIU*0.38
----------456
456
570
836

MARIN
GEORGESCU
GHEORGHIU

950
1064
1140

nregistrrile sunt sortate n mod implicit n ordine ascendent (opiunea ASC), afiarea n
ordine descendent fcndu-se prin utilizarea opiunii DESC. Observai c n momentul
sortrii valoarea Null este considerat cea mai mare, deci dac sortarea este ascendent este
trecut pe ultima poziie si dac sortarea este descendent este trecut pe prima poziie. De
exemplu:
SQL> SELECT grad, prima
FROM profesor
ORDER BY grad, prima DESC;
GRAD
---ASIST
ASIST
ASIST
CONF
LECT
PROF
PROF

PRIMA
----600
150
200
2500
3500

Se observ c n exemplul de mai sus nregistrrile au fost mai nti sortate ascendent
(specificaie implicit) n funcie de gradul didactic, nregistrrile cu acelai grad au fost apoi
ordonate n funcie de cel de-al doilea criteriu de sortare, adic n funcie de prima primit cu
specificaia explicit de sortare descendent.
5.1.8. Clauza WHERE
Clauza WHERE se folosete pentru a regsi nregistrri ce corespund unei anumite condiii
evaluat cu valoarea de adevr True, adic pentru a realiza anumite restricii de selecie.
Astfel, clauza WHERE corespunde restriciilor operatorilor din algebra relaional. Cu alte
cuvinte, dac o clauz ORDER BY este o clauz de sortare, clauza WHERE este o clauz de
filtrare Dac nu se specifica o clauz WHERE, interogarea va ntoarce ca rezultat toate
rndurile din tabel. Alturi de clauza FROM care este obligatorie, WHERE este cea mai
folosit clauz a comenzii SELECT. Din punct de vedere sintactic, clauza WHERE este
opional, dar atunci cnd este introdus urmeaz ntotdeauna imediat dup clauza FROM:
SELECT atribute
FROM obiect
WHERE condiie
Datorit existentei valorii Null, n SQL o condiie poate lua att valorile True i False ct i
valoarea Necunoscut (despre acest lucru se va discuta mai n detaliu n seciunile urmtoare).
O comand SELECT cu clauza WHERE va returna toate nregistrrile pentru care condiia are
valoarea True. Condiia clauzei WHERE poate cuprinde numele unor coloane, constante,
operatori de comparaie sau operatori logici (NOT, AND, OR). Operatorii de comparaie se
pot mpri n dou categorii: operatori relaionali i operatori SQL. Toi aceti operatori sunt
trecui n revist n continuare.

5.1.9. Operatori relaionali


Operatorii relaionali sunt:
=
egal
>
mai mare
>=
mai mare sau egal

<> i != diferit
<
mai mic
<=
mai mic sau egal

Cele dou valori care sunt comparate trebuie s aparin unor tipuri de date compatibile.
De exemplu, pentru a selecta toate cadrele didactice care nu aparin catedrei cu codul 10
folosim urmtoarea interogare:
SQL> SELECT nume, prenume
FROM profesor
WHERE cod_catedra <>10;
NUME
---MARIN
GEORGESCU
ALBU
STANESCU

PRENUME
------VLAD
CRISTIANA
GHEORGHE
MARIA

irurile de caractere i data calendaristic trebuiesc incluse ntre apostrofuri. De exemplu,


pentru a selecta numai acele cadre didactice care au gradul didactic de profesor vom utiliza
urmtoarea interogare:
SQL> SELECT nume, prenume
FROM profesor
WHERE grad ='PROF';
NUME
---GHEORGHIU
MARIN

PRENUME
------TEFAN
VLAD

In cazul irurilor de caractere, literele mici sunt diferite de literele mari. De exemplu,
urmtoarea interogare nu va returna nici o nregistrare:
SQL> SELECT nume, prenume
FROM profesor
WHERE grad='prof';
Toi operatorii de comparaie pot fi folosii att pentru valori numerice ct i pentru iruri de
caractere sau date calendaristice. De exemplu, pentru a afla toate cadrele didactice care s-au
nscut nainte de l Ianuarie 1960 folosim interogarea:
SQL> SELECT nume,prenume, data_nast
FROM profesor
WHERE data_nast<'Ol-JAN-65';

NUME
---GHEORGHIU
MARIN
GEORGESCU

PRENUME
------TEFAN
VLAD
CRISTIANA

DATA_NAST
--------ll-AUG-46
19-APR-45
30-OCT-51

In cazul irurilor de caractere ordonarea se face dup codul ASCII al acestora. De exemplu,
pentru a afla toate cadrele didactice ale cror nume sunt n ordinea alfabetic dup litera 'M' se
poate folosi interogarea.
SQL> SELECT nume, prenume
FROM profesor
WHERE nume>='M';
NUME
---MARIN
VOINEA
STANESCU

PRENUME
------VLAD
MIRCEA
MARIA

Trebuie remarcat c interogarea de mai sus este corect numai n cazul n care numele
angajailor ncepe cu o liter mare, literele mici fiind n urma celor mari.
Exist posibilitatea de a compara valoarea unei coloane cu valoarea altei coloane pentru
aceeai nregistrare. De exemplu, dac dorim s selectm acele cadre didactice care au primit
prim mai mare dect salariul de baz vom avea:
SQL> SELECT nume, prenume, salariu, prima
FROM profesor
WHERE salariu<prima;
NUME
---GHEORGHIU
ALBU

PRENUME
------TEFAN
GHEORGHE

SALARIU
------3000
2200

PRIMA
----3500
2500

5.1.10. Operatori SQL


Exist patru tipuri de operatori SQL, care pot opera cu toate tipurile de date:
1. BETWEEN. . .AND. . .
2. IN
3. LIKE
4. IS NULL
Operatorul BETWEEN...AND...
Operatorul BETWEEN. . .AND. . . permite specificarea unui domeniu mrginit de dou valori
ntre care trebuie s se afle valoarea testat. Domeniul de valori specificat este un interval
nchis iar limita inferioar trebuie specificat prima.
Astfel, dac dorim selectarea acelor cadre didactice care au salariul ntre 2000 i 3000 vom
folosi comanda:

SQL> SELECT nume, prenume, salariu


FROM profesor
WHERE salariu BETWEEN 2000 AND 3000;
NUME
---GHEORGHIU
MARIN
GEORGESCU
ALBU

PRENUME
SALARIU
------------TEFAN
3000
VLAD
2500
CRISTIANA 2800
GHEORGHE
2200

Operatorul IN
Operatorul IN permite specificarea unei liste ele valori, valoarea testat trebuind s se afle
printre valorile acestei liste.
De exemplu, dac dorim selectarea cadrelor didactice care au gradul de confereniar, lector
sau asistent vom utiliza comanda:
SQL> SELECT nume, prenume, grad
FROM profesor
WHERE grad IN (CONF, 'LECT', 'ASIST');
NUME
---GEORGESCU
IONESCU
ALBU
VOINEA
STANESCU

PRENUME
------CRISTIANA
VERONICA
GHEORGHE
MIRCEA
MARIA

GRAD
---CONF
ASIST
LECT
ASIST
ASIST

Operatorul LIKE
Operatorul LIKE permite specificarea unui anumit model de ir de caractere cu care trebuie s
se potriveasc valoarea testat. Acest operator se folosete n mod special atunci cnd nu se
tie exact valoarea care trebuie cutat. Pentru a construi modelul dup care se face cutarea
pot fi folosite dou simboluri:
% semnific orice secven de zero sau mai multe caractere
- semnific orice caracter (care apare o singur data)
De exemplu, urmtoarea comand SELECT va re turna toate cadrele didactice al cror nume
ncepe cu litera 'G':
SQL> SELECT nume, prenume
FROM profesor
WHERE nume LIKE 'G%';
NUME
---GHEORGHIU
TEFAN

PRENUME
------GEORGESCU
CRISTIANA

Dac dorim selectarea acelor cadre didactice al cror nume are litera 'O' pe a doua poziie,
indiferent de lungimea cuvntului, vom avea:
SQL> SELECT nume, prenume
FROM profesor
WHERE nume LIKE '_0%';
NUME
---IONESCU
VOINEA

PRENUME
------VERONICA
MIRCEA

O problem intervine atunci cnd irul conine caracterele % sau _ (de exemplu irul
'J_James') deoarece aceste caractere au semnificaie predefmit. Pentru a schimba
interpretarea acestor caractere se folosete opiunea ESCAPE.
De exemplu, pentru a cuta toate titlurile de carte care ncep cu caracterele 'J_' se poate folosi
interogarea:
SQL> SELECT titlu
FROM carte
WHERE titlu LIKE 'J/__% ' ESCAPE '/';
In exemplul de mai sus opiunea ESCAPE identific caracterul '/' ca fiind caracterul "escape".
Deoarece in modelul folosit pentru LIKE acest caracter precede caracterul '_' acesta din urm
va fi interpretat ca o simpl liter, fr alt semnificaie.
Avantajul unei viteze mari de regsire ca urmare a indexrii este pierdut n momentul n care
se caut un ir de caractere care ncepe cu _ sau % ntr-o coloan indexat.
Operatorul IS NULL
Operatorul IS NULL testeaz dac o valoare este Null. Pentru a vedea utilitatea acestui
operator s considerm urmtoarele interogri:
SQL> SELECT nume, prenume
FROM profesor
WHERE prima = NULL;
SQL> SELECT nume, prenume
FROM profesor
WHERE prima <> NULL;
Amndou aceste interogri nu vor returna nici o nregistrare. Aceste lucru pare surprinztor
la prima vedere deoarece ne-am fi ateptat ca prima interogare s returneze toate cadrele
didactice care nu au primit prim, iar a doua toate cadrele didactice care au primit prim. In
SQL ns, orice condiie care este format dintr-un operator de comparaie care are unul dintre
termeni valoarea Null va avea ca rezultat valoarea Necunoscut, diferit de valoarea True
(pentru care se face filtrarea). Pentru compararea cu Null se folosete operatorul special IS
NULL.
Deci pentru a afla cadrele didactice care nu au primit prim se folosete interogarea:
SQL> SELECT nume, prenume FROM professor WHERE prima IS NULL;

NUME
---MARIN
IONESCU

PRENUME
------VLAD
VERONICA

La fel, pentru a afla cadrele didactice ale cror dat de natere nu se cunoate vom folosi
urmtoarea interogare:
SQL> SELECT nume, prenume
FROM profesor
WHERE data_nast IS NULL;
NUME
---IONESCU
VERONICA

PRENUME
------ALBU
GHEORGHE

5.1.11. Operatorii logici


Negarea operatorilor n unele cazuri suni mai uor de cutat nregistrrile care nu ndeplinesc
o anumit condiie. Acest lucru se poate realiza folosind operatorul NOT. Operatorul NOT se
poate folosi pentru negarea unei expresii logice (de exemplu expresii de tipul NOT coloana =
. . . ) sau pentru negarea operatorilor SQL n modul urmtor:
NOT BETWEEN AND
NOT IN
NOT LIKE
IS NOT NULL
De exemplu, pentru a selecta cadrelor didactice al cror nume nu ncepe cu litera 'G' se
folosete interogarea:
SQL> SELECT nume, prenume
FROM profesor
WHERE nume NOT LIKE 'G%';
NUME
---MARIN
IONESCU
ALBU
VOINEA
STANESCU

PRENUME
------VLAD
VERONICA
GHEORGHE
MIRCEA
MARIA

Pentru a selecta cadrele didactice care au primit prima se folosete interogarea:


SQL> SELECT nume, prenume
FROM profesor
WHERE prima IS NOT NULL;
NUME
----

PRENUME
-------

GHEORGHIU
GEORGESCU
ALBU
VOINEA
STANESCU

TEFAN
CRISTIANA
GHEORGHE
MIRCEA
MARIA

Not: Negarea unei expresii logice care are valoarea Necunoscut va avea tot valoare
Necunoscut. De exemplu, o expresie de genul
NOT coloana = NULL
va avea valoarea Necunoscut, urmtoarea interogare nereturnnd deci nici o nregistrare:
SQL> SELECT nume, prenume
FROM profesor
WHERE NOT prima = NULL;
Condiii multiple de interogare (operatorii AND i OR)
Operatorii AND i OR pot fi utilizai pentru a realiza interogri ce conin condiii multiple.
Expresia ce conine operatorul AND este adevrat atunci cnd ambele condiii sunt adevrate
iar expresia ce conine operatorul OR este adevrat atunci cnd cel puin una din condiii este
adevrat. In aceeai expresie logic se pot combina operatorii AND i OR dar operatorul
AND are o preceden mai mare dect operatorul OR, deci este evaluat mai nti.
n momentul evalurii unei expresii, se calculeaz mai nti operatorii n ordinea precedenei,
de la cel cu precedena cea mai mare pn la cel cu precedena cea mai mic. Dac operatorii
au preceden egal atunci ei sunt calculai de la stnga la dreapta.
Precedena operatorilor, pornind de la cea mai mare la cea mai mic este urmtoarea:
toi operatorii de comparaie si operatorii SQL >, <, <=, >=, =, <>,
BETWEEN. . .AND. . ., IN, LIKE, IS NULL;
operatorul NOT;
operatorul AND;
operatorul OR.
Pentru a schimba prioritatea operatorilor se folosesc parantezele.
In exemplele de mai jos se observ modul de evaluare a expresiei n funcie de precedena
operatorilor, precum i modul n care parantezele pot schimba acest lucru.
SQL> SELECT nume, prenume, salariu, cod_catedra
FROM profesor
WHERE salariu>2000 AND cod_catedra=10 OR cod_catedra=20;
este echivalent cu:
SQL> SELECT nume, prenume, salariu, cod_catedra
FROM profesor
WHERE (salariu>2000 AND cod_catedra=10) OR cod catedra=20;
NUME
---GHEORGHIU
MARIN

PRENUME
------TEFAN
VLAD

SALARIU
------3000
2500

COD-CATEDRA
----------10
20

ALBU
STNESCU

GHEORGHE
MARIA

2200
1200

20
20

SQL> SELECT nume, prenume, salariu, cod_catedra


FROM profesor
WHERE salariu>2000 AND (cod_catedra=10 OR cod catedra=20);
NUME
---GHEORGHIU
MARIN
ALBU

PRENUME
------TEFAN
VLAD
GHEORGHE

SALARIU
------3000
2500
2200

COD-CATEDRA
----------10
20
20

5.1.12. Funcii
Funciile sunt o caracteristic important a SQL si sunt utilizate pentru a realiza calcule
asupra datelor, a modifica date, a manipula grupuri de nregistrri, a schimba formatul datelor
sau pentru a converti diferite tipuri de date. Funciile se clasific n dou tipuri:
1. Funcii referitoare la o singur nregistrare:
funcii caracter;
funcii numerice;
funcii pentru data calendaristic si or;
funcii de conversie;
funcii diverse.
2. Funcii referitoare la mai multe nregistrri:
funcii totalizatoare sau funcii de grup.
Diferena dintre cele dou tipuri de funcii este numrul de nregistrri pe care acioneaz:
Funciile referitoare la o singur nregistrare returneaz un singur rezultat pentru fiecare rnd
al tabelului, pe cnd funciile referitoare la mai multe nregistrri returneaz un singur rezultat
pentru fiecare grup de nregistrri din tabel.
O observaie importanta este faptul c dac se apeleaz o funcie SQL ce are un argument egal
cu valoarea Null, atunci n mod automat rezultatul va avea valoarea Null. Singurele funcii
care nu respect aceast regul sunt: CONCAT, DECODE, DUMP, NVL i REPLACE.
In continuare vom exemplifica i prezenta, la modul general, cele mai importante funcii.
5.1.13. Funcii referitoare la o singur nregistrare
Sunt funcii utilizate pentru manipularea datelor individuale. Ele pot avea unul sau mai multe
argumente i returneaz o valoare pentru fiecare rnd rezultat n urma interogrii.
Funcii caracter
Aceste funcii au ca argumente date de tip caracter i returneaz date de tip VARCHAR2,
CHAR sau NUMBER.
Cele mai importante funcii caracter sunt:
CONCAT- returneaz un ir de caractere format prin concatenarea a dou iruri;
LOWER - modific toate caracterele n litere mici;
UPPER - modific toate caracterele n litere mari;
LENGTH - returneaz numrul de caractere dintr-un anumit cmp;

REPLACE - caut intr-un ir de caractere un subir iar dac l gsete l va nlocui cu un


alt ir de caractere;
SUBSTR - returneaz un subir de caractere avnd o anumit lungime ncepnd cu o
anumit poziie;
TRANSLATE - caut ntr-un prim ir de caractere fiecare dintre caracterele specificate
ntr-un al 2-lea ir, caracterele gsite fiind nlocuite de cele specificate ntr-un al 3-lea ir.

Exemplu de utilizare a funciei LENGTH:


SQL> SELECT LENGTH (nume)
FROM profesor;
LENGTH(NUME)
-----------9
5
9
7
4
6
8
Spre deosebire de alte funcii, funciile caracter pot fi imbricate pn la orice adncime. Dac
funciile sunt imbricate ele sunt evaluate din interior spre exterior. Pentru a determina, de
exemplu, de cte ori apare caracterul 'A' n cmpul nume vom folosi interogarea:
SQL> SELECT nume, LENGTH (nume)-LENGTH (TRANSLATE
(nume,'DA','D'))
FROM profesor;
NUME
---GHEORGHIU
MARIN
GEORGESCU
IONESCU
ALBU
VOINEA
STANESCU

'A'
--0
1
0
0
1
1
1

Not: n exemplul de mai sus, funcia TRANSLATE (nume, 'DA', 'D') va cuta n coloana
nume primul caracter (caracterul 'D') din cel de-al doilea argument al funciei (irul de
caractere 'DA') i l va nlocui cu primul caracter (adic tot cu caracterul 'D') din cel de-al
treilea argument al funciei (irul de caractere 'D'), apoi va cuta cel de-al doilea caracter,
adic caracterul 'A', i l va terge din cmpul nume deoarece acesta nu are caracter
corespondent n cel de-al treilea argument al funciei. Am folosit acest artificiu deoarece irul
de caractere vid este echivalent cu valoarea Null, deci funcia TRANSLATE (nume, 'A', ' ') ar
fi nlocuit toate valorile cmpului nume cu valoarea Null.
Funcii numerice sau aritmetice

Aceste funcii au ca argumente date numerice i returneaz tot valori numerice. Marea
majoritate a acestor funcii au o precizie de 38 de zecimale (COS, EXP, LN, LOG, SIN
SQRT, TAN au ns o precizie de 36 de zecimale).
Dintre cele mai importante funcii amintim:
ROUND - rotunjete valorile la un anumit numr de poziii zecimale;
TRUNC - trunchiaz valorile la un anumit numr de poziii zecimale;
CEIL
- returneaz cel mai mic ntreg mai mare sau egal cu o anumit valoare;
FLOOR - returneaz cel mai mare ntreg mai mic sau egal cu o anumit valoare;
SIGN
- returneaz valoarea -l dac valoarea argumentului primit este mai mic dect
0, returneaza valoarea l dac valoarea argumentului primit este mai mare
dect 0 i 0 dac valoarea argumentului primit este egal cu 0;
SQRT
- returneaz rdcina ptrat a argumentului primit;
ABS
- returneaz valoarea absolut a argumentului primit;
POWER - returneaz valoarea unui numr ridicat la o anumit putere;
MOD
- returneaz restul mpririi a dou numere;
- alte funcii matematice cum ar fi: LOG, SIN, TAN, COS, EXP, LN.
Funcii pentru dat calendaristic i or
In Oracle datele de tip dat calendaristic sunt reprezentate sub un format numeric
reprezentnd: ziua, luna, anul, ora, minutul, secunda i secolul. Oracle poate manevra date
calendaristice de la l ianuarie 4712 . Cr pn la 31 decembrie 4712 d. Cr. Modul implicit de
afiare i introducere este sub forma: DD-MON-W (ex. '31-Dec-99'). Aceasta categorie de
funcii opereaz pe valori de tip dat calendaristic, rezultatul returat fiind tot de tip data
calendaristic, excepie fcnd funcia MONTHS BETWEEN care retureaz o valoare
numeric.
Cele mai des ntlnite funcii sunt:
ADD_MONTH - returneaz o dat calendaristic format prin adugarea la data
calendaristic specificat a unui anumit numr de luni;
LAST_DAY - ntoarce ca rezultat ultima zi a unei luni specificate;
MONTHS_ BETWEEN returneaz numrul de luni dintre dou date calendaristice
specificate;
NEXT_DAY - returneaz prima data calendaristic ulterioar datei calendaristice
specificate;
SYSDATE - ntoarce ca rezultat data calendaristic a sistemului.
Asupra datelor calendaristice se pot realiza operaii aritmetice, cum ar fi scderea sau
adunarea, modul lor de funcionare fiind ilustrat n tabelul de mai jos:
Tip
Operaie Tip operand
Tip
Descriere
operand
rezultat
data
+/numr
data Adaug/scade un numr de zile la o dat
calendaristic
data
+/numr/24
data Adaug/scade un numr de ore la o dat
calendaristic
data
Vnumai/ 1440 data Adaug/scade un numr de minute la o
dat calendaristic
data
+/numr/86400 data Adaug/scade un numr de secunde la o
data calendaristic

Tip
Operaie Tip operand Tip
operand
rezultat
data

data

Descriere

Scade dou date calendaristice rezultnd


diferena n numr de zile. Dac al doilea
numar operand este mai mare dect primul
zile numrul de zile rezultat este reprezentat de
o valoare negativ

De asemenea, mai exist funciile ROUND i TRUNC care rotunjesc, respectiv trunchiaz
data calendaristic. Aceste funcii sunt foarte folositoare atunci cnd se dorete compararea
datelor calendaristice care au ora diferit. Exemplul urmtor rotunjete data de natere a
cadrelor didactice n funcie de an:
SQL> SELECT ROUND(data nast,'YEAR') 'DATA'
FROM profesor;
DATA
---0l-JAN-47
0l-JAN-45
01-JAN 52
0l-JAN-66
0l-JAN-70
Funcii de conversie
In general expresiile nu pot conine valori aparinnd unor tipuri de date diferite. De exemplu,
nu se poate nmuli 3 cu 7 i apoi aduna "ION". Prin urmare se realizeaz anumite conversii,
care pot fi implicite sau explicite.
Conversiile implicite se realizeaz n urmtoarele cazuri:
atribuiri de valori unei coloane (folosind comenzile INSERT sau UPDATE) sau
atribuirilor de valori unor argumente ale unei funcii;
evaluri de expresii.
Pentru atribuiri, programul Oracle efectueaz n mod implicit urmtoarele conversii de tip:
VARCHAR2 sau CHAR la NUMBER
VARCHAR2 sau CHAR la DATE
VARCHAR2 sau CHAR la ROWI D
NUMBER, DATE sau ROWI D la VARCHAR2
Conversia la atribuire reuete in cazul n care Oracle poate converti tipul valorii atribuite la
tipul destinaiei atribuirii.
Pentru evaluarea expresiilor, se realizeaz n mod implicit urmtoarele conversii de tip:
VARCHAR2 sau CHAR la NUMBER
VARCHAR2 sau CHAR la DATE
VARCHAR2 sau CHAR la ROWI D
De exemplu, pentru urmtoarea interogare se realizeaz conversia n mod implicit a constantei
de tip CHAR, '10', la tipul NUMBER.
SQL> SELECT salariu + '10'

FROM profesor;
SALARIU+'10'
-----------3010
2510
2810
1510
2210
1210
1210
Pentru conversiile explicite de tip, SQL pune la dispoziie mai multe funcii de conversie, de
la un anumit tip de dat la altul, dup cum este artat n tabelul de mai jos.
Tip convertit

CHAR

NUMBER

DATE

RAW

ROWID

TO_DATE

HEXTORAW

CHARTOROWD

Tip iniial
TO_NUMBER

CHAR

NUMBER
DATE
RAW
RAWID

TO_CHAR
TO_CHAR
RAWTOHEX
RAWIDTOCHAR

TO_DATE(nrJ)
TO_DATE(dat,J)
-

Cele mai uzuale funcii sunt:


TO_ CHAR - convertete un numr sau o dat calendaristic ntr-un ir de caractere;
T0_ NUMBER - convertete un ir de caractere alctuit din cifre ntr-o valoare numeric;
T0_ DATE - convertete un ir de caractere sau un numr ce reprezint o dat
calendaristic la o valoare de tip dat calendaristic. De asemenea poate converti o dat
calendaristic la un numr ce reprezint data calendaristic Iulian.
Pentru a realiza conversia, aceste funcii folosesc anumite mti de format.
Urmtorul exemplu va prelua data i ora curent a sistemului din funcia SYSDATE i o va
formata ntr-o dat scris pe litere ce va conine i ora n minute i secunde:
SQL> SELECT TO_CHAR(SYSDATE,'DD MONTH YYYY HH24:MI:SS') data
FROM dual;
DATA
---------------------------17 MAY
2000 17:03:38
Funcii diverse
Acestea sunt n general funcii care accept ca argumente orice tip de dat. Cele mai utilizate
sunt:
DECODE - Aceasta este una dintre cele mai puternice funcii SQL. Practic, aceasta
faciliteaz interogrile condiionate, acionnd ca o comand 'if-then-else1 sau 'case' dintrun limbaj procedural. Pentru fiecare nregistrare se va evalua valoarea din coloana testat
i se va compara pe rnd cu fiecare valoare declarat n cadrul funciei. Dac se gsesc
valori egale, atunci funcia va returna o valoare aferent acestei egaliti, declarat tot n
cadrul funciei. Se poate specifica ca, n cazul n care nu se gsesc valori egale, funcia s

ntoarc o anumit valoare. Dac acest lucru nu se specific funcia va ntoarce valoarea
Null.
GREATEST - returneaz cea mai mare valoare dintr-o list de valori;
LEAST -returneaz cea mai mic valoare dintr-o list de valori;
VSIZE - returneaz numrul de bytes pe care este reprezentat intern o anumit coloan;
USER - returneaz numele utilizatorului curent al bazei de date;
DUMP - returneaz o valoare ce conine codul tipului de dat, lungimea n bytes, precum
si reprezentarea intern a unei expresii.
Exemplul urmtor utilizeaz funcia DECODE pentru a returna o cretere a salariului cadrelor
didactice cu grad de profesor, confereniar i lector, restul salariilor rmnnd nemodificate:
SQL> SELECT nume, grad, salariu,
DECODE(grad,'PROF',salariu*1.2,CONF,salariu*1.15,
'LECT', salariu*1.1, salariu) "Salariu modificat"
FROM profesor;
NUME
---GHEORGHIU
MARIN
GEORGESCU
IONESCU
ALBU
VOINEA
STANESCU

GRAD SALARIU
---- ------PROF 3000
PROF 2500
CONF 2800
ASIST 3500
LECT 2200
ASIST 1200
ASIST 1200

Salariu modificat
-----------------3600
3000
3220
1500
2420
1200
1200

5.1.14. Functii referitoare la mai multe nregistrari


Aceste funii se mai numesc si funcii totalizatoare sau funcii de grup. Spre deosebire de
funciile referitoare la o singur nregistrare, funciile de grup opereaz pe un set ele mai
multe nregistrri i returneaz un singur rezultat pentru fiecare grup. Dac nu este utilizat
clauza GROUP BY, ce grupeaz nregistrrile dup un anumit criteriu, tabela este considerat
ca un singur grup si se va returna un singur rezultat.
COUNT - determin numrul de nregistrri care ndeplinesc o anumit condiie;
MAX - determin cea mai mare valoare dintr-o coloan;
MIN - determin cea mai mic valoare dintr-o coloan;
SUM - returneaz suma tuturor valorilor dintr-o coloan;
AVG - calculeaz valoarea medie a unei coloane;
STDDEV - determin abaterea sau deviaia standard a unei coloane numerice;
VARIANCE - returneaz dispersia, adic ptratul unei deviaii standard pentru o coloan
numeric.
De exemplu:
SQL> SELECT MIN(salariu.),MAX(salariu),AVG(salariu),COUNT(*)
FROM profesor;
MIN(SALARIU)
-----------1200

MAX(SALARIU)
-----------3000

AVG(SALARIU)
-----------2057.1429

COUNT(*)
-------7

Toate funciile de mai sus, cu excepia funciei COUNT, opereaz asupra unei coloane sau
unei expresii, care este specificat ca parametri al funciei. In cazul funciei COUNT,
argumentul acesteia nu conteaz, de obicei utilizndu-se ca argument simbolul *.
Not: Toate funciile de mai sus ignor valorile Null, excepie fcnd funcia COUNT. Pentru
a include n calcule i nregistrrile cu valoarea Null se poate folosi funcia NVL.
Dac nu este utilizat clauza GROUP BY, n lista de atribute ale comenzii SELECT nu pot
apare funcii de grup alturi de nume de coloane sau alte expresii care iau valori pentru fiecare
nregistrare n parte. De exemplu, urmtoarea interogare va genera o eroare:
SQL> SELECT nume, KIN(salariu)
FROM profesor;
ERROR at line 1:
ORA-00937: not a single-group group function
5.1.15 Pseudo-coloana ROWNUM
ROWNUM este o pseudo-coloan care numeroteaz rndurile selectate de o interogare.
Astfel, pentru primul rnd selectat pseudo-coloana ROWNUM are valoarea l, pentru al doilea
rnd are valoarea 2, s.a.m.d. De exemplu, pentru a limita rndurile selectate de o interogare la
maxim 5, se folosete urmtoarea comand:
SELECT*
FROM profesor
WHERE ROWNUM<6;
Deoarece pscudo-coloana ROWNUM numeroteaz rndurile selectate, valorile sale vor trebui
s nceap tot timpul cu 1. Deci dac n exemplul de mai sus condiia ar fi ROWNUM > 6 sau
ROWNUM = 6 interogarea nu ar selecta nici un rnd deoarece n acest caz condiia ar fi
ntotdeauna fals. Pentru primul rnd accesat de interogare ROWNOM va avea valoarea l,
condiia nu este ndeplinit i deci rndul nu va fi selectat. Pentru al doilea rnd accesat de
interogare ROWNUM va avea din nou valoarea l, condiia nu este ndeplinit nici n acest caz
i deci nici acest rnd nu va fi selectat, .a.m.d. Prin urmare nici unul din rndurile accesate nu
vor satisface condiia coninut de interogare.
Pseudo-coloana ROWNUM se poate folosi att n condiia unor comenzi UPDATE sau
DELETE ct i pentru a atribui valori unice unei coloane, ca n exemplul de mai jos:
UPDATE vnzri
SET cod = ROWNUM;
Valoarea pseudo-coloanei ROWNUM este atribuit unui rnd nainte ca acesta s fie sortat
datorit unei clauze ORDER BY, de aceea valorile pseudo-coloanei nu reprezint ordinea de
sortare. De exemplu:
SQL> SELECT nume,
prenume,
FROM profesor
ORDER BY
salariu;
NUME
---VOINEA
STANESCU

PRENUME
------MIRCEA
MARIA

ROWNUM
-----6
7

ROWNUM

IONESCU
ALBU
MARIN
GEORGESCU
GHEORGHIU

VERONICA
GHEORGHE
VLAD
CRISTIANA
TEFAN

4
5
2
3
1

5.1.16. Clauza GROUP BY


Clauza GROUP BY este utilizat pentru a mpri din punct de vedere logic un tabel n
grupuri de nregistrri. Fiecare grup este format din toate nregistrrile care au aceeai valoare
n cmpul sau grupul de cmpuri specificate n clauza GROUP BY. Unele nregistrri pot fi
excluse folosind clauza WHERE nainte ca tabelul s fie mprit n grupuri.
Clauza GROUP BY se folosete de obicei mpreun cu funciile de grup, acestea returnnd
valoarea calculat pentru fiecare grup n parte. In cazul folosirii clauzei GROUP BY, toate
expresiile care apar n lista atributelor comenzii SELECT trebuie s aib o valoare unic
pentru fiecare grup, de aceea orice coloan sau expresie din aceast list care nu este o funcie
de grup trebuie s apar n clauza GROUP BY.
SQL> SELECT grad, AVG (salariu)
FROM profesor
GROUP BY grad;
GRAD
---ASIST
CONF
LECT
PROF

AVG(SALARIU)
----------1300
2800
2200
2750

SQL> SELECT grad, MAX(salariu)


FROM profesor
WHERE prima IS NOT NULL
GROUP BY grad;
GRAD
---ASIST
CONF
LECT
PROF

MAX(SALARIU)
-----------1200
2800
2200
3000

Urmtoarea interogare va genera o eroare deoarece n lista atributelor comenzii SELECT


exist o coloan (nume) care nu apare n clauza GROUP BY:
SQL >SFLECT nume, MIN (salariu)
FROM profesor
GROUP BY grad;
ERROR at line 1:
ORA-00979: not a GROUP BY expression

Comanda de mai sus este invalid deoarece coloana nume are valori individuale pentru
fiecare nregistrare, n timp ce MIN (salariu) are o singuri valoare pentru un grup.
Clauza GROUP BY permite apelarea unei funcii de grup n alt funcie de grup. In exemplul
urmtor, funcia AVG retumeaz salariul mediu pentru fiecare grad didactic, iar funcia MAX
remrneaz maximul dintre aceste salarii medii.
SQL> SELECT MAX(AVG(salariu))
FROM profesor
GROUP BY grad;
5.1.17. Clauza HAVING
Clauza HAVING este tot o clauz de filtrare ca i clauza WHERE. Totui, n timp ce clauza
WHERE determin ce nregistrri vor fi selecionate dintr-un tabel, clauza HAVING
determin care dintre grupurile rezultate vor fi afiate dup ce nregistrrile din tabel au fost
grupate cu clauza GROUP BY. Cu alte cuvinte, pentru a exclude grupuri de nregistrri se
folosete clauza HAVING iar pentru a exclude nregistrri individuale se folosete clauza
WHERE.
Clauza HAVING este folosit numai dac este folosit i clauza GROUP BY. Expresiile
folosite ntr-o clauz HAVING trebuie s aib o singur valoare pe grup.
Atunci cnd se folosete clauza GROUP BY, clauza WHERE se utilizeaz pentru eliminarea
nregistrrilor ce nu se doresc a fi grupate. Astfel, urmtoarea interogare este invalid
deoarece clauza WHERE ncearc s exclud giupuri de nregistrri i nu anumite nregistrri:
SQL> SELECT grad, AVG(salariu)
FROM profesor
WHERE AVG(salariu)>2000
GROUP BY grad;
ERROR:
ORA-00934: group function is not allowed here
Pentru a exclude gradul didactic pentru care media de salariu nu este mai mare dect 2000 se
folosete urmtoarea comand SELECT cu clauza HAVING:
SQL> SELECT grad, AVG(salariu)
FROM profesor
GROUP BY grad
HAVING AVG(salariu)>2000;
GRAD
---CONF
LECT
PROF

AVG(SALARIU)
-----------2800
2200
2750

Urmtoarea interogare exclude nti cadrele didactice care nu au salariu mai mare dect 2500
dup care exclude gradul didactic pentru care media de salariu nu este mai mare dect 2800.
SQL> SELECT grad, AVG(salariu)
FROM profesor
WHERE salariu > 2500

GROUP BY grad
HAVING AVG(salariu) > 2800;
GRAD
---PROF

AVG(SALARIU)
----------3000
5.1.18. Regasirea datelor din doua sau mai multe tabele

O jonciune este o interogare care regsete nregistrri din dou sau mai multe tabele.
Capacitatea de a realiza o jonciune intre dou sau mai multe tabele reprezint una dintre cele
mai puternice faciliti ale unui sistem relaional. Legtura dintre nregistrrile tabelelor se
realizeaz prin existena unor cmpuri comune caracterizate prin domenii de definiie
compatibile (chei primare sau strine). Pentru realizarea unei jonciuni se folosete comanda
SELECT, preciznd n clauza FROM numele tabelelor utilizate, iar n clauza WHERE
criteriul de compunere.
Produsul a dou sau mai multe tabele.
In cazul n care n interogare se specific mai multe tabele i nu este inclus o clauz
WHERE, interogarea va genera produsul cartezian al tabelelor. Acesta va conine toate
combinaiile posibile de nregistrri din tabelele componente. Astfel, produsul cartezian a
dou tabele care conin 100, respectiv 50 de nregistrri va avea dimensiunea de 5.000 de
nregistrri.
De exemplu, s considerm tabela CATEDRA cu urmtoarele 4 nregistrri:
COD_CATEDRA
----------10
20
30
40

NUME
---------INFORMATICA
ELECTRONICA
AUTOMATICA
FINANE

PROFIL
-----TEHNIC
TEHNIC
TEHNIC
ECONOMIC

Atunci urmtoarea interogare va genera produsul cartezian al tabelelor, adic va avea ca


rezultat 7 x 4 = 28 de rnduri ce vor conine toate combinaiile posibile de nregistrri din cele
dou tabele:
SOL> SELECT *
FROM profesor, catedra;
Dac n lista de atribute ale comenzii SELECT sunt specificate coloanele selectate, atunci
numele acestora trebuie s fie unic n cadrul tuturor tabelelor. Dac exist un nume de coloan
care apare n mai mult de un tabel, atunci, pentru evitarea ambiguitii, trebuie specificat i
tabelul din care face parte coloana n cauz. De exemplu, n urmtoarea interogare pentru
coloanele cod_catedra i nume trebuie specificate tabelele din care fac parte:
SQL> SELECT profesor.nume, prenume, catedra.cod_catedra,
catedra.nume
FROM profesor, catedra;

NUME
---GHEORGHIU
MARIN
GEORGESCU
IONESCU
ALBU
VOINEA
STANESCU
GHEORGHIU
MARIN
GEORGESCU
IONESCU
ALBU
VOINEA
STANESCU
GHEORGHIU
MARIN
GEORGESCU
IONESCU
ALBU
VOINEA
STANESCU
GHEORGHIU
MARIN
GEORGESCU
IONESCU
ALBU
VOINEA
STANESCU

PRENUME
------TEFAN
VLAD
CRISTIANA
VERONICA
GHEORGHE
MIRCEA
MARIA
TEFAN
VLAD
CRISTIANA
VERONICA
GHEORGHE
MIRCEA
MARIA
TEFAN
VLAD
CRISTIANA
VERONICA
GHEORGHE
MIRCEA
MARIA
TEFAN
VLAD
CRISTIANA
VERONICA
GHEORGHE
MIRCEA
MARIA

COD CATEDRA
----------10
10
10
10
10
10
10
20
20
20
20
20
20
20
30
30
30
30
30
30
30
40
40
40
40
40
40
40

NUME
---INFORMATICA
INFORMATICA
INFORMATICA
INFORMATICA
INFORMATICA
INFORMATICA
INFORMATICA
ELECTRONICA
ELECTRONICA
ELECTRONICA
ELECTRONICA
ELECTRONICA
ELECTRONICA
ELECTRONICA
AUTOMATICA
AUTOMATICA
AUTOMATICA
AUTOMATICA
AUTOMATICA
AUTOMATICA
AUTOMATICA
FINANE
FINANE
FINANE
FINANE
FINANE
FINANE
FINANE

In general, pentru a scurta textul comenzii, n astfel de cazuri se folosesc de obicei alias-uri
pentru numele tabelelor, care pot fi folosite n interogare. Astfel interogarea de mai sus se mai
poate scrie:
SQL> SELECT p.nume, prenume, c.cod_catedra, c.nume
FROM profesor p,catedra c;
In general, produsul cartezian este rar folosit, avnd o utilitate practic redus.
Jonciuni
Pentru a realiza o jonciune ntre doua sau mai multe tabele se utilizeaz clauza WHERE a
interogrilor pe aceste tabele, n funcie de criteriul de compunere, se disting mai multe tipuri
de jonciuni:
1. jonciuni echivalente (EQUI-JOIN) sau jonciuni interne (INNER JOIN)
2. jonciuni neechivalente
3. jonciuni externe (OUTER JOIN)
4. autojonciuni
1. Jonciunile echivalente

O echijonciune conine operatorul egalitate (=) n clauza WHERE, combinnd nregistrrile


din tabele care au valori egale pentru coloanele specificate.
De exemplu, pentru a afia cadrele didactice i numele catedrei din care acestea fac parte se
combin nregistrrile din cele dou tabele pentru care codul catedrei este acelai.
SQL> SELECT p.nume, p.prenume, c.nume
FROM profesor p, catedra c
WHERE p.cod catedra=c.cod catedra;
NUME
---GHEORGHIU
IONESCU
VOINEA
MARIN
ALBU
VLAD
GHEORGHE

PRENUME
------TEFAN
VERONICA
MIRCEA
STANESCU
GEORGESCU
MARIA
CRISTIANA

NUME
---INFORMATICA
INFORMATICA
INFORMATICA
ELECTRONICA
ELECTRONICA
ELECTRONICA
AUTOMATICA

2. Jonciuni neechivalent
Jonciunile neechivalente sunt acelea care nu folosesc n clauza WHERE operatorul egal.
Operatorii cei mai utilizai n cazul jonciunilor neechivalente sunt: <, >, <=, >=, <>,
BETWEEN...AND....
Pentru a exemplifica un astfel de tip de jonciune considerm tabela gradsal ce conine
pragul minim i pragul maxim al salariului dintr-un anumit grad de salarizare:
GRAD SALARIZARE
--------------1
2
3
4
5

PRAG MIN
-------500
1501
2001
2501
3501

PRAG MAX
-------1500
2000
2500
3500
10000

Evident, ntre tabelele profesor si gradsal nu are sens definirea unei jonciuni echivalente
deoarece nu exist o coloan din tabela profesor creia s-i corespund o coloan din tabela
gradsal. Exemplul urmtor ilustreaz definirea unei jonciuni neechivalente care evalueaz
gradul de salarizare a cadrelor didactice, prin ncadrarea salariului acestora ntr-un interval
stabilit de pragul minim si pragul maxim:
SQL> SELECT p.nume, p.grad, p.salariu, g.grad_salarizare
FROM profesor p, gradsal g
WHERE p.salariu BETWEEN g.prag_min AND g.prag_max;
NUME
---IONESCU
VOINEA
STANESCU
MARIN

GRAD
---ASIST
ASIST
ASIST
PROF

SALARIU
------1500
1200
1200
2500

GRAD SALARIZARE
--------------1
1
1
3

ALBU
LECT
GHEORGHIU PROF
GEORGESCU CONF

2200
3000
2800

3
4
4

3. Jonciuni externe
Dac ntr-o jonciune de tipul celor prezentate pn acum una sau mai multe nregistrri nu
satisfac condiia de compunere specificat n clauza WHERE, atunci ele nu vor aprea n
rezultatul interogrii. Aceste nregistrri pot apare ns dac se folosete jonciunea extern.
Jonciunea extern returneaz toate nregistrrile care satisfac condiia de jonciune plus acele
nregistrri dintr-un tabel ale cror valori din coloanele dup care se face legtura nu se
regsesc n coloanele corespunztoare ale nici unei nregistrri din celalalt tabel.
Pentru a realiza o jonciune extern ntre tabelele A i B ce returneaz toate nregistrrile
din tabela A se utilizeaz seninul ( + ) n dreapta tabelului B. Pentru fiecare nregistrare
din tabela A care nu satisface condiia de compunere pentru nici o nregistrare din tabela B,
se va crea n tabela B o nregistrare nul care va fi compus cu nregistrarea din tabela A.
Invers, pentru a realiza o jonciune extern ntre tabelele A i B ce returneaz toate
nregistrrile din tabela B, se utilizeaz semnul ( + ) in dreapta tabelului A.
In interogarea utilizat pentru a exemplifica jonciunea echivalent, se observ c au fost
selectate numai catedrele n care exist cadre didactice. Pentru a afia toate catedrele,
indiferent dac ele cuprind sau nu cadre didactice, se folosete urmtoarea interogare:
SQL> SELECT p.nume, p.prenume, c.nume
FROM profesor p, catedra c
WHERE p.cod catedra( + ) =c.cod catedra;
NUME
---GHEORGIU
IONESCU
VOINEA
MARIN
STANESCU
ALBU
GEORGESCU

PRENUME
------TEFAN
VERONICA
MIRCEA
VLAD
MARIA
GHEORGHE
CRISTIANA

NUME
---INFORMATICA
INFORMATICA
INFORMATICA
ELECTRONICA
ELECTRONICA
ELECTRONICA
AUTOMATICA
FINANE

Se observ c ultima nregistrare (ce corespunde catedrei de finane care nu are n


componen nici un cadru didactic) va avea coloanele corespunztoare primului tabel
completate cu Null.
Folosirea operatorului de jonciune extern are urmtoarele restricii:
1. Operatorul ( + ) poate fi plasat n oricare parte a condiiei din clauza WHERE, ns nu n
ambele pri. Tabelul de partea cruia este amplasat acest operator va crea nregistrri
nule care vor fi compuse cu nregistrrile din cellalt tabel care nu satisfac condiia de
compunere.
2. Dac tabelele A i B au condiii multiple de jonciune, atunci operatorul (+) trebuie
utilizat n toate aceste condiii.

3. Intr-o singur interogare nu se poate realiza o jonciune extern a unui tabel cu mai
multe tabele.
4. O condiie care conine operatorul (+) nu poate fi combinat cu o alt condiie ce
utilizeaz operatorul IN.
5. O condiie care conine operatorul ( + ) nu poate fi combinat cu o alt condiie prin
operatorul OR.
5. Auto-jonciuni
Auto-jonciunea reprezint jonciunea unui tabel cu el nsui. Pentru ca rndurile dintr-un
tabel s poat fi compuse cu rnduri din acelai tabel, n clauza FROM a interogrii numele
tabelului va apare de mai multe ori, urmat de fiecare dat de un alias.
De exemplu, pentru a selecta toate cadrele didactice care au un ef direct i numele acestui ef
se folosete urmtoarea auto-jonciune:
SQL> SELECT p.nume, p.prenume, s.nume, s.prenume
FROM profesor p, profesor s
WHERE p.sef=s.cod;
NUME
---MARIN
GEORGESCU
ALBU
VOINEA
IONESCU
STANESCU

PRENUME
------VLAD
CRISTIANA
GHEORGHE
MIRCEA
VERONICA
MARIA

NUME
--------GHEORGHIU
GHEORGHIU
GHEORGHIU
GHEORGHIU
GEORGESCU
IONESCU

PRENUME
------STEFAN
STEFAN
STEFAN
STEFAN
CRISTIANA
VERONICA

Autojonciunea poate fi folosit i pentru verificarea corectitudinii interne a datelor. De


exemplu, este puin probabil s existe dou cadre didactice care au cod diferit dar n schimb au
acelai nume, prenume i dat de natere. Pentru a verifica dac exist astfel de nregistrri se
folosete interogarea:
SQL> SELECT a.nume, a.prenume
FROM profesor a, profesor b
WHERE a.nume=b.nume AND a.prenume=b.prenume AND a.datanast= b.data-nast AND a.cod<>b.cod
5.1.19. Operatorii pentru mulimi
Operatorii de mulimi combin dou sau mai multe interogri, efectund operaii specifice
mulimilor: reuniune, intersecie, diferen. Aceti operatori se mai numesc i operatori
verticali deoarece combinarea celor dou interogri se face coloan cu coloan. Din acest
motiv, numrul total de coloane i tipurile de date ale coloanelor coresondente din cele
dou interogri trebuie s coincid:
Exist urmtorii operatori pentru mulimi:
1. UNION Returneaz rezultatele a dou sau mai multe interogri eliminnd toate
nregistrrile duplicat;

2. UNION ALL - Returneaz rezultatele a dou sau mai multe interogri incluznd
nregistrrile duplicat;
3. INTERSECT - Returneaz toate nregistrrile distincte gsite n ambele interogri;
4. MINUS - Returneaz toate nregistrrile distincte care se gsesc n prima interogare dar nu
n a doua interogare.
S considerm de exemplu urmtoarele interogri:
SQL> SELECT grad, salariu
FROM profesor
WHERE cod catedra = 10;
GRAD
---PROF
ASIST
ASIST

SALARIU
------3000
1500
1200

SQL> SELECT grad, salariu


FROM profesor
WHERE cod catedra = 20;
GRAD
---PROF
LECT
ASIST

SALARIU
------2500
2200
1200

In continuare exemplificm fiecare dintre operatorii pentru mulimi aplicai acestor interogri:
SQL> SELECT grad, salariu
FROM profesor
WHERE cod_catedra = 10
UNION
SELECT grad, salariu
FROM profesor
WHERE cod catedra = 20;
GRAD
---ASIST
ASIST
LECT
PROF
PROF

SALARIU
------1200
1500
2200
2500
3000

SQL> SELECT grad, salariu


FROM profesor
WHERE cod_ catedra = 10
UNION ALL
SELECT grad, salariu

FROM profesor
WHERE cod_catedra = 20;
GRAD
---PROF
ASIST
ASIST
PROF
LECT
ASIST

SALARIU
------3000
1500
1200
2500
2200
1200

SQL> SELECT grad, salariu


FROM profesor
WHERE cod_catedra = 10
INTERSECT
SELECT grad, salariu
FROM profesor
WHERE cod_catedra = 20;
GRAD
---ASIST

SALARIU
------1200

SQL> SELECT grad, salariu


FROM profesor
WHERE cod catedra = 10
MINUS
SELECT grad, salariu
FROM profesor
WHERE cod catedra = 20;
GRAD
---ASIST
PROF

SALARIU
------1500
3000

Exist urmtoarele reguli de folosire a operatorilor pentru mulimi:


interogrile trebuie s conin acelai numr de coloane;
coloanele corespondente trebuie s aib acelai tip de dat;
n rezultat vor aprea numele coloanelor din prima interogare, nu cele din a doua
interogare chiar dac aceasta folosete alias-uri, de exemplu:
SQL> SELECT cod
FROM profesor
MINUS
SELECT ef
FROM profesor;

COD

--101
104
105
106

clauza ORDER BY poate fi folosit o singur dat ntr-o interogare care folosete
operatori de mulimi; atunci cnd se folosete, ea trebuie poziional la sfritul comenzii;
de exemplu:

SQL> SELECT grad, salariu


FROM profesor
WHERE cod_catedra = 10
UNION
SELECT grad, salariu
FROM profesor
WHERE cod catedra = 20
ORDER BY 2;
GRAD
---ASIST
ASIST
LECT
PROF
PROF

SALARIU
------1200
1500
2200
2500
3000

operatorii pentru mulimi pot fi utilizai n subinterogari;


pentru a modifica ordinea de execuie este posibil utilizarea parantezelor, de exemplu:
SQL> SELECT grad
FROM profesor
WHERE cod-catedra = 10
INTERSECT
SELECT grad
FROM profesor
WHERE cod_catedra = 20
UNION
SELECT grad
FROM profesor
WHERE cod_catedra = 30;
GRAD
---ASIST
CONF
PROF
SQL> SELECT grad

FROM profesor
WHERE cod_catedra = 10
INTERSECT
(SELECT grad
FROM profesor
WHERE cod_catedra = 20
UNION
SELECT grad
FROM profesor
WHERE cod_catedra = 30);
GRAD
---ASIST
PROF
5.1.20. Subinterogri i operatorii ANY, ALL, EXISTS
O subinterogare este o comand SELECT inclus n alt comand SELECT. Rezultatele
subinterogrii sunt transmise celeilalte interogri i pot aprea n cadrul clauzelor WHERE,
HAVING sau FROM. Subinterogrile sunt utile pentru a scrie interogri bazate pe o condiie
n care valoarea de comparaie este necunoscut. Aceast valoare poate fi aflat folosind o
subinterogare. De exemplu:
SELECT coloane
FROM tabel
WHERE coloana = (SELECT coloane
FROM tabel
WHERE condiie).
Subinterogarea, denumit si interogare interioar (inner query), genereaz valorile pentru
condiia de cutare a instruciunii SELECT care o conine, denumit interogare exterioar
(outer query). Instruciunea SELECT exterioar depinde de valorile generate de ctre
interogarea interioar. In general, interogarea interioar se execut prima i rezultatul acesteia
este utilizat n interogarea exterioar. Rezultatul interogrii exterioare depinde de numrul
valorilor returnate de ctre interogarea interioar. In acest sens, putem distinge:
1. Subinterogri care returneaz un singur rnd;
2. Subinterogri care returneaz mai multe rnduri.
Din punct de vedere al ordinii de evaluare a interogrilor putem clasifica subinterogrile n:
1. Subinterogri simple - n care interogarea interioar este evaluat prima, independent de
interogarea exterioar (interogarea interioar se execut o singur dat);
2. Subinterogri corelate - n care valorile returnate de interogarea interioar depind de
valorile returnate de interogarea exterioar (interogarea interioar este evaluat pentru
fiecare nregistrare a interogrii exterioare).
Subinterogrile sunt ndeosebi utilizate atunci cnd se dorete ca o interogare s regseasc
nregistrri dintr-o tabel care ndeplinesc o condiie ce depinde la rndul ei de valori din

aceeai tabel.
Not: Clauza ORDER BY nu poate fi utilizat ntr-o subinterogare. Regula este c poate
exista doar o singur clauz ORDER BY pentru o comand SELECT i, dac este specificat,
trebuie s fie ultima clauz din comanda SELECT. Prin urmare, clauza ORDER BY nu poate
fi specificat dect in interogarea cea mai din exterior.
Subinterogri care returneaz un singur rand
In acest caz condiia, din clauza WHERE sau HAVING a interogrii exterioare utilizeaz
operatorii: =, <, <=, >, >=, <> care opereaz asupra unei subinterogri ce returneaz o singur
valoare. Interogarea interioar poate conine condiii complexe formate prin utilizarea
condiiilor multiple de interogare cu ajutorul operatorilor AND i OR sau prin utilizarea
funciilor agregat.
Urmtoarea interogare selecteaz cadrele didactice care au salariul cel mai mic. Salariul
minim este determinat de o subinterogare ce returneaz o singur valoare.
SQL> SELECT nume, prenume, salariu
FROM profesor
WHERE salariu = (SELECT MIN (salariu)
FROM profesor);
NUME
PRENUME
SALARIU
---------------VOINEA
MIRCEA
1200
STANESCU MARIA
1200
Procesul de evaluare al acestei interogri se desfoar astfel:
Se evalueaz n primul rnd interogarea interioar:
Valoarea obinut este MIN ( salariu ) = 1 200
Rezultatul evalurii interogrii interioare devine condiie de cutare pentru interogarea
exterioar i anume:
SQL> SELECT nume, prenume, salariu
FROM profesor
WHERE salariu = 1200;
n cazul n care interogarea interioar nu ntoarce nici o nregistrare, interogarea exterioar nu
va selecta la rndul ei nici o nregistrare.
Not: Dac se utilizeaz operatorii: =, <, <=, >, >=, <> n condiia interogrii exterioare,
atunci interogarea interioar trebuie n mod obligatoriu s returneze o singur valoare. n caz
contrar va aprea un mesaj de eroare, ca n exemplul urmtor:
SQL> SELECT nume, prenume, salariu
FROM profesor
WHERE salariu = (SELECT MIN (salariu)
FROM profesor
GROUP BY grad);

ERROR:
ORA-01427: single-row subquery returns more than one row
Subinterogirile pot fi folosite nu numai n clauza WHERE a interogrii exterioare, ci i n
clauza HAVING. Urmtoarea interogare afieaz toate gradele didactice pentru care salariul
minim este mai mare dect salariul mediu al tuturor cadrelor didactice.
SQL> SELECT grad
FROM profesor
GROUP BY grad
HAVING min(salariu)>(SELECT avg(salariu)
FROM profesor);
GRAD
---CONT
LECT
PROF
Subinterogri care returneaz mai multe rnduri
In cazul cnd interogarea ntoarce mai multe rnduri nu mai este posibil folosirea
operatorilor de comparaie. In locul acestora se folosete operatorul IN, care ateapt o list de
valori i nu doar una.
Urmtoarea interogare selecteaz pentru fiecare grad didactic acele persoane care au salariul
minim. Salariul minim pentru fiecare grad didactic este aflat printr-o subinterogare, care,
evident, va ntoarce mai multe rnduri:
SQL> SELECT nume, salariu, grad
FROM profesor
WHERE (salariu, grad) IN
(SELECT MIN (salariu), grad
FROM profesor
GROUP BY grad)
ORDER BY salariu;
NUME
---VOINEA
STANESCU
ALBU
MARIN
GEORGESCU

SALARIU
------1200
1200
2200
2500
2800

GRAD
---ASIST
ASIST
LECT
PROF
CONF

Not: Spre deosebire de celelalte interogri de pn acum, interogarea de mai sus compar
perechi de coloane. In acest caz trebuie respectate urmtoarele reguli:
coloanele din dreapta condiiei de cutare sunt n paranteze i fiecare coloan este separat
prin virgul;
coloanele returnate de interogarea interioar trebuie s se potriveasc ca numr i tip cu
coloanele cu care sunt comparate n interogarea exterioar; n plus, ele trebuie s fie n
aceeai ordine cu coloanele cu care sunt comparate.

Alturi de operatorul IN, o subinterogare care returneaz mai multe rnduri poate folosi
operatorii ANY, ALL sau EXISTS. Operatorii ANY i ALL sunt prezentai n continuare, iar
operatorul EXISTS va fi prezentat n seciunea "Subinterogri corelate".
Operatorii ANY i ALL sunt folosii n mod obligatoriu n combinaie cu operatorii relaionali
=, ! =, <, >, <=, >=; operatorii IN i EXISTS nu pot fi folosii n combinaie cu operatorii
relaionali, dar pot fi utilizai cu operatorul NOT, pentru negarea expresiei.
Operatorul ANY
Operatorul ANY (sau sinonimul su SOME) este folosit pentru a compara o valoare cu
oricare dintre valorile returnate de o subinterogare. Pentru a nelege modul de folosire a
acestui operator s considerm urmtorul exemplu ce afieaz cadrele didactice ce ctig mai
mult dect profesorii care au cel mai mic salariu:
SQL> SELECT nume, salariu, grad
FROM profesor
WHERE salariu > ANY (SELECT DISTINCT salariu
FROM profesor
WHERE grad='PROF');
NUME
---GHEORGHIU
GEORGESCU

SALARIU
------3000
2800

GRAD
---PROF
CONF

Interogarea de mai sus este evaluat astfel: dac salariul unui cadru didactic este mai mare
dect cel puin unul din salariile returnate de interogarea interioar, acea nregistrare este
inclus n rezultat. Cu alte cuvinte, >ANY nseamn mai mare dect minimul dintre valorile
returnate de interogarea interioar, <ANY nseamn mai mic ca maximul, iar =ANY este
echivalent cu operatorul IN.
Not: Opiunea DISTINCT este folosit frecvent atunci cnd se folosete operatorul ANY
pentru a preveni selectarea de mai multe ori a unor nregistrri.
Operatorul ALL
Operatorul ALL este folosit pentru a compara o valoare cu toate valorile returnate de o
subinterogare. Considerm urmtorul exemplu ce afieaz cadrele didactice care ctig mai
mult dect asistenii cu salariul cel mai mare:
SQL> SELECT nume, salariu, grad
FROM profesor
WHERE salariu > ALL (SELECT DISTINCT salariu
FROM profesor
WHERE grad='ASIST');
NUME
---GHEORGHIU
MARIN
GEORGESCU
ALBU

SALARIU
------3000
2500
2800
2200

GRAD
---PROF
PROF
CONF
LECT

Interogarea de mai sus este evaluat astfel: dac salariul unui cadru didactic este mai mare
dect toate valorile returnate de interogarea interioar, acea nregistrare este inclus n
rezultat. Cu alte cuvinte, >ALL nseamn mai mare ca maximul dintre valorile returnate de
interogarea interioar iar <ALL nseamn mai mic ca minimul dintre acestea.
Not: Operatorul ALL nu poate fi utilizat cu operatorul = deoarece interogarea nu va ntoarce
nici un rezultat cu excepia cazului n care toate valorile sunt egale, situatie care nu ar avea
sens.
Subinterogri imbricate
Subinterogrile pot fi imbricate (utilizate cu alte subinterogri) pn la 255 de nivele,
indiferent de numrul de valori returnate de fiecare subinterogare. Pentru a selecta cadrele
didactice care au salariul mai mare dect cel mai mare salariu al cadrelor didactice care
aparin catedrei de Electronic, vom folosi urmtoarea interogare:
SQL> SELECT nume, prenume, salariu
FROM profesor
WHERE salariu >(SELECT MAX(salariu)
FROM profesor
WHERE cod_catedra=(SELECT cod_catedra
FROM catedra
WHERE nume= 'ELECTRONIC'));

Subinterogri corelate
In exemplele considerate pn acum interogarea interioar era evaluat prima, dup care
valoarea sau valorile rezultate erau utilizate de ctre interogarea exterioar. Subinterogrile de
acest tip sunt numite subinterogri simple. O alt form de subinterogare o reprezint
interogarea corelat, caz n care interogarea exterioar transmite repetat cte o nregistrare
pentru interogarea interioar. Interogarea interioar este evaluat de fiecare dat cnd este
transmis o nregistrare din interogarea exterioar, care se mai numete si nregistrare
candidat. Subinterogarea corelat poate fi identificat prin faptul c interogarea interioar nu
se poate executa independent ci depinde de valoarea transmis de ctre interogarea exterioar.
Dac ambele interogri acceseaz aceeai tabel, trebuie asigurate alias-uri pentru fiecare
referire la tabela respectiv
Subinterogrile corelate reprezint o cale de a accesa fiecare nregistrare din tabel i de a
compara anumite valori ale acesteia cu valori ce depind tot de ea.
Evaluarea unei subinterogri corelate se execut n urmtorii pai:
1. Interogarea exterioar trimite o nregistrare candidat ctre interogarea interioar;
2. Interogarea interioar se execut n funcie de valorile nregistrrii candidate;
3. Valorile rezultate din interogarea interioar sunt utilizate pentru a determina dac
nregistrarea candidat va fi sau nu inclus n rezultat;
4. Se repet procedeul ncepnd cu pasul l pn cnd nu mai exist nregistrri candidate.
De exemplu pentru a regsi cadrele didactice care ctig mai mult dect salariul mediu din
propria catedr, putem folosi urmtoarea interogare corelat:
SQL> SELECT nume, prenume, salariu
FROM profesor p
WHERE salariu>(SELECT AVG(salariu)

FROM profesor s
WHERE s.cod_catedra = p. cod_catedra);
NUME
---GHEORGHIU
MARIN
ALBU

PRENUME
------STEFAN
VLAD
GHEORGHE

SALARIU
------3000
2500
2200

In exemplul de mai sus coloana interogrii exterioare care se folosete n interogarea


interioar este p. cod_catedra. Deoarece p. cod_catedra poate avea o valoare diferit pentru
fiecare nregistrare, interogarea interioar se execut pentru fiecare nregistrare candidat
transmis de interogarea exterioar.
Atunci cnd folosim subinterogri corelate mpreun cu clauza HAVING, coloanele utilizate
n aceast clauz trebuie s se regseasc in clauza GROUP BY. In caz contrar, va fi generat
un mesaj de eroare datorat faptului c nu se pate face comparaie dect cu o expresie de grup.
De exemplu, urmtoarea interogare este corect, ea selectnd gradele didactice pentru care
media salariului este mai mare dect maximul primei pentru acelai grad:
SQL> SELECT grad
FROM profesor p
GROUP BY grad
HAVING AVG (salariu)>(SELECT MAX(prima)
FROM profesor
WHERE grad = p.grad);
grad
-----ASIST
CONF
Operatorul EXISTS
Operatorul EXISTS verific dac, pentru fiecare nregistrare transmis de interogarea
exterioar, exist sau nu nregistrri care satisfac condiia interogrii interioare, returnnd
interogrii exterioare valoarea True sau False. Cu alte cuvinte, operatorul EXISTS cere n
mod obligatoriu corelarea interogarii interioare cu interogarea exterioara. Datorita faptului c
operatorul EXISTS verific doar existena rndurilor selectate i nu ia n considerare numrul
sau valorile atributelor selectate, n subinterogare poate fi specificat orice numr de atribute;
n particular, poate fi folosit o constant i chiar simbolul * (dei acest lucru nu este
recomandabil din punct de vedere al eficienei). De altfel, EXISTS este singurul operator care
permite acest lucru.
Urmtoarea interogare selecteaz toate cadrele didactice care au mcar un subordonat:
SQL> SELECT cod, nume, prenume, grad
FROM profesor p
WHERE EXISTS
(SELECT '1'
FROM profesor
WHERE profesor.ef = p.cod)
ORDER BY cod;

-------------------------------------cod
nume
prenume
grad
-------------------------------------100 GHEORGHIU
STEFAN
PROF
102 GEORGESCU
CRISTIANA
CONF
103 IONESCU
VERONICA
ASIST
-------------------------------------La fel ca i operatorul IN, operatorul EXISTS poate fi negat, lund forma NOT EXISTS.
Totui, o remarc foarte important este faptul c pentru subinterogari, NOT IN nu este la fel
de eficient ca NOT EXISTS. Astfel dac n lista de valori transmis operatorului NOT IN
exist una sau mai multe valori Null, atunci condiia va lua valoarea de adevr False,
indiferent de celelalte valori din list.
De exemplu, urmtoarea interogare ncearc s returneze toate cadrele didactice care nu au
nici un subaltern:
SQL> SELECT nume, grad
FROM profesor
WHERE cod NOT IN SELECT ef
FROM profesor);
Aceast interogri nu va ntoarce nici o nregistrare deoarece coloana ef conine i valoarea
Null. Pentru a obine rezultatul corect trebuie s folosim urmtoarea interogare:
SQL> SELECT nume, grad
FROM profesor p
WHERE NOT EXISTS (SELECT '1'
FROM profesor
WHERE sef=p.cod);
+----------+--------+
| nume
| grad
|
+----------+--------+
| MARIN
| PROF
|
| ALBU
| LECT
|
| VOINEA
| ASIST |
| STANESCU | ASIST |
+----------+--------+
n general, operatorul EXISTS se folosete n cazul subinterogrilor corelate si este cteodat
cel mai eficient mod de a realiza anumite interogri. Performana interogrilor depinde de
folosirea indecilor, de numrul rndurilor returnate, de dimensiunea tabelei i de necesitatea
crerii tabelelor temporare pentru evaluarea rezultatelor intermediare. Tabelele temporare
generate de Oracle nu sunt indexate, iar acest lucru poate degrada performana
subinterogrilor dac se folosesc operatorii IN, ANY sau ALL.
Subinterogrile mai pot aprea i n alte comenzi SQL cum ar fi: UPDATE, DELETE,
1NSERT i CREATE TABLE.
Aa cum am vzut, exist n principal dou moduri de realizare a interogrilor ce folosesc
date din mai multe tabele: jonciuni i subinterogri. Jonciunile reprezint forma de
interogare relationala (n care sarcina gsirii drumului de acces la informaie revine SGRDului) iar subinterogrile forma procedural (in care trebuie indicat drumul de acces la

informaie). Fiecare dintre aceste forme are avantajele sale, depinznd de cazul specific in
care se aplic.
5.1.21. Operaii pe tabele ce conin informaii do structur arborescent
O baz de date relaional nu poate stoca nregistrri n mod ierarhic, dar la nivelul
nregistrrii pot exista informaii care determin o relaie ierarhic ntre nregistrri. SQL
permite afiarea rndurilor dintr-o tabel innd cont de relaiile ierarhice care apar ntre
rndurile tabelei. Parcurgerea n mod ierarhic a informaiilor se poate face doar la nivelul unei
singure tabele. Operaia se realizeaz cu ajutorul clauzelor START WITH i CONNECT BY
din comanda SELECT.
De exemplu, n tabela profesor exist o relaie ierarhic ntre nregistrri datorat valorilor din
coloanele cod i ef. Fiecare nregistrare aferent unui cadru didactic conine n coloana ef
codul persoanei creia i este direct subordonat. Pentru a obine o situaie ce conine nivelele
ierarhice, vom folosi urmtoarea interogare:
SQL> SELECT LEVEL, nume, prenume, grad
FROM profesor
CONNECT BY PRIOR cod=sef
START WITH sef IS NULL;
LEVEL
-----1
2
2
3
4
2
2

NUME
----GHEORGHIU
MARIN
GEORGESCU
IONESCU
STANESCU
ALBU
VOINEA

PRENUME
------STEFAN
VLAD
CRISTIANA
VERONICA
MARIA
GHEORGHE
MIRCEA

GRAD
---PROF
PROF
CONF
ASIST
ASIST
LECT
ASIST

Explicarea sintaxei i a regulilor de funcionare pentru exemplul de mai sus:


Clauza standard SELECT poate conine pseudo-coloana LEVEL ce indic nivelul
nregistrrii n arbore (ct de departe este de nodul rdcin). Astfel, nodul rdcin are
nivelul l, fiii acestuia au nivelul 2, .a.m.d.;
In clauza FROM nu se poate specifica dect o tabel;
Clauza WHERE poate aprea n interogare pentru a restriciona vizitarea nodurilor
(nregistrrilor) din cadrul arborelui;
Clauza CONNECT BY specific coloanele prin care se realizeaz relaia ierarhic; acesta
este clauza cea mai important pentru parcurgerea arborelui i este obligatorie;
Operatorul PRIOR stabilete direcia n care este parcurs arborele. Dac clauza apare
nainte de atributul cod, arborele este parcurs de sus n jos, iar dac apare nainte de
atributul sef arborele este parcurs de jos in sus;
Clauza START WITH specific nodul (nregistrarea) de nceput a arborelui. Ca punct de
start nu se poate specifica un anumit nivel (LEVEL), ci trebuie specificat valoarea;
aceast clauz este opional, dac ea lipsete, pentru fiecare nregistrare se va parcurge
arborele care are ca rdcin aceast nregistrare.
n sintaxa interogrii de mai sus, pentru a ordona nregistrrile returnate, poate aparea clauza
OROER BY, dar este recomandabil s nu o folosim deoarece ordinea implicit de parcurgere
a arborelui va fi distrus.

Pentru a elimina doar un anumit nod din arbore putem folosi clauza WHERE, iar pentru a
elimina o ntreag ramur dintr-un arbore (o anumit nregistrare mpreuna cu fiii acesteia)
folosim o condiie compus n clauza CONNECT BY.
Urmtorul exemplu elimin doar nregistrarea cu numele 'GEORGESCU', dar nu i fiii
acesteia:
SQL> SELECT LEVEL, nume, prenume, grad
FROM profesor
WHERE nume != 'GEORGESCU'
CONNECT BY PRIOR cod=sef
START WITH ef IS NULL;
LEVEL
----1
2
3
4
2
2

NUME
---GHEORGHIU
MARIN
IONESCU
STANESCU
ALBU
VOINEA

PRENUME
------TEFAN
VLAD
VERONICA
MRIA
GHEORGHE
MIRCEA

GRAD
---PROF
PROF
ASIST
ASIST
LECT
ASIST

Pentru a elimina toat ramur care conine nregistrarea cu numele 'GEORGESCU' si


nregistrrile pentru subordonaii acesteia se folosete urmtoarea interogare:
SQL> SELECT LEVEL, nume, prenume, grad
FROM profesor
CONNECT BY PRIOR cod=sef AND nume != 'GEORGESCU'
START WITH ef IS NULL;
LEVEL
----1
2
2
2

NUME
---GHEORGHIU
MARIN
ALBU
VOINEA

PRENUME
------STEFAN
VLAD
GHEORGHE
MIRCEA

GRAD
---PROF
PROF
LECT
ASIST

5.2 Comanda INSERT


Aceast comand este utilizat pentru adugarea unor rnduri noi ntr-o tabel creat anterior
sau n tabelele de baz ale unei vederi. Comanda INSERT poate fi utilizat in dou moduri:
1. Pentru introducerea datelor ntr-un tabel, cte o nregistrare la un moment dat. In acest
caz sintaxa este urmtoarea
INSERT INTO tabela [(coloana1, coloana 2)]
VALUES (valoarel, valoare2, .. )
In momentul inserrii datelor, trebuie respectate urmtoarele reguli:
Coloanele pot fi specificate n orice ordine, ns trebuie asigurat corespondena ntre
coloane si valorile furnizate (coloanei l i corespunde valoarea l, coloanei 2 ii corespunde
valoarea 2, .a.m.d.) iar coloanelor nespecificate le va fi ataat valoarea Null;

n cazul n care coloanele nu sunt specificate explicit, se impune sa fie specificate valori
pentru toate coloanele i ordinea acestor valori s coincid cu cea n care coloanele au fost
definite la crearea tabelei (dac nu se cunoate ordinea de declarare a coloanelor se poate
folosi comanda DESCRIBE nume_tabela care va afia lista coloanelor definite pentru
tabela respectiv, tipul, lungimea i restriciile de integritate);
Valorile trebuie s aib acelai tip de dat ca i cmpurile in care sunt adugate
Dimensiunea valorilor introduse trebuie s fie mai mic sau cel mult egal cu dimensiunea
coloanei (un ir de 20 de caractere nu poate fi adugat ntr-o coloan cu dimensiunea de
15 caractere);
Valorile introduse trebuie s respecte restriciile de integritate definite la crearea tabelei
(de exemplu, cmpuri definite ca NOT NULL sau UNIQUE).
Atunci cnd se insereaz valori de tip dat calendaristic n format predefinit (DD-MON-YY),
sistemul presupune n mod automat secolul 20, ora 00:00:00 (miezul nopii)
Urmtoarea instruciune exemplific introducerea unei noi nregistrri n tabela profesor:
SQL>INSERT INTO profesor (cod, nume, prenume, data_nast, ef,
salariu, cod_catedra)
VALUES (107, 'POPESCU', 'SERGIU',' 09-DEC-71', 100, 1200, 20);
Se poate obsera c valorile coloanelor grad i prima, care nu au fost specificate, vor fi Null.
In cazul n care nu se specific implicit numele coloanelor, valorile trebuie introduse in
ordinea n care au fost definite i nu se poate omite valoarea nici unei coloane. Urmtoarea
instruciune va produce acelai efect ca cea de mai sus:
SQL> INSERT INTO profesor
VALUES (107, 'POPESCU', 'SERGIU', '09-DEC-71', NULL,
100, 1200, NULL, 20);
2. Pentru introducerea datelor ntr-un tabel, prin copierea mai multor nregistrari dintr-un alt
tabel sau grup de tabele; aceste nregistrri sunt rezultatul unei comenzi SELECT, n arest caz
sintaxa este urmtoarea:
INSERT INTO labela [(coloana1, colonna2, ...)] comanda_select
i in acest caz trebuie respectate regulile de inserare, singura diferen fiind faptul c valorile
noi introduse sunt extrase cu ajutorul unei interogri, acest lucru crend posibilitatea de
inserare a mai multor nregistrri n funcie de anumite condiii.
De exemplu, pentru a insera n tabela nou_profesor, avnd coloanele cod, nume, prenume si
data_nastere, nregistrrile din tabela profesor care au gradul didactic de asistent se poate
folosi urmtoarea instruciune:
SQL> INSERT INTO nou_profesor(cod, nume, prenume, data_nastere)
SELECT cod, nume, prenume, data nast
FROM profesor
WHERE grad='ASIST';
5.3. Comanda UPDATE

Comanda UPDATE este folosit pentru a modifica valorile datelor existente ntr-un tabel sau
n tabelele de baz ale unei vederi si are urmtoarea sintax general:
UPDATE tabela [alias]
SET atribuire_coloane,[atribuire_coloane,...]
[WHERE condiie];
unde atribuire_coloane poate avea una dintre urmtoarele forme:
coloana ={(expresie |(subinterogare)}
sau
(coloana [,coloana] ...) = (subinterogare)
Se observ c exist dou posibiliti de modificare:
furnizarea n mod explicit a fiecrei valori sau expresii pentru cmpurile ce trebuiesc
modificate;
obinerea valorilor cu ajutorul unei subinterogri.
Comanda UPDATE modific valorile nregistrrilor n funcie de condiia clauzei WHERE.
In lipsa clauzei WHERE, vor fi actualizate toate nregistrrile din tabelul dat.
Expresia furnizat ca o nou valoare a unei coloane poate cuprinde valorile curente ale
cmpurilor din nregistrarea care este actualizat. De exemplu, pentru a mri salariul cu 20%
i prima cu 100 pentru cadrele didactice ce au gradul de asistent, se va folosi urmtoarea
comand:
SQL> UPDATE profesor
SET salariu=salariu*l.2, prima=prima+100
WHERE grad='ASIST';
Pentru a exemplifica actualizarea datelor utiliznd subinterogri presupunem c mai avem o
tabel numit prima ce conine sumele de bani primite suplimentar de unele cadre didactice:
COD
--102
103
102

PRIMA
----100
200
50

Pentru a modifica datele din tabela profesor pe baza datelor din tabela prima se poate folosi
urmtoarea comand care conine o subinterogare corelat i o subinterogare mbricat:
SQL> UPDATE profesor
SET prima=(SELECT SUM(prima)
FROM prima a
WHERE a.cod=profesor.cod)
WHERE cod IN (SELECT cod
FROM prima);
O alt posibilitate este ca sumele suplimentare coninute n tabela prima s fie adugate la
prima existent n tabela profesor:

SQL> UPDATE profesor


SET prima=(SELECT SUM (prima) + profesor.prima
FROM prima a
WHERE a.cod=profesor.cod)
WHERE cod IN (SELECT cod
FROM prima);
S presupunem acum c toi asistenii sunt transferai la catedra din care face parte cadrul
didactic cu codul 104 i vor primi acelasi salariu cu acesta:
SQL> UPDATE profesor
SET(cod_catedra,salariu)=(SELECTcod_catedra, salariu
FROM profesor
WHERE cod=104)
WHERE grad='ASIST';
5.4. Comanda DELETE
Comanda DELETE realizeaz tergerea nregistrrilor dintr-o tabel sau din tabelele de baza
ale unei vederi n funcie de o anumit condiie i are urmtoarea sintax general:
DELETE FROM tabela [WHERE condiie]
Similar comenzii UPDATE, comanda DELETE terge anumite nregistrri n funcie de
condiia din clauza WHERE. n lipsa clauzei WHERE vor fi terse toate nregistrrile din
tabelul dat. In aceast clauz pot fi incluse i subinterogri.
De exemplu urmtoarea comand terge toate nregistrrile pentru care gradul didactic este
asistent:
SQL> DELETE FROM profesor
WHERE grad='ASIST';
Not: Comanda DELETE nu poate fi folosit pentru tergerea valorii unui cmp individual
(pentru aceasta folosii comanda UPDATE) ci terge nregistrri complete dintr-un singur
tabel, n plus, comanda DELETE terge numai nregistrri din tabel nu i tabelul. Pentru a
terge un tabel se folosete comanda DROP TABLE.
Un alt aspect important este faptul c, similar comenzilor INSERT i UPDATE, tergerea
nregistrrilor dintr-un tabel poate determina apariia unor probleme legate de integritatea
referenial. Pentru a evita aceste probleme se pot defini constrngeri de integritate care
mpiedic operaiile de inserare, actualizare sau tergere care ar distruge integritatea
referenial a datelor.
5.5. Comanda TRUNCATE
Pentru a terge n mod rpid toate nregistrrile dintr-o tabel sau dintr-un cluster se poate
folosi comanda TRUNCATE. Comanda TRUNCATE este mult mai rapid dect comanda
DELETE din urmtoarele motive:
Comanda TRUNCATE este o comand DDL, prin urmare se execut dintr-o singur
tranzacie i deci nu folosete segmentul de revenire. Comanda trebuie folosit cu
precauie deoarece nu mai poate fi derulat napoi.

Comanda TRUNCATE nu declaneaz trigger-ul DELETE


Comanda are urmtoarea sintax general:
TRUNCATE (TABLE tabe]lCLUSTER cluster}
[{DROP|REUSE})STORAGE]
unde:
Clauza TABLE specific numele unei tabele iar clauza CLUSTER specific numele unui
cluster. Dup cum se observ din sintax, aceste dou opiuni sunt alternative, deci nu se
poate specifica ntr-o comand TRUNCATE tergerea rndurilor dintr-o tabel i dintr-un
cluster n acelai timp. In cazul n care se specific clauza TABLE, tabela la care se refer
aceast clauz nu poate face parte dintr-un cluster. Comanda TRUNCATE se poate
executa i asupra tabelelor organizate pe index, la trunchierea unei tabele. Oracle terge
automat datele din indecii tabelei, n cazul in care se specific clauza CLUSTER,
clusterul la care se se refer aceast clauz nu poate fi un cluster hash ci numai un cluster
de index. De asemenea, la trunchierea unui cluster, Oracle terge automat datele din
indecii tabelelor clusterului.
Clauza DROP STORAGE elibereaz spaiul alocat nregistrarilor terse din tabel sau
cluster. Clauza REUSE, STORAGE pstreaz spaiul alocat nregistrrilor terse din tabel
sau cluster. Acest spaiu care nu a fost dealocat poate fi reutilizat doar la operaii de
inserare sau modificare asupra tabelei sau clusterului. Aceste dou opiuni nu modific
efectul pe care l are comanda TRUNCATE asupra spaiului eliberat de datele terse din
indecii asociai. Opiunea implicit este DROP STORAGE.
tergerea nregistrrilor cu ajutorul comenzii TRUNCATE este mult mai avantajoas dect
eliminarea tabelului i recrearea lui ulterioar deoarece:
Eliminarea tabelului face ca obiectele dependente de acesta s devin invalide, pe cnd n
cazul folosirii comenzii TRUNCATE nu se ntmpl acest lucru;
Comanda TRUNCATE nu necesit reacordarea de drepturi asupra tabelului aa cum se
ntmpl dac acesta a fost eliminat i apoi recreat;
Eliminarea tabelului necesit recrearea indecilor, constrngerilor de integritate,
declanatoarelor, precum i specificarea parametrilor de stocare.
De exemplu, dac un utilizator execut comanda SELECT COUNT (*) FROM nume tabel, iar
aceast interogare returneaz dup un interval destul de ndelungat valoarea zero, se
recomand trunchierea tabelului cu eliberarea spaiului alocat nregistrrilor terse.

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