Prezentace / Lekce 6 – Databáze: relační model
1 / 10
Lekce 06 · 45 min · T/P 50 / 50

Databáze jako uspořádaná paměť systému

Po dnešní hodině rozpoznáš tabulku, řádek, sloupec, primární a cizí klíč, přečteš ERDGGlosářWWikipedie CS a napíšeš vlastní SELECT ... WHERE dotaz ve vestavěném playgroundu nad reálnou SQLiteGGlosářWWikipedie CS DBGGlosářWWikipedie CS.

Učební výstup
Číst & psát základní SQL
Pracovní DB
skola.db · 4 tabulky · 142 řádků
Návaznost
Lekce 5 → klient-server
Úvodní otázka (2 min). Představ si, že Edupage ztratí všechny známky Tvé i Tvých spolužáků. Co by to pro Tebe znamenalo? Proč je uspořádané ukládání dat zásadní?
Dnes vyplníš. 6 SQL úloh v playgroundu (reálná DB, reálné výsledky) · 8 otázek v kvízu.
01 · Definice

Co je to relační databázeGGlosářWWikipedie CS?

Strukturované úložiště dat v podobě tabulek, mezi kterými jsou vztahy (relations) založeny na tzv. klíčích. Hlavní výhoda: přesné dotazování a konzistence.

Struktura

Pevné schéma: tabulky se předem definují (sloupce + datové typy).

Vztahy

Řádky v jedné tabulce odkazují na řádky v jiné přes cizí klíč.

Dotazy

Jazyk SQLGGlosářWWikipedie CS pro čtení, vkládání, úpravu a mazání dat.

Proč ne Excel?

Excel je OK pro malá data

Do tisíců řádků, jeden uživatel, jednoduchá analýza. S větším počtem dat nebo uživatelů začne být velmi problematické.

Databáze zvládne víc
  • Souběžný přístup. Tisíce uživatelů současně.
  • TransakceGGlosářWWikipedie CS. Buď se provedou všechny změny, nebo žádná.
  • IntegritaGGlosářWWikipedie CS. DB nedovolí vložit nelogická data.
  • Výkon. Dotazy nad miliony řádků v milisekundách (přes indexy).

Kde se s databázemi potkáš

Edupage/Edookit/Bakaláři

známky, rozvrhy, žáci – vše v tabulkách

E-shopy

produkty, zákazníci, objednávky

Sociální sítě

uživatelé, příspěvky, reakce

02 · Anatomie tabulky

TabulkaGGlosářWWikipedie CS = řádky + sloupce + typy

Sloupce mají jméno a datový typ. Řádky jsou konkrétní záznamy. V SQLiteGGlosářWWikipedie CS existuje jen 5 typů: INTEGER, REAL, TEXT, BLOB, NULL.

studenti · 5 sloupců · 40 řádků
id
INTEGER
jmeno
TEXT
prijmeni
TEXT
trida
TEXT
rok_nastupu
INTEGER
1BeatriceRáček2.B2024
2BělaKarkošková2.B1348
3MarieProkešová2.B822
4MichalCaha2.B805
5JakubMikoláš2.B623
SloupecGGlosářWWikipedie CS (atribut)

Svislý řez. Všechny hodnoty mají stejný datový typ. Sloupec id je primární klíč.

ŘádekGGlosářWWikipedie CS (záznam)

Vodorovný řez. Jedna konkrétní entita – v tabulce studenti jeden student.

Datové typy v SQLite

INTEGERcelá čísla (id, rok, počet)
REALdesetinná čísla (cena 199.99)
TEXTtext libovolné délky (jméno, adresa)
BLOBbinární data (obrázky) – vzácné
NULL„neznámá hodnota" – viz další slide
Pozor. SQLite nemá pravý typ DATE nebo BOOLEAN. Datum se ukládá jako TEXT ve tvaru YYYY-MM-DD, boolean jako INTEGER 0/1. Jiné DB (PostgreSQL, MySQL) mají striktnější typy – SQL přenositelnost má hranice.
03 · Klíče

Primární klíč & cizí klíč

Primární klíčGGlosářWWikipedie CS (PK) jednoznačně identifikuje řádek. Cizí klíčGGlosářWWikipedie CS (FK) odkazuje na PK v jiné tabulce – tak vzniká vztah.

Primární klíč (PK)

Nejčastěji sloupec id typu INTEGER, unikátní v rámci tabulky, nikdy NULL.

🔑 id · INTEGER PRIMARY KEY

