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říklad
odpovídá
a
,b
neboc
. Chcete-li pojmenovat rozsah znaků, použijte pomlčku.odpovídá libovolnému písmenu, zatímco
odpoví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 |+-------+--------+---------+------+------------+-------+