Sunteți pe pagina 1din 12

AFISAREA DATELOR DIN TABELE MULTIPLE

Obiective

Dupa completarea acestei lectii, veti putea face urmatoarele:


 Scrieti expresii SELECT pentru a accesa date din mai multe tabele folosind
legaturi (join-uri) de egalitate si nonegalitate
 Vizualizati date care în general nu reies dintr-o conditie join folosind join-uri
exterioare
 Efectuarea unui join unui tabel însusi.

Scopul lectiei
Aceasta lectie cuprinde cum sa obtinem date din mai mult de un singur tabel, folosind diferite
metode disponibile.

Obtinerea datelor mai multe tabele

EMP DEPT
EMPNO ENAME … DEPTNO DEPTNO DNAME LOC
7893 KING … 10 10 ACCOUNTING NEW YORK
7698 BLAKE … 30 20 RESEARCH DALLAS
… … 30 SALES CHICAGO
7934 MILLER … 10 40 OPERATIONS BOSTON

EMPNO DEPTNO LOC


7893 10 NEW YORK
7698 30 CHICAGO
7782 10 NEW YORK
7566 20 DALLAS
7654 30 CHICAGO
7499 30 CHICAGO

14 rows selected

Date din mai multe tablele


Câteodata este nevoie de folosit date din mai multe tabele. În exemplul de mai sus, rezultatul
afiseaza date din doua tabele separate.
 EMPNO exista în tabelul EMP
 DEPTNO exista în ambele tabele EMP si DEPT
 LOC exista în tabelul DEPT.
Pentru a se ajunge la rezultatul final, tabelele EMP si DEPT trebuie legate si accesa date din amândoua.

1
Ce este un JOIN ?

Folositi un join pentru a interoga baza de date din mai multe tabele.
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;

 Scrie conditia JOIN în clauza WHERE.


 Prefixeaza numele coloanei cu numele tabelului când acelasi nume de coloana apare în mai
mult de un tabel.

Definirea JOIN-urilor
Când datele din mai multe tablele din baza de date este ceruta, este folosita o conditie join. Liniile
dintr-un tabel pot fi alaturate la liniile din alt tabel conform cu valorile comune existente în coloanele
corespondente, care sunt de obicei, coloane chei primare si straine.
Pentru a afisa date din doua sau mai multe tabele în relatie, scrieti o simpla conditie join în clauza
WHERE.
În sintaxa:
table.column denota tabelul si coloana de unde este extrasa data
table1.column1= este conditia care alatura (leaga)
table2.column2 tabelele împreuna

Observatii:
 Când scrieti o expresie SELECT care leaga tabele, precedati numele coloanei cu numele
tabelului pentru claritate si pentru a mari accesul la baza de date.
 Daca acelasi nume de coloana apare în mai multe tabele, numele coloanei trebuie prefixat cu
numele tabelului.
 Pentru a alatura n tabele âmpreuna, este nevoie de minim n-1, conditii join. Asadar, pentru a
alatura 4 tabele, sunt necesare 3 join-uri. Aceasta regula s-ar putea sa nu se aplice daca tabelul
are o cheie primara concatenata, si astfel mai mult de o coloana este necesara pentru a identifica
în mod unic fiecare linie.

Produsul Cartezian

 Un produs cartezian este format când:


- o conditie join este omisa
- o conditie join este invalida
- toate liniile în primul tabel sunt alaturate la liniile din tabelul al doilea
 Pentru a evita un produs cartezian, includeti totdeauna o conditie join valida într-o
clauza WHERE

Produsul Cartezian
Când o conditie join este valida sau complet omisa, rezultatul este un produs cartezian în care vor fi
afisate toate combinatiile de linii.
Toate liniile din primul tabel sunt alaturate la toate liniile din al doilea tabel.

2
Un produs cartezian tinde sa genereze un numar mare de linii, si rezultatul sau este rar folositor.
Trebuie inclus întotdeauna o conditie join valida într-o clauza WHERE; cu exceptia cazului când se
doreste în mod explicit combinarea tuturor liniilor din tabele.

Generarea unui produs cartezian


EMP (14 rows) DEPT (4 rows)

