Documente Academic
Documente Profesional
Documente Cultură
Chișinău 2018
1. Scopul lucrarii
Crearea interogărilor din mai multe tabele concomitent
2. Sarcina
1. În tabelul Departamente adăugați câmpul Loc_ID care trebuie să fie cheie externă a acestui tabel și trebuie de
făcut legătură cu tabelul Raioane, câmpul Rai_ID.
2. Completați cu date câmpul nou introdus.
3. Scrieți o interogare care afișează pe ecran câmpurile Nume, Dep_ID și Dep_Den pentru toți angajații.
4. Creați o listă cu valori unice (fără repetări) ale tuturor profesiilor (Func_ID), care există în departamentul 40.
Afișați și câmpul Loc_ID.
5. Scrieți o interogare care afișează pe ecran câmpurile Nume și Dep_Den, Loc_ID și Rai_Den pentru toți angajații,
care au impozit.
6. Scrieți o interogare care afișează pe ecran câmpurile Nume și Dep_Den pentru toți angajații, numele cărora
conține litera a.
7. Scrieți o interogare care afișează pe ecran câmpurile Nume, Dep_ID și Dep_Den pentru toți angajații care
lucrează în Bălți.
8. Scrieți o interogare care afișează pe ecran câmpurile Nume, Ang_ID, Nume manager (managerul fiecărui angajat)
și Man_ID cu denumirile Angajat, Ang#, Manager și Mgr# respectiv.
9. Modificați interogarea precedentă în așa mod, încât să afișeze și angajatul, care nu are manager (președintele sau
directorul companiei).
10. Scrieți o interogare care afișează pe ecran câmpurile Nume, Dep_ID și toți angajații, care lucrează în unul și
același departament, sortate conform Dep_ID. Numiți aceste câmpuri DEPARTAMENT, ANGAJAȚI și COLEGI
respectiv. Nu e de dorit să utilizați subinterogări.
11. Scrieți o interogare care afișează pe ecran câmpurile Nume și Dată_Ang pentru toți angajații, care au început a
lucra mai târziu decât Mardari (sau altă persoană din tabelul Dvs).
12. Scrieți o interogare care afișează pe ecran câmpurile Nume și Dată_Ang pentru toți angajații, care au început a
lucra mai devreme decât managerii lor, împreună cu numele și data angajării la serviciu a managerului. Numiți-le
Angajați, Dată Ang, Manager și Dată Mgr respectiv.
3. Teorie
Join-ul este mijlocul prin care se pot obtine date din mai multe tabele. Pe langa join-ul dintre mai multe tabele
diferite, exista si asa numitul "self join" ("autojoin" ), adica joinul uneitabele cu ea insasi. . Pentru a intelege mai bine
acest concept vom considera urmatorul exemplu: sa presupunem ca doriti sa aveti ca rezultat o tabela cu 3 coloane,
dar cele trei coloane nu provin in aceeasi tabela din baza de date (empno si deptno apartin tabelei EMP, iar dname
tabelei DEPT): EMPNO DEPTNO DNAME;
Pentru a ajunge la acest rezultat trebuie sa realizam un join intre cele doua tabele, emp respectiv dept, dupa coloana
deptno iar in clauza SELECT trecem numele celor trei coloane pe care le dorim afisate. Comanda va fi:
SELECT emp.empno, emp.deptno, dept.dname FROM emp, dept WHERE emp.deptno = dept.deptno
Produs cartezian
Putem vorbi de un produs cartezian atunci cand o cinditie a join-ului este omisa sau invalida, atunci cand toate liniile dintr-un
tabel sunt adaugatetuturor liniilor din al doilea tabel. Pentru a evita aparitia unui produs cartezian trebuie sa introducem
intotdeauna o conditie valida in clauza WHERE.
De obicei in cazul aparitiei un produs cartezian sunt generate mai multe linii dacat ar fi nevoie, si deci rezulatatul este rar
folositor. Totusi exista sisituatii cand este folositoare obtinerea unui astfel de rezultat, de exemplu cand se doreste generarea unui
numar mare de linii pentru a simula o> cantitate mare de date. De exemplu, daca in cazul anterior am obtinut o tabela cu 3 coloane
si 14 randuri, daca am fi omis conditia din clauza WHERE:
Aliasuri de tabele
Ex: SELECT e.empno, d.dname FROM emp e, dept d WHERE e.deptno = d.deptno;
Non-echijoin-uri (non-equijoin)
In cazul acestui tip de join in conditia de join nu apare operatorul de egaltate ci alti poperatori (<=; =>; BETWEEN). Pentru a
intelege mai bine vom
vom considera urmatorul exemplu care utilizeaza clauza BETWEEN:
SELECT empno,dname,grade FROM emp e, dept d, salgrade s WHERE sal BETWEEN s.losal AND s.hisal;
Este important de observat ca fiecare angajat apare o singura data atunci cand aceasta cerere este executata. Motivele pentru se
intampla acest lucru sunt:
Daca realizam un echijoin si exista randuri care nu indeplinesc conditie de join (pentru ca anumite intrari dintr-o tabela nu au
corespondenti in cealalta tabela), atunci acestea nu vor aparea in rezultat. Pentru a putea vizualiza totusi si aceste randuri se
foloseste join-ul extern.
Sintaxa generala:
SELECT tabela1.coloana,tabela2.coloana FROM tabela1, tabela2 WHERE tabela1.coloana (+) = tabela2.coloana;
Operatorul care determina join-ul extern este "+" incadrat inrte doua paranteze (dupa cum se poate vedea si in exemplu); acesta
este pozitionat pe partea membrului din conditia de join care are mai putina informatie. In acest mod se creeaza randuri vide la
care pot si adaugate radurile din tabela cu mai multa informatie. Exista o anumita restrictrie in cazul folosirii acetui tip de join si
anume : o conditie care implica un join extern nu poate folosi operatorul IN sau sa fie legata de o alta conditie prin operatorul OR.
Dupa cum observati rezultatul contine doar 13 linii desi in tabela avem 14 intrari corespunzatare angajatilor. Acest lucru se
intampla deoarece angajatul King nu are nici un superior, si deci nu respecta conditia de join. Pentru ca aceasta intrare sa apara in
rezultat trebuie sa folosim un join extern, punanad operatorul "+" in dreapta lui m.empno (coloana cu informatie mai putina) :
- echivalent cu un echijoin;
Sintaxa generala :
SELECT tabela1.coloana,tabela2.coloana MFROM tabela1 NATURAL JOIN tabela2;
Acest tip de join, disponibil incepand cu versiunea 9i, se bazeaza pe toate coloanele din cele doua tabele care au acelasi nume
(selecteaza randurile din cele 2 tabele care au valori egale in toate coloanele care s-au potrivit). In cazul in care coloanele cu
acelasi nume contin tipuri de date diferite este intoarsa o eroare. Daca se doreste impunerea altor restrictii se poate folosi clauza
WHERE.
Sintaxa generala :
SELECT tabela1.coloana,tabela2.coloana FROM tabela1 JOIN tabela2 USING (nume_coloana);
Incazul in care se folosesc clauze care limiteaza cautarile (WHERE de exemplu) este generata o eroare.
Clauza ON este folosita pentru a specifica conditii arbitrare sau coloanele care participa la join. Conditia de join este separata de
celelalte conditii de cautare.
Sintaxa generala:
SELECT tabela1.coloana,tabela2.coloana FROM tabela1 JOIN tabela2 ON (tabela1.nume_coloana1 =
tabela2.nume_coloana2);
Aceasta clauza poate fi folosita si pentru realizarea join-ului mai multor tabele:
SELECT tabela1.coloana,tabela2.coloana,tabela3.coloana FROM tabela1 JOIN tabela2 ON (tabela1.nume_coloana1 =
tabela2.nume_coloana2);
JOIN tabelan ON (tabela1.nume_coloana2 = tabelan.nume_coloanam);
4. Mersul lucrarii
ex.1
ex.2
ex.3
ex.4
ex.5
ex.6
ex.7
ex.8
ex.9
ex.10
ex.11
ex.12
5. Concluzii
În decursul efectuării lucrării de laborator am folosit clauza JOIN pentru a agrega si sorta date din tabele diferite.