V minulém díle jsme si řekli, jak na základní práci s daty. Naučili jsme se vypsat jednotlivé záznamy splňující podmínky, řekli jsme si něco o regulárních výrazech a dnes se podíváme na to, jak spojit tabulky a vypsat data z výsledného spojení.
JOIN je jedna z konstrukcí jazyka SQL, slouží ke spojování dvou a více tabulek k realizaci SELECTu.
SELECT seznam_sloupců FROM tabulka_1 [CROSS|INNER|NATURAL|LEFT|RIGHT|[FULL ]OUTER] JOIN tabulka_2 ON podmínka [WHERE podmínka] [ORDER BY sloupce] [LIMIT počet_záznamů];
Existuje několik variant spojování tabulek, zde jsou vyjmenovány:
INNER JOIN, tedy vnitřní spojení, je jedním z nejvíce používaných spojení vstupních množin, většinou tabulek, v praxi. V podstatě jde o křížové spojení, které je oříznuté na výstupu o záznamy, které nevyhovují použité podmínce.
SELECT a.sloupec1, a.sloupec2, b.sloupec1, b.sloupec2 FROM tabulka1 a, tabulka2 b WHERE a.sloupec1 = b.sloupec1;
SELECT a.sloupec1, a.sloupec2, b.sloupec1, b.sloupec2 FROM tabulka1 a INNER JOIN tabulka2 b ON a.sloupec1 = b.sloupec2;
CROSS JOIN, tedy křížové spojení, se chová jako kartézský součin vstupních množin, obvykle tabulek. Výsledná množina je tak tedy velice obsáhlá.
SELECT a.sloupec1, a.sloupec2, b.sloupec1, b.sloupec2 FROM tabulka1 a INNER JOIN tabulka2 b ON 1 = 1;
SELECT a.sloupec1, a.sloupec2, b.sloupec1, b.sloupec2 FROM tabulka1 a CROSS JOIN tabulka2 b;
SELECT a.sloupec1, a.sloupec2, b.sloupec1, b.sloupec2 FROM tabulka1 a, tabulka2 b;
NATURAL JOIN, tedy přirozené spojení, je velmi zvláštním případem spojení vstupních množin, protože automaticky spojuje vstupní množiny podle datových typů a názvů sloupců ve spojovaných vstupních množinách. Tento typ se velmi málo použivá, už jen kvůli nemožnosti cokoli definovat.
SELECT a.sloupec1, a.sloupec2, b.sloupec1, b.sloupec2 FROM tabulka1 a NATURAL JOIN tabulka2 b;
OUTER JOIN, tedy vnější spojení, funguje podobně jako vnitřní spojení, vygeneruje výstupní množinu ze vstupních množin tak, že zahodí ty záznamy, které nesplňují spojovací podmínku. OUTER JOIN se liší od vnitřního tak, že pokud není k řádku nalezen v druhé množině vhodný záznam, je řádek vyplněn hodnotami NULL.
SELECT a.sloupec1, a.sloupec2, b.sloupec1, b.sloupec2 FROM tabulka1 a OUTER JOIN tabulka2 b ON a.sloupec1 = b.sloupec1;
FULL OUTER JOIN, tedy úplné vnější spojení, funguje stejně jako OUTER JOIN (vnější spojení), jen při nenalezení vhodného záznamu z druhé množiny nahradí hodnoty v řádcích obou množin hodnotami NULL.
SELECT a.sloupec1, a.sloupec2, b.sloupec1, b.sloupec2 FROM tabulka1 a FULL OUTER JOIN tabulka2 b ON a.sloupec1 = b.sloupec1;
[LEFT, RIGHT] JOIN, tedy částečné spojení, říká, která z množin bude mít zahrnuty všechny své záznamy ve výstupní množině a která z nich bude tedy vyplňena hodnotami NULL při nesplnění podmínky.
Máme tabulku 'autori' a 'tabulku' prispevky. V tabulce 'autori' je uloženo id a jméno. V tabulce 'příspěvky' jsou uloženy id autora a text příspěvku. V tomto příkladu chceme, aby se nám jedním příkazem místo id v tabulce příspěvky načetlo jméno autora, kterému id patří.
select a.jmeno from autori a left join prispevky p on a.id=p.autor