MySQL Liitumine: sisemine, välimine, vasak, parem, rist
⚡ Nutikas kokkuvõte
MySQL ÜHENDAMISED (JOIN) ühendavad kahe või enama seotud tabeli read üheks tulemuste komplektiks. See ressurss selgitab CROSS, INNER, LEFT, RIGHT ja OUTER JOIN'e käivitatavate päringute, näidisandmete ja selgete väljundtabelitega praktiliseks andmebaasitööks.

Mis on JOINS?
Ühendused aitavad andmeid hankida kahest või enamast andmebaasi tabelist.
Tabelid on omavahel seotud primaar- ja võõrvõtmete abil.
Märkus: JOIN on SQL-i õppijate seas kõige valesti mõistetud teema. Lihtsuse ja arusaadavuse huvides kasutame harjutamiseks uut andmebaasi. Nagu allpool näidatud.
Igas allolevas näites kasutatakse neid kahte tabelit. filmi_id veerg sisse liikmetele osutab id veerg sisse Filmid — seos, millega iga JOIN vastab.
liikmetele
| id | eesnimi | perekonnanimi | filmi_id |
|---|---|---|---|
| 1 | Adam | sepp | 1 |
| 2 | Ravi | Kumar | 2 |
| 3 | Susan | Davidson | 5 |
| 4 | Jenny | Adrianna | 8 |
| 5 | Alltuulekülg | Pong | 10 |
Filmid
| id | pealkiri | kategooria |
|---|---|---|
| 1 | ASSASSIN'S CRED: EMBERS | Animatsioonid |
| 2 | Real Steel (2012) | Animatsioonid |
| 3 | Alvin ja koopaoravad | Animatsioonid |
| 4 | Tina Tina seiklused | Animatsioonid |
| 5 | Seif (2012) | tegevus |
| 6 | Turvaline maja (2012) | tegevus |
| 7 | GIA | 18 + |
| 8 | Tähtaeg 2009 | 18 + |
| 9 | Räpane pilt | 18 + |
| 10 | Marley ja mina | romantika |
Miks peaksime kasutama JOIN-e?
Enne iga JOIN-tüübi vaatlemist tasub teada, miks eelistatakse JOIN-i mitme päringu käivitamisele.
Nüüd võite mõelda, miks me kasutame JOIN-e, kui saame teha sama ülesannet, käivitades päringuid. Eriti kui teil on andmebaaside programmeerimise kogemus, teate, et suudame päringuid ükshaaval käivitada, kasutage iga päringu väljundit järjestikustes päringutes. Muidugi on see võimalik. Kuid kasutades JOIN-e, saate töö tehtud, kasutades ainult ühte päringut mis tahes otsinguparameetritega. Teisest küljest MySQL suudab saavutada paremaid tulemusi JOIN-idega, kuna see saab kasutada indekseerimist. Lihtsalt ühe JOIN-päringu kasutamine mitme päringu käitamise asemel vähendab serveri üldkulusid. Selle asemel kasutatakse mitut päringut, mis toob kaasa rohkem andmeedastusi MySQL ja rakendused (tarkvara). Lisaks nõuab see rohkem andmetega manipuleerimist ka rakenduse lõpus.
On selge, et suudame saavutada paremaid tulemusi MySQL ja rakenduste jõudlus JOIN-ide abil.
LIITUMISE tüübid
MySQL toetab mitut JOIN-tüüpi, millest igaüks vastab kahe sama tabeli kohta käivale erinevale küsimusele. Allolev tabel võrdleb neid; seejärel demonstreeritakse iga tüüpi päringu ja selle väljundiga.
| LIITUMISE tüüp | Tagastatud read | Tulemuses NULL-id? | Tüüpiline kasutamine |
|---|---|---|---|
| RISTI LIITUMINE | Iga tabeli A rida on seotud iga tabeli B reaga | Ei | Kõikvõimalike kombinatsioonide genereerimine |
| INNER JOIN | Ainult read, mis vastavad mõlema tabeli tingimusele | Ei | Liikmed, kes filmi tegelikult rentisid |
| VASAK LIITU | Kõik read vasakpoolsest tabelist pluss vasted paremalt | Jah, paremal pool | Kõik filmid, isegi need, mida pole kunagi laenutatud |
| ÕIGE LIITUMINE | Kõik read paremalt tabelilt pluss vasted vasakult | Jah, vasakul pool | Kõik filmid, isegi ilma liikmeta |
RISTI LIITUMINE
Cross JOIN on JOIN-ide lihtsaim vorm, mis sobitab ühe andmebaasi tabeli iga rea teise andmebaasi tabeli kõikide ridadega.
Teisisõnu annab see meile kombinatsioonid esimese tabeli igast reast kõigi teise tabeli kirjetega.
Oletame, et tahame võrrelda kõiki liikmekirjeid kõigi filmikirjetega, saame soovitud tulemuste saamiseks kasutada allpool näidatud skripti.
SELECT * FROM `movies` CROSS JOIN `members`
Ülaltoodud skripti käivitamine MySQL töölaud annab meile järgmised tulemused.
| 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 tagastab kõik võimalikud paarid, mis on harva see, mida soovite. INNER JOIN kitsendab tulemuse paarideni, mis on tegelikult seotud.
Sisemist JOIN kasutatakse antud tingimusele vastavate ridade tagastamiseks mõlemast tabelist.
Oletame, et soovite saada nimekirja liikmetest, kes on filme rentinud, koos nende poolt renditud filmide pealkirjadega. Selleks võite lihtsalt kasutada funktsiooni INNER JOIN, mis tagastab mõlemast tabelist read, mis vastavad antud tingimustele.
SELECT members.`first_name` , members.`last_name` , movies.`title` FROM members ,movies WHERE movies.`id` = members.`movie_id`
Ülaltoodud skripti täitmine 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 |
Pange tähele, et ülaltoodud tulemuste skripti saab samade tulemuste saavutamiseks kirjutada ka järgmiselt.
SELECT A.`first_name` , A.`last_name` , B.`title` FROM `members` AS A INNER JOIN `movies` AS B ON B.`id` = A.`movie_id`
Välised JOIN-id
SISEMINE LIITMINE eemaldab vaikselt read, millel pole partnerit. Kui need sobimatud read on olulised, on VÄLINE LIITMINE õige valik.
MySQL Välised JOIN-id tagastavad kõik mõlema tabeli vastavad kirjed.
See suudab tuvastada kirjeid, millel pole ühendatud tabelis vastet. See naaseb NULL ühendatud tabeli kirjete väärtused, kui vastet ei leitud.
Kõlab segaselt? Vaatame näidet –
VASAK LIITU
Oletagem, et soovite nüüd saada kõigi filmide pealkirjad koos nende laenutanud liikmete nimedega. On selge, et mõnda filmi pole keegi laenutanud. Saame lihtsalt kasutada VASAK LIITU eesmärgi nimel.
LEFT JOIN tagastab kõik vasakpoolse tabeli read, isegi kui parempoolsest tabelist ei leitud ühtegi sobivat rida. Kui parempoolses tabelis ei leitud vasteid, tagastatakse 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`
Ülaltoodud skripti käivitamine MySQL töölaud annab. Näete, et allpool loetletud tagastatud tulemuses on filmide puhul, mida ei ole laenutatud, liikme nime väljadel NULL väärtused. See tähendab, et selle konkreetse filmi jaoks ei leitud liikmete tabelit.
| 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 |
ÕIGE LIITUMINE
RIGHT JOIN on ilmselgelt LEFT JOIN vastand. RIGHT JOIN tagastab kõik parempoolse tabeli veerud, isegi kui vasakpoolsest tabelist pole leitud ühtegi sobivat rida. Kui vasakpoolses tabelis ei leitud vasteid, tagastatakse NULL.
Oletame meie näites, et peate hankima liikmete ja nende laenutatud filmide nimed. Nüüd on meil uus liige, kes pole veel ühtegi filmi laenutanud
SELECT A.`first_name` , A.`last_name`, B.`title` FROM `members` AS A RIGHT JOIN `movies` AS B ON B.`id` = A.`movie_id`
Ülaltoodud skripti käivitamine MySQL töölaud annab järgmised tulemused.
| 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" klauslid
Kõik päringud on seni leidnud vasteid ridadele, millel on ON-klausel. MySQL pakub lühemat alternatiivi, kui sobivatel veergudel on sama nimi.
Ülaltoodud JOIN-päringu näidetes oleme tabelite kirjete sobitamiseks kasutanud ON-klauslit.
Samal eesmärgil saab kasutada ka klauslit USING. Erinevus sellega KASUTAMINE Kas see on peab mõlemas tabelis olema sobitatud veergudele identsed nimed.
Tabelis “filmid” kasutasime seni selle primaarvõtit nimega “id”. Me viitasime samale tabelis "liikmed" nimega "movie_id".
Nimetame tabelite “filmid” välja “id” ümber, et saada nimi “movie_id”. Teeme seda selleks, et väljade nimed oleksid identsed.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
Järgmiseks kasutame ülaltoodud LEFT JOIN näitega USING.
SELECT A.`title` , B.`first_name` , B.`last_name` FROM `movies` AS A LEFT JOIN `members` AS B USING ( `movie_id` )
Peale kasutamise ON ja KASUTAMINE koos JOIN-idega saate kasutada palju muud MySQL klauslid nagu GROUP BY, KUS ja isegi funktsioone nagu SUM, AVGJne




