Čo sú to PRIPOJENIA?
Spojenia pomáhajú načítať údaje z dvoch alebo viacerých databázových tabuliek. Tabuľky navzájom súvisia pomocou primárneho a cudzieho kľúča.Poznámka: JOIN je najviac nepochopenou témou medzi štíhlymi klientmi SQL. Kvôli jednoduchosti a ľahkému pochopeniu budeme na precvičovanie vzoriek používať novú databázu. Ako je uvedené nižšie
id | krstné meno | priezvisko | film_id |
---|---|---|---|
1 | Adam | Smith | 1 |
2 | Ravi | Kumar | 2 |
3 | Susan | Davidson | 5 |
4 | Jenny | Adrianna | 8 |
6 | Lee | Pong | 10 |
id | titul | kategórie |
---|---|---|
1 | ASSASSINOVO TVORENIE: VSTUPY | Animácie |
2 | Real Steel (2012) | Animácie |
3 | Alvin a Chipmunkovia | Animácie |
4 | Dobrodružstvá Tin Tin | Animácie |
5 | Safe (2012) | Akcia |
6 | Bezpečný dom (2012) | Akcia |
7 | GIA | 18+ |
8 | Termín 2009 | 18+ |
9 | Špinavý obraz | 18+ |
10 | Marley a ja | Romantika |
Typy spojení
Cross JOIN
Cross JOIN je najjednoduchšia forma JOINov, ktorá porovnáva každý riadok z jednej databázovej tabuľky so všetkými riadkami druhého.
Inými slovami, dáva nám kombinácie každého riadku prvej tabuľky so všetkými záznamami v druhej tabuľke.
Predpokladajme, že chceme získať všetky záznamy členov proti všetkým filmovým záznamom, aby sme dosiahli požadované výsledky, môžeme použiť nasledujúci skript.
SELECT * FROM `movies` CROSS JOIN `members`
Vykonanie vyššie uvedeného skriptu v pracovnej ploche MySQL nám prinesie nasledujúce výsledky.
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 |
VNÚTORNÉ PRIPOJENIE
Vnútorný JOIN sa používa na vrátenie riadkov z oboch tabuliek, ktoré vyhovujú danej podmienke.
Predpokladajme, že chcete získať zoznam členov, ktorí si prenajali filmy, spolu s názvami filmov, ktoré si prenajali. Môžete na to jednoducho použiť INNER JOIN, ktorý vracia riadky z oboch tabuliek, ktoré vyhovujú daným podmienkam.
SELECT members.`first_name` , members.`last_name` , movies.`title`FROM members ,moviesWHERE movies.`id` = members.`movie_id`
Vykonanie vyššie uvedeného skriptu dať
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 |
Uvedený skript s výsledkami je možné tiež zapísať nasledujúcim spôsobom, aby ste dosiahli rovnaké výsledky.
SELECT A.`first_name` , A.`last_name` , B.`title`FROM `members`AS AINNER JOIN `movies` AS BON B.`id` = A.`movie_id`
Vonkajšie spojenia
MySQL Outer JOINs vrátia všetky záznamy zodpovedajúce z oboch tabuliek.
Môže detekovať záznamy, ktoré sa v spojenej tabuľke nezhodujú. Vráti NULL hodnoty pre evidenciu pripojila tabuľky, ak je žiadna zhoda.
Znie to zmätočne? Pozrime sa na príklad -
VĽAVO SA PRIPOJTE
Predpokladajme, že teraz chcete získať názvy všetkých filmov spolu s menami členov, ktorí si ich prenajali. Je zrejmé, že niektoré filmy si nikto neprenajal. Na tento účel môžeme jednoducho použiť LEFT JOIN .
Funkcia LEFT JOIN vráti všetky riadky z tabuľky vľavo, aj keď v tabuľke vpravo nenájdete žiadne zodpovedajúce riadky. Ak v tabuľke vpravo nenájdete žiadne zhody, vráti sa NULL.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BON B.`movie_id` = A.`id`
Vykonanie vyššie uvedeného skriptu v pracovnom stole MySQL dáva. Vidíte, že vo vrátenom výsledku, ktorý je uvedený nižšie, sú v prípade polí, ktoré nie sú prenajaté, hodnoty mien členov hodnoty NULL. To znamená, že pre tento konkrétny film nebol nájdený žiadny člen tabuľky členov.
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 |
SPRÁVNE SA PRIPOJTE
RIGHT JOIN je zjavným opakom LEFT JOIN. PRAVÉ SPOJENIE vráti všetky stĺpce z tabuľky vpravo, aj keď v tabuľke vľavo nenájdete žiadne zodpovedajúce riadky. Ak sa v tabuľke vľavo nenašli žiadne zhody, vráti sa NULL.
V našom príklade predpokladajme, že musíte získať mená členov a filmy, ktoré si prenajali. Teraz máme nového člena, ktorý si zatiaľ žiadny film neprenajal
SELECT A.`first_name` , A.`last_name`, B.`title`FROM `members` AS ARIGHT JOIN `movies` AS BON B.`id` = A.`movie_id`
Vykonanie vyššie uvedeného skriptu v pracovnej ploche MySQL poskytne nasledujúce výsledky.
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 |
Klauzuly „ON“ a „POUŽÍVANIE“
Vo vyššie uvedených príkladoch dotazu JOIN sme na zosúladenie záznamov medzi tabuľkami použili klauzulu ON.
Na ten istý účel je možné použiť aj klauzulu USING. Rozdiel oproti POUŽITIU spočíva v tom, že v oboch tabuľkách musia byť rovnaké názvy zhodných stĺpcov.
V tabuľke „filmy“ sme doteraz používali jej primárny kľúč s názvom „id“. To isté sme v tabuľke „členovia“ označili názvom „movie_id“.
Premenujeme pole „filmy“ na tabuľky „id“, aby malo názov „movie_id“. Robíme to preto, aby sme mali rovnaké zhodné názvy polí.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
Ďalej použijeme USING s vyššie uvedeným príkladom LEFT JOIN.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BUSING ( `movie_id` )
Okrem používania ZAPNUTIA a POUŽÍVANIA s JOINmi môžete použiť mnoho ďalších klauzúl MySQL, ako je GROUP BY, WHERE a dokonca aj funkcie ako SUM , AVG atď.
Prečo by sme mali používať spojenia?
Teraz si možno myslíte, prečo používame JOINy, keď môžeme robiť rovnaké úlohy pri spúšťaní dotazov. Najmä ak máte skúsenosti s programovaním databázy, viete, že dokážeme spúšťať dotazy jeden po druhom, výstup každého z nich použite v postupných dotazoch. To je samozrejme možné. Ale pomocou JOINov môžete prácu dokončiť použitím iba jedného dotazu s ľubovoľnými parametrami vyhľadávania. Na druhej strane môže MySQL dosiahnuť lepší výkon s JOINmi, pretože môže používať indexovanie. Jednoduchým použitím jedného dotazu JOIN namiesto spustenia viacerých dotazov sa zníži réžia servera. Namiesto toho použitie viacerých dotazov, ktoré vedie k viac dátovým prenosom medzi MySQL a aplikáciami (softvérom). Ďalej to vyžaduje viac manipulácie s dátami aj na konci aplikácie.
Je zrejmé, že použitím JOINov môžeme dosiahnuť lepšie MySQL a výkonnosť aplikácií.
Zhrnutie
- JOINS nám umožňujú kombinovať údaje z viac ako jednej tabuľky do jednej množiny výsledkov.
- JOINS majú lepší výkon v porovnaní s poddotazmi
- INNER JOINS vráti iba riadky, ktoré zodpovedajú daným kritériám.
- VONKAJŠIE SPOJENIA môžu tiež vrátiť riadky, kde sa nenašli žiadne zhody. Nepriradené riadky sa vrátia s kľúčovým slovom NULL.
- Medzi hlavné typy JOIN patria vnútorné, ľavé vonkajšie, pravé vonkajšie, krížové spojenia atď.
- Často používaná klauzula v operáciách JOIN je "ON". Klauzula „USING“ vyžaduje, aby zodpovedajúce stĺpce mali rovnaký názov.
- JOINS sa dajú použiť aj v iných klauzulách, ako napríklad GROUP BY, WHERE, SUB QUERIES, AGREGATE FUNCTIONS atď.