Sunteți pe pagina 1din 14

Sintaxa de bază a instrucţiunilor SQL.

Restricţionarea şi sortarea datelor


obţinute în urma interogării unei baze de date
Obiective

• Cunoaşterea capabilităţilor instrucţiunilor SELECT


• Executarea unor instrucţiuni SELECT de bază
• Cunoaşterea diferenţelor dintre instrucţiunile SQL şi comenzile SQL*Plus
• Limitarea numărului înregistrărilor returnate de o interogare
• Sortarea înregistrărilor returnate de o interogare

Introducere

SQL (Structured Query Language) este unul dintre limbajele relaţionale de cereri care formează
nucleul multor sisteme de gestiune a bazelor de date. El a fost dezvoltat pentru sistemul de gestiune
al bazelor de date System R de cercetători din cadrul IBM Research Laboratory, San Jose-California
la sfârşitul anilor ’70. SQL a fost standardizat şi a devenit limbajul de referinţă pentru bazele de
date relaţionale.
SQL este un limbaj de comenzi pentru comunicarea cu serverul Oracle din orice aplicaţie. Când se
introduce o instrucţiune SQL, aceasta este stocată într-o zonă de memorie numită buffer-ul SQL şi
ea va rămâne în buffer până în momentul introducerii unei noi instrucţiuni.
SQL*Plus este un instrument Oracle care recunoaşte şi trimite instrucţiuni SQL la server pentru
execuţie şi conţine propriul limbaj de comenzi.

Instrucţiuni SQL Instrucţiuni SQL


Buffer

SQL*Plus SERVER

Comenzi SQL*Plus Rezultatele interogării

Raport
formatat

Caracteristicile limbajului SQL:


• poate fi folosit de o gamă largă de utilizatori, inclusiv de cei ce nu sunt programatori;
• este un limbaj neprocedural;
• reduce timpul necesar pentru crearea si întreţinerea sistemelor.

Caracteristicile limbajului SQL*Plus:


• acceptă fişiere de instrucţiuni SQL;
• furnizează un editor în mod linie pentru modificarea instrucţiunilor SQL;
• controlează setările de mediu;
• formatează rezultatele interogărilor sub formă de rapoarte;
• accesează baze de date locale si la distanţă.

1
Următorul tabel cuprinde câteva elemente de comparaţie între SQL şi SQL*Plus.

SQL SQL*Plus
Este un limbaj pentru comunicarea cu serverul Oracle Recunoaşte instrucţiuni SQL şi le trimite la server
pentru accesarea datelor
Este bazat pe standardul ANSI SQL Este o interfaţă proprietate Oracle pentru executarea
instrucţiunilor SQL
Manipulează date şi definiţii de tabele în baze de date Nu permite manipularea valorilor în baze de date
O instrucţiune se stochează in bufferul SQL pe una sau Este permisă o comandă pe linie şi nu este memorată în
mai multe linii bufferul SQL
Nu are caracter de continuare Foloseşte caracterul (-) pentru continuarea unei comenzi
dacă aceasta nu încape pe o linie
Foloseşte un caracter de terminare pentru executarea Nu are nevoie de caractere de terminare. Se execută
imediată a comenzii imediat
Nu pot fi abreviate Pot fi abreviate
Foloseşte funcţii pentru anumite formatări Foloseşte comenzi pentru formatări

Mediul SQL*Plus oferă numeroase facilităţi, permiţând:


• executarea instrucţiunilor SQL pentru extragerea, modificarea, adăugarea şi ştergerea datelor
din baza de date;
• formatarea, efectuarea de calcule, stocarea şi listarea rezultatele interogărilor sub formă de
rapoarte;
• crearea de fişiere de script pentru stocarea instrucţiunilor SQL.

Comenzile SQL*Plus se împart în următoarele mari categorii:

Categorie Scop
Mediu Afectează comportamentul general al instrucţiunilor SQL pentru sesiunea respectivă
Formatare Formatează rezultatele interogării
Manipulări de fişiere Salvează, încarcă şi rulează fişiere de script
Execuţie Trimite instrucţiuni SQL din bufferul SQL la serverul Oracle
Editare Modifică instrucţiunea SQL aflată în buffer
Interacţiune Permite crearea şi pasarea variabilelor către instrucţiuni SQL, afişarea variabilelor şi listarea
mesajelor pe ecran
Diverse Diferite comenzi pentru conectarea la baza de date, manipularea mediului SQL*Plus şi afişarea
coloanelor

Modul de apel al SQL*Plus depinde de tipul sistemului de operare sau a mediului Windows utilizat.
Pentru conectarea în mediul Windows NT trebuie urmaţi următorii paşi:

