Hlavní obsah
Programování
Kurz: Programování > Kapitola 3
Lekce 3: Relační dotazy v SQL- Rozdělení dat do souvisejících tabulek
- Spojování tabulek příkazem JOIN
- Výzva: Bobovy záliby
- Spojování tabulek příkazem LEFT OUTER JOIN
- Výzva: Objednávky zákazníků
- Spojování tabulek do nich samotných
- Výzva: Další díly filmu v SQL
- Kombinace více spojení tabulek
- Výzva: FriendBook
- Projekt: Slavní lidé
- Efektivnější SQL dotazy pomocí plánování a optimalizace
Rozdělení dat do souvisejících tabulek
Zatím jsme pracovali vždy pouze s jednou tabulkou, ze které jsme dostávali zajímavá data. Ale ve skutečnosti budete většinu času pracovat s daty rozesetými v několika tabulkách, které vždy spolu nějakým způsobem souvisí.
Tak třeba mějme tabulku pro zaznamenávání výsledků testů studentů, ve které máme k dispozici i emaily těchto studentů pro případ, že bychom potřebovali napsat jejich rodičům, když by se nějaký student začal zhoršovat:
student_jmeno | student_email | test | body |
---|---|---|---|
Petr Králík | petr@kralik.cz | Výživa | 95 |
Alenka Udivená | alenka@rise-divu.cz | Výživa | 92 |
Petr Králík | petr@kralik.cz | Chemie | 85 |
Alenka Udivená | alenka@rise-divu.cz | Chemie | 95 |
Také máme tabulku pro zaznamenání, jaké knihy naši studenti čtou:
student_jmeno | kniha_nazev | kniha_autor |
---|---|---|
Petr Králík | Flopsík a Chundelatý ocásek | Beatrix Potter |
Petr Králík | Žvahlav | Lewis Carroll |
Alenka Udivená | Lovení Snárka | Lewis Carroll |
Alenka Udivená | Žvahlav | Lewis Carroll |
Můžeme také mít tabulku s detailními informacemi o našich studentech:
id | student_jmeno | student_prijmeni | student_email | telefon | narozen |
---|---|---|---|---|---|
1 | Petr | Králík | petr@kralik.cz | 555-6666 | 2001-05-10 |
2 | Alenka | Udivená | alenka@rise-divu.rd | 555-4444 | 2001-04-02 |
Co si o těchto tabulkách myslíš? Potřebují nějak pozměnit?
Musíme si uvědomit jednu věc - tyto tabulky obsahují vzájemně související data. Každá tabulka obsahuje data týkající se konkrétního studenta, a mnoho tabulek obsahuje stejná data. Pokud se stejná data objevují ve více tabulkách, může to mít zajímavé důsledky.
Tak například, co když si student změnil email? Kterou tabulku tak musíme upravit?
Potřebujeme změnit tabulku s detailními informacemi o studentovi, ale jelikož jsme tento údaj uvedli i v tabulce se známkami, musíme najít každý řádek, který se týká tohoto studenta, a email v něm upravit.
Často je tak výhodnější mít konkrétní sloupec s určitými daty uložen pouze na jednom místě, takže poté se musí upravovat data na méně místech a také je menší riziko, že budeme mít neshodující se data na různých místech. Pokud to tak uděláme, musíme znát způsob, jak spojovat vzájemně odpovídající si data napříč tabulkami. K tomu se dostaneme později.
Rozhodli jsme se tedy odstranit email z tabulky se známkami, protože jsme si uvědomili, že je zbytečné mít emaily uvedeny i zde, když je máme v tabulce s detailními informacemi o studentech. Vypadá to tedy takto:
student_jmeno | test | body |
---|---|---|
Petr Králík | Výživa | 95 |
Alenka Udivená | Výživa | 92 |
Petr Králík | Chemie | 85 |
Alenka Udivená | Chemie | 95 |
Jak ale zjistíme email každého studenta? Můžeme najít řádek v tabulce s detailními informacemi, který nese to samé jméno studenta. Co když ale budou mít dva studenti stejné jméno? (Věděli jste, že na Bali má každý člověk na výběr pouze ze 4 jmen?). Při vyhledávání studentů se tak nemůžeme spoléhat na jméno. Vlastně nikdy bychom neměli spoléhat na jména, když chceme určit něco jednoznačně.
Takže nejlepší možnost je odstranit sloupec
student_jmeno
a nahradit ho sloupcem student_id
, jelikož to je zaručeně jedinečný identifikátor:student_id | test | body |
---|---|---|
1 | Výživa | 95 |
2 | Výživa | 92 |
1 | Chemie | 85 |
2 | Chemie | 95 |
Tu samou změnu provedeme i pro naši tabulku se čtenými knihami, kdy opět použijeme sloupec
student_id
místo sloupce student_jmeno
:student_id | kniha_nazev | kniha_autor |
---|---|---|
1 | Flopsík a Chundelatý ocásek | Beatrix Potter |
1 | Žvahlav | Lewis Carroll |
2 | Lovení Snárka | Lewis Carroll |
2 | Žvahlav | Lewis Carroll |
Můžeme si všimnout, že se nám kniha Lewise Carolla Žvahlav opakuje dvakrát. To je další důvod pro to, abychom tvořili související tabulky. Jinak bychom změnu informace o této knize museli provádět na více místech.
Můžeme mít tabulku pouze pro knihy:
id | kniha_nazev | kniha_autor |
---|---|---|
1 | Flopsík a Chundelatý ocásek | Beatrix Potter |
2 | Žvahlav | Lewis Carroll |
3 | Lovení Snárka | Lewis Carroll |
Potom bude naše tabulka
student_books
, která zaznamenává právě čtené knihy, vypadat takto:student_id | book_id |
---|---|
1 | 1 |
1 | 2 |
2 | 3 |
2 | 2 |
Jistě, tato tabulka není tak snadno čitelná, jako když obsahovala všechny údaje v každém řádku. Tyto tabulky ale nejsou většinou určeny pro lidi - spíše mají co nejlépe ukládat data, být jednoduše udržovatelné a nebýt náchylné k chybám. Ve spoustě případech je tak nejlepší data rozdělit do několika souvisejících tabulek, čímž vzniká méně zbytečných dat, a také musíme tyto data upravovat na méně místech.
Je důležité vědět, jak používat SQL pro dotazování dat rozdělených mezi více souvisejících tabulek, a musíme umět tato data zpětně zobrazit, když je potřebujeme. A k tomuhle právě potřebujeme příkazy JOIN, které si ukážeme příště.
Chceš se zapojit do diskuze?
Zatím žádné příspěvky.