Curso
Te guste o no, el operador LIKE es esencial en SQL. Proporciona a los científicos e ingenieros de datos la capacidad de filtrar datos según coincidencias de cadenas específicas. Este artículo proporciona un tutorial rápido sobre LIKE para principiantes e intermedios.
El operador LIKE de SQL para la coincidencia de patrones
Nota: Para ejecutar fácilmente tú mismo todo el código de ejemplo de este tutorial, puedes crear un libro de trabajo gratuito de DataLab conSQL instalado y bases de datos con datos de ejemplo.
Supongamos que tienes una tabla employees y quieres encontrar todos los nombres que empiezan por ‘A’:
|
empleados |
|||||
|
emp_no |
birth_date |
first_name |
last_name |
gender |
hire_date |
|
10001 |
1953-09-02T00:00:00.000Z |
Georgi |
Facello |
M |
1986-06-26T00:00:00.000Z |
|
10002 |
1964-06-02T00:00:00.000Z |
Bezalel |
Simmel |
F |
1985-11-21T00:00:00.000Z |
|
10003 |
1959-12-03T00:00:00.000Z |
Parto |
Bamford |
M |
1986-08-28T00:00:00.000Z |
Podrías dedicar tiempo a revisar la tabla manualmente. Pero, ¿por qué harías eso cuando tienes el operador LIKE?
SELECT DISTINCT
first_name
FROM employees
WHERE first_name LIKE 'A%'
La magia aquí está en la cláusula `WHERE first_name LIKE ‘A%’`, que significa "busca todos los first_name que empiecen por "A" y acaben con cualquier número de caracteres". El `A%` se conoce aquí como patrón de concordancia.
El `%` no es el único comodín que puedes utilizar junto con el operador LIKE. También puedes utilizar el signo de subrayado `_`,:
`%`coincide con cualquier número de caracteres.`_`coincide con cualquier carácter.
La sintaxis es fácil de recordar. Sencillamente:
column_name LIKE pattern
Puedes utilizar LIKE para conseguir una gran variedad de coincidencias de patrones. He aquí cómo:
Ejemplos SQL LIKE para principiantes
A continuación, te presentamos algunos ejemplos prácticos de cómo puedes utilizar la declaración LIKE y los resultados de nuestro conjunto de datos de muestra.
1. Utiliza LIKE para la coincidencia exacta de cadenas
Si quieres realizar una coincidencia exacta de cadenas, utiliza LIKE sin ‘%’ o ‘_’
SELECT
first_name, last_name
FROM employees
WHERE first_name LIKE 'Barry' -- the same as WHERE first_name = ‘Barry’
2. Utiliza "%" para coincidir con cualquier número de caracteres
‘%’ puede utilizarse para hacer coincidir cualquier número (incluso cero) de caracteres: un número, un alfabeto o un símbolo.
Supongamos que quieres encontrar a todos los empleados cuyo nombre empiece por ‘Adam’; puedes utilizar el patrón ‘Adam%’
SELECT DISTINCT
first_name
FROM employees
WHERE first_name LIKE 'Adam%'
Para encontrar nombres que acaben en "z" prueba el patrón ‘%z’. También puedes utilizar varios ‘%’ en un mismo patrón. Por ejemplo, si quieres encontrar nombres que contengan "z", utiliza ‘%z%’.
3. Utiliza "_" para que coincida con un (y sólo un) carácter
Como en el juego del Ahorcado, en el signo de subrayado _ sólo cabe un carácter.
¿De cuántas formas se puede escribir Le_n? El patrón coincidiría con cualquier cosa, desde "Lexn", "LeAn", "Le3n" o "Le-n".
SELECT DISTINCT
first_name
FROM employees
WHERE first_name LIKE 'Le_n'
¿Cuáles son los diferentes nombres con sólo tres caracteres? Podemos averiguarlo utilizando tres guiones bajos consecutivos ___ como patrón.
SELECT DISTINCT
first_name
FROM employees
WHERE first_name LIKE '___'
4. Utiliza tanto "%" como "_" para coincidir con cualquier patrón
Por supuesto, puedes utilizar tanto ‘%’ como ‘_’ para crear patrones interesantes.
SELECT DISTINCT
first_name
FROM employees
WHERE first_name LIKE '%ann_'
El patrón ‘%ann_’ coincide con una cadena que empieza con cualquier número de caracteres y acaba con "ann" y otro carácter.
5. Utiliza NOT para encontrar cadenas que no coincidan con un patrón
¿Y si quieres encontrar todas las filas que no cumplen un criterio específico? Puedes utilizar el operador NOT LIKE. Por ejemplo, para encontrar todos los títulos excepto "Personal", podemos utilizar la sintaxis
`WHERE title NOT LIKE ‘Staff’`
Esto es exactamente equivalente a la sintaxis
`WHERE title != ‘Staff’`
SELECT DISTINCT
title
FROM titles
WHERE title NOT LIKE 'Staff'
Por supuesto, puedes utilizar NOT LIKE con cualquiera de los patrones que hemos descrito.
SELECT DISTINCT
title
FROM titles
WHERE title NOT LIKE '%engineer'
6. Utiliza LOWER (o UPPER) con LIKE para la coincidencia de patrones sin distinción entre mayúsculas y minúsculas
Puedes utilizar la siguiente sintaxis si necesitas realizar una concordancia de patrones pero no estás seguro de si la cadena está almacenada en minúsculas, mayúsculas o mixtas.
`LOWER(column_name) LIKE pattern`
La función LOWER() devuelve todas las cadenas en minúsculas, independientemente de si están almacenadas en mayúsculas, minúsculas o mixtas.
Cuando utilices la sintaxis, ¡asegúrate de escribir el patrón en minúsculas! De lo contrario, es posible que no obtengas ninguna coincidencia.
También podrías sustituir LOWER por UPPER en la sintaxis anterior. Asegúrate de escribir el patrón en mayúsculas.
`UPPER(column_name) LIKE PATTERN`
Por ejemplo, para saber si el nombre de un empleado es "Joanne", "JoAnne", "Joanna" o "JoAnna", prueba cualquiera de las siguientes opciones:
SELECT DISTINCT
first_name
FROM employees
WHERE lower(first_name) LIKE 'joann_'
SELECT DISTINCT
first_name
FROM employees
WHERE UPPER(first_name) LIKE 'JOANN_'
7. SQL LIKE con varios valores utilizando OR/AND
También puedes combinar varias condiciones utilizando la sintaxis LIKE.
Por ejemplo, utiliza la condición OR para encontrar resultados que satisfagan al menos uno de los múltiples patrones LIKE.
SELECT DISTINCT
first_name
FROM employees
WHERE
first_name LIKE 'Ad_l' OR
first_name LIKE 'Ad_m'
Por otra parte, para encontrar una cadena que coincida con varias condiciones LIKE, utiliza la palabra clave AND.
SELECT DISTINCT
first_name
FROM employees
WHERE
first_name LIKE '%am%' AND
first_name LIKE '%me%'
La sintaxis LIKE puede aplicarse a varias columnas siempre que su tipo de variable sea un carácter de longitud variable (varchar). Sabiendo que podemos encontrar los nombres de los empleados cuyas iniciales son "Z. Z."
SELECT DISTINCT
first_name, last_name
FROM employees
WHERE
first_name LIKE 'Z%' AND
last_name LIKE 'Z%'
8. Utiliza LIKE en la cláusula SELECT CASE WHEN
Hasta ahora, nos hemos centrado en utilizar LIKE como condición para seleccionar registros en la cláusula WHERE. También utilizamos LIKE en la cláusula SELECT. Por ejemplo, ¿podemos saber cuántos empleados llamados "Adán" hay en nuestra base de datos?
SELECT
COUNT(CASE WHEN first_name LIKE 'Adam' THEN 1 END) num_employees_adam
FROM employees
Por otra parte, ¿cuántos empleados tienen las iniciales "A.Z."?
SELECT
COUNT(CASE WHEN first_name LIKE 'A%' AND last_name LIKE 'Z%' THEN 1 END) num_employees
FROM employees
Patrones comunes utilizados en SQL LIKE
Aquí tienes un resumen de los patrones que discutimos para una referencia rápida:
| Patrón | Descripción | Ejemplo de uso |
|---|---|---|
| A% | Coincide con las cadenas que empiezan por "A" | Encontrar nombres que empiecen por "A |
| %z% | Coincide con cadenas que contengan "z" | Encontrar nombres que contengan "z" |
| Le_n | Coincide con cadenas como "Len", "Leon", etc. | Encontrar nombres con una sola variación de caracteres |
| %ann_ | Coincide con cadenas acabadas en "ann" y un carácter adicional | Encontrar nombres como "Joann", "Joanna" |
Ejemplos intermedios de SQL LIKE
La función LIKE es muy similar en los distintos sabores de SQL (por ejemplo, PostgreSQL, MySQL, Redshift, etc.). Sin embargo, algunos tienen variaciones adicionales de la función LIKE que merece la pena mencionar.
1. El operador ILIKE
Disponible en Redshift y PostgreSQL, ILIKE es la versión de LIKE que no distingue entre mayúsculas y minúsculas. Por tanto, todos los siguientes son equivalentes.
SELECT
datacamp ILIKE ‘datacamp’, -- returns TRUE
DATACAMP ILIKE ‘datacamp’, -- returns TRUE
Datacamp ILIKE ‘datacamp’, -- returns TRUE
datacamp ILIKE ‘DataCamp’, -- returns TRUE
2. Utilizar corchetes [] y [^] como caracteres comodín
Los usuarios de T-SQL o SQL Server disponen de caracteres comodín adicionales para una coincidencia de patrones más compleja.
La sintaxis de corchetes [] coincide con cualquier carácter específico dentro del rango o conjunto. Por ejemplo, todo lo siguiente devolverá TRUE.
SELECT
‘Carson’ LIKE ‘[C-K]arson’, -- returns TRUE because C is in the range C-K
‘Karson’ LIKE ‘[C-K]arson’, -- returns TRUE because K is in range
‘Larson’ LIKE ‘[CKL]arson’, -- returns TRUE because L is in the set [CKL]
‘Parson’ LIKE ‘[C-K]arson’ -- returns FALSE because P is out of range
El comodín caret-in-square-bracket [^] coincide con cualquier carácter que no esté dentro del rango o conjunto especificado. ¿Puedes ver el porqué de los siguientes resultados?
SELECT
‘Carson’ LIKE ‘[^C-K]arson’ -- returns FALSE
‘Parson’ LIKE ‘[^C-K]arson’ -- returns TRUE
Aquí, como "C" está dentro del rango de [C-K], el patrón ‘C’ no coincidirá con [^C-K]. Así, "Carson" no coincidirá con [^C-K]arson, pero "Parson" sí.
3. El operador RLIKE
Disponible en MySQL, el operador RLIKE reconoce expresiones regulares (RegEx) en el patrón. RegEx es una herramienta potente y versátil para la concordancia avanzada de patrones.
No está de más tener nociones básicas de RegEx, sobre todo si tu versión de SQL admite RLIKE. Puedes aprender más sobre RegEx con nuestro curso Expresiones regulares en Python.
SELECT DISTINCT
first_name
FROM employees
WHERE first_name RLIKE 'Susann[a-e]'
4. El operador "~~
En PostgreSQL, ‘~~’ es completamente sinónimo de LIKE. También existen equivalentes de ILIKE, NOT LIKE, y NOT ILIKE.
|
Operario |
Equivalente |
|
|
|
|
|
|
|
|
|
|
|
|
Solución de problemas: Errores y equivocaciones comunes con LIKE
Aquí tienes algunos errores comunes que puedes encontrarte al utilizar LIKE, y cómo corregirlos:
- No hay resultados: Comprueba si se distingue entre mayúsculas y minúsculas. En algunos dialectos de SQL,
LIKEdistingue por defecto entre mayúsculas y minúsculas. UtilizaLOWER()oILIKE(si es compatible) para la coincidencia sin distinción entre mayúsculas y minúsculas. - Resultados inesperados con comodines: Asegúrate de que
%y_se utilizan correctamente.%coincide con cualquier número de caracteres, mientras que_coincide exactamente con un carácter. Colocarlos mal puede provocar coincidencias inesperadas. - Problemas de rendimiento: Si tu consulta es lenta, busca la dirección
%en los patrones (por ejemplo,%pattern), que desactiva el uso de índices. Reescribe los patrones para que empiecen por una cadena concreta, si es posible. Consulta la sección siguiente para saber más sobre el rendimiento. - Errores de inyección SQL: Si utilizas la entrada del usuario en tu consulta, asegúrate de que está correctamente parametrizada para evitar errores de sintaxis o vulnerabilidades.
- Caracteres especiales en los patrones: Los símbolos comodín como
%y_en la cadena de búsqueda deben escaparse si se pretende que sean caracteres literales. UtilizaESCAPEen tu consulta para definir un carácter de escape.
WHERE column_name LIKE '50\% OFF' ESCAPE '\'
Consideraciones de rendimiento al utilizar el operador LIKE
El operador LIKE es estupendo, pero puede afectar potencialmente al rendimiento de la consulta, sobre todo cuando se utiliza en grandes conjuntos de datos. He aquí algunas consideraciones para optimizar su uso:
- Índices: El operador
LIKEfunciona mejor cuando el patrón empieza por una cadena constante, comoAdam%, porque la base de datos puede utilizar índices. Sin embargo, patrones como%Adamo%Adam%requieren un escaneo completo de la tabla, lo que puede resultar lento para tablas grandes. - Evita los comodines iniciales: Empezar un patrón con
%, como%pattern, desactiva el uso de índices, ya que la base de datos tiene que examinar cada registro. - Intercalación y concordancia insensible a mayúsculas y minúsculas: Utilizar funciones como
LOWER()oUPPER()en las columnas para realizar búsquedas que no distingan entre mayúsculas y minúsculas también puede impedir que se utilicen los índices. En su lugar, asegúrate de que la intercalación de la base de datos está configurada adecuadamente para realizar comparaciones sin distinguir mayúsculas de minúsculas. - Enfoques alternativos: Para grandes conjuntos de datos, considera la posibilidad de utilizar la búsqueda de texto completo o funciones de búsqueda específicas de la base de datos, como los índices
GINen PostgreSQL oFULLTEXTen MySQL, cuando realices búsquedas de cadenas complejas o frecuentes. - Consultas selectivas: Limita el alcance de tus consultas utilizando filtros adicionales, como intervalos de fechas o columnas numéricas, para reducir los datos procesados por el operador
LIKE.
LIKE vs. Búsqueda de texto completo
La búsqueda de texto completo, disponible en bases de datos como MySQL, PostgreSQL y SQL Server, está optimizada para consultas de texto avanzadas, como la búsqueda de palabras clave, el manejo de variaciones lingüísticas y la clasificación de resultados por relevancia. Mientras que LIKE es estupendo para tareas básicas, la búsqueda de texto completo es mejor para búsquedas de texto escalables y sofisticadas.
Utiliza SQL LIKE con confianza
Dominar las funciones SQL es clave para tener éxito en la ciencia de datos, y el comando LIKE de SQL no es una excepción. Un buen dominio de SQL potenciará tu progreso analítico, ¡así que asegúrate de aprenderlo bien!
Para más recursos sobre SQL, asegúrate de consultar lo siguiente:
Conviértete en Ingeniero de Datos
Preguntas frecuentes
¿Se puede utilizar el operador LIKE con tipos de datos numéricos?
No, el operador LIKE se utiliza específicamente para la concordancia de patrones con tipos de datos de cadena como CHAR,VARCHAR y TEXT. Para los tipos de datos numéricos, se utilizan otros operadores de comparación como =,<,>, etc.
¿Cómo es el rendimiento de LIKE en comparación con otros operadores SQL?
El operador LIKE puede ser menos eficaz, especialmente con patrones que empiecen por %, ya que requiere un escaneo completo de la tabla. La indexación no puede utilizarse eficazmente en estos casos, lo que podría ralentizar las consultas en grandes conjuntos de datos.
¿Existe algún problema de seguridad al utilizar LIKE en SQL?
Aunque LIKE en sí no es intrínsecamente inseguro, utilizar entradas de usuario directamente en consultas SQL puede dar lugar a ataques de inyección SQL. Limpia siempre las entradas y considera el uso de consultas parametrizadas para mitigar este riesgo.
¿Cómo gestionarías las búsquedas que distinguen entre mayúsculas y minúsculas en una versión de SQL que no admite ILIKE?
En las versiones de SQL sin ILIKEpuedes utilizar LOWER(column_name) LIKE LOWER(pattern) o UPPER(column_name) LIKE UPPER(pattern) para realizar búsquedas que no distingan entre mayúsculas y minúsculas.
¿Se puede utilizar LIKE con caracteres no ASCII?
Sí, LIKE puede utilizarse con caracteres no ASCII siempre que la codificación de la base de datos admita esos caracteres. Esto incluye UTF-8, que se utiliza habitualmente para admitir una amplia gama de caracteres.
¿Cómo modificarías una consulta LIKE para buscar un carácter comodín literal (por ejemplo, % o _)?
Para buscar un literal % o _, debes utilizar un carácter de escape. Por ejemplo, en SQL Server, puedes utilizar LIKE 'A[%]%' ESCAPE '%' para buscar cadenas que contengan un literal %.
¿Puedes combinar LIKE con otras funciones SQL para mejorar las capacidades de búsqueda?
Sí, combinar LIKE con funciones como CONCAT o SUBSTRING puede ayudar a refinar los patrones de búsqueda. Por ejemplo, utilizando CONCAT puedes construir dinámicamente patrones basados en los valores de otras columnas.
¿Cómo se puede utilizar LIKE junto con las operaciones JOIN?
LIKE se puede aplicar en las condiciones deJOIN para hacer coincidir patrones entre columnas de diferentes tablas. Por ejemplo, ON table1.col1 LIKE table2.col2 || '%' puede utilizarse para unir tablas en las que table1.col1 empiece por table2.col2.
¿Cuáles son algunas alternativas a LIKE para la concordancia de patrones complejos?
Para patrones más complejos, se pueden utilizar versiones de SQL que admitan expresiones regulares, como RLIKEde MySQL o SIMILAR TO de PostgreSQL . Proporcionan una sintaxis más rica para la concordancia avanzada de patrones.
¿Cómo gestiona LIKE los valores nulos en las columnas?
Cuando una columna contiene valores nulos, LIKE no coincidirá con estos registros, ya que los nulos no se consideran iguales a ninguna cadena o patrón. Para incluir nulos, utiliza una condición como OR column IS NULL.
