MySQL LIITTYMINEN Opetusohjelma: SISÄINEN, ULKOINEN, VASEN, OIKEA, RISTI

Mitä JOINS ovat?

Liitokset auttavat hakemaan tietoja kahdesta tai useammasta tietokantataulukosta.

Taulukot liittyvät toisiinsa ensisijaisilla ja vierailla avaimilla.

Huomautus: JOIN on väärinymmärretyin aihe SQL-kehittäjien keskuudessa. Yksinkertaisuuden ja ymmärtämisen helpottamiseksi käytämme uutta tietokantaa näytteen harjoittamiseen. Kuten alla

id etunimi sukunimi elokuvan_tunnus
1 Aatami Seppä 1
2 Ravi Kumar 2
3 Susan Davidson 5
4 Jenny Adrianna 8
5 Lee Lemu 10
id otsikko luokka
1 ASSASSIN'S CREED: EMBERS Animaatiot
2 Real Steel (2012) Animaatiot
3 Alvin ja pikkuoravat Animaatiot
4 Tin Tinin seikkailut Animaatiot
5 Turvallinen (2012) Toiminta
6 Turvallinen talo (2012) Toiminta
7 GIA 18+
8 Määräaika 2009 18+
9 Likainen kuva 18+
10 Marley ja minä romanssi

Liitostyypit

Cross JOIN

Cross JOIN on yksinkertaisin JOIN-muoto, joka yhdistää tietokantataulukon jokaisen rivin toisen tietokantataulukon kaikkiin riveihin.

Toisin sanoen se antaa meille yhdistelmät ensimmäisen taulukon jokaisesta rivistä kaikkien toisen taulukon tietueiden kanssa.

Oletetaan, että haluamme saada kaikki jäsentietueet kaikkia elokuvatietueita vastaan, voimme käyttää alla näkyvää käsikirjoitusta saadaksemme halutut tulokset.

Liitostyypit

SELECT * FROM `movies` CROSS JOIN `members`

Suoritetaan yllä oleva komentosarja MySQL työpöytä antaa meille seuraavat tulokset.

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

Sisäistä JOIN-komentoa käytetään palauttamaan rivit molemmista taulukoista, jotka täyttävät annetun ehdon.

Oletetaan, että haluat saada luettelon jäsenistä, jotka ovat vuokranneet elokuvia, sekä heidän vuokraamiensa elokuvien nimet. Voit käyttää tähän yksinkertaisesti INNER JOIN -toimintoa, joka palauttaa molemmista taulukoista rivit, jotka täyttävät tietyt ehdot.

INNER JOIN

SELECT members.`first_name` , members.`last_name` , movies.`title`
FROM members ,movies
WHERE movies.`id` = members.`movie_id`

Suorittamalla yllä oleva komentosarja anna

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

Huomaa, että yllä oleva tulosskripti voidaan kirjoittaa myös seuraavasti saavuttaaksesi samat tulokset.

SELECT A.`first_name` , A.`last_name` , B.`title`
FROM `members`AS A
INNER JOIN `movies` AS B
ON B.`id` = A.`movie_id`

Ulkoiset liitokset

MySQL Ulommat JOINit palauttavat kaikki vastaavat tietueet molemmista taulukoista.

Se voi havaita tietueita, joilla ei ole ottelua yhdistetyssä taulukossa. Se palaa NULL yhdistetyn taulukon tietueiden arvot, jos vastaavuutta ei löydy.

Kuulostaa hämmentävältä? Katsotaanpa esimerkkiä -

LEFT LIITY

Oletetaan nyt, että haluat saada kaikkien elokuvien nimet sekä niiden jäsenten nimet, jotka ovat vuokranneet ne. On selvää, ettei kukaan ole vuokrannut joitakin elokuvia. Voimme yksinkertaisesti käyttää LEFT LIITY tarkoitusta varten.

Ulkoiset liitokset

