curs 5

10
Capitolul V – Join-uri 5.1 Conceptul de join Eficienţa sistemelor de baze de date relaţionale constă în capacitatea lor de a împărtăşi datele în mai multe tabele şi de a genera vederi dinamice asupra acestora prin conectarea tabelelor în diverse moduri. Acest capitol arată cum MySQL poate fi folosit pentru interogarea simultană a mai multor tabele şi combinarea datelor preluate din acestea. Până acum am folosit instrucţiunea SELECT pentru a extrage date dintr-o singură tabelă. În realitatea, interogările sunt mult mai sofisticate, necesitând combinarea înregistrărilor din tabele diferite pentru a produce rezultatul dorit. Un join reprezintă o interogare SQL în care sunt manipulate date din mai multe tabele. Cel mai des întâlnit exemplu este cel al interogării de tip SELECT care reuneşte coloanele mai multor tabele. Vom folosi tabelele studenţi şi prezenţe, cu următoarea structură şi următoarele înregistrări:

description

curs 5 bd

Transcript of curs 5

Capitolul V Join-uri5.1 Conceptul de joinEficiena sistemelor de baze de date relaionale const n capacitatea lor de a mprti datele n mai multe tabele i de a genera vederi dinamice asupra acestora prin conectarea tabelelor n diverse moduri. Acest capitol arat cum MySQL poate fi folosit pentru interogarea simultan a mai multor tabele i combinarea datelor preluate din acestea. Pn acum am folosit instruciunea SELECT pentru a extrage date dintr-o singur tabel. n realitatea, interogrile sunt mult mai sofisticate, necesitnd combinarea nregistrrilor din tabele diferite pentru a produce rezultatul dorit. Un join reprezint o interogare SQL n care sunt manipulate date din mai multe tabele. Cel mai des ntlnit exemplu este cel al interogrii de tip SELECT care reunete coloanele mai multor tabele. Vom folosi tabelele studeni i prezene, cu urmtoarea structur i urmtoarele nregistrri:

Un exemplu de join fr clauza WHERE:

Interogarea de mai sus a returnat produsul cartezian ntre cele dou tabele, adic fiecare nregistrare din tabela studeni a fost afiat alturi de fiecare nregistrare din tabela prezene, rezultnd de fiecare dat o nregistrare care conine coloanele ambelor tabele. Numrul de nregistrri rezultat va fi egal cu produsul numrului de nregistrri al ambelor tabele.Pentru a preciza felul n care se realizeaz corespondena ntre nregistrri, dac ntre tabele exist o relaie, se folosete clauza WHERE, stabilindu-se o relaie ntre cheia primar din prima tabel i corenpondenta ei cheia extern din a doua tabel.

Am precizat n acest fel c unei nregistrri din tabela studeni cu un anumit id i corespunde doar nregistrrile care au aceeai valoare pe coloana student din tabela prezene. Clauza WHERE scris astfel elimin toate perechile n care coloana comun este NULL. n cazul utilizrii join-urilor se recomand prefixarea fiecrui nume de cmp cu numele tabelei creia i aparine. Aceasta reduce ambiguitatea atunci cnd se lucreaz cu tabele care au cmpuri cu denumiri identice. La fel ca la oricare interogare de tip SELECT, rezultatul obinut printr-un join poate conine doar coloanele necesare i se pot aduga condiii suplimentare pentru filtrarea rezultatelor returnate.Exemplu:

Folosind funcia COUNT() putem calcula numrul studenilor cu numele Ionescu care au nregistrri n tabela prezene. Pentru rapiditate, se pot folosi alias-uri pentru tabelele implicate n join.Exemplu:

