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.

  • 🔗 Põhiprintsiip: JOIN sobitab ridu tabelite vahel, kasutades primaarvõtme ja võõrvõtme seoseid.
  • Miks see oluline: Üks JOIN-päring kasutab indekseerimist ja vähendab serveri edasi-tagasi reise võrreldes mitme eraldi päringuga.
  • ✖️ Ristliitumiskäitumine: Iga esimese tabeli rida paardub teise tabeli iga reaga, saades Cartesiuse korrutise.
  • 🎯 Sisemise JOIN-i käitumine: Tagastatakse ainult read, mis vastavad mõlema tabeli vastavustingimusele.
  • ↔️ Välise JOIN-i käitumine: LEFT ja RIGHT JOIN tagastavad samuti sobimatud read ja täidavad puuduvad veerud NULL-iga.
  • 🧩 SEES versus KASUTAMINE: USING nõuab identseid veerunimesid, samas kui ON toetab mis tahes sobivat avaldist.

MySQL LIITAB

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.

Ühenduste tüübid

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.

INNER JOIN

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.

Välised JOIN-id

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

Õ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

ÕIGE LIITUMINE

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

"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

KKK

JOIN (liitumiskäsk) ühendab kahe kõrvuti asuva tabeli veerud, leides võtmel vastavad read. UNION (ühendamiskäsk) virnastab kahe päringu tulemused vertikaalselt ning nõuab vastavat veeruarvu ja -tüüpi.

Jah. Ahelda täiendavaid JOIN-klausleid, igaühel oma ON-tingimusega. MySQL ühendab kaks esimest tabelit, seejärel ühendab selle vahetulemuse järgmise tabeliga jne.

SELF JOIN liidab tabeli iseendaga kahe aliase abil. See võrdleb ühe tabeli ridu, näiteks sobitades töötaja rea ​​selle töötaja juhi reaga.

Jah. Redaktoritesse sisse ehitatud tehisintellekti assistendid, näiteks MySQL Workbench saab lihtkeelsest käsurealt JOIN-päringuid koostada. Vaadake alati üle genereeritud ON-tingimused, kuna vale võti annab vaikselt valesid tulemusi.

Osaliselt. Tehisintellekti nõustajad soovitavad indekseid ja paremaid liitumisjärjestusi, mis sageli lühendavad täitmisaega. Optimeerija valib ikkagi lõpliku plaani, seega jääb liitumisvõtmete õige indekseerimine suurimaks teguriks.

Võta see postitus kokku järgmiselt: