SQL LIKE: filtros por prefijo, sufijo y subcadena
SQL LIKE filtra filas al comparar una columna de texto contra un patrón con comodines SQL. El comodín % coincide con cero o más caracteres, y _ coincide con exactamente un carácter. Úsalo para filtros de inicio en SQL ('prefijo%'), filtros de sufijo ('%sufijo') y filtros de subcadena ('%termino%').
Ejemplo de SQL LIKE para coincidencia por prefijo
Salida:
La salida aparecerá aquí...
Salida:
+--------+--------------------+
| nombre | correo |
+--------+--------------------+
| Alicia | [email protected] |
| Alina | [email protected] |
+--------+--------------------+
2 row(s)
Cómo LIKE ‘Al%’ filtra filas
CREATE TABLEeINSERTcarganclientescon cuatro filas.nombre LIKE 'Al%'conserva nombres que empiezan porAl;%coincide con los caracteres restantes.- Con un índice B-tree normal en
nombre, un patrón de prefijo como'Al%'puede usar un escaneo de rango por índice.
¿Qué es el operador SQL LIKE?
SQL LIKE compara una columna de texto con un patrón. LIKE coincide con la cadena completa (no con una subcadena) salvo que agregues % en uno o ambos lados. Sin comodines, LIKE 'texto' se comporta como = 'texto'. Si la columna es NULL, LIKE y NOT LIKE se evalúan como desconocido y la fila queda fuera por WHERE.
Patrones comodín: %, _, y ESCAPE
% y _ cubren la mayoría de necesidades de filtrado. En un patrón comodín de SQL WHERE, combina texto fijo con % y _ para expresar coincidencias por prefijo/sufijo/subcadena:
| Patrón | Significado | Ejemplo de coincidencia |
|---|---|---|
'Al%' | Empieza con Al | Alicia, Alina |
'%org' | Termina con org | [email protected] |
'%mail%' | Contiene mail | [email protected] |
'_ob' | Cualquier carácter + ob | Bob |
Para buscar un % o _ literal, define un carácter de escape con la cláusula ESCAPE:
SELECT etiqueta FROM metricas
WHERE etiqueta LIKE '%100\%%' ESCAPE '\';
\ se declara como carácter de escape, así que \% coincide con un % real en lugar de actuar como comodín.
SQL NOT LIKE: excluir filas coincidentes
NOT LIKE invierte la coincidencia. Una consulta SQL con NOT LIKE devuelve cada fila donde el patrón no coincide:
SELECT nombre FROM clientes
WHERE correo NOT LIKE '%empresa%';
Esto devuelve Bruno y Carla, cualquier persona cuyo correo no contiene empresa. Las filas donde la columna es NULL se excluyen tanto en LIKE como en NOT LIKE. Para incluir NULL, agrega un OR columna IS NULL explícito.
Errores comunes con SQL LIKE
Error: Suponer que LIKE 'termino' coincide con subcadenas.
Incorrecto:
WHERE nombre LIKE 'li'
Correcto:
WHERE nombre LIKE '%li%'
Por qué: LIKE coincide con la cadena completa. Sin % en ambos lados, el patrón exige una coincidencia exacta con li.
Error: Buscar un % literal sin ESCAPE.
Incorrecto:
WHERE descuento LIKE '100%'
Correcto:
WHERE descuento LIKE '100\%' ESCAPE '\'
Por qué: Sin ESCAPE, % actúa como comodín y coincide con 100, 1000, 100USD y cualquier otra cosa que empiece con 100.
Rendimiento de LIKE: prefijo vs comodín inicial
Con un índice B-tree normal, LIKE 'abc%' puede usar un escaneo de rango por índice. Los patrones que empiezan con % (como '%abc' o '%abc%') impiden una búsqueda por índice, así que el motor normalmente escanea muchas más filas.
Para búsquedas de subcadenas a gran escala, usa búsqueda de texto completo (FTS) en lugar de LIKE '%termino%'.
Sensibilidad a mayúsculas por motor
El comportamiento de mayúsculas/minúsculas de LIKE varía según el motor de base de datos:
| Base de datos | Comportamiento predeterminado de LIKE |
|---|---|
| PostgreSQL | Sensible a mayúsculas; usa ILIKE para no sensible |
| MySQL | Depende de la intercalación de la columna (a menudo no sensible) |
| SQLite | No sensible para letras ASCII por defecto |
SQLite trata LIKE 'al%' y LIKE 'Al%' como equivalentes para ASCII. PRAGMA case_sensitive_like = ON cambia a coincidencia exacta por mayúsculas. ILIKE de PostgreSQL es una extensión que no forma parte del estándar SQL.
Aplicar LOWER() a columnas funciona entre motores, pero evita el uso de índices. Cuando el rendimiento importa, prefiere una intercalación no sensible a mayúsculas o operadores específicos del motor.