Sunteți pe pagina 1din 14

Restrictionarea si sortarea datelor

Obiective:
La terminarea acestei lectii ar trebui sa puteti:
Limita numarul de linii returnat de o interogare
Sorta liniile returnate de o interogare
Telul lectiei:
La citirea datelor dintr-o baza de date, s-ar putea sa trebuiasca sa reduci numarul de linii afisate sau sa
specifici ordinea n care sa fie afisate. Aceasta lectie explica regulile SQL folosite pentru realizarea
acestor actiuni.
Limitarea liniilor folosind o selectare:
EMP
EMPNO
7839
7698
7782
7566

ENAME
KING
BLAKE
CLARK
JONES

JOB
PRESIDENT
MANAGER
MANAGER
MANAGER

DEPTNO
10
30
10
20

returneaza toti
angajatii din
departamentul 10

EMP
EMPNO
7839
7782
7934

ENAME
KING
CLARK
MILLER

JOB
PRESIDENT
MANAGER
CLERK

DEPTNO
10
10
10

Limitarea numarului de linii folosind o selectie:


n exemplul de mai sus presupuneti ca vreti sa afisati toti angajatii din departamentul 10. Setul de linii
care au valoarea 10 n coloana DEPTNO sunt singurele returnate. Aceasta metoda de restrictionare
reprezinta baza clauzei WHERE n SQL.
Limitarea liniilor selectate:

Reducerea numarului de linii sectionate folosind clauze WHERE.

SELECT
FROM
[WHERE

[DISTINCT] {*, column [alias], }


table
condition(s)];

Clauza WHERE urmeaza dupa clauza FROM.

Limitarea liniilor selectate:


Puteti reduce numarul de linii returnate de o interogare folosind clauze WHERE. O clauza WHERE
contine o conditie ce trebuie ndeplinita, si urmeaza imediat dupa o clauza FROM.
n sintaxa:
WHERE
condition

restritioneaza interogarea la liniile ce ndeplinesc conditia.


e compusa din nume de coloane, expresii, constante si operatori de
comparatie.

Clauza WHERE poate compara valorile din coloane, valori literale, expresii aritmetice sau functii.
Clauza WHERE e compusa din trei elemente:
Numele coloanei
Operatorul de comparatie
Nume de coloana, constanta sau lista de valori
Folosirea clauzei WHERE:
SQL> SELECT ename, job, deptno
2
FROM emp
3
WHERE job CLERK;
ENAME
JAMES
SMITH
ADAMS
MILLER

JOB
CLERK
CLERK
CLERK
CLERK

DEPTNO
30
20
20
10

Folosirea clauzei WHERE:


n exemplul de mai sus SELECT-ul returneaza numele, functia si numarul departamentului tuturor
angajatilor care au functia CLERK.
De retinut ca functia CLERK a fost specificata cu litere mari pentru a se asigura potrivirea cu functia
trecuta n coloana JOB a tabelei EMP. Sirurile de caractere sunt case-sensitive.
Siruri de caractere si date

Sirurile de caractere si datele sunt incluse ntre apostrofuri


Valorile de tip caracter sunt case-sensitiv iar valorile de tip data sunt format-sensitive
Formatul de data implicit este DD-MON-YY

SQL> SELECT ename, job, deptno


2 FROM emp
3 WHERE ename=JAMES;
Siruri de caractere si date:
Sirurile de caractere si datele n clauza WHERE trebuiesc incluse ntre apostrofuri( ). Totusi
constantele numerice nu trebuiesc incluse.

Toate cautarile de tip caracter sunt case-sensitiv. n exemplul urmator, nu este returnata nici o linie
deoarece tabela EMP contine toate datele n majuscule.
SQL> SELECT ename, empno, job, deptno
2
FROM emp
3 WHERE job=clerk;
Oracle retine datele ntr-un format numeric intern, reprezentnd secol, an, luna, zi, ore, minute si
secunde. Afisarea implicita a datei este DD-MON-YY.
Nota: schimbarea formatului implicit va fi explicat n capitolul 3.
Valorile numerice nu sunt incluse ntre apostrofuri.
Operatori de comparatie
Operator
=
>
>=
<
<=
<>

