0% au considerat acest document util (0 voturi)
65 vizualizări60 pagini

Cap10 Limbajul SQL 1

Documentul prezintă introducerea în limbajul SQL utilizat pentru a accesa o bază de date Oracle. Sunt prezentate comenzile standard SQL pentru manipularea, definirea și controlul accesului la date, operatorii logici și SQL, variabilele substituite care pot fi folosite în cereri SQL.

Încărcat de

Iulia Andreea Oprea
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
65 vizualizări60 pagini

Cap10 Limbajul SQL 1

Documentul prezintă introducerea în limbajul SQL utilizat pentru a accesa o bază de date Oracle. Sunt prezentate comenzile standard SQL pentru manipularea, definirea și controlul accesului la date, operatorii logici și SQL, variabilele substituite care pot fi folosite în cereri SQL.

Încărcat de

Iulia Andreea Oprea
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
Sunteți pe pagina 1/ 60

Capitolul 10

Limbajul SQL

Alexandru Boicea Curs: Baze de date


Limbajul SQL
Un sistem de management al bazei de date necesita un limbaj
de interogare pentru a permite utilizatorului sa acceseze
datele.
SQL (Structured Query Language) este un limbaj de
interogare structurat utilizat de majoritatea sistemelor de
baze de date relationale.
Cateva trasaturi caracteristice ale limbajului SQL:
Utilizeaza setul standard de comenzi cum ar fi Select, Insert,
Update, Delete;
Este un limbaj neprocedural care optimizeaza cererile fara a
trebui specificat modul de executie;
Cererile se executa secvential, linie cu linie, deci se
prelucreaza o singura inregistrare la un moment dat .
2
Limbajul SQL
In acest capitol vom face o introducere in limbajul SQL
utilizat pentru a accesa o baza de date Oracle. Comenzile si
cererile SQL sunt folosite pentru :
inserarea,extragerea si stergerea randurilor dintr-o tabela;
crearea, modificarea si stergerea obiectelor din baza de date;
controlul accesului la baza de date;
executia calculelor;
specificarea alternativa a denumirilor de coloana;
concatenarea coloanelor;
sortarea randurilor;
introducerea criteriilor de cautare.

3
Limbajul SQL
Setul de comenzi standard SQL de manipulare a datelor DML
( Data Manipulation Language ) :
SELECT folosita pentru extragerea datelor din baza de date;
INSERT folosita pentru inserarea datelor in baza de date;
UPDATE folosita pentru modificarea datelor in baza de date;
DELETE folosita pentru stergerea inregistrarilor.
Setul de comenzi standard SQL pentru definirea datelor DDL
( Data Definition Language) :
CREATE folosita pentru crearea unui obiect (tabela, view,
index, etc.) in baza de date ;
ALTER folosita pentru modificarea structurii unui obiect din
baza de date;
DROP folosita pentru stergerea unui obiect din baza de date.4
Limbajul SQL
Setul de comenzi standard SQL pentru crearea/revocarea
drepturilor de acces:
GRANT folosita pentru a grantifica drepturile de acces la un
obiect din baza de date;
REVOKE folosita pentru revocarea drepturilor de acces.

Acestea sunt numai o parte a comenzilor SQL( lista completa


se gaseste in Manualul de Referinta a Limbajului SQL).
Cateva reguli de scriere a comenzilor SQL :
Comenzile se pot edita pe una sau mai multe linii;
Clauzele sunt uzual plasate pe linii separate;
Cuvintele predefinite nu pot fi separate pe mai multe linii;
Comenzile nu sunt case sensitive.
5
Operatori SQL
Operatori de comparatie
Sunt operatori folositi pentru compararea valorilor coloanelor
intre ele sau cu valori numerice si pot fi de doua feluri:
Operatori logici

Operator Semnificatie
----------- ------------------
= egal cu
> mai mare decit
>= mai mare sau egal
< mai mic decit
<= mai mic sau egal

6
Operatori SQL
Operatori SQL

Operator Semnificatie
-------------- -----------------
BETWEEN..AND... intre doua valori(inclusiv)
IN( list ) compara cu o lista de valori
LIKE compara cu un model de tip caracter
IS NULL este o valoare nula

7
Operatori SQL
Operatorii de negatie
Sunt operatori folositi pentru negarea valorilor coloanelor sau
verificarea conditiilor de inegalitate si pot fi de doua feluri:
Operatori logici
Operator Semnificatie
-------------- ------------------
!= diferit de (VAX,UNIX,PC)
^= diferit de (IBM)
<> diferit de (toate OS)
NOT NUMECOL= diferit de
NOT NUMECOL> mai mic sau egal

