3.3.4.7 Correspondance de motifs
MySQL fournit une correspondance de motifs SQL standard ainsi qu’une forme de correspondance de motifs basée sur des expressions régulières étendues similaires à celles utilisées par les utilitaires Unix tels que vi, grep et sed.
Le filtrage de motifs SQL vous permet d’utiliser _
pour correspondre à tout caractère unique et %
pour correspondre à un nombre arbitraire de caractères (y compris des caractères nuls). Dans MySQL, les motifs SQL sont insensibles à la casse par défaut. Quelques exemples sont présentés ici. N’utilisez pas =
ou <>
lorsque vous utilisez des motifs SQL. Utilisez plutôt les opérateurs de comparaison LIKE
ou NOT LIKE
.
Pour trouver des noms commençant par 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 |+--------+--------+---------+------+------------+------------+
Pour trouver les noms se terminant par 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 |+--------+--------+---------+------+------------+-------+
Pour trouver les noms contenant un 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 |+----------+-------+---------+------+------------+------------+
Pour trouver les noms contenant exactement cinq caractères, utilisez cinq instances du caractère modèle _
:
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 |+-------+--------+---------+------+------------+-------+
L’autre type de correspondance de motifs fourni par MySQL utilise des expressions régulières étendues. Lorsque vous testez une correspondance pour ce type de motif, utilisez la fonction REGEXP_LIKE()
(ou les opérateurs REGEXP
ou RLIKE
, qui sont des synonymes de REGEXP_LIKE()
).
La liste suivante décrit certaines caractéristiques des expressions régulières étendues :
-
.
correspond à tout caractère unique. -
Une classe de caractères
correspond à tout caractère compris entre les crochets. Par exemple,
correspond à
a
,b
, ouc
. Pour nommer une plage de caractères, utilisez un tiret.correspond à toute lettre, tandis que
correspond à tout chiffre.
-
*
correspond à zéro ou plusieurs instances de la chose qui le précède. Par exemple,x*
correspond à un nombre quelconque de caractèresx
,*
correspond à un nombre quelconque de chiffres et.*
correspond à un nombre quelconque de n’importe quoi. -
Une correspondance de motif d’expression régulière réussit si le motif correspond n’importe où dans la valeur testée. (Cela diffère d’une correspondance de motif
LIKE
, qui ne réussit que si le motif correspond à la valeur entière). -
Pour ancrer un motif afin qu’il doive correspondre au début ou à la fin de la valeur testée, utilisez
^
au début ou$
à la fin du motif.
Pour démontrer le fonctionnement des expressions régulières étendues, les requêtes LIKE
présentées précédemment sont réécrites ici pour utiliser REGEXP_LIKE()
.
Pour trouver les noms commençant par b
, utilisez ^
pour correspondre au début du nom :
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 |+--------+--------+---------+------+------------+------------+
Pour forcer une comparaison d’expression régulière à être sensible à la casse, utilisez une collation sensible à la casse, ou utilisez le mot clé BINARY
pour faire de l’une des chaînes une chaîne binaire, ou spécifiez le caractère de contrôle de correspondance c
. Chacune de ces requêtes ne correspond qu’aux minuscules b
au début d’un nom :
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');
Pour trouver les noms se terminant par fy
, utilisez $
pour correspondre à la fin du nom :
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 |+--------+--------+---------+------+------------+-------+
Pour trouver des noms contenant un w
, utilisez cette requête :
mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '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 |+----------+-------+---------+------+------------+------------+
Parce qu’un motif d’expression régulière correspond s’il apparaît n’importe où dans la valeur, il n’est pas nécessaire dans la requête précédente de mettre un joker de chaque côté du motif pour qu’il corresponde à la valeur entière, comme ce serait le cas avec un motif SQL.
Pour trouver des noms contenant exactement cinq caractères, utilisez ^
et $
pour correspondre au début et à la fin du nom, et cinq instances de .
entre les deux :
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 |+-------+--------+---------+------+------------+-------+
Vous pourriez également écrire la requête précédente en utilisant l’opérateur {
(« 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 |+-------+--------+---------+------+------------+-------+
Pour plus d’informations sur la syntaxe des expressions régulières, consultez la Section 12.8.2, » Expressions régulières « .