MySQL: Relace – výběr dat ze dvou tabulek

Mějme 2 tabulky, ve kterých se nachází data, jež spolu souvisí určitým atributem. Respektive se v daném atributu dané záznamy rovnají. Pak je možné provádět výběr dat najednou z obou tabulek.

Data tabulek

--
-- Struktura tabulky `primarni`
--

CREATE TABLE `primarni` (
  `id` int(10) UNSIGNED NOT NULL,
  `znacka` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Vypisuji data pro tabulku `primarni`
--

INSERT INTO `primarni` (`id`, `znacka`) VALUES
(1, 'Škoda'),
(2, 'Fiat'),
(3, 'Seat'),
(4, 'Ford');

-- --------------------------------------------------------

--
-- Struktura tabulky `sekundarni`
--

CREATE TABLE `sekundarni` (
  `id` int(10) UNSIGNED NOT NULL,
  `majitel` varchar(50) NOT NULL,
  `auto` int(10) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Vypisuji data pro tabulku `sekundarni`
--

INSERT INTO `sekundarni` (`id`, `majitel`, `auto`) VALUES
(2, 'Žielinský', 1),
(3, 'Šerber', 2),
(4, 'Šerber', 3),
(5, 'Lukáš', 1);

--
-- Klíče pro exportované tabulky
--

--
-- Klíče pro tabulku `primarni`
--
ALTER TABLE `primarni`
  ADD PRIMARY KEY (`id`);

--
-- Klíče pro tabulku `sekundarni`
--
ALTER TABLE `sekundarni`
  ADD UNIQUE KEY `unikatni_klic` (`id`),
  ADD KEY `auto` (`auto`);

Nyní výběr a spojení dat

SELECT * FROM primarni, sekundarni WHERE primarni.id=sekundarni.auto
/* nevypíše všechna data z primární tabulky  */
Data jsou spojená, ale nevypíšou se všechny záznamy nadřízené tabulky.

Výše jde vidět, že nám chybí např. záznam s id=4 (Ford).

Spojení dat pomocí JOIN

Spojování dat lze podobně provést i pomocí (LEFT/RIGHT) JOIN. Uvedeme si tedy to nejběžnější použití. Chceme vždycky zobrazit všechny existující záznamy v nadřízené tabulce, bez ohledu, zda existují odpovídající data v tabulce podřízené. Např. záznam Ford se nám konečně také vypíše, ale data z podřízené tabulky nejsou k dispozici (hodnoty NULL).

SELECT * FROM primarni LEFT JOIN sekundarni ON primarni.id=sekundarni.auto
/* vypíše všechna data z primární tabulky, ale ne všechna z tabulky sekundární  */
Výsledek dotazu pomocí LEFT JOIN

Podmínka, která logicky sjednocuje data z obou tabulek může být zapsána i pomocí příkazu USING(pole). Je třeba si uvědomit, že pole se stejným názvem se musí nacházet v obou tabulkách. My však toto použít nemohli, jelikož provádíme spojení na polích id a auto.

Jiné formy spojení dat

Logika je podobná jako při manipulaci s množinami v matematice. INNER JOIN (průnik hodnot), LEFT JOIN (levá je nadřízená), RIGHT JOIN (pravá je nadřízená) a FULL OUTER JOIN (sjednocení všech hodnot).

Jak je to s klíči?

Jelikož nevytváříme integritní omezení, není třeba, aby klíčový sloupec v nadřízené tabulce musel obsahovat primární klíč. Tabulky mohou mít nastaven pouze unikátní klíč, což by měl být běžný standard.

Napsat komentář