1. Start -> Programs -> Oracle-OraHome92 -> Application Development -> SQL Plus;
2. Se completează: username, parola şi numele bazei de date.
Pentru conectarea într-un mediu de tip linie de comandă se lansează următoarea comandă:

Sqlplus [username[/password[@database]]]
unde: username = numele utilizatorului din baza de date;
password = parola de conectare la baza de date;
@database = şirul de conectare la baza de date (numele bazei de date).

Notă: Din motive de securitate se recomandă introducerea numelui de utilizator şi a numelui bazei
de date, urmând ca apoi, la promptul Password, să se introduce parola.

2
Sintaxa de bază a instrucţiunilor SQL

Instrucţiunea SELECT

Pentru extragerea informaţiilor din baza de date se utilizează instrucţiunea SELECT. Cu ajutorul
acestei comenzi se pot realiza următoarele operaţii asupra datelor din baza de date:
• SELECŢIE (SELECTION): evaluarea rezultatului interogării va lua în calcul numai anumite
linii din tabelele de date, pe baza unor criterii de selecţie.
• PROIECŢIE (PROJECTION): rezultatul interogării va conţine numai anumite coloane din
tabele de date.
• JONCŢIUNE (JOIN) : utilizată pentru a combina date aflate în tabele diferite prin crearea unei
legături între coloanele corespunzătoare.

Sintaxa de bază a comenzii SELECT este următoarea:


SELECT [ DISTINCT ] {*, coloana [alias] , …}
FROM tabel;

În cea mai simplă formă instrucţiunea SELECT conţine:

• o clauză SELECT care specifică coloanele ce vor fi afişate;


• o clauză FROM care specifică tabelele ce conţin coloanele menţionate în clauza SELECT.

Din punct de vedere sintactic:


SELECT este o listă de una sau mai multe coloane;
DISTINCT suprimă duplicatele;
* selectează toate coloanele;
coloana numele coloanei;
alias redenumeşte coloana selectată;
FROM tabel specifica tabelul ce conţine coloanele din clauza SELECT.

Indicaţii privind scrierea instrucţiunilor SQL

Pentru a construi instrucţiuni valide, uşor de citit şi de editat trebuie avute în vedere următoarele
reguli:
• în general instrucţiunile SQL pot fi scrise cu litere mari sau mici;
• instrucţiunile SQL pot fi introduse pe una sau mai multe linii;
• cuvintele cheie nu pot fi abreviate sau despărţite în linii diferite;
• de obicei clauzele sunt plasate pe linii separate pentru creşterea lizibilităţii textului;
• este de preferat ca toate cuvintele cheie să fie introduse cu majuscule, iar toate celelalte cuvinte,
cum ar fi numele de tabele şi coloane, să fie introduse cu litere mici;
• în mediul SQL*Plus, o instrucţiune SQL este introdusă la promt-ul SQL, iar următoarele linii
aparţinând instrucţiunii sunt numerotate. Acesta se numeşte buffer-ul SQL. Numai o singură
instrucţiune SQL poate exista în buffer la un moment de timp.

Notă:
- un cuvânt cheie se referă la o clauză SQL, cum ar fi SELECT, FROM;
- o clauză reprezintă o parte a unei instrucţiuni SQL (e.g. SELECT empno, ename);
- o instrucţiune este dată de o combinaţie de una sau mai multe clauze (e.g. SELECT * FROM
emp).

3
Execuţia instrucţiunilor SQL se poate face prin:
• plasarea caracterului ‘;’ la sfârşitul ultimei clauze;
• plasarea caracterului ‘/’ la sfârşitul ultimei linii din buffer;
• plasarea unui caracter slash ‘/’ la prompt-ul SQL;
• lansarea în SQL*Plus a comenzii RUN (la promt-ul SQL).

Selectarea tuturor coloanelor şi liniilor

Dacă se doreşte afişarea tuturor coloanele cu date dintr-un tabel se foloseşte cuvântul cheie
SELECT împreună cu un asterix (*) . În exemplul de mai jos, tabelul dept conţine trei coloane
(DEPTNO, DNAME si LOC) şi patru linii, câte o linie pentru fiecare departament.

SQL> SELECT * DEPTNO DNAME LOC


2 FROM scott.dept; ------ ----------- --------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICACO
40 OPERATIONS BOSTON

Acelaşi rezultat se poate obţine şi dacă enumerăm toate coloanele după cuvântul cheie SELECT. De
exemplu, următoarea instrucţiune SQL afişează toate coloanele şi toate liniile din tabelul dept.

SQL> SELECT deptno, dname, loc


2 FROM scott.dept;

Selectarea unor anumite coloane

