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