Comentariu
Egal cu
Mai mare dect
Mai mare sau egal
Mai mic dect
Mai mic sau egal
Diferit de

Operatori de comparatie:
Operatorii de comparatie sunt folositi n conditiile care compara doua expresii. Acestia sunt folositi n
clauza WHERE n urmatorul format:
Sintaxa:
- WHERE expresie operator valoare
Exemple:
- WHERE hiredate=01-JAN-95
- WHERE sal>=1500
- WHERE ename=SMITH
Folosirea operatorilor de comparatie
SQL> SELECT ename, sal, com
2 FROM emp
3 WHERE sal<=comm;
ENAME
MARTIN

SAL
1250

COMM
1400

Folosirea operatorilor de comparatie:


n exemplul de mai sus SELECT-ul returneaza numele, salariul si comisionul din tabela EMP, unde
salariul angajatului este mai mic sau egal dect valoarea comisionului. De retinut ca nu este o valoare
explicita n clauza WHERE. Cele doua valori comparate sunt luate din coloanele SAL, respectiv
COMM din tabela EMP.
3

Operator
BETWEEN
AND
IN(lista)
LIKE
IS NULL

Semnificatie
ntre doua valori (inclusiv)
Potriveste orice valoare din lista
Potriveste un tip de caracter
Este o valoare nula
Folosirea operatorului BETWEEN

Operatorul BETWEEN se foloseste la afisarea valorilor dintr-un interval.


SQL> SELECT ename, sal
2
FROM
emp
3 WHERE sal BETWEEN 1000 AND 1500;
Limita
inferioara

Limita
superioara

ENAME
MARTIN
TURNER
WARD
ADAMS
MILLER

SAL
1250
1500
1250
1100
1300

Operatorul BETWEEN:
Liniile pot fi afisate bazndu-ne pe un interval de valori folosind operatorul BETWEEN. Intervalul
specificat contine o limita inferioara si o limita superioara.
SELECT-ul de mai sus returneaza linii din tabela EMP pentru toti angajatii cal caror salariu este
cuprins ntre 1000 si 1500.
Valorile specificate cu operatorul BETWEEN sunt inclusive. Prima data trebuie specificata o
linie inferioara.
Folosirea operatorului IN
Operatorul IN se foloseste pentru a testa valorile dintr-o lista.
SQL> SELECT empno, ename, sal, mgr
2
FROM
emp
3 WHERE mgr IN (7902, 7566, 7788);
EMPNO ENAME

SAL
4

MGR

7902 FORD
3000
7566
7369 SMITH
800
7902
7788 SCOTT
3000
7566
7876 ADAMS
1100
7788
Operatorul IN:
Pentru a cauta valori ntr-o lista se foloseste operatorul IN.
Exemplul de mai sus afiseaza numarul, numele, salariul angajatului si numarul managerului sau din toti
angajatii ai caror manageri au numarul 7902, 7566 sau 7788.
Operatorul IN poate fi folosit cu orice tip de data. Urmatorul exemplu returneaza o linie din tabela
EMP pentru fiecare angajat al carui nume este inclus n lista de nume din clauza WHERE.
SQL> SELECT empno, ename, mgr, deptno
2
FROM
emp
3 WHERE ename IN (FORD, ALLEN);
Daca n lista sunt folosite caractere sau date, acestea trebuiesc incluse ntre apostrofuri ( ).
Folosirea operatorului LIKE

Operatorul LIKE se foloseste pentru a efectua cautari cu caractere wildcard n siruri valide de
cautare.
Conditiile cautarii pot contine fie caractere literale, fie numere
- % nseamna zero sau mai multe caractere
- _ nseamna un singur caracter

SQL> SELECT ename


2
FROM
emp
3 WHERE ename LIKE S%;
Operatorul LIKE:
Nu ntotdeauna stii valoarea exacta pe care o cauti. Poti selecta linii care se potrivesc dupa un tip de
caractere folosind operatorul LIKE. Operatia de potrivire dupa un tip de caractere este referita ca o
cautare cu caractere wildcard. Pot fi folosite doua simboluri pentru construirea sirurilor de cautare.
Simbol
%
_

