HOWTO · MySQL
Compruebe si la cadena contiene ciertos datos en MySQL
Este tutorial muestra cómo comprobar si una cadena contiene ciertos datos o una subcadena en una tabla de MySQL.
En esta página
Para encontrar en MySQL las filas cuyo texto contiene una subcadena, filtra con WHERE LOCATE('widget', product_name) > 0, WHERE INSTR(product_name, 'widget') > 0 o WHERE product_name LIKE '%widget%'. LOCATE() e INSTR() buscan una subcadena literal; LIKE resulta útil cuando necesitas comodines. Los ejemplos siguientes usan la misma tabla pequeña, products, para que puedas elegir la forma que mejor se adapte a tu consulta.
Preparar una tabla de ejemplo para buscar subcadenas
Crea una tabla con un identificador y el nombre de un producto; después, añade algunas filas que incluyan el término de búsqueda y otras que no. En una sesión de MySQL, puedes crearla con CREATE TABLE products (product_id INT PRIMARY KEY, product_name VARCHAR(255)); y luego insertar los datos con INSERT INTO products (product_id, product_name) VALUES (1, 'Gadget Widget'), (2, 'Electronic Widget'), (3, 'Toy Widget'), (4, 'Tool Set');.
Este conjunto de datos tiene tres nombres que contienen Widget y uno que no. Las consultas siguientes seleccionan las tres primeras filas. Los fragmentos SQL están pensados para ejecutarse en MySQL; esta tarea no incluye evidencia de ejecución en un servicio MySQL, así que los resultados se describen en lugar de presentarse como salida observada de un comando de MySQL. En tu propia base de datos, ejecuta una vez la definición de la tabla y la inserción antes de probar las búsquedas. Si ya existe una tabla llamada products, usa otro nombre o adapta la configuración a tu esquema.
La comprobación local en Python reproduce las coincidencias esperadas del ejemplo; no ejecuta MySQL. Muestra los nombres de los productos que contienen Widget.
products = [
(1, "Gadget Widget"),
(2, "Electronic Widget"),
(3, "Toy Widget"),
(4, "Tool Set"),
]
for product_id, product_name in products:
if "Widget" in product_name:
print(product_id, product_name)
1 Gadget Widget
2 Electronic Widget
3 Toy Widget
Comprobar si hay una subcadena con LOCATE() e INSTR()
Usa LOCATE() cuando el término de búsqueda sea el primer argumento y el valor de la columna, el segundo: LOCATE(substring, string). Devuelve la posición de la primera coincidencia, empezando por 1, o 0 si no hay ninguna. En una condición WHERE, comparar el resultado con > 0 conserva solo las filas que contienen la subcadena. Para esta tabla, la consulta es SELECT product_id, product_name FROM products WHERE LOCATE('Widget', product_name) > 0;. Coincide con los identificadores 1, 2 y 3.
INSTR() prueba los mismos valores, pero invierte el orden de los argumentos: INSTR(string, substring). También devuelve la posición de la primera coincidencia o 0 si la subcadena no aparece. La consulta equivalente es SELECT product_id, product_name FROM products WHERE INSTR(product_name, 'Widget') > 0;. Devuelve las mismas tres filas. Al alternar entre ambas funciones, la diferencia clave que debes recordar es cuál argumento va primero.
Ambas funciones buscan la subcadena proporcionada dentro del valor de la columna. Son útiles cuando ya tienes un término literal. El resultado es una posición, no una fila; el predicado WHERE convierte ese resultado numérico en un filtro de filas. En lugar de *, selecciona únicamente las columnas que necesita tu aplicación para que el resultado sea más fácil de usar.
La intercalación (collation) de la columna o de la expresión determina cómo se trata la diferencia entre mayúsculas y minúsculas en una comparación. Las consultas de ejemplo usan Widget, con la misma capitalización que los datos. Si los resultados no distinguen entre mayúsculas y minúsculas como esperas, comprueba la intercalación de la columna; no des por hecho que todas las comparaciones de MySQL se comportan igual.
Buscar subcadenas y patrones con LIKE
El operador LIKE compara el valor de una columna con un patrón. Sin caracteres comodín, el patrón se compara con el valor completo: product_name LIKE 'Widget' busca un valor que coincida con Widget, en lugar de buscar esas letras en cualquier parte de un nombre más largo. Para encontrar el término en cualquier posición del valor, añade % a ambos lados: SELECT product_id, product_name FROM products WHERE product_name LIKE '%Widget%';. En la tabla de ejemplo, este patrón coincide con los identificadores 1, 2 y 3.
El comodín % representa cero o más caracteres. Colócalo antes del término para coincidir con valores que terminen con él, como en product_name LIKE '%Widget'; colócalo después para coincidir con valores que empiecen con él, como en product_name LIKE 'Toy%'. Si pones % a ambos lados, permites que haya caracteres antes y después del término. Estas posiciones te permiten indicar dónde debe aparecer el texto sin especificar los caracteres que lo rodean.
El comodín _ representa exactamente un carácter. Por ejemplo, product_name LIKE 'Gadget_Widget' coincide con un valor que contiene Gadget, luego un carácter y después Widget; en este conjunto de datos coincide con Gadget Widget, donde el carácter intermedio es un espacio. % y _ cumplen funciones distintas: el primero permite una secuencia de cualquier longitud, mientras que el segundo permite un solo carácter en esa posición.
Elige LIKE cuando el patrón exprese la búsqueda que necesitas, y usa LOCATE() o INSTR() para comprobar directamente una subcadena. Si buscas % o _ como caracteres literales, escápalos según las reglas de escape de LIKE en MySQL en vez de dejarlos como comodines del patrón. Estos predicados filtran filas; no validan la entrada del usuario. Si el término de búsqueda proviene de un usuario, pásalo como parámetro mediante tu cliente de base de datos y procésalo según las indicaciones de ese cliente para enlazar parámetros.