3.3.4.7 Concordancia de Patrones
MySQL proporciona una concordancia de patrones SQL estándar así como una forma de concordancia de patrones basada en expresiones regulares extendidas similares a las utilizadas por utilidades Unix como vi, grep y sed.
La coincidencia de patrones SQL le permite utilizar _
para coincidir con cualquier carácter único y %
para coincidir con un número arbitrario de caracteres (incluyendo caracteres cero). En MySQL, los patrones SQL no distinguen entre mayúsculas y minúsculas por defecto. Aquí se muestran algunos ejemplos. No utilice =
o <>
cuando utilice patrones SQL. Utilice en su lugar los operadores de comparación LIKE
o NOT LIKE
.
Para buscar nombres que empiecen por b
:
mysql> SELECT * FROM pet WHERE name LIKE 'b%';+--------+--------+---------+------+------------+------------+| name | owner | species | sex | birth | death |+--------+--------+---------+------+------------+------------+| Buffy | Harold | dog | f | 1989-05-13 | NULL || Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |+--------+--------+---------+------+------------+------------+
Para encontrar nombres que terminen en fy
:
mysql> SELECT * FROM pet WHERE name LIKE '%fy';+--------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+--------+--------+---------+------+------------+-------+| Fluffy | Harold | cat | f | 1993-02-04 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+--------+--------+---------+------+------------+-------+
Para encontrar nombres que contengan un w
:
mysql> SELECT * FROM pet WHERE name LIKE '%w%';+----------+-------+---------+------+------------+------------+| name | owner | species | sex | birth | death |+----------+-------+---------+------+------------+------------+| Claws | Gwen | cat | m | 1994-03-17 | NULL || Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 || Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |+----------+-------+---------+------+------------+------------+
Para encontrar nombres que contengan exactamente cinco caracteres, utilice cinco instancias del carácter patrón _
:
mysql> SELECT * FROM pet WHERE name LIKE '_____';+-------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+-------+--------+---------+------+------------+-------+| Claws | Gwen | cat | m | 1994-03-17 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+-------+--------+---------+------+------------+-------+
El otro tipo de coincidencia de patrones que proporciona MySQL utiliza expresiones regulares extendidas. Cuando busque una coincidencia para este tipo de patrón, utilice la función REGEXP_LIKE()
(o los operadores REGEXP
o RLIKE
, que son sinónimos de REGEXP_LIKE()
).
La siguiente lista describe algunas características de las expresiones regulares extendidas:
-
.
coincide con cualquier carácter único. -
Una clase de caracteres
coincide con cualquier carácter dentro de los paréntesis. Por ejemplo,
coincide con
a
,b
oc
. Para nombrar un rango de caracteres, utilice un guión.coincide con cualquier letra, mientras que
coincide con cualquier dígito.
-
*
coincide con cero o más instancias de lo que le precede. Por ejemplo,x*
coincide con cualquier número de caracteresx
,*
coincide con cualquier número de dígitos, y.*
coincide con cualquier número de cualquier cosa. -
Una coincidencia de patrón de expresión regular tiene éxito si el patrón coincide con cualquier parte del valor que se está probando. (Esto difiere de una coincidencia de patrón
LIKE
, que tiene éxito sólo si el patrón coincide con todo el valor). -
Para anclar un patrón de forma que deba coincidir con el principio o el final del valor que se está comprobando, utilice
^
al principio o$
al final del patrón.
Para demostrar cómo funcionan las expresiones regulares extendidas, las consultas LIKE
mostradas anteriormente se reescriben aquí para utilizar REGEXP_LIKE()
.
Para encontrar nombres que comienzan con b
, utilice ^
para que coincida con el comienzo del nombre:
mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b');+--------+--------+---------+------+------------+------------+| name | owner | species | sex | birth | death |+--------+--------+---------+------+------------+------------+| Buffy | Harold | dog | f | 1989-05-13 | NULL || Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 |+--------+--------+---------+------+------------+------------+
Para forzar que una comparación de expresión regular distinga entre mayúsculas y minúsculas, utilice una colación que distinga entre mayúsculas y minúsculas, o utilice la palabra clave BINARY
para que una de las cadenas sea una cadena binaria, o especifique el carácter de control de coincidencia c
. Cada una de estas consultas coincide sólo con las minúsculas b
al principio de un nombre:
SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b' COLLATE utf8mb4_0900_as_cs);SELECT * FROM pet WHERE REGEXP_LIKE(name, BINARY '^b');SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b', 'c');
Para encontrar nombres que terminen en fy
, utilice $
para que coincida con el final del nombre:
mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, 'fy$');+--------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+--------+--------+---------+------+------------+-------+| Fluffy | Harold | cat | f | 1993-02-04 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+--------+--------+---------+------+------------+-------+
Para encontrar nombres que contengan un w
, utilice esta consulta:
mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, 'w');+----------+-------+---------+------+------------+------------+| name | owner | species | sex | birth | death |+----------+-------+---------+------+------------+------------+| Claws | Gwen | cat | m | 1994-03-17 | NULL || Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 || Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |+----------+-------+---------+------+------------+------------+
Como un patrón de expresión regular coincide si aparece en cualquier parte del valor, no es necesario en la consulta anterior poner un comodín a cada lado del patrón para conseguir que coincida con todo el valor, como ocurriría con un patrón SQL.
Para encontrar nombres que contengan exactamente cinco caracteres, utilice ^
y $
para que coincidan con el principio y el final del nombre, y cinco instancias de .
en medio:
mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^.....$');+-------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+-------+--------+---------+------+------------+-------+| Claws | Gwen | cat | m | 1994-03-17 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+-------+--------+---------+------+------------+-------+
También podría escribir la consulta anterior utilizando el operador {
(«repetir-n
}n
– veces»):
mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^.{5}$');+-------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+-------+--------+---------+------+------------+-------+| Claws | Gwen | cat | m | 1994-03-17 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+-------+--------+---------+------+------------+-------+
Para más información sobre la sintaxis de las expresiones regulares, véase el apartado 12.8.2, «Expresiones regulares».