MySQL Liitos: Sisempi, Ulompi, Vasen, Oikea, Ristikkäinen
⚡ Älykäs yhteenveto
MySQL LIITOKSET yhdistävät kahden tai useamman toisiinsa liittyvän taulukon rivit yhdeksi tulosjoukoksi. Tämä resurssi selittää CROSS-, INNER-, LEFT-, RIGHT- ja OUTER-LIITOKSET suoritettavien kyselyiden, esimerkkitietojen ja selkeiden tulostaulukoiden avulla käytännön tietokantatyöskentelyä varten.

Mitä JOINS ovat?
Liitokset auttavat hakemaan tietoja kahdesta tai useammasta tietokantataulukosta.
Taulukot liittyvät toisiinsa ensisijaisilla ja vierailla avaimilla.
Huomautus: JOIN on SQL-oppilaiden keskuudessa väärinymmärretty aihe. Yksinkertaisuuden ja ymmärryksen helpottamiseksi käytämme harjoitusesimerkkinä uutta tietokantaa. Kuten alla on esitetty.
Jokaisessa alla olevassa esimerkissä käytetään näitä kahta taulukkoa. elokuvan_tunnus sarake sisään jäseniä viittaa siihen id sarake sisään Elokuvat — suhde, johon kukin JOIN-operaatio vastaa.
jäseniä
| 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 |
Elokuvat
| 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 |
Miksi meidän pitäisi käyttää JOIN-menetelmiä?
Ennen kuin tarkastellaan kutakin JOIN-tyyppiä, on syytä tietää, miksi JOIN-tyyppiä suositaan useiden kyselyiden suorittamiseen verrattuna.
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.
LIITOSTEN tyypit
MySQL tukee useita JOIN-tyyppejä, joista jokainen vastaa eri kysymykseen samoista kahdesta taulukosta. Alla oleva taulukko vertailee niitä; kutakin tyyppiä esitellään sitten kyselyn ja sen tulosteen avulla.
| LIITTYMISEN tyyppi | Palautetut rivit | Tuloksessa NULL-arvoja? | Tyypillinen käyttö |
|---|---|---|---|
| Ristiliittymä | Jokainen taulukon A rivi on yhdistetty jokaisen taulukon B rivin kanssa | Ei | Kaikkien mahdollisten yhdistelmien luominen |
| INNER JOIN | Vain rivit, jotka vastaavat ehtoa molemmissa taulukoissa | Ei | Jäsenet, jotka todella vuokrasivat elokuvan |
| LEFT LIITY | Kaikki vasemman taulukon rivit sekä oikean taulukon osumat | Kyllä, oikealla puolella | Kaikki elokuvat, myös ne, joita ei ole koskaan vuokrattu |
| OIKEA LIITTYMINEN | Kaikki oikean taulukon rivit sekä osumat vasemmalta | Kyllä, vasemmalla puolella | Kaikki elokuvat, jopa ilman jäseniä |
Ristiliittymä
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.
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
CROSS JOIN palauttaa kaikki mahdolliset parit, mikä on harvoin haluttu tulos. INNER JOIN rajaa tuloksen pareihin, jotka ovat todellisuudessa sukua toisilleen.
Sisäistä JOIN-komentoa käytetään palauttamaan rivit molemmista taulukoista, jotka täyttävät annetun ehdon.
Oletetaan, että haluat saada listan jäsenistä, jotka ovat vuokranneet elokuvia, sekä heidän vuokraamiensa elokuvien nimet. Voit käyttää tähän yksinkertaisesti INNER JOIN -operaattoria, joka palauttaa molemmista taulukoista rivit, jotka täyttävät annetut ehdot.
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
SISÄLIITOS poistaa hiljaa rivejä, joilla ei ole kumppania. Kun näillä yhteensopimattomilla riveillä on merkitystä, ULKOLIITOS on oikea valinta.
MySQL Ulkoiset liitokset 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.
Kuulostaako 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.
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öpöytä antaa. Alla olevasta palautetusta tuloksesta näet, että muiden kuin vuokrattujen elokuvien jäsenten nimikentissä on NULL-arvot. Tämä tarkoittaa, että kyseiselle elokuvalle ei löytynyt vastaavaa jäsentaulukkoa.
| 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 |
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
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 |
"ON" ja "USING" lausekkeet
Jokainen kysely tähän mennessä on löytänyt osumia riveistä, joissa on ON-lauseke. MySQL tarjoaa lyhyemmän vaihtoehdon, kun vastaavilla sarakkeilla on sama nimi.
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 GROUP BY, MISSÄ ja jopa toimii mm SUMMA, AVG, Jne




