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.
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.
Pevné schéma: tabulky se předem definují (sloupce + datové typy).
Řádky v jedné tabulce odkazují na řádky v jiné přes cizí klíč.
Jazyk SQLGGlosářWWikipedie CS pro čtení, vkládání, úpravu a mazání dat.
Proč ne Excel?
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é.
- 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áš
známky, rozvrhy, žáci – vše v tabulkách
produkty, zákazníci, objednávky
uživatelé, příspěvky, reakce
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.
| id INTEGER |
jmeno TEXT |
prijmeni TEXT |
trida TEXT |
rok_nastupu INTEGER |
|---|---|---|---|---|
| 1 | Beatrice | Ráček | 2.B | 2024 |
| 2 | Běla | Karkošková | 2.B | 1348 |
| 3 | Marie | Prokešová | 2.B | 822 |
| 4 | Michal | Caha | 2.B | 805 |
| 5 | Jakub | Mikoláš | 2.B | 623 |
Svislý řez. Všechny hodnoty mají stejný datový typ. Sloupec id je primární klíč.
Vodorovný řez. Jedna konkrétní entita – v tabulce studenti jeden student.
Datové typy v SQLite
| INTEGER | celá čísla (id, rok, počet) |
| REAL | desetinná čísla (cena 199.99) |
| TEXT | text libovolné délky (jméno, adresa) |
| BLOB | binární data (obrázky) – vzácné |
| NULL | „neznámá hodnota" – viz další slide |
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.
Nejčastěji sloupec id typu INTEGER, unikátní v rámci tabulky, nikdy NULL.
V SQLite se INTEGER PRIMARY KEY automaticky autoinkrementuje. V MySQL bys psal AUTO_INCREMENT, v PostgreSQL SERIAL.
Sloupec, který obsahuje PK z jiné tabulky. Vytváří referenční integritu – DB nedovolí odkaz na neexistující záznam.
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)
Sloupec musí mít hodnotu. „Jméno studenta nesmí chybět."
Hodnota musí být v tabulce jedinečná. „Dva studenti nesmí mít stejný e-mail."
Vlastní pravidlo. CHECK(znamka BETWEEN 1 AND 5) – známka nebude 6.
Mikroúkol – najdi vztah
- Aznamky.id
- Bznamky.znamka
- Cznamky.student_id
- Dznamky.datum
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
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í.
WHERE datum_vraceni IS NULL
Operátory IS NULL a IS NOT NULL – jediný 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) |
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.
První dotaz – vrať řádky
Dotaz začíná od úplně nejjednoduššího: „dej mi obsah tabulky". Potom ho postupně omezíme.
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.
| = | rovná se |
| != nebo <> | nerovná se |
| <, >, <=, >= | porovnání |
| AND, OR, NOT | logika |
| IN (...) | je v seznamu |
| BETWEEN a AND b | v intervalu |
| IS NULL / IS NOT NULL | NULL test |
-- 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'
Š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.
🛡️ 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í.
Souhrnný kvíz – 8 otázek
- AUkládá jen text
- BUspořádá data do tabulek propojených klíči
- CBěží jen v cloudu
- DPoužívá NoSQL
- AMůže být NULL
- BV tabulce jich může být libovolný počet různých
- CJe jednoznačný a nesmí být NULL
- DJe vždy textový
- AOdkazuje na primární klíč v jiné tabulce, vytváří vztah
- BNahrazuje primární klíč
- CUrychluje vyhledávání
- DŠifruje data
- AINSERT
- BUPDATE
- CDELETE
- DSELECT
- AWHERE datum_vraceni = NULL
- BWHERE datum_vraceni IS NULL
- CWHERE datum_vraceni = 0
- DWHERE datum_vraceni = ''
- AWHERE
- BGROUP BY
- CLIMIT
- DHAVING
- ✓Tabulka
- ✓Primární klíč
- ✓Cizí klíč
- ✓Router
- ASQL injection – útočník může spustit libovolný SQL kód
- BŽádné, je to standardní postup
- CDotaz bude pomalejší
- DDatabáze bude větší