5.2 Tipuri de join cross joins = implic produsul cartezian al tabelelor, care afieaz o tabel cu toate permutrile posibile inner joins = ntorc toate nregistrrile care au coresponden n toate tabelele outer joins = ntorc toate nregistrrile corespunztoare unei laturi ale legturii i completeaz spaiile libere cu NULL self-joins = implic dublarea unei tabele prin utilizarea alias-urilor, urmat de legarea copiilor cu alte tipuri de legturi unions = implic adugarea tuturor nregistrrilor din tabelele implicate pentru a ntoarce drept rezultat suma compozit a acestora.5.2.1 Cross joinsCel mai simplu tip de join este cross join-ul, care multiplic tabelele implicate pentru a crea un rezultat ce include toate combinaiile ale acestora. (a se vedea primul exemplu, cu instruciunea SELECT fr clauza WHERE). Datorit dimensiunilor foarte mari a setului de rezultate afiat, aceste legturi diminueaz performana serverului i sunt folosite rar. Din fericire, ele sunt necesare rareori, i este recomandat s se adauge o clauz WHERE care s filteaze rezultatele pentru a limita dimensiunea setului rezultat de nregistrri.5.2.2 Inner joinsInner joins sunt cele mai folosite tipuri de legturi i cele mai simetrice. Ele necesit o relaie ntre tabelele implicate i face ca nregistrrile care nu au corespond s fie eliminate din setul final de rezultate. Cel mai folosit tip de inner join este jonciunea de egalitate equi join, pentru care cmpurile din tabelele legate sunt comparate folosind operatorul de egalitate (=). Rezultatul final va include doar acele nregistrri care a coresponden n cmpurile specificate. Exemplu: s se afieze numele studenilor, data la care a avut loc ora respectiv i dac au fost prezeni sau nu.

Dei mai puin frecvente, legturile de tip inner joins bazate pe inegaliti sunt de asemenea posibile (ele nu intr n categoria equi-joins).Exemplu:

Precizarea legturilor se poate face i prin intermediul cuvintelor-cheie INNER JOIN i CROSS JOIN, n locul virgulei ce desparte numele tabelelor implicate n legtur.Exemplu:

5.2.3 Outer joinsAm vzut c legturile de tip inner join sunt simetrice, adic pot fi incluse n setul final de rezultate numai nregistrrile care au corespondent n tabelele legate (cheia extern din a doua tabel s nu fie NULL). nregistrrile care nu am corespondent (cheia extern corepunztoare este NULL) sunt automat omise din setul de rezultate. Pe de alt parte, legturile de tip outer join sunt asimetrice, adic toate nregistrrile din tabela care reprezint o parte a nregistrrii sunt incluse n setul final de rezultate, indiferent dac ele au sau nu corespondent n tabela ce reprezint cea de-a doua parte a legturii. n funcie de partea legturii pentru care se dorete pstrarea nregistrrilor, se definete left outer join sau right outer join. Pentru left outer join, toate nregistrrile tabelei din partea stng a legturii i care corespund clauzei WHERE vor aprea n setul final de rezultate. Analog, pentru right outer join. Pentru ilustra acest tip de legtura, s-a adugat n tabela prezene o nregistrare care are valoarea NULL pentru coloana cheie-extern student. (nainte s-a modificat coloana student pentru a putea accepta valori null).Exemplu: s se afieze toi studenii i pentru fiecare dintre ei data la care a fost prezent la o ora sau valoarea null dac nu au o prezen corespunztoare.

Exemplu: s se afieze toate prezenele nregistrate i numele studenilor corespunztori sau null dac nu este niciun student nregistrat pentru prezena respectiv.

Se observ c left outer join-ul afieaz 3 studeni suplimentari, pentru care nu exist prezene nregistrate, iar right outer join-ul afieaz 1 prezen suplimentar, care nu are un id de student nregistrat.Termenii left i right sunt interschimbabili. O legtur left se poate transforma ntr-una right i invers prin simpla inversare a ordinii denumirii tabelelor n clauza FROM.5.2.4 Self joinsLegturile de tip self join implic legarea unei tabele cu ea nsi i este utilizat atunci cnd se lucreaz cu seturi de rezultate pentru care valorile cmpurilor conin legturi interne. Pentru a realiza o legtur self join, se aloc tabelului n cauz dou alias-uri diferite i apoi se construiete o legtur prin clauza WHERE.5.2.5 Uniunin plus fa de legturi, exist i operatorul UNION, utilizat pentru a combina rezultatul mai multor interogri SELECT ntr-un singur set de rezultate. Cel mai adesea acest operator este folosit pentru a nsuma rezultatele produse de diferite interogri cu scopul de a crea o tabel unic coninnd toate rezultatele. Putei combina oricte interogri SELECT cu operatorul UNION, ct timp se respect urmtoarele dou conditii: numrul de cmpuri returnate de fiecare interogare SELECT trebuie s fie acelai; tipul datelor corespunztoare fiecrui cmp trebuie s fie acelai. Exemplu: