O předmětu

Databázové systémy jsou základem moderních aplikací. Předmět pokrývá relační model, SQL jazyk a návrh databáze. Znalost SQL je jednou z nejžádanějších dovedností na trhu práce.

Relační model

Základní pojmy:

  • Relace (tabulka) — dvourozměrná struktura řádků a sloupců
  • Atribut — sloupec tabulky (má datový typ)
  • N-tice (řádek) — jeden záznam
  • Primární klíč (PK) — jednoznačně identifikuje řádek
  • Cizí klíč (FK) — odkazuje na PK jiné tabulky
  • Integritní omezení — pravidla pro data (NOT NULL, UNIQUE, CHECK)

SQL — Data Definition Language (DDL)

-- Vytvoření tabulky
CREATE TABLE studenti (
    id        INTEGER PRIMARY KEY AUTOINCREMENT,
    jmeno     TEXT NOT NULL,
    prijmeni  TEXT NOT NULL,
    email     TEXT UNIQUE,
    vek       INTEGER CHECK (vek >= 18 AND vek <= 99),
    obor_id   INTEGER REFERENCES obory(id)
);

-- Úprava tabulky
ALTER TABLE studenti ADD COLUMN telefon TEXT;

-- Smazání tabulky
DROP TABLE IF EXISTS studenti;

SQL — Data Manipulation Language (DML)

-- Vložení dat
INSERT INTO studenti (jmeno, prijmeni, email) VALUES
    ('Jan', 'Novák', 'jan@vse.cz'),
    ('Eva', 'Nová', 'eva@vse.cz');

-- Výběr dat
SELECT jmeno, prijmeni, email
FROM studenti
WHERE vek > 20
ORDER BY prijmeni ASC
LIMIT 10;

-- Aktualizace
UPDATE studenti
SET email = 'novy@vse.cz'
WHERE id = 1;

-- Smazání
DELETE FROM studenti WHERE vek IS NULL;

Dotazy — pokročilé

JOINy:

-- INNER JOIN (průnik)
SELECT s.jmeno, o.nazev
FROM studenti s
JOIN obory o ON s.obor_id = o.id;

-- LEFT JOIN (vše z levé + shody z pravé)
SELECT s.jmeno, z.predmet
FROM studenti s
LEFT JOIN zapisy z ON s.id = z.student_id;

-- Více tabulek
SELECT s.jmeno, p.nazev, z.znamka
FROM studenti s
JOIN zapisy z ON s.id = z.student_id
JOIN predmety p ON z.predmet_id = p.id
WHERE z.znamka <= 2;

Agregační funkce:

SELECT
    obor_id,
    COUNT(*) AS pocet_studentu,
    AVG(vek) AS prumer_vek,
    MIN(vek) AS nejmladsí,
    MAX(vek) AS nejstarší
FROM studenti
GROUP BY obor_id
HAVING COUNT(*) > 5
ORDER BY pocet_studentu DESC;

Poddotazy (subquery):

-- Studenti se zápisem do oblíbeného předmětu
SELECT jmeno FROM studenti
WHERE id IN (
    SELECT student_id FROM zapisy
    WHERE predmet_id = (SELECT id FROM predmety WHERE kod = '4IT115')
);

-- EXISTS
SELECT jmeno FROM studenti s
WHERE EXISTS (
    SELECT 1 FROM zapisy z WHERE z.student_id = s.id
);

Normalizace

1NF (První normální forma):

  • Každý atribut je atomický (nelze dál rozdělit)
  • Žádné opakující se skupiny
2NF (Druhá normální forma):
  • Je v 1NF
  • Každý neklíčový atribut závisí na celém primárním klíči
3NF (Třetí normální forma):
  • Je v 2NF
  • Žádné tranzitivní závislosti (neklíčový atribut nesmí záviset na jiném neklíčovém)
Příklad normalizace:

Denormalizovaná tabulka:

ZápisKurzu(student_id, student_jmeno, kurz_id, kurz_nazev, znamka)

Po normalizaci (3NF):

Studenti(student_id PK, jmeno)
Kurzy(kurz_id PK, nazev)
Zapisy(student_id FK, kurz_id FK, znamka)

ER Diagram

Typy vztahů:

  • 1:1 — osoba ↔ cestovní pas
  • 1:N — katedra → učitelé
  • M:N — studenti ↔ předměty (přes vazební tabulku)
Crows Foot notace: --
(právě jeden), --o< (nula nebo více), --
<
(jeden nebo více)

Indexy a výkon

-- Vytvoření indexu pro rychlé vyhledávání
CREATE INDEX idx_studenti_email ON studenti(email);
CREATE INDEX idx_zapisy_student ON zapisy(student_id);

-- Composite index
CREATE INDEX idx_zapisy_compound ON zapisy(student_id, predmet_id);

-- EXPLAIN pro analýzu dotazu
EXPLAIN SELECT * FROM studenti WHERE email = 'jan@vse.cz';

Transakce

BEGIN TRANSACTION;
    UPDATE ucty SET zustatek = zustatek - 1000 WHERE id = 1;
    UPDATE ucty SET zustatek = zustatek + 1000 WHERE id = 2;
COMMIT;  -- nebo ROLLBACK pro zrušení

-- ACID vlastnosti:
-- Atomicity — vše nebo nic
-- Consistency — data zůstanou konzistentní
-- Isolation — transakce se navzájem neovlivňují
-- Durability — po COMMIT jsou změny trvalé

Tipy pro zkoušku

  • Pořadí klauzulí: SELECTFROMJOINWHEREGROUP BYHAVINGORDER BYLIMIT
  • WHERE filtruje před agregací, HAVING po agregaci
  • NULL se nerovná ničemu — používej IS NULL / IS NOT NULL
  • DISTINCT odstraní duplicitní řádky
  • Agregace bez GROUP BY vrátí jeden řádek za celou tabulku

Doporučené zdroje

✏️ Upravit wiki obsah

Používej Markdown: ## Nadpis, **tučně**, `kód`, - odrážky, > citace

Heslo si vyžádej od správce wiki.