Sunteți pe pagina 1din 49

Luminia Scripcariu

Limbajul SQL

Limbajul SQL

Limbajul de baze de date SQL este implementat n diverse variante n programul de aplicaii ORACLE. Programul Oracle consta dintr-un set complet de constructori de aplicatii si produse pentru utilizatori, cautand sa asigure solutii complete in tehnologia informatiei. Aplicatiile Oracle sunt portabile peste un numar mare de statii de lucru si sisteme de operare, de la calculatoare personale la procesoare paralele. Oracle este inzestrat cu un flexibil Sistem de Management al Bazelor de Date (DBMS - Data Base Management System) numit i SGBD - Serverul Oracle - pentru stocarea si managementul informatiei utilizate de aplicatii. Serverul Oracle cuprinde un SGBD care controleaza:

Stocarea de date in sfera bazelor de date dedicate Recuperarea de date pentru aplicatii utilizand tehnici de optimizare adecvate Securitatea bazelor de date si a taskurilor permise pentru anumiti utilizatori Consistenta si protectia datelor,incluzand arhivarea taskurilor si mecanisme de cautare Comunicarea si integritatea informatiilor,cand bazele de date sunt distribuite intr-o retea.

Aplicatiile Oracle trebuie rulate pe acelasi computer la fel ca si Serverul Oracle. SQL, SQL*PLUS si PL/SQL sunt facilitatile Oracle.

Luminia Scripcariu

Limbajul SQL

Multimea comenzilor SQL sunt conturate ca blocuri de interogare de baza.In particular, noi discutam declaratiile SQL folosite la:

executia calculelor specificarea alternativa a capetelor de coloana concatenarea coloanelor sortarea rindurilor introducerea criteriilor de cautare.

Privire de ansamblu asupra SQL


Un sistem de management al bazei de date necesita un limbaj de interogare pentru a permite utilizatorului sa acceseze datele.SQL (limbaj de interogare structurata) este limbajul utilizat de majoritatea sistemelor de baza de date relational. Limbajul SQL a fost dezvoltat intr-un prototip de sistem de management a bazelor de date relationale - System R -de IBM la mijlocul anilor 1970.In 1979, Corporatia Oracle introduce prima implementare a SQL in varianta comerciala.

Trasaturi caracteristice SQL

SQL este prezentat in limba engleza. Foloseste cuvintele select, insert,delete ca parti ale setului de comenzi. SQL este un limbaj neprocedural :specifica ce informatii doresti,nu cum sa le obtii.Cu alte cuvinte SQL nu iti cere sa specifici metoda de acces la date.Toate cererile SQL folosesc optimizarea cererilor- o parte a RDBMS- pentru a determina rapid remedierea datelor specifi- cate.Aceste trasaturi usureaza obtinerea rezultatelor dorite.

Procesarea SQL asupra inregistrarilor nu se poate face decit asupra unei singure inregistrari la un moment dat.Cea mai comuna forma a unui set de inregistrari este un tabel.

SQL poate fi folosit de un sir de utilizatori incluzand DBA, programatori de aplicatii ,personal de management si multe alte tipuri de utilizatori. SQL pune la dispozitie comenzi pentru o varietate de tascuri incluzand:
o o

date interogate inserarea,extragerea si stergerea rindurilor intr-un tabel.

Luminia Scripcariu
o o o

Limbajul SQL

crearea,modificarea si stergerea obiectelor de tip baza de date controlul accesului la baza de date si la obiectele de tip baza de date. garantarea consistentei bazei de date

La inceput sistemele de management a bazei de date a utilizat un limbaj separat pentru fiecare categorie in parte.SQL le-a unificat pe toate acestea intr-un singur limbaj. SQL a devenit un limbaj standard industrial pentru bazele de date relationale. Institutul National American de Standarde (ANSI) a adoptat SQL ca limbaj standard pentru RDBMS in anul 1986.Organizatia Internationala de Standarde (ISO) a adoptat deasemenea SQL ca limbaj standard pentru RDBMS.Toate RDBMS-urile suporta unele forme de SQL si toti vinzatorii de RDBMS intentioneaza sa se alinieze la standardele ANSI.

Setul de comenzi SQL


Comanda + Descriere: SELECT este comanda cea mai utilizata ; este folosita pentru obtinerea datelor din bazele de date INSERT aceste trei comenzi sunt utilizate pentru a introduce noi UPDATE rinduri,pentru a schimba rindurile existente si stergerea DELETE rindurilor nedorite din tabelele bazelor de date respective. (Ele sunt cunoscute in ansamblu ca DML sau comenzi ale limbajului de manipulare a datelor.) CREATE aceste trei comenzi sunt utilizate dinamic pentru a crea , ALTER utiliza si sterge orice structura de date,de exemplu,tabele, DROP

Luminia Scripcariu

Limbajul SQL

expuneri ,indecsi.(Ele sunt cunoscute sub numele colectiv DDL sau comenzi ale limbajelor de definire a datelor). GRANT aceste doua comenzi sunt utilizate pentru a da sau a lua REVOKE drepturile de acces pentru bazele de date si structurile din Oracle. N.B. Acestea sunt o parte a comenzilor SQL. Pentru o lista mai completa de comenzi se recomanda - Manualul de Referinta a Limbajului SQL- .

Scrierea comenzilor SQL


Cand scriem comenzi SQL ,este important sa ne reamintim cateva reguli simple pentru construirea unor declaratii valide care sunt si usor de citit si de editat:

Comenzile SQL pot fi pe una sau mai multe linii. Clauzele sunt uzual plasate pe linii separate. Tabelarea poate fi folosita. Cuvintele de comanda nu pot fi separate pe mai multe linii. Comenzile SQL nu sunt 'case sensitive'. O comanda SQL este introdusa la promptul SQL si liniile subsecventelor sunt numarate. O singura declaratie poate fi considerata curenta cat timp ea este in buffer si poate fi rulata intr-un numar de moduri :
o o o o

plasand un punct si virgula(;) la sfarsitul ultimei clauze. plasand un punct si virgula /slash la ultima linie in buffer. plasand un slash(/) la promptul SQL. scriind un R[UN] (comanda SQL) la promptul SQL.

Fiecare din urmatoarele declaratii sunt valide:

SELECT * FROM EMP;

SELECT * FROM

Luminia Scripcariu
EMP ;

Limbajul SQL

SELECT * FROM EMP;

Blocul de interogare de baza


Declaratia SELECT regaseste informatia din baza de date implementand toti operatorii din algebra relationala . In cele mai simple forme trebuie sa contina: 1. O clauza SELECT ,care listeaza coloanele pentru afisare astfel incat este esentiala o Proiectie. 2. O clauza FROM care specifica tabela implicata.

Pentru a lista toate numerele departamentelor,numele angajatilor si numarul managerilor in tabela EMP introduceti urmatoarele:

SELECT FROM

DEPTNO,ENAME,MGR EMP;

DEPTNO -----20 30 30 20 30 30 10 20 10 30 20 30 20 10

ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER

MGR ----7902 7698 7698 7839 7698 7839 7839 7566

7698 7788 7698 7566 7782

Luminia Scripcariu

Limbajul SQL

De remarcat ca numele coloanelor sunt separate prin spatiu.


Este posibil sa selectam toate coloanele din tabela prin specificarea unui asterix ('*') dupa cuvantul SELECT .

SELECT FROM

* EMP;

EMPNO ENAME ----- ------7369 SMITH 7499 ALLEN 7521 WARD 7566 JONES 7654 MARTIN 7698 BLAKE 7782 CLARK 7788 SCOTT 7839 KING 7844 TURNER 7876 ADAMS 7900 JAMES 7902 FORD

JOB ------CLERK

MGR ---7902

HIREDATE

SAL

COMM

DEPTNO

--------- --------13-JUL-83 15-AUG-83 26-MAR-84 31-OCT-83 05-DEC-83 11-JUN-84 14-MAY-84 05-MAR-84 09-JUL-84 04-JUN-84 04-JUN-84 23-JUL-84 05-DEC-83 800.00 1,600.00 1,250.00 2,975.00 1,250.00 2,850.00 2,450.00 3,000.00 5,000.00 1,500.00 1,100.00 950.00 3,000.00

