Databáze

Na dnešním cvičení se podíváme na databáze. Vysvětlíme si, co to databáze je a k čemu ji potřebujeme. Zároveň se podíváme na práci s nejrozšířenějším typem databáze, tedy relační databází.

Databáze představuje systematicky organizovaný soubor dat, který je navržen tak, aby umožňoval jejich efektivní ukládání, správu a vyhledávání. V současných informačních systémech hrají databáze klíčovou roli, neboť umožňují pracovat s velkým objemem dat strukturovaným a konzistentním způsobem. Jejich využití je nezbytné zejména v situacích, kdy je potřeba zajistit rychlý přístup k informacím, jejich aktualizaci a zároveň zachovat jejich integritu a bezpečnost. Existuje několik typů databází, které se liší svým přístupem k organizaci dat. V následující části se zaměříme na relační databáze, jež patří mezi nejrozšířenější typ a jsou založeny na organizaci dat do tabulek a definování vztahů mezi nimi.

Základní pojmy v relačních databázích

Práce s tabulkami v SQL

Nyní si ukážeme práci s relačními databázemi, přičemž se zaměříme konkrétně na databázový systém SQLite. Pro práci s databází budeme využívat online nástroj SQL Online, díky kterému není potřeba nic instalovat ani nastavovat na vlastním zařízení. Tento nástroj nám umožňuje psát a spouštět SQL dotazy přímo v prohlížeči. Díky tomu můžeme pracovat s databází podobně jako v reálném prostředí, aniž bychom museli řešit její lokální instalaci a konfiguraci.

Vytvoření tabulky

V SQL se tabulka vytváří pomocí příkazu CREATE TABLE, ve kterém definujeme její název, jednotlivé sloupce a jejich datové typy. Datový typ sloupce určuje, jaký druh hodnot v něm bude uložen. Mezi nejčastěji používané datové typy patří například INTEGER (celá čísla), SMALLINT (menší celá čísla), VARCHAR (text s proměnnou délkou), CHAR (text s pevnou délkou), TEXT (dlouhý text bez omezení), BOOLEAN (pravdivostní hodnota TRUE/FALSE), DATE (datum), TIME nebo (čas). Správná volba datového typu je důležitá pro zajištění integrity dat a efektivní práci s databází.

Následuje příklad vytvoření tabulky uživatelů.

CREATE TABLE uzivatele (
    jmeno VARCHAR(50),
    prijmeni VARCHAR(50),
    email VARCHAR(100),
    rok_narozeni INTEGER,
    datum_registrace DATE,
    admin BOOLEAN
);

Nyní máme vytvořenou tabulku, do které chceme ukládat uživatele. Tabulka je na začátku prázdná a musíme ji nejprve naplnit daty.

Vložení záznamů do tabulky

Při vkládání dat do tabulky v SQL používáme příkaz INSERT INTO. Tento příkaz umožňuje do tabulky uložit nové záznamy. Máme dvě základní možnosti jeho použití. První možností je vložit hodnoty pro všechny sloupce tabulky najednou. To se nám hodí v moment, kdy máme všechna data k dispozici. Musíme ale dodržet přesné pořadí sloupců tak, jak jsou definované v tabulce. Druhou možností je vložit pouze vybrané sloupce. To se naopak hodí v moment, kdy některé údaje nemáme k dispozici nebo je nechceme vyplnit. V takovém případě musíme explicitně uvést, do kterých sloupců data vkládáme, a ostatní sloupce zůstanou nevyplněné.

Následuje příklad vložení záznamu, u kterého máme všechny údaje.

INSERT INTO uzivatele VALUES ('Jan', 'Novák', 'jan@example.com', 25, '2000-05-10', TRUE);

Naopak zde je ukázáno vložení záznamu, u kterého nemáme všechny údaje k dispozici.

INSERT INTO uzivatele (jmeno, prijmeni, email) VALUES ('Eva', 'Svobodová', 'eva@example.com');

Omezení na sloupce tabulky

Ukázali jsme si, jak vytvořit jednoduchou tabulku, do které chceme ukládat uživatele. Hlavním nedostatkem takto vytvořené tabulky ale je, že do ní můžeme vkládat prázdné záznamy. Například provedení tohoto příkazu:

INSERT INTO uzivatele DEFAULT VALUES;

