Mik azok a JOINS?
A csatlakozások segítenek az adatok lekérésében két vagy több adatbázis-táblából. A táblák kölcsönösen kapcsolódnak az elsődleges és az idegen kulcsok használatával.Megjegyzés: A JOIN a leginkább félreértett téma az SQL leanerek között. Az egyszerűség és az érthetőség kedvéért egy új adatbázist fogunk használni a minta gyakorlásához. Az alábbiak szerint
id | keresztnév | vezetéknév | film_azonosító |
---|---|---|---|
1 | Ádám | Kovács | 1 |
2 | Ravi | Kumar | 2 |
3 | Susan | Davidson | 5. |
4 | Jenny | Adrianna | 8. |
6. | Lee | Pong | 10. |
id | cím | kategória |
---|---|---|
1 | JÁRMŰVEL KERETETT: TAGOK | Animációk |
2 | Valódi acél (2012) | Animációk |
3 | Alvin és a mókusok | Animációk |
4 | A konzervdoboz kalandjai | Animációk |
5. | Biztonságos (2012) | Akció |
6. | Biztonságos ház (2012) | Akció |
7 | GIA | 18+ |
8. | 2009. határidő | 18+ |
9. | A piszkos kép | 18+ |
10. | Marley és én | Románc |
A csatlakozások típusai
Kereszt CSATLAKOZÁS
A Cross JOIN a JOIN-ok legegyszerűbb formája, amely egy adatbázis-táblázat minden egyes sorát egybe hozza a másik minden sorával.
Más szavakkal, az első táblázat minden egyes sorának kombinációit adja a második táblázat összes rekordjával.
Tegyük fel, hogy minden taglemezt meg akarunk szerezni az összes filmrekorddal, az alább látható szkriptet használhatjuk a kívánt eredmények eléréséhez.
SELECT * FROM `movies` CROSS JOIN `members`
A fenti parancsfájl futtatása a MySQL munkapadban a következő eredményeket adja.
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 |
BELSŐ ÖSSZEKAPCSOLÁS
A belső JOIN arra szolgál, hogy mindkét táblázatból visszatérjenek az adott feltételnek megfelelő sorok.
Tegyük fel, hogy listát szeretne kapni azokról a tagokról, akik filmeket béreltek, valamint az általuk bérelt filmek címeit. Ehhez egyszerűen használhat INNER JOIN-t, amely mindkét tábla sorait adja vissza, amelyek megfelelnek az adott feltételeknek.
SELECT members.`first_name` , members.`last_name` , movies.`title`FROM members ,moviesWHERE movies.`id` = members.`movie_id`
A fenti szkript végrehajtása adja
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 |
Ne feledje, hogy a fenti eredményszkript ugyanazon eredmények elérése érdekében az alábbiak szerint is írható.
SELECT A.`first_name` , A.`last_name` , B.`title`FROM `members`AS AINNER JOIN `movies` AS BON B.`id` = A.`movie_id`
Külső CSATLAKOZÁSOK
A MySQL Outer JOINs visszaadja az összes rekordnak megfelelő táblákat.
Felismerheti azokat a rekordokat, amelyeknek nincs egyezése a csatlakozott táblában. Ha nem található egyezés, akkor a NULL értékeket adja vissza az összekapcsolt tábla rekordjaihoz.
Zavarosnak hangzik? Nézzünk meg egy példát -
BAL CSATLAKOZÁS
Tegyük fel, hogy mostantól meg akarja szerezni az összes film címét, a tagok nevével együtt, akik bérelték őket. Nyilvánvaló, hogy egyes filmeket senki sem bérelt. Egyszerűen használhatjuk a LEFT JOIN- t a célra.
A LEFT JOIN visszaadja a bal oldali táblázat összes sorát, még akkor is, ha a jobb oldali táblázatban nem található megfelelő sor. Ahol a jobb oldali táblázatban nem található egyezés, a NULL értéket adja vissza.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BON B.`movie_id` = A.`id`
A fenti parancsfájl végrehajtása a MySQL munkapadban megadja. Láthatja, hogy az alább felsorolt visszaküldött eredményben a nem bérelt filmek esetében a tagnév mezők NULL értékekkel rendelkeznek. Ez azt jelenti, hogy az adott filmhez egyetlen tag sem talált tagtáblát.
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 |
JOBB CSATLAKOZÁS
A JOBB CSATLAKOZÁS nyilvánvalóan a BAL CSATLAKOZÁS ellentéte. A JOBB CSATLAKOZÁS a jobb oldali táblázat összes oszlopát visszaadja, még akkor is, ha a bal oldali táblázatban nem található megfelelő sor. Ahol a bal oldali táblázatban nem található egyezés, a NULL értéket adja vissza.
Tegyük fel, hogy példánkban meg kell kapnia a tagok nevét és az általuk bérelt filmeket. Most új tagunk van, aki még nem kölcsönzött filmet
SELECT A.`first_name` , A.`last_name`, B.`title`FROM `members` AS ARIGHT JOIN `movies` AS BON B.`id` = A.`movie_id`
A fenti parancsfájl futtatása a MySQL munkaasztalon a következő eredményeket adja.
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 |
"ON" és "USING" záradékok
A fenti JOIN lekérdezési példákban az ON záradékot használtuk a rekordok táblák közötti egyeztetésére.
A USING záradék ugyanarra a célra használható. A HASZNÁLAT különbsége, hogy mindkét táblázatban azonos nevekkel kell rendelkeznie az egyező oszlopoknak.
A "filmek" táblázatban eddig az "id" nevű elsődleges kulcsot használtuk. Ugyanazt utaltuk a "tagok" táblázatban a "film_id" névvel.
Nevezzük át a "filmek" táblák "id" mezőjét, hogy a "film_id" nevet kapja. Ezt azért tesszük, hogy azonos egyező mezőnevek legyenek.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
Ezután használjuk a HASZNÁLAT lehetőséget a fenti LEFT JOIN példával.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BUSING ( `movie_id` )
Az ON és a JOIN használatával együtt számos más MySQL záradékot is használhat, mint például a GROUP BY, WHERE és még olyan funkciókat is, mint a SUM , AVG stb.
Miért használjuk a csatlakozásokat?
Most azt gondolhatja, miért használjuk a JOIN-okat, amikor ugyanazt a feladatot tudjuk végrehajtani a lekérdezések futtatásával. Különösen, ha van tapasztalata az adatbázis-programozásban, akkor tudja, hogy egyesével futtathatunk lekérdezéseket, mindegyik kimenetét felhasználhatjuk egymást követő lekérdezések során. Természetesen ez lehetséges. A JOINs használatával azonban csak egy lekérdezést használhat, bármilyen keresési paraméterrel. Másrészt a MySQL jobb teljesítményt érhet el a JOIN-okkal, mivel használhatja az indexelést. Egyszerűen egyetlen JOIN lekérdezés használata több lekérdezés futtatása helyett csökkenti a kiszolgáló általános költségeit. Több lekérdezés használata helyett több adatátvitelhez vezet a MySQL és az alkalmazások (szoftverek) között. Ez további adatkezelést igényel az alkalmazás végén is.
Világos, hogy a JOIN-ok használatával jobb MySQL és alkalmazás teljesítményeket érhetünk el.
Összegzés
- A JOINS lehetővé teszi számunkra, hogy egynél több táblázat adatait egyetlen eredményhalmazba egyesítsük.
- A JOINS jobb teljesítményt nyújt az alkérdezésekhez képest
- A INNER JOINS csak azokat a sorokat adja vissza, amelyek megfelelnek a megadott feltételeknek.
- A KÜLSŐ CSATLAKOZÁS olyan sorokat is visszaadhat, ahol nem található egyezés. A páratlan sorokat a NULL kulcsszó adja vissza.
- A főbb JOIN típusok közé tartozik a belső, a bal oldali, a jobb oldali, a cross JOINS stb
- A JOIN műveletekben gyakran használt záradék "ON". A "USING" záradék megköveteli, hogy az egyező oszlopok azonos nevűek legyenek.
- A JOINS más tagmondatokban is használható, például a GROUP BY, WHERE, SUB QUERIES, AGGREGATE FUNCTIONS stb.