8
Operatori SQL
Operatori SQL
Operator Semnificatie
------------------ -----------------
NOT BETWEEN nu se afla intre doua valori date
NOT IN nu se afla intr-o lista data de valori
NOT LIKE diferit de un sir
IS NOT NULL nu este o valoare nula
Folosind operatorul LIKE asociat cu urmatoarele simboluri
este posibil sa selectam randurile care se potrivesc cu un sir
sau subsir de caractere :
Simbol Semnificatie
% orice secventa de mai multe caractere
- un singur caracter 9
Operatori SQL
Observatii:
Daca se compara o coloana sau expresie cu NULL, atunci
operatorul de comparatie trebuie sa fie IS sau IS NOT NULL.
Daca se foloseste orice alt operator rezultatul va fi totdeauna
FALSE (de exemplu expresia COMM != NULL este intotdeauna
falsa).
Operatorii AND si OR pot fi utilizati pentru a compune expresii
logice cu conditii multiple. Predicatul AND este adevarat
numai daca ambele conditii sunt TRUE, iar predicatul OR este
adevarat daca cel putin una dintre conditii este TRUE. Se pot
combina AND sau OR in acceasi expresie logica in clauza
WHERE, iar in acest caz operatorii AND sunt evaluati primii si
apoi operatorii OR (deci operatorii AND au o precedenta mai
mare decat OR).
10
Operatori SQL
Daca operatorii au precedenta egala, atunci ei se evalueaza de
la stanga la dreapta.
Precedenta operatorilor logici este urmatoarea:
1. Operatorii de comparatie si operatorii SQL au precedenta
egala:
=, >= , <>, BETWEEN...AND, IN, LIKE, IS NULL.
2. NOT - cand este folosit pentru a inversa rezultatul unei
expresii logice (de exemplu SELECT .WHERE not(sal>2000) )
3. AND
4. OR.
Pentru a fi siguri de ordinea de executie a doua operatii, se
recomanda folosirea parantezelor rotunde.
11
Variabile substituite
Cererile SQL pot fi executate folosind anumiti parametri, care
se mai numesc si variabile substituite.
Variabile ampersand (&)
O astfel de variabila se defineste &nume_variabila si este un
parametru care se va introduce de la tastatura in timpul
executiei comenzii in care este utilizata. Parametrul cu un
singur ampersand trebuie introdus de fiecare data, chiar daca
este folosit de mai ori in aceeasi comanda SQL.
Exemplu:
SQL> SELECT id_ang,nume,functie,salariu FROM angajati
WHERE id_sef=&ecuson_sef;
Enter value for ecuson_sef: 7698
old 1: SELECT id_ang,nume,functie,salariu FROM angajati
WHERE id_sef=&ecuson_sef
new 1: SELECT id_ang,nume,functie, salariu FROM angajati
12
WHERE id_sef=7698;
Variabile substituite
Variabile dublu ampersand (&&)
Spre deosebire de variabila cu un singur ampersand, o
variabila cu dublu ampersand va fi stocata si va putea fi
apelata pe toata sesiunea de lucru.
Definirea se face similar &&nume_variabila si va fi ceruta o
singura data, folosirea ei de mai multe ori in cadrul comenzii
se face apeland-o cu &nume_variabila.
Exemplu:
SQL> SELECT nume,functie,&&venit venit_lunar
FROM angajati WHERE &venit>2000;
Enter value for venit: salariu+nvl(comision,0)
Pentru a reseta o variabila cu dublu ampersand se utilizeaza
comanda UNDEFINE :
SQL>UNDEFINE venit 13
Variabile substituite
Variabile de sistem cu un ampersand (&n)
Sunt variabile numerice (1-9) care sunt definite de sistem si
care functioneaza similar cu variabilele cu dublu ampersand.
Avantajul folosirii acestor variabile este ca pot fi apelate direct
dintr-un fisier de comenzi indirecte, fara a fi definite.
Exemplu:
SQL> SELECT id_ang,nume,functie,data_ang FROM angajati
WHERE functie='&1' and data_ang>'&2'
ORDER BY data_ang;
SQL> SAVE angajari.sql
Created file angajari.sql
SQL> START angajari PROGRAMATOR 15-AUG-1981