Descriere
Reprezinta orice secventa de doua sau mai multe caractere
Reprezinta un singur caracter

SELECT-ul de mai sus numele angajatilor din tabela EMP pentru toti angajatii ai caror nume ncepe cu
S. Numele care ncep cu s nu vor fi returnate.
Operatorul LIKE poate fi folosit ca scurtatura pentru cteva comparatii facute cu BETWEEN.
Urmatorul exemplu afiseaza numele si data angajarii, angajati ntre ianuarie 1981 si decembrie 1981.
SQL> SELECT ename, hiredate
2
FROM
emp
3 WHERE hiredate LIKE %81;
5

Folosirea operatorului LIKE

Pot fi combinate diferite tipuri de potriviri pe caracter

SQL> SELECT ename


2
FROM
emp
3 WHERE ename LIKE _A%:
ENAME
JAMES
WARD

Se poate folosi identificatorul ESCAPE pentru a cauta caracterele % si _.

Combinari de caractere wildcard:


Simbolurile % si _ pot fi folosite n orice combinatie cu caracterele literale. Exemplul de mai sus
afiseaza numele tuturor angajatilor care au al doilea caracter A.
Optiunea ESCAPE:
Cnd este nevoie de o potrivire exacta a caracterelor % si _ trebuie folosita optiunea ESCAPE.
Aceasta optiune specifica care este caracterul ESCAPE. Pentru a afisa numele tuturor angajatilor care
contine secventa A_B se va folosi urmatorul SELECT:
SQL> SELECT ename
2
FROM
emp
3 WHERE ename LIKE %A\_%B ESCAPE \;
Optiunea ESCAPE identifica caracterul backslash (\) ca fiind caracter ESCAPE. n tipar caracterul
ESCAPE precedeaza caracterul underscore (_). Acest lucru face ca Oracle sa interpreteze caracterul
underscore literal.
Folosirea operatorului IS NULL
Testarea valorilor nule cu operatorul IS NULL
SQL> SELECT ename, mgr
2 FROM
emp
3 WHERE mgr IS NULL;
ENAME
KING

MGR

Operatorul IS NULL:
Operatorul IS NULL cauta valorile nule. O valoare nula e o valoare care nu e disponibila, neatribuita,
necunoscuta sau neaplicabila. Din aceasta cauza nu poate fi testata cu (=) deoarece o valoare nula nu
poate fi egala sau inegala cu orice valoare. Exemplul de mai sus returneaza numele si managerul
tuturor angajatilor care nu au manager.
6

De exemplu, pentru a afisa numele, slujba si comisionul tuturor angajatilor care nu au dreptul la
comision se va folosi urmatorul SELECT:
SQL> SELECT ename, job, comm
2
FROM
emp
3 WHERE comm IS NULL
ENAME
KING
BLAKE
CLARK

JOB
PRESIDENT
MANAGER
MANAGER

COMM

Operatori logici
Operator
AND

Comentariu
Returneaza TRUE daca ambele componente ale conditiei sunt
adevarate
Returneaza TRUE daca una din componentele conditiei este
adevarata
Returneaza TRUE daca conditia este falsa

OR
NOT

Operatori logici:
Un operator logic combina rezultatul a doua componente de tip conditie pentru a produce un singur
rezultat bazat pe acestea sau pentru a inversa rezultatul unei singure conditii. n SQL sunt disponibili
trei operatori logici:
AND
OR
NOT
Toate exemplele de pna acum au specificat conditii numai n clauza WHERE. Se pot folosi cteva
conditii ntr-o clauza WHERE folosind operatorii AND si OR.
Folosirea operatorului AND
AND cere ca ambele conditii sa fie adevarate.
SQL>
2
3
4

SELECT
FROM
WHERE
AND

empno, ename, job, sal


emp
sal>=1100
job=CLERK;

EMPNO ENAME
7876 ADAMS
7934 MILLER

JOB
CLERK
CLERK

Operatorul AND:
7