EMPNOENAME…DEPTNO7893KING… DEPTNODNAMELOC10ACCOUNTINGNEW
EMPNOENAME…DEPTNO7893KING… DEPTNODNAMELOC10ACCOUNTINGNEW
107698BLAKE…30……7934MILLER…10 YORK20RESEARCHDALLAS30SALESCHIC
107698BLAKE…30……7934MILLER…10 YORK20RESEARCHDALLAS30SALESCHIC
AGO40OPERATIONSBOSTON
AGO40OPERATIONSBOSTON

ENAMEDNAMEKINGACCOUNTI
ENAMEDNAMEKINGACCOUNTI
NGBLAKEACCOUNTING...KING
Cartesian NGBLAKEACCOUNTING...KING
RESEARCHBLAKERESEARCH...C
product: RESEARCHBLAKERESEARCH...C
HICAGO56 rows selected.
HICAGO56 rows selected.
14*4=56 rows"

Un produs cartezian este generat daca o conditie join este omisa. Exemplul alaturat afiseaza numele
angajatului si numele departamentului din tabelele EMP si DEPT. Deoarece nu au fost specificate nici
o clauza WHERE, toate liniile (14) din tabelul EMP sunt alaturate cu toate liniile (4) din tabelul DEPT,
generând astfel 56 de linii în tabelul de iesire.
SQL > SELECT ename, dname
2 FROM emp, dept;
ENAME DNAME
------------------- ---------------------
KING ACCOUNTING
BLAKE ACCOUNTING
...
KING RESEARCH
BLAKE RESEARCH
...
56 rows selected.

Tipuri de Join-uri

Equijoin Non-equijoin Outer join Self join

Exista doua tipuri importante de conditii join:


 Echijoin-uri
3
 Non-echijoin-uri

Metode aditionale de joinuri includ urmatoarele:


 Outer join
 Self join
 Operatori

Ce este un Echijoin ?

EMP DEPT
EMPNO ENAME DEPTNO DEPTNO DNAME LOC
7839 KING 10 10 ACCOUNTING NEW YORK
7698 BLAKE 30 30 SALES CHICAGO
7782 CLARK 10 10 ACCOUNTING NEW YORK
7566 JONES 20 20 RESEARCH DALLAS
7654 MARTIN 30 30 SALES CHICAGO
7499 ALLEN 30 30 SALES CHICAGO
7844 TURNER 30 30 SALES CHICAGO
7900 JAMES 30 30 SALES CHICAGO
7521 WARD 30 30 SALES CHICAGO
7902 FORD 20 20 RESEARCH DALLAS
7369 SMITH 20 20 RESEARCH DALLAS
... ...
14 rows selected. 14 rows selected.

Cheie straina Cheie primara

Echijoin-uri
Pentru a determina numele departamentului unui angajat, trebuie comparat valoarea din coloana
DEPTNO din tabelul EMP cu valorile DEPTNO din tabelul DEPT. Relatia dintre tabelele EMP si
DEPT este un echijoin - aceasta însemand ca, valorile din coloana DEPTNO din ambele tabele trebuie
sa fie egale. Frecvent, acest tip de join-uri implica complementele cheilor primare si straine.
Extragerea inregistrarilor cu Echijoin-uri
SQL> SELECT emp.empno, emp.ename, emp.deptno,
2 dept.deptno, dept.loc
3 FROM emp, dept
4 WHERE
EMPNO emp.deptno=dept.deptno;
ENAME DEPTNO DEPTNO LOC
7839 KING 10 10 NEW YORK
7698 BLAKE 30 30 CHICAGO
7782 CLARK 10 10 NEW YORK
7566 JONES 20 20 DALLAS
...
14 rows selected.

În exemplul de mai sus:


 Clauza SELECT specifica numele de coloane de extras
- numele angajatului, numarul angajatului si numarul departamentului, care sunt coloane
în tabelul EMP;

4
- numarul departamentului, numele departamentului si locatia, sunt coloane în tabelul
DEPT.
 Clauza FROM specifica cele 2 tabele pe care baza de date trebuie s-o acceseze:
- tabelul EMP
- tabelul DEPT
 Clauza WHERE specifica felul în care tabelele vor fi alaturate

Deoarece coloana DEPTNO este comuna la ambele tabele, trebuie prefixata cu numele tabelului pentru
a evita ambiguitatea.