------- -----20 300.00 500.00 30 30 20 1.400.00 30 30 10 20 10 .00 30 20 30 20

SALESMAN 7698 SALESMAN 7698 MANAGER 7839

SALESMAN 7698 MANAGER MANAGER ANALYST 7839 7839 7566

PRESIDENT SALESMAN 7698 CLERK CLERK ANALYST 7788 7698 7566

Alte elemente in clauza SELECT


Este posibil sa se includa si alte elemente in clauza SELECT.

Expresii aritmetice Alias-uri de coloane Coloane concatenate Literali

Toate aceste optiuni ajuta utilizatorul sa ceara date si sa le manipuleze in functie de scopurile interogarii ; de exemplu,executia calculelor,legarea coloanelor impreuna,sau afisarea sirurilor de litere din text. 6

Luminia Scripcariu

Limbajul SQL

Expresii aritmetice
O expresie este o combinatie de una sau mai multe valori,operatori si functii care sa evalueaza la o valoare. Expresiile aritmetice pot contine nume de coloane ,valori numerice constante si operatori aritmetici:
Operatori --------+ * / Descriere --------adunare scadere inmultire impartire

SELECT FROM

ENAME, SAL*12, COMM EMP;

Daca expresia aritmetica contine mai mult decat un operator, prioritatile sunt *,/,la inceput,apoi +,- (de la stanga la dreapta pentru operatorii de aceeasi prioritate). In urmatorul exemplu,inmultirea (250*12) este evaluata prima;apoi valoarea salariului este adunata la rezultatul multiplicarii(3000). Astfel pentru randul lui SMITH avem :800+3000=3800.

SELECT FROM

ENAME,SAL + 250 * 12 EMP;

Parantezele pot fi utilizate pntru specificarea ordinii de executie a operatorilor ,daca,de exemplu ,adunarea e dorita inainte de inmultire:

SELECT FROM

ENAME,(SAL + 250) * 12 EMP;

Luminia Scripcariu

Limbajul SQL

Intr-o declaratie SQL ,un alias de coloana poate fi utilizat numai in clauza SELECT.

Operatorul de concatenare
Operatorul de concatenare (||) permite coloanelor sa fie legate cu alte coloane,expresiilor aritmetice sau valorilor constante sa creeze o expresie de caractere. Coloanele din cealalta parte a operatorului sunt combinate pentru a obtine o singura coloana. Pentru a combina EMPNO si ENAME si sa se dea aliasul EMPLOYEE expresiei, introduceti:

SELECT FROM

EMPNO||ENAME EMP;

EMPLOYEE

EMPLOYEE ------------------------------------------------------7369SMITH 7499ALLEN 7521WARD 7566JONES 7654MARTIN 7698BLAKE 7782CLARK 7788SCOTT 7839KING 7844TURNER 7876ADAMS 7900JAMES 7902FORD 7934MILLER

Literali

Luminia Scripcariu

Limbajul SQL

Un literal este orice caracter ,expresie ,numar inclus in lista lui SELECT care nu este un nume de coloana sau un alias de coloana. Un literal in lista lui SELECT este reprezentat de fiecare rand returnat la iesire.Sirurile de literali dintr-un text cu un format oarecare pot fi incluse in rezultatul interogarii si sunt tratate ca o coloana lista selectata. Literalii de tip data calendaristica si caracter pot fi inchisi intre ghilimele simple(');literlalii de tip numar nu au nevoie de ghilimele simple('). Urmatoarea declaratie contine literali selectati prin concatenare si printr-un alias de coloana:

SELECT

EMPNO||'-'||ENAME

EMPLOYEE,

'WORKS IN DEPARTMENT', DEPTNO FROM EMP;

EMPLOYEE -----------------7369-SMITH 7499-ALLEN 7521-WARD 7566-JONES 7654-MARTIN 7698-BLAKE 7782-CLARK 7788-SCOTT 7839-KING 7844-TURNER 7876-ADAMS 7900-JAMES 7902-FORD 7934-MILLER

'WORKS IN DEPARTMENT' -------------------WORKS IN DEPARTMENT WORKS IN DEPARTMENT WORKS IN DEPARTMENT WORKS IN DEPARTMENT WORKS IN DEPARTMENT WORKS IN DEPARTMENT WORKS IN DEPARTMENT WORKS IN DEPARTMENT WORKS IN DEPARTMENT WORKS IN DEPARTMENT WORKS IN DEPARTMENT WORKS IN DEPARTMENT WORKS IN DEPARTMENT WORKS IN DEPARTMENT

DEPTNO -----20 30 30 20 30 30 10 20 10 30 20 30 20 10

Tratarea valorilor nule

Luminia Scripcariu

Limbajul SQL

Daca unui rand ii lipseste o valoare pentru o anumita coloana ,despre acea valoare se spune ca este nula. O valoare nula este o valoare care este sau incorecta,sau necunoscuta,sau inaplicabila.O valoare nula nu este la fel ca 'zero'.Zero este un numar.Valoarea nula ocupa un octet in reprezentarea interna. Valoarea nula este tratata corect de catre SQL. Daca orice valoare de coloana intr-o expresie este nula atunci rezultatul este nul.In urmatoarea declaratie numai Salesman are un rezultat al salariului:

SELECT FROM

ENAME,SAL*12 + COMM ANNUAL_SAL EMP;

ENAME

ANNUAL_SAL

--------- ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER 18000 16400 19500 15500

Daca dorim sa obtinem un rezultat pentru toti angajatii,este necesar sa convertim valoarea nula la un numar . Noi folosim functia NVL pentru a converti o valoare nula la o valoare nenula.

10

Luminia Scripcariu

Limbajul SQL

Folositi functia NVL pentru a converti valoarea nula de la declaratia precedenta la 0.

SELECT FROM

ENAME, SAL*12+NVL(COMM,0) ANNUAL_SAL EMP;

ENAME

ANNUAL_SAL

--------- ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER 9600 19500 15500 35700 16400 34200 29400 36000 60000 18000 13200 11400 36000 15600

NVL asteapta doua argumente: 1. o expresie 2. o valoare nenula De notat ca puteti folosi functia NVL pentru a converti un numar nul , data calendaristica sau sir de caractere la un alt numar , data calendaristica sau sir de caractere de acceasi lungime si de acelasi tip de date asteptate.
NVL(DATECOLUMN,'01-JAN-88')

NVL(NUMBERCOLUMN,9)

NVL(CHARCOLUMN,'STRING')

11

Luminia Scripcariu

Limbajul SQL

Prevenirea selectiei rindurilor duplicate


Daca nu se indica altfel, SQL*Plus afiseaza rezultatul unei interogari fara eliminarea intrarilor duplicate . Pentru a lista toate numerele de departament din tabela EMP, introduceti:

SELECT FROM

DEPTNO EMP;

DEPTNO -----20 30 30 20 30 30 10 20 10 30 20 30 20 10

Clauza DISTINCT
Pentru eliminarea valorilor duplicate din rezultat, includeti restrictia DISTINCT in comanda SELECT.

12

Luminia Scripcariu Pentru a elimina valorile duplicate afisate in exemplul urmator introduceti:

Limbajul SQL

SELECT FROM

DISTINCT EMP;

DEPTNO

DEPTNO -----10 20 30

Coloane multiple pot fi specificate dupa restrictia DISTINCT si restrictia DISTINCt afecteaza toate coloanele selectate. Pentru a afisa valorile distincte ale lui DEPTNO si JOB,introduceti:

SELECT FROM

DISTINCT DEPTNO,JOB EMP;

DEPTNO -----10 10 10 20 20 20 30 30 30

JOB --------CLERK MANAGER PRESIDENT ANALYST CLERK MANAGER CLERK MANAGER SALESMAN

Aceasta afiseaza o lista a tuturor combinatiilor diferite de ocupatie si numere de departamente. De notat ca restrictia DISTINCT poate sa fie referita numai o singura data si trebuie sa urmeze imediat dupa cuvantul de comanda SELECT.

13

Luminia Scripcariu

Limbajul SQL

Clauza ORDER BY
In mod normal ordinea rindurilor intoarse in rezultatul unei cereri este nedefinita .Clauza ORDER BY poate fi utilizata pentru a sorta rindurile. Daca o folosim, clauza ORDEY BY trebuie sa fie intotdeauna ultima in declaratia SELECT. Pentru a sorta dupa ENAME, introduceti:

