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.

  • 🔗 Osnovni princip: JOIN uspoređuje retke u tablicama koristeći odnose primarnog i vanjskog ključa.
  • Zašto je važno: Jedan JOIN upit koristi indeksiranje i smanjuje broj povratnih putovanja poslužitelja u usporedbi s nekoliko odvojenih upita.
  • ✖️ Ponašanje unakrsnog spajanja: Svaki redak prve tablice uparuje se sa svakim retkom druge, stvarajući Kartezijev produkt.
  • 🎯 Unutarnje JOIN ponašanje: Vraćaju se samo retci koji zadovoljavaju uvjet podudaranja u obje tablice.
  • ↔️ Ponašanje vanjskog JOIN-a: LEFT i RIGHT JOIN također vraćaju neusklađene retke i popunjavaju nedostajuće stupce s NULL.
  • 🧩 UKLJUČENO u odnosu na KORIŠTENJE: USING zahtijeva identične nazive stupaca, dok ON podržava bilo koji odgovarajući izraz.

MySQL pridružuje

Š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.

Vrste spojeva

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.

INNER JOIN

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.

Vanjski JOIN-ovi

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
Note: Null is returned for non-matching rows on right

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

PRAVO SE PRIDRUŽI

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
Note: Null is returned for non-matching rows on left

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

Pitanja i odgovori

JOIN kombinira stupce iz dvije tablice jedan pored drugog, podudarajući retke na ključu. UNION slaže rezultate dva upita okomito i zahtijeva podudarajući broj i tipove stupaca.

Da. Povežite dodatne JOIN klauzule, svaku sa svojim vlastitim ON uvjetom. MySQL spaja prve dvije tablice, zatim taj međurezultat spaja sa sljedećom tablicom i tako dalje.

SELF JOIN spaja tablicu sa samom sobom koristeći dva aliasa. Uspoređuje retke unutar jedne tablice, na primjer, uspoređuje redak zaposlenika s retkom voditelja tog zaposlenika.

Da. AI asistenti ugrađeni u urednike kao što su MySQL Radna tezga može izraditi JOIN upite iz upita na običnom jeziku. Uvijek pregledajte generirane ON uvjete, jer netočan ključ proizvodi tiho pogrešne rezultate.

Djelomično. Savjetnici za umjetnu inteligenciju predlažu indekse i bolje redoslijede spajanja, što često smanjuje vrijeme izvršenja. Optimizator i dalje bira konačni plan, pa ispravno indeksiranje ključeva spajanja ostaje najveći faktor.

Sažmite ovu objavu uz: