🗄️ Databáze a SQL

🗄️ Databáze a SQL

SQL není programovací jazyk - je to dotazovací jazyk pro práci s daty. 90 % webových aplikací používá databáze (účty uživatelů, objednávky, produkty). Bez SQL neumíte ukládat data trvale - vše zmizí po restartu aplikace. Tento návod vám ukáže, jak se naučit databáze a SQL od nuly.

První kroky (30 minut)

1 Stáhněte si SQLite Browser

Jděte na sqlitebrowser.org, stáhněte verzi pro váš OS. Instalace: next, next, finish. Proč SQLite: Databáze v jednom souboru, žádný server, funguje okamžitě.

2 Vytvořte první databázi

Otevřete SQLite Browser → New Database → pojmenujte "test.db" → uložte. Proč: Databáze = soubor, kde ukládáte data ve strukturované podobě (tabulky, řádky, sloupce).

3 Napište první SQL příkaz

Záložka "Execute SQL" → napište: SELECT 'Hello World'; → klikněte "Run". Uvidíte výstup. Proč: SQL = příkazy pro práci s daty. Každý příkaz končí středníkem.

Realistická očekávání: První týden budete googlit syntaxi SQL každých 5 minut. Po měsíci: znáte SELECT, INSERT, UPDATE, DELETE (= 80 % práce s databázemi). Po 3 měsících: umíte JOIN, indexy, normalizaci. SQL není těžké - syntax je omezená, jen se učíte myslet "tabulkově".
Tip: SQL píšete VELKÝMI PÍSMENY (SELECT, FROM, WHERE) - konvence, ne povinnost. Pomáhá to čitelnosti (klíčová slova vs. názvy tabulek).

Co je databáze a k čemu slouží

Databáze = strukturované úložiště dat (tabulky s řádky a sloupci). Jako Excel, ale s pravidly a rychlé i pro miliony řádků.

Proč ne prostý soubor (txt, JSON)?

  • Rychlost: Databáze má indexy - najde 1 záznam z milionu za milisekundy. V textovém souboru = musíte číst celý soubor.
  • Konzistence: Nemůžete uložit text do sloupce pro čísla (databáze odmítne). V JSON/txt = uložíte cokoliv, pak aplikace spadne.
  • Současný přístup: Více uživatelů může zapisovat najednou bez kolizí. V souboru = data se přepíšou chaoticky.

Typy databází

Relační databáze (SQL): Data v tabulkách, vztahy mezi tabulkami. Příklady: MySQL, PostgreSQL, SQLite, Microsoft SQL Server.

NoSQL databáze: Data bez pevné struktury (dokumenty, klíč-hodnota). Příklady: MongoDB, Redis. Pro pokročilé - začněte SQL.

Základní pojmy

  • Tabulka: Místo, kde ukládáte data (např. tabulka "users", "products").
  • Sloupec (column): Typ informace (jméno, email, věk).
  • Řádek (row): Jeden záznam (jeden uživatel, jeden produkt).
  • Primární klíč (primary key): Unikátní ID každého záznamu (např. user_id = 1, 2, 3...).
  • Cizí klíč (foreign key): Odkaz na záznam v jiné tabulce (např. objednávka má user_id → propojuje objednávku s uživatelem).
Analogie: Databáze = Excel sešit. Tabulka = list v Excelu. Sloupec = sloupec v Excelu. Řádek = řádek v Excelu. Ale databáze je 1000x rychlejší a má pravidla.

Základní SQL příkazy (CRUD)

CRUD = Create (vytvořit), Read (číst), Update (upravit), Delete (smazat). 90 % práce s databází je CRUD.

1. CREATE TABLE (vytvoření tabulky)

Co dělá: Vytvoří novou tabulku s definovanými sloupci a datovými typy.

CREATE TABLE users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    email TEXT UNIQUE NOT NULL,
    age INTEGER,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

Vysvětlení:

  • id INTEGER PRIMARY KEY AUTOINCREMENT - unikátní ID, automaticky se zvyšuje (1, 2, 3...)
  • name TEXT NOT NULL - sloupec pro jméno, textový typ, povinné (nelze nechat prázdné)
  • email TEXT UNIQUE NOT NULL - email musí být unikátní (nemůžete mít 2 stejné emaily)
  • age INTEGER - věk, číslo, nepovinné (může být NULL)
  • created_at DATETIME DEFAULT CURRENT_TIMESTAMP - datum vytvoření, automaticky se vyplní aktuálním časem