SELECT FROM ORDER BY

ENAME,JOB,SAL*12,DEPTNO EMP ENAME;

ENAME

JOB

SAL*12 DEPTNO

--------- ------- -------- -----ADAMS ALLEN BLAKE CLARK FORD JAMES JONES KING MARTIN MILLER SCOTT SMITH TURNER WARD CLERK SALESMAN MANAGER MANAGER ANALYST CLERK MANAGER PRESIDENT SALESMAN CLERK ANALYST CLERK SALESMAN SALESMAN 13200 19200 34200 29400 36000 11400 35700 60000 15000 15600 36000 9600 18000 15000 20 30 30 10 20 30 20 10 30 10 20 20 30 30

Ordonarea de default a datelor


Ordinea sortarii de default este ascendenta:

Valorile numerice cele mai mici primele Valorile de tip date calendaristice cele mai mici primele. Valorile de tip caracter in ordinea alfabetica.

14

Luminia Scripcariu

Limbajul SQL

Inversarea ordinii de default


Pentru a inversa aceasta ordine cuvintul de comanda DESC este specificat dupa numele coloanei in clauza ORDER BY. Pentru a inversa ordinea coloanei HIREDATE, deci datele cele mai tirzii sa fie afisate primele,introduceti:

SELECT FROM ORDER BY

ENAME,JOB,HIREDATE EMP HIREDATE DESC;

ENAME

JOB

HIREDATE --------23-JUL-84 09-JUL-84 11-JUN-84 04-JUN-84 04-JUN-84 14-MAY-84 26-MAR-84 05-MAR-84 05-DEC-83 05-DEC-83 21-NOV-83 31-OCT-83 15-AUG-83 13-JUN-83

--------- --------JAMES KING BLAKE TURNER ADAMS CLARK WARD SCOTT MARTIN FORD MILLER JONES ALLEN SMITH CLERK PRESIDENT MANAGER SALESMAN CLERK MANAGER SALESMAN ANALYST SALESMAN ANALYST CLERK MANAGER SALESMAN CLERK

Ordonarea dupa mai multe coloane


Este posibil sa se ordoneze dupa mai multe coloane.Limita este numarul de coloane din tabela.In clauza ORDER BY se specifica coloanele pentru ordonat separate prin virgula.Daca una sau toate coloanele trebuie sa fie inversate specificati DESC dupa fiecare coloana.

15

Luminia Scripcariu

Limbajul SQL

Pentru a ordona dupa doua coloane si afisa in ordinea inversa a salariului, introduceti:

SELECT FROM ORDER BY

DEPTNO,JOB,ENAME EMP DEPTNO,SAL DESC;

DEPTNO JOB ------ -----------10 PRESIDENT 10 MANAGER 10 CLERK 20 ANALYST 20 ANALYST 20 MANAGER 20 CLERK 20 CLERK 30 MANAGER 30 SALESMAN 30 SALESMAN 30 SALESMAN 30 SALESMAN 30 CLERK

ENAME ------KING CLARK MILLER SCOTT FORD JONES ADAMS SMITH BLAKE ALLEN TURNER WARD MARTIN JAMES

Pentru a ordona dupa o coloana nu este necesar sa o avem SELECT-ata.

ORDER BY si valorile nule


In Oracle7,valorile nule sunt afisate ultimele pentru secventele ascendente si sint raportate primele cind rindurile sunt sortate in ordine descendenta. Atentie: Clauza ORDER BY este utilizata intr-o interogare cind se doreste sa se afiseze rindurile intro ordine specifica .Fara clauza ORDER BY randurile sunt returnate intr-o ordine convenita de ORACLE si va trebui sa ne bazam pe el- ordinea determinata fiind consistenta de la cerere

16

Luminia Scripcariu

Limbajul SQL

la cerere.De notat ca ordinea de afisare a rindurilor nu influenteaza ordinea interna a rindurilor asa cum sunt stocate in tabela.

Clauza WHERE
Clauza WHERE corespunde operatorului 'Restrictie' din algebra relationala. Contine o conditie pe care rindurile trebuie sa o indeplineasca in ordinea afisarii lor. Clauza WHERE ,daca este folosita , trebuie sa urmeze clauzei FROM :

SELECT FROM WHERE

coloane tabela anumite conditii sunt intilnite

Clauza WHERE poate compara valori in coloana ,valori literale,expresii aritmetice sau functii. Clauza WHERE asteapta trei elemente: 1. Un nume de coloana 2. Un operator de comparatie 3. Un nume de coloana, constanta sau lista de valori. Operatorii de comparatie sunt utilizati in clauza WHERE si pot fi impartiti in doua categorii: logici si SQL.

Operatorii logici
Acesti operatori verifica urmatoarele conditii:
Operator -------= > >= < <= Semnificatie -----------egal cu mai mare decit mai mare sau egal mai mic decit mai mic sau egal

17

Luminia Scripcariu

Limbajul SQL

Sirurile de caractere si datele calendaristice in clauza WHERE