14
Variabile substituite
Variabile definite cu ACCEPT
Cand definim o variabila cu ampersand, totdeauna promtul va fi
numele variabilei.
Folosind comanda ACCEPT, se poate redefini promtul si chiar se
pot ascunde caracterele introduse de la tastatura(facilitate utila in
cazul unei parole).
Exemplu:
Se vor edita urmatoarele comenzi in fisierul c:\temp\functia.sql
SQL> ACCEPT functie_sef CHAR
PROMPT Introduceti functia sefului: ;
SQL> SELECT nume,salariu,comision FROM angajati
WHERE functie=&functie_sef;
Fisierul se va rula in SQL*Plus si se va introduce functia sefului:
SQL> @c:\temp\functia.sql
Introduceti functia sefului: DIRECTOR
15
Variabile substituite
Variabile definite cu DEFINE si resetate cu UNDEFINE
Variabilele definite cu DEFINE nu vor mai afisa promtul atunci
cand sunt setate si raman setate pana cand vor fi resetate cu
comanda UNDEFINE.
Exemple:
SQL> DEFINE procent_prima= 1.15
SQL> SELECT nume, salariu, salariu*&procent_prima prima
FROM angajati WHERE id_dep=20;
SQL> DEFINE venit= salariu+nvl(comision,0)
SQL> SELECT nume, data_ang, &venit venit_lunar FROM angajati
WHERE functie=DIRECTOR;
SQL> UNDEFINE procent
SQL> UNDEFINE venit
16
Cereri de interogare SQL*Plus
Cererile de interogare SQL folosesc in exclusivitate comanda
SELECT, fiind utilizate atat pentru interogarea obiectelor
create de utilizator cat si a celor sistem. Sintaxa comenzii este
urmatoarea :
SELECT [DISTINCT,ALL] [schema.table.]expresion expr_alias
FROM [schema.table@dblink] table_alias
[WHERE condition]
[START WITH condition][CONNECT BY condition]
[UNION,UNION ALL,INTERSECT,MINUS][SELECT command]
[GROUP BY expresion][ HAVING condition]
[ORDER BY expresion(position)] [ASC,DESC]
[FOR UPDATE OF schema.table.column] [NOWAIT]
17
Cereri de interogare SQL*Plus
Parametrii comenzii au urmatoarea semnificatie( cei din
paranteze sunt optionali):
DISTINCT - returneaza o singura linie in cazul in care cererea
returneaza linii duplicate;
ALL returneaza toate liniile simple si duplicate;
schema.table reprezinta shema de identificare a tabelei(sau
view-lui) specificata prin user.table_name;
expresion reprezinta un nume de coloana sau o expresie
care poate folosi functii sistem ( * selecteaza toate coloanele
tabelelor din clauza FROM);
expr_alias este un nume alocat unei expresii care va fi
folosit in formatarea coloanei ( apare in antetul listei);
dblink reprezinta numele complet sau partial de identificare
a unei baze de date (database.domain@connection_qualifier)
18
Cereri de interogare SQL*Plus
table_alias este un nume alocat unei tabele(view) care va fi
folosit in cereri corelate;
WHERE condition reprezinta o clauza (inlantuire de conditii)
care trebuie sa fie indeplinita in criteriul de selectie a liniilor;
START WITH condition stabileste criteriul de selectie pentru
prima linie;
CONNECT BY condition stabileste o ierarhie de selectie a
liniilor;
GROUP BY expresion stabileste criteriile de grupare a
liniilor(numele coloanelor folosite in criteriul de grupare);
HAVING condition restrictioneaza liniile din grup la anumite
conditii;

19
Cereri de interogare SQL*Plus
UNION,UNION ALL,INTERSECT,MINUS combina liniile
selectate de mai multe comenzi SELECT prin aplicarea
anumitor restrictii;
ORDER BY expresion(position) ordoneaza liniile selectate
dupa coloanele din expresie sau in ordinea coloanelor
specificate prin pozitie;
FOR UPDATE OF face o blocare (lock) a liniilor in vederea
modificarii anumitor coloane;
NOWAIT returneaza controlul userului daca comanda
asteapta eliberarea unei linii blocata de un alt user.

20
Cereri de interogare SQL*Plus
Exemple:

SQL> SELECT id_dep, den_dep FROM departamente;


SQL> SELECT id_ang||-||nume angajat , functie,data_ang
FROM angajati;
SQL> SELECT id_ang ecuson, nume, salariu*12+nvl(comision,0)
venit_anual FROM angajati;
SQL> SELECT id_ang||-||nume angajat , functie,
salariu*12+nvl(comision,0) venit_lunar,
semnatura FROM angajati;
SQL> SELECT den_dep|| are codul ||id_dep
lista_departamente FROM departamente
ORDER BY den_dep;
21
Cereri cu clauza WHERE
Clauza WHERE poate compara valori de
coloana ,valori literale, expresii aritmetice (sau
functii ) si poate avea patru tipuri de
parametri:
nume de coloana
operator de comparatie
operator de negatie
lista de valori

22
Cereri cu clauza WHERE
Exemple:
SQL> SELECT id_ang ecuson, nume, data_ang, salariu
FROM angajati WHERE id_dep=10;
SQL> SELECT id_dep depart,functie,
nume,salariu,data_ang FROM angajati
WHERE functie=DIRECTOR ORDER BY id_dep;
SQL> SELECT id_dep depart,functie, nume,data_ang
FROM angajati WHERE data_ang BETWEEN
1-MAY-1981 AND 31-DEC-1981
ORDER BY data_ang;
SQL> SELECT id_ang ecuson, nume, functie, data_ang
FROM angajati WHERE data_ang LIKE %80;
23
Metode de JOIN
Pentru extragerea datelor din mai multe tabele din
baza de date, comanda SELECT foloseste una sau mai
multe metode de JOIN. Sintaxa pentru un join simplu
este urmatoarea:
SELECT [DISTINCT,ALL] [table].expresion expr_alias
FROM [schema.table1] table1_alias,
[schema.table2] table2_alias,
WHERE table1_alias.column=table2_alias.column
ORDER BY expresion(position)] [ASC,DESC]

24
Metode de JOIN
Parametrii comenzii au urmatoarea semnificatie( cei
din paranteze sunt optionali):
DISTINCT - returneaza o linie in cazul in care cererea
returneaza linii duplicate;
ALL returneaza toate liniile simple si duplicate
schema.table reprezinta shema de identificare a
tabelei(sau view-lui) specificata prin user.table_name
expresion reprezinta un nume de coloana sau o
expresie care poate folosi functii sistem ( * selecteaza
toate coloanele tabelelor din clauza FROM);
expr_alias este un nume alocat unei expresii care
va fi folosit in formatarea coloanei ( apare in antetul
listei); 25
Metode de JOIN
table_alias este un nume alocat unei tabele(sau
view) care va fi folosit in cereri corelate;
WHERE condition reprezinta o clauza (inlantuire de
conditii) care trebuie sa fie indeplinita in criteriul de
selectie a liniilor;
ORDER BY expresion(position) ordoneaza liniile
selectate dupa coloanele din expresie sau in ordinea
coloanelor specificate prin pozitie.

26
Metode de JOIN
Equi-join
Daca in conditia de join apar numai egalitati, avem de-a
face cu un equi-join. Pentru a putea sa realizam un join
pe mai multe tabele, este obligatoriu ca ele sa contina
coloane de acelasi tip, cu date comune sau corelate.
Exemplu:
Pentru a lista angajatii dintr-un departament folosim
tabela angajati, insa in aceasta tabela gasim asociat
fiecarui angajat un id_dep, iar denumirea
departamentului respectiv o gasim in tabela
departamente, deci se impune un join intre cele doua
tabele, pentru ca in lista sa apara si denumirea
departamentului.
27
Metode de JOIN
SQL> SELECT a.id_dep ,b.den_dep depart,
a.nume,a.functie
FROM angajati a, departamente b
WHERE a.id_dep=b.id_dep and
a.id_dep=10;
Se observa ca au fost folosite aliasuri pentru
tabele pentru a nu crea ambiguitate cand
referim coloane cu aceeasi denumire.