În cazul în care se doreşte afişarea unor anumite coloane din tabel, se va specifica în clauza
SELECT numele acelor coloane, separate prin virgulă (‘,’). Ordinea în care coloanele selectate vor
fi afişate pe ecran este dată de ordinea în care au fost enumerate în clauza SELECT. De exemplu,
pentru a afişa toate departamentele şi oraşele din tabelul scott.dept se va executa următoarea
instrucţiune SQL:

SQL> SELECT deptno, loc DEPTNO LOC


2 FROM scott.dept; ------ ----------
10 NEW YORK
20 DALLAS
30 CHICAGO
40 BOSTON

Afişarea rezultatului unei interogări respectă următoarele convenţii:


- numele coloanelor de tip şir de caractere şi dată calendaristică, precum şi datele din tabel
asociate coloanelor respective sunt aliniate la stânga;
- numele coloanelor de tip numeric şi datele din coloanele respective sunt aliniate la dreapta;
- numele unei coloane de tip dată calendaristică sau şir de caractere poate fi trunchiat, dar capul
de coloană de tip numeric nu poate fi trunchiat;
- numele coloanelor sunt afişate implicit cu litere mari; coloanele pot fi redenumite cu ajutorul
unui alias.

Expresii aritmetice

În cazul în care se doreşte modificarea modului de afişare a datelor, în sensul executării unor
calcule sau creării unor scenarii, se pot utiliza expresii aritmetice. Expresiile aritmetice pot conţine

4
nume de coloane, constante numerice si operatori aritmetici (+, -, *, /). Aceşti operatori pot fi
utilizaţi în orice clauză SQL, exceptând clauza FROM.
În exemplul următor se doreşte afişarea numelui (ename), salariului (sal) şi a valorii sal+300
pentru fiecare angajat din tabelul scott.emp. Instrucţiunea SQL corespunzătoare este:

SQL> SELECT ename, sal, sal+300 ENAME SAL SAL+300


2 FROM scott.emp; -------- ------ ----------
KING 5000 5300
BLAKE 2850 3150
CLARK 2450 2750
JONES 2975 3275
MARTIN 1250 1550

Exemplul anterior utilizează operatorul “+” pentru a mări salariile cu 300 pentru toţi angajaţii şi
afişează o nouă coloană SAL+300. De notat că SAL+300 nu este o coloană nouă în tabelul
scott.emp. Implicit, denumirea noii coloane este dată de expresia aritmetică care a generat-o (în
acest caz SAL+300).

Notă: SQL*Plus ignoră spaţiile prezente înainte şi după operatorii aritmetici.

Dacă o expresie aritmetică conţine mai mult de un operator, înmulţirea şi împărţirea sunt evaluate
primele, apoi adunarea şi scăderea. Dacă operatorii folosiţi într-o expresie sunt de aceeaşi prioritate,
evaluarea se va face de la stânga la dreapta. Folosirea parantezelor determină ca expresia dintre
paranteze sa fie evaluată prima.

Valoarea null

Dacă o linie nu are date pentru o coloană particulară, această valoare se numeşte null. Semnificaţia
valori null este de dată nedisponibilă, neatribuită, necunoscută sau inaplicabilă. Valoarea null nu
este aceeaşi cu valoarea 0 (pentru date de tip numeric) sau “” (pentru datele de tip şir de caractere).
Coloanele de orice tip pot conţine valoarea null, cu excepţia celor care au fost definite la creare ca
fiind NOT NULL sau chei primare (PRIMARY KEY).

SQL> SELECT name, job, comm ENAME JOB COMM


2 FROM scott.emp; ------ ---------- ------
KING PRESIDENT
BLAKE MANAGER

TURNER SALESMAN 0

Se observă că în coloana COMM din tabelul scott.emp doar angajatul TURNER poate avea
comision, ceilalţi angajaţi nefiind îndreptăţiţi să primească comision.
Dacă valoarea unei coloane ce apare într-o expresie aritmetică este null, rezultatul este null. După
cum se ştie, o încercare de împărţire la zero generează o eroare. În cazul unei împărţiri la o
valoarea null, rezultatul este null (necunoscut).

Definirea alias-urilor pentru coloane

