Nikdy nevíš, kdy to přijde
Zobrazit menu   MENU

10. Spojování více tabulek - pokročilé

V minulém díle jsme si ukázali jako jednoduše spojit 2 tabulky, které mají odpovídající sloupec a zobrazit všechny odpovídající řádky. Kromě základního INNER JOIN, který jsme již zkoušeli existují další možnosti spojení.

V příkladech níže je spojování použito pouze v kombinaci se SELECT což je nejobvyklejší. Použít ho lze ale i při mazání nebo aktualizaci dat.


LEFT JOIN

Neboli LEFT OUTER JOIN (vnější spojení) nám umožnuje spojit tabulky takovým způsovem, kdy z levé (prvně jmenované) tabulky se použití i takové řádky, které nemají odpovídající hodnotu v tabulce druhé. Do požadovaných sloupců z připojované tabulky, kde nebyl žádný odpovídající řádek se doplní NULL.

V naší databázi knih si to vyzkoušíme na výpisu hodnocení. Necháme si vypsat seznam všech knih a jejich jednotlivých hodnocení.
SELECT knihy.nazev, hodnoceni.hodnoceni
FROM knihy LEFT JOIN hodnoceni ON knihy.kniha_id = hodnoceni.kniha_id;


Ve výpisu z databáze dostaneme vypsaná všechna jednotlivá hodnocení s knihami, a také knihu Záskok, která žádné hodnocení uložené nemá, proto je hodnota sloupce z tabulky hodnoceni NULL.
+------------------+-----------+
| nazev            | hodnoceni |
+------------------+-----------+
| Duna             |        10 |
| Duna             |         9 |
| Duna             |        10 |
| Duna             |        10 |
| Duna             |        10 |
| Duna             |         9 |
| Malý princ       |         8 |
| Malý princ       |        10 |
| Malý princ       |         8 |
| Malý princ       |         9 |
| Malý princ       |         9 |
| Svět ledu a ohně |         7 |
| Svět ledu a ohně |         5 |
| Svět ledu a ohně |         5 |
| Záskok           |      NULL |
+------------------+-----------+


RIGHT JOIN

RIGHT JOIN je obdobná varianta, ale s opačnou logikou. Všechny řádky z druhé tabulky budou zahrnuty, ikdyž nemaji odpovídající hodnotu v tabulce první. Ve ničem další se od LEGT JOIN neliší, je tedy zbytečně se tímto spojením zabývat detailněji.


NATURAL JOIN

NATURAL JOIN funguje podobně jako INNER JOIN z minulé kapitoly. Pokud si výraz přeložíme, dostaneme Přirozené spojení. To v kontextu MySQL databáze znamená, že se spojení využíjí sloupce které se k tomu "přirozeně nabízejí", tedy sloupce se stejným názvem. Není pak nutné použít klauzuli ON a specifikování spojovaných sloupců. NATURAL JOIN neumožnuje žádnou jinou funcionalitu než klasický JOIN, ale může zjednoduššit zápis.

SELECT knihy.nazev, vydani_knihy.isbn
FROM knihy NATURAL JOIN vydani_knihy;


Po spuštění tohoto dotazu dostaneme výpis jednotlivých vydání knih a jejich ISBN. Obě tabulky obsahuji sloupec kniha_id, na základě kterého se provedl INNER JOIN:

+------------------+-------------------+
| nazev            | isbn              |
+------------------+-------------------+
| Duna             | 978-80-269-0517-2 |
| Duna             | 978-80-269-0063-4 |
| Duna             | 80-205-0001-4     |
| Malý princ       | 978-80-7549-803-8 |
| Malý princ       | 978-80-00-04733-1 |
| Záskok           | 80-7185-290-2     |
| Svět ledu a ohně | 978-80-7197-550-2 |
+------------------+-------------------+


Při použít INNER JOIN musí mít tabulky právě jeden stejně pojmenovaný sloupec. Pokud jich bude více, nebo žádný, skončí dotaz chybou.



CROSS JOIN

CROSS JOIN má obodnbý zápis jako NATURAL JOIN - tedy vynechává se ON a nespecifikují se sloupce ke spojení. Výsledkem takového spojení je kartézský součin - to znamená každý řádek z tabulky A s každým řádkem z tabulky B.

Pokud budeme mít tabulku A s 10 řádky a tabulku B s 15 řádky. Po CROSS JOIN dostaneme výsledek dotazu, který bude obsahovat 150 řádků - veškeré možné kombinace. Spojení uvádím spíše pro zajímavost, žádný způsob reálného využití mě nenapadá.


Spojení více než 2 tabulek

Zatím jsme pro jednoduchost spojovali pouze 2 tabulky, ale nic nám nebrání spojovat třeba 10 různých tabulek. V naší databází máme tabulku pro knihy a další pro jejich autory. Jde o vztah N:M, a jak jsme si již dříve říkali, v takovém případě je nutná další spojovací tabulka. Tou je v našem případě knihy_autori. Abychom tedy byly schopni vypsat knihy a jejich autory, musíme celkem pospojovat 3 tabulky:

SELECT knihy.nazev, autori.jmeno, autori.prijmeni
FROM knihy
JOIN knihy_autori ON knihy.kniha_id = knihy_autori.kniha_id
JOIN autori ON autori.autor_id = knihy_autori.autor_id;


Jak je názorně vidět z dotazu, můžeme jednoduše opakovat celou spojovací část: JOIN tabulka ON spojeni. Jako výsledek dostáváme:

+------------------+----------+------------------+
| nazev            | jmeno    | prijmeni         |
+------------------+----------+------------------+
| Duna             | Frank    | Herbert          |
| Malý princ       | Antoine  | de Saint-Exupéry |
| Záskok           | Ladislav | Smoljak          |
| Záskok           | Zdeněk   | Svěrák           |
| Svět ledu a ohně | Elio     | García           |
| Svět ledu a ohně | Linda    | Antonsson        |
+------------------+----------+------------------+



Spojení 3+ tabulek bez JOIN

V minulém díle tutoriálu jsme si ukazovali, že JOIN můžeme nahradit spojením přes WHERE. To můžeme samozřejmě udělat i v případě více tabulek. Dotaz se stejným výsledkem jako předchozí by pak vypadal takto:

SELECT knihy.nazev, autori.jmeno, autori.prijmeni
FROM knihy, autori, knihy_autori
WHERE knihy.kniha_id = knihy_autori.kniha_id AND autori.autor_id = knihy_autori.autor_id;



Další díly tutoriálu

8. Pokročilé podmínky výběru
9. Spojování více tabulek - základy
10. Spojování více tabulek - pokročilé
11. Agregační funkce
12. Poddotazy