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
-
Tabulka
Základní struktura pro ukládání dat. Skládá se ze sloupců a řádků. Každá tabulka má své jméno a schéma (definici sloupců).
-
Řádek (záznam)
Je jeden záznam v tabulce. Reprezentuje jeden konkrétní objekt, který do tabulky ukládáme.
-
Sloupec
Definuje, jaká data do tabulky ukládáme (například jméno, příjmení, e-mail). Každý sloupec má vlastní datový typ (třeba VARCHAR, INT, DATE).
-
Hodnota
Hodnota je konkrétní údaj uložený v tabulce. Jedná se o průsečík řádku a sloupce.
-
SQL
SQL (Structured Query Language) je standardizovaný jazyk pro práci s relačními databázemi. Slouží k tomu, abychom mohli data v databázi (a tabulkách) ukládat, upravovat, vyhledávat a mazat.
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č.