Relační databázové systémy, SQL, návrh databáze, normalizace, transakce.
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.
Základní pojmy:
-- 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;
-- 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;
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
);
1NF (První normální forma):
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)
Typy vztahů:
-- (právě jeden), --o< (nula nebo více), --
< (jeden nebo více)
-- 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';
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é
SELECT → FROM → JOIN → WHERE → GROUP BY → HAVING → ORDER BY → LIMITWHERE filtruje před agregací, HAVING po agregaciNULL se nerovná ničemu — používej IS NULL / IS NOT NULLDISTINCT odstraní duplicitní řádkyGROUP BY vrátí jeden řádek za celou tabulkuPoužívej Markdown: ## Nadpis, **tučně**, `kód`, - odrážky, > citace