ARCHIV |
|||||
Software (10844)
Distribuce (131)
Skripty (697)
Menu
Diskuze
Informace
|
MySQL (36) - Regulární výrazyKdyž se sestavovala osnova tohoto seriálu, vyžádali si čtenáři zvláštní díl na regulární výrazy. Nuže, toto jest on. Jedním z největších překvapení při mém přechodu na Linux kdysi bylo, s jakou silou a razancí se všude používají regulární výrazy. Upřímně mě to nadchlo, protože je to elegantní, rychlé a výkonné řešení. Ne snad že by regulární výrazy byly vždy "to nej" nebo že by byly samospasitelné - ale přinejmenším se vyplatí o nich vědět. Pronikly i do MySQL, a právě o tom bude dnešní článek. Regulární výrazyPokud byste dostatečně nevěděli, co to regulární výrazy jsou, pak vězte, že se jedná o nástroje pro vyhledávání textu (případně jeho nahrazování) pomocí důmyslných pravidel a zástupných znaků. Než bych se pokoušel o nějakou vzletnou a nicneříkající definici, poskytnu raději dychtivým čtenářům několik odkazů, které je zasvětí a přejdu rovnou k myšlenkám, týkajícím se MySQL. Takže, o regulárních výrazech se můžete něco málo dozvědět:
MySQL a regulární výrazyV MySQL jsou regulární výrazy zastoupeny de facto jedinou funkcí, a to REGEXP. Opravdoví znalci namítnou, že existuje ještě funkce NOT REGEXP (což je pravda), a funkce RLIKE a NOT RLIKE (ty jsou ale sysnonymem funkcí REGEXP a NOT REGEXP). Zapište si za uši, že MySQL má pouze nástroje pro vyhledávání podle regulárních výrazů, nikoli však odpovídající nástroje pro změnu dat. Nic takového, jako je například PHP funkce ereg_replace v MySQL nenajdete. Abych nebyl jen negativní - pro účely vyhledávání může být REGEXP poměrně užitečný. Z tabulky zaměstnanců: create table pracovnik
(prijmeni varchar(20), jmeno varchar(15));
můžete například vybírat podle sloupce prijmeni s pomocí regexp lidi, jejichž příjmení obsahuje písmeno "a" takto: select * from pracovnik
where prijmeni regexp 'a';
Lidi, jejichž příjmení končí na "ová" zase můžete najít pomocí
následujícího kódu (Novák tam nebude,
protože nekončí na "ová"): select * from pracovnik
where prijmeni regexp 'ová$';
Nebo lidi, jejichž příjmení začíná na "Z" a končí na "c" zjistíte takhle: select * from pracovnik
where prijmeni regexp '^Z.+c$';
Jak to obejítPřestože jsou regulární výrazy mnohem mocnější než to, co jsem předvedl, dají se leckdy přepsat pomocí operátoru LIKE a tak se jim můžete úplně vyhnout. Uvádím to proto, že pro mnohé z nás je syntaxe LIKE daleko pochopitelnější než regulární výrazy. V porovnání LIKE existují pouze dva zástupné znaky - "%" (procento) zastupuje libovolné množství znaků (včetně žádného) a "_" (podtržítko) zastupuje právě jeden znak. Dotazy výše by se tedy v tomto případě daly všechny přepsat: select * from pracovnik
where prijmeni like '%a%';
Pozn.: Není to tak úplně přesné. Výraz "zc" by v posledním případě s použitím LIKE prošel, ale s použitím regexp nikoli (neobsahuje mezi "z" a "c" žádné další znaky, ale měl by). Z toho je vidět, že regulární výrazy jesou mnohem mocnější než like a také to, že při přepisu regexp na like je třeba dávat si pozor. Rychlost zpracování regulárních výrazůPanuje názor, že provedení regulárního výrazu je mnohem pomalejší než porovnání pomocí LIKE. Něco takového je logické, protože regulární výrazy jsou mnohem komplikovanější než prosté porovnání se zástupnými znaky. Abych Vám pomohl udělat si představu o tom, jaký je to rozdíl, a abych vás naučil testovat dobu provádění funkcí v MySQL, představím Vám v tomto díle seriálu ještě informační funkci BENCHMARK. MySQL funkce BENCHMARK je sama o sobě k ničemu, protože vrací vždy nulu. Slouží pouze k tomu, aby zopakovala předaný příkaz s předaným počtem opakování. Co nás opravdu zajímá je fakt, jak dlouho taková akce bude trvat. Jelikož mysql vrací dobu potřebnou k vykonání posledního příkazu, můžeme pomocí BENCHMARK spustit x-krát danou funkci a změřit, jak dlouho to celé bude trvat. Takže milionkrát spustím test s LIKE: SELECT
BENCHMARK(1000000,'Zajic' LIKE 'Z%c');
a milionkrát spustím test s regexp: SELECT
BENCHMARK(1000000,'Zajic' regexp '^Z.+c$');
a výsledek? Průměr ze tří testů ukázal, že milionkrát porovnání
pomocí LIKE trvalo 0,5 vteřiny, kdežto milionkrát porovnání pomocí
regexp trvalo 1,5 vteřiny. Můžeme tedy prohlásit, že v tomto případě
bylo použití regulárních výrazů zhruba třikrát pomalejší. Pozn.: Testy tohoto typu by se však neměly brát jako dogma. Nezapomínejte, že stěží budete porovnávat v reálné aplikaci milionkrát za sebou regulární výraz. V praxi zřejmě rozdíl ve výkonu LIKE vůči REGEXP vůbec nepocítíte. Měli byste však vědět, že je to pomalejší a že pomocí funkce BENCHMARK to lze změřit.
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 (34) - větvení kódu a pivotní tabulky MySQL (35) - vestavěné funkce 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 |