SQL LIKE : filtres préfixe, suffixe et sous-chaîne

SQL LIKE filtre les lignes en comparant une colonne texte à un motif avec des jokers SQL. Le joker % correspond à zéro ou plusieurs caractères, et _ correspond à exactement un caractère. Utilisez-le pour des filtres SQL de type “commence par” ('prefixe%'), “se termine par” ('%suffixe') et “contient” ('%terme%').

Exemple SQL LIKE pour correspondance de préfixe

Sortie :

La sortie apparaîtra ici...

Sortie :

+-------+----------------+
| nom   | email          |
+-------+----------------+
| Alice | [email protected] |
| Aline | [email protected] |
+-------+----------------+
2 row(s)

Comment LIKE ‘Al%’ filtre les lignes

  1. CREATE TABLE et INSERT remplissent clients avec quatre lignes.
  2. nom LIKE 'Al%' conserve les noms qui commencent par Al, et % correspond aux caractères restants.
  3. Avec un index B-tree standard sur nom, un motif préfixe comme 'Al%' peut utiliser un scan d’intervalle d’index.

Qu’est-ce que l’opérateur SQL LIKE ?

SQL LIKE compare une colonne texte à un motif. LIKE fait la correspondance sur toute la chaîne (pas une sous-chaîne) sauf si vous ajoutez % d’un côté ou des deux côtés. Sans joker, LIKE 'texte' se comporte comme = 'texte'. Si la colonne est NULL, LIKE et NOT LIKE sont évalués comme inconnus et la ligne est exclue par WHERE.

Motifs génériques : %, _, et ESCAPE

% et _ couvrent la plupart des besoins de filtrage. Dans un motif générique SQL pour WHERE, mélangez du texte fixe avec % et _ pour exprimer des correspondances de préfixe, suffixe ou sous-chaîne :

MotifSignificationCorrespondance d’exemple
'Al%'Commence par AlAlice, Aline
'%org'Se termine par org[email protected]
'%mail%'Contient mail[email protected]
'_ob'N’importe quel caractère + obBob

Pour rechercher un % ou un _ littéral, définissez un caractère d’échappement avec la clause ESCAPE :

SELECT libelle FROM metriques
WHERE libelle LIKE '%100\%%' ESCAPE '\';

Le \ est déclaré comme caractère d’échappement, donc \% correspond à un vrai % au lieu d’agir comme un joker.

SQL NOT LIKE : exclure les lignes correspondantes

NOT LIKE inverse la correspondance. Une requête SQL NOT LIKE renvoie toutes les lignes où le motif ne correspond pas :

SELECT nom FROM clients
WHERE email NOT LIKE '%corp%';

Cette requête renvoie Bob et Carole, c’est-à-dire tous ceux dont l’email ne contient pas corp. Les lignes où la colonne est NULL sont exclues des résultats de LIKE et de NOT LIKE. Pour inclure les NULL, ajoutez explicitement OR nom_colonne IS NULL.

Erreurs courantes avec SQL LIKE

Erreur : supposer que LIKE 'terme' correspond à des sous-chaînes.

Faux :

WHERE nom LIKE 'li'

Correct :

WHERE nom LIKE '%li%'

Pourquoi : LIKE fait la correspondance sur toute la chaîne. Sans % de chaque côté, le motif exige une égalité exacte avec li.

Erreur : rechercher un % littéral sans ESCAPE.

Faux :

WHERE remise LIKE '100%'

Correct :

WHERE remise LIKE '100\%' ESCAPE '\'

Pourquoi : sans ESCAPE, % agit comme un joker et correspond à 100, 1000, 100USD, et toute autre valeur qui commence par 100.

Performance de LIKE : préfixe vs joker initial

Avec un index B-tree standard, LIKE 'abc%' peut utiliser un scan d’intervalle d’index. Les motifs qui commencent par % (comme '%abc' ou '%abc%') empêchent une recherche par index, donc le moteur parcourt généralement beaucoup plus de lignes.

Pour les recherches de sous-chaînes à grande échelle, utilisez la recherche plein texte (FTS) au lieu de LIKE '%terme%'.

Sensibilité à la casse selon le dialecte

Le comportement de LIKE sur la casse varie selon le moteur de base de données :

Base de donnéesComportement LIKE par défaut
PostgreSQLSensible à la casse ; utilisez ILIKE pour ignorer la casse
MySQLDépend de la collation de la colonne (souvent insensible)
SQLiteInsensible à la casse pour les lettres ASCII par défaut

SQLite traite LIKE 'al%' et LIKE 'Al%' de la même façon pour l’ASCII. PRAGMA case_sensitive_like = ON active une correspondance avec casse exacte. ILIKE de PostgreSQL est une extension qui ne fait pas partie du standard SQL.

Appliquer LOWER() à une colonne fonctionne entre dialectes, mais empêche l’utilisation de l’index. Préférez une collation insensible à la casse ou des opérateurs spécifiques au dialecte quand la performance compte.