1. K čemu se používá SQL, rozdělení a kompletní syntax SELECT + popis klauzulí

SQL (Structured Query Language) je jazyk používaný pro práci s relačními databázemi – pro definici struktury databáze, vkládání dat, aktualizaci, mazání dat a dotazování.

SQL se dělí na tyto části:

  • DDL (Data Definition Language) – práce se strukturou databáze

    (CREATE, ALTER, DROP)

  • DML (Data Manipulation Language) – práce s daty

    (SELECT, INSERT, UPDATE, DELETE)

  • DCL (Data Control Language) – práce s oprávněními

    (GRANT, REVOKE)

  • TCL (Transaction Control Language) – práce s transakcemi

    (COMMIT, ROLLBACK, SAVEPOINT)

Kompletní syntax příkazu SELECT:

SELECT [DISTINCT] sloupce
FROM tabulka
[JOIN typ_join ON podmínka]
[WHERE podmínka]
[GROUP BY sloupce]
[HAVING podmínka]
[ORDER BY sloupce [ASC|DESC]]
[LIMIT / OFFSET]   -- dle SQL dialektu
 

Popis klauzulí:

  • SELECT – vybírá sloupce.

  • DISTINCT – odstraní duplicitní řádky.

  • FROM – určuje tabulku/tabulky.

  • JOIN – propojení tabulek podle vztahu.

  • WHERE – filtruje záznamy před seskupením.

  • GROUP BY – seskupení dat podle hodnot ve sloupcích.

  • HAVING – filtruje skupiny po seskupení (používá se s agregacemi).

  • ORDER BY – řazení výsledku.

  • LIMIT/OFFSET – omezení počtu výsledků.


2. DBS – jaká architektura se používá dnes v relačních databázích, kde jsou uložena data a jak je k nim umožněn přístup

Relační databázové systémy dnes nejčastěji využívají:

  • Klient–server architekturu

  • Databázový server (např. PostgreSQL, MySQL, MSSQL) spravuje data a poskytuje přístup klientům.

Požadavky:

  • bezpečnost dat

  • podpora transakcí (ACID)

  • integrita dat (omezení, referenční integrita)

  • souběžný přístup více uživatelů

Data jsou uložena:

  • fyzicky na serveru v souborech na disku (většinou binární formát)

  • přístup je řízen DB serverem, uživatelé používají SQL dotazy přes síť


3. Logický a relační model – filmová společnost

Požadované selecty:

a) Datum nejstarší projekce v evidenci:

SELECT MIN(datum_projekce) AS nejstarsi_projekce
FROM Projekce;
 

b) Počet filmů v evidenci podle žánru:

SELECT zanr, COUNT(*) AS pocet_filmu
FROM Film
GROUP BY zanr;
 

c) Filmy, které nebyly dosud promítány, seřazené podle žánru a názvu:

SELECT f.nazev, f.zanr
FROM Film f
LEFT JOIN Projekce p ON f.id = p.id_film
WHERE p.id_film IS NULL
ORDER BY f.zanr, f.nazev;
 

Možný model (relační schéma):

TabulkaSloupce
Filmid (PK), nazev, zanr, delka
Projekceid (PK), id_film (FK → Film.id), datum_projekce, sala

4. Integrita databáze + referenční integritní omezení

Integrita databáze = soubor pravidel zajišťující, že data jsou správná, úplná a konzistentní.

Referenční integritní omezení = zajišťuje vazby mezi tabulkami pomocí cizích klíčů (FK).

Např.: nelze vložit projekci filmu, který není v tabulce Film.

Příklad:

ALTER TABLE Projekce
ADD CONSTRAINT fk_film
FOREIGN KEY (id_film) REFERENCES Film(id);
 

5. Normalizace tabulky – 1. až 3. NF

Tabulka (zadání):

cislo_zamjmeno_zamparkovisteumistenikapacitapocet_patercislo_mista

Problémy:

  • redundance dat o parkovištích (opakují se atributy parkoviště)

  • tabulka obsahuje více entit (zaměstnanec, parkoviště, parkovací místo)

Výsledek normalizace:

  1. Tabulka Zamestnanec:

    | id_zam (PK) | jmeno |

  2. Tabulka Parkoviste:

    | id_park (PK) | nazev | umisteni | kapacita | pocet_pater |

  3. Tabulka ParkovaciMisto:

    | id_misto (PK) | id_park (FK) | cislo_mista |

  4. Vazební tabulka (kdo má které místo):

    | id_zam (FK) | id_misto (FK) |


6. SQL dotaz – společnosti, které mají na své trase vozy Mercedes

Tabulky v zadání:

DopravniVuz (id, vyrobce, typ_vozu, najeto_km, kapacita, v_provozu_od)
DopravniSpolecnost (id, nazev, zeme, svetadíl, zalozeno)
Trasa (id, spolecnost_id, vuz_id, pocet_vozu)
 

Dotaz:

SELECT s.nazev AS spolecnost,
       s.zeme,
       SUM(t.pocet_vozu) AS celkovy_pocet_vozu
FROM DopravniSpolecnost s
JOIN Trasa t ON s.id = t.spolecnost_id
JOIN DopravniVuz v ON t.vuz_id = v.id
WHERE v.vyrobce = 'Mercedes'
GROUP BY s.nazev, s.zeme;