Programiranje

Uvod u SQL pridruživanje – JOIN

SQL komande za baze podataka

Nastavljamo serijal o SQL komandama i bazama podataka.
Tradicionalno, podatke izvlačite iz dve ili više tabela koristeći klauzulu WHERE u upitu.
Ali u sistemu relacionih baza podataka (RDBMS), ovo se može postići korišćenjem jednog SELECT upita. Ovde možemo videti u stvari pravu moć sistema relacionih baza podataka. U ovom vodiču ćemo naučiti o SQL pridruživanje (JOIN), odličnom načinu za upoređivanje i odabir redova i tabela.

Šta je SQL pridruživanje – JOIN?

U SQL-u, spojna klauzula proširuje mogućnost poređenja i izbora redova iz tabela. Koristi algebarski proces kombinovanja redova iz dve ili više tabela na osnovu srodne kolone u tim tabelama. Prema standardnoj SQL definiciji koju je dao ANSI (Američki nacionalni institut za standarde), postoji pet tipova spajanja:
Cross Joins – unakrsni spojevi,
Inner Joins – unutrašnji spojevi,
Left (Outer) Joins – levi (spoljni) spojevi,
Right(Outer) Joins – desni (spoljni) spojevi i
Full (Outer) Joins – puni (spoljni) spojevi.
Ovi spojevi se primenjuju u svim sistemima relacionih baza podataka i pokriveni su u odeljcima ispod.
Mi ćemo korisiti ove termine u daljem tekstu u tabelama, radi boljega razumevanja i budućeg rada sa bazama kao što su  MySQL ili PostgreSQL.