V SQLite se INTEGER PRIMARY KEY automaticky autoinkrementuje. V MySQL bys psal AUTO_INCREMENT, v PostgreSQL SERIAL.

Cizí klíč (FK)

Sloupec, který obsahuje PK z jiné tabulky. Vytváří referenční integritu – DB nedovolí odkaz na neexistující záznam.

↗ student_id · REFERENCES studenti(id)

V SQLite se FK neovynucuje defaultně – musí se explicitně zapnout přes PRAGMA foreign_keys = ON. V našem playgroundu je zapnutý.

Další omezení (constraints)

NOT NULL

Sloupec musí mít hodnotu. „Jméno studenta nesmí chybět."

UNIQUE

Hodnota musí být v tabulce jedinečná. „Dva studenti nesmí mít stejný e-mail."

CHECK

Vlastní pravidlo. CHECK(znamka BETWEEN 1 AND 5) – známka nebude 6.

Mikroúkol – najdi vztah

Otázka ABCD
1 správná
Který sloupec v tabulce znamky je cizí klíč odkazující na primární klíč studenta?
  • A
    znamky.id
  • B
    znamky.znamka
  • C
    znamky.student_id
  • D
    znamky.datum
04 · Prerekvizita · 3 minuty

NULLGGlosářWWikipedie CS – neznámá hodnota, ne nula

NULL znamená „neznáme/chybí hodnota"není to nula, není to prázdný řetězec. A protože je „neznámá", chová se v SQL zvláštně.

🔑 Klíčové pravidlo

V SQL platí tří-hodnotová logika: TRUE, FALSE, NULL.
Jakákoli operace s NULL vrací NULL (ne TRUE ani FALSE).

Proč WHERE sloupec = NULL nikdy nenajde nic

Špatně
SELECT * FROM znamky
WHERE datum_vraceni = NULL

Výsledek: prázdný. Protože NULL = NULL je logický výraz s hodnotou NULL (ne TRUE), podmínka proto žádný řádek nepropustí.

Správně
SELECT * FROM znamky
WHERE datum_vraceni IS NULL

Operátory IS NULLIS NOT NULLjediný správný způsob, jak testovat NULL.

Další zvláštnosti NULL

NULL + 5= NULL (ne 5)
'abc' || NULL= NULL (ne 'abc')
NULL = NULL= NULL (ne TRUE!)
COUNT(*)počítá všechny řádky včetně NULL
COUNT(sloupec)počítá jen ne-NULL hodnoty
AVG(sloupec)ignoruje NULL (dělí jen počtem ne-NULL)
Kde NULL potkáš v praxi. Výpůjčky knih – dokud je kniha půjčená, datum_vraceni je NULL. Produkt bez slevy – sleva_procent je NULL. Nepovinné pole ve formuláři – NULL.
05 · Vizualizace

ERDGGlosářWWikipedie CS – entity relationship diagram

Diagram ukazuje tabulky a vztahy mezi nimi. V praxi je to první věc, kterou si programátor nakreslí, než začne psát kód.

studenti 🔑 idINTEGER jmenoTEXT prijmeniTEXT tridaTEXT rok_nastupuINTEGER predmety 🔑 idINTEGER nazevTEXT zkratkaTEXT znamky 🔑 idINTEGER ↗ student_idINTEGER ↗ predmet_idINTEGER ↗ ucitel_idINTEGER znamkaINTEGER datumDATE ucitele 🔑 id· jmeno · prijmeni · aprobace
Diagram schema skola.db · čárkovaná linka = vztah PK → FK (1 : N).
06 · Živé SQL

První dotaz – vrať řádky

Dotaz začíná od úplně nejjednoduššího: „dej mi obsah tabulky". Potom ho postupně omezíme.

Úloha 01. Vypiš prvních 10 studentů (všechny sloupce).
Všimni si. SELECTGGlosářWWikipedie CS * = „dej mi všechny sloupce". LIMIT 10 = „jen prvních 10 řádků". Obojí se dnes používá denně.
07 · Filtr

WHEREGGlosářWWikipedie CS – filtruj jen to, co potřebuješ

Zatímco SELECT určuje sloupce, WHERE určuje řádky. Kombinuj porovnání pomocí AND, OR, NOT.

Operátory
=rovná se
!= nebo <>nerovná se
<, >, <=, >=porovnání
AND, OR, NOTlogika
IN (...)je v seznamu
BETWEEN a AND bv intervalu
IS NULL / IS NOT NULLNULL test
Příklady
-- studenti ze 2.B
WHERE trida = '2.B'