SAL
1100
1300

n exemplul de mai sus ambele conditii trebuie sa fie adevarate pentru a fi selectata vreo nregistrare.
De acea un angajat care are este CLERK si cstiga mai mult de 1100 va fi selectat.
Toate cautarile de tip caracter sunt case-sensitiv. Nu va fi returnata nici o linie daca CLERK nu
este scris cu majuscule. Sirurile tip caracter trebuiesc incluse ntre apostrofuri.

Tabela de adevar a operatorului AND:


Tabela urmatoare arata rezultatul combinarii a doua expresii cu AND:
AND
TRUE
FALSE
UNKNOWN

TRUE
TRUE
FALSE
UNKNOWN

FALSE
FALSE
FALSE
FALSE

UNKNOWN
UNKNOWN
FALSE
UNKNOWN

Folosirea operatorului OR
OR cere ca una din conditii sa fie adevarata.
SQL> SELECT empno, ename, job, sal
2
FROM
emp
3 WHERE sal>=1100
4
OR
job=CLERK;
EMPNO
7839
7698
7782
7566
7654

ENAME
KING
BLAKE
CLARK
JONES
MARTIN

JOB
PRESIDENT
MANAGER
MANAGER
MANAGER
SALESMAN

SAL
5000
2850
2450
2975
1250

Operatorul OR:
n exemplul de mai sus, oricare din conditii poate fi adevarata pentru a fi selectata vreo nregistrare. De
aceea un angajat care are slujba de CLERK sau cstiga mai mult de 1100 va fi selectat.
Tabela de adevar a operatorului OR:
Urmatoarea tabela arata rezultatele combinarii a doua expresii cu OR:
OR
TRUE
FALSE
UNKNOWN
TRUE
TRUE
TRUE
TRUE
FALSE
TRUE
FALSE
UNKNOWN
UNKNOWN
TRUE
UNKNOWN
UNKNOWN
Folosirea operatorului NOT
SQL> SELECT ename, job
2
FROM
emp
3 WHERE job NOT IN (CLERK, MANAGER, ANALYST);
8

ENAME
KING
MARTIN
ALLEN
TURNER
WARD

JOB
PRESIDENT
SALESMAN
SALESMAN
SALESMAN
SALESMAN

Operatorul NOT:
n exemplul de mai sus este afisat numele si slujba tuturor angajatilor a caror slujba nu este CLERK,
MANAGER sau ANALST.
Tabela de adevar a operatorului NOT:
Tabela urmatoare arata rezultatul aplicarii operatorului NOT unei conditii:
NOT

TRUE
FALSE

FALSE
TRUE

UNKNOWN
UNKNOWN

Nota: de asemenea operatorul NOT poate fi folosit cu alti operatori SQL cum ar fi BETWEEN, LIKE
si NULL.
WHERE job NOT IN (CLERK, ANALYST)
WHERE sal NOT BETWEEN 1000 AND 1500
WHERE comm IS NOT NULL
Reguli de precedenta
Ordinea evaluarii
1
2
3
4

Operator
Toti operatorii de comparatie
NOT
AND
OR

Precedenta regulilor se poate schimba folosind paranteze.


Reguli de precedenta
SQL>
2
3
4
5

SELECT
FROM
WHERE
OR
AND

ENAME
KING
MARTIN
ALLEN
TURNER
WARD

ename, job, sal


emp
job=SALESMAN
job=PRESIDENT
sal>=1500;
JOB
PRESIDENT
SALESMAN
SALESMAN
SALESMAN
SALESMAN

SAL
5000
1250
1600
1500
1250
9

Exemplu de precedenta a operatorului AND:


n exemplul de mai sus sunt doua conditii:
Prima conditie este ca slujba sa fie PRESIDENT si salariul sa fie mai mare de 1500.
A doua conditie este ca slujba sa fie SALESMAN.
De aceea SELECT-ul citeste dupa cum urmeaza:
Selecteaza linia daca un angajat este PRESIDENT si cstiga mai mult de 1500 sau daca angajatul este
SALESMAN.
Reguli de precedenta
Folosirea parantezelor pentru a forta prioritatea
SQL>
2
3
4
5