La afişarea rezultatului unei interogări, SQL* Plus foloseşte numele coloanei ca şi cap de tabel.
Deoarece în multe cazuri acest cap de tabel nu este sugestiv, se poate schimba numele coloanei
afişate folosind un alias de coloană. Alias-ul se specifică în clauza SELECT, imediat după numele
coloanei. Dacă alias-ul conţine spaţii, caractere speciale ($ sau # - plasate la începutul alias-ului)
sau dacă au importanţă literele mari (mici) se va scrie alias-ul între ghilimele (“ ”).

5
SQL> SELECT ename AS name, sal salary NAME SALARY
2 FROM scott.emp; ---- --------
………

SQL> SELECT ename “Name”, sal*12 “Annual Salary” Name Annual Salary
2 FROM scott.emp; ------ --------------
……

Primul exemplu afişează numele şi salariul lunar al tuturor angajaţilor. Cuvântul cheie opţional AS
a fost folosit înainte de alias, rezultatul fiind acelaşi dacă AS ar fi lipsit din clauza SELECT. De
notat că alias-urile name şi salary au fost scrise cu litere mici, iar la afişare au apărut scrise cu
majuscule.
În cel de-al doilea exemplu se doreşte afişarea numelor anagajaţilor şi a salariilor anuale. Deoarece
alias-ul Annual Salary implică folosirea spaţiului, alias-ul trebuie scris între ghilimele (“ ”).

Operatorul de concatenare ( || )
În cazul în care se doreşte concatenarea unor coloane, a unor expresii aritmetice sau valori constante
pentru a crea expresii de tip şir de caractere se va utiliza operatorul de concatenare (||). Coloanele ce
apar de o parte şi de alta a operatorului de concatenare sunt combinate pentru a forma o singură
coloană la afişare.

SQL> SELECT ename || job AS “Employees” Employees


2 FROM scott.emp; --------------
KINGPRESIDENT
BLAKEMANAGER
CLARKMANAGER
JONESMANAGER
MARTINSALESMAN
………

În exemplul de mai sus, coloanele ENAME şi JOB sunt concatenate, iar coloanei rezultante i se
atribuie alias-ul Employees. Cuvântul cheie AS folosit înaintea alias-ului măreşte lizibilitatea
instrucţiunii SELECT.

Şiruri de caractere
Un “literal” este orice caracter, expresie sau număr inclus în lista SELECT care nu este un nume de
coloană sau alias. Un literal este afişat pentru fiecare linie returnată de interogare. Valorile literale
pentru datele calendaristice şi caractere trebuie incluse între (‘ ’).

SQL> SELECT ename || ‘ ‘ || ‘is a’ || job Employee Details


2 AS “Employee Details” --------------------
3 FROM scott.emp; KING is a PRESIDENT
BLAKE is a MANAGER
CLARK is a MANAGER
JONES is a MANAGER
MARTIN is a SALESMAN
………

Exemplul de mai sus afişează numele şi ocupaţia tuturor angajaţilor, numele coloanei fiind
Employee Details. Spaţiile dintre ghilimelele simple din instrucţiunea SELECT au fost
introduse pentru îmbunătăţirea lizibilităţii ieşirii.

6
Eliminarea rândurilor duplicat
In mod predefinit interogările afişează toate liniile, inclusiv cele duplicat.

SQL> SELECT deptno DEPTNO


2 FROM scott.emp; ---------
20
30
30
20
......

SQL*Plus va afişa rezultatul interogării fără a elimina rândurile duplicat. Exemplul de mai sus
afişeaza toate departamentele din tabelul scott.emp.
Eliminarea duplicatelor se face folosind cuvântul cheie DISTINCT în clauza SELECT.
SQL> SELECT DISTINCT deptno DEPTNO
2 FROM scott.emp; ---------
10
20
30

În cazul în care se specifică mai multe coloane după clauza DISTINCT vor fi afectate toate
coloanele selectate, rezultatul reprezentând o combinaţie distinctă a acestor coloane.

SQL> SELECT DISTINCT deptno, job


2 FROM scott.emp;

Comenzi PL*SQL

Afişarea structurii unui tabel

Se foloseşte comanda SQL*Plus DESC[RIBE] tablename, unde tablename este numele


unui tabel , al unei vederi sau este un sinonim accesibil utilizatorului.

SQL> DESCRIBE scott.dept Name Null? Type


--------- --------- ---------
DEPTNO NOT NULL NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)

Tabelul de mai sus conţine informaţii privind structura tabelului scott.dept, numele coloanelor
fiind enumerate în coloana Name. Coloana Null? indică dacă o coloană trebuie să conţină date.
Valoarea NOT NULL semnifică faptul că valoarea null nu este permisă în acea coloană. Type
reprezintă tipul de date al coloanei.

Tip de date Descriere


NUMBER(p,s) Valori numerice având un număr maxim de p cifre, unde s este numărul de cifre a părţii
subunitare
VARCHAR2(s) Şir de caractere de lungime variabilă cu lungime maximă s
DATE Date calendaristice între 1 ianuarie 4712 b.c. şi 31 decembrie 9999 a.c.
CHAR(s) Şir de caractere de lungime fixă s

Comenzile de editare ale mediului SQL*Plus

Câteva comenzi SQL*Plus utile în gestiunea buffer-ului SQL sunt:


