23. Větvení kódu - podmínky a cykly
Větvení kódu se v MySQl může zdát trochu zvláštní, ale jsou situace kdy ho využijeme. Pod větvením kódu si můžeme představit to stejné, co známe z klasických programovacích jazyků, tedy zejména podmínky a cykly.Podmínky v MySQL
Podmínky se vyskytují témeř v každém programovacím jazyce, není tedy třeba jejich logiku příliš vysvětlovat. MySQL nám nabízí buď pouze samotnou podmínku, možnost přidat blog ELSE nebo ELSEIF a při více možnostech využít CASE.IF, ELSE, ELSEIF
Tyto klasické příkazy pro podmínky známe z programování. V MySQL je nejčastěji využijeme v triggerech nebo zejména uložených procedurách a uživatelsky definovaných funkcích, kde v podmínkách můžeme využít zadané parametry. Pěkným příkladem například může být procedura, která nám vrátí informace o filmu (tabulky jsme vytvářeli v díle o Uživatelsky definovaných funkcích) na základě názvu a pokud nenajde odpovídající záznam, vytvoří ho.CREATE PROCEDURE ziskej_film (nazev_filmu varchar(100))
BEGIN
IF EXISTS(SELECT * FROM filmy WHERE nazev = nazev_filmu) THEN
SELECT * FROM filmy WHERE nazev = nazev_filmu;
ELSE
INSERT INTO filmy (nazev) VALUES (nazev_filmu);
SELECT * FROM filmy WHERE nazev = nazev_filmu;
END IF;
END
Jestli vám databáze vrátila chybu, jde o problém s oddělovačem, který je popsán v předchozích dílech. Pokud bychom potřebovali, můžeme přidat neomezený počet bloků ELSEIF, nebo celou část ELSE vynechat a něco provést pouze při splnění podmínky. V podmínce, která musí být splněna také můžeme používat AND nebo OR a závorkování stejným způsobem, na jaký jsme zvyklý z klauzule WHERE. Jak vidíme v předchozím příkladu, podmínka nemusí být statická, můžeme použít i dotaz:
Podmínka jako funkce
Specifickým případem podmínek je použítí IF jako funkce v SELECT dotazu. V tomto případě jde o obdobu ternárního operátoru. Tato funkce přijímá tři parametry, první je vyhodnocovaná podmínka. Pokud je platná, je vrácen druhý parametr, pokud platná není funkce vrací třetí zadaný parametr.SELECT film_id, nazev, IF(hodnoceni > 7, 'dobry film', 'spatny film') AS textove_hodnoceni
FROM filmy
Větvení pomocí CASE
Větvení pomocí CASE nám neumožní proti konstrukci s IF nic navíc, ale v případě více podmínek může jít o přehlednější možnost. CASE postupně porovnává zadanou hodnotu a v případě shody vykoná určený kód. Pokud na žádnou shodu nenarazí, vykoná defaultní kód. Použít ho můžeme jak v procedurácg a triggerech, tak přímo v dotazu. V MySQL lze použít dve varianty zápisu. První je méně přehledná ale dokážeme složitější podmínky.SELECT nazev,
CASE
WHEN hodnoceni > 9 THEN 'vyborne hodnoceni'
WHEN hodnoceni > 8 THEN 'nadprumerne hodnoceni'
WHEN hodnoceni > 5 THEN 'prumerne hodnoceni'
ELSE 'podprumerne hodnoceni'
END as textove_hodnoceni
FROM filmy
V druhé možnosti na začátku určíme co se bude porovnávat a poté již jen vypisujeme hodnoty k porovnání.
SELECT nazev,
CASE hodnoceni
WHEN 10 THEN 'maximalni hodnoceni'
WHEN 0 THEN 'minimalni hodnoceni'
ELSE 'jine hodnoceni'
END as textove_hodnoceni
FROM filmy
Cykly v MySQL
Cykly nám umožnují opakovaně vykonat nějaký kód. Oproti běžnému programování není jejich užití v MySQL tak časté, ale jsou případy kdy se mohou hodit. Cyklus vykonavá svůj kód dokud je platná zadaná podmínka. Vlastní podmínky zapisujeme stejným způsobem jako pro výše uvedené IF.Stejně jako u podmínek, i zde můžeme využít několik druhů cyklů. První příkaz je cyklus REPEAT (možná znáte z pascalu). V programovacích jazycích založených na syntaxy jazyka C lze tento cyklus přerovnat k DO WHILE. Podmínka se tedy vyhodnuje až na konci, to znamená že kód cyklu se vždy provede minimálně jednou. Cyklus REPEAT zapíšeme takto:
REPEAT
samotný kód, který chceme vykonat
UNTIL podmínka
END REPEAT;
Druhý typ cyklu je klasický WHILE, kdy počet provedení závisí na splnění podmínky:
WHILE podmínka DO
samotný kód, který chceme vykonat
END WHILE;
Cykly a podmínky můžeme do sebe zanořovat a kombinovat. Často se takové používají s kombinací dočasných tabulek pro mezivýsledky.
Další díly tutoriálu
21. Triggery22. Uživatelsky definované funkce
23. Větvení kódu - podmínky a cykly
24. Práce s datem a časem
25. Kódování řetezců