LEFT JOIN palauttaa kaikki rivit vasemmalla olevasta taulukosta, vaikka oikealla olevasta taulukosta ei löytyisikään vastaavia rivejä. Jos oikealla olevasta taulukosta ei löydy osumia, palautetaan 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`

Suoritetaan yllä oleva komentosarja MySQL työpenkki antaa. Voit nähdä, että palautetussa tuloksessa, joka on lueteltu alla, että elokuvien, joita ei ole vuokrattu, jäsennimikentillä on NULL-arvoja. Tämä tarkoittaa, että yksikään vastaava jäsen ei löytänyt jäsentaulukkoa kyseiselle elokuvalle.

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

OIKEA LIITTYMINEN

RIGHT JOIN on selvästi vastoin LEFT JOIN. RIGHT JOIN palauttaa kaikki sarakkeet oikealla olevasta taulukosta, vaikka vastaavia rivejä ei löytyisikään vasemmanpuoleisesta taulukosta. Jos vasenta taulukkoa ei löydy, palautetaan NULL.

Oletetaan esimerkissämme, että sinun on hankittava jäsenten ja heidän vuokraamiensa elokuvien nimet. Nyt meillä on uusi jäsen, joka ei ole vielä vuokrannut yhtään elokuvaa

OIKEA LIITTYMINEN

SELECT  A.`first_name` , A.`last_name`, B.`title`
FROM `members` AS A
RIGHT JOIN `movies` AS B
ON B.`id` = A.`movie_id`

Suoritetaan yllä oleva komentosarja MySQL työpöytä antaa seuraavat tulokset.

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

"ON" ja "USING" lausekkeet

Yllä olevissa JOIN-kyselyesimerkeissä olemme käyttäneet ON-lausetta sovittamaan tietueita taulukoiden välillä.

USING-lausetta voidaan käyttää myös samaan tarkoitukseen. Ero kanssa KÄYTTÖ on se molemmissa taulukoissa on oltava samat nimet vastaaville sarakkeille.

Toistaiseksi "elokuvat" -taulukossa käytimme sen ensisijaista avainta nimellä "id". Viittasimme samaan "jäsenet" -taulukossa nimellä "movie_id".

Nimetään "elokuvat"-taulukot uudelleen "id"-kenttään, jotta niillä on nimi "movie_id". Teemme tämän saadaksemme identtiset kenttien nimet.

ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;

Seuraavaksi käytetään KÄYTTÖ-toimintoa yllä olevan LEFT JOIN -esimerkin kanssa.

SELECT A.`title` , B.`first_name` , B.`last_name`
FROM `movies` AS A
LEFT JOIN `members` AS B
USING ( `movie_id` )

Sen lisäksi, että käytät ON ja KÄYTTÖ JOIN:ien kanssa voit käyttää monia muita MySQL lausekkeet kuten Ryhmittele, MISSÄ ja jopa toimii mm SUMMA, AVG, Jne

Miksi meidän pitäisi käyttää liitoksia?

Nyt saatat miettiä, miksi käytämme JOINeja, kun voimme tehdä saman tehtävän suorittamalla kyselyitä. Varsinkin jos sinulla on kokemusta tietokantaohjelmoinnista, tiedät, että voimme suorittaa kyselyitä yksitellen, käytä kunkin tulostetta peräkkäisissä kyselyissä. Tietysti se on mahdollista. Mutta käyttämällä JOIN-koodeja, voit tehdä työn käyttämällä vain yhtä kyselyä millä tahansa hakuparametreilla. Toisaalta MySQL voi saavuttaa parempaa suorituskykyä JOIN:illa, koska se voi käyttää indeksointia. Yksinkertaisesti yhden JOIN-kyselyn käyttö useiden kyselyjen suorittamisen sijaan vähentää palvelimen ylimääräisiä kustannuksia. Useiden kyselyjen käyttäminen sen sijaan johtaa enemmän tiedonsiirtoon välillä MySQL ja sovellukset (ohjelmistot). Lisäksi se vaatii enemmän tietojen käsittelyä myös sovelluksen lopussa.

On selvää, että voimme saavuttaa paremmin MySQL ja sovellusten suorituskyky JOIN:ien avulla.

Yhteenveto

  • JOINS mahdollistaa tietojen yhdistämisen useammasta kuin yhdestä taulukosta yhdeksi tulosjoukoksi.
  • JOINSilla on parempi suorituskyky verrattuna alikyselyihin
  • INNER JOINS palauttaa vain rivit, jotka täyttävät annetut kriteerit.
  • OUTER JOINS voi myös palauttaa rivejä, joilta ei löydy osumia. Vastaamattomat rivit palautetaan avainsanalla NULL.
  • Tärkeimpiä JOIN-tyyppejä ovat Inner, Left Outer, Right Outer, Cross JOINS jne.
  • Usein käytetty lause JOIN-operaatioissa on "ON". KÄYTTÖ-lause edellyttää, että vastaavilla sarakkeilla on sama nimi.
  • JOINSia voidaan käyttää myös muissa lausekkeissa, kuten GROUP BY, WHERE, SUB QUERIES, AGGREGATE FUNCTIONS jne.