28
Metode de JOIN
Non Equi-join
Cand doua sau mai multe tabele nu au coloane
comune si trebuie totusi relationate avem un non
equi-join.
Exemplu:
Relatia dintre tabelele angajati si grila_salar este un
non-equi-join, in care nicio coloana din prima tabela
nu corespunde direct cu o coloana din cealalta.
Relatia se obtine folosind tot un operator, altul decat
= , de exemplu between.
Pentru a evalua gradul de salarizare al unui anajat,
trebuie sa consultam grila de salarizare pentru a
identifica in ce plaja de salariu se incadreaza salariul:29
Metode de JOIN
SQL> SELECT a.nume, a.salariu, b.grad
FROM angajati a, grila_salar b
WHERE a.salariu BETWEEN b.nivel_inf
AND b.nivel_sup AND a.id_dep=20;
Sunt situatii cand trebuie sa folosim si equi-join si non
equi-join intr-o cerere . In exemplul anterior, daca
dorim sa listam si departamentul, va trebui sa facem
join dupa 3 tabele:
SQL> SELECT c.den_dep,a.nume, a.salariu, b.grad
FROM angajati a, grila_salar b, departamente c
WHERE a.salariu BETWEEN b.nivel_inf AND
b.nivel_sup AND a.id_dep=c.id_dep AND
a.id_dep=20; 30
Metode de JOIN
Joinul unei tabele cu ea insasi (self join)
Sunt situatii cand avem nevoie sa extragem date
corelate din aceeasi tabela. De exemplu, daca
dorim sa afisam care sunt sefii angajatilor
trebuie sa extragem din tabela angajati si
numele sefului (id_sef).
SQL> SELECT a.nume nume_ang,a.functie functie_ang,
b.nume nume_sef,b.functie functie_sef
FROM angajati a, angajati b
WHERE a.id_sef=b.id_ang AND a.id_dep=10;
31
Metode de JOIN
Produs cartezian
Produsul cartezian a doua tabele se obtine prin
concatenarea fiecarei linii dintr-o coloana cu fiecare
linie din cealalta, rezultand un numar de linii egal cu
produsul numarului de linii din fiecare tabela. Aceasta
situatie este mai putin practica si se intalneste de regula
cand sunt puse gresit conditii in clauza WHERE.
Exemplu:
SQL> SELECT nume ,functie ,den_dep
FROM angajati , departamente
WHERE functie='DIRECTOR';
32
Metode de JOIN
Join extern (outer join)
Folosind equi-join putem selecta toate liniile care
indeplinesc conditiile din clauza WHERE. Apar situatii
cand cererea trebuie sa selecteze si linii care nu
indeplinesc toate conditiile din clauza.
Exemple:
Sa construim structura organizatorica a firmei selectand
toate departamentele si angajatii care fac parte din
fiecare departament. Exista, in tabela departamente,
departamentul 40 care nu are niciun angajat si folosind
equi-join acesta nu apare in lista.Pentru a depasi
situatia se foloseste un join extern (+) asa cum se vede
mai jos: 33
Metode de JOIN
SQL> SELECT a.id_dep, a.den_dep, b.nume, b.functie
FROM departamente a, angajati b
WHERE a.id_dep=b.id_dep(+);
In lista va apare si departamentul VANZARI care nu are
niciun angajat. Totdeanuna semnul (+) se pune in
dreptul tabelei deficitare ca informatii.
Putem sa folosim si operatorul BETWEEN intr-un join
extern. Daca vrem sa aflam care angajati ies din grila de
salarizare prin dublarea salariilor, executam urmatoarea
cerere:

34
Metode de JOIN
SQL> SELECT c.den_dep,a.nume, a.salariu, b.grad
FROM angajati a, grila_salar b, departamente c
WHERE a.salariu*2 BETWEEN b.nivel_inf(+) AND
b.nivel_sup(+) AND a.id_dep=c.id_dep ;
Daca dorim sa selectam toate departamentele care au
primul caracter din id_dep din tabela departamente
folosit printre id_dep in tabela angajati, se poate folosi si
operatorul LIKE :
SQL> SELECT a.id_dep,a.den_dep,b.nume,b.functie
FROM departamente a, angajati b
WHERE b.id_dep(+) LIKE substr(a.id_dep,1,1)||'%';
35
Metode de JOIN
Join vertical (vertical join)
Join-ul vertical este folosit pentru concatenarea
rezultatelor mai multor cereri SELECT si foloseste
operatorii UNION (reuniune), INTERSECT (intersectie),
MINUS (diferenta). In acest caz, join-ul se face dupa
coloane de acelasi tip, nu dupa randuri, de aceea se mai
numeste si vertical.
Exemple:
Daca dorim lista angajatilor din departamentele 10 si 30,
se poate utiliza cererea urmatoare:

36
Metode de JOIN
SQL> SELECT id_dep,nume,functie,salariu
FROM angajati WHERE id_dep=10
UNION
SELECT id_dep,nume,functie,salariu
FROM angajati WHERE id_dep=30;
Trebuie retinut ca reuniunea se poate face pe coloane
declarate de acelasi tip (number,varchar,date), chiar
daca au semnificatii diferite. Sa construim o cerere care
reuneste pe aceeasi coloana salariile angajatilor din
departamentul 10 si cu comisioanele celor din
departamentul 30.
37
Metode de JOIN
SQL> SELECT id_dep,nume,functie,'are salariu'
salar_comision, salariu sal_com
FROM angajati WHERE id_dep=10
UNION
SELECT id_dep,nume,functie,'are comision ',
comision FROM angajati WHERE id_dep=30;
Folosind operatorul UNION ALL se selecteaza si liniile
duplicate:
SQL> SELECT functie FROM angajati WHERE id_dep=10
UNION ALL
SELECT functie FROM angajati WHERE id_dep=20;
38
Metode de JOIN
Operatorul INTERSECT este folosit pentru a selecta liniile
comune. Daca dorim sa aflam care sunt functiile
angajatilor care au primit acelasi comision si care se
regasesc in toate departamentele, scriem urmatoarea
cerere:
SQL> SELECT functie, comision FROM angajati
WHERE id_dep=10
INTERSECT
SELECT functie,comision FROM angajati
WHERE id_dep=20
INTERSECT
SELECT functie,comision FROM angajati
WHERE id_dep=30; 39
Metode de JOIN
Pentru a afla care sunt functiile din departamentul 10
care nu se regasesc in departamentul 30, folosim
operatorul MINUS :
SQL> SELECT functie FROM angajati WHERE id_dep = 10
MINUS
SELECT functie FROM angajati WHERE id_dep = 30;

