3.3.4.7 Porovnávání vzorů
MySQL poskytuje standardní SQL porovnávání vzorů a také formu porovnávání vzorů založenou na rozšířených regulárních výrazech podobných těm, které používají unixové nástroje jako vi, grep a sed.
SQL porovnávání vzorů umožňuje použít _ pro porovnání libovolného jednotlivého znaku a % pro porovnání libovolného počtu znaků (včetně nulových znaků). V databázi MySQL vzory SQL ve výchozím nastavení nerozlišují velká a malá písmena. Některé příklady jsou uvedeny zde. Při použití vzorů SQL nepoužívejte = ani <>. Místo toho použijte porovnávací operátory LIKE nebo NOT LIKE.
Chcete-li vyhledat názvy začínající b:
mysql> SELECT * FROM pet WHERE name LIKE 'b%';+--------+--------+---------+------+------------+------------+| name | owner | species | sex | birth | death |+--------+--------+---------+------+------------+------------+| Buffy | Harold | dog | f | 1989-05-13 | NULL || Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |+--------+--------+---------+------+------------+------------+
Chcete-li najít názvy končící na fy:
mysql> SELECT * FROM pet WHERE name LIKE '%fy';+--------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+--------+--------+---------+------+------------+-------+| Fluffy | Harold | cat | f | 1993-02-04 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+--------+--------+---------+------+------------+-------+
Pro vyhledání jmen obsahujících w:
mysql> SELECT * FROM pet WHERE name LIKE '%w%';+----------+-------+---------+------+------------+------------+| name | owner | species | sex | birth | death |+----------+-------+---------+------+------------+------------+| Claws | Gwen | cat | m | 1994-03-17 | NULL || Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 || Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |+----------+-------+---------+------+------------+------------+
Chcete-li najít jména obsahující přesně pět znaků, použijte pět výskytů vzorového znaku _:
mysql> SELECT * FROM pet WHERE name LIKE '_____';+-------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+-------+--------+---------+------+------------+-------+| Claws | Gwen | cat | m | 1994-03-17 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+-------+--------+---------+------+------------+-------+
Druhý typ porovnávání vzorů, který poskytuje MySQL, používá rozšířené regulární výrazy. Při testování shody tohoto typu vzoru použijte funkci REGEXP_LIKE() (nebo operátory REGEXP nebo RLIKE, které jsou synonymy pro REGEXP_LIKE()).
Následující seznam popisuje některé vlastnosti rozšířených regulárních výrazů:
-
.odpovídá libovolnému jednotlivému znaku. -
Třída znaků
odpovídá libovolnému znaku uvnitř závorek. Napříkladodpovídáa,bneboc. Chcete-li pojmenovat rozsah znaků, použijte pomlčku.odpovídá libovolnému písmenu, zatímcoodpovídá libovolné číslici. -
*odpovídá nule nebo více výskytům věci, která mu předchází. Napříkladx*odpovídá libovolnému počtu znakůx,*odpovídá libovolnému počtu číslic a.*odpovídá libovolnému počtu čehokoli. -
Shoda vzoru regulárního výrazu je úspěšná, pokud vzor odpovídá kdekoli v testované hodnotě. (Tím se liší od shody vzoru
LIKE, která je úspěšná pouze tehdy, pokud vzor odpovídá celé hodnotě.) -
Chcete-li ukotvit vzor tak, aby se musel shodovat se začátkem nebo koncem testované hodnoty, použijte
^na začátku nebo$na konci vzoru.
Pro demonstraci fungování rozšířených regulárních výrazů jsou zde dříve uvedené dotazy LIKE přepsány tak, že používají REGEXP_LIKE().
Chcete-li najít jména začínající na b, použijte ^ pro porovnání začátku jména:
mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b');+--------+--------+---------+------+------------+------------+| name | owner | species | sex | birth | death |+--------+--------+---------+------+------------+------------+| Buffy | Harold | dog | f | 1989-05-13 | NULL || Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 |+--------+--------+---------+------+------------+------------+
Chcete-li vynutit porovnávání regulárních výrazů s rozlišováním malých a velkých písmen, použijte collation s rozlišováním velkých a malých písmen, nebo použijte klíčové slovo BINARY, aby se jeden z řetězců stal binárním řetězcem, nebo zadejte znak c pro kontrolu shody. Každý z těchto dotazů odpovídá pouze malým písmenům b na začátku názvu:
SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b' COLLATE utf8mb4_0900_as_cs);SELECT * FROM pet WHERE REGEXP_LIKE(name, BINARY '^b');SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b', 'c');
Chcete-li najít jména končící fy, použijte $ pro porovnání konce jména:
mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, 'fy$');+--------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+--------+--------+---------+------+------------+-------+| Fluffy | Harold | cat | f | 1993-02-04 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+--------+--------+---------+------+------------+-------+
Chcete-li najít jména obsahující Chcete-li najít jména obsahující přesně pět znaků, použijte Předchozí dotaz můžete také zapsat pomocí operátoru Další informace o syntaxi regulárních výrazů najdete v kapitole 12.8.2, „Regulární výrazy“.w, použijte tento dotaz: ^ a $ pro shodu se začátkem a koncem jména a pěti výskytů . mezi nimi: mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^.....$');+-------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+-------+--------+---------+------+------------+-------+| Claws | Gwen | cat | m | 1994-03-17 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+-------+--------+---------+------+------------+-------+{ („repeat-n}n-times“): mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^.{5}$');+-------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+-------+--------+---------+------+------------+-------+| Claws | Gwen | cat | m | 1994-03-17 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+-------+--------+---------+------+------------+-------+