Sunteți pe pagina 1din 6

Baze de date-Anul 2

Laborator 3 SQL
Interogri multi-relaie. Operaia de join. Operatori pe mulimi.
Subcereri necorelate.
I. [Obiective]
n acest laborator vom continua lucrul cu interogri multi-relaie (acestea sunt
cele care regsesc date din mai multe tabele). Am introdus deja diferite tipuri de join.
Vom relua aceste operaii, vom analiza i o alt metod de implementare a lor i de
asemenea vom utiliza operatori pe mulimi
i subcereri necorelate (fr
sincronizare).
Foarte utile n rezolvarea exerciiilor propuse vor fi funciile SQL, prezentate n
laboratorul 2.
II. [Join]
Am implementat deja operaia de join (compunere a tabelelor) n cadrul unor
exemple relative la modelul luat n considerare (HR).
Join-ul este operaia de regsire a datelor din dou sau mai multe tabele, pe
baza valorilor comune ale unor coloane. De obicei, aceste coloane reprezint cheia
primar, respectiv cheia extern a tabelelor. Reamintim c pentru a realiza un join ntre
n tabele, va fi nevoie de cel puin n 1 condiii de join.
Tipuri de join :
Inner join (equijoin, join simplu) corespunde situaiei n care valorile de pe
coloanele ce apar n condiia de join trebuie s fie egale.
Nonequijoin - condiia de join conine ali operatori dect operatorul egalitate.
Left | Right | Full Outer join un outer join este utilizat pentru a obine n
rezultat i nregistrrile care nu satisfac condiia de join. Operatorul pentru outer
join este semnul plus inclus ntre paranteze (+), care se plaseaz n acea parte a
condiiei de join care este deficitar n informaie. Efectul acestui operator este
de a uni liniile tabelului care nu este deficitar n informaie i crora nu le
corespunde nicio linie n cellalt tabel cu o linie cu valori null. Operatorul (+)
poate fi plasat n orice parte a condiiei de join, dar nu n ambele pri.
Full outer join left outer join + right outer join.
Obs: O condiie care presupune un outer join nu poate utiliza operatorul IN i nu poate fi
legat de alt condiie prin operatorul OR.
Obs: Un caz special al operaiei de join este self join join-ul unui tabel cu el nsui. n
ce situaie concret (relativ la modelul nostru) apare aceast operaie?
Obs : Alias-urile pot fi utilizate oriunde, ca o notaie mai scurt, n locul denumirii
tabelului. Ele pot avea lungimea de maxim 30 de caractere, dar este recomandat s fie
scurte i sugestive. Dac este atribuit un alias unui tabel din clauza FROM, atunci el
trebuie s nlocuiasc apariiile numelui tabelului n instruciunea SELECT.
Un alias poate fi utilizat pentru a califica denumirea unei coloane. Calificarea unei
coloane cu numele sau alias-ul tabelului se poate face :
opional, pentru claritate i pentru mbuntirea timpului de acces la baza de
date;
obligatoriu, ori de cte ori exist o ambiguitate privind sursa coloanei.
Ambiguitatea const, de obicei, n existena unor coloane cu acelai nume n mai

mult de dou tabele.

Join n standardul SQL3 (SQL:1999):