40
Metode de JOIN
Observatii:
Atunci cand conditia de join lipseste, fiecare linie a unei
tabele din lista FROM este concatenata cu fiecare linie a
celorlalte tabele, obtinandu-se de fapt produsul
cartezian al acestora.
Daca in conditia de join apar numai egalitati operatia
este numita si equi-join. In celelalte cazuri avem un non-
equi-join.
In lista de tabele care participa la join o tabela poate sa
apara repetat. O astfel de operatie este numita si joinul
unei tabele cu ea insasi (self-join).
In cazul in care o linie a unei tabele nu se coreleaza prin
conditia de join cu nicio linie din celelalte tabele ea nu va
participa la formarea rezultatului. Se poate insa cere ca
aceasta sa fie luata in considerare pentru rezultat,
rezultand asa numitul join extern (outer join). 41
Metode de JOIN
In cazul general al unui join pe N tabele, conditia de join
este compusa din N - 1 subconditii conectate prin AND
care relationeaza intreg ansamblul de tabele. Altfel spus,
daca se construieste un graf al conditiei in care nodurile
sunt tabele si arcele subconditii de join care leaga doua
tabele, atunci acest graf trebuie sa fie conex.
Marcajul de join extern se poate folosi si atunci cand
conditia de join este compusa, cu exceptia cazului in
care se foloseste OR sau operatorul de incluziune IN
urmat de o lista care contine mai mult de o valoare.
Joinul extern se poate folosi si in conjunctie cu
operatorii specifici SQL.
42
Metode de JOIN in SQL-3
Pana la versiunea Oracle 9i sintaxa joinului in Oracle era
diferita de standardul ANSI (American National
Standards Institute). Incepand cu aceasta versiune au
fost introduse in limbaj si tipurile de join din standardul
SQL-3(anul 1999) printre care cross-join, join natural si
mai multe variante de join extern:
CROSS JOIN produs cartezian
JOIN USING coloane comune
NATURAL JOIN join natural
JOIN ON join general
OUTER JOIN ON join extern
Pe o clauza avem o singura tabela (nu se mai pun toate
in clauza FROM). 43
Metode de JOIN in SQL-3
CROSS JOIN
Este folosit pentru obtinerea produsul cartezian si are
urmatoarea sintaxa:

SELECT [DISTINCT|ALL]
[[table|table_alias].]{column|expression}
[column_alias]
FROM
[schema.]table1 [table1_alias] CROSS JOIN
[schema.]table2 [table2_alias]
[other clauses]
44
Metode de JOIN in SQL-3
Exemple:
SQL> SELECT a.nume, b.den_dep FROM angajati a
CROSS JOIN departamente b;

Pentru a face JOIN si CROSS JOIN adaugam conditia de


join in clauza WHERE:
SQL> SELECT a.nume, a.data_ang, b.den_dep, b.telefon
FROM angajati a
CROSS JOIN departamente b
WHERE a.id_dep=b.id_dep;
Observatie: Conditia CROSS JOIN poate sa lipseasca
in acest caz, rezultatul va fi acelasi. 45
Metode de JOIN in SQL-3
JOIN USING
Este un equi-join dupa coloane cu acelasi nume
specificate in USING (dar nu toate). Sintaxa este
urmatoarea:
SELECT [DISTINCT|ALL]
{{table|table_alias}.}{column|expression}
[column_alias]
FROM
[schema.]table1 [table1_alias]
[INNER] JOIN [schema.]table2 [table2_alias]
USING (column)
[other clauses] 46
Metode de JOIN in SQL-3
Exemple:
Deoarece in ANGAJATI si DEPARTAMENTE avem o coloana cu
acelasi nume (ID_DEP)) putem face un equi-join astfel:
SQL> SELECT id_dep, den_dep, nume, data_ang, telefon
FROM angajati
INNER JOIN departamente USING (id_dep);
Dupa cum se observa in lista USING numele coloanelor dupa care
se efectueaza joinul nu trebuie prefixat cu numele sau aliasul
vreuneia dintre tabele (coloanele comune se afiseaza o singura data).
Daca se doreste selectia doar dintr-un departament se va adauga
conditia suplimentara pe WHERE:
SQL> SELECT id_dep, nume, den_dep, data_ang, telefon
FROM angajati
JOIN departamente USING (id_dep)
WHERE den_dep='CONTABILITATE; 47
Metode de JOIN in SQL-3
NATURAL JOIN
Este un equi-join dupa coloane cu acelasi nume si are sintaxa
urmatoare:
SELECT [DISTINCT|ALL]
[[table|table_alias].]{column|expression}
[column_alias]
FROM [schema.]table1 [table1_alias]
NATURAL JOIN [schema.]table2 [table2_alias]
[other clauses]

