Sunteți pe pagina 1din 11

5.

SQL
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 NUME
PRENUME
DATA_NAST GRAD
EF SALARIU PRIMA
COD_CATEDRA
--- --------- --------- --------- ------ ------- --------------100 GHEORGHIU TEFAN
ll-AUG-46 PROF
3000
3500
101 MARIN
VLAD
19-APR-45 PROF
100
2500
102 GEORGESCU CRISTIANA 30-OCT-51 CONF
100
2800
200
103 IONESCU
VERONICA
ASIST 102
1500
104 ALBU
GHEORGHE
LECT
100
2200
2500
105 VOINEA
MIRCEA
15-NOV-65 ASIST 100
1200
150
106 STANESCU MARIA
05-DEC-69 ASIST 103
1200
600

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

PRENUME
------TEFAN
VLAD

SALARIU
------3000
2500

GEORGESCU
IONESCU
ALBU
VOINEA
STANESCU

CRISTIANA
VERONICA
GHEORGHE
MIRCEA
MRIA

2800
1500
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
SALARIU*0.38
--------------------GHEORGHIU
3000
1140
MARIN
2500
950
GEORGESCU
2800
1064
IONESCU
1500
570
ALBU
2200
836
VOINEA
1200
456
STANESCU
1200
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
DATA NATERE
SALARIU
IMPOZIT
--------------------------GHEORGHIU
ll-AUG-46
3000
1140
MARIN
19-APR-45
2500
950
GEORGESCU
30-OCT-51
2800
1064
IONESCU
1500
570

ALBU
VOINEA
STANESCU

2200
1200
1200

15-NOV-65
05-DEC-69

836
456
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
SALARIU*0.38
-------------VOINEA
456
STANESCU
456
IONESCU
570
ALBU
836
MARIN
950
GEORGESCU
1064
GHEORGHIU
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
<> i !=
diferit
>
mai mare
<
mai mic
>=
mai mare sau egal
<=
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
----

PRENUME
-------

SALARIU
-------

PRIMA
-----

GHEORGHIU
TEFAN
ALBU
GHEORGHE

3000
2200

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
------TEFAN
VLAD
CRISTIANA
GHEORGHE

SALARIU
------3000
2500
2800
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
PRENUME
---------IONESCU
ALBU
VERONICA GHEORGHE

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