vložíme do tabulky řádek, ve kterém bude každá hodnota NULL. To je určitě nežádoucí situace. Dále můžeme do tabulky vložit několik stejných záznamů (zopakujeme INSERT). To také není žádoucí. V tabulce bychom měli mít pouze smyslupné záznamy.

Z tohoto důvodu existují v SQL různé mechanismy pro zajištění kvality dat, jako například NOT NULL (zajišťuje, že sloupec musí obsahovat hodnotu), DEFAULT (nastavuje výchozí hodnotu, pokud není při vkládání zadána), UNIQUE (zajišťuje jedinečnost hodnot ve sloupci, např. u e-mailu), PRIMARY KEY (jednoznačně identifikuje každý záznam v tabulce) a také SERIAL, který automaticky generuje rostoucí hodnoty (například pro identifikátor). Tyto nástroje nám umožňují zabránit ukládání neplatných nebo nekonzistentních dat a udržovat databázi v dobrém stavu.

Upravme tedy tabulku z předchozího příkladu tak, aby lépe odpovídala našim požadavkům.

CREATE TABLE uzivatele (
    id PRIMARY KEY,
    jmeno VARCHAR(50) NOT NULL,
    prijmeni VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE,
    rok_narozeni INTEGER,
    datum_registrace DATE DEFAULT CURRENT_DATE,
    admin BOOLEAN DEFAULT FALSE
);

Vyzkoušejme nyní vložení prázdného řádku. Co se stane?

Výběr záznamů z tabulky

Ukázali jsme si, jak tabulku vytvořit a jak do ní vložit nové záznamy. Jak je ale nyní z tabulky získáme? K tomu nám v SQL slouží příkaz SELECT. Jeho prostřednictvím lze specifikovat, jaká data mají být z databáze načtena, a to jak z hlediska počtu záznamů, tak i konkrétních atributů.

Základní podoba dotazu má tvar:

SELECT * FROM uzivatele;

kde klíčové slovo FROM určuje tabulku a symbol * označuje výběr všech sloupců. Tímto způsobem vybereme všechny záznamy z tabulky uzivatele.

Pro přesnější práci s daty je možné specifikovat konkrétní sloupce, které nás v danou chvíli zajímají. Například

SELECT jmeno, prijmeni FROM uzivatele;

vybere z tabulky uzivatele pouze jméno a příjmení všech uživatelů. Pokud bychom takto chtěli navíc vybrat všechny unikátní záznamy, stačí za SELECT doplnit klíčové slovo DISTINCT. Tímto způsobem se nám z tabulky vrátí data bez duplicit.

Důležitou součástí dotazování je také klauzule WHERE, která umožňuje filtrovat záznamy na základě zadaných podmínek. Například dotaz

SELECT * FROM uzivatele WHERE admin = TRUE;

vrátí pouze ty uživatele, kteří jsou administrátory. Díky WHERE se tedy můžeme efektivně dotazovat na konkrétní záznamy.

Pro rozšíření možností filtrování lze využít další operátory. Operátor BETWEEN slouží k výběru hodnot v určitém intervalu, například

SELECT * FROM uzivatele WHERE rok_narozeni BETWEEN 1990 AND 2000;

Pro další filtrování lze použít operátor LIKE. Ten slouží k vyhledávání hodnot podle určitého vzoru. Umožňuje například najít všechny záznamy, které začínají, končí nebo obsahují konkrétní řetězec.

SELECT * FROM uzivatele WHERE jmeno LIKE 'J%';

Operátor IN umožňuje porovnat hodnotu s množinou možností, což je přehlednější alternativa k více podmínkám spojeným logickým operátorem OR. Speciální roli má také operátor IS NULL, který slouží k vyhledávání záznamů s chybějící hodnotou. Tyto nástroje dohromady umožňují vytvářet velmi přesné a efektivní dotazy nad uloženými daty.

Úprava záznamů v tabulce

Pro úpravu existujících záznamů v tabulce se v SQL používá příkaz UPDATE. Tento příkaz umožňuje změnit hodnoty v již uložených řádcích na základě zadané podmínky. Klíčové slovo SET určuje, které sloupce a jaké nové hodnoty mají být změněny, zatímco klauzule WHERE definuje, kterých záznamů se změna týká. Například příkaz