48
Metode de JOIN in SQL-3
Exemplu:
Tabele DEPARTAMENTE si ANGAJATI au o coloana
comuna(ID_DEP) dupa care se poate face un join natural:
SQL> SELECT id_dep, nume, data_ang, den_dep, telefon
FROM angajati
NATURAL JOIN departamente ;
Observatii:
In cazul folosirii clauzei NATURAL JOIN cele doua coloane
trebuie sa aiba acelasi nume.
Daca coloanele au acelasi nume, nu se tine cont de tipul si
semnificatia coloanelor.
Nu se accepta aliasuri pentru coloanele comune.
49
Metode de JOIN in SQL-3
JOIN .. ON
Prin aceasta clauza se implementeaza un join general.
Conditia de join (si eventual si conditiile suplimentare) se
pun in clauza ON. Sintaxa este urmatoarea:
SELECT [DISTINCT|ALL]
{{table|table_alias}.}{column|expression} [column_alias]
FROM
[schema.]table1 [table1_alias]
[INNER] JOIN [schema.]table2 [table2_alias]
ON {{table1|table1_alias}.}column_fromTable1 =
{{table2|table2_alias}.}column_fromTable2
[other clauses]
50
Metode de JOIN in SQL-3
Exemplu: Cererea urmatoare efectueaza joinul dupa
coloana ID_DEP si contine si o conditie
suplimentara(filtru) dupa functia DIRECTOR:
SQL> SELECT a.nume, a.data_ang, b.den_dep, b.telefon
FROM angajati a JOIN departamente b
ON (a.id_dep=b.id_dep AND a.functie='DIRECTOR');
Conditia suplimentara se putea pune si in clauza WHERE.
Intr-un JOIN ON se poate folosi si non-equi-join. Daca se
doreste o lista a angajatilor cu salariul intre 1000 si 3000
se poate introduce urmatorul filtru:
SQL> SELECT a.nume, a.data_ang, b.den_dep
FROM angajati a JOIN departamente b
ON ( a.id_dep=b.id_dep AND
51
a.salariu BETWEEN 1000 AND 3000);
Metode de JOIN in SQL-3
Observatie:
Un join general se poate aplica pe mai multe tabele.
Exemplu:
Cererea urmatoare efectueaza joinul tabelei de angajati
cu tabelele de departamente si grila de salarii:
SQL> SELECT b.den_dep , a.nume, a.salariu, c.grad
FROM angajati a
JOIN departamente b
ON (a.id_dep=b.id_dep
AND salariu+nvl(comision,0) >1000 )
JOIN grila_salar c
ON (a.salariu>=c.nivel_inf AND
a.salariu<=c.nivel_sup)
52
ORDER BY 1;
Metode de JOIN in SQL-3
OUTER JOIN ON
Join-ul extern se foloseste cand se doreste ca in rezultat
sa apara si liniile cu valori nule pe coloanele
corespondente din tabelele relationate.
Sintaxa este urmatoarea:
SELECT [DISTINCT] lista_de_expresii
FROM tabela1
LEFT \
RIGHT | OUTER JOIN tabela2
FULL /
ON (tabela1.nume_coloana1 =
tabela2.numecoloana2)
53
Metode de JOIN in SQL-3
LEFT OUTER JOIN
In cazul join-ului extern stanga valorile nule provin din
tabela2(cea deficitara ca date).
SELECT [DISTINCT|ALL]
{{table|table_alias}.}{column|expression}
[column_alias]
FROM
[schema.]table1 [table1_alias]
LEFT [OUTER ] JOIN [schema.]table2 [table2_alias]
ON {{table1|table1_alias}.}column_fromTable1 =
{{table2|table2_alias}.}column_fromTable2
[other clauses]
54
Metode de JOIN in SQL-3
Exemplu:
Cererea de mai jos face o lista cu toate departamente si
angajatii lor, dar afiseaza si departamentele care nu au niciun
angajat:
SQL> SELECT a.nume nume_ang, a.data_ang, a.salariu, b.den_dep
departament
FROM departamente b
LEFT OUTER JOIN angajati a ON(a.id_dep=b.id_dep);

