MySQL Zástupné znaky: Líbí se mi, NElíbí se mi, Escape, (%), (_)
⚡ Chytré shrnutí
MySQL Zástupné znaky umožňují vyhledávání na základě vzorů spárováním operátorů LIKE a NOT LIKE se speciálními znaky. Zde jsou vysvětleny zástupné znaky procent a podtržítko, klíčové slovo ESCAPE, praktické dotazy v databázi myflixdb a aspekty výkonu.

Jaké jsou MySQL zástupné znaky?
MySQL Zástupné znaky jsou speciální znaky, které vám pomohou vyhledat data odpovídající složitému vzoru namísto přesné hodnoty. Zástupné znaky se vždy používají ve spojení s porovnávacím operátorem LIKE nebo s porovnávacím operátorem NOT LIKE.
MySQL podporuje dva zástupné znaky a každý z nich odpovídá na jinou otázku týkající se vašich dat.
| Zástupný znak | Význam | Příklad vzoru | Zápasy |
|---|---|---|---|
| % | Nula (0) nebo více znaků | '%kód%' | Code Jméno Black, Da Vinci Code |
| _ | Přesně jeden znak | '200_' | 2005, 2008 |
Nyní, když jsou tyto dva znaky definovány, další část vysvětluje, proč stojí za to se je naučit.
Proč používat zástupné znaky v MySQL?
Pokud znáte SQL, možná si myslíte, že pomocí příkazu SELECT a klauzule WHERE můžete vyhledávat jakákoli složitá data. Proč tedy vůbec používat zástupné znaky?
Než na tuto otázku odpovíme, podívejme se na příklad. Předpokládejme, že marketingové oddělení videotéky Myflix provádí propagační akce ve městě Texas a chce získat zpětnou vazbu o počtu registrovaných členů z Texasu. Požadované informace získáte pomocí následujícího příkazu SELECT spolu s klauzulí WHERE.
SELECT * FROM members WHERE postal_address = 'Austin, TX' OR postal_address = 'Dallas, TX' OR postal_address = 'Iola, TX' OR postal_address = 'Houston, TX';
Jak můžete vidět z výše uvedeného dotazu, „klauzule WHERE„“ se stává dlouhým a křehkým: každé nové město musí být přidáno ručně a jediná chybně napsaná adresa je tiše vyloučena. Použití zástupných znaků zjednodušuje dotaz, protože jeden vzor pokrývá všechna města ve státě.
SELECT * FROM members WHERE postal_address LIKE '%TX';
Stručně řečeno, zástupné znaky vám umožňují vytvářet výkonné vyhledávací funkce v datově řízených aplikacích s mnohem menším množstvím SQL. Následující část postupně rozebírá jednotlivé zástupné znaky.
Druhy MySQL Zástupné znaky
% – Zástupný znak procenta
Znak procent (%) se používá k určení vzoru nula (0) nebo více znaků. Má následující základní syntaxi.
SELECT * FROM table_name WHERE fieldname LIKE 'xxx%';
ZDE:
- "příkaz SELECT„ je standardní příkaz SQL SELECT.
- „KDE“ je klíčové slovo používané k použití filtru.
- „LIKE“ je operátor porovnání, který se používá ve spojení se zástupnými znaky.
- „xxx“ je libovolný zadaný vzor, například jeden nebo více znaků, a „%“ odpovídá libovolnému počtu znaků počínaje nulou (0).
Abychom výše uvedené tvrzení plně pochopili, podívejme se na praktický příklad. Předpokládejme, že chceme najít všechny filmy, které obsahují slovo „kód“ jako součást názvu. Použili bychom zástupný znak procenta na obou stranách slova „kód“ k provedení porovnávání se vzorem kdekoli v názvu.
SELECT * FROM movies WHERE title LIKE '%code%';
Spuštění výše uvedeného skriptu v MySQL Workbench Porovnání s databází myflixdb nám dává níže uvedené výsledky.
| movie_id | titul | ředitel | rok_vydáno | category_id |
|---|---|---|---|---|
| 4 | Code Jméno Černá | Edgar Jimz | 2010 | NULL |
| 7 | Davinci Code | NULL | NULL | 6 |
Všimněte si, že klíčové slovo „kód“ se vrátí bez ohledu na to, zda se objeví na začátku nebo na konci názvu. Je to proto, že vzor umožňuje libovolný počet znaků před slovem „kód“ a libovolný počet znaků za ním.
Nyní upravme skript tak, aby se zástupný znak procenta zobrazoval pouze na začátku vyhledávacích kritérií.
SELECT * FROM movies WHERE title LIKE '%code';
Spuštění výše uvedeného skriptu v MySQL Workbench s databází myflixdb nám dává níže uvedené výsledky.
| movie_id | titul | ředitel | rok_vydáno | category_id |
|---|---|---|---|---|
| 7 | Davinci Code | NULL | NULL | 6 |
Všimněte si, že byl vrácen pouze jeden záznam. Vzor odpovídá libovolnému počtu znaků na začátku názvu, ale vyžaduje, aby název konec s „kódem“.
Nyní místo toho posuňme zástupný znak procenta na konec vzoru. Upravený skript je uveden níže.
SELECT * FROM movies WHERE title LIKE 'code%';
Spuštění výše uvedeného skriptu v MySQL Workbench s databází myflixdb nám dává níže uvedené výsledky.
| movie_id | titul | ředitel | rok_vydáno | category_id |
|---|---|---|---|---|
| 4 | Code Jméno Černá | Edgar Jimz | 2010 | NULL |
Vrátí se pouze jeden záznam, protože tento vzor odpovídá každému názvu, který začíná s textem „kód“ následovaným libovolným počtem znaků. Pozice symbolu % proto určuje význam vyhledávání.
💡 Tip: Vzor jako 'code%' může stále používat index v názvu sloupce, zatímco '%code%' nikoli. Úvodní zástupný znak procenta vynucuje MySQL prohledávat každý řádek, takže zástupný znak ponechte vpravo, kdykoli to vyhledávání dovolí.
_ – Zástupný znak podtržítka
Zástupný znak podtržítka se používá odpovídat přesně jednomu znakuPředpokládejme, že chceme najít všechny filmy vydané v letech 200x, kde x je přesně jeden znak, který může být libovolnou hodnotou. Následující skript vybere všechny filmy vydané v roce „200x“.
SELECT * FROM movies WHERE year_released LIKE '200_';
Spuštění výše uvedeného skriptu v MySQL Workbench s databází myflixdb nám dává níže uvedené výsledky.
| movie_id | titul | ředitel | rok_vydáno | category_id |
|---|---|---|---|---|
| 2 | Zapomínání na Sarah Marshal | Nicholas Stoller | 2008 | 2 |
| 9 | Honey mooneRS | Jhon Shultz | 2005 | 8 |
Všimněte si, že se vrátí pouze filmy, jejichž hodnota argumentu year_released je 200 následovaná libovolným jedním znakem. Na rozdíl od zástupného znaku procenta podtržítko rezervuje místo pro jeden znak a ne pro více.
NENÍ JAKO u zástupných znaků
Logický operátor NOT lze použít společně se zástupnými znaky k vrácení řádků, které ne odpovídat zadanému vzoru.
Předpokládejme, že chceme filmy, které nebyly vydány v letech 200x. Zkombinujeme logický operátor NOT se zástupným znakem podtržítka, jak je znázorněno níže.
SELECT * FROM movies WHERE year_released NOT LIKE '200_';
| movie_id | titul | ředitel | rok_vydáno | category_id |
|---|---|---|---|---|
| 1 | Piráti z Karibiku 4 | Rob Marshall | 2011 | 1 |
| 4 | Code Jméno Černá | Edgar Jimz | 2010 | NULL |
| 8 | Podsvětí-Awakenobyv | Michael Eal | 2012 | 6 |
Vrátí se pouze filmy, které nedodržují vzor 200x, protože NOT invertuje výsledek porovnání se zástupnými znaky. Všimněte si, že řádky obsahující NULL Hodnoty se nikdy nevrací pomocí funkce LIKE nebo NOT LIKE, protože NULL je neznámá, nikoli nerovná se.
Klíčové slovo ESCAPE
Klíčové slovo ESCAPE se používá k znaky escape pro porovnávání vzorů například procento (%) a podtržítko (_), pokud tvoří součást samotných dat.
Předpokládejme, že chceme vyhledat literální řetězec „67 %“. Deklarujeme escape znak a umístíme ho bezprostředně před znak, který má být přečten jako data.
LIKE '67#%%' ESCAPE '#';
Pokud chceme najít film „67% vina“, můžeme použít níže uvedený scénář.
SELECT * FROM movies WHERE title LIKE '67#%%' ESCAPE '#';
Všimněte si dvojitého znaku „%%“ v klauzuli LIKE. Prvnímu znaku předchází escape znak (#) a proto je považován za součást hledaného řetězce. Druhý znak si zachovává význam zástupného znaku a odpovídá libovolnému počtu následujících znaků.
Jako řídicí znak může sloužit libovolný znak, takže stejný dotaz funguje i se znaménkem rovnosti.
SELECT * FROM movies WHERE title LIKE '67=%%' ESCAPE '=';
Zástupné znaky velmi dobře pokrývají jednoduché vzory, ale některá vyhledávání vyžadují výraznější pravidla. Níže uvedené srovnání ukazuje, kde leží limit.
MySQL Zástupné znaky vs. REGEXP: který z nich byste měli použít?
MySQL podporuje pouze dva zástupné znaky. Seznamy znaků, jako například [ac], které některé jiné databázové stroje akceptují v rámci LIKE, nejsou podporovány. Pokud vyhledávání vyžaduje rozsahy znaků, střídání nebo ukotvení, Operátor REGEXP je správná volba.
| Kritérium | LIKE se zástupnými znaky | REGELEXP |
|---|---|---|
| Síla vzoru | Pouze dva symboly: % a _ | Třídy znaků, rozsahy, střídání, opakování |
| Typické použití | Vyhledávání předpon, přípon nebo „obsahuje“ | Validace, komplexní párování, více alternativ |
| Využití indexu | Možné, pokud vzor nezačíná znakem %. | Nikdy nepoužívá index |
| čitelnost | Jednoduché pro začátečníky | Strmější křivka učení |
Zpravidla se nejprve používá operátor LIKE: je snadněji čitelný a je to jediný z těchto dvou operátorů, který může těžit z indexu. Pokud jeden vzor musí vyjadřovat několik alternativ, například porovnání všech názvů začínajících číslicí, přejděte na REGEXP. Oba operátory jsou porovnávání pouze pro čtení, takže ani jeden z nich nemění řádky vrácené funkcí INSERT or UPDATE příkazy; filtrují pouze to, co vybere klauzule WHERE.
