8.4.3.7 Recherche de valeurs

MySQL propose les méthodes de recherche standard du SQL, mais aussi les recherches à base d'expression régulière, similaire à celle utilisées dans les utilitaires Unix, tels que vi, grep et sed.

Les méthodes de recherche SQL vous permettent d'utiliser le caractère ``_'' pour remplacer n'importe quel caractère unique, et ``%'' pour remplacer n'importe quel nombre de caractères (y compris le caractère 0). Les recherches SQL sont insensibles à la casse. Reportez vous aux exemples ci-dessous. Remarquez bien que l'on n'utilise pas = ou != mais plutôt LIKE ou NOT LIKE.

Recherche des noms commençant par ``b'':

mysql> SELECT * FROM animaux WHERE nom LIKE "b%";
+--------+---------------+--------+--------+----------------+------------+
| nom    | proprietaire  | espece | genre  | naissance      | mort       |
+--------+---------------+--------+--------+----------------+------------+
| Buffy  | Harold        | chien  | f      | 1989-05-13     | NULL       |
| Bowser | Diane         | chien  | m      | 1989-08-31     | 1995-07-29 |
+--------+---------------+--------+--------+----------------+------------+

Recherche des noms finissant par :``fy'':

mysql> SELECT * FROM animaux WHERE nom LIKE "%fy";
+--------+---------------+--------+--------+----------------+------------+
| nom    | proprietaire  | espece | genre  | naissance      | mort       |
+--------+---------------+--------+--------+----------------+------------+
| Fluffy | Harold        | chat   | f      | 1993-02-04     | NULL       |
| Buffy  | Harold        | chien  | f      | 1989-05-13     | NULL       |
+--------+---------------+--------+--------+----------------+------------+

Recherche des noms contenant ``w'':

mysql> SELECT * FROM animaux WHERE nom LIKE "%w%";
+----------+---------------+--------+--------+----------------+------------+
| nom      | proprietaire  | espece | genre  | naissance      | mort       |
+----------+---------------+--------+--------+----------------+------------+
| Claws    | Gwen          | chat   | m      | 1994-03-17     | NULL       |
| Bowser   | Diane         | chien  | m      | 1989-08-31     | 1995-07-29 |
| Whistler | Gwen          | oiseau | NULL   | 1997-12-09     | NULL       |
+----------+---------------+--------+--------+----------------+------------+

Recherche des noms contenant exactement 5 caractères, utilisez le caractère ``_'' :

mysql> SELECT * FROM animaux WHERE nom LIKE "_____";
+----------+---------------+--------+--------+----------------+------------+
| nom      | proprietaire  | espece | genre  | naissance      | mort       |
+----------+---------------+--------+--------+----------------+------------+
| Claws    | Gwen          | chat   | m      | 1994-03-17     | NULL       |
| Buffy    | Harold        | chien  | f      | 1989-05-13     | NULL       |
+----------+---------------+--------+--------+----------------+------------+

L'autre type de recherche disponible avec MySQL est les expression régulières. Pour utiliser ce type de recherche, il faut ajouter les mots clé REGEXP et NOT REGEXP (ou RLIKE t NOT RLIKE, qui sont des synonymes).

Les caractéristiques des expressions régulières sont :

  • ``.'' remplace n'importe quel caractère qui n'apparaît qu'une fois.
  • Une classe de caractères ``[...]'' remplace n'importe quel caractère qui apparaît dans les crochets. Par exemple, ``[abc]'' peut remplacer ``a'', ``b'' ou ``c''. Pour un intervalle de caractères, utilisez le tiret :. ``[a-z]'' remplace n'importe quelle lettre minuscule, et ``[0-9]'' remplace n'importe quel nombre.
  • ``*'' remplace zéro ou plus occurrences du caractère le précédent immédiatement. Par exemple, ``x*'' remplace n'importe quelle nombre de ``x''. ``[0-9]*'' `'' remplace n'importe quelle nombre de chiffres, et ``.*'' remplace n'importe quelle nombre de caractères.
  • Les expression régulières sont sensibles à la casse, mais vous pouvez utiliser une classe de caractères pour les rendre insensible à la casse. Par exemple, ``[aA]'' remplace n'importe quel ``a'', minuscule ou majuscule, et ``[a-zA-Z]'' remplace n'importe quelle lettre, minuscule ou majuscule.
  • La recherche est positive, si elle est vérifiée à n'importe quel endroit de la valeur (en SQL, ce n'est vrai que sur la valeur entière).
  • Pour contraindre une expression au début ou à la fin de la valeur, utilisez les caractères spéciaux ``^'' pour le début ou ``$'' pour la fin.

