Vodič za MySQL PRIDRUŽIVANJE: UNUTARNJI, VANJSKI, LIJEVI, DESNI, KRIŽ

Anonim

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

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

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.