-- známky lepší než 3
WHERE znamka < 3

-- studenti z 2.A nebo 2.B
WHERE trida IN ('2.A', '2.B')

-- datum z října 2025
WHERE datum BETWEEN '2025-10-01' AND '2025-10-31'
Úloha 02. Vypiš jméno, příjmení a třídu prvních 5 studentů ze třídy 2.B.
08 · Hlavní cvičení · 15 min

Šest SQL úloh v playgroundu

Úlohy seřazené od jednoduchých k složitějším. Každá má automatickou validaci – uvidíš zelený ✓ nebo červený ✗. Validátor je v režimu relaxed, takže trochu jiný SELECT (například s více sloupci) projde.

Úloha 01/06. Vypiš jen jméno a příjmení 10 studentů ze třídy 2.A.
Úloha 02/06. Vypiš název a zkratku všech předmětů, jejichž zkratka obsahuje písmeno J. (LIKE bude proberán podrobně v lekci 7, nyní využij nápovědu).
Úloha 03/06. Vypiš všechny studenty, kteří nastoupili v roce 2023.
Úloha 04/06. Kolik známek s hodnotou 1 je v DB?
Úloha 05/06. Kolik je v DB celkem studentů?
Úloha 06/06. Vypiš různé třídy, které v DB existují. Použij DISTINCT.

🛡️ Důležité varování: SQL injection

Budete-li programovat aplikaci, která skládá SQL z uživatelského vstupu – NIKDY nepoužívejte spojování řetězců.

❌ Extrémně špatně (dovoluje SQL injection):

const q = "SELECT * FROM users
  WHERE name = '" + userInput + "'";
// userInput = "'; DROP TABLE users;--"
// → SELECT * FROM users WHERE name = '';
//   DROP TABLE users;--'
// → tabulka zmizela

✅ Správně (parametrizovaný dotaz):

const q = "SELECT * FROM users
  WHERE name = ?";
db.prepare(q).run(userInput);
// Knihovna escapuje speciální
// znaky za nás – nemůže se
// spustit nic, co jsme nechtěli.

SQL injection je jedno z nejslavnějších bezpečnostních rizik (OWASP Top 10). I v roce 2026 jde pořád o velmi častou zranitelnost. Pro SŠ stačí vědět, že kódovat SQL s ručně vkládaným uživatelským textem se nesmí.

09 · Ověření

Souhrnný kvíz – 8 otázek

Otázka 1 · ABCD
1 správná
Co charakterizuje relační databázi?
  • A
    Ukládá jen text
  • B
    Uspořádá data do tabulek propojených klíči
  • C
    Běží jen v cloudu
  • D
    Používá NoSQL
Otázka 2 · ABCD
1 správná
Co platí pro primární klíč?
  • A
    Může být NULL
  • B
    V tabulce jich může být libovolný počet různých
  • C
    Je jednoznačný a nesmí být NULL
  • D
    Je vždy textový
Otázka 3 · ABCD
1 správná
K čemu slouží cizí klíč?
  • A
    Odkazuje na primární klíč v jiné tabulce, vytváří vztah
  • B
    Nahrazuje primární klíč
  • C
    Urychluje vyhledávání
  • D
    Šifruje data
Otázka 4 · ABCD
1 správná
Kterým SQL příkazem se čtou data z databáze?
  • A
    INSERT
  • B
    UPDATE
  • C
    DELETE
  • D
    SELECT
Otázka 5 · ABCD
1 správná
Jak správně zjistíš, že sloupec datum_vraceni je NULL?
  • A
    WHERE datum_vraceni = NULL
  • B
    WHERE datum_vraceni IS NULL
  • C
    WHERE datum_vraceni = 0
  • D
    WHERE datum_vraceni = ''
Otázka 6 · ABCD
1 správná
Která klauzule omezí výsledek na prvních N řádků?
  • A
    WHERE
  • B
    GROUP BY
  • C
    LIMIT
  • D
    HAVING
Otázka 7 · Multi-select
vyber všechny správné
Které pojmy patří do relačního modelu?
  • Tabulka
  • Primární klíč
  • Cizí klíč
  • Router
Otázka 8 · ABCD
1 správná
Programátor skládá SQL dotaz spojováním řetězců s uživatelským vstupem. Jaké riziko to představuje?
  • A
    SQL injection – útočník může spustit libovolný SQL kód
  • B
    Žádné, je to standardní postup
  • C
    Dotaz bude pomalejší
  • D
    Databáze bude větší