Co jsou to JOINS?
Spojení pomáhá načítat data ze dvou nebo více databázových tabulek. Tabulky vzájemně souvisí pomocí primárního a cizího klíče.Poznámka: JOIN je nejvíce nepochopené téma mezi štíhlé SQL. Kvůli jednoduchosti a snadnému pochopení budeme k procvičování vzorku používat novou databázi. Jak je ukázáno níže
id | jméno | příjmení | film_id |
---|---|---|---|
1 | Adam | Kovář | 1 |
2 | Ravi | Kumar | 2 |
3 | Susan | Davidson | 5 |
4 | Jenny | Adrianna | 8 |
6 | Závětří | Pong | 10 |
id | titul | kategorie |
---|---|---|
1 | ASSASSIN'S CREED: EMBERS | Animace |
2 | Real Steel (2012) | Animace |
3 | Alvin a Chipmunkové | Animace |
4 | The Adventures of Tin Tin | Animace |
5 | Safe (2012) | Akce |
6 | Safe House (2012) | Akce |
7 | GIA | 18+ |
8 | Termín 2009 | 18+ |
9 | Špinavý obraz | 18+ |
10 | Marley a já | Romantika |
Typy spojení
Cross JOIN
Cross JOIN je nejjednodušší forma JOIN, která odpovídá každému řádku z jedné databázové tabulky do všech řádků jiné.
Jinými slovy, dává nám kombinace každého řádku první tabulky se všemi záznamy ve druhé tabulce.
Předpokládejme, že chceme získat všechny záznamy členů proti všem záznamům filmů, můžeme použít požadované skripty a získat požadované výsledky.
SELECT * FROM `movies` CROSS JOIN `members`
Provedení výše uvedeného skriptu v pracovní ploše MySQL nám dává následující 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 |
VNITŘNÍ SPOJENÍ
Vnitřní JOIN se používá k vrácení řádků z obou tabulek, které splňují danou podmínku.
Předpokládejme, že chcete získat seznam členů, kteří si pronajali filmy, spolu s názvy filmů, které si pronajali. K tomu můžete jednoduše použít INNER JOIN, který vrací řádky z obou tabulek, které splňují dané podmínky.
SELECT members.`first_name` , members.`last_name` , movies.`title`FROM members ,moviesWHERE movies.`id` = members.`movie_id`
Provedení výše uvedeného skriptu dát
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 |
Všimněte si, že výše uvedený skript výsledků lze také napsat následujícím způsobem, abyste dosáhli stejných výsledků.
SELECT A.`first_name` , A.`last_name` , B.`title`FROM `members`AS AINNER JOIN `movies` AS BON B.`id` = A.`movie_id`
Vnější spojení
MySQL Outer JOINs vrací všechny záznamy odpovídající z obou tabulek.
Může detekovat záznamy, které se v připojené tabulce neshodují. Vrátí hodnoty NULL pro záznamy spojené tabulky, pokud není nalezena shoda.
Zní to matoucí? Podívejme se na příklad -
VLEVO SE PŘIPOJTE
Předpokládejme, že nyní chcete získat tituly všech filmů společně se jmény členů, kteří si je pronajali. Je zřejmé, že některé filmy si nikdo nepůjčil. Pro tento účel můžeme jednoduše použít LEFT JOIN .
Funkce LEFT JOIN vrací všechny řádky z tabulky vlevo, i když v tabulce vpravo nebyly nalezeny žádné odpovídající řádky. Pokud v tabulce vpravo nebyly nalezeny žádné shody, vrátí se NULL.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BON B.`movie_id` = A.`id`
Provedení výše uvedeného skriptu na pracovní ploše MySQL dává. Můžete vidět, že ve vráceném výsledku, který je uveden níže, jsou u polí, která nejsou pronajata, pole názvu člena hodnoty NULL. To znamená, že nebyl nalezen žádný odpovídající členská tabulka členů pro konkrétní film.
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ÁVNĚ SE PŘIPOJTE
RIGHT JOIN je zjevně opakem LEFT JOIN. PRAVÉ PŘIPOJENÍ vrátí všechny sloupce z tabulky vpravo, i když v tabulce vlevo nebyly nalezeny žádné odpovídající řádky. Pokud v tabulce vlevo nebyly nalezeny žádné shody, vrátí se NULL.
V našem příkladu předpokládejme, že potřebujete získat jména členů a filmy, které si pronajali. Nyní máme nového člena, který si zatím žádný film nepůjčil
SELECT A.`first_name` , A.`last_name`, B.`title`FROM `members` AS ARIGHT JOIN `movies` AS BON B.`id` = A.`movie_id`
Provedení výše uvedeného skriptu v pracovní ploše MySQL poskytuje následující 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 |
Klauzule „ZAPNUTO“ a „POUŽÍVÁNÍ“
Ve výše uvedených příkladech dotazu JOIN jsme použili klauzuli ON k porovnání záznamů mezi tabulkou.
Klauzuli USING lze také použít pro stejný účel. Rozdíl oproti POUŽITÍ spočívá v tom, že v obou tabulkách musí být shodné názvy shodných sloupců.
V tabulce „filmy“ jsme dosud používali její primární klíč se jménem „id“. Totéž jsme v tabulce „členové“ označili názvem „movie_id“.
Pojmenujme pole „filmy“ tabulky „id“, aby mělo název „movie_id“. Děláme to, abychom měli shodné názvy polí.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
Dále použijeme POUŽITÍ s výše uvedeným příkladem LEFT JOIN.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BUSING ( `movie_id` )
Kromě použití ZAPNUTO a POUŽÍVÁNÍ s JOINy můžete použít mnoho dalších klauzulí MySQL, jako je GROUP BY, WHERE a dokonce i funkce jako SUM , AVG atd.
Proč bychom měli používat spojení?
Nyní si možná pomyslíte, proč používáme JOINy, když můžeme dělat stejný úkol se spuštěním dotazů. Zvláště pokud máte nějaké zkušenosti s programováním databáze, víte, že můžeme spouštět dotazy jeden po druhém, použijte výstup každého z nich v postupných dotazech. To je samozřejmě možné. Ale pomocí JOINů můžete práci dokončit pomocí pouze jednoho dotazu s libovolnými parametry vyhledávání. Na druhou stranu MySQL může dosáhnout lepšího výkonu s JOINy, protože může používat indexování. Pouhé použití jednoho dotazu JOIN namísto spuštění více dotazů snižuje režii serveru. Místo toho použití více dotazů, které vede k více datovým přenosům mezi MySQL a aplikacemi (softwarem). Dále to vyžaduje více manipulace s daty na konci aplikace také.
Je jasné, že můžeme dosáhnout lepších MySQL a výkonů aplikací pomocí JOINů.
souhrn
- JOINS nám umožňují kombinovat data z více než jedné tabulky do jedné sady výsledků.
- JOINS mají lepší výkon ve srovnání s dílčími dotazy
- INNER JOINS vrátí pouze řádky, které splňují zadaná kritéria.
- VNĚJŠÍ PŘIPOJENÍ mohou také vrátit řádky, kde nebyly nalezeny žádné shody. Nepřidružené řádky jsou vráceny s klíčovým slovem NULL.
- Mezi hlavní typy JOIN patří vnitřní, levý vnější, pravý vnější, křížový JOINS atd.
- Často používaná klauzule v operacích JOIN je „ON“. Klauzule „USING“ vyžaduje, aby shodné sloupce byly se stejným názvem.
- JOINS lze také použít v jiných klauzulích, jako je GROUP BY, WHERE, SUB QUERIES, AGREGATE FUNCTIONS atd.