Pour illustrer le fonctionnement des expressions régulières, les requêtes précédentes ont été réécrites en utilisant les expressions régulières.

Recherche des noms commençant par ``b'': on utilise ``^'' pour indiquer le début de la valeur, et ``[bB]'' pour rechercher indifféremment, ``b'' minuscule ou majuscule.

mysql> SELECT * FROM animaux WHERE nom REGEXP "^[bB]";
+--------+---------------+--------+--------+----------------+------------+
| nom    | proprietaire  | espece | genre  | naissance      | mort       |
+--------+---------------+--------+--------+----------------+------------+
| Buffy  | Harold        | chien  | f      | 1989-05-13     | NULL       |
| Bowser | Diane         | chien  | m      | 1989-08-31     | 1995-07-29 |
+--------+---------------+--------+--------+----------------+------------+

Recherche des noms finissant par :``fy'': on utilise ``$'' pour indiquer la fin de la valeur

+--------+---------------+--------+--------+----------------+------------+
| nom    | proprietaire  | espece | genre  | naissance      | mort       |
+--------+---------------+--------+--------+----------------+------------+
| Fluffy | Harold        | chat   | f      | 1993-02-04     | NULL       |
| Buffy  | Harold        | chien  | f      | 1989-05-13     | NULL       |
+--------+---------------+--------+--------+----------------+------------+

Recherche des noms contenant ``w'':, on utilise ``[wW]'' pour rechercher les ``w', 'minuscule ou majuscule :

mysql> SELECT * FROM animaux WHERE nom REGEXP "[wW]";
+----------+---------------+--------+--------+----------------+------------+
| nom      | proprietaire  | espece | genre  | naissance      | mort       |
+----------+---------------+--------+--------+----------------+------------+
| Claws    | Gwen          | chat   | m      | 1994-03-17     | NULL       |
| Bowser   | Diane         | chien  | m      | 1989-08-31     | 1995-07-29 |
| Whistler | Gwen          | oiseau | NULL   | 1997-12-09     | NULL       |
+----------+---------------+--------+--------+----------------+------------+

Etant donné qu'une expression régulière est vrai si elle est vrai sur une partie d'une valeur, il n'est pas besoin de caractères spéciaux.

Recherche des noms contenant exactement 5 caractères, utilisez ``^'' et ``$'' pour indiquer le début et la fin de la chaîne, et 5 fois ``.'' pour les 5 caractères.

mysql> SELECT * FROM animaux WHERE nom REGEXP "^.....$";
+----------+---------------+--------+--------+----------------+------------+
| nom      | proprietaire  | espece | genre  | naissance      | mort       |
+----------+---------------+--------+--------+----------------+------------+
| Claws    | Gwen          | chat   | m      | 1994-03-17     | NULL       |
| Buffy    | Harold        | chien  | f      | 1989-05-13     | NULL       |
+----------+---------------+--------+--------+----------------+------------+

Vous auriez pu aussi utiliser l'opérateur ``{n''} `` n-fois'':

mysql> SELECT * FROM animaux WHERE nom REGEXP "^.{5}$";
+----------+---------------+--------+--------+----------------+------------+
| nom      | proprietaire  | espece | genre  | naissance      | mort       |
+----------+---------------+--------+--------+----------------+------------+
| Claws    | Gwen          | chat   | m      | 1994-03-17     | NULL       |
| Buffy    | Harold        | chien  | f      | 1989-05-13     | NULL       |
+----------+---------------+--------+--------+----------------+------------+