UPDATE uzivatele SET admin = TRUE WHERE jmeno = 'Jan';

nastaví uživateli se jménem Jan hodnotu admin na TRUE. Pokud bychom klauzuli WHERE vynechali, změna by se aplikovala na všechny záznamy v tabulce.

Smazání záznamů z tabulky

Pro mazání záznamů z tabulky v SQL se používá příkaz DELETE. Tento příkaz umožňuje odstranit konkrétní řádky (záznamy) z tabulky na základě zadané podmínky. Typicky se používá ve spojení s klauzulí WHERE, která určuje, které záznamy mají být smazány. Například příkaz

DELETE FROM uzivatele WHERE jmeno = 'Jan';

odstraní všechny uživatele se jménem Jan. Pokud bychom klauzuli WHERE vynechali, došlo by ke smazání všech záznamů v tabulce.

Smazání tabulky

Pro smazání celé tabulky se používá příkaz DROP TABLE. Tento příkaz odstraní nejen všechna data v tabulce, ale i tabulku samotnou. Po provedení příkazu

DROP TABLE uzivatele;

tabulka již v databázi neexistuje a nelze ji dále používat, dokud ji znovu nevytvoříme. Tento příkaz se používá pouze v případech, kdy chceme tabulku zcela odstranit, například při úklidu databáze nebo při návrhu nové struktury.

Spojování výsledků - JOIN

Často se dostaneme do situace, kdy máme data uložená ve více tabulkách. Tyto tabulky spolu mohou souviset – například v jedné jsou uloženi uživatelé a v druhé datum jejich posledního přihlášení. Pokud bychom chtěli zobrazit seznam všech uživatelů spolu s jejich posledním datem přihlášení, samotný příkaz SELECT nestačí. Na tyto případy se nám hodí spojování výsledků, tedy příkaz JOIN, který umožňuje kombinovat informace z různých tabulek a získat z nich smysluplný celek.

Struktura příkazu JOIN je jednoduchá: nejprve specifikujeme tabulku, ze které vybíráme data, a případně jí přiřadíme alias. Poté určíme tabulku, kterou chceme spojit, a definujeme podmínku spojení pomocí klauzule ON, která určuje, jaké sloupce mají být porovnávány.

Ukažme si tedy výše uvedený příklad k tabulce uzivatele: představme si, že máme druhou tabulku prihlaseni, kde evidujeme datum posledního přihlášení každého uživatele podle jeho e-mailu:

CREATE TABLE prihlaseni (
    email VARCHAR(100) NOT NULL,
    posledni_prihlaseni DATE DEFAULT CURRENT_DATE
);

Jak už víme, tabulka uzivatele obsahuje sloupec email. Nyní bychom chtěli zobrazit seznam všech uživatelů spolu s datem jejich posledního přihlášení. Využijeme JOIN přes společný sloupec email:

SELECT u.jmeno, u.prijmeni, p.posledni_prihlaseni FROM uzivatele AS u 
        JOIN prihlaseni AS p ON u.email = p.email;

Výsledkem je přehledná tabulka, kde každý uživatel je spojen s informací o svém posledním přihlášení.

Úkoly k dnešnímu cvičení

1. Vytvořte tabulku Knihy a vložte do ní tyto záznamy

ISBN název vydavatel rok_vydani pocet_stran cena zanr typ
K003 Stopařův průvodce po galaxii MF 1985 214 120 scifi kniha
K045 Pán prstenů - Dvě věže MF 1948 251 240 fantasy kniha
K051 Kedrigern a hlas pro princeznu MF 1996 346 53 fantasy kniha
K043 Hobit MF 1950 410 178 fantasy kniha
K025 Barva kouzel Talpress 1989 221 358 fantasy ebook
K026 Stráže! Stráže! Talpress 2000 237 214 fantasy ebook
K027 Lehké fantastično Talpress 1999 145 415 fantasy ebook

2. Doplňte tyto dotazy:

  • Zobrazte všechny žánry tak, aby se neopakovaly.

  • Zobrazte všechny knihy, jejichž název začíná na písmeno S.

  • Zobrazte všechny knihy, které mají více než 200 stran.

  • Zobrazte knihy, jejichž cena je od 150 Kč do 250 Kč.