• A[PPEND] text - adaugă text la sfârşitul liniei curente din buffer

7
• C[HANGE] / old / new - schimbă textul old cu cel new în linia curentă
• C[HANGE] / text / - şterge text din linia curentă din buffer
• C[LEAR] BUFF[ER] - şterge toate liniile din bufferul SQL
• DEL - şterge linia curentă din buffer
• DEL n - şterge linia n din buffer
• DEL m n - şterge din buffer toate liniile având numărul cuprins între m şi n
• I[NPUT] - inserează un număr nedefinit de linii
• I[NPUT] text - inserează o linie în buffer, conţinutul liniei fiind dat de text
• L[IST] - listează toate liniile din bufferul SQL
• L[IST] n - listează linia n din buffer
• L[IST] m n - listează liniile de la m la n din buffer
• n - linia n devine linia curentă din buffer
• n text - înlocuieşte linia n din buffer cu text
• 0 text - inserează în buffer o linie înaintea liniei 1
Notă: La prompt-ul SQL se poate introduce doar o singură comandă SQL*Plus, ce nu este stocată
în buffer. Pentru a continua o comandă pe linia următoare se va plasa caracterul (-) la sfârşitul liniei.

Comenzi SQL*Plus pentru fişiere

SAVE filename - salvează conţinutul buffer-ului SQL într-un fişier. Opţiunea APPEND adaugă la sfârşitul
[REP[LACE]APP[END]] fişierului, iar opţiunea REPLACE suprascrie conţinutul fişierului;
GET filename - conţinutul fişierului filename este încărcat în buffer-ul SQL (extensia implicită pentru
fişier este .sql);
START filename - rulează fişierul script filename;
@ filename - are acelaşi efect ca în cazul utilizării comenzii START;
ED[IT] - lansează editorul şi salvează conţinutul buffer-ului în fişierul afiedt.buf;
ED[IT] filename - lansează editorul pentru editarea conţinutului unui fişier salvat;
SPO[OL] [filename] - stochează rezultatul unei interogări într-un fişier. OFF închide fişierul. OUT închide
OFF | OUT fişierul şi îl trimite la imprimantă sistem;
EXIT - ieşire din SQL*Plus;

Restricţionarea şi sortarea datelor obţinute în urma interogării unei baze


de date

În urma interogării unei baze de date poate apare necesitatea reducerii numărului de linii afişate sau
specificării ordinii în care să fie afişate datele. Acest referat prezintă regulile SQL folosite pentru
realizarea acestor acţiuni, noţiunile prezentate fiind însoţite de numeroase exemple.

Limitarea înregistrărilor folosind o selecţie:

EMP
EMPNO ENAME JOB … DEPTNO “… returnează toţi angajaţii din
7839 KING PRESIDENT 10 departamentul 10”
7698 BLAKE MANAGER 30
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

8
Să presupunem, conform exemplului de mai sus, că se doreşte afişarea tuturor angajaţilor din
departamentul 10 (prezintă interes doar setul de linii care au valoarea 10 în coloana DEPTNO).
Această metodă de restricţionare reprezintă baza clauzei WHERE în SQL.

Limitarea liniilor selectate


Se poate restricţiona numărul de linii returnate de o interogare folosind clauze WHERE. O clauză
WHERE conţine o condiţie ce trebuie îndeplinită de fiecare linie din rezultat şi urmează imediat după
clauza FROM.
SELECT [DISTINCT] {*, coloana [alias], …}
FROM tabel
[WHERE conditie];
unde:
WHERE restricţionează interogarea la liniile ce îndeplinesc condiţia conditie.
conditie reprezintă condiţia ce trebuie satisfăcută de fiecare înregistrare ce
apare în rezultat; este compusă din nume de coloane, expresii,
constante şi operatori de comparaţie.

Clauza WHERE poate compara valorile din coloane, valori literale, expresii aritmetice sau funcţii,
fiind compusă din trei elemente:
• numele coloanei
• operatorul de comparaţie
• nume de coloană, constantă sau listă de valori

Folosirea clauzei WHERE

SQL> SELECT ename, job, deptno ENAME JOB DEPTNO


2 FROM scott.emp ------- ------- -------
3 WHERE job=‘CLERK’; JAMES CLERK 30
SMITH CLERK 20
ADAMS CLERK 20
MILLER CLERK 10

Exemplul anterior afişează toţi angajaţii care au funcţia CLERK.

Şiruri de caractere şi date calendaristice

Şirurile de caractere şi datele calendaristice utilizate în clauza WHERE trebuie incluse între
apostrofuri (‘ ‘). Toate căutările la nivel de caracter sunt case-sensitive (i.e. se face distincţie între
litere mici şi majuscule). Datele calendaristice sunt memorate de Oracle în formatul secol, an, luna,
zi, ore, minute şi secunde. Afişarea implicită a datei este DD-MON-YY.
Notă: valorile numerice nu trebuie incluse între apostrofuri.