2. INSERT (vložení dat)

Co dělá: Přidá nový řádek (záznam) do tabulky.

INSERT INTO users (name, email, age)
VALUES ('Jan Novák', 'jan@example.com', 25);

INSERT INTO users (name, email, age)
VALUES ('Petra Svobodová', 'petra@example.com', 30);

Vysvětlení: Do tabulky users přidáme 2 záznamy. id a created_at se vyplní automaticky.

3. SELECT (čtení dat)

Co dělá: Načte data z tabulky. Nejpoužívanější příkaz.

-- Všechny záznamy, všechny sloupce
SELECT * FROM users;

-- Jen konkrétní sloupce
SELECT name, email FROM users;

-- S podmínkou (WHERE)
SELECT * FROM users WHERE age > 25;

-- Řazení (ORDER BY)
SELECT * FROM users ORDER BY age DESC;

-- Limit (prvních 10 záznamů)
SELECT * FROM users LIMIT 10;

Vysvětlení:

  • SELECT * FROM users - všechny sloupce (*) z tabulky users
  • WHERE age > 25 - filtr (jen záznamy, kde věk > 25)
  • ORDER BY age DESC - seřadit podle věku, sestupně (DESC = descending, ASC = vzestupně)
  • LIMIT 10 - jen prvních 10 záznamů

4. UPDATE (úprava dat)

Co dělá: Změní existující záznamy.

-- Změna jednoho sloupce
UPDATE users SET age = 26 WHERE id = 1;

-- Změna více sloupců
UPDATE users SET name = 'Jana Nováková', age = 27 WHERE id = 1;

POZOR: Vždycky použijte WHERE! Bez WHERE se upraví VŠECHNY řádky.

-- NEBEZPEČNÉ - změní všechny záznamy!
UPDATE users SET age = 99;  -- Všichni uživatelé budou mít věk 99

5. DELETE (mazání dat)

Co dělá: Smaže záznamy.

-- Smazat konkrétní záznam
DELETE FROM users WHERE id = 1;

-- Smazat podle podmínky
DELETE FROM users WHERE age < 18;

POZOR: DELETE bez WHERE smaže VŠECHNY řádky! Neexistuje UNDO.

Pravidlo: Před UPDATE nebo DELETE vždy nejdřív spusťte SELECT se stejnou WHERE podmínkou. Uvidíte, co se změní/smaže. Pokud je to OK, pak spusťte UPDATE/DELETE.

Pokročilejší dotazy

1. JOIN (propojení tabulek)

Co dělá: Spojí data z více tabulek dohromady.

Příklad: Máme tabulku orders (objednávky) a customers (zákazníci). Chceme zobrazit objednávky včetně jména zákazníka.

SELECT orders.order_id, customers.name, orders.product_id
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;

Výsledek:

| order_id | name      | product_id |
|----------|-----------|------------|
| 1        | Jan Novák | 1          |
| 2        | Jan Novák | 2          |

2. Agregační funkce (COUNT, SUM, AVG)

Co dělá: Vypočítá statistiky (počet, součet, průměr).

-- Počet uživatelů
SELECT COUNT(*) FROM users;

-- Průměrný věk
SELECT AVG(age) FROM users;

-- Nejstarší uživatel
SELECT MAX(age) FROM users;

-- Nejmladší uživatel
SELECT MIN(age) FROM users;

3. GROUP BY (seskupení)

Co dělá: Seskupí záznamy podle hodnoty a spočítá agregace.

Příklad: Kolik objednávek má každý zákazník?

SELECT customer_id, COUNT(*) as order_count
FROM orders
GROUP BY customer_id;
Realita: JOIN a GROUP BY jsou nejtěžší části SQL pro začátečníky. První měsíc budete googlit syntaxi. Po 2 měsících to klikne. Netrapte se, pokud to hned nechápete - normální.

Praktické cvičení

Úkol: Vytvořte databázi pro správu knih (knihovna).

Požadavky:

  • Kniha má: název, autor, rok vydání, ISBN
  • Můžete půjčovat knihy uživatelům
  • Evidujete, kdo má jakou knihu půjčenou a kdy

Řešení:

-- Tabulka books
CREATE TABLE books (
    book_id INTEGER PRIMARY KEY AUTOINCREMENT,
    title TEXT NOT NULL,
    author TEXT NOT NULL,
    year INTEGER,
    isbn TEXT UNIQUE
);

-- Tabulka users
CREATE TABLE users (
    user_id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    email TEXT UNIQUE NOT NULL
);

