Sunteți pe pagina 1din 7

Universitatea Liberă Internațională din Moldova

Facultatea Informatică, Inginerie, Design


Catedra Tehnologii informaționale și Calculatoare
Disciplina: Baze de Date (SQL)

Lucrare de laborator Nr.5

Tema : crearea interogărilor din mai multe tabele concomitent.

A efectuat student gr.TIR-26 Guminiuc Victor

A verificat profesor Mititelu Vitalii

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:

SELECT emp.empno, emp.deptno, dept.dname FROM emp, dept

Aliasuri de tabele

Sintaxa generala : nume_tabela alias_tabela


Prin utilizarea aliasurilor de tabele se simplifica interogarile diminuand-use dimensiunea codului si se imbunatatesc
performantele. In principiu un alias poate avea pana la 30 de caractere, dar este indicat sa nu se ajunga la un numar atat de mare.
Definirea aliasurilor se face in clauza FROM, dupa cum vom vedea in exemplul urmator. Atunci cand definim un alias este
obligatorie folosirea lui in locul numelui tabelei in clauza SELECT.

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:

 limitele gradelor de salarizare nu se suprapun


 nici un salariu nu se gaseste in afara limitelor impuse de gradul de salarizare din care face parte

Join-uri externe (outter join)

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.

Autojoin-uri (self join)


Exista situatii in care trebuie sa facem legatura dintre o tabela si ea insasi. Sa consideram urmatorul exemplu: sa pesupunem ca am
dori sa aflam cine este managerul pentru fiecare angajat. Pentru aceasta trebui sa facem un join intre tabela emp si ea insasi, dupa
cum urmeaza:

SELECT e.ename, m.ename FROM emp e, emp m WHERE m.empno = e.mgr

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) :

SELECT e.ename, m.ename FROM emp e, emp m WHERE m.empno(+) = e.mgr

Join incrucisat (cross join)

- echivalent cu produsul cartezian dintre 2 tabeles;


Sintaxa generala :
SELECT tabela1.coloana,tabela2.coloana FROM tabela1 CROSS JOIN tabela2;

Join-uri naturale (natural joins)

- 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.

Crearea de join-uri utilizand clauza USING


In momentul in care exista mai multe coloane nu acelasi nume, dar care au tipuri de date diferite, aceasta clauza poate specifica ce
coloane vor participa la join. Nu se folosesc nume de tabele sau aliasuri in referirea coloanelor, iar aceasta clauza exclude
utilizarea join-ului natural.

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.

Crearea de join-uri utilizand clauza ON

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.

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