Pentru join, sistemul Oracle ofer i o sintax specific, introdus de ctre standardul
SQL3 (SQL:1999). Aceast sintax nu aduce beneficii n privina performanei fa de
join-urile care se specific n clauza WHERE. Tipurile de join conforme cu SQL3 sunt
definite prin cuvintele cheie CROSS JOIN (pentru produs cartezian), NATURAL JOIN,
FULL OUTER JOIN, clauzele USING i ON.
Sintaxa corespunztoare standardului SQL3 este urmtoarea:
SELECT tabel_1.nume_coloan, tabel_2.nume_coloan
FROM tabel_1
[CROSS JOIN tabel_2]
| [NATURAL JOIN tabel_2]
| [JOIN tabel_2 USING (nume_coloan) ]
| [JOIN tabel_2 ON (tabel_1.nume_coloan = tabel_2.nume_coloan) ]
| [LEFT | RIGHT | FULL OUTER JOIN tabel_2
ON (tabel_1.nume_coloan = tabel_2.nume_coloan) ];
NATURAL JOIN presupune existena unor coloane avnd acelai nume n ambele
tabele. Clauza determin selectarea liniilor din cele dou tabele, care au valori egale
n aceste coloane. Dac tipurile de date ale coloanelor cu nume identice sunt diferite,
va fi returnat o eroare.
Coloanele avnd acelai nume n cele dou tabele trebuie s nu fie precedate de
numele sau alias-ul tabelului corespunztor.
JOIN tabel_2 USING nume_coloan efectueaz un equijoin pe baza coloanei cu
numele specificat n sintax. Aceast clauz este util dac exist coloane avnd
acelai nume, dar tipuri de date diferite. Coloanele referite n clauza USING trebuie
s nu conin calificatori (s nu fie precedate de nume de tabele sau alias-uri) n
nicio apariie a lor n instruciunea SQL. Clauzele NATURAL JOIN i USING nu pot
coexista n aceeai instruciune SQL.
JOIN tabel_2 ON tabel_1.nume_coloan = tabel_2.nume_coloan efectueaz un
equijoin pe baza condiiei exprimate n clauza ON. Aceast clauz permite
specificarea separat a condiiilor de join, respectiv a celor de cutare sau filtrare
(din clauza WHERE).
LEFT, RIGHT i FULL OUTER JOIN tabel_2 ON (tabel_1.nume_coloan =
tabel_2.nume_coloan) efectueaz outer join la stnga, dreapta, respectiv n ambele
pri pe baza condiiei exprimate n clauza ON.
Un join care returneaz rezultatele unui inner join, dar i cele ale outer join-urilor la
stnga i la dreapta se numete full outer join.
III. [Operatori pe mulimi]
Operatorii pe mulimi combin rezultatele obinute din dou sau mai multe
interogri. Cererile care conin operatori pe mulimi se numesc cereri compuse. Exist
patru operatori pe mulimi: UNION, UNION ALL, INTERSECT i MINUS.
Toi operatorii pe mulimi au aceeai preceden. Dac o instruciune SQL
conine mai muli operatori pe mulimi, server-ul Oracle evalueaz cererea de la stnga
la dreapta (sau de sus n jos). Pentru a schimba aceast ordine de evaluare, se pot

utiliza paranteze.
Operatorul UNION returneaz toate liniile selectate de dou cereri, eliminnd
duplicatele. Acest operator nu ignor valorile null i are preceden mai mic
dect operatorul IN.
Operatorul UNION ALL returneaz toate liniile selectate de dou cereri, fr a
elimina duplicatele. Precizrile fcute asupra operatorului UNION sunt valabile i
n cazul operatorului UNION ALL. n cererile asupra crora se aplic UNION ALL
nu poate fi utilizat cuvntul cheie DISTINCT.
Operatorul INTERSECT returneaz toate liniile comune cererilor asupra crora
se aplic. Acest operator nu ignor valorile null.
Operatorul MINUS determin liniile returnate de prima cerere care nu apar n
rezultatul celei de-a doua cereri. Pentru ca operatorul MINUS s funcioneze,
este necesar ca toate coloanele din clauza WHERE s se afle i n clauza
SELECT.
Observaii:
n mod implicit, pentru toi operatorii cu excepia lui UNION ALL, rezultatul este
ordonat cresctor dup valorile primei coloane din clauza SELECT.
Pentru o cerere care utilizeaz operatori pe mulimi, cu excepia lui UNION ALL,
server-ul Oracle elimin liniile duplicat.
n instruciunile SELECT asupra crora se aplic operatori pe mulimi, coloanele
selectate trebuie s corespund ca numr i tip de date. Nu este necesar ca numele
coloanelor s fie identice. Numele coloanelor din rezultat sunt determinate de numele
care apar n clauza SELECT a primei cereri.
IV. [Subcereri]
Prin intermediul subcererilor se pot construi interogri complexe pe baza unor
instruciuni simple.
O subcerere (subinterogare) este o comand SELECT integrat ntr-o clauz a
altei instruciuni SQL, numit instruciune printe sau instruciune exterioar.
Subcererile mai sunt numite instruciuni SELECT imbricate sau interioare.
Rezultatele subcererii sunt utilizate n cadrul cererii exterioare, pentru a
determina rezultatul final. n funcie de modul de evaluare a subcererii n raport cu
cererea exterioar, subcererile pot fi:
nesincronizate (necorelate) sau
sincronizate (corelate).
Prima clas de subcereri este evaluat dinspre interior ctre exterior, adic
interogarea extern acioneaz pe baza rezultatului cererii interne. Al doilea tip de
subcerere este evaluat invers, adic interogarea extern furnizeaz valori cererii interne,
iar rezultatele subcererii sunt transferate cererii externe.
Subcererile nesincronizate care apar n clauza WHERE a unei interogri sunt de
forma urmtoare:
SELECT
FROM
WHERE