Operatori de comparaţie

Operatorii de comparaţie (=, >, >=, <, <=, <>) sunt folosiţi în condiţii care compară două expresii.
Utilizarea lor în clauza WHERE respectă următorul format:

WHERE expresie operator valoare

Exemple:
WHERE hiredate=’01-JAN-95’

9
WHERE sal>=1500
WHERE ename=’SMITH’
Alţi operatori de comparaţie ce pot fi utilizaţi într-o clauză WHERE sunt prezentaţi în tabelul
următor:

Operator Semnificaţie
BETWEEN… AND … Între două valori (inclusiv)
IN (listă) Potriveşte orice valoare din listă
LIKE Potriveşte un tip de caracter
IS NULL Este valoare null

Operatorul BETWEEN
Operatorul BETWEEN se utilizează pentru selectarea valorilor dintr-un interval.

SQL> SELECT ename, sal ENAME SAL


2 FROM scott.emp ------- ------
3 WHERE sal BETWEEN 1000 AND 1500; MARTIN 1250
TURNER 1500
Limita Limita WARD 1250
inferioară superioară ADAMS 1100
MILLER 1300

Operatorul IN
Operatorul IN este utilizat pentru căutare într-o listă de valori. El poate fi utilizat cu orice tip de
dată.

SQL> SELECT empno, ename, sal, mgr EMPNO ENAME SAL MGR
2 FROM scott.emp ------ ------- ------ -----
3 WHERE mgr IN (7902, 7566, 7788); 7902 FORD 3000 7566
7369 SMITH 800 7902
7788 SCOTT 3000 7566
7876 ADAMS 1100 7788

Următorul exemplu returnează câte o linie din tabelul scott.emp pentru fiecare angajat al cărui
nume este inclus în lista de nume din clauza WHERE.
SQL> SELECT empno, ename, mgr, deptno
2 FROM scott.emp
3 WHERE ename IN (‘FORD’, ‘ALLEN’);

Notă: dacă în listă sunt folosite caractere sau date calendaristice, acestea trebuie incluse între
apostrofuri (‘ ‘).

Operatorul LIKE

SQL> SELECT ename


2 FROM scott.emp
3 WHERE ename LIKE ‘S%’;

Nu întotdeauna se cunoaşte valoarea exactă pe baza căreia se va efectua căutarea. Instrucţiunea


SELECT permite selectarea liniilor care corespund unui tipar de caractere cu ajutorul operatorului
LIKE. Operaţia de potrivire după un tipar de caractere este referită drept căutare cu caractere
wildcard. Pentru construirea şirurilor de căutare pot fi utilizate două simboluri:

10
Simbol Descriere
% Reprezintă orice secvenţă de caractere
_ (underscore) Reprezintă un singur caracter

Instrucţiunea SELECT de mai sus returnează numele angajaţilor din tabelul scott.emp al căror
nume începe cu “S”. Numele care încep cu “s” nu vor fi returnate.
În anumite cazuri, operatorul LIKE poate fi utilizat în locul operatorului BETWEEN. Următorul
exemplu afişează numele şi data angajării tuturor angajaţilor a căror angajare s-a făcut între ianuarie
1981 şi decembrie 1981.

SQL> SELECT ename, hiredate


2 FROM scott.emp
3 WHERE hiredate LIKE ‘%81’;

• Pot fi combinate diferite tipuri de potriviri pe caracter

ENAME
SQL> SELECT ename -----
2 FROM scott.emp JAMES
3 WHERE ename LIKE ‘_A%’; WARD

• Dacă se doreşte căutarea caracterelor ‘%’ sau ‘_’ se va folosi opţiunea ESCAPE, care precizează
de fapt caracterul care va fi utilizat drept Escape.
Următoarea instrucţiune SELECT afişează numele tuturor angajaţilor al căror nume conţine
secvenţa de caractere “A_S”.

SQL> SELECT ename


2 FROM scott.emp
3 WHERE ename LIKE ‘%A\_S’ ESCAPE ‘\’;

Operatorul IS NULL

Operatorul IS NULL este utilizat pentru căutarea valorilor null. Deoarece valoarea null are
semnificaţia unei valori indisponibile, neatribuite, necunoscute sau neaplicabile ea nu poate apare în
cadrul unei operaţii de comparaţie, deoarece ar conduce la un rezultat null. De exemplu, pentru a
afişa numele, funcţia şi comisionul tuturor angajaţilor care nu au dreptul la comision se va folosi
următoarea instrucţiune SELECT:
SQL> SELECT ename, job, comm ENAME JOB COMM
2 FROM scott.emp ------ --------- -----
3 WHERE comm IS NULL; KING PRESIDENT
BLAKE MANAGER
CLARK MANAGER

