„MySQL JOINS“ mokymo programa: Vidaus, išorės, kairės, dešinės, kryžiaus

Turinys

Kas yra JUNGIMAI?

Prisijungimai padeda gauti duomenis iš dviejų ar daugiau duomenų bazių lentelių. Lentelės yra tarpusavyje susijusios naudojant pirminius ir svetimus raktus.

Pastaba: JOIN yra labiausiai nesusipratusi tema tarp „SQL leaners“. Siekdami paprastumo ir supratimo, imdamiesi pavyzdžio naudosime naują duomenų bazę. Kaip parodyta žemiau

id Pirmas vardas pavardė filmo ID
1 Adomas Kalvis 1
2 Ravi Kumaras 2
3 Susan Davidsonas 5
4 Jenny Adrianna 8
6 Lee Pongas 10
id pavadinimas Kategorija
1 ŽUDIKO KŪRIMAS: ŽIEDAI Animacijos
2 Tikrasis plienas (2012) Animacijos
3 Alvinas ir burundukai Animacijos
4 Alavo skardos nuotykiai Animacijos
5 Seifas (2012) Veiksmas
6 Saugus namas (2012) Veiksmas
7 BIL 18+
8 Terminas 2009 m 18+
9 Purvinas paveikslėlis 18+
10 Marley ir aš Romantika

Sujungimų tipai

Kryžiuoti PRISIJUNGTI

Kryžminis JOIN yra paprasčiausia JOIN forma, atitinkanti kiekvienos vienos duomenų bazės lentelės eilutes su visomis kitos eilutės eilutėmis.

Kitaip tariant, tai suteikia mums kiekvienos pirmosios lentelės eilutės ir visų įrašų antroje lentelėje derinius.

Tarkime, kad norime gauti visus narių įrašus pagal visus filmų įrašus, norėdami gauti norimus rezultatus, galime naudoti žemiau pateiktą scenarijų.

SELECT * FROM `movies` CROSS JOIN `members`

Minėto scenarijaus vykdymas MySQL darbastalyje suteikia mums šiuos rezultatus.

 
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

VIDINIS PRISIJUNGIMAS

Vidinis JOIN naudojamas grąžinti abiejų lentelių eilutes, kurios atitinka nurodytą sąlygą.

Tarkime, norite gauti narių, kurie išsinuomojo filmus, sąrašą kartu su jų nuomojamais filmų pavadinimais. Tam paprasčiausiai galite naudoti INNER JOIN, kuris grąžina abiejų lentelių eilutes, kurios atitinka nurodytas sąlygas.

SELECT members.`first_name` , members.`last_name` , movies.`title`FROM members ,moviesWHERE movies.`id` = members.`movie_id`

Vykdant aukščiau pateiktą scenarijų duoti

 
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

Atkreipkite dėmesį, kad aukščiau pateiktą rezultatų scenarijų taip pat galima parašyti taip, kad būtų pasiekti tie patys rezultatai.

SELECT A.`first_name` , A.`last_name` , B.`title`FROM `members`AS AINNER JOIN `movies` AS BON B.`id` = A.`movie_id`

Išoriniai PRISIJUNGIMAI

„MySQL Outer JOIN“ pateikia visus įrašus, atitinkančius abi lenteles.

Jis gali aptikti įrašus, kurių sujungtoje lentelėje nėra atitikmenų. Jei nerandama atitikimo, pateikiamos NULL reikšmės sujungtos lentelės įrašams.

Skamba painu? Panagrinėkime pavyzdį -

Kairysis prisijungimas

Tarkime, kad dabar norite gauti visų filmų pavadinimus kartu su juos išsinuomojusių narių vardais. Akivaizdu, kad kai kurių filmų niekas nenuomojo. Tam tikslui paprasčiausiai galime naudoti LEFT JOIN .

Kairysis prisijungimas grąžina visas kairės lentelės eilutes, net jei dešinėje esančioje lentelėje nerasta atitinkančių eilučių. Jei dešinėje esančioje lentelėje nerasta atitikčių, grąžinama NULL.

SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BON B.`movie_id` = A.`id`

Vykdant pirmiau pateiktą scenarijų „MySQL“ darbastalyje, galite gauti. Galite pamatyti, kad grąžinamame rezultate, kuris yra išvardytas žemiau, filmų, kurie nėra nuomojami, narių vardų laukai turi NULL reikšmes. Tai reiškia, kad nė vienas atitinkantis narys nerado to konkretaus filmo narių stalo.

 
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

