MySQL SPOJI Vodič: UNUTARNJI, VANJSKI, LIJEVI, DESNI, KRIŽNI
Š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 tema koja se najčešće neshvaća među onima koji se bave SQL-om. Radi jednostavnosti i lakšeg razumijevanja koristit ćemo novu bazu podataka za uvježbavanje uzorka. Kako je prikazano dolje
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 |
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 |
Vrste spojeva
Križ PRIDRUŽI
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
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 oni 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
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. Možete vidjeti da u vraćenom rezultatu koji je naveden ispod 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”.
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 GRUPIRAJ PO, GDJE pa čak i funkcije poput IZNOS, AVG, Itd
Zašto bismo trebali koristiti spojeve?
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.
rezime
- JOINS nam omogućuju kombiniranje podataka iz više od jedne tablice u jedan skup rezultata.
- JOINS imaju bolju izvedbu u usporedbi s podupitima
- INNER JOINS vraćaju samo retke koji zadovoljavaju zadane kriterije.
- OUTER JOINS također može vratiti retke u kojima nisu pronađena podudaranja. Nepodudarni redovi vraćaju se s ključnom riječi NULL.
- Glavne vrste JOIN-a uključuju unutarnje, lijeve vanjske, desne vanjske, križne JOIN-ove itd.
- Često korištena klauzula u JOIN operacijama je "ON". Klauzula “USING” zahtijeva da odgovarajući stupci imaju isti naziv.
- JOINS se također mogu koristiti u drugim klauzulama kao što su GROUP BY, WHERE, SUB QUERIES, AGREGATE FUNCTIONS itd.