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.