Výukový program pre MySQL JOINS: VNÚTORNÝ, VONKAJŠÍ, ĽAVÝ, PRAVÝ, PRIEČNY

Anonim

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

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

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