Calificarea Numelor de Coloane Ambigui

 Folositi prefixele tabelelor pentru a califica numele coloanelor din mai multe tabele
 Îmbunatatiti performanta prin folosirea prefixelor de tabele
 Distingeti coloanele care au nume identice dar redimensionati în tabele diferite prin
folosirea aliasurilor de coloane.
Trebuie sa calificati numele coloanelor în clauzele WHERE cu numele tabelului pentru a evita
ambiguitatea. Fara prefixurile tabelelor, coloana DEPTNO ar putea fi din tabela DEPT sau EMP. Este
necesar adaugarea prefixului de tabel pentru a executa interogarea.
Daca nu sunt nume de coloane comune între cele doua tabele, nu este nevoie calificarea coloanelor.
Oricum, veti castiga performanta mai mare prin folosirea prefixului de tabel deoarece se cere
Serverului Oracle exact unde sa gaseasca coloanele.
Cererile de calificare a numelor de coloane ambigui sunt de asemenea aplicabile la coloanele care
pot fi ambigui în alte clauze cum ar fi SELECT sau ORDER BY.

Conditii de cautare aditionale folosind opeatorul AND

EMP DEPT
EMPNO ENAME DEPTNO DEPTNO DNAME LOC
7839 KING 10 10 ACCOUNTING NEW YORK
7698 BLAKE 30 30 SALES CHICAGO
7782 CLARK 10 10 ACCOUNTING NEW YORK
7566 JONES 20 20 RESEARCH DALLAS
7654 MARTIN 30 30 SALES CHICAGO
7499 ALLEN 30 30 SALES CHICAGO
7844 TURNER 30 30 SALES CHICAGO
7900 JAMES 30 30 SALES CHICAGO
7521 WARD 30 30 SALES CHICAGO
7902 FORD 20 20 RESEARCH DALLAS
7369 SMITH 20 20 RESEARCH DALLAS
... ...
14 rows selected. 14 rows selected.

In plus la join, puteti avea criterii aditionale pentru clauza WHERE. De exemplu, pentru a afita
numarul de angajat al angajatului KING, numele, numarul departamentului si locatia departamentului,
este nevoie de o conditie în plus în clauza WHERE.
SQL> SELECT empno, ename, deptno, loc
2 FROM emp, dept
3 WHERE emp.deptno=dept.deptno
4 AND INITCAP(ename) = 'King' ;

5
EMPNO ENAME DEPTNO LOC
7839 KING 10 NEW YORK

Folosirea de Aliasuri la Tabele

Simplificati interogarile folosind aliasurile de tabele

SQL> SELECT emp.empno, emp.ename, emp.deptno,


2 dept.deptno, dept.loc
3 FROM emp, dept
4 WHERE emp.deptno=dept.deptno;

SQL> SELECT e.empno, e.ename, e.deptno,


2 d.deptno, d.loc
3 FROM emp e, dept d
4 WHERE e.deptno=d.deptno;

Atasarea numelor coloanelor cu numele tabelului poate consuma mult timp, mai ales daca numele
tabelului este lung. Se pot folosi aliasuri de tabele în locul numelor tabelelor. Asa cum un alias de
coloana da unei coloane un alt nume, un alias de tabel îi da acestuia alt nume. Aliasurile de tabel ajuta
la mentinerea codului SQL mai mic, si astfel folosirea mai putina a memoriei.
De notat faptul cum aliasurile de tabel sunt identificate in clauza FROM în exemplul de mai sus.
Numele tabelului este specificat pe de-a întregul, urmat de un spatiu si apoi aliasul. Tabelul EMP i-a
fost dat un alias E, iar tabelul DEPT are un alias D.
Observatii:
 Aliasurile de tabel pot avea pâna la 30 caractere lungime, dar cu cât sunt mai scurte cu atât mai
bine;
 Daca aliasul unui tabel este folosit pentru un nume de tabel particular în clauza FROM, atunci acel
alias de tabel trebuie sa fie substituitentul pentru numele tabelului pe tot cuprinsul expresiei
SELECT;
 Aliasurile de tabel ar trebui sa aiba sens;
 Aliasul de tabel este valid numai pentru SELECT-ul curent.

Alaturarea a mai mult de 2 tabele

CUSTOMER ORD
NAMECUSTIDJOCKSSPORTS100 CUSTIDORDID100610101611102
NAMECUSTIDJOCKSSPORTS100 CUSTIDORDID100610101611102
TKB SPORT 612103601105602106107...21
TKB SPORT 612103601105602106107...21 ITEM
SHOP101VOLLYRITE102JUST rows selected.
SHOP101VOLLYRITE102JUST rows selected.
TENNIS103K+T
TENNIS103K+T
SPORTS105SHAPE
SPORTS105SHAPE
UP106WOMENS SPORTS107......9
UP106WOMENS SPORTS107......9
rows selected. ORDIDITEMID610361116
rows selected. ORDIDITEMID610361116
12160116021...64 rows
12160116021...64 rows
selected.
selected.

6
Conditii de cautare aditionale

Uneori este nevoie de alaturat (join) mai mult de doua tabele. De exemplu, pentru a afisa numele,
plasarea în ordine, numerele item-urilor, totalul fiecarui item, si totalul pentru fiecare ordin pentru
clientul TKB SPORT SHOP, va trebui alaturate (join) tabelele CUSTOMER, ORD si ITEM.
SQL> SELECT c.name, o.ordid, i.itemid, i.itemtot, o.total
2 FROM customer c, ord o, item i
3 WHERE c.custid = o.custid
4 AND o.ordid = i.ordid
5 AND c.name = 'TKB SPORT SHOP';

NAME ORDID ITEMID ITEMID TOTAL


TKB SPORT SHOP 610 3 58 101.4
TKB SPORT SHOP 610 1 35 101.4
TKB SPORT SHOP 610 2 8.4 101.4

Non-echijoin-uri
EMP
EMPNO ENAME SAL GRADE LOSAL HISAL
7839 KING 5000 1 700 1200
7698 BLAKE 2850 2 1201 1400
7782 CLARK 2450 3 1401 2000
7566 JONES 2975 4 2001 3000
7654 MARTIN 1250 5 3001 9999
7499 ALLEN 1600
7844 TURNER 1500
7900 JAMES 950 "salarul din tabelul EMP este între salarul
... minim si maxim in tabelul SALGRADE"
14 rows selected.

Relatia dintre tabelul EMP si SALGRADE este un non-echijoin, adica nici o coloana din tabelul
EMP nu corespunde direct unei coloane în tabelul SALGRADE. Relatia dintre cele doua tabele este
astfel: coloana SAL din EMP este între coloanele LOSAL si HISAL din tabelul SALGRADE. Relatia
(legatura) se obtine folosind un operator, altul decat egal (=).

Extragerea inregistrarilor cu Non-echijoin-uri

SQL> SELECT e.name, e.sal, s.grade


2 FROM emp e, salgrade s
3 WHERE e.sal
4 BETWEEN s.losal AND s.hisal;

ENAME SAL GRADE


JAMES 950 1
SMITH 800 1
ADAMS 1100 1
...
14 rows selected

7
Exemplul de sus creeaza un non-echijoin pentru a evalua gradul salarului unui angajat. Salarul
trebuie sa fie între orice pereche "cel mai mic" - "cel mai mare" a intervalelor salariale.
Este important de remarcat ca toti angajatii apar exact o data când aceasta interogare este executata.
Nici un angajat nu este repetat in lista. Sunt doua motive pentru aceasta:
 Nici o linie din tabelul cu gradele salariale nu contine grade care se suprapun (cu valorile
pentru alte grade). Astfel, valoarea salarului unui angajat poate oscila numai între salariul
minim si maxim din una din linii in tabelul gradelor salariale.
 Toate salariile angajatilor sunt între limitele date de tabelul gradelor salariale. Astfel, nici un
angajat nu câstiga mai putin decât cea mai mica valoare din coloana LOSAL sau mai mult
decât cea mai mare valoare continuta în coloana HISAL.

Observatie: Alti operatori, cum ar fi <= si >= pot fi folositi, dar este mai simplu de folosit BETWEEN.
Amintiti-va sa specificati valoarea minima întâi si valoarea maxima atunci când folositi BETWEEN.
Aliasurile de tabele au fost specificate din motive de performanta, si nu datorita unei posibile
ambiguitati.