Operatori logici (AND, OR, NOT)

Un operator logic combină două componente de tip condiţie pentru a produce un singur rezultat
bazat pe acestea sau inversează rezultatul unei singure condiţii. În SQL sunt disponibili trei
operatori logici: AND, OR şi NOT.

Operator Comentariu
AND Returnează TRUE dacă ambele componente ale condiţiei sunt adevărate
OR Returnează TRUE dacă una din componentele condiţiei este adevărată
NOT Returnează TRUE dacă respectiva condiţie este falsă

11
Folosirea operatorului AND

SQL> SELECT empno, ename, job, sal EMPNO ENAME JOB SAL
2 FROM scott.emp ----- ------- ------ ------
3 WHERE sal>=1100 7876 ADAMS CLERK 1100
4 AND job=’CLERK’; 7934 MILLER CLERK 1300

În exemplul de mai sus ambele condiţii trebuie să fie adevărate pentru a fi selectată o înregistrare.
De aceea, un angajat care are funcţia CLERK şi câştigă mai mult de $1100 va fi selectat.
Notă: - toate căutarile de tip caracter sunt case-sensitive.
- şirurile de caracter trebuie incluse între apostrofuri (‘ ‘).

Folosirea operatorului OR

SQL> SELECT empno, ename, job, sal EMPNO ENAME JOB SAL
2 FROM scott.emp ------ ------ ---------- ------
3 WHERE sal>=1100 7839 KING PRESIDENT 5000
4 OR job=’CLERK’; 7698 BLAKE MANAGER 2850
7782 CLARK MANAGER 2450
7566 JONES MANAGER 2975
7654 MARTIN SALESMAN 1250
……

În exemplul de mai sus, vor fi selectate înregistrările care îndeplinesc cel puţin o condiţie: fie
sal>=1100, fie job=’CLERK’.

Folosirea operatorului NOT

SQL> SELECT ename, job ENAME JOB


2 FROM scott.emp ------- ---------
3 WHERE job NOT IN (‘CLERK’, ‘MANAGER’, ‘ANALYST’); KING PRESIDENT
MARTIN SALESMAN
ALLEN SALESMAN
TURNER SALESMAN
WARD SALESMAN

În exemplul de mai sus este afişat numele şi funcţia tuturor angajaţilor a căror funcţie nu este
CLERK, MANAGER sau ANALYST.

Notă: operatorul NOT poate fi combinat şi cu alţi operatori SQL, cum ar fi BETWEEN, LIKE şi IS
NULL.
WHERE job NOT IN (‘CLERK’, ‘ANALYST’)
WHERE sal NOT BETWEEN 1000 AND 1500
WHERE comm IS NOT NULL

Precedenţa operatorilor

Prioritate Operator
1 – maximă Toţi operatorii de comparaţie
2 NOT
3 AND
4 – minimă OR
Notă: aceste reguli pot fi încălcate folosind paranteze.

12
Clauza ORDER BY
Liniile returnate de o interogare sunt afişate într-o ordine oarecare. Pentru sortarea liniilor se
utilizează clauza ORDER BY, care, dacă este folosită, trebuie să apară ultima în instrucţiunea
SELECT. Sortarea se poate face dupa o coloană, o expresie sau după un alias de coloană.
Sintaxă:

