Documente Academic
Documente Profesional
Documente Cultură
n cadrul bazelor de date relaionale, un join combin nregistrrile din dou sau mai multe tabele.
Standardul ANSI SQL specific 5 tipuri de joinuri:
Cross join
Inner join
Left outer join
Right outer join
Full outer join
Name
Ioana
Marius
Anca
Dumitru
Eugen
DepartmentID
10
30
10
20
NULL
Tabela departments
DepatmentID
10
20
30
40
Name
Marketing
Vnzri
Relaii publice
Cercetare
Cross join
Returneaz produsul cartezian al nregistrrilor din tabelele de intrare. n exemplul de mai sus, va combina
fiecare linie din tabela Employees cu fiecare linie din tabela Departments.
Folosind notaia implicit:
SELECT * FROM employees, departments;
Folosind notaia explicit:
SELECT * FROM employees CROSS JOIN departments;
employees.
EmployeeID
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
employees.
Name
Ioana
Marius
Anca
Dumitru
Eugen
Ioana
Marius
Anca
Dumitru
Eugen
Ioana
Marius
Anca
Dumitru
Eugen
Ioana
Marius
Anca
Dumitru
Eugen
employees.
DepartmentID
10
30
10
20
NULL
10
30
10
20
NULL
10
30
10
20
NULL
10
30
10
20
NULL
departments.
DepatmentID
10
10
10
10
10
20
20
20
20
20
30
30
30
30
30
40
40
40
40
40
departments.
Name
Marketing
Marketing
Marketing
Marketing
Marketing
Vnzri
Vnzri
Vnzri
Vnzri
Vnzri
Relaii publice
Relaii publice
Relaii publice
Relaii publice
Relaii publice
Cercetare
Cercetare
Cercetare
Cercetare
Cercetare
Inner join
Combin fiecare linie din tabela Employees cu fiecare linie din tabela Departments n baza unor atribute
care se potrivesc din perspectiva unui predicat de join (join predicate).
Folosind notaia implicit:
SELECT * FROM employees, departments
WHERE employees.DepartmentID = departments.DepartmentID;
Folosind notaia explicit:
SELECT * FROM employees INNER JOIN departments
ON employees.DepartmentID = departments.DepartmentID;
employees.
EmployeeID
1
2
3
4
employees.
Name
Ioana
Marius
Anca
Dumitru
employees.
DepartmentID
10
30
10
20
departments.
DepatmentID
10
30
10
20
departments.
Name
Marketing
Relaii publice
Marketing
Vnzri
Outer join
Un outer join nu necesit ca fiecare nregistrare din cele dou tabele s se potriveasc din perspectiva
predicatului de join. Rezultatul returnat va conine toate nregistrrile, chiar dac nu s-a gsit nici o
nregistrare care s se potriveasc n cealalt tabel.
Fie A i B cele dou tabele folosite la intrarea n outer join.
Outer joinurile se mpart n:
Left outer join ntotdeauna va returna toate nregistrrile din tabela A (left table), chiar dac
pentru o parte dintre acestea nu s-a gsit o potrivire cu nregistrrile din tabela B, caz n care,
partea cu coloanele aferente tabelei B vor conine NULL.
Right outer join ntotdeauna va returna toate nregistrrile din tabela B (right table), chiar dac
pentru o parte dintre acestea nu s-a gsit o potrivire cu nregistrrile din tabela A, caz n care,
partea cu coloanele aferente tabelei A vor conine NULL.
Full outer join combin efectele left outer join i right outer join. ntotdeauna va returna toate
nregistrrile din tabela A (left table) i din tabela B (right table), chiar dac pentru o parte dintre
acestea nu s-a gsit o potrivire cu nregistrrile din tabela B, respectiv tabela A, caz n care, partea
cu coloanele aferente tabelei B, respectiv tabelei A, vor conine NULL.
employees.
EmployeeID
1
2
3
4
5
employees.
Name
Ioana
Marius
Anca
Dumitru
Eugen
employees.
DepartmentID
10
30
10
20
NULL
departments.
DepatmentID
10
30
10
20
NULL
departments.
Name
Marketing
Relaii publice
Marketing
Vnzri
NULL
employees.
EmployeeID
1
2
3
4
NULL
employees.
Name
Ioana
Marius
Anca
Dumitru
NULL
employees.
DepartmentID
10
30
10
20
NULL
departments.
DepatmentID
10
30
10
20
40
departments.
Name
Marketing
Relaii publice
Marketing
Vnzri
Cercetare
employees.
EmployeeID
1
2
3
4
5
NULL
employees.
Name
Ioana
Marius
Anca
Dumitru
Eugen
NULL
employees.
DepartmentID
10
30
10
20
NULL
NULL
departments.
DepatmentID
10
30
10
20
NULL
40
departments.
Name
Marketing
Relaii publice
Marketing
Vnzri
NULL
Cercetare
Self join
Self join este un caz special de join, n care o tabel este combinat cu ea nsi.
Fie urmtoarea tabel:
Tabela employees
EmployeeID
1
2
3
4
5
Name
Ioana
Marius
Anca
Dumitru
Eugen
Age
31
24
31
24
35
ManagerID
2
5
4
5
NULL
De exemplu, putem folosi self join pentru a afia toate perechile angajat manager.
Folosind notaia implicit:
SELECT e.Name, m.Name FROM employees e, employees m
where e.managerID = m.employeeID;
Folosind notaia explicit:
SELECT e.Name, m.Name FROM employees e
INNER JOIN employees m ON e.managerID = m.employeeID;
e.Name
Ioana
Marius
Anca
Dumitru
m.Name
Marius
Eugen
Dumitru
Eugen
Ca un alt exemplu, putem folosi self join pentru a afia toate perechile de angajai care au aceeai vrsta.
Folosind notaia implicit:
SELECT e1.Name, e2.Name, e1.Age FROM employees e1, employees e2
where e1.Age = e2.Age AND e1.employeeID != e2.employeeID;
Folosind notaia explicit:
SELECT e1.Name, e2.Name, e1.Age FROM employees e1
INNER JOIN employees e2 ON e1.Age = e2.Age
AND e1.employeeID != e2.employeeID;
e1.Name
Ioana
Marius
Anca
Dumitru
e2.Name
Anca
Dumitru
Ioana
Marius
e1.age
31
24
31
24
e1.Name
Ioana
Marius
e2.Name
Anca
Dumitru
e1.age
31
24
Fiecare pagin conine o secven (bloc) de nregistrri din cadrul unei tabele. O tabel poate fi vzut ca
o nlnuire de astfel de pagini.
O operaie I/O presupune accesarea unei ntregi pagini.
Pseudocodul algoritmului:
Presupunem c A este tabela cu numrul cel mai mic de nregistrri, iar B tabela cu numrul cel mai mare
de nregistrri.
9
Complexitate: O(NA+NB+k), unde NA i NB reprezint numrul de nregistrri din tabela A, respectiv B, iar k
reprezint numrul de operaii pentru generarea joinurilor dintre tuple.
Complexitate I/O: O(NPA+NPB), unde NPA i NPB reprezint numrul de pagini din tabela A, respectiv B.
Dac hash table-ul generat este prea mare pentru a putea fi inut n memorie, atunci algoritmul poate fi
modificat astfel:
Construirea hash table-ului peste atributul x pentru tabela B. Fiecare intrare din hash table conine
valoarea atributului x.
Scanarea tabelei A i selectarea tuplelor al cror atribut x nu se gsete n hash table-ul construit n
pasul anterior.
Este mult mai eficient dac tabela B conine un numr mai mic de nregistrri dect tabela A.
Complexitate: tem de gndire
Complexitate I/O: tem de gndire
Construirea hash table-ului peste atributul x pentru tabela A. Fiecare intrare din hash table conine
valoarea atributului x i identificatorul (numrul, offset-ul etc) nregistrrii n care se gsete acesta.
Scanarea tabelei B i tergerea tuturor intrrilor din hash table-ul construit n pasul anterior care se
potrivesc cu atributul x.
11
Construirea hash table-ului peste atributul x pentru tabela B. Fiecare intrare din hash table conine
valoarea atributului x.
Scanarea tabelei A i selectarea tuplelor al cror atribut x se gsete n hash table-ul construit n pasul
anterior.
Este mult mai eficient dac tabela B conine un numr mai mic de nregistrri dect tabela A.
Complexitate: tem de gndire
Complexitate I/O: tem de gndire
Construirea hash table-ului peste atributul x pentru tabela A. Fiecare intrare din hash table conine
valoarea atributului x i identificatorul (numrul, offset-ul etc) nregistrrii n care se gsete acesta.
Scanarea tabelei B i selectarea tuturor intrrilor din hash table-ul construit n pasul anterior care se
potrivesc cu atributul x, urmat de tergerea acestora din hash table.
Fiecare nregistrare din A, pentru care exist potrivire, este selectat doar o singur dat deoarece, la
prima potrivire, este scoas din hash table.
Este mult mai eficient dac tabela A conine un numr mai mic de nregistrri dect tabela B.
Complexitate: tem de gndire
Complexitate I/O: tem de gndire
12