ALTE DOCUMENTE
|
|||||||
Reuniunea (join) si uniunea (union) sunt doua tehnici utilizate pentru a combina diverse grupuri de date. în momentul în care datele sunt grupate logic, acestea pot fi afisate sau pot fi procesate în continuare. Atât reuniunea cât si uniunea se realizeaza în instructiunea select.
Reuniunile si uniunile se folosesc pentru a grupa împreuna date stocate în tabele diferite. Aceste doua metode de grupare aduna la un loc date din tabele multiple care sunt înrudite între ele. Aceasta caracteristica simplifica procesul de interogare.
În paragrafele urmatoare sunt tratate diversele tipuri de reuniuni si uniuni.
O reuniune simpla (simple join) este o instructiune select care returneaza linii din doua sau mai multe tabele. Aceste tabele 323v216d se afla în relatie, sau sunt reunite, pe baza coloanelor pe care le au în comun. Tabelele care sunt reunite pe baza coloanelor comune apar în clauza f rom a instructiunii select în acest capitol, este tratata reuniunea a doua tabele, însa aceste informatii sunt aplicabile si reuniunii a trei sau mai multe tabele.
Oracle nu impune nici o limitare în legatura cu coloanele pe care le puteti selecta din fiecare tabel. Puteti sa nu selectati nici o coloana sau sa selectati coloane multiple din fiecare tabel. Coloanele pe'care le specificati în clauza where nu este necesar sa apara în lista select.
Reunirea a doua tabele fara clauza where creeaza un produs cartezian. Acest produs combina fiecare linie a primului tabel cu fiecare linie a celui de-al doilea tabel. De exemplu, produsul cartezian al unui tabel cu 10 linii cu un alt tabel cu 25 de linii reprezinta o reuniune cu 250 de linii. De obicei acest rezultat nu are nici un sens si nu este folosit aproape deloc.
Puteti substitui numele real al tabelului cu aliasul acestuia în clauza f rom a instructiunii select. In acest caz însa, mediul Oracle impune substituirea numelui tabelului cu aliasul pe tot parcursul instructiunii select, atât în lista select, cât si în clauza where.
Sintaxa unei reuniuni simple este urmatoarea:
select coloana(e)
from tabel1, tabel2
where tabel1.coloanal = tabel2.coloana1
unde:
coloana(e) reprezinta coloana sau coloanele din care se citesc datele
tabel1, tabel2 reprezinta tabelele din care se citesc datele
tabel1. coloana1 = tabel2 .coloana1 reprezinta conditia care reuneste cele doua tabele.
Figura prezinta cele doua tabele reunite în exemplul care urmeaza în acest exemplu, tabelele ANGAJAT si DEPARTAMENT sunt reunite pe baza coloanei nr_dept.
Figura 15.1 doua tabele reunite (reuniune simpla). |
|
Aceasta instructiune creeaza o reuniune pentru tabelele ANGAJAT si DEPARTAMENT:
select angajat.nume, angajat.nr_dept, departament.descriere
from angajat, departament
where angajat.nr_dept = departament.nr_dept;
Date de iesire:
NUME NR DEPT DESCRIERE
Adams |
23B |
Financiar |
Baker |
Sisteme |
|
Price |
90C |
Productie |
White |
90C |
Productie |
Pentru a returna anumite linii dintr-o reuniune, pur si simplu introduceti în clauza where, pe lânga conditia de reunire, o conditie de cautare:
select angajat.nume "Nume Ang.",
angajat.nr_dept "t Dept.",
departament.descriere "Nume Dept."
From angajat, departament
where angajat.nr_dept = departament.nr_dept
and angajat.nume like 'B%';
Date de iesire:
Nume Ang. # Dept. Nume Dept.
Baker Sisteme
O reuniune externa (outer join) este asemanatoare cu o reuniune simpla. O reuniune externa returneaza toate liniile pe care le returneaza reuniunea simpla, precum si toate liniile ale caror valori din coloanele dupa care se face reuniunea apar într-un tabel si nu se regasesc în coloanele corespunzatoare ale nici unei linii din celalalt tabel.
Sintaxa reuniunii externe este
select coloana(e)
from tabell, tabe!2
where tabell.coloanal = tabe!2.coloana(+)
unde:
(+) este folosit pentru a indica o reuniune externa
coloana (e) reprezinta coloana sau coloanele din care se citesc datele
tabel1 tabel2 reprezinta tabelele din care se citesc datele
tabel1 coloana1 = tabel2 . coloana2 reprezinta conditia care reuneste cele doua tabele
Semnul plus (+) poate fi plasat în oricare parte a conditiei din clauza where, însa nu în ambele parti. Simbolul reuniunii externe trebuie plasat în dreapta numelui tabelului în care nu apar linii care se gasesc în celalalt tabel. Programul Oracle genereaza nuluri pentru coloanele acestui tabel ori de câte ori tabelul nu are nici o linie care sa poata fi reunita cu o linie din celalalt tabel.
Figura 15.2 prezinta cele doua tabele asupra carora am efectuat reuniunea externa. In acest exemplu, au fost afisate toate departamentele, indiferent daca la momentul curent au sau nu angajati.
Figura 15.2. Selectarea datelor din tabele fara o corespondenta directa. |
|
Instructiunea urmatoare creeaza o reuniune externa a tabelelor ANGAJAT si DEPARTAMENT. Remarcati faptul ca simbolul reuniunii externe este plasat în dreptul tabelului ANGAJAT deoarece acestuia îi lipsesc câteva linii care se gasesc în tabelul DEPARTAMENT. Remarcati de asemenea faptul ca sunt afisate toate liniile din tabelul DEPARTAMENT.
Select angajat.nume, angajat.nr_dept, departament.descriere
from angajat, departament
where angajat.nr_dept(+) = departament.nr_dept;
Date de iesire:
NUME |
NR. DEPT |
DESCRIERE |
Adams |
23B |
Financiar |
Baker |
Sisteme |
|
Price |
90C |
Productie |
White |
90C |
Productie |
Distributie |
||
Personal |
||
Marketing |
Sistemul Oracle permite o reuniune a unui singur tabel ca si cum ar fi doua tabele distincte. Acest tip de reuniune este cunoscut sub numele de auto-reuniune (seif join
Figura 15.3 Ilustreaza tabelul ANGAJAT privit sub forma a doua tabele distincte: ANG si DEPT.
Instructiunea urmatoare efectueaza o auto-reuniune asupra tabelului ANGAJAT. Din punct de vedere logic, instructiunea stabileste ca tabelul ANGAJAT este privit ca reprezentând doua tabele, dintre care unul numit ANG si celalalt numit DEPT.
Figura Selectarea datelor din linii diferite ale aceluiasi tabel (auto reuniune |
|
select ang.nume, ang.nr_dept, dept.descriere from angajat ang, angajat dept where ang.nr_dept = dept.nr_dept;
Date de iesire:
NUME |
NR. DEPT |
DESCRIERE |
Adams |
23B |
Financiar |
Baker |
Sisteme |
|
Price |
90C |
Productie |
White |
90C |
Productie |
Puteti folosi o reuniune pentru a simplifica crearea unei vederi. De exemplu, puteti folosi o reuniune pentru a defini o vedere care este o colectie de coloane sau linii (din tabele multiple) aflate în relatie. Vederea ascunde faptul cu aceste informatii provin din tabele multiple.
In serverul Oracle, este recomandabil sa grupati numai acele tabele care sunt reunite frecvent în instructiuni SQL pe baza coloanelor cheie ale grupului. Gruparea determina îmbunatatirea performantelor reuniunilor însa va duce cu siguranta la scaderea performantelor parcurgerii integrale a tabelelor, operatiunilor de inserare în tabele si a instructiunilor update care modifica valori ale cheii grupului înainte de a grupa coloanele reunite, cântariti avantajele si dezavantajele întrucât aceasta reuniune afecteaza performantele serverului.
union este un operator care combina rezultatele a doua interogari într-un singur rezultat. Acest operator returneaza numai valorile distincte rezultate din interogare. Fie urmatoarele doua liste de date:
Nume articol_1 |
Nume articol_2 |
bobina |
bobina |
Condensator |
Motor |
Motor |
Rezervor |
Comutator |
Cablu |
Valva | |
cablu |
Instructiunea urmatoare efectueaza o uniune a celor doua liste:
select nume_articol from nume_articol_1
union
select nume_articol FROM nume_articol_2
Date de iesire:
nume_articol
bobina
condensator
motor
comutator
rezervor
valva
cablu
Dupa cum se poate vedea din exemplul precedent, toate valorile distincte din ambele tabele sunt incluse în rezultatele interogarii.
Atunci când operatorii union si union all sunt folositi în instructiuni care selecteaza date de tip caracter, tipul valorilor returnate este dupa cum urmeaza:
Daca ambele interogari selecteaza valori de tip char, valorile returnate vor fi de tip char.
Daca cel putin una dintre interogari selecteaza valori de tip varchar2, valorile returnate vor fi de tip varchar2.
Operatorul union all combina rezultatele a doua interogari într-un singur rezultat. Acest operator returneaza toate valorile furnizate de interogari. Fie urmatoarele doua liste de date:
Nume articol_1 |
Nume articol_2 |
Bobina |
bobina |
Condensator |
Motor |
Motor |
Rezervor |
Comutator |
Cablu |
Valva | |
cablu |
Instructiunea urmatoare efectueaza o uniune completa (union all) a celor doua liste:
select nume_articol from nume_articol_1
union all
select nume_articol from nume_articol_2
Date de iesire:
nume_articol
bobina
bobina
condensator
motor
motor
comutator
rezervor
valva
cablu
cablu
Dupa cum se poate vedea din exemplul precedent, toate valorile din ambele tabele sunt incluse în rezultatele interogarii, inclusiv liniile de date duplicate.
Puteti folosi clauza order by în instructiunea select a unei interogari union. Pentru a face acest lucru, trebuie sa specificati în instructiunea union numarul coloanei (nu numele acesteia) dupa care doriti sa fie ordonate datele.
Instructiunea urmatoare foloseste clauza order b y pentru a sorta rezultatele în ordinea ascendenta a coloanei nr dept (nr_dept este a treia coloana).
select nume_dept, fabrica_dept, nr_dept from departament
union
select nume_dept, localizare_dept, nr_dept from dept
order by 3;
Date de iesire:
nume dept |
fabrica dept |
nr dept |
Ambalare |
Michigan | |
Livrare |
Michigan | |
Pre-asamblare |
New Mexico | |
Desfacere |
Ohio |
Operatorul intersect combina doua instructiuni select si returneaza numai acele linii care sunt returnate de ambele interogari. Fie urmatoarele doua liste de date:
Nume articol 1 |
Nume articol |
Bobina |
Bobina |
Condensator |
Motor |
Motor |
Rezervor |
Comutator |
Cablu |
Valva | |
Cablu |
Instructiunea urmatoare efectueaza o intersectie a celor doua liste:
select nume_articol from nume_articol_1
intersect
select nume_articol FROM nume_articol_2
Date de iesire:
nume_articol
bobina
motor
cablu
Acest operator returneaza numai acele articole care exista în ambele liste.
Operatorul minus combina rezultatele a doua interogari si returneaza numai acele valori care sunt selectate de prima interogare dar nu si de â doua. Folosind aceleasi liste din exemplul anterior, fie urmatoarea instructiune:
select nume_articol from nume_articol_1
minus
select nume_articol FROM nume_articol_2
Date de iesire:
nume_articol
condensator
comutator
valva
In acest exemplu, instructiunea returneaza numai acele linii care se gasesc în prima lista dar nu si în a doua.
în acest capitol, ati aflat ca reuniunea si uniunea sunt doua metode de grupare logica a datelor din tabele distincte. Odata grupate, puteti sa afisati grupul rezultant sau sa- prelucrati în continuare.
Reuniunea si uniunea se folosesc pentru a grupa date din tabele multiple în vederea afisarii lor pe ecran sau în vederea prelucrarii lor în continuare. Aceste tehnici va permit sa interogati tabele multiple care se afla îhtr-o relatie data de una sau mai multe coloane comune, pentru a crea un singur set de rezultate.
Reuniunea si uniunea folosesc instructiunea select pentru a interoga baze de date multiple. Prin utilizarea diverselor tipuri de reuniuni si uniuni, puteti controla domeniul de valori returnate de instructiunea select.
|