ARCHIV |
|||||
Software (10844)
Distribuce (131)
Skripty (697)
Menu
Diskuze
Informace
|
MySQL (34) - větvení kódu a pivotní tabulkyZnát podmíněné příkazy v MySQL může přijít vhod. Zejména na šílenosti typu pivotních tabulek a souhrnů. Což je dnešní téma seriálu MySQL. Situaci, kdy je potřeba provést nebo neprovést určitý úsek kódu v
závislosti na splnění podmínky budete znát spíše z "klasických"
programovacích jazyků. Jak ale uvidíme v dnešním díle seriálu o MySQL,
jde to použít i v dotazech, a leckdy to má docela opodstatnění. Tak či
tak, znát příkazy pro rozbočení kódu může být docela užitečné. Větvení kódu v MySQLPředevším je dobře si uvědomit, kdy se asi budou podobné hrátky s
příkazy používat. Bude to v situacích, kde chceme vrátit (či změnit)
data v závislosti na nějaké podmínce - nejčastěji v závislosti na
datech jiných. Tak nám například jeden a tentýž dotaz může vrátit různá
data na základě toho, jaká hodnota je uvedena ve sloupci a podobně. Pro
některé typy dotazů je to nepostradatelné. Příkaz IFPříkaz IF je obdobou ternárního operátoru, jaký známe z většiny programovacích jazyků. Obsahuje tři části. Vyhodnotí se podmínka (1. část), jestliže je splněna, je vrácen jako výsledek výraz ve druhé části, jestliže ne je vrácen výraz ve třetí části. Mohlo by to vypadat nějak takto: select jmeno, if
(plat>15000,'nadprůměrný','podprůměrný') as plat from pracovnik
V případě jednoduchých rozhodování tento příkaz přes svoji úspornost
jistě postačí. Může to ušetřit následné zpracování "řádek po řádku" v
nějaké aplikaci, která bude tato data konzumovat. Samozřejmě, že
podobnou konstrukci lze použít nejen v příkazu SELECT, ale třeba i v
UPDATE. Příkaz IFNULLZvláštním případem jednoduchého větvení budiž příkaz IFNULL. Ten má dva argumenty. Pokud ten první je rovnen hodnotě NULL, je vrácen druhý, jinak první. To se často hodí v případě, kdy sloupec smí obsahovat hodnoty NULL, ale my je v daném případě chceme nahradit nějakou jinou hodnotou. Kdyby směl sloupec plat obsahovat hodnoty NULL a my je chtěli nahradit nulou, šli bychom na to takto: SELECT jmeno,
IFNULL(plat,0) AS plat FROM pracovnik
Což je mimochodem rovnocenné zápisu SELECT jmeno, IF(plat is
null,0,plat) AS plat FROM pracovnik
Co k tomu dodat? Snad jen že existuje i funkce NULLIF, která funguje
poněkud jinak a v praxi se téměř nepoužívá. Její popis byste našli v
manuálu k MySQL. Ano, a ještě to, že některé DBMS mají funkci
IFNULL nazvánu ISNULL, takže se mi to neustále plete. Příkaz CASECase umí větvit kód na více částí a navíc má dvě syntaktické formy. Tudíž je nejsložitější z uvedených příkazů pro větvení. Zase toho ale nejvíc umí a poměrně často se používá. První forma je tzv. "rozhodovací" a vypadá takto: SELECT JMENO,
Druhá, "prohledávací" pak vypadá nějak takhle SELECT JMENO,
Jak vidíte, její typické použití je právě ve spojení s "překladem"
jednoduchých "stavových" informací na jejich srozumitelné protějšky. PraxePro použití těchto konstrukcí v praxi bych měl několik tipů, které
se Vám možná budou hodit. Především - s nástroji pro větvení kódu je
třeba zacházet opatrně. Mějte na paměti, že použití mnoha (zejména
vnořených) konstrukcí CASE nebo IF může kód poněkud znepřehlednit. V
příkladech "prohledávacího" typu CASE je navíc možné stavové informace
uložit do samostatné tabulky a potom to spojit pomocí relace - odpadá
tak nutnost úpravy v kódu v případě, kdy by se přidávala nová větev
(nový stav). Ještě jeden tip z praxe - kdekoli je to možné, hodí se zdrojové kódy
SQL obsahující větvení formátovat, aby byly hezky čitelné. Sám jsem se
o to v příkladech výše snažil. Pivotní tabulkyPomocí příkazu CASE se lehce dají vytvořit pivotní tabulky, tedy takové pohledy na data, které shrnují "řádkové" výsledky do sloupců. Než bych to dlouhosáhle vysvětloval, raději to předvedu na příkladu. Mějme tabulku vystavených faktur create table faktury
(datum date, castka decimal(10,2));
a šéfa. Ten jednoho krásného dne přijde s tím, že chce výsledky ve formě tabulky, kde každý řádek bude obsahovat data za jeden rok a sloupce budou obsahovat součty pohybů za jednotlivé měsíce. Tento požadavek se v mnoha obměnách opakuje v nejrůznějších aplikacích, takže následující postup se docela vylatí znát. Dotaz bude vypadat nějak takto: select rok,
Všimněte si, že data za jednotlivé měsíce jsou nejprve sloučena v poddotazu, a ten je ve "vnějším" dotazu použit jako zdroj. Výhoda tohoto přístupu je jasná - dotaz seskupí data pro libovolný počet let a navíc v jednom měsíci může být libovolný počet pohybů (včetně žádného). Jen je ten kód trochu nudný na psaní.
Související články
Předchozí Celou kategorii (seriál) Další
MySQL (1) - pestrý svět databází
MySQL (2) - Instalujeme databázi MySQL MYSQL (3) Instalujeme MySQL podruhé MySQL (4) - něco terminologie MySQL (5) - tajuplné SQL MySQL (6) - Ukládáme řetězce MySQL (7) - hrátky s čísly MySQL (8) - Ukládání datumů MySQL (9) - Další datové typy MySQL (10) - tvorba databáze. Základy DDL MySQL (11) - vytváříme tabulky MySQL (12) - tipy k tvorbě tabulek MySQL (13) - Vkládáme data MySQL (14) - Upravujeme data MySQL (15) - Odstraňujeme data MySQL (16) - Tipy a triky k manipulaci s daty MySQL (17) - vybíráme data MySQL (18) - Filtrujeme data MySQL (19) - Řadíme data MySQL (20) - spojení více tabulek MySQL (21) - klauzule JOIN MySQL (22) - tipy a triky ke spojování tabulek MySQL (23) - relace 1:N a N:N MySQL (24) - Seskupujeme záznamy MySQL (25) - hrátky se seskupenými záznamy MySQL (26) - Poddotazy MySQL (27) - Složitější dotazy MySQL (28) - Dotazy pro pokročilé MySQL (29) - Vracení nejvyšších záznamů MySQL (30) - průběžné součty MySQL (31) - Indexy MySQL (32) - ještě k indexům MySQL (33) - Příkaz UNION MySQL (35) - vestavěné funkce MySQL (36) - Regulární výrazy MySQL (37) - použití fulltextového vyhledávání MySQL (38) - Fulltext a praxe MySQL (39) - typy tabulek v MySQL MySQL (40) - další typy tabulek MySQL (41) - Transakce MySQL (42) - ještě k transakcím MySQL (43) - Uložené procedury MySQL (44) - parametry uložených procedur MySQL (45) - větvení kódu uložených procedur MySQL (46) - Triggery MySQL (47) - Triggery a praxe MySQL (48) - UDF MySQL (49) - pohledy MySQL (50) - Pohledy podruhé MySQL (51) - Metadata MySQL (52) - A co zálohování? MySQL (53) - SELECT INTO OUTFILE MySQL (54) - zálohování MySQL z webu MySQL (55) - zálohování MySQL z pohledu správce MySQL (56) - Obnova zálohovaných dat MySQL (57) - Ach, ta čeština MySQL (58) - čeština v praxi MySQL (59) - české řazení MySQL (60) - řádkový klient MySQL (61) - Oprávnění MySQL (62) - Oprávnění podruhé MySQL (63) - jemné nastavení práv MySQL (64) - nad dotazy čtenářů MySQL (65) - Ladíme server MySQL (66) - Ještě k ladění serveru MySQL - (67) MySQL (68) - Závěr MySQL (69) - Prepared Statements Předchozí Celou kategorii (seriál) Další
|
Vyhledávání software
Vyhledávání článků
28.11.2018 23:56 /František Kučera 12.11.2018 21:28 /Redakce Linuxsoft.cz 6.11.2018 2:04 /František Kučera 4.10.2018 21:30 /Ondřej Čečák 18.9.2018 23:30 /František Kučera 9.9.2018 14:15 /Redakce Linuxsoft.cz 12.8.2018 16:58 /František Kučera 16.7.2018 1:05 /František Kučera
Poslední diskuze
31.7.2023 14:13 /
Linda Graham 30.11.2022 9:32 /
Kyle McDermott 13.12.2018 10:57 /
Jan Mareš 2.12.2018 23:56 /
František Kučera 5.10.2018 17:12 /
Jakub Kuljovsky | |||
ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2024) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze |