Mis on LIITUMISED?
Liitumised aitavad andmeid hankida kahest või enamast andmebaasitabelist. Tabelid on vastastikku seotud primaar- ja võõrvõti kasutades.Märkus. JOIN on SQL-i leanerite seas kõige valemini mõistetud teema. Lihtsuse ja arusaadavuse huvides kasutame valimi harjutamiseks uut andmebaasi. Nagu allpool näidatud
id | eesnimi | perekonnanimi | movie_id |
---|---|---|---|
1 | Adam | Smith | 1 |
2 | Ravi | Kumar | 2 |
3 | Susan | Davidson | 5 |
4 | Jenny | Adrianna | 8 |
6 | Lee | Pong | 10 |
id | pealkiri | kategooria |
---|---|---|
1 | PALGAMÕTJA LOOMINE: SÜGED | Animatsioonid |
2 | Päris teras (2012) | Animatsioonid |
3 | Alvin ja pähklid | Animatsioonid |
4 | Tinapleki 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 |
Liitumiste tüübid
Risti LIITU
Ristliitumine on JOIN-ide lihtsaim vorm, mis sobitab ühe rea ühest andmebaasitabelist teise rida.
Teisisõnu annab see kombinatsioonid igast esimese tabeli reast koos kõigi teise tabeli kirjetega.
Oletame, et tahame saada kõik liikmete kirjed kõigi filmikirjete vastu, saame soovitud tulemuste saamiseks kasutada allpool näidatud skripti.
SELECT * FROM `movies` CROSS JOIN `members`
Ülaltoodud skripti käivitamine MySQL-i töölaual 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 |
SISSE LIITU
Sisemist JOIN-i kasutatakse mõlema tabeli ridade tagastamiseks, mis vastavad antud tingimusele.
Oletame, et soovite saada nimekirja liikmetest, kes on filme rentinud, koos nende renditud filmide nimedega. Selleks võite lihtsalt kasutada INNER JOIN, mis tagastab mõlema tabeli read, mis vastavad antud tingimustele.
SELECT members.`first_name` , members.`last_name` , movies.`title`FROM members ,moviesWHERE movies.`id` = members.`movie_id`
Ülaltoodud skripti täitmine annab
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 AINNER JOIN `movies` AS BON B.`id` = A.`movie_id`
Välised LIITUMISED
MySQL Outer JOINs tagastab kõik mõlema tabeli kirjed.
See suudab tuvastada kirjed, millel pole ühendatud tabelis vastet. Kui vastet ei leita, tagastatakse ühendatud tabeli kirjete NULL väärtused.
Tundub segane? Vaatame ühte näidet -
VASAK LIITU
Oletame, et soovite nüüd saada kõigi filmide pealkirjad koos nende rentinud liikmete nimedega. On selge, et mõnda filmi pole keegi rentinud. Sel eesmärgil saame lihtsalt kasutada vasakut liitumist .
LEFT JOIN tagastab vasakul olevast tabelist kõik read isegi siis, kui paremal olevast tabelist pole ühtegi vastavat rida leitud. Kui parempoolsest tabelist vasteid ei leitud, tagastatakse NULL.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BON B.`movie_id` = A.`id`
Ülaltoodud skripti käivitamine MySQL-i töölaual annab. Näete, et tagastatud tulemuses, mis on loetletud allpool, on filmide, mida ei rendita, liikmenime väljadel on NULL-väärtused. See tähendab, et ükski sobiv liige ei leidnud selle konkreetse filmi 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 |
PAREMALT LIITU
PAREMA LIITUMINE on ilmselgelt VASAKU LIITUMISE vastand. Parempoolne liitumine tagastab parempoolse tabeli kõik veerud, isegi kui vasakul olevast tabelist pole ühtegi vastavat rida leitud. Kui vasakpoolses tabelis pole vasteid leitud, tagastatakse NULL.
Oletame, et meie näites peate hankima liikmete nimed ja nende renditud filmid. Nüüd on meil uus liige, kes pole veel ühtegi filmi rentinud
SELECT A.`first_name` , A.`last_name`, B.`title`FROM `members` AS ARIGHT JOIN `movies` AS BON B.`id` = A.`movie_id`
Ülaltoodud skripti käivitamine MySQL-i töölaual 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 |
Klauslid "SEES" ja "KASUTAMINE"
Ülaltoodud JOIN päringu näidetes oleme tabeli kirjete sobitamiseks kasutanud klauslit ON.
Kasutamisklauslit saab kasutada ka samal eesmärgil. Erinevus KASUTAMINE see peab olema identne nimed sobitatud veerud nii tabelid.
"Filmide" tabelis kasutasime seni selle peamist võtit nimega "id". Sellele viitasime tabelis "liikmed" nimega "movie_id".
Nimetame väljad "filmid" tabelid väljale "ID", et saada nimi "film_id". Teeme seda selleks, et meil oleksid identsed sobitatud väljade nimed.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
Järgmisena kasutame KASUTAMIST ülaltoodud LEFT JOIN näite abil.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BUSING ( `movie_id` )
Lisaks ON-le ja JOIN-ide kasutamisele saate kasutada paljusid muid MySQL-i klausleid nagu GROUP BY, WHERE ja isegi funktsioone nagu SUM , AVG jne.
Miks peaksime liitumisi kasutama?
Nüüd võite mõelda, miks me kasutame JOIN-e, kui saame päringutega sama ülesannet teha. Eriti kui teil on andmebaaside programmeerimisel kogemusi, teate, et saame päringuid ükshaaval käivitada, kasutage igaühe väljundit järjestikuste päringute korral. Muidugi on see võimalik. Kuid JOIN-ide abil saate töö tehtud, kui kasutate ainult ühte päringut mis tahes otsinguparameetritega. Teisest küljest saab MySQL JOIN-idega paremat jõudlust , kuna saab kasutada indekseerimist. Lihtsalt ühe JOIN-päringu kasutamine mitme päringu käivitamise asemel vähendab serveri üldkulusid. Selle asemel mitme päringu kasutamine toob kaasa rohkem andmeedastusi MySQL-i ja rakenduste (tarkvara) vahel. Lisaks nõuab see andmete manipuleerimist ka rakenduse lõpus.
On selge, et JOIN-ide abil saame saavutada parema MySQL-i ja rakenduste jõudluse.
Kokkuvõte
- JOINS võimaldab meil ühendada rohkem kui ühe tabeli andmed ühte tulemustekomplekti.
- JOINS on võrreldes päringutega parem
- INNER JOINS tagastab ainult etteantud kriteeriumidele vastavad read.
- OUTER JOINS võib tagastada ka ridu, kus vasteid pole leitud. Sobimatud read tagastatakse märksõnaga NULL.
- Peamised JOIN-tüüpi tüübid hõlmavad sisemist, vasakut välimist, paremat välimist, ristliitumisi jne.
- JOIN-i toimingutes on sageli kasutatav lause "ON". Klausel "KASUTAMINE" nõuab, et sobivad veerud oleksid sama nimega.
- JOINS-e saab kasutada ka teistes klauslites, näiteks GROUP BY, WHERE, ALAKÜSIMUSED, KOGUMISFUNKTSIOONID jms.