Urmatoarea cerere este echivalenta cu prima:


SQL> SELECT a.nume nume_ang, a.data_ang, a.salariu, b.den_dep
departament
FROM angajati a , departamente b
WHERE a.id_dep(+)=b.id_dep;
Notatia pentru join extern stanga este: R o LS. In rezultat apar
toate liniile tabelei din stanga operatorului, inclusiv valorile nule.
55
Metode de JOIN in SQL-3
RIGHT OUTER JOIN
In cazul join-ului extern dreapta valorile nule provin din
tabela1(cea deficitara ca date). Sintaxa este similara cu join extern
stanga.
Exemplu: Cererea urmatoare face o lista cu angajatii si sefii lor,
inclusiv angajatii care nu au sefi:
SQL> SELECT b.id_ang sef, b.nume nume_sef, a.nume nume_ang,
a.data_ang, a.salariu
FROM angajati b
RIGHT OUTER JOIN angajati a ON(a.id_sef= b.id_ang);
Urmatoarea cerere este echivalenta cu prima:
SQL> SELECT b.id_ang sef, b.nume nume_sef, a.nume nume_ang,
a.data_ang, a.salariu
FROM angajati b, angajati a
WHERE a.id_sef= b.id_ang(+);
Notatia pentru join extern dreapta este: R o RS. In rezultat apar
56
toate liniile tabelei din dreapta operatorului, inclusiv valorile nule.
Metode de JOIN in SQL-3
Observatie: Sa analizam urmatoarele cereri:
SQL> SELECT b.id_ang sef, b.nume nume_sef, a.nume nume_ang,
a.data_ang, a.salariu
FROM angajati a
LEFT OUTER JOIN angajati b ON (a.id_sef= b.id_ang);
SQL> SELECT b.id_ang sef, b.nume nume_sef, a.nume nume_ang,
a.data_ang, a.salariu
FROM angajati b
RIGTH OUTER JOIN angajati a ON (a.id_sef= b.id_ang);
Daca executam cele doua cereri vom obtine acelasi rezultat.
Practic, daca inversam tipul de join si aliasurile de coloana vom
obtine doua cereri identice.

57
Metode de JOIN in SQL-3
FULL OUTER JOIN
In cazul unui join extern complet rezultatul contine toate liniile din
rezultatul joinului general si joinul extern LEFT/RIGTH, obtinut cu
aceeasi conditie . Sintaxa este urmatoarea:
SELECT [DISTINCT|ALL]
{{table|table_alias}.}{column|expression} [column_alias]
FROM
[schema.]table1 [table1_alias]
FULL [OUTER] JOIN [schema.]table2 [table2_alias]
ON {{table1|table1_alias}.}column_fromTable1 =
{{table2|table2_alias}.}column_fromTable2
[other clauses]
58
Metode de JOIN in SQL-3
Exemplu:
Cererea urmatoare returneaza o lista cu toti angajatii si toate
departamentele :
SQL> SELECT a.nume, a.data_ang, b.den_dep, b.telefon
FROM angajati a
FULL OUTER JOIN departamente b ON (a.id_dep=b.id_dep);

Observatie: Urmatoarea cerere NU ESTE echivalenta cu prima:

SQL> SELECT a.nume, a.data_ang, b.den_dep, b.telefon


FROM angajati a, departamente b
WHERE a.id_dep(+)=b.id_dep(+);
ERROR at line 4: ORA-01468: a predicate may reference only one outer-joined table
Notatia pentru join extern complet este: R o S. In rezultat apar
toate liniile tabelelor din stanga si dreapta operatorului.
59
Metode de JOIN in SQL-3
Observatie: Un join extern se poate face pe mai multe tabele.
Exemplu:
Cererea urmatoare returneaza o lista cu toate departamentele
(inclusiv cele fara angajati), toti angajatii si toate gradele de
salarizare( inclusiv pe cele care nu au corespondent in salariile
angajatilor):

SQL> SELECT b.den_dep, a.nume, a.data_ang, c.grad


FROM angajati a
FULL OUTER JOIN departamente b
ON (a.id_dep=b.id_dep)
FULL OUTER JOIN grila_salar c
ON a.salariu between c.nivel_inf and c.nivel_sup
ORDER BY b.den_dep;

60

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