Travailler avec la valeur NULL
<<<
Recherche de modèles Compter les lignes
>>>

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 |
+-------+--------+--------+------+------------+------+

<< Recherche de modèles >>
Travailler avec la valeur NULL Récupérer des informations à partir d'une table Compter les lignes