MySQL Spoj: Unutarnji, Vanjski, Lijevi, Desni, Križni
⚡ Pametni sažetak
MySQL SPOJEVI kombiniraju retke iz dvije ili više povezanih tablica u jedan skup rezultata. Ovaj resurs objašnjava UNAKRŠNE, UNUTARNJE, LIJEVE, DESNE i VANJSKE SPOJEVE s izvršnim upitima, primjerima podataka i jasnim izlaznim tablicama za praktičan rad s bazom podataka.

Što su JOINS?
Spojevi pomažu u dohvaćanju podataka iz dvije ili više tablica baze podataka.
Tablice su međusobno povezane korištenjem primarnih i stranih ključeva.
Napomena: JOIN je najnerazumljivija tema među onima koji uče SQL. Radi jednostavnosti i lakšeg razumijevanja, koristit ćemo novu bazu podataka za vježbu. Kao što je prikazano u nastavku.
Svaki primjer u nastavku koristi ove dvije tablice. film_id stupac u Članovi ukazuje na id stupac u filmovi — odnos na kojem se podudara svaki JOIN.
Članovi
| id | ime | prezime | film_id |
|---|---|---|---|
| 1 | Adam | Kovač | 1 |
| 2 | Ravi | Kumar | 2 |
| 3 | Susan | Davidson | 5 |
| 4 | dizalica | Adrianna | 8 |
| 5 | Zavjetrina | Pong | 10 |
filmovi
| id | naslov | kategorija |
|---|---|---|
| 1 | ASSASSIN'S CREED: EMBERS | Animacije |
| 2 | Pravi čelik (2012.) | Animacije |
| 3 | Alvin i Chipmunks | Animacije |
| 4 | Avanture Tin Tina | Animacije |
| 5 | Sigurno (2012.) | Akcijski |
| 6 | Sigurna kuća (2012.) | Akcijski |
| 7 | GIA | 18 + |
| 8 | Rok 2009 | 18 + |
| 9 | Prljava slika | 18 + |
| 10 | Marley i ja | Romantika |
Zašto bismo trebali koristiti JOIN-ove?
Prije nego što pogledamo svaku vrstu JOIN-a, vrijedi znati zašto je JOIN poželjniji od pokretanja nekoliko upita.
Sada možete pomisliti, zašto koristimo JOIN-ove kada možemo obaviti isti zadatak pokretanjem upita. Osobito ako imate iskustva u programiranju baza podataka, znate da možemo pokrenuti upite jedan po jedan, koristiti izlaz svakog u uzastopnim upitima. Naravno, to je moguće. Ali korištenjem JOIN-ova posao možete obaviti korištenjem samo jednog upita s bilo kojim parametrima pretraživanja. S druge strane MySQL mogu postići bolje performanse s JOIN-ovima jer može koristiti indeksiranje. Jednostavna upotreba jednog JOIN upita umjesto pokretanja više upita smanjuje opterećenje poslužitelja. Korištenje višestrukih upita umjesto toga dovodi do više prijenosa podataka između MySQL i aplikacije (softver). Nadalje, zahtijeva više manipulacija podacima u aplikaciji.
Jasno je da možemo bolje MySQL i performanse aplikacije korištenjem JOIN-ova.
Vrste JOIN-ova
MySQL podržava nekoliko JOIN tipova, od kojih svaki odgovara na različito pitanje o iste dvije tablice. Tablica u nastavku ih uspoređuje; svaki tip je zatim prikazan upitom i njegovim rezultatom.
| Vrsta PRIDRUŽIVANJA | Vraćeni retci | NULL vrijednosti u rezultatu? | Tipična upotreba |
|---|---|---|---|
| CROSS PRIDRUŽITE se | Svaki redak tablice A uparen je sa svakim retkom tablice B | Ne | Generiranje svih mogućih kombinacija |
| INNER JOIN | Samo retci koji odgovaraju uvjetu u obje tablice | Ne | Članovi koji su zapravo iznajmili film |
| LEFT JOIN | Svi retci iz lijeve tablice, plus podudaranja iz desne | Da, s desne strane | Svi filmovi, čak i oni koji nikada nisu bili iznajmljeni |
| PRAVO SE PRIDRUŽI | Svi retci iz desne tablice, plus podudaranja s lijeve strane | Da, s lijeve strane | Svi filmovi, čak i bez pridruženog člana |
CROSS PRIDRUŽITE se
Cross JOIN je najjednostavniji oblik JOIN-ova koji povezuje svaki red 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 zapise o svim članovima u odnosu na zapise o svim filmovima, možemo upotrijebiti skriptu prikazanu u nastavku da bismo dobili željene rezultate.
SELECT * FROM `movies` CROSS JOIN `members`
Izvršavanje gornje skripte u MySQL radna tezga 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 |
INNER JOIN
CROSS JOIN vraća svako moguće sparivanje, što rijetko želite. INNER JOIN sužava rezultat na parove koji su zapravo povezani.
Unutarnji JOIN koristi se za vraćanje redaka iz obje tablice koji zadovoljavaju zadani uvjet.
Pretpostavimo da želite dobiti popis članova koji su iznajmili filmove zajedno s naslovima filmova koje su iznajmili. Za to možete jednostavno koristiti INNER JOIN, koji vraća retke iz obje tablice koji zadovoljavaju zadane uvjete.
SELECT members.`first_name` , members.`last_name` , movies.`title` FROM members ,movies WHERE movies.`id` = members.`movie_id`
Izvršavanje gornje skripte daje
| 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 kako bi se postigli isti rezultati.
SELECT A.`first_name` , A.`last_name` , B.`title` FROM `members` AS A INNER JOIN `movies` AS B ON B.`id` = A.`movie_id`
Vanjski JOIN-ovi
INNER JOIN tiho briše retke koji nemaju partnera. Kada su ti nepodudarni retci važni, OUTER JOIN je pravi izbor.
MySQL Vanjski JOIN-ovi vraćaju sve zapise koji se podudaraju iz obje tablice.
Može otkriti zapise koji se ne podudaraju u spojenoj tablici. Vraća se NULL vrijednosti za zapise spojene tablice ako nije pronađeno podudaranje.
Zvuči zbunjujuće? Pogledajmo primjer –
LEFT JOIN
Pretpostavimo da sada želite dobiti naslove svih filmova zajedno s imenima članova koji su ih iznajmili. Jasno je da neke filmove nitko ne iznajmljuje. Možemo jednostavno koristiti LEFT JOIN u svrhu.
LEFT JOIN vraća sve retke iz tablice s lijeve strane čak i ako u tablici s desne strane nisu pronađeni odgovarajući redovi. Ako nema podudaranja u tablici s desne strane, vraća se NULL.
SELECT A.`title` , B.`first_name` , B.`last_name` FROM `movies` AS A LEFT JOIN `members` AS B ON B.`movie_id` = A.`id`
Izvršavanje gornje skripte u MySQL workbench daje. U vraćenom rezultatu koji je naveden u nastavku možete vidjeti da za filmove koji nisu iznajmljeni, polja imena članova imaju NULL vrijednosti. To znači da nijedan odgovarajući č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 SE PRIDRUŽI
RIGHT JOIN je očito suprotno od LIJEVOG JOIN-a. RIGHT JOIN vraća sve stupce iz tablice s desne strane čak i ako u tablici s lijeve strane nisu pronađeni odgovarajući redovi. Ako nema podudaranja u tablici s lijeve strane, vraća se NULL.
U našem primjeru, pretpostavimo da trebate dobiti imena članova i filmove koje su oni iznajmili. Sada imamo novog člana koji još nije iznajmio nijedan film
SELECT A.`first_name` , A.`last_name`, B.`title` FROM `members` AS A RIGHT JOIN `movies` AS B ON B.`id` = A.`movie_id`
Izvršavanje gornje skripte u MySQL radni stol 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”.
Svaki upit do sada je pronašao retke s ON klauzulom. MySQL nudi kraću alternativu kada podudarni stupci dijele naziv.
U gornjim primjerima JOIN upita koristili smo klauzulu ON za podudaranje zapisa između tablica.
USING klauzula također se može koristiti za istu svrhu. Razlika sa UPOTREBA Je li mora imati identična imena za podudarne stupce u obje tablice.
U tabeli “filmovi” do sada smo koristili njen primarni ključ s imenom “id”. Isto smo spomenuli u tablici "članovi" pod nazivom "movie_id".
Preimenujmo polje u “id” tablice “filmovi” u ime “movie_id”. Ovo 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 A LEFT JOIN `members` AS B USING ( `movie_id` )
Osim korištenja ON i USING sa JOIN-ovima možete koristiti mnoge druge MySQL klauzule poput GROUP BY, GDJE pa čak i funkcije poput IZNOS, AVG, Itd