[mks_pullquote align=”center” width=”630″ size=”16″ bg_color=”#D3EFD2″ txt_color=”#000000″]
Napomena:
Pridruživanja se mogu izvršiti na bilo kom broju tabela u datom upitu.
Radi jasnoće, ovaj vodič govori o spojevima primenjenim na dve tabele.
[/mks_pullquote]

Ovde ćemo koristiti koristi dve tabele, Employees i Address, da demonstrira SQL pridruživanje.
Svaka od ovih tabela sadrži sledeće definicije kolona i podatke:

[mks_pullquote align=”center” width=”630″ size=”16″ bg_color=”#D3EFD2″ txt_color=”#000000″]
Osim ako nije drugačije navedeno, sve komande u ovom vodiču dobro funkcionišu i na MySQL i na PostgreSQL bazama podataka.
[/mks_pullquote]

SQL Cross pridruživanje

Takođe poznato kao Dekartovo pridruživanje. Unakrsni spojevi se javljaju kada navedete više tabela kao izvor za listu kolona SELECT. U ovom slučaju, izostavljate izraz za spajanje klauzule WHERE da biste uparili redove. Skup rezultata sadrži red za svaku kombinaciju redova između tabela. U scenariju sa dve tabele, svaki red u jednoj tabeli je uparen sa svakim redom druge tabele. Dobijeni proizvod je poznat kao Dekartov proizvod dve tabele. Sintaksa za unakrsno spajanje je sledeća:

(# Rows in Table A) PUTA (# of Rows in Table B)

[mks_pullquote align=”center” width=”630″ size=”16″ bg_color=”#D3EFD2″ txt_color=”#000000″]
U teoriji skupova, Dekartov proizvod je operacija množenja koja generiše sve uređene parove datih skupova. Na primer, razmotrite skup A sa elementima {a,b} i skup B sa elementima {1,2,3}. Dekartov proizvod A i B je označen sa AxB i rezultat je sledeći:

AxB ={(a,1), (a,2), (a,3), (b,1), (b,2), (b,3)}
[/mks_pullquote]

SQL sintaksa za Cross Join je sledeća:

SELECT ColumnName_1,
       ColumnName_2,
       ColumnName_N
FROM [Table_1]
     CROSS JOIN [Table_2]

Iz gornje sintakse, Column_1, Column_2, Column_N predstavljaju kolone u tabeli, a klauzula CROSS JOIN služi za kombinovanje dve tabele, Table_1 i Table_2. Iz gornjih tabela primera, ako treba da izvršite unakrsno SQL pridruživanje na tabelama Employees i Address, koristite sledeći SQL kod:

SELECT EmployeeName, State
FROM Employees
CROSS JOIN Address

Izlaz gornjeg SQL koda je sledeći:

+--------------+--------------+
| EmployeeName | State        |
+---------------+-------------+
| John         |   New York   |
| John         |   New Jersey |
| John         |   Idaho      |
| John         |   Hawaii     |
| John         |   New York   |
| Mary         |   New York   |
| Mary         |   New Jersey |
| Mary         |   Idaho      |
| Mary         |   Hawaii     |
| Robert       |   New York   |
| Robert       |   New Jersey |
| Robert       |   Idaho      |
| Robert       |   Hawaii     |
+------------+----------------+

SQL Inner pridruživanje

Unutrašnje spajanje vraća redove koji imaju odgovarajuće vrednosti u obe tabele. Ako nema odgovarajućih zapisa, onda se u rezultatima ne vraćaju nijedan red.

SQL sintaksa za Inner pridruživanje je sledeća:

SELECT ColumnName_1,
       ColumnName_2,
       ColumnName_N
FROM Table_1
INNER JOIN Table_2
ON Table_1.key = Table_2.key;

U gornjem primeru, ključ je odgovarajući ključ tabela. Ako treba da izvršite unutrašnje spajanje na tabelama Employees i Address, koristite sledeći SQL kod:

SELECT EmployeeName, State
FROM Employees
INNER JOIN Address
ON Employees.EmployeeId = Address.Id

Izlaz gornjeg SQL koda je sledeći:

+--------------+--------------+
| EmployeeName | State        |
+---------------+-------------+
| John         |   New York   |
| Mary         |   New Jersey |
+------------+----------------+

SQL Left (Outer) pridruživanje

Levo spajanje vraća kompletan skup redova iz leve tabele zajedno sa odgovarajućim redovima iz desne tabele. Ako nema odgovarajućih zapisa, onda se NULL vrednosti vraćaju iz desne tabele.

[mks_pullquote align=”center” width=”630″ size=”16″ bg_color=”#D3EFD2″ txt_color=”#000000″]
Neke implementacije relacionih baza podataka koriste ključne reči „Left Outer Join“, za razliku od „Left Join“, ali su one funkcionalno ekvivalentne.
[/mks_pullquote]

SQL sintaksa za Left Join je sledeća:

SELECT * FROM Table_1
LEFT JOIN Table_2
ON Table_1.key = Table_2.key

U gornjem primeru, ključ je odgovarajući ključ tabela. Ako treba da izvršite levo spajanje na tabelama Employees i Address, koristite sledeći SQL kod:

SELECT EmployeeName, State
FROM Employees
LEFT JOIN Address
ON Employees.EmployeeId = Address.Id

Izlaz gornjeg SQL koda je sledeći:

+--------------+--------------+
| EmployeeName | State        |
+---------------+-------------+
| John         |   New York   |
| Mary         |   New Jersey |
| Robert       |   NULL       |
+------------+----------------+

SQL Right (Outer) pridruživanje

Desno spajanje vraća kompletan skup redova iz desne tabele i odgovarajućih redova iz leve tabele. Ovo je takođe poznato kao desni spoljni spoj. Ako nema odgovarajućih zapisa, onda se NULL vrednosti vraćaju iz desne tabele, za zahvaćene redove u levoj.

[mks_pullquote align=”center” width=”630″ size=”16″ bg_color=”#D3EFD2″ txt_color=”#000000″]
Neke implementacije relacionih baza podataka koriste ključne reči “Right Outer Join“, za razliku od “Right Join“, ali su one funkcionalno ekvivalentne.
[/mks_pullquote]

SQL sintaksa za Right Join je sledeća:

SELECT * FROM Table_1
RIGHT JOIN Table_2
ON Table_1.key = Table_2.key

Iz gornjeg koda, ključ je odgovarajući ključ tabela. Ako treba da izvršite ispravno spajanje na tabelama Employees i Address, koristite sledeći SQL kod:

SELECT EmployeeName, State
FROM Employees
RIGHT JOIN Address
ON Employees.EmployeeId = Address.Id

Izlaz gornjeg SQL koda je sledeći:

+--------------+--------------+
| EmployeeName | State        |
+---------------+-------------+
| John         |   New York   |
| Mary         |   New Jersey |
| NULL         |   Idaho      |
| NULL         |   Hawaii     |
+------------+----------------+

SQL Full (Outer) pridruživanje

Puno spajanje vraća sve redove iz leve tabele, sve redove iz desne tabele. Ovo je takođe poznato i kao potpuno spoljno spajanje. Potpuno spajanje takođe vraća sve podudarne zapise iz obe tabele gde su dostupne. Ako nema odgovarajućih zapisa, onda se NULL vrednosti vraćaju iz leve tabele. Takođe vraća NULL vrednosti iz desne tabele.

[mks_pullquote align=”center” width=”630″ size=”16″ bg_color=”#D3EFD2″ txt_color=”#000000″]
Neke implementacije relacionih baza podataka koriste ključne reči “Full Outer Join“, za razliku od “Full Join“, ali su one funkcionalno ekvivalentne.
[/mks_pullquote]

SQL sintaksa za Full Join je sledeća:

SELECT * FROM Table1
FULL JOIN Table2
ON Table1.key = Table2.key

U gornjem kodu, ključ je odgovarajući ključ tabela. Ako treba da izvršite potpuno pridruživanje na tabelama Employees i Address, koristite sledeći SQL kod:

SELECT EmployeeName, State
FROM Employees
FULL JOIN Address
ON Employees.EmployeeId = Address.Id

Izlaz gornjeg SQL koda je sledeći:

+--------------+--------------+
| EmployeeName | State        |
+---------------+-------------+
| John         |   New York   |
| Mary         |   New Jersey |
| Robert       |   NULL       |
| NULL         |   Idaho      |
| NULL         |   Hawaii     |
+------------+----------------+

[mks_pullquote align=”center” width=”630″ size=”16″ bg_color=”#D3EFD2″ txt_color=”#000000″]
Tokom izračunavanja pridruživanja, ako uporedite podatke tabele sa NULL vrednostima, oni se ne poklapaju jedni sa drugima.
Dakle, NULL vrednosti se vraćaju samo kao deo rezultata pridruživanja i zanemaruju se tokom izračunavanja pridruživanja.
[/mks_pullquote]

Poređenje performansi SQL pridruživanja

Uzimajući u obzir gornje primere tabela, Inner Join je obično najbrža od pet Join klauzula u smislu performansi baze podataka. Left Join i Right Join su sledeći najbrži u zavisnosti od veličine dve tabele. Full Join je obično sporije od Left Join ili Right Join.
Cross Join, koji se oslanja na Dekartov proizvod dve tabele, obično je najsporiji u smislu performansi baze podataka. Navedena hijerarhija performansi može da se razlikuje u zavisnosti od dužine kolone tabele, tipa podataka kolone i definicija ključa.

Zaključak

Upotreba SQL pridruživanja (Joins-a) proširuje funkcionalnost mogućnosti upoređivanja redova tabele, u odnosu na tradicionalne upite klauzule WHERE. Spojevi su vredan mehanizam za primenu algebarske logike na dve ili više tabela.

Napišite komentar