TEISINIS PRISIJUNGIMAS

TEISINIS PRISIJUNGIMAS akivaizdžiai priešingas KAIRIAM PRISIJUNGTI. DĖMESIS PRISIJUNGTI grąžina visus stulpelius iš dešinėje esančios lentelės, net jei kairėje esančioje lentelėje nerasta atitinkančių eilučių. Jei kairėje esančioje lentelėje atitikmenų nerasta, grąžinama NULL.

Tarkime, kad šiame pavyzdyje reikia gauti narių nuomos vardus ir filmus. Dabar turime naują narį, kuris dar neišnuomojo jokio filmo

SELECT A.`first_name` , A.`last_name`, B.`title`FROM `members` AS ARIGHT JOIN `movies` AS BON B.`id` = A.`movie_id`

Minėto scenarijaus vykdymas MySQL darbastalyje duoda šiuos rezultatus.

 
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

Sąlygos „ĮJUNGTA“ ir „NAUDOTI“

Aukščiau pateiktuose JOIN užklausos pavyzdžiuose mes naudojome sąlygą ON, kad atitiktų lentelės įrašus.

TAIKYMO sąlyga taip pat gali būti naudojama tam pačiam tikslui. Skirtumas nuo USING yra tas, kad abiejose lentelėse turi būti vienodi atitiktų stulpelių pavadinimai.

„Filmų“ lentelėje iki šiol naudojome jos pagrindinį raktą su pavadinimu „id“. Mes nurodėme tą patį „narių“ lentelėje pavadinimu „filmo_id“.

Pervardykime „filmų“ lentelių pavadinimą „id“, kad būtų „filmų_id“. Tai darome norėdami, kad laukų pavadinimai būtų vienodi.

ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;

Toliau naudokime NAUDOJIMĄ su aukščiau esančiu pavyzdžiu LEFT JOIN.

SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BUSING ( `movie_id` )

Be įjungimo ir NAUDOJIMO su JOIN , galite naudoti daugybę kitų „MySQL“ išlygų, pvz., „ GROUP BY“, „WHERE“, ir netgi tokias funkcijas kaip „ SUM“ , „ AVG“ ir kt.

Kodėl turėtume naudoti sujungimus?

Dabar galite pagalvoti, kodėl mes naudojame JOIN, kai galime atlikti tą pačią užduotį vykdydami užklausas. Ypač jei turite tam tikros duomenų bazių programavimo patirties, žinote, kad galime vykdyti užklausas po vieną, naudokite kiekvienos išvestį iš eilės einančiose užklausose. Žinoma, tai įmanoma. Bet naudodamiesi JOIN, darbą galite atlikti naudodami tik vieną užklausą su bet kokiais paieškos parametrais. Kita vertus, „ MySQL“ gali pasiekti geresnių rezultatų naudodamas JOIN, nes gali naudoti indeksavimą. Tiesiog naudodami vieną JOIN užklausą, užuot vykdę kelias užklausas, sumažėja serverio pridėtinės išlaidos. Vietoj to, naudojant kelias užklausas, daugiau duomenų perduodama tarp „MySQL“ ir programų (programinės įrangos). Be to, reikia daugiau manipuliuoti duomenimis programos pabaigoje.

Akivaizdu, kad naudodami JOIN galime pasiekti geresnių MySQL ir programų našumų.

Santrauka

  • JOINS leidžia mums sujungti daugiau nei vienos lentelės duomenis į vieną rezultatų rinkinį.
  • JOINS veikia geriau, palyginti su antrinėmis užklausomis
  • INNER JOINS pateikia tik tas eilutes, kurios atitinka nurodytus kriterijus.
  • OUTER JOINS taip pat gali pateikti eilutes, kuriose nerasta atitikčių. Neatitinkančios eilutės pateikiamos su NULL raktiniu žodžiu.
  • Pagrindiniai JOIN tipai yra vidinis, kairysis išorinis, dešinysis išorinis, kryžminiai sujungimai ir kt.
  • JOIN operacijose dažnai naudojama sąlyga yra „ĮJUNGTA“. Sąlyga „NAUDOTI“ reikalauja, kad atitinkantys stulpeliai būtų to paties pavadinimo.
  • JUNGIMAI taip pat gali būti naudojami kituose straipsniuose, pvz., „GROUP BY“, WHERE, PAKLAUSOS, SUDĖTINĖS FUNKCIJOS ir kt.

Įdomios straipsniai...