Při práci s databází možná budete muset dát dohromady data z několika různých tabulek. Tento článek vám ukáže, jak na to.
O spojeních SQL jsem již psal zde a zde, ale pojďme si nejprve na chvíli prohlédnout, jak spojení funguje, a zejména syntaxi specifickou pro MySQL.
Prohlášení SQL Join
Join je příkaz, který vám umožní sestavit dvě tabulky, spárovat řádky, které spolu souvisejí, a ponechat pouze řádky, které lze spárovat, nikoli nezachovat nespárované řádky.
SELECT * FROM table1
INNER JOIN table2
ON table1.id = table2.id;
SELECT ... FROM
příkaz udává, která je první tabulka, pak se název druhé tabulky zapíše hned za INNER JOIN
klíčová slova.
Jak mají být tyto dvě tabulky spojeny, je napsáno v ON
prohlášení. V tomto případě jsou dvě tabulky spojeny pomocí vztahu table1.id = table2.id
.
Je možné použít více příkazů spojení dohromady pro spojení více než jedné tabulky současně.
SELECT *
FROM table1
INNER JOIN table2
ON table1.id = table2.id
INNER JOIN table3
ON table2.id = table3.id;
Chcete-li to provést, přidejte druhý INNER JOIN
a druhý ON
příkaz k označení třetí tabulky a druhého vztahu.
Pojďme si chvíli promluvit o vztazích, které můžete mít mezi stoly, a o tom, proč byste mohli chtít spojit tři stoly dohromady.
Vztahy mezi tabulkami v SQL
Když máte tabulky, které spolu souvisejí, jejich vztahy mohou být různého typu.
jeden k mnoha
Ve vztahu jeden k mnoha může být jeden řádek první tabulky spojen s více řádky druhé tabulky.
V relační databázi to lze implementovat pomocí druhé tabulky s first_table_id
sloupec, který říká, ke kterému řádku první tabulky daný řádek souvisí.
mnoho-to-one
V typu vztahu mnoho ku jedné může být jeden řádek první tabulky spojen s jedním řádkem druhé tabulky a jeden řádek druhé tabulky může souviset s více řádky první tabulky.
V relační databázi to lze implementovat tak, že první tabulka má second_table_id
sloupec, který říká, ke kterému řádku druhé tabulky daný řádek souvisí.
mnoho-k-mnoho
V tomto případě více řádků souvisí s více řádky.
Tento druh vztahu nelze reprezentovat jako u tabulek SQL – musíte mezi dvě tabulky přidat spojovací tabulku, aby mezi tabulkami byly přítomny pouze vztahy mnoho ku jedné a jedna k mnoha.
Každý řádek tabulky uprostřed představuje jeden vztah mezi řádky levé tabulky a řádky pravé tabulky.
V praxi v MySQL bude mít tato prostřední tabulka sloupec pro first_table_id
a sloupec pro second_table_id
, přičemž každá kombinace je jedinečná.
Spojování tabulek SQL v praxi
Představme si, že máme databázi organizace, kde máme tabulku s týmy (jejich název a další identifikační údaje) a tabulku s projekty (jméno, průběh atd.).
id | název_týmu | specialita |
---|---|---|
1 | Vrhače banánů | Banány |
2 | Ohryzávače dřeva | Ohryzávání dřeva |
3 | Růžoví sloni | Dupání na zem |
4 | Načechrané brambory | Práce a spánek |
id | název_projektu | pokrok |
---|---|---|
1 | Stavba přehrady | Potřebujeme ještě ohlodávat dřevo a dusat půdu |
2 | Banánový dort | Někdo jí všechny banány |
3 | Průzkum spánku | Příliš mnoho spánku nestačí na výzkum |
Protože tým může pracovat na více projektech a na projektu může pracovat více týmů, existuje také třetí tabulka, která sleduje zápasy týmů a projektů.
id_projektu | id_skupiny |
---|---|
1 | 2 |
1 | 3 |
2 | 1 |
3 | 1 |
3 | 2 |
3 | 3 |
3 | 4 |
Můžeme použít JOIN
příkaz, abychom dali vše dohromady, když potřebujeme zobrazit informace z tabulek způsobem čitelným pro člověka, jako je tento:
SELECT
teams.team_name AS team_name,
projects.project_name AS project_name
FROM TABLE teams
INNER JOIN matches
ON teams.id = matches.team_id
INNER JOIN matches
ON matches.project_id = projects.id
ORDER BY teams.id;
Pomocí SELECT
vybereme, které sloupce se z každé tabulky zobrazí prohlášení.
Určujeme, jak se mají řádky tabulek kombinovat s ON
prohlášení.
Řádky řadíme způsobem, který preferujeme, pomocí ORDER BY
prohlášení.
ON
prohlášení teams.id = matches.team_id
a matches.projects_id = projects.id
znamená, že řádky jsou kombinovány pomocí řádků matches
stůl. Každý řádek výstupní tabulky obsahuje název projektu a název týmu kombinovaný pomocí párů ID projektu a ID týmu v matches
tabulka.
Výstupní tabulka bude vypadat níže.
Název_týmu | Název_projektu |
---|---|
Vrhače banánů | Banánový dort |
Vrhače banánů | Průzkum spánku |
Ohryzávače dřeva | Budování přehrady |
Ohryzávače dřeva | Průzkum spánku |
Růžoví sloni | Stavba přehrady |
Růžoví sloni | Stavba přehrady |
Načechrané brambory | Průzkum spánku |
Neexistuje žádný sloupec přímo z matches
stůl. matches
tabulka se ve výstupu nezobrazuje, ale používá se jako návod, jak kombinovat řádky teams
a projects
tabulky.
Závěr
JOIN
příkaz umožňuje spojit jednu nebo více tabulek. Musí být použit ve spojení s ON
příkaz k určení vztahu mezi řádky tabulky a řádky jiné tabulky.
V tomto článku jste se naučili používat JOIN
příkaz ke spojení tří různých tabulek.