Kas ir Pievienošanās?
Pievienošanās palīdz iegūt datus no divām vai vairākām datu bāzes tabulām. Tabulas ir savstarpēji saistītas, izmantojot primārās un svešās atslēgas.Piezīme: JOIN ir visvairāk pārprasta tēma starp SQL leaners. Vienkāršības un saprotamības labad parauga praktizēšanai izmantosim jaunu datu bāzi. Kā parādīts zemāk
id | vārds | uzvārds | movie_id |
---|---|---|---|
1 | Ādams | Smits | 1 |
2 | Ravi | Kumars | 2 |
3 | Sjūzena | Deividsons | 5 |
4 | Dženija | Adrianna | 8 |
6 | Lī | Teniss | 10 |
id | nosaukums | kategorijā |
---|---|---|
1 | ASSASSINA RADĪTĀ: EMPERI | Animācijas |
2 | Īsts tērauds (2012) | Animācijas |
3 | Alvins un burunduki | Animācijas |
4 | Alvas alvas piedzīvojumi | Animācijas |
5 | Drošs (2012) | Darbība |
6 | Droša māja (2012) | Darbība |
7 | GIA | 18+ |
8 | Termiņš 2009 | 18+ |
9 | Netīrais attēls | 18+ |
10 | Mārlijs un es | Romantika |
Savienojumu veidi
Šķērsojiet PIEVIENOTIES
Cross JOIN ir vienkāršākais JOIN veids, kas saskaņo katras rindas no vienas datu bāzes tabulas ar visām citas rindām.
Citiem vārdiem sakot, tas dod mums katras pirmās tabulas rindas kombinācijas ar visiem ierakstiem otrajā tabulā.
Pieņemsim, ka mēs vēlamies iegūt visus dalībnieku ierakstus pret visiem filmu ierakstiem, mēs varam izmantot zemāk redzamo skriptu, lai iegūtu vēlamos rezultātus.
SELECT * FROM `movies` CROSS JOIN `members`
Iepriekš minētā skripta izpildīšana MySQL darbagaldā dod mums šādus rezultātus.
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 |
IEKŠĒJA PIEVIENOTIES
Iekšējais PIEVIENOJUMS tiek izmantots, lai atgrieztu rindas no abām tabulām, kas atbilst dotajam nosacījumam.
Pieņemsim, ka vēlaties saņemt dalībnieku sarakstu, kuri nomājušas filmas, kā arī viņu nomāto filmu nosaukumus. Tam varat vienkārši izmantot INNER JOIN, kas atgriež rindas no abām tabulām, kas atbilst noteiktiem nosacījumiem.
SELECT members.`first_name` , members.`last_name` , movies.`title`FROM members ,moviesWHERE movies.`id` = members.`movie_id`
Izpildot iepriekš minēto skriptu dot
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 |
Ņemiet vērā, ka iepriekš minēto rezultātu skriptu var uzrakstīt arī šādi, lai sasniegtu tādus pašus rezultātus.
SELECT A.`first_name` , A.`last_name` , B.`title`FROM `members`AS AINNER JOIN `movies` AS BON B.`id` = A.`movie_id`
Ārējie PIEVIENOŠANĀS
MySQL Outer JOINs atgriež visus ierakstus, kas atbilst abām tabulām.
Tas var atklāt ierakstus, kuriem pievienotā tabulā nav atbilstības. Ja atbilstība nav atrasta, tā atgriež NULL vērtības pievienotās tabulas ierakstiem.
Izklausās mulsinoši? Apskatīsim piemēru -
PALIEK PIEVIENOTIES
Pieņemsim, ka tagad vēlaties iegūt visu filmu nosaukumus kopā ar dalībnieku vārdiem, kuri tās ir nomājuši. Ir skaidrs, ka dažas filmas neviens nav īrējis. Šim nolūkam mēs vienkārši varam izmantot LEFT JOIN .
LEFT JOIN atgriež visas rindas no tabulas kreisajā pusē, pat ja labajā tabulā nav atrastas atbilstošas rindas. Ja labajā pusē esošajā tabulā nav atrasti rezultāti, tiek atgriezta vērtība NULL.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BON B.`movie_id` = A.`id`
Izpildot iepriekš minēto skriptu MySQL darbagaldā, varat iegūt. Varat redzēt, ka atgrieztajā rezultātā, kas ir norādīts zemāk, filmām, kuras netiek nomātas, dalībnieka vārda laukiem ir NULL vērtības. Tas nozīmē, ka nevienam atbilstošam dalībniekam nav atrasta dalībnieku tabula konkrētajai filmai.
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 |
PAREIZI PIEVIENOTIES
RIGHT LOIN acīmredzami ir pretējs LEFT LOIN. RIGHT JOIN atgriež visas kolonnas no labajā pusē esošās tabulas, pat ja kreisajā tabulā nav atrastas atbilstošas rindas. Ja tabulā kreisajā pusē tabula nav atrasta, tiek atgriezta vērtība NULL.
Pieņemsim, ka šajā piemērā jums ir jāiegūst dalībnieku vārdi un viņu iznomātās filmas. Tagad mums ir jauns dalībnieks, kurš vēl nav īrējis nevienu filmu
SELECT A.`first_name` , A.`last_name`, B.`title`FROM `members` AS ARIGHT JOIN `movies` AS BON B.`id` = A.`movie_id`
Izpildot iepriekš minēto skriptu MySQL darbagaldā, tiek iegūti šādi rezultāti.
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 |
"Ieslēgšanas" un "LIETOŠANAS" klauzulas
Iepriekš JOIN vaicājuma piemēros mēs esam izmantojuši klauzulu ON, lai saskaņotu ierakstus starp tabulu.
Lietošanas klauzulu var izmantot arī tam pašam mērķim. Atšķirība no LIETOŠANAS ir tā , ka abās tabulās ir jābūt vienādiem nosaukumiem atbilstošajām kolonnām.
"Filmu" tabulā līdz šim mēs izmantojām tās galveno atslēgu ar nosaukumu "id". Mēs to atsaucāmies tabulā "dalībnieki" ar nosaukumu "movie_id".
Nosauksim "filmas" tabulas par "id", lai būtu nosaukums "movie_id". Mēs to darām, lai iegūtu identiskus atbilstošus lauku nosaukumus.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
Tālāk izmantosim LIETOŠANU ar iepriekš redzamo LEFT JOIN piemēru.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BUSING ( `movie_id` )
Papildus ON un LIETOŠANAI ar JOINs varat izmantot arī daudzas citas MySQL klauzulas, piemēram, GROUP BY, WHERE, un pat tādas funkcijas kā SUM , AVG utt.
Kāpēc mums jāizmanto savienojumi?
Tagad jūs domājat, kāpēc mēs izmantojam JOIN, kad varam veikt to pašu uzdevumu, izpildot vaicājumus. It īpaši, ja jums ir zināma pieredze datu bāzes programmēšanā, jūs zināt, ka mēs varam izpildīt vaicājumus pa vienam, izmantojiet katra iznākumu secīgos vaicājumos. Protams, tas ir iespējams. Bet, izmantojot JOIN, darbu var paveikt, izmantojot tikai vienu vaicājumu ar jebkuriem meklēšanas parametriem. No otras puses, MySQL var sasniegt labāku veiktspēju ar JOIN, jo tā var izmantot indeksēšanu. Vienkārši izmantojot vienu JOIN vaicājumu, tā vietā, lai palaistu vairākus vaicājumus, tiek samazinātas servera pieskaitāmās izmaksas. Tā vietā vairāku vaicājumu izmantošana nodrošina vairāk datu pārsūtīšanas starp MySQL un lietojumprogrammām (programmatūru). Turklāt tas prasa vairāk datu manipulāciju arī lietojumprogrammas beigās.
Ir skaidrs, ka mēs varam sasniegt labākus MySQL un lietojumprogrammu veiktspēju, izmantojot JOIN.
Kopsavilkums
- PIEVIENOJUMI ļauj mums vienā rezultātu kopā apvienot datus no vairākām tabulām.
- JOINS veiktspēja ir labāka, salīdzinot ar apakšvaicājumiem
- INNER JOINS atgriež tikai rindas, kas atbilst norādītajiem kritērijiem.
- OUTER JOINS var atgriezt arī rindas, kurās nav atrasta neviena atbilstība. Nesaskaņotās rindas tiek atgrieztas ar NULL atslēgvārdu.
- Galvenie JOIN veidi ietver iekšējo, kreiso ārējo, labo ārējo, krustveida savienojumus utt.
- JOIN operācijās bieži izmantotā klauzula ir "ON". Klauzulai “LIETOŠANA” ir nepieciešams, lai atbilstošajām kolonnām būtu vienāds nosaukums.
- PIEVIENOJUMUS var izmantot arī citās klauzulās, piemēram, GROUP BY, WHERE, SUB QUERIES, AGGREGATE FUNCTIONS utt.