Sunteți pe pagina 1din 13

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 ENAME JOB … DEPTNO “… returneaza toti
7839 KING PRESIDENT 10 angajatii din
7698 BLAKE MANAGER 30 departamentul 10”
7782 CLARK MANAGER 10
7566 JONES MANAGER 20

EMP
EMPNO ENAME JOB … DEPTNO
7839 KING PRESIDENT 10
7782 CLARK MANAGER 10
7934 MILLER CLERK 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 [DISTINCT] {*, column [alias], …}


FROM table
[WHERE 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 restritioneaza interogarea la liniile ce îndeplinesc conditia.
condition 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 JOB DEPTNO


JAMES CLERK 30
SMITH CLERK 20
ADAMS CLERK 20
MILLER CLERK 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.

2
SQL> SELECT ename, empno, job, deptno
2 FROM emp
3 WHERE job=’clerk’;

Oracle retine datele într-un format numeric intern, reprezentând 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 decât
>= Mai mare sau egal
< Mai mic decât
<= 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 SAL COMM


MARTIN 1250 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 decât 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 Semnificatie
BETWEEN Între doua valori (inclusiv)
…AND…
IN(lista) Potriveste orice valoare din lista
LIKE Potriveste un tip de caracter
IS NULL 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 Limita
inferioara superioara

ENAME SAL
MARTIN 1250
TURNER 1500
WARD 1250
ADAMS 1100
MILLER 1300

Operatorul BETWEEN:
Liniile pot fi afisate bazându-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 MGR


7902 FORD 3000 7566
7369 SMITH 800 7902
7788 SCOTT 3000 7566
7876 ADAMS 1100 7788
4
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 câteva 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’;

Folosirea operatorului LIKE

• Pot fi combinate diferite tipuri de potriviri pe caracter

5
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:
Când 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 MGR
KING

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.
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

6
ENAME JOB COMM
KING PRESIDENT
BLAKE MANAGER
CLARK MANAGER

Operatori logici

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

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 pâna acum au specificat conditii numai în clauza WHERE. Se pot folosi câteva
conditii într-o clauza WHERE folosind operatorii AND si OR.

Folosirea operatorului AND

AND cere ca ambele conditii sa fie adevarate.

SQL> SELECT empno, ename, job, sal


2 FROM emp
3 WHERE sal>=1100
4 AND job=’CLERK’;

EMPNO ENAME JOB SAL


7876 ADAMS CLERK 1100
7934 MILLER CLERK 1300

Operatorul AND:
Î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 câstiga 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.

7
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 ENAME JOB SAL


7839 KING PRESIDENT 5000
7698 BLAKE MANAGER 2850
7782 CLARK MANAGER 2450
7566 JONES MANAGER 2975
7654 MARTIN SALESMAN 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 câstiga 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’);

ENAME JOB
KING PRESIDENT
MARTIN SALESMAN
ALLEN SALESMAN
TURNER SALESMAN
WARD SALESMAN

8
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 UNKNOWN


FALSE TRUE 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 Operator


1 Toti operatorii de comparatie
2 NOT
3 AND
4 OR

Precedenta regulilor se poate schimba folosind paranteze.

Reguli de precedenta

SQL> SELECT ename, job, sal


2 FROM emp
3 WHERE job=’SALESMAN’
4 OR job=’PRESIDENT’
5 AND sal>=1500;

ENAME JOB SAL


KING PRESIDENT 5000
MARTIN SALESMAN 1250
ALLEN SALESMAN 1600
TURNER SALESMAN 1500
WARD SALESMAN 1250

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 câstiga mai mult de 1500 sau daca angajatul este
SALESMAN.”

9
Reguli de precedenta

Folosirea parantezelor pentru a forta prioritatea

SQL> SELECT ename, job, sal


2 FROM emp
3 WHERE (job=’ SALESMAN’
4 OR job=’PRESIDENT’)
5 AND sal>1500;

ENAME JOB SAL


KING PRESIDENT 5000
ALLEN SALESMAN 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 câstiga 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 JOB DEPTNO HIREDATE


SMITH CLERK 20 17-DEC-80
ALLEN SALESMAN 30 20-FEB-81

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];

10
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 JOB DEPTNO HIREDATE


ADAMS CLERK 20 12-JAN-83
SCOTT ANALYST 20 09-DEC-82
MILLER CLERK 10 23-JAN-82
JAMES CLERK 30 03-DEC-81
FORD ANALYST 20 03-DEC-81
KING PRESIDENT 10 17-NOV-81
MARTIN SALESMAN 30 28-SEP-81

Ordonarea implicita a datelor:


Ordinea implicita a sortarii datelor este cea ascendenta:
• Valorile numerice sunt afisate începând cu cea mai mica valoare – de exemplu 1- 999.
• Datele sunt afisate începând 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 cuvântul cheie DESC dupa numele
coloanei în clauza ORDER BY. În exemplul de mai sus rezultatele sunt sortate dupa cei mai recenti
angajati dintre salariati.

Sortarea dupa aliasul coloanei

SQL> SELECT empno, ename, sal*12 annsal


2 FROM emp
3 ORDER BY annsal;

11
EMPNO ENAME ANNSAL
7369 SMITH 9600
7900 JAMES 11400
7876 ADAMS 13200
7654 MARTIN 15000
7521 WARD 15000
7934 MILLER 15600
7844 TURNER 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 DEPTNO SAL


KING 10 5000
CLARK 10 2450
MILLER 10 1300
FORD 20 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.
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;

12
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

Sumarul temei:
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
intr-un 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’.
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.

13

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