3.3.4 Récupérer des informations à partir d'une table
3.3 Création et utilisation d'une base de données
3 Tutoriels d'introduction
Manuel de Référence MySQL 4.1 : Version Française
. Sélectionner toutes les données . Sélectionner des lignes particulières . Sélectionner des colonnes particulières . Trier les enregistrements . Calcul sur les Dates . Travailler avec la valeur NULL ->Recherche de modèles . Compter les lignes . Utiliser plus d'une table
|
3.3.4.7 Recherche de modèles
MySQL fournit le standard SQL des recherches de modèles, basé sur une extension
des expressions régulières similaires à celles utilisées par les
utilitaires Unix comme
vi
,
grep
, et
sed
.
La recherche de modèles SQL vous permet d'utiliser le caractère
'_'
pour
trouver n'importe quel caractère et le caractère
'%'
pour trouver un nombre
arbitraire de caractères (y compris aucun caractère). Dans MySQL, la recherche de
modèles est sensible à la casse par défaut. Quelques exemples vous sont
présentés ici.
Notez que vous n'utilisez ni
=
ni
<>
lorsque vous utilisez la recherche
de modèles SQL ; utilisez les opérateurs de comparaison
LIKE
ou
NOT LIKE
à la place.
Pour trouver les noms commençant par la lettre
'b'
:
mysql> SELECT * FROM animaux WHERE nom LIKE "b%"; +--------+--------+--------+------+------------+------------+ | nom | maitre | espece | sexe | naissance | mort | +--------+--------+--------+------+------------+------------+ | Buffy | Harold | chien | f | 1989-05-13 | NULL | | Bowser | Diane | chien | m | 1989-08-31 | 1995-07-29 | +--------+--------+--------+------+------------+------------+
|
Pour trouver les noms finissant par
'fy'
:
mysql> SELECT * FROM animaux WHERE nom LIKE "%fy"; +--------+--------+---------+------+------------+-------+ | nom | maitre | espece | sexe | naissance | mort | +--------+--------+---------+------+------------+-------+ | Fluffy | Harold | chat | f | 1993-02-04 | NULL | | Buffy | Harold | chien | f | 1989-05-13 | NULL | +--------+--------+---------+------+------------+-------+
|
Pour trouver les noms contenant le caractères
'w'
:
mysql> SELECT * FROM animaux WHERE nom LIKE "%w%"; +----------+--------+---------+------+------------+------------+ | nom | maitre | espece | sexe | naissance | mort | +----------+--------+---------+------+------------+------------+ | Claws | Gwen | chat | m | 1994-03-17 | NULL | | Bowser | Diane | chien | m | 1989-08-31 | 1995-07-29 | | Whistler | Gwen | oiseaux | NULL | 1997-12-09 | NULL | +----------+--------+---------+------+------------+------------+
|
Pour trouver les noms contenant exactement 5 caractères, utilisez le caractère
de recherche
'_'
:
mysql> SELECT * FROM animaux WHERE nom LIKE "_____"; +-------+--------+--------+------+------------+------+ | nom | maitre | espece | sexe | naissance | mort | +-------+--------+--------+------+------------+------+ | Claws | Gwen | chat | m | 1994-03-17 | NULL | | Buffy | Harold | chien | f | 1989-05-13 | NULL | +-------+--------+--------+------+------------+------+
|
L'autre type de recherche de modèles fourni par MySQL utilise les expressions
régulières étendues. Lorsque vous testez une recherche avec ce type de modèle,
utilisez les opérateurs
REGEXP
et
NOT REGEXP
(ou
RLIKE
et
NOT RLIKE
qui sont des synonymes).Quelques caractéristiques des expressions régulières étendues sont :
-
Le caractère
'.'
trouve n'importe quel caractère.
-
Une classe de caractères
'[...]'
trouve n'importe quel caractère contenu
entre les crochets. Par exemple, la classe de caractères
'[abc]'
trouve
le caractère
'a'
,
'b'
, ou
'c'
. Pour définir un intervalle de
caractères, utilisez un trait d'union. La classe de caractères
'[a-z]'
trouvera n'importe quel caractère minuscule, tout comme la classe
'[0-9]'
trouvera n'importe quel nombre.
-
Le caractère
'*'
trouvera aucune ou plus d'instances du caractère qui le précède.
Par exemple,
'x*'
trouvera n'importe quel nombre de fois le caractère
'x'
,
'[0-9]*'
trouvera n'importe quel nombre, et
'.*'
trouvera n'importe quel nombre de fois n'importe quel caractère.
-
Le modèle est trouvé s'il se produit n'importe où dans la valeur testée.
(Les modèles SQL ne sont trouvés que s'ils sont présents en valeur entière.)
-
Pour ancrer un modèle de sorte qu'il soit trouvé au début ou à la fin de valeur testée,
utilisez
'^'
au début ou bien
'$'
à la fin du modèle.
Pour démontrer comment les expressions régulières fonctionnent, les requêtes
LIKE
vues précédemment ont été réécrites pour utiliser
REGEXP
.
Pour trouver les noms qui commencent par la lettre
'b'
, utilisez
'^'
pour
trouver le début du nom :
mysql> SELECT * FROM animaux WHERE nom REGEXP "^b"; +--------+--------+--------+------+------------+------------+ | nom | maitre | espece | sexe | naissance | mort | +--------+--------+--------+------+------------+------------+ | Buffy | Harold | chien | f | 1989-05-13 | NULL | | Bowser | Diane | chien | m | 1989-08-31 | 1995-07-29 | +--------+--------+--------+------+------------+------------+
|
Avant la version 3.23.4 de MySQL,
REGEXP
était sensible à la casse,
et la requête précédente ne retournait aucune ligne. Pour trouver la lettre
'b'
minuscule ou majuscule, utilisez cette requête à la place :
mysql> SELECT * FROM animaux WHERE nom REGEXP "^[bB]";
|
Depuis MySQL 3.23.4, pour forcer
REGEXP
à être sensible à la casse,
utilisez le mot-clé
BINARY
pour faire de la chaîne, une chaîne binaire.
Cette requête trouvera uniquement la lettre minuscule
'b'
au début du nom :
mysql> SELECT * FROM animaux WHERE nom REGEXP BINARY "^b";
|
Pour trouver les noms finissant par
'fy'
, utilisez
'$'
pour trouver
la fin du nom :
mysql> SELECT * FROM animaux WHERE nom REGEXP "fy$"; +---------+--------+--------+-------+------------+------+ | nom | maitre | espece | sexe | naissance | mort | +---------+--------+--------+-------+------------+------+ | Fluffy | Harold | chat | f | 1993-02-04 | NULL | | Buffy | Harold | chien | f | 1989-05-13 | NULL | +---------+--------+--------+-------+------------+------+
|
Pour trouver les noms contenant la lettre
'w'
minuscule ou majuscule,
utilisez la requête suivante :
mysql> SELECT * FROM animaux WHERE nom REGEXP "w"; +----------+--------+---------+------+------------+------------+ | nom | maitre | espece | sexe | naissance | mort | +----------+--------+---------+------+------------+------------+ | Claws | Gwen | chat | m | 1994-03-17 | NULL | | Bowser | Diane | chien | m | 1989-08-31 | 1995-07-29 | | Whistler | Gwen | oiseaux | NULL | 1997-12-09 | NULL | +----------+--------+---------+------+------------+------------+
|
Parce qu'une expression régulière est trouvée si le modèle
se trouve 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
modèle recherché pour trouver la valeur entière comme
cela aurait été le cas en utilisant les modèles de recherche SQL.
Pour trouver les noms contenant exactement 5 caractères, utilisez
'^'
et
'$'
pour trouver le début et la fin du nom, et 5 instances de
'.'
au milieu :
mysql> SELECT * FROM animaux WHERE nom REGEXP "^.....$"; +-------+--------+--------+------+------------+------+ | nom | maitre | espece | sexe | naissance | mort | +-------+--------+--------+------+------------+------+ | Claws | Gwen | chat | m | 1994-03-17 | NULL | | Buffy | Harold | chien | f | 1989-05-13 | NULL | +-------+--------+--------+------+------------+------+
|
Vous pouvez aussi écrire la requête suivante en utilisant l'opérateur
'{n'
}
``répéter-
n
-fois'' :
mysql> SELECT * FROM animaux WHERE nom REGEXP "^.{5}$"; +-------+--------+--------+------+------------+------+ | nom | maitre | espece | sexe | naissance | mort | +-------+--------+--------+------+------------+------+ | Claws | Gwen | chat | m | 1994-03-17 | NULL | | Buffy | Harold | chien | f | 1989-05-13 | NULL | +-------+--------+--------+------+------------+------+
|
|