SELECT expresie
FROM tabel
[WHERE conditie]
[ORDER BY {coloana, expresie} [ASC|DESC];
unde:
ORDER BY specifică ordinea în care sunt afişate liniile.
ASC ordonează liniile ascendent – implicit.
DESC ordonează liniile descendent.

Dacă nu este folosită clauza ORDER BY ordinea sortării este nedefinită şi Serverul Oracle poate
afişa liniile în ordine diferită pentru două interogări identice.
SELECT-ul următor afişează rezultatele interogării ordonate descrescător după coloana hiredate.

SQL> SELECT ename, job, deptno, hiredate ENAME JOB DEPTNO HIREDATE
2 FROM scott.emp ------- -------- ------- ---------
3 ORDER BY hiredate DESC; 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

Ordinea implicită a sortării datelor este cea ascendentă:


• valorile numerice sunt afişate începând cu cea mai mică valoare – de exemplu 1- 999.
• datele sunt afişate începând cu cea mai recentă – de exemplu 01-JAN-92 înaintea lui 01-JAN-
95.
• valorile tip caracter sunt afişate în ordine alfabetică – de exemplu A înaintea lui Z.
• valorile null sunt afişate ultimele în cazul sortărilor ascendente si primele pentru cele
descendente.
Următoarea instrucţiune SELECT ordonează liniile după aliasul coloanei sal*12 (de tip expresie
aritmetică).

SQL> SELECT empno, ename, sal*12 annsal EMPNO ENAME ANNSAL


2 FROM scott.emp ------ ------- -------
3 ORDER BY annsal; 7369 SMITH 9600
7900 JAMES 11400
7876 ADAMS 13200
7654 MARTIN 15000
7521 WARD 15000
7934 MILLER 15600
7844 TURNER 18000
………

În următorul exemplu liniile sunt sortate după coloanele deptno şi sal, iar liniile având aceeaşi
valoare pentru deptno fiind sortate descendent după sal.

13
SQL> SELECT ename, deptno, sal ENAME DEPTNO SAL
2 FROM scott.emp ------- --------- ------
3 ORDER BY deptno, sal DESC; KING 10 5000
CLARK 10 2450
MILLER 10 1300
FORD 20 3000
……

Notă: se poate face sortare şi după o coloană care nu este în lista clauzei SELECT.

Probleme

1. Afişaţi structura tabelului scott.dept şi conţinutul lui.


2. Afişaţi structura tabelului scott.emp. Creaţi o interogare care să afişeze numele, funcţia, data
angajării şi numărul angajatului pentru fiecare angajat, numărul angajatului apărând pe prima
poziţie. Salvaţi instrucţiunea într-un fisier p2.sql.
3. Rulaţi interogarea din fişierul p2.sql.
4. Afişaţi funcţiile (coloana job) din tabelul scott.emp, eliminând duplicatele.
5. Încărcaţi fişierul p2.sql în buffer-ul SQL. Modificaţi instrucţiunea SQL din buffer astfel încât să
redenumiţi numele coloanelor cu Emp#, Employee, Job, Hire Date şi apoi rulaţi interogarea.
6. Creaţi o interogare care să afişeze, pe o singură coloană, numele fiecărui angajat concatenat cu
funcţia sa, separate de virgulă şi spaţiu. Denumiţi coloana Employee and Title.
7. Afişaţi datele din tabelul scott.emp, concatenând toate coloanele. Separaţi coloanele cu o
virgulă şi denumiţi coloana THE_OUTPUT.

Rezultatul interogării este de forma: THE_OUTPUT


--------------------------------------------
7369,SMITH,CLERK,7902,17-DEC-80,800,,20
7499,ALLEN,SALESMAN,7698,20-FEB-81,1600,300,30
7521,WARD,SALESMAN,7698,22-FEB-81,1250,500,30

8. Afişaţi numele şi salariul angajaţilor din tabelul scott.emp care câştigă mai mult de $2850.
Salvaţi instrucţiunea SQL în fişierul p8.sql şi apoi rulaţi-l.
9. Modificaţi p8.sql astfel încât să afişaţi numele şi salariul tuturor angajaţilor ale căror salarii nu
intră în intervalul $1500 - $2850. Salvaţi instrucţiunea în fişierul p9.sql şi apoi rulaţi din nou
interogarea.
10. Afişaţi numele şi numerele de departament ale angajaţilor care lucrează în departamentele 10,
respectiv 30, ordonaţi alfabetic după nume.
11. Modificaţi fişierul p9.sql şi listaţi numele şi salariul angajaţilor care câştigă mai mult de $1500
şi lucrează în departamentul 10 sau 30. Redenumiţi coloanele din rezultat Angajat şi Salar
Lunar. Salvaţi modificările în fişierul p11.sql şi apoi rulaţi-l.
12. Afişaţi numele şi funcţia pentru angajaţii care nu au manager.
13. Afişaţi numele, salariul şi comisionul pentru toţi angajaţii care au comision. Sortaţi datele în
ordine descendentă după salariu şi comision.
14. Afişaţi numele angajaţilor care conţin 2 caractere ‘L’ consecutive în numele lor şi îndeplinesc
următoarea condiţie: lucrează în departamentul 30 sau au manager cu marca 7782.
15. Modificaţi p11.sql şi afişaţi numele, salariul şi comisionul pentru toţi angajaţii care au
comisionul mai mare decât salariul mărit cu 10%. Salvaţi modificările în fişierul p15.sql şi apoi
rulaţi-l.
16. Afişaţi numele, funcţia şi salariul angajaţilor ce au funcţia Clerk sau Analyst şi al căror salariu
nu este de $1000, $3000 sau $5000.
17. Afişaţi numele, funcţia şi data angajării persoanelor angajate între 10 februarie 1981 şi 1 mai
1981. Ordonaţi înregistrările returnate de interogare crescător după data angajării.

14

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