MySQL PIEVIENOŠANAS MĀCĪBA: IEKŠĒJA, ĀRĒJA, KREISA, PA labi, KRUSTA

Anonim

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 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
Note: Null is returned for non-matching rows on right

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
Note: Null is returned for non-matching rows on left

"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.