Coloanele din ORACLE pot avea urmatoarele tipuri:caracter,numar sau data calendaristica. Sirurile de caractere si datele calendaristice din clauza WHERE trebuie sa fie inchise in ghilimele simple('). Sirurile de caractere trebuie sa se supra- puna cu valoarea coloanei daca nu, trebuie modificate de o functie. Utilizati "Functii pe Caractere" din capitolul 4. Pentru a afisa numele,numerele,ocupatia si departamentele tuturor functionarilor, introduceti:

SELECT FROM WHERE

ENAME, EMPNO, JOB, DEPTNO EMP JOB = 'CLERK';

ENAME

EMPNO

JOB

DEPTNO

--------- ----SMITH ADAMS JAMES MILLER 7369 7876 7900 7934

------- -----CLERK CLERK CLERK CLERK 20 20 30 10

Pentru a gasi toate numele de departamente cu numerele de departament mai mare ca 20 ,introduceti:

SELECT FROM WHERE

DNAME, DEPTNO DEPT DEPTNO >20;

DNAME ---------SALES OPERATIONS

DEPTNO -----30 40

18

Luminia Scripcariu

Limbajul SQL

Compararea unei coloane cu alta in cadrul aceluiasi rand


Puteti compara o coloana cu o alta coloana in acelasi rand,la fel ca si cu o valoare constanta. De exemplu ,presupunem ca dorim sa obtinem acei angajati al caror comision est mai mare decat salariul lor:
SELECT FROM WHERE ENAME, SAL, COMM EMP COMM> SAL;

ENAME -----MARTIN

SAL -------1,250.00

COMM -------1,400.00

Operatori SQL
Sint patru operatori SQL care opereaza pe toate tipuril de date:
Operatori SQL

Operator -------BETWEEN..AND... IN(list) LIKE IS NULL

Semnificatie -----------intre doua valori(inclusiv) compara cu o lista de valori compara cu un model de tip caracter est o valoare nula

Operatorul BETWEEN

19

Luminia Scripcariu

Limbajul SQL

Realizeaza teste pentru valori intre,si inclusiv,o valoare minima si o valoare maxima. Presupunind ca dorim sa vedem angajatii ai caror salariu este intre 1000 si 2000:
SELECT FROM WHERE ENAME,SAL EMP SAL BETWEEN 1000 AND 2000;

ENAME

SAL

------- ---------ALLEN WARD MARTIN TURNER ADAMS MILLER 1,600.00 1,250.00 1,250.00 1,500.00 1,100.00 1,300.00

De notat ca valorile specificate sunt inclusive si ca limita minima trebuie specificata prima.

Operatorul IN
Testeaza valorile dintr-o lista specificata. Presupunem ca dorim sa gasim angajatii care au unul din cele trei numere de marca(MGR):

SELECT FROM WHERE

EMPNO, ENAME, SAL, MGR EMP MGR IN (7902,7566,7788);

EMPNO ----7369 7788 7876 7902

ENAME ----SMITH SCOTT ADAMS FORD

SAL

MGR

--------- ----800.00 3,000.00 1,100.00 3,000.00 7902 7566 7788 7566

Daca, caracterele sau datele calendaristice sunt utilizate,ele trebuie introduse intre ghilimele(' '). 20

Luminia Scripcariu

Limbajul SQL

Operatorul LIKE
Uneori nu se cunosc valorile exacte pe care le cautam.Utilizand operatorul LIKE este posibil sa selectam randurile care se potrivesc cu un model specificat de caractere.Operatia de pettermatching a caracterelor poate fi asemanata cu o cautare 'wild-card'.Doi simboli se pot utiliza la construirea sirului de cautare.
Simbol -----% Reprezentare -----------orice secventa de zero sau mai multe caractere un singur caracter oarecare

Pentru a lista toti angajatii al caror nume incepe cu un S,introduceti:


SELECT FROM WHERE ENAME EMP ENAME LIKE 'S%';

ENAME -------SMITH SCOTT

Caracterul '_' poate fi utilizat pentru cautarea unui anumit numar de carac- tere. De exemplu pentru a lista toti angajatii care au un nume exact de patru caractere lungime:

SELECT FROM WHERE

ENAME EMP ENAME LIKE '____';

ENAME ----WARD KING FORD

Semnele '%' si '_'pot fi utilizate in orice combinatie de caractere.

Operatorul IS NULL
Operatorul IS NULL face teste specifice pentru valorile care sunt NULL.

21

Luminia Scripcariu

Limbajul SQL

SELECT FROM WHERE

ENAME,MGR EMP MGR IS NULL;

ENAME -----KING

MGR ----

Negarea expresiilor
Urmatorii operatori fac teste de negatie:

Operator --------!= ^= <> NOT NUMECOL= NOT NUMECOL>

Descriere ---------diferit de(VAX,UNIX,PC) diferit de(IBM) diferit de(toate o/s) diferit de mai mic sau egal

Operatori SQL

Operator -------NOT BETWEEN NOT IN NOT LIKE IS NOT NULL

Descriere --------nu se afla intre doua valori date nu se afla intr-o lista data de valori diferit de sirul nu este o valoare nula

Pentru a afla acei angajati a caror meserie nu incepe cu M,introduceti:

SELECT FROM WHERE

ENAME,JOB EMP JOB NOT LIKE 'M%';

ENAME --------

JOB --------

22

Luminia Scripcariu
SMITH ALLEN WARD MARTIN SCOTT KING TURNER ADAMS JAMES FORD MILLER CLERK SALESMAN SALESMAN SALESMAN ANALYST PRESIDENT SALESMAN CLERK CLERK ANALYST CLERK

Limbajul SQL

Interogarea datelor cu conditii multiple


Operatorii AND sau OR pot fi utilizati pentru a compune expresii logice. Predicatul AND este adevarat numai daca ambele conditii sunt 'adevarate'; predicatul OR este adevarat daca cel putin una din conditii este 'adevarata'. In urmatoarele doua exemple,conditiile sunt aceleasi,dar predicatele difera Priviti cum rezultatul este dramatic modificat.

Pentru a gasi toti functionarii care castiga intre 1000 si 2000,introduceti:

SELECT FROM WHERE AND

EMPNO,ENAME,JOB,SAL EMP SAL BETWEEN 1000 AND 2000 JOB = 'CLERK';

EMPNO ---7876 7934

ENAME ------ADAMS MILLER

JOB -------CLERK CLERK

SAL -------1,100.00 1,300.00

Pentru a afla toti angajatii care sunt si functionari si/sau

23

Luminia Scripcariu
functionari care castiga intre 1000 si 2000,introduceti:

Limbajul SQL

SELECT FROM WHERE OR

EMPNO,ENAME,JOB,SAL EMP SAL BETWEEN 1000 AND 2000 JOB = 'CLERK';

EMPNO ----7369 7499 7521 7654 7844 7876 7900 7934

ENAME -------SMITH ALLEN WARD MARTIN TURNER ADAMS JAMES MILLER

JOB ------CLERK SALESMAN SALESMAN SALESMAN SALESMAN CLERK CLERK CLERK

SAL -------800.00 1,600.00 1,250.00 1,250.00 1,500.00 1,100.00 950.00 1,300.00

Puteti combina AND sau OR in acceasi expresie logica. Cand AND sau OR apar in aceeasi clauza WHERE, toti operatorii AND sunt evaluati mai intai si apoi toti operatorii OR. Vom spune ca operatorii AND au o precedenta mai mare decat OR. Deoarece AND are o precedenta mai mare decat OR urmatoarea declaratie SQL intoarce toti managerii cu salarii peste 1500$ si toti vanzatorii.

SELECT FROM WHERE AND OR

EMPNO,ENAME,JOB,SAL,DEPTNO EMP SAL> 1500

JOB = 'MANAGER' JOB = 'SALESMAN';

EMPNO ENAME ----- ------7499 7521 7566 7654 7698 7782 ALLEN WARD JONES MARTIN BLAKE CLARK

JOB -------SALESMAN SALESMAN MANAGER SALESMAN MANAGER MANAGER

SAL DEPTNO -------- -----1,600.00 1,250.00 2,975.00 1,250.00 2,850.00 2,450.00 30 30 20 30 30 10

24

Luminia Scripcariu
7844 TURNER SALESMAN 1,500.00 30

Limbajul SQL

Daca doriti sa selectati toti managerii si vanzatorii cu salarii peste 1500$ puteti introduce:

SELECT FROM WHERE AND OR

EMPNO,ENAME,JOB,SAL,DEPTNO EMP SAL >1500

(JOB = 'MANAGER' JOB = 'SALESMAN');

EMPNO

ENAME

JOB

SAL DEPTNO

----- ------ --------- -------- -----7499 7566 7698 7782 ALLEN JONES BLAKE CLARK SALESMAN MANAGER MANAGER MANAGER 1,600.00 2,975.00 2,850.00 2,450.00 30 20 30 10

Parantezele specifica ordinea in care operatorii vor fi evaluati. In al doilea exemplu operatorul OR este evaluat inaintea operatorului AND.

Logarea la SQL*Plus
SQL*Plus SQL*Plus este un program scris de Corporatia Oracle,ce produce un mediu pentru comenzile SQL ce pot fi tastate direct sau rulate dintr-un fisier de comanda.In plus ,comenzile SQL pot fi derivate.Ele sunt folosite pentru:

formatarea rezultatelor setarea optiunilor editarea si stocarea declaratiilor SQL

Odata ce v-ati logat la sistemul vostru de operare,sunt 3 moduri pentru a va loga la SQL*Plus: 1. SQLPLUS

25

Luminia Scripcariu
o o

Limbajul SQL

Veti vedea dupa aceasta un mesaj ca acesta: SQL*Plus: Version 3.1.1 Production on Mon Oct 4 1993 Copyright (c) 1992,Oracle Username: Corporation,California,USA. All rights reserved. Enter

Introduceti numele vostru de user si apasati RETURN: SQL*Plus va afisa promptul :"Enter Password:". Introduceti parola voastra si apasati din nou RETURN. Pentru protectia voastra ,parola nu va apare pe ecran. SQL*Plus va afisa promptul sau: SQL> Aceasta indica linia de comanda .Acolo sunt doua feluri de comenzi si puteti introduce pe acesta linie de comanda:comenzi SQL sau comenzi SQL*Plus.

2. SQLPLUS username
o

Veti fi indemnati sa va dati parola. Veti fi logati la SQL*Plus.In acest caz parolz v a fi afisata.

3. SQLPLUS username/password
o

Alegeti metoda pe care o preferati.

Editarea declaratiilor SQL utilizand comenzi SQL*Plus


1. Cand veti introduce o comanda SQL,aceasta este stocata intr-o zona de memorie utilizata de buferul SQL si ramane acolo pana ce veti introduce o noua comanda. 2. Daca apasati [RETURN] inainte de a completa o comanda,SQL*Plus va afisa un numar de linie. 3. Terminatorul pentru declaratiile SQL este un ';'. 4. Cat timp declaratia SQL este in bufer,sunt cateva operatii de editare directe care pot fi executate utilizand comenzi SQL*Plus:

Comanda

Abrevierea

ROL

---------------------------------------------------------------------APPEND CHANGE text A text adauga 'text' la sfarsitul liniei curente. schimba vechiul text cu noul text in linia curenta. CHANGE C/text/ sterge 'text'-ul din linia curenta

C/old/new

26

Luminia Scripcariu
CLEAR BUFFER DEL INPUT INPUT ul respectiv LIST LIST n LIST m, n RUN din buffer. / in bufer. executa comanda SQL care L Ln L m n R I I text CL BUFF

Limbajul SQL
sterge toate liniile din buferul SQL. sterge linia curenta. insereaza un numar nedefinit de linii. insereaza o linie constituita din 'text'-

listeaza toate liniile din buferul SQL. listeaza o linie (specificata de n) listeaza un numar de linii(de la m la n). afiseaza si executa comanda SQL curenta

este curenta

Diversitatea comenzilor SQL*Plus


Comenzile SQL (precum SELECT) sunt mijloace de acces la date prin kernelul Oracle.Comenzile SQL sunt utilizate in special pentru controlul mediului, formatarea rezultatelor interogarilor si controlul fisierelor.Comenzile identificate aici sunt amestecate si trebuie sa le folositi in urmatoarele exercitii. Comenzile SQL sunt introduse la promptul SQL> pe o linie ,ele nu vor deschide un buffer. Comanda + Descriere SAVE numefis permite salvarea intr-un fisier a continutului buferului SQL. GET numefis incarca continutul unui fisier salvat in prealabil in buffer. START numefis ruleaza un fisier de comanda salvat in prealabil. Fisierele de comanda sunt tratate in capitolul 10. ED numefis utilizeaza un editor de default pentru a edita continutul unui fisier salvat.

27

Luminia Scripcariu EXIT paraseste SQL*Plus.

Limbajul SQL

SMITH ALLEN JONES MARTIN FORD MILLER

20 13-JUN-83 30 15-AUG-83 20 31-OCT-83 30 05-DEC-83 20 05-DEC-83 10 21-NOV-830

6 inregistrari selectate.

Rularea cererilor standard cu variabile substituite.


Variabilele substituite sunt folosite in declaratiile SQL si permite utilizarea valorilor specificate la rulare.

Variabile in SQL *Plus


In plus fata de variabilele pe care le vom vedea in limbajul PL/SQL, SQL*Plus este inzestrat cu doua tipuri de variabile ale sale: Variabile legate Utilizate pentru stocarea valorilor individuale ce pot fi asignate si citite in timpul rularii(vor fi discutate mai tarziu in acest curs). Variabile substituite Utilizate pentru stocarea partilor de text de comanda ,care sunt "editate" in comenzi inainte de executia lor.

Variabile substituite cu un singur ampersand.


Puteti utiliza 'variabile substituite' intr-un fisier de comanda sau intr-o declaratie SQL pentru a reprezenta valori ce vor fi aflate la executie. O variabila poate fi vazuta ca un container in care valoarea este stocata temporar.

28

Luminia Scripcariu

Limbajul SQL

O variabila substituita este prefixata de un singur ampersand(&) si o valoare care ii este asignata. Urmatoarea declaratie obliga utilizatorul sa dea un numar de departament la executie:

SELECT FROM WHERE

EMPNO,ENAME,SAL EMP DEPTNO = &DEPARTAMENT_NUMBER;

Enter value for department_number:

10

EMPNO ENAME

SAL

----- --------- ----------7782 CLARK 7839 KING 7934 MILLER 2,450.00 5,000.00 1,300.00

Exemplul anterior utilizeaza conditia WHERE DEPTNO=10. Cu un singur ampersand utilizatorul este obligat sa dea o valoare de fiecare data cand comanda este executata,deoarece variabila nu este definita si de fiacare data valoarea introdusa nu este salvata . O valoare de tip caracter sau data are nevoie sa fie inchisa in ghilimele simple cand sunt introduse la cerere.Pentru a evita ghilimelele simple ce tre- buie sa fie introduse la executie ,puteti pune variabilele in ghilimele simple. In urmatoarea declaratie ,variabila este pusa intre ghilimele simple, asa ca ghilimele nu mai sunt necesare la introducerea valorii respective:

SELECT FROM WHERE

ENAME,DEPTNO,SAL*12 EMP JOB = ' &ltJOB_TITLE';

29

Luminia Scripcariu
Enter value for job_title:MANAGER

Limbajul SQL

ENAME ----JONES BLAKE CLARK

DEPTNO

SAL*12

------ -------20 30 10 35700 34200 29400

Cat timp variabila este variabila 'nedefinita' ,valoarea va fi ceruta de fiecare data cand declaratia este executata. Este posibil sa fie cerut numele unei coloane sau chiar numele unei tabele in timpul executiei. In urmatorul exemplu vi se cere o expresie aritmetica:

SELECT FROM

DEPTNO, &ltARITHMETIC_EXPRESION EMP;

Enter value for arithmetic_expression:sal/12

DEPTNO

SAL/12

------ ------20 66.6667 30 133.333 30 104.167 20 247.917 30 104.167 30 237.5

10 204.167 20 250

10 416.667 30 125

20 91.6667 30 79.1667 20 250

10 108.333

30

Luminia Scripcariu

Limbajul SQL

Variabile substituite cu dublu ampersand.


Daca variabila este prefixata de dublu ampersand(&&),SQL*Plus va cere valoarea pentru variabila doar o singura data .SQL*Plus stocheaza prima valoare furnizata si o foloseste din nou de fiecare data cand declaratia SQL este rulata

SELECT FROM WHERE

ENAME,DEPTNO,JOB EMP DEPTNO = &&DEPTNO_PLEASE;

Enter value for deptno_please: 10

ENAME ----CLARK KING MILLER

DEPTNO JOB ------ -------10 MANAGER 10 PRESIDENT 10 CLERK

Puteti folosi comanda SQL*Plus DEFINE pentru a determina daca variabila este deja definita.Daca variabila este deja definita se afiseaza valoarea asignata.

SQL> DEFINE DEFINE DEPTNO_PLEASE = "10" (CHAR)

Comanda DEFINE
O valoare poate fi asignata unei variabile folosind comanda DEF[INE] a lui SQL*PLUS.Valoarea definita trebuie referita intr-o construc- tie SELECT sau un fisier de comenzi , prefixind numele variabilei cu &. Variabilele pot fi golite folosind UNDEF[INE].

31

Luminia Scripcariu

Limbajul SQL

In urmatorul exemplu , o variabila a fost definita folosind o expresie aritmetica ce calculeaza remuneratia. In urmatoarele constructii, variabila REM e referita de un numar de ori. Variabila e apoi golita fo- losind UNDEFINE.

SQL> DEFINE SQL&gtSELECT SQL&gtFROM SQL&gtORDER BY

REM ='SAL*12+NVL(COMM,0)' ENAME, JOB, EMP &ltREM; &ltREM

SQL &gtundefine

REM

ENAME

JOB

SAL*12+NUL(COMM,0)

-----------------------------------------------SMITH JAMES ADAMS WARD MILLER MARTIN TURNER ALLEN CLARK BLAKE JONES SCOTT FORD KING CLERK CLERK CLERK SALESMAN CLERK SALESMAN SALESMAN SALESMAN MANAGER MANAGER MANAGER ANALYST ANALYST PRESIDENT 9600 11400 13200 15500 15600 16400 18000 19500 29400 34200 35700 36000 36000 60000

Ghilimelele pot fi deasemenea folosite si sunt optionale dar folositoare daca expresia contine blancuri sau apostrofi. Pornirea unui fisier cu comenzi care contine substitutii de variabile Presupunind ca doriti o serie de rapoarte care sa listeze angajatii cu functii diferite - de exemplu , una pentru SALESMEN , una pentru CLERKS, una pentru MANAGERS si tot asa.Cunoasteti cum sa folositi substitutia de variabile pentru a obtine aceste rapoarte dintr-o singura constructie SELECT.

32

Luminia Scripcariu

Limbajul SQL

Cu toate acestea , exista o tehnica alternativa pe care s-o folositi si anume sa scrieti constructia SELECT intr-un fisier si apoi folosind comanda START sa-l executati. Aceasta tehnica impune folosirea unor substitutii speciale de variabile. Exista 9 asemenea variabile si ele au intregii de la 1 la 9 ca nume. Pentru folosirea acestor variabile , puneti un '&' urmat de un intreg (1-9) in comanda SQL.Aceste variabile pot fi folosite de ori de cite ori doriti si in orice ordine . De fiecare data cind comanda e rulata, fiecare '&1' din comanda e inlocuit de primul parametru dupa START fisier, fiecare '&2' e inlo- cuit de al doilea parametru s.a.m.d. Pentru a crea un fisier de comenzi care ia un parametru specificind functia care trebuie afisata , introduceti:

SELECT EMPNO,ENAME,SAL FROM EMP WHERE JOB = ' &lt1' ;

SQL&gtSAVE JOB1

SQL*PLUS

intoarce mesajul:

Created file job1 Apoi rulati comanda cu parametrul 'CLERK'. cu valoarea parametrului.

SQL*PLUS inlocuieste variabila

SQL>

START JOB1

CLERK

EMPNO ----7369 7876 7900

ENAME ----SMITH ADAMS JAMES

SAL --800 1100 950

Observati ca nu se pot folosi variabile cind executati o comanda cu RUN. Trebuie sa introduceti comanda in fisier si sa o rulati cu START comanda.

33

Luminia Scripcariu

Limbajul SQL

Comanda ACCEPT
Comanda ACCEPT permite unei variabile sa fie create si unei valori , care e introdusa sa fie memorata in ea. Aceasta variabila poate fi apoi referita in constructia SQL. ACCEPT este folosita deseori intr-un fisier de comenzi . Sunt citeva avantaje rezultate din folosirea lui ACCEPT pentru definirea substitutiei de variabile:

Tipurile de date pot fi verificate Prompturile pot fi mai explicative Valorile de raspuns pot fi ascunse

Sintaxa comenzii este:

ACC[EPT] variabila [ NUMBER/CHAR]

[PROMPT/NOPROMPT 'text'][HIDE]

Sintaxa + Descrierea NUMBER/CHAR determina tipul variabilei.Daca valoarea introdusa este nevalida , va fi afisat un mesaj. PROMPT 'text' afiseaza daca text e specificat NOPROMPT face ACCEPT sa sara o linie asteptind intrarea HIDE suprima raspunsul utilizatorului. folositor pentru parole

Exemple

SQL> ACCEPT SALARY NUMBER Salary figure : 30000 SQL&gtACCEPT PASSWORD CHAR Password :

PROMPT

'Salary figure :'

PROMPT

'Password :' HIDE

34

Luminia Scripcariu
SQL&gtACCEPT COMM NUMBER NOPROMPT 500 SQL&gtDEFINE

Limbajul SQL

DEFINE SALARY

=30000(NUMBER)

DEFINE PASSWORD ="FREEBIES(CHAR) DEFINE COMM =500(NUMBER)

EXTRAGEREA DATELOR DIN MAI MULT DE O TABELA


Join
Join-ul este folosit cind o cerere SQL necesita date din mai multe tabele din baza de date. Liniile dintr-o tabela pot fi unite cu liniile din alta tabela in functie de valorile comune existente in coloanele corespunzatoare.

Sint doua tipuri de conditie de join : 1. Equi-join 2. Non-equi-join

Equi-join Pentru a determina angajatii din departamente, vom compara valorile din coloana DEPTNO a angajatului cu aceleasi valori din DEPTNO din tabela DEPT. Relatia dintre tabela EMP si DEPT este un equi-join, in care valorile din coloana DEPTNO din ambele tabele sint egale. (Operatorul de comparatie folosit este =.) 35

Luminia Scripcariu O conditie de join este specificata in clauza WHERE:

Limbajul SQL

SELECT column(s) FROM tables WHERE join condition is ...

Pentru a face join pe cele doua tabele EMP si DEPT, introducem:

SELECT ENAME, JOB, DNAME FROM EMP, DEPT WHERE EMP>DEPTNO + DEPT>DEPTNO;

ENAME ------CLARK MILLER KING SMITH SCOTT JONES ADAMS FORD ALLEN BLAKE TURNER JAMES MARTIN WARD

JOB -----MANAGER CLERK PRESIDENT CLERK ANALYST MANAGER CLERK ANALYST SALESMAN MANAGER SALESMAN CLERK SALESMAN SALESMAN

DNAME ------ACCOUNTING ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES SALES SALES SALES SALES

Vom observa ca acum fiecare angajat are listat numele departamentului lui. Liniile din EMP sint combinate cu liniile din DEPT si sint intoarse doar liniile pentru care valorile EMP.DEPTNO si DEPT.DEPTNO sint eale. Observati ca, conditia de join specifica numele coloanei precedat de numele tabelei.Aceasta este o necesitate cind numele coloanelor sint aceleasi in ambele tabele.Este necesar sa specificam exact ce coloane sint referite.

36

Luminia Scripcariu

Limbajul SQL

Aceasta necesitate este de asemenea aplicata coloanelor care pot fi ambigue in clauzele SELECT sau ORDER BY. Pentru a recunoaste diferentele dintre coloana DEPTNO din EMP si coloana DEPTNO din DEPT, introducem:

SELECT DEPT.DEPTNO, ENAME, JOB, DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO ORDER BY DEPT.DEPTNO;

DEPTNO -------10 10 10 20 20 20 20 20 30 30 30 30 30 30

ENAME ------CLARK MILLER KING SMITH SCOTT JONES ADAMS FORD ALLEN BLAKE TURNER JAMES MARTIN WARD

JOB -----MANAGER CLERK PRESIDENT CLERK ANALYST MANAGER CLERK ANALYST SALESMAN MANAGER SALESMAN CLERK SALESMAN SALESMAN

DNAME ------ACCOUNTING ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES SALES SALES SALES SALES

Observati ca fiecarui numar de departament din tabela DEPT i se face join pentru a se potrivi cu numerele de departament din tabela EMP.De exemplu, trei angajati lucreaza in departamentul 10 - Accounting - deci exista trei potri- viri.Prin urmare ACCOUNTING este afisat pentru fiecare angajat din acel departament. combinarea tuturor liniilor din toate tabelele. Non-Equi-Join Relatia dintre tabelele EMP si SALGRADE este un non-equi-join, in care nici o coloana din EMP nu corespunde direct cu o coloana din SALGRADE.Relatia este obtinuta folosind un

37

Luminia Scripcariu

Limbajul SQL

operator, altul decit operatorul de egalitate (=).Pentru a evalua gradatia unui anajat, salariul lui trebuie sa fie intre salariul minim si salariul maxim. Operatorul BETWEEN este folosit pentru a construi conditia, introducem:

SELECT E.ENAME, E.SAL, S.GRADE FROM EMP E, SALGRADE S WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;

ENAME --------SMITH ADAMS JAMES WARD MARTIN MILLER ALLEN TURNER JONES BLAKE CLARK SCOTT FORD KING

SAL ------800.00 1,100.00 950.00 1,250.00 1,250.00 1,300.00 1,600.00 1,500.00 2,975.00 2,850.00 2,450.00 3,000.00 3,000.00 5,000.00

GRADE --------1 1 1 2 2 2 3 3 4 4 4 4 4 5

Alti operatori cum ar fi <= si >= pot fi folositi, oricum BETWEEN este cel mai simplu.Nu uitati sa specificati mai intii valoarea minima si ultima va- loarea maxima cind folositi BETWEEN.Din nou sint folosite alias-uri de tabele, nu din cauza posibilelor ambiguitati, dar din motive de performanta.

Reguli pentru join-ul tabelelor


Pentru a face join pe cele trei tabele este necesar sa construim doua condi- tii de join.Pentru a face join pe patru tabele sint necesare minim trei condi- tii de join. O regula simpla este: numarul minim de conditii de join = numarul de tabele - 1

38

Luminia Scripcariu

Limbajul SQL

Aceasta regula nu poate fi aplicata daca tabela are o cheie primara, care identifica in mod unic fiecare linie (cheile primare sint explicate mai tirziu in manual). Sintaxa

SELECT [DISTINCT] {[tabela].* | expresie [alias], ...} FROM tabela [alias], ... WHERE [conditie de join] ... AND [conditie de linie] ... OR [alta conditie de linie] GROUP BY {expresie | coloana} HAVING {conditie de grup} ORDER BY {expresie | coloana} [ASC | DESC]

Observatii

Se pot specifica conditii de join impreuna cu alte conditii (non join); De asemenea trebuie sa fiti atenti la precedenta operatorilor cind folo- siti predicatul OR.

Limbajul de manipulare a datelor


Inserarea de noi linii intr-o tabela
Comanda INSERT este folosita pentru a adauga linii unei tabele.Sintaxa comenzii INSERT este:
INSERT INTO nume tabela [ (coloana,coloana,....)] VALUES (valoare,valoare,....);

Este posibila inserarea unei noi linii cu valori in fiecare coloana, in care caz lista de coloane nu este ceruta. Este recomandat ca COLUMN LIST sa fie intotdeauna specificata. Daca lista nu este specificata, software-ul va cere modificari oriunde definitia tabelei este modificata. Pentru a insera un nou departament, introduceti:

39

Luminia Scripcariu

Limbajul SQL

INSERT VALUES

INTO DEPT (DEPTNO,DNAME,LOC) (50,'MARKETING','SAN JOSE');

Pentru a intra intr-un departament nou, omitand numele departamentului, lista de coloane trebuie specificata:

INSERT VALUES

INTO DEPT (DEPTNO,LOC) (50,'SAN JOSE');

Copierea de linii din alta tabela


INSERT INTO tabela [(coloana, coloana, ....)]

SELECT lista-select FROM tabela(e)

Aceasta forma a declaratiei INSERT va permite sa inserati cateva linii intr-o tabela unde valorile sunt derivate din continutul tabelelor existente in baza de date. Pentru a copia toate informatiile din departamentul 10 in tabela D10HISTORY, introduceti:

INSERT

INTO D10HISTORY (EMPNO,ENAME,SAL,JOB,HIREDATE FROM EMP WHERE DEPTNO=10;

Notati ca cuvantul cheie 'VALUES' nu este folosit aici. Actualizarea liniilor Declaratia UPDATE va permite sa schimbati valori in liniile unei tabele.
UPDATE SET [WHERE tabela[alias] coloana [, coloana...] = {expresie, subcerere} conditie];

De exemplu: Pentru a actualiza linia lui Scott, introduceti: 40

Luminia Scripcariu

Limbajul SQL

UPDATE SET

EMP JOB='SALESMAN', HIREDATE = SYSDATE, SAL = SAL*1.1

WHERE

ENAME

= 'SCOTT';

1 record updated.

Daca clauza WHERE este omisa, toate liniile din tabela vor fi actualizate. Este posibil sa folositi subcereri inlantuite si subcereri corelate in decla- ratia UPDATE. Sa presupunem ca ati avut o cifra noua de comisioane pentru angajati siguri. De exemplu, tabela COMMISSION de mai jos este folosita pentru a actualiza li- nii sigure ale tabelei EMP:
COMMISSION EMP

EMPNO -----7499 7654 7844 7844 7844

COMM ---1100 500 3500 2000 1500

EMPNO ----7499 7654 7844

COMM ----300 1400 0

TRANZACTII
Procesarea unei Tranzactii O tranzactie este o operatie asupra unei baze de date care implica una sau mai multe modificari in una sau mai multe tabele. Exista doua clase de tranzactii. Tranzactii DML care contin un numar oarecare de blocuri DML si pe care ORACLE le trateaza ca o singura entitate sau o singura unitate logica de lucru, si tranzactii DDL care contin un singur bloc DDL.

41

Luminia Scripcariu

Limbajul SQL

Nu pot exista situatii "jumatate de drum" in timpul executiei unei tranzactii, asa incat unele modificari specificate in tranzactie sa fie aplicate bazei de date si altele nu. Pentru fiecare tranzactie ori toate modificarile sunt aplicate bazei de date, ori nici una din modificari nu este indeplinita ( sunt toate abandonate - discarded ). O tranzactie incepe cand prima comanda executabila DML sau DDL este intalnita si se termina in una din urmatoarele situatii :

Intalneste COMMIT/ROLLBACK Comanda DDL se termina Anumite erori (DEADLOCK) EXIT - iesire din SQL*Plus Eroare sistem

Un bloc DDL este executat automat si de aceea implicit incheie o tranzactie. Dupa incheierea unei tranzactii, urmatorul bloc executabil SQL va lansa automat urmatoarea tranzactie.

Permanentizarea Modificarilor
Pentru ca modificarile sa ramana permanente, ele trebiue executate asupra bazei de date. comanda COMMIT realizeaza permanentizarea modificari- lor; ROLLBACK permite sa abandonam sau sa anulam modificarile. Modifiacrea, sau modificarile, executate asupra bazei de date intre 2 comenzi COMMIT reprezinta o tranzactie. Pana cand tranzactia nu este executata, nici una din modificari nu este vizibila utilizatorilor.

Inlaturarea Modificarilor Nedorite


Modificarile neexecutate pot fi abandonate prin comanda ROLLBACK. ROLLBACK va atribui datelor valorile care acestea le aveau imediat dupa executarea ultimului COMMIT prin anularea tuturor modificarilor facute dupa ultimul COMMIT.

Erorile de Sistem
Cand o tranzactie este intrerupta de o eroare serioasa, de exemplu o eroare de sistem, intreaga tranzactie este anulata. Aceasta previne erorile datorate modificarilor nedorite asupra datelor, 42

Luminia Scripcariu

Limbajul SQL

si realizeaza intoarcerea tabelelor la starile de dupa ultimul COMMIT. In acest fel SQL*Plus protejea- za integritatea tabelelor. Anularea automata este cauzata cel mai des de catre o eroare de sistem, ca de exemplu o resetare a sistemului sau o cadere de tensiune. Erorile de tastare a comenzilor, ca de exemplu tastarea gresita a unor nume de coloane sau incercarile de a realiza operatii neautorizate asupra tabelelor altor utilizatori, nu intrerup tranzactia si nu realizeaza anu- larea automata. Aceasta se datoreaza faptului ca aceste erori sunt detectate in cursul compilarii (de catre PARSER) ( cand un bloc SQL este scanat si verificat), si nu in timpul executiei. O tranzactie noua este lansata urmand unui COMMIT sau ROLLBACK - adica cand primul bloc executabil DML sau DDL este intalnit. Semnificatia Tranzactiilor ORACLE asigura consistenta datelor bazata pe tranzactii. Tranzacti ile dau utilizatorului mai multa flexibilitate si control la lucrul asupra datelor, si asigura consistenta datelor in cazul unei erori a procesului utilizator sau a unei erori de sistem. Tranzactiile ar trebui sa contina doar acele comenzi DML care realizeaza o singura modificare asupra datelor. De exemplu un transfer de fonduri (sa spunem 1000$) intre 2 conturi ar trebui sa implice un debit al unui cont de 1000$ si un credit al altui cont de 1000$. Ambele actiuni ar trebui sa se incheie cu succes sau sa dea eroare impreuna. Creditul nu ar trebui executat fara debit. Controlul Tranzactiilor cu Instructiuni SQL Urmatoarele instructiuni SQL sunt utilizate cand apar executii (commit) sau refaceri (rollback) :

COMMIT[WORK] SAVEPOINT nume_savepoint ROLLBACK[WORK] to [SAVEPOINT] nume_savepoint

De notat ca COMMIT si ROLLBACK sunt instructiuni (blocuri) SQL. Cele 3 blocuri SQL utilizate pentru controlul tranzactiilor sunt explicate mai jos: 43

Luminia Scripcariu COMMIT[WORK] Sintaxa : COMMIT[WORK];


Limbajul SQL

Permanentizeaza schimbarile in tranzactia curenta Sterge toate punctele de salvare (savepoint) din tranzactie Termina tranzactia Elibereaza toate blocarile (Lock) tranzactiei Cuvantul cheie WORK este optional Utilizatorul trebuie sa expliciteze sfarsitul tranzactiei in programul aplicatie utilizand COMMIT (sau ROLLBACK). Daca nu se executa explicit tranzactia si programul se termina anormal, ultima tranzactie executata va fi anulata.

Executii implicite (commit) apar in urmatoarele situatii :


o o o

inainte de o comanda DDL dupa o comanda DDL la inchiderea mormala a unei baze de date

Blocurile DDL cauzeaza mereu executii (commit) in timpul executiei lor. Daca introduceti un bloc DDL dupa cateva blocuri DML, blocul DDL cauzeaza aparitia unui commit inaintea propriei executii, incheind tranzactia curenta. Astfel daca blocul DDL este executat pana la capat, este si inregistrat. SAVEPOINT Sintaxa : SAVEPOINT nume_savepoint

Exemplu :

SAVEPOINT terminare_actualizari

Poate fi utilizat pentru a imparti o tranzactie in bucati mai mici Punctele de salvare (savepoints) permit utilizatorului sa retina toata munca sa la orice moment din timp, cu optiunea de a inregistra mai tarziu totul sau a anula totul sau o parte din ea. Astfel, pentru o tran- zactie lunga, se pot salva parti din ea, pe masura

44

Luminia Scripcariu

Limbajul SQL

executiei, la sfarsit inregistrandu-se sau refacandu-se continutul initial. La aparitia unei erori nu trebuie executat din nou fiecare bloc.

La crearea unui nou punct de salvare cu acelasi nume ca al unuia dinainte, primul punct este sters. Numarul maxim de puncte de salvare pentru un proces utilizator este implicit 5. Aceasta limita poate fi schimbata.

ROLLBACK[WORK] to [SAVEPOINT] nume_punct_salvare

Instructiunea ROLLBACK este utilizata pentru a reface un lucru. Cuvantul cheie "work" este optional. Intoarcerea la un punct de salvare este de asemenea optionala. Daca se utilizeaza ROLLBACK fara clauza TO SAVEPOINT, atunci :
o o o o

se termina tranzactia se anuleaza modificarile din tranzactia curenta sterge toate punctele de salvare din tranzactie elibereaza blocarile tranzactiei

Intoarcerea la Nivel de Bloc O parte a unei tranzactii poate fi anulata. Daca un singur bloc DML da eroare, ORACLE V6 va intoarce inapoi doar acel bloc. Aceasta facilitate este cunoscuta ca STATEMENT LEVEL ROLLBACK. Intoarcerea la nivel de bloc inseamna daca un singur segment DML da eroare la executia unei tranzactii, efectul lui este anulat, dar schimbarile realizate de precedentul bloc DML in tranzactie nu vor fi anulate si pot fi inscrise (COMMIT) sau intoarse (ROLLBACK) explicit de catre utilizator. Daca blocul este unul de tip DDL, inscrierea (commit) care precede imediat acest bloc nu este anulata (schimbarile au fost facute deja permanen- te). ORACLE realizeaza intoarcerea la nivel de bloc prin crearea unui punct de salvare implicit inainte de executarea fiecarei comenzi DML. Utilizatorul nu poate referi caest punct de salvare in mod direct. Astfel, daca va intoarceti la un punct de salvare, atunci:

anulati o parte din tranzactie

45

Luminia Scripcariu

Limbajul SQL

se retine punctul de salvare pentru intoarcere, dar se pierd toate celelalte punct create dupa punctul de salvare numit. se elibereaza toate blocarile de tab ele si linii.

Intoarceri Implicite Intoarcerile implicite apar cand se intalnesc terminari anormale ale executiei (de exemplu cand se intrerupe un proces utilizator). Intoarcerile implicite la nivel de bloc apar la eroarea de executie a unui bloc. Este recomandat ca tranzactiile sa se termine explicit utilizand COMMIT[WORK] ori ROLLBACK[WORK]. Urmatorul exemplu demonstreaza utilizarea unui punct de salvare, si a instructiunilor ROLLBACK si COMMIT.

INSERT INTO DEPT VALUES ( 50, 'TESTING', 'LAS VEGAS' );

SAVEPOINT insert_done;

UPDATE DEPT SET DNAME = 'MARKETING';

ROLLBACK TO insert_done ( modificarile sunt abandonate );

UPDATE DEPT SET DNAME = 'MARKETING' ( revizuim comanda UPDATE ) WHERE DNAME = 'SALES';

COMMIT;

46

Luminia Scripcariu
AUTOCOMMIT

Limbajul SQL

COMMIT sau ROLLBACK pot fi date manual sau automat prin utilizarea optiunii AUTOCOMMIT a comenzii SET. Optiunea AUTOCOMMIT controleaza cand schimbarile intr-o baza de date sunt facute permanente. Exista doua setari : COMANDA + DESCRIEREA SET AUTO[COMMIT] ON COMMIT este utilizat automat la fiecare INSERT, UPDATE sau DELETE SET AUTO[COMMIT] OFF COMMIT poate fi utilizata de utilizator explicit. De asemenea, COMMIT se executa cand apare comanda Z (specifica VAX), cand se executa comenzile DROP, ALTER sau CREATE, sau la iesirea din SQL*Plus. ROLLBACK poate fi executat explicit de catre utilizator pentru refacerea bazei de date. De retinut ca SET este o comanda SQL*Plus.

Consistenta la Citire Utilizatorii bazelor de date fac doua tipuri de accesuri asupra bazelor de date:

Operatii de citire ( SELECT ) Operatii de scriere ( INSERT, UPDATE, DELETE )

Cititorului si scriitorului unei baze de date trebuie sa i se garanteze o vedere consistenta asupra bazei de date. Cititorii nu trebuie sa vizulaizeze o data care este in curs de modificare. Si scriitorii trebuie sa fie siguri ca schimbarile intr-o baza de date sunt facute intr-un mod consistent : schimbarile facute de un scriitor sa nu distruga sau sa intre in confilct cu schimbarile pe care le face un alt scriitor.

47

Luminia Scripcariu

Limbajul SQL

Scopul consistentei la citire este acela de a asigura faptul ca fiecare utilizator vede data ca fiind cea de la ultimul COMMIT, inainte ca o operatie DML sa inceapa. Consistenta la citire este implementata prin tinerea unor copii partiale ale bazei de date in segmente de intoarcere (ROLLBACK). Cand de executa operatii de scriere intr-o baza de date, ORACLE va face o copie a datelor onainte de schimbare si o va scrie intr-un segment de intoarcere. Toti cititorii, exceptandu-i pe cei care au facut schimbarile, inca mai vad baza de date care exista inainte ca schimbarile sa fie facute - ei vad segmentul de intoarcere de fapt. Oricum, inainte ca schimbarile sa fie facute permanente in baza de date, doar utilizatorul care modifica datele poate sa vada baza de date cu alteratiile incorporate. Toti ceilalti vad baza nemodificata ( fereastra din segmentul de intoarcere ). Aceasta garanteaza citirea unor date consistente care nu fac subiectul unor modificari in curs. Cand un bloc DML se executa, schimbarile facute in baza de date devin vizibile oricarui utilizator care executa SELECT. Modificarile sunt facute 'universale' si acum toti utilizatorii vad baza de date cu modificarile incorporate. Spatiul ocupat de catre 'vechile' date in segmentul de intoarcere este eliberate pentru a fi reutilizat. Daca tranzactia este anulata (ROLLBACK), atunci toate schimbarile sunt 'anulate' :

Versiunea veche ('originala') a bazei de date aflata in segmentul de intoarcere este scrisa inapoi ('recuperata') in baza de date. Toti utilizatorii vad baza de date existenta inainte de inceperea tranzactiei.

Tranzactii de Citire Implicit, modelul consistent al ORACLE RDBMS garanteaza ca rezultatul executiei unui bloc este consistenet. Oricum, in anumite situatii se poate dori chestionarea unor blocuri multiple asupra datelor din mai multe tabele si se doreste asigurarea ca datele sunt consistente. Adica, re- zultatele in orice tabela sunt consistente in timp in raport cu rezultatele din orice alta tabela. 48

Luminia Scripcariu Linia de comand SQL : SET TRANSACTION READ ONLY este utilizat pentru a ncepe o tranzacie de citire exclusiv.

Limbajul SQL

Consistenta la citire pe care READ ONLY o furnizeaza este implementa- ta in acelasi fel cu consistenta la nivel de bloc - utilizand segmente de intoatcere. Fiecare bloc vede implicit o fereastra consistenta a datelor la momentul inceperii blocului. Aceasta facilitate este foarte folositoare pentru rapoarte care ruleaza mai multe chestionari asupra mai multor tabele in timp ce alti utilizatori actualizeaza aceleasi tabele.

49