Što su PRIDRUŽIVANJA?
Spajanje pomaže u dohvaćanju podataka iz dvije ili više tablica baze podataka. Tablice su međusobno povezane pomoću primarnih i stranih ključeva.Napomena: JOIN je najviše neshvaćena tema među SQL-ovima. Radi jednostavnosti i lakoće razumijevanja, koristit ćemo novu bazu podataka za vježbanje uzorka. Kako je prikazano dolje
iskaznica | ime | prezime | film_id |
---|---|---|---|
1 | Adam | Smith | 1 |
2 | Ravi | Kumar | 2 |
3 | Susan | Davidson | 5 |
4 | Jenny | Adrianna | 8 |
6 | Lee | Pong | 10 |
iskaznica | titula | kategorija |
---|---|---|
1 | UBOJNI KRED: UŽARI | Animacije |
2 | Pravi čelik (2012) | Animacije |
3 | Alvin i vjeverice | Animacije |
4 | Avanture Tin Tin | Animacije |
5 | Sigurno (2012) | Akcijski |
6 | Sigurna kuća (2012) | Akcijski |
7 | GIA | 18+ |
8 | Rok za prijavu 2009 | 18+ |
9 | Prljava slika | 18+ |
10 | Marley i ja | Romantika |
Vrste pridruživanja
Cross PRIDRUŽITE SE
Cross JOIN je najjednostavniji oblik JOIN-a koji podudara svaki redak iz jedne tablice baze podataka sa svim redovima druge.
Drugim riječima, daje nam kombinacije svakog retka prve tablice sa svim zapisima u drugoj tablici.
Pretpostavimo da želimo dobiti sve zapise članova u odnosu na sve filmske zapise, možemo koristiti skriptu prikazanu u nastavku da bismo dobili željene rezultate.
SELECT * FROM `movies` CROSS JOIN `members`
Izvršenje gornje skripte u MySQL workbenchu daje nam sljedeće rezultate.
id | title | id | first_name | last_name | movie_id | |
---|---|---|---|---|---|---|
1 | ASSASSIN'S CREED: EMBERS | Animations | 1 | Adam | Smith | 1 |
1 | ASSASSIN'S CREED: EMBERS | Animations | 2 | Ravi | Kumar | 2 |
1 | ASSASSIN'S CREED: EMBERS | Animations | 3 | Susan | Davidson | 5 |
1 | ASSASSIN'S CREED: EMBERS | Animations | 4 | Jenny | Adrianna | 8 |
1 | ASSASSIN'S CREED: EMBERS | Animations | 6 | Lee | Pong | 10 |
2 | Real Steel(2012) | Animations | 1 | Adam | Smith | 1 |
2 | Real Steel(2012) | Animations | 2 | Ravi | Kumar | 2 |
2 | Real Steel(2012) | Animations | 3 | Susan | Davidson | 5 |
2 | Real Steel(2012) | Animations | 4 | Jenny | Adrianna | 8 |
2 | Real Steel(2012) | Animations | 6 | Lee | Pong | 10 |
3 | Alvin and the Chipmunks | Animations | 1 | Adam | Smith | 1 |
3 | Alvin and the Chipmunks | Animations | 2 | Ravi | Kumar | 2 |
3 | Alvin and the Chipmunks | Animations | 3 | Susan | Davidson | 5 |
3 | Alvin and the Chipmunks | Animations | 4 | Jenny | Adrianna | 8 |
3 | Alvin and the Chipmunks | Animations | 6 | Lee | Pong | 10 |
4 | The Adventures of Tin Tin | Animations | 1 | Adam | Smith | 1 |
4 | The Adventures of Tin Tin | Animations | 2 | Ravi | Kumar | 2 |
4 | The Adventures of Tin Tin | Animations | 3 | Susan | Davidson | 5 |
4 | The Adventures of Tin Tin | Animations | 4 | Jenny | Adrianna | 8 |
4 | The Adventures of Tin Tin | Animations | 6 | Lee | Pong | 10 |
5 | Safe (2012) | Action | 1 | Adam | Smith | 1 |
5 | Safe (2012) | Action | 2 | Ravi | Kumar | 2 |
5 | Safe (2012) | Action | 3 | Susan | Davidson | 5 |
5 | Safe (2012) | Action | 4 | Jenny | Adrianna | 8 |
5 | Safe (2012) | Action | 6 | Lee | Pong | 10 |
6 | Safe House(2012) | Action | 1 | Adam | Smith | 1 |
6 | Safe House(2012) | Action | 2 | Ravi | Kumar | 2 |
6 | Safe House(2012) | Action | 3 | Susan | Davidson | 5 |
6 | Safe House(2012) | Action | 4 | Jenny | Adrianna | 8 |
6 | Safe House(2012) | Action | 6 | Lee | Pong | 10 |
7 | GIA | 18+ | 1 | Adam | Smith | 1 |
7 | GIA | 18+ | 2 | Ravi | Kumar | 2 |
7 | GIA | 18+ | 3 | Susan | Davidson | 5 |
7 | GIA | 18+ | 4 | Jenny | Adrianna | 8 |
7 | GIA | 18+ | 6 | Lee | Pong | 10 |
8 | Deadline(2009) | 18+ | 1 | Adam | Smith | 1 |
8 | Deadline(2009) | 18+ | 2 | Ravi | Kumar | 2 |
8 | Deadline(2009) | 18+ | 3 | Susan | Davidson | 5 |
8 | Deadline(2009) | 18+ | 4 | Jenny | Adrianna | 8 |
8 | Deadline(2009) | 18+ | 6 | Lee | Pong | 10 |
9 | The Dirty Picture | 18+ | 1 | Adam | Smith | 1 |
9 | The Dirty Picture | 18+ | 2 | Ravi | Kumar | 2 |
9 | The Dirty Picture | 18+ | 3 | Susan | Davidson | 5 |
9 | The Dirty Picture | 18+ | 4 | Jenny | Adrianna | 8 |
9 | The Dirty Picture | 18+ | 6 | Lee | Pong | 10 |
10 | Marley and me | Romance | 1 | Adam | Smith | 1 |
10 | Marley and me | Romance | 2 | Ravi | Kumar | 2 |
10 | Marley and me | Romance | 3 | Susan | Davidson | 5 |
10 | Marley and me | Romance | 4 | Jenny | Adrianna | 8 |
10 | Marley and me | Romance | 6 | Lee | Pong | 10 |
UNUTARNJE PRIDRUŽIVANJE
Unutarnji JOIN koristi se za vraćanje redaka iz obje tablice koji zadovoljavaju zadani uvjet.
Pretpostavimo da želite dobiti popis članova koji su unajmili filmove zajedno s naslovima filmova koje su oni unajmili. Za to jednostavno možete upotrijebiti INNER JOIN, koji vraća retke iz obje tablice koji zadovoljavaju zadane uvjete.
SELECT members.`first_name` , members.`last_name` , movies.`title`FROM members ,moviesWHERE movies.`id` = members.`movie_id`
Izvršavanje gornje skripte give
first_name | last_name | title |
---|---|---|
Adam | Smith | ASSASSIN'S CREED: EMBERS |
Ravi | Kumar | Real Steel(2012) |
Susan | Davidson | Safe (2012) |
Jenny | Adrianna | Deadline(2009) |
Lee | Pong | Marley and me |
Imajte na umu da se gornja skripta rezultata također može napisati kako slijedi da bi se postigli isti rezultati.
SELECT A.`first_name` , A.`last_name` , B.`title`FROM `members`AS AINNER JOIN `movies` AS BON B.`id` = A.`movie_id`
Vanjski PRIDRUŽUJE
MySQL Outer JOINs vraćaju sve zapise koji se podudaraju iz obje tablice.
Može otkriti zapise koji se ne podudaraju u spojenoj tablici. Vraća NULL vrijednosti za zapise spojene tablice ako nije pronađeno podudaranje.
Zvuči zbunjujuće? Pogledajmo primjer -
LIJEVA PRIDRUŽITE
Pretpostavimo da sada želite dobiti naslove svih filmova zajedno s imenima članova koji su ih unajmili. Jasno je da neke filmove nitko nije unajmio. U tu svrhu jednostavno možemo koristiti LIJEVO PRIDRUŽI .
LEFT JOIN vraća sve retke iz tablice s lijeve strane, čak i ako u tablici s desne strane nisu pronađeni odgovarajući retci. Ako u tablici s desne strane nisu pronađena podudaranja, vraća se NULL.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BON B.`movie_id` = A.`id`
Izvršenje gornje skripte u MySQL workbenchu daje. Možete vidjeti da u vraćenom rezultatu koji je naveden u nastavku, da za filmove koji se ne iznajmljuju, polja imena članova imaju NULL vrijednosti. To znači da nijedan podudarni član nije pronašao tablicu članova za taj određeni film.
title | first_name | last_name |
---|---|---|
ASSASSIN'S CREED: EMBERS | Adam | Smith |
Real Steel(2012) | Ravi | Kumar |
Safe (2012) | Susan | Davidson |
Deadline(2009) | Jenny | Adrianna |
Marley and me | Lee | Pong |
Alvin and the Chipmunks | NULL | NULL |
The Adventures of Tin Tin | NULL | NULL |
Safe House(2012) | NULL | NULL |
GIA | NULL | NULL |
The Dirty Picture | NULL | NULL |
PRAVO PRIDRUŽITE
PRAVO PRIDRUŽIVANJE očito je suprotnost LIJEVOM PRIDRUŽIVANJU. DESNO PRIDRUŽIVANJE vraća sve stupce iz tablice s desne strane, čak i ako u tablici s lijeve strane nisu pronađeni odgovarajući retci. Ako u tablici s lijeve strane nisu pronađena podudaranja, vraća se NULL.
U našem primjeru pretpostavimo da trebate dobiti imena članova i filmove koje su unajmili. Sad imamo novog člana koji još nije unajmio nijedan film
SELECT A.`first_name` , A.`last_name`, B.`title`FROM `members` AS ARIGHT JOIN `movies` AS BON B.`id` = A.`movie_id`
Izvršavanje gornje skripte u MySQL workbenchu daje sljedeće rezultate.
first_name | last_name | title |
---|---|---|
Adam | Smith | ASSASSIN'S CREED: EMBERS |
Ravi | Kumar | Real Steel(2012) |
Susan | Davidson | Safe (2012) |
Jenny | Adrianna | Deadline(2009) |
Lee | Pong | Marley and me |
NULL | NULL | Alvin and the Chipmunks |
NULL | NULL | The Adventures of Tin Tin |
NULL | NULL | Safe House(2012) |
NULL | NULL | GIA |
NULL | NULL | The Dirty Picture |
Klauzule "ON" i "USING"
U gornjim primjerima upita JOIN koristili smo klauzulu ON za podudaranje zapisa između tablice.
Klauzula USING također se može koristiti u istu svrhu. Razlika s UPORABOM je u tome što u obje tablice moraju biti identični nazivi za podudarne stupce.
Do sada smo u tablici "filmovi" koristili njen primarni ključ s imenom "id". To smo spomenuli u tablici "members" s imenom "movie_id".
Preimenujmo polje "tablice" filmova u "id" da bismo dobili naziv "movie_id". To radimo kako bismo imali identična podudarna imena polja.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
Zatim upotrijebimo USING s gornjim primjerom LEFT JOIN.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BUSING ( `movie_id` )
Osim korištenja ON i USING s JOINs , možete koristiti i mnoge druge MySQL klauzule poput GROUP BY, WHERE, pa čak i funkcije poput SUM , AVG itd.
Zašto bismo trebali koristiti spajanja?
Sad možete pomisliti, zašto koristimo JOIN-ove kad možemo obaviti isti zadatak izvodeći upite. Pogotovo ako imate neko iskustvo u programiranju baza podataka, znate da možemo pokretati upite jedan po jedan, koristite izlaz svakog u uzastopnim upitima. Naravno, to je moguće. Ali pomoću JOIN-ova posao možete obaviti korištenjem samo jednog upita s bilo kojim parametrima pretraživanja. S druge strane, MySQL može postići bolje performanse s JOIN-ovima jer može koristiti indeksiranje. Jednostavna upotreba jednog JOIN upita umjesto izvođenja više upita smanjuje režijske troškove poslužitelja. Umjesto toga koristi više upita, što dovodi do više prijenosa podataka između MySQL-a i aplikacija (softvera). Dalje je potrebno više manipulacija podacima i na kraju aplikacije.
Jasno je da pomoću JOIN-ova možemo postići bolje performanse MySQL-a i aplikacija.
Sažetak
- JOINS omogućuju nam kombiniranje podataka iz više tablica u jedan skup rezultata.
- JOINS imaju bolju izvedbu u odnosu na podupitaje
- INNER JOINS vraćaju samo retke koji zadovoljavaju zadane kriterije.
- VANJSKI PRIDRUŽIVANJA također mogu vratiti retke u kojima nije pronađeno podudaranje. Neusporedivi se retci vraćaju s ključnom riječi NULL.
- Glavne vrste JOIN-a uključuju Inner, Left Outer, Right Outer, Cross JOINS itd.
- Klauzula koja se često koristi u JOIN operacijama je "ON". Klauzula "USING" zahtijeva da podudarni stupci budu istog imena.
- JOINS se mogu koristiti i u drugim klauzulama poput GROUP BY, WHERE, SUB QUERIES, AGREGATE FUNCTIONS itd.