-- Tabulka loans (půjčky)
CREATE TABLE loans (
    loan_id INTEGER PRIMARY KEY AUTOINCREMENT,
    book_id INTEGER NOT NULL,
    user_id INTEGER NOT NULL,
    borrowed_date DATE NOT NULL,
    return_date DATE,
    FOREIGN KEY (book_id) REFERENCES books(book_id),
    FOREIGN KEY (user_id) REFERENCES users(user_id)
);

-- Vložit testovací data
INSERT INTO books (title, author, year, isbn)
VALUES ('1984', 'George Orwell', 1949, '978-0451524935');

INSERT INTO users (name, email)
VALUES ('Jan Novák', 'jan@example.com');

-- Půjčit knihu
INSERT INTO loans (book_id, user_id, borrowed_date)
VALUES (1, 1, '2025-01-15');

-- Zobrazit půjčky s jmény knih a uživatelů
SELECT users.name, books.title, loans.borrowed_date
FROM loans
INNER JOIN users ON loans.user_id = users.user_id
INNER JOIN books ON loans.book_id = books.book_id
WHERE loans.return_date IS NULL;  -- Jen nevrácené knihy
Tip: Zkuste to napsat sami nejdřív, pak se podívejte na řešení. Učení = dělat chyby a opravovat je.

Časté chyby začátečníků

1. UPDATE/DELETE bez WHERE

Chyba: DELETE FROM users; smaže VŠECHNY uživatele, ne jednoho.
Řešení: Vždy použijte WHERE: DELETE FROM users WHERE id = 5;

2. SELECT * v produkci

Chyba: SELECT * FROM users; načte všechny sloupce, i když potřebujete jen 2.
Problém: Pomalé, plýtvání přenosem dat.
Řešení: SELECT name, email FROM users; - jen sloupce, co potřebujete.

3. Žádné indexy

Chyba: Tabulka má milion řádků, dotaz trvá 10 sekund.
Příčina: Databáze musí projít všechny řádky (full table scan).
Řešení: Vytvořte index na sloupce, které často používáte ve WHERE:

CREATE INDEX idx_email ON users(email);

Index = jako rejstřík v knize. Místo procházení celé knihy najdete stránku okamžitě.

4. SQL injection (bezpečnostní riziko)

Chyba: Skládat SQL dotaz jako string s uživatelským vstupem:

// NEBEZPEČNÉ (PHP příklad)
$email = $_POST['email'];
$query = "SELECT * FROM users WHERE email = '$email'";  // SQL injection!

Útok: Uživatel zadá: ' OR '1'='1 → dotaz se stane: SELECT * FROM users WHERE email = '' OR '1'='1' → načte VŠECHNY uživatele.

Řešení: Prepared statements (parametrizované dotazy):

// BEZPEČNÉ (PHP příklad)
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?");
$stmt->execute([$email]);

Závěr

SQL je dotazovací jazyk pro práci s relačními databázemi. 90 % práce = CRUD (Create, Read, Update, Delete). Dobrý návrh databáze = normalizace (žádná duplikace dat).

Co vzít z článku:

  • Stáhněte SQLite Browser, vytvořte databázi, napište první SELECT dotaz (30 minut).
  • Základní příkazy: CREATE TABLE, INSERT, SELECT, UPDATE, DELETE - naučte se nazpaměť.
  • Návrh tabulek: každá informace jen jednou (normalizace), primární klíče (ID), cizí klíče (odkazy mezi tabulkami).
  • JOIN = propojení tabulek, GROUP BY = seskupení, agregační funkce (COUNT, SUM, AVG).
  • Vždy používejte WHERE u UPDATE/DELETE, indexy pro rychlost, prepared statements proti SQL injection.

První akce (30 minut): Stáhněte SQLite Browser, vytvořte databázi "test.db", vytvořte tabulku "users" s 3 sloupci (id, name, email), vložte 3 záznamy, zkuste SELECT s WHERE podmínkou. Hotovo - máte první databázi.

Kam dál:

  • SQLBolt: sqlbolt.com - interaktivní tutoriál SQL (15 lekcí, zvládnete za víkend)
  • W3Schools SQL: w3schools.com/sql - reference všech SQL příkazů s příklady
  • PostgreSQL: Až ovládnete SQLite, přejděte na PostgreSQL (výkonnější, používá se v produkci)
  • Projekt: Vytvořte databázi pro svůj projekt (to-do list, blog, e-shop) - nejlepší způsob učení