expresie1, expresie2, ...


nume_tabel1
expresie_condiie operator (SELECT expresie
FROM
nume_tabel2);

cererea intern este executat prima i determin o valoare (sau o mulime


de valori);
cererea extern se execut o singur dat, utiliznd valorile returnate de
cererea intern.

Subcererile sincronizate care apar n clauza WHERE a unei interogri au


urmtoarea form general:
SELECT expresie_ext_1[, expresie_ext_2 ]
FROM nume_tabel_1 extern
WHERE expresie_condiie operator
(SELECT expresie
FROM
nume_tabel_2
WHERE expresie = extern.expresie_ext);

cererea extern determin o linie candidat;


cererea intern este executat utiliznd valoarea liniei candidat;
valorile rezultate din cererea intern sunt utilizate pentru calificarea sau
descalificarea liniei candidat;
paii precedeni se repet pn cnd nu mai exist linii candidat.

Obs: operator poate fi:


single-row operator (>, =, >=, <, <>, <=), care poate fi utilizat dac
subcererea returneaz o singur linie;
multiple-row operator (IN, ANY, ALL), care poate fi folosit dac subcererea
returneaz mai mult de o linie.
Operatorul NOT poate fi utilizat n combinaie cu IN, ANY i ALL.
Cuvintele cheie ANY i ALL pot fi utilizate cu subcererile care produc o singur
coloan de valori. Dac subcererea este precedat de ctre cuvntul cheie ALL, atunci
condiia va fi adevrat numai dac este satisfcut de ctre toate valorile produse de
subcerere. Astfel, <ALL are semnificaia mai mic dect minimul, iar >ALL este
echivalent cu mai mare dect maximul. Dac subcererea este precedat de ctre
cuvntul cheie ANY, condiia va fi adevrat dac este satisfcut de ctre oricare (una
sau mai multe) dintre valorile produse de subcerere. n comparaii, <ANY are
semnificaia mai mic dect maximul; >ANY nseamn mai mare dect minimul; =ANY
este echivalent cu operatorul IN.
Dac subcererea returneaz mulimea vid, atunci condiia ALL va returna
valoarea true, iar condiia ANY va returna valoarea false. Standardul ISO permite
utilizarea cuvntului cheie SOME, n locul lui ANY.

V. [Exerciii - join]
1. Scriei o cerere pentru a se afia numele, luna (n litere) i anul angajrii pentru toi
salariaii din acelai departament cu Gates, al cror nume conine litera a. Se va
exclude Gates. Se vor da 2 soluii pentru determinarea apariiei literei A n nume. De
asemenea, pentru una din metode se va da i varianta join-ului conform standardului
SQL99.
2. S se afieze codul i numele angajailor care lucreaz n acelasi departament cu
cel puin un angajat al crui nume conine litera t. Se vor afia, de asemenea, codul i

numele departamentului respectiv. Rezultatul va fi ordonat alfabetic dup nume. Se vor