Join-uri externe
EMP DEPT
ENAME DEPTNO DEPTNO DNAME
KING 10 10 ACCOUNTING
BLAKE 30 30 SALES
CLARK 10 10 ACCOUNTING
JONES 20 20 RESEARCH
... ...
40 OPERATIONS

Nici un angajat în departamentul OPERATIONS

Returnarea inregistrarilor cu NoDirectMatch (Portivire Indirecta) cu Joinuri externe.

Daca o linie (înregistrare) nu satisface conditia de join, acea linie nu va aparea în rezultatul interogarii.
De exemplu, în conditia de echijoin a tabelelor EMP si DEPT, departamentul OPERATIONS nu va
aparea pentru ca nimeni nu lucreaza în acel departament.
ENAME DEPTNO DNAME
KING 10 ACCOUNTING
BLAKE 30 SALES
CLARK 10 ACCOUNTING
JONES 20 RESEARCH
...
ALLEN 30 SALES
TURNER 30 SALES
JAMES 30 SALES
....
14 rows selected
Outer Joins

 Folositi un join extern pentru a vedea de asemenea linii care nu întilnesc conditia de join
 Operatorul join extern este semnul plus (+).

SELECT table.column, table.column


FROM table1, table2
WHERE table1.column(+) = table2.column; 8
SELECT table.column, table.column
FROM table1, table2
WHERE table1.column = table2.column(+) ;

Returnarea înregistrarilor cu potrivire indirecta cu ajutorul joinului extern

Linia (liniile) lipsa pot fi returnate daca un join extern este folosit in conditia join. Operatorul este un
semn "plus" între paranteze (+), si este plasat în "aria" lui join ceea ce e deficient în informatie. Acest
operator are efectul crearii a unei sau mai multe linii goale (nule), pentru fiecare linie din tabelul
nondeficient care poate fi facut join.
În sintaxa:
table1.column = este conditia care face join la tabele
table2.column(+) este simbolul pentru join extern; poate fi plasat in
oricare parte a conditiei clauza WHERE, dar nu în ambele parti deodata.
Plasati simbolul join extern dupa numele coloanei din tabel fara sa atinga
(marcheze) liniile.

Folosirea Join-urilor Externe

SQL> SELECT e.ename, d.deptno, d.dname


2 FROM emp e, dept d
3 WHERE e.deptno(+) = d.deptno
4 ORDER BY e.deptno ;

ENAME DEPTNO DNAME


KING 10 ACCOUNTING
CLARK 10 ACCOUNTING
...
40 OPERATIONS
15 rows selected

Exemplul de mai sus afiseaza numere si nume pentru toate departamentele. Departamentul
OPERATIONS, care nu are nici un angajat este de asemenea afisat.

Restrictii la Join extern


 Operatorul join extern poate aparea numai într-o singura parte a unei expresii - partea care are
informatia care lipseste. El returneaza acele linii din tabel care nu au corespondent direct in celalalt
tabel.
 O conditie implicata în join extern nu poate fi operatorul IN sau sa fie lagata unei alte conditii de
operatorul OR.

9
Join-uri ale aceluiasi tabel
EMP (WORKER) EMP (MANAGER)
EMPNO ENAME MGR EMPNO ENAME
7839 KING
7698 BLAKE 7839 7839 KING
7782 CLARK 7839 7839 KING
7566 JONES 7839 7839 KING
7654 MARTIN 7698 7698 BLAKE
7499 ALLEN 7698 7698 BLAKE

"MGR în tabelul WORKER este egal cu EMPNO


în tabelul MANAGER"

Uneori este nevoie de alaturat (join) un tabel cu el însusi. Pentru a gasi numele fiecarui angajat al
unui manager este nevoie de alaturat (join) însusi tabelul EMP. De exemplu, pentru a gasi numele
managerului lui Blake, este nevoie sa:
- gasiti pe Blake în tabelul EMP uitându-va la coloana ENAME
- gasiti numarul managerului pentru Blake uitându-va la coloana
MGR. Numarul managerului lui Blake este 7839.
- gasiti numele managerului cu EMPNO 7893 uitandu-va la coloana ENAME.
Numarul angajatului King este 7839. Deci, King este managerul lui Blake.
În acest proces, va uitati (cautati) în tabel de doua ori. Prima data va uitati în tabel pentru a-l gasi pe
Blake în coloana ENAME si valoarea MGR este 7839. A doua oara va uitatt în coloana EMP pentru a
gasi 7839 si în coloana ENAME pentru a gasi King.

