Documente Academic
Documente Profesional
Documente Cultură
BD Capitolul 5 SQL 1
BD Capitolul 5 SQL 1
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:
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
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
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
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