L'opérateur LIKE filtre les chaînes de caractères selon un motif dans la clause WHERE. Deux jokers : % (zéro ou plusieurs caractères) et _ (exactement un caractère).
🧪 Testez ce code vous-même : exécutez ces requêtes gratuitement dans notre SQL Playground en ligne — sans installation, directement dans le navigateur.
Syntaxe et jokers
SELECT * FROM employes WHERE nom LIKE 'Mar%'; -- commence par Mar
SELECT * FROM employes WHERE nom LIKE '%tin'; -- finit par tin
SELECT * FROM employes WHERE nom LIKE '%ar%'; -- contient ar
SELECT * FROM employes WHERE nom LIKE 'M_rtin'; -- M + 1 caractère + rtinNOT LIKE
SELECT * FROM produits WHERE code NOT LIKE 'TMP%';Échapper % ou _ avec ESCAPE
Pour chercher un vrai caractère % ou _ dans les données :
SELECT * FROM remises WHERE libelle LIKE '%50\%%' ESCAPE '\';LIKE insensible à la casse
LIKE est sensible à la casse en Oracle. La solution classique : UPPER() des deux côtés.
SELECT * FROM employes WHERE UPPER(nom) LIKE UPPER('mar%');Aller plus loin : REGEXP_LIKE
Pour des motifs complexes, Oracle propose les expressions régulières :
-- noms commençant par Mar ou Mor
SELECT * FROM employes WHERE REGEXP_LIKE(nom, '^M[ao]r', 'i'); -- 'i' = insensible à la cassePerformance : attention au % en début de motif
LIKE 'Mar%' peut utiliser un index sur la colonne ; LIKE '%tin' force un full scan. Sur de gros volumes, envisagez Oracle Text ou une colonne inversée indexée.
Les deux jokers de LIKE en un coup d’œil
| Joker | Signifie | Exemple | Correspond à |
|---|---|---|---|
% | zéro, un ou plusieurs caractères | 'A%' | Alice, Antoine, A |
_ | exactement un caractère | '_ric' | Eric, Aric — mais pas Frederic |
LIKE et les index : quand la requête devient lente
La position du % décide à elle seule si Oracle peut utiliser un index ou doit lire toute la table :
| Motif | L’index peut-il servir ? | Pourquoi |
|---|---|---|
'DUP%' | oui | le début est connu → index range scan |
'%DUP' | non | début inconnu → full table scan |
'%DUP%' | non | full table scan |
UPPER(nom) LIKE ... | seulement avec un index fonctionnel | la fonction masque la colonne |
Sur une grosse table, un LIKE '%mot%' lit toutes les lignes. Si vous avez besoin de recherche « contient » sur du volume, passez à Oracle Text (index CONTEXT + opérateur CONTAINS) plutôt qu'à LIKE.
Erreurs fréquentes avec LIKE
- Utiliser LIKE sans joker —
LIKE 'DUPONT'équivaut à= 'DUPONT'; autant utiliser=, c'est plus clair et plus rapide. - LIKE sur un NUMBER ou une DATE — Oracle fait une conversion implicite dépendante des paramètres NLS. Convertissez explicitement avec
TO_CHAR. - Oublier que NULL ne correspond jamais —
WHERE nom NOT LIKE '%X%'exclut aussi les lignes oùnomest NULL. AjoutezOR nom IS NULLsi besoin. - Croire que LIKE ignore la casse — en Oracle,
'dupont'ne correspond pas à'DUPONT'. Normalisez avecUPPER()des deux côtés.
Questions fréquentes
Quelle différence entre % et _ dans LIKE ?
% remplace zéro, un ou plusieurs caractères ; _ remplace exactement un caractère. ‘A%’ matche A, Alice, Anne ; ‘A_’ ne matche que les chaînes de 2 caractères commençant par A.
Comment rendre LIKE insensible à la casse en Oracle ?
Appliquez UPPER() ou LOWER() des deux côtés (WHERE UPPER(nom) LIKE ‘MAR%’), ou utilisez REGEXP_LIKE avec l’option ‘i’.
LIKE peut-il utiliser un index ?
Oui si le motif ne commence pas par un joker : LIKE ‘Mar%’ exploite un index B-tree classique. LIKE ‘%tin’ impose un parcours complet de la table.