Alaturarea unui tabel cu el însusi

SQL> SELECT worker.ename || 'works for' || manager.ename


2 FROM emp worker, emp manager
3 WHERE worker.mgr = manager.empno

WORKER.ENAME || 'WORKSFOR' || MANAG


BLAKE works for KING
CLARK works for KING
JONES works for KING
MARTIN works for BLAKE
...
13 rows selected

Exemplul de mai sus alatura EMP cu el însusi. Pentru a simula cele doua tabele în clauze FROM, se
folosesc doua aliasuri, numite WORKER si MANAGER, pentru acelasi tabel, EMP.
În acest exemplu, clauza WHERE contine join-ul care înseamna "unde numarul unui lucrator al unui
manager gaseste numarul angajatului pentru manager".

Cuprins

SELECT table1.column, table2.column


FROM table1, table2
WHERE table1.column1 = table2.column2;

10
Equijoin Non-equijoin Outer join Self join

Exista feluri multiple de a alatura tabele. Firul comun, este legarea lor printr-o conditie în clauza
WHERE. Metoda pe care o veti alege se va baza pe rezultatele cerute si structurate de date folosite.
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;

Exercitii - rezumat
 Alaturarea tabelelor folosind echijoin
 Folosirea join-urilor externe si interne
 Adaugarea conditiilor suplimentare

Exercitii 4

1. Scrieti o interogare care sa afiseze numele, numarul departamentului si numele departamentului


pentru toti angajatii.

2. Creeati un listing unic pentru toate meseriile (jobs) din departamentul 30.

3. Scrieti o interogare care afiseaza numele angajatului, numele departamentului si locatia tuturor
angajatilor care câstiga un comision.

4. Afisati numele angajatului si numele departamentului pentru toti angajatii care au un A în numele
lor. Salvati tabelul SQL într-un fisier numit p4q4.sql.

5. Scrieti o interogare care afiseaza numele, meseria, numarul departamentului, si numele


departamentului pentru toti angajatii care lucreaza în DALLAS.

6. Afisati numele angajatului si numarul lui împreuna cu numele managerului si numarul acestuia.
Etichetati coloanele Employee, Emp#, Manager, Mgr#, respectiv. Salvati tabelul SQL într-un
fisier numit p4q6.sql.

7. Modificati p4q6.sql pentru a afisa toti angajatii incluzând pe King care nu are manager.

8. Creati o interogare care va afisa numele angajatului, numarul departamentului, si toti angajatii care
lucreaza în acelasi departament cu un angajat dat. Dati fiecarei coloane o eticheta expresiva.

9. Aratati structura tabelului SALGRADE. Creeati o interogare care va afisa numele, meseria, numele
departamentului, salarul, si gradul pentru toti angajatii.

10. Creeati o interogare care afiseaza numele si data angajarii pentru lucratorii angajati dupa data de
angajare a lui Blake.

11
11. Afisati toate numele angajatilor si datele de angajare impreuna cu numele managerilor si data lor de
angajare, pentru toti cei care au fost angajati înaintea managerilor lor. Etichetati coloanele
Employee, respectiv Emp, Hiredate, Manager, si Mgr Hiredate.

12. Creeati o interogare care afiseaza numele angajatilor si salariile indicate prin asteriscuri. Fiecare
asterisc înseamna 1000 $. Sortati datele în ordine descendenta a salariilor. Etichetati coloana
EMPLOYEE_AND_THEIR_SALARIES.

ENAME EMPLOYEE_AND_THEIR_SALARIES
KING *************************************************
FORD ********************************
SCOTT ********************************
JONES *******************************
BLAKE ******************************
CLARK *************************
ALLEN ****************
TURNER ***************
MILLER *************
MARTIN ************
WARD ************
ADAMS ***********
JAMES ********
SMITH *******
14 rows selected.

12

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