Co je relační databáze a SQL: vysvětlení pro začátečníky
E-shop potřebuje spolehlivě propojit zákazníky, objednávky, produkty a platby. Relační databáze tato data ukládá do přehledných tabulek a hlídá vztahy mezi nimi. Pomocí jazyka SQL pak data čteme, filtrujeme, spojujeme i měníme. Vše si ukážeme na malé databázi objednávek, kterou zvládnete vytvořit bez předchozích znalostí.
SQL v jedné ukázce
Představte si tabulku zakaznici. Otázku „Jaká jsou jména a e-maily všech zákazníků?“ zapíšeme takto:
SELECT jmeno, email
FROM zakaznici;
| jmeno | |
|---|---|
| Jana Nováková | jana@example.cz |
| Petr Svoboda | petr@example.cz |
SELECT říká, které sloupce chceme vidět, a FROM, ze které tabulky je má databáze vzít. Nic dalšího zatím nemusíte znát — stejný dotaz si později sami spustíte.
Co je databáze
Databáze je organizovaná sbírka dat, se kterou umí počítač efektivně pracovat. Nejde jen o soubor na disku. Databázový systém se stará také o vyhledávání, souběžnou práci více lidí, kontrolu pravidel, oprávnění, zálohování a obnovu po chybě.
V databázi mohou být zákazníci e-shopu, pohyby na účtu, výsledky měření, skladové zásoby nebo rezervace hotelu. Společné mají jedno: data se průběžně mění a musí zůstat správná, i když s nimi pracuje více uživatelů najednou.
Program, který data ukládá a zpracovává, se jednoduše nazývá databázový systém. Patří mezi ně například PostgreSQL, MySQL a SQLite. Pro začátek mezi nimi nemusíte vybírat — nejdřív se naučíme principy, které mají společné.
Proč se jí říká relační
Relační znamená, že tabulky nejsou izolované. Propojují se pomocí společných hodnot: objednávka například nese identifikátor zákazníka, kterému patří.
Výhoda tohoto rozdělení je jednoduchá: jméno a e-mail zákazníka uložíte jen jednou. Každá jeho objednávka pak obsahuje pouze odkaz na zákazníka. Když se e-mail změní, opravíte jeden řádek místo desítek objednávek. Tím se omezuje duplicita i riziko, že si různé kopie začnou odporovat.
Tabulky, řádky a sloupce
Tabulka
Seskupuje záznamy stejného typu, například zákazníky. Každá tabulka má název a předem danou strukturu.
Řádek
Představuje jeden konkrétní záznam: jednoho zákazníka, jednu objednávku nebo jeden produkt.
Sloupec
Popisuje jednu vlastnost záznamu, třeba e-mail, cenu nebo datum vytvoření.
Každý sloupec má datový typ. Jméno bývá text, počet celé číslo a datum má v mnoha databázích vlastní typ. Datové typy brání nesmyslům: do sloupce s počtem kusů by neměl projít text „několik“.
Přehledu tabulek, sloupců a vazeb se říká schéma databáze. Pro první dotazy si ale stačí pamatovat trojici: tabulka obsahuje řádky a každý řádek má sloupce.
Klíče a vztahy mezi tabulkami
Primární klíč: jednoznačná identita
Každý řádek by měl mít hodnotu, která ho jednoznačně určí. Tou bývá primární klíč (PRIMARY KEY), často číselný sloupec id. Dva zákazníci se mohou jmenovat stejně, ale nemohou mít stejné ID.
Cizí klíč: hlídaný odkaz
Cizí klíč (FOREIGN KEY) odkazuje na primární klíč jiné tabulky. Sloupec objednavky.zakaznik_id tak smí obsahovat jen ID zákazníka, který opravdu existuje. Databáze díky tomu nedovolí vznik „sirotčí“ objednávky bez zákazníka.
Náš příklad používá vztah 1:N: jeden zákazník může mít více objednávek. Později narazíte také na vztah 1:1 a na vztah M:N, který se řeší spojovací tabulkou. Pro první databázi je ale znát nepotřebujete.
Databáze umí hlídat i další pravidla: NOT NULL vyžaduje hodnotu, UNIQUE zakazuje duplicity a CHECK ověřuje podmínku, například že cena není záporná.
Co je SQL
SQL je zkratka pro Structured Query Language, tedy strukturovaný dotazovací jazyk. SQL nepopisuje postup krok za krokem jako běžný programovací jazyk. Říkáte jím hlavně jaký výsledek chcete a databáze sama zvolí, jak ho získá.
Například věta „najdi objednávky dražší než 1 000 Kč a seřaď je od nejnovější“ se přímo promítne do dotazu s SELECT, WHERE a ORDER BY. Pro začátek vám stačí čtyři příkazy:
CREATE TABLEvytvoří tabulku.INSERTpřidá nové řádky.SELECTdata přečte.UPDATEaDELETEdata změní nebo smažou.
První databáze krok za krokem
Vytvoříme dvě tabulky z našeho e-shopu. Ukázky jsou připravené pro SQLite, které nepotřebuje server a ukládá celou databázi do jednoho souboru.
PRAGMA foreign_keys = ON;
CREATE TABLE zakaznici (
id INTEGER PRIMARY KEY,
jmeno TEXT NOT NULL,
email TEXT NOT NULL UNIQUE
);
CREATE TABLE objednavky (
id INTEGER PRIMARY KEY,
zakaznik_id INTEGER NOT NULL,
cena_kc INTEGER NOT NULL CHECK (cena_kc >= 0),
vytvoreno TEXT NOT NULL,
FOREIGN KEY (zakaznik_id) REFERENCES zakaznici(id)
);
První řádek zapíná v SQLite kontrolu cizích klíčů. Cena je pro jednoduchost celé číslo v korunách a datum ukládáme jako text ve formátu RRRR-MM-DD. Jiné databázové systémy nabízejí pro peníze a datum specializované typy. Teď vložíme několik řádků:
INSERT INTO zakaznici (id, jmeno, email) VALUES
(1, 'Jana Nováková', 'jana@example.cz'),
(2, 'Petr Svoboda', 'petr@example.cz');
INSERT INTO objednavky (id, zakaznik_id, cena_kc, vytvoreno) VALUES
(101, 1, 1290, '2026-08-10'),
(102, 1, 490, '2026-08-12'),
(103, 2, 2150, '2026-08-13');
Textové hodnoty jsou v jednoduchých uvozovkách, čísla uvozovky nepotřebují.
Jak číst data pomocí SELECT
Nejpoužívanější příkaz SELECT už znáte z úvodní ukázky. Hvězdička v SELECT * znamená „všechny sloupce“. Při prvních pokusech je pohodlná, v běžné aplikaci je ale lepší sloupce pojmenovat. Dotaz je čitelnější a nepřenáší data, která nepotřebujete.
Filtrování, řazení a omezení počtu výsledků
SELECT id, cena_kc, vytvoreno
FROM objednavky
WHERE cena_kc >= 1000
ORDER BY vytvoreno DESC
LIMIT 5;
| id | cena_kc | vytvoreno |
|---|---|---|
| 103 | 2 150 | 2026-08-13 |
| 101 | 1 290 | 2026-08-10 |
WHERE ponechá jen řádky splňující podmínku. ORDER BY ... DESC řadí od nejvyšší hodnoty, u data tedy od nejnovějšího. LIMIT 5 vrátí nejvýše pět záznamů.
Chybějící hodnotu filtrujte pomocí IS NULL nebo IS NOT NULL, nikoli pomocí = NULL. NULL znamená, že údaj chybí nebo není známý; není to nula ani prázdný text.
Jak propojit tabulky pomocí JOIN
V objednávkách máme pouze zakaznik_id. Jméno je v tabulce zákazníků. Příkaz JOIN obě tabulky spojí podle podmínky za ON:
SELECT
z.jmeno,
o.cena_kc,
o.vytvoreno
FROM zakaznici AS z
JOIN objednavky AS o
ON o.zakaznik_id = z.id
ORDER BY o.vytvoreno DESC;
| jmeno | cena_kc | vytvoreno |
|---|---|---|
| Petr Svoboda | 2 150 | 2026-08-13 |
| Jana Nováková | 490 | 2026-08-12 |
| Jana Nováková | 1 290 | 2026-08-10 |
Zkratky z a o jsou aliasy tabulek. Dotaz díky nim zůstává krátký, ale stále je jasné, ze které tabulky každý sloupec pochází.
Když chceme souhrn za každého zákazníka, přidáme agregační funkce a seskupení:
SELECT
z.jmeno,
COUNT(o.id) AS pocet_objednavek,
SUM(o.cena_kc) AS celkem_kc
FROM zakaznici AS z
JOIN objednavky AS o
ON o.zakaznik_id = z.id
GROUP BY z.id, z.jmeno
ORDER BY celkem_kc DESC;
COUNT počítá řádky, SUM sčítá ceny a GROUP BY určuje, že se výpočet provede zvlášť pro každého zákazníka. Jana má dvě objednávky za 1 780 Kč, Petr jednu za 2 150 Kč.
Jak data bezpečně měnit
Nové řádky přidává INSERT. Existující mění UPDATE a maže DELETE. U posledních dvou příkazů je nejdůležitější podmínka WHERE:
UPDATE zakaznici
SET email = 'jana.novakova@example.cz'
WHERE id = 1;
DELETE FROM objednavky
WHERE id = 102;
Bez WHERE můžete změnit všechno
UPDATE zakaznici SET email = ... bez podmínky přepíše e-mail každému zákazníkovi. Stejně tak DELETE FROM objednavky smaže všechny objednávky. Před změnou si stejnou podmínku nejdřív ověřte pomocí SELECT.
Více souvisejících změn patří do transakce. Ta zaručí, že se provedou buď všechny, nebo žádná. Po úspěchu změny potvrdí COMMIT; při problému je vrátí ROLLBACK. Díky tomu například neodečtete peníze z jednoho účtu, aniž by se připsaly na druhý.
Relační databáze vs. Excel a NoSQL
| Nástroj | Hodí se pro | Začne být slabý, když |
|---|---|---|
| Excel / tabulka | Rychlé výpočty, malé přehledy, ruční analýza | Data mění více lidí, potřebujete vazby a přesná pravidla |
| Relační databáze | Data s jasnou strukturou, přesná pravidla, reporty a propojené záznamy | Struktura se často mění nebo se hlavní otázky týkají dlouhých cest v síti vztahů |
| NoSQL databáze | Dokumenty, klíč–hodnota, velmi pružná data či specializované úlohy | Potřebujete mnoho pevných vazeb, přesné transakce a tabulkové reporty |
Excel není „špatná databáze“ — je to jiný nástroj. Pro osobní seznam nebo jednorázovou analýzu bývá rychlejší. Relační databáze vítězí ve chvíli, kdy data živí aplikaci, musí dodržovat pravidla a pracuje s nimi více procesů současně.
NoSQL není jedna technologie ani automaticky modernější náhrada SQL. Patří sem dokumentové, klíč–hodnota, sloupcové i grafové databáze. Každá řeší jiný typ problému. Pokud vás zajímá model zaměřený na cesty a síť vztahů, přečtěte si také článek Co je grafová databáze a jak ji používají AI agenti.
Časté chyby začátečníků
- Všechno v jedné tabulce. Opakované údaje o zákazníkovi u každé objednávky vedou k duplicitám. Oddělte entity a propojte je klíči.
- Žádný primární klíč. Bez jednoznačného ID se záznamy špatně mění, odkazují i rozlišují.
- Čísla a data uložená jako text. Text „100“ se může řadit před „20“ a datum „1. 9. 2026“ se obtížně porovnává. Používejte správné typy.
- Záměna NULL, nuly a prázdného textu. Každá z těchto hodnot znamená něco jiného a databáze s nimi také jinak počítá.
- UPDATE nebo DELETE bez WHERE. Nejdřív spusťte SELECT se stejnou podmínkou a ověřte zasažené řádky.
- Skládání SQL z textu uživatele. V aplikaci nikdy nevlepujte vstup přímo do dotazu. Používejte parametrizované dotazy — chrání před SQL injection.
- Databáze bez záloh. Cizí klíče chrání vztahy, ne před omylem správce, poruchou disku nebo chybou aplikace.
Jak si SQL vyzkoušet za 20 minut
Na první pokusy nepotřebujete server. Nejjednodušší je SQLite: celá databáze může být jeden soubor a SQL si můžete spouštět v bezplatném programu DB Browser for SQLite. Bez instalace poslouží interaktivní lekce SQLBolt.
Vytvořte tabulky
Zkopírujte první blok s CREATE TABLE a spusťte ho.
Vložte ukázková data
Spusťte oba příkazy INSERT a ověřte tabulky pomocí SELECT * FROM zakaznici;.
Položte databázi vlastní otázku
Najděte objednávky nad 1 000 Kč, změňte pořadí řazení a přidejte dalšího zákazníka.
Zkuste JOIN
Vypište u každé objednávky jméno zákazníka. Potom změňte dotaz tak, aby ukázal jen Janu.
Co si odnést
- Relační databáze ukládá strukturovaná data do tabulek a propojuje je pomocí klíčů.
- Primární klíč jednoznačně určuje řádek, cizí klíč hlídá odkaz na jinou tabulku.
- SQL je jazyk pro definici, čtení a změnu dat — není to konkrétní databázový produkt.
SELECTčte data,WHEREfiltruje,ORDER BYřadí aJOINpropojuje tabulky.- Správné datové typy, omezení, transakce, parametrizované dotazy a zálohy chrání data před běžnými chybami.
Chcete se naučit SQL i práci s daty prakticky?
V kurzu Relační databáze a SQL si procvičíte návrh tabulek, vztahy i SQL dotazy od základů po pokročilejší práci s daty. Pokud chcete SQL spojit s Pythonem, vizualizací a machine learningem, navazuje kurz Datová analýza a Umělá inteligence.
Zdroje a další čtení
- PostgreSQL Tutorial — oficiální úvod do relačních databází a SQL
- SQLite SQL Language — přehled SQL podporovaného v SQLite
- SQLBolt — krátká interaktivní cvičení v prohlížeči
- OWASP: SQL Injection — proč aplikace používají parametrizované dotazy