da 2 soluii pentru join (condiie n clauza WHERE i sintaxa introdus de standardul
SQL3).
3. Sa se afiseze numele, salariul, titlul job-ului, oraul i ara n care lucreaz angajatii
condusi direct de King.
4. Sa se afiseze codul departamentului, numele departamentului, numele si job-ul tuturor
angajatilor din departamentele al cror nume conine irul ti. De asemenea, se va lista
salariul angajailor, n formatul $99,999.00. Rezultatul se va ordona alfabetic dup numele
departamentului, i n cadrul acestuia, dup numele angajailor.
5. Sa se afiseze numele angajatilor, numarul departamentului, numele departamentului,
oraul si job-ul tuturor salariatilor al caror departament este localizat in Oxford.
6. Afisati codul, numele si salariul tuturor angajatilor care castiga mai mult decat salariul
mediu pentru job-ul corespunztor si lucreaza intr-un departament cu cel putin unul din
angajatii al caror nume contine litera t.
Obs: Salariul mediu pentru un job se va considera drept media aritmetic a valorilor minime
i maxime admise pentru acesta (media valorilor coloanelor min_salary i max_salary).
7. S se afieze numele salariailor i numele departamentelor n care lucreaz. Se vor
afia i salariaii care nu au asociat un departament. (right outer join, 2 variante).
8. S se afieze numele departamentelor i numele salariailor care lucreaz n ele. Se vor
afia i departamentele care nu au salariai. (left outer join, 2 variante)
9. Cum se poate implementa full outer join?
Obs: Full outer join se poate realiza fie prin reuniunea rezultatelor lui right outer join i left
outer join, fie utiliznd sintaxa introdus de standardul SQL99.
VI. [Exerciii - operatori pe mulimi]
10. Se cer codurile departamentelor al cror nume conine irul re sau n care lucreaz
angajai avnd codul job-ului SA_REP. Cum este ordonat rezultatul?
11. Ce se ntmpl dac nlocuim UNION cu UNION ALL n comanda precedent?
12. Sa se obtina codurile departamentelor in care nu lucreaza nimeni (nu este introdus
niciun salariat in tabelul employees). Se cer dou soluii.
13. Se cer codurile departamentelor al cror nume conine irul re i n care lucreaz
angajai avnd codul job-ului HR_REP.
14. S se determine codul angajailor, codul job-urilor i numele celor al cror salariu este
mai mare dect 3000 sau este egal cu media dintre salariul minim i cel maxim pentru
job-ul respectiv.

VII. [Exercitii - subcereri necorelate (nesincronizate)]


15. Folosind subcereri, s se afieze numele i data angajrii pentru salariaii care au
fost angajai dup Gates.
16. Folosind subcereri, scriei o cerere pentru a afia numele i salariul pentru toi
colegii (din acelai departament) lui Gates. Se va exclude Gates.
? Se putea pune = n loc de IN? In care caz nu se poate face aceast nlocuire?
17. Folosind subcereri, s se afieze numele i salariul angajailor condui direct de
preedintele companiei (acesta este considerat angajatul care nu are manager).
18. Scrieti o cerere pentru a afia numele, codul departamentului si salariul angajatilor
al caror numr de departament si salariu coincid cu numarul departamentului si salariul
unui angajat care castiga comision.
19. Rezolvai problema 6 utiliznd subcereri.
20. Scrieti o cerere pentru a afisa angajatii care castiga mai mult decat oricare functionar
(job-ul conine irul CLERK). Sortati rezultatele dupa salariu, in ordine descrescatoare.
(ALL). Ce rezultat este returnat dac se nlocuiete ALL cu ANY?
21. Scriei o cerere pentru a afia numele, numele departamentului i salariul angajailor
care nu ctig comision, dar al cror ef direct coincide cu eful unui angajat care
ctig comision.
22. Sa se afiseze numele, departamentul, salariul i job-ul tuturor angajatilor al caror salariu
si comision coincid cu salariul si comisionul unui angajat din Oxford.
23. S se afieze numele angajailor, codul departamentului i codul job-ului salariailor al
cror departament se afl n Toronto.

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