SELECT
FROM
WHERE
OR
AND

ENAME
KING
ALLEN

ename, job, sal


emp
(job= SALESMAN
job=PRESIDENT)
sal>1500;
JOB
PRESIDENT
SALESMAN

SAL
5000
1600

Folosirea parantezelor:
n exemplul de mai sus sunt doua conditii:
Prima conditie este ca slujba sa fie PRESIDENT sau SALESMAN.
A doua conditie este ca salariul sa fie mai mare de 1500.
De aceea SELECT-ul citeste urmatoarele:
Selecteaza linia daca angajatul este PRESIDENT sau SALESMAN si daca angajatul cstiga mai mult
de 1500.
Clauza ORDER BY

Selecteaza liniile cu clauza ORDER BY


- ASC: n ordine ascendenta, implicit
- DESC: n ordine descendenta
Clauza ORDER BY este ultima n SELECT.

SQL> SELECT
ename, job, deptno, hiredate
2
FROM
emp
3
ORDER BY hiredate;
ENAME
SMITH
ALLEN

JOB
CLERK
SALESMAN

DEPTNO HIREDATE
20 17-DEC-80
30 20-FEB-81
10

Clauza ORDER BY:


Ordinea liniilor returnate de o interogare nu este definita. clauza ORDER BY poate fi folosita pentru a
sorta liniile. Daca este folosita trebuie pusa ultima. Se poate specifica sortarea dupa o expresie sau dupa
un alias.
Sintaxa:
SELECT
expresie
FROM
table
[WHERE
condition(s)]
[ORDER BY {coloana, expresie} [ASC|DESC];
unde:

ORDER BY
specifica ordinea n care sunt afisate liniile.
ASC
ordoneaza liniile ascendent implicit.
DESC
ordoneaza liniile descendent.
Daca nu este folosita clauza ORDER BY ordinea sortarii este nedefinita si Serverul Oracle
poate sa nu afiseze liniile n aceeasi ordine, pentru aceeasi interogare, de doua ori. Folositi clauza
ORDER BY pentru a afisa liniile ntr-o ordine specifica.
Sortarea n ordine descendenta
SQL> SELECT
ename, job, deptno, hiredate
2
FROM
emp
3
ORDER BY hiredate DESC;
ENAME
ADAMS
SCOTT
MILLER
JAMES
FORD
KING
MARTIN

JOB
CLERK
ANALYST
CLERK
CLERK
ANALYST
PRESIDENT
SALESMAN

DEPTNO
20
20
10
30
20
10
30

HIREDATE
12-JAN-83
09-DEC-82
23-JAN-82
03-DEC-81
03-DEC-81
17-NOV-81
28-SEP-81

Ordonarea implicita a datelor:


Ordinea implicita a sortarii datelor este cea ascendenta:
Valorile numerice sunt afisate ncepnd cu cea mai mica valoare de exemplu 1- 999.
Datele sunt afisate ncepnd cu cea mai timpurie de exemplu 01-JAN-92 naintea lui 01-JAN-95.
Valorile tip caracter sunt afisate n ordine alfabetica de exemplu A naintea lui Z.
Valorile nule sunt afisate ultimele pentru secvente ascendente si primele pentru secvente
descendente.
Inversarea ordinii implicite:
Pentru a inversa ordinea n care sunt afisate liniile trebuie specificat cuvntul cheie DESC dupa numele
coloanei n clauza ORDER BY. n exemplul de mai sus rezultatele sunt sortate dupa cei mai recenti
angajati dintre salariati.
11

Sortarea dupa aliasul coloanei


SQL> SELECT
empno, ename, sal*12 annsal
2
FROM
emp
3
ORDER BY annsal;

EMPNO
7369
7900
7876
7654
7521
7934
7844

ENAME
SMITH
JAMES
ADAMS
MARTIN
WARD
MILLER
TURNER

ANNSAL
9600
11400
13200
15000
15000
15600
18000

Sortarea dupa aliasul coloanei:


Se poate folosi alias al unei coloane n clauza ORDER BY. n exemplul de mai sus datele sunt sortate
dupa salariul anual.
Sortarea dupa mai multe coloane
Ordinea listei facuta de clauza ORDER BY este ordinea sortarii.
SQL> SELECT
ename, deptno, sal
2
FROM
emp
3
ORDER BY deptno, sal, DESC;
ENAME
KING
CLARK
MILLER
FORD

DEPTNO
10
10
10
20

SAL
5000
2450
1300
3000

Se poate face sortare si dupa o coloana care nu este n lista SELECT-ului.

Sortarea dupa mai multe coloane:


Rezultatele interogarii pot fi sortate dupa mai multe coloane. Limita sortarii este data de numarul de
coloane din tabela respectiva.
n clauza ORDER BY trebuiesc specificate coloanele si separate prin virgule. Daca se doreste
schimbarea ordinii afisarii unei coloane se specifica DESC dupa numele coloanei respective. Se poate
ordona dupa coloane care nu sunt incluse n SELECT-ul respectiv.
12

Exemplu:
Sa se afiseze numele si salariul tuturor angajatilor. Rezultatele sa se afiseze dupa numarul
departamentului si dupa aceea n ordine descrescatoare dupa salariu:
SQL> SELECT
ename, sal
2
FROM
emp
3
ORDER BY deptno, sal DESC;

REZUMAT
SELECT
[DISTINCT] {*, coloana [alias], .}
FROM
tabela
[WHERE
conditie(s)]
[ORDER BY {coloana, epresie, alias} [ASC|DESC]];
Sumar:
n aceasta lectie s-a nvatat despre restrictionarea si sortarea liniilor returnate de un SELECT. De
asemenea s-ai nvatat cum se implementeaza diversi operatori.

Sumarul temei
Selectarea datelor si schimbarea ordinii linilor afisate
Restrictionarea liniilor folosind clauze WHERE
Folosirea ghilimelelor n aliasul coloanelor

Practica:
Aceasta tema va ofera o varietate de exercitii ce folosesc clauze WHERE si clauze ORDER BY.
1. Afisati numele si salariul angajatilor care castiga mai mult de 2850$. Salvati instructiunea SQL intrun fisier p1.sql si apoi rulati-l.
2. Afisati numele angajatului cu marca 7566 precum si numarul departamentului in care lucreaza.
3. Modificati p1.sql astfel incat sa afisati numele si salariul tuturor angajatilor a caror salarii nu intra
in intervalul 1500$ si 2850$. Salvati instructiunea in fisierul p3.sql si apoi rulati-l.
4. Afisati numele, meseria si data de inceput pentru cei care s-au angajat intre 20.02.1981 si
1.05.1981. Afisarea sa fie facuta in ordinea crescatoare a datei de angajare.
5. Afisati numele angajatilor si numerele de departament ale celor care muncesc in departamentele 10
si 30, ordonati alfabetic dupa nume.
6. Modificati fisierul p3.sql si listati numele si salariul celor care castiga mai mult de 1500$ si sunt in
departamentele 10 sau 30. Redenumiti coloanele Angajat si Salar Lunar. Salvati modificarile in
fisierul p6.sql si apoi rulati-l.
7. Afisati numele si data angajarii pentru cei care au fost angajati in 1982.
8. Afisati numele si meseria pentru angajatii care nu au manager.
9. Afisati numele, salariul si comisionul pentru oti angajatii care au comision. Sortati datele in ordine
descendenta dupa salariu si comision.
10. Afisati numele angajatilor care au a treia litera a numelui A.
13

11. Afisati numele angajatilor care au 2 de L in numele lor si sunt din departamentul 30 sau au
manager cu marca 7782.
12. Afisati numele, meseria si salariul pentru toti cei care sunt functionari sau analisti si salariul lor nu
este egal cu 1000$ sau 3000$ sau 5000$.
13. Modificati p6.sql si afisati numele, salariul si comisionul pentru toti angajatii care au comisionul
mai mare decat salariul marit cu 10%. Salvati modificarile in fisierul p13.sql si apoi rulati-l.

14

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