3.3.4.7 Dopasowywanie wzorców
MySQL udostępnia standardowe dopasowywanie wzorców SQL, jak również formę dopasowywania wzorców opartą na rozszerzonych wyrażeniach regularnych, podobnych do tych używanych przez narzędzia uniksowe, takie jak vi, grep i sed.
Dopasowywanie wzorców SQL pozwala na użycie _
do dopasowania dowolnego pojedynczego znaku oraz %
do dopasowania dowolnej liczby znaków (w tym znaków zerowych). W MySQL domyślnie rozróżniana jest wielkość liter. Niektóre przykłady są pokazane tutaj. Nie używaj =
lub <>
podczas korzystania z wzorców SQL. Zamiast tego użyj operatorów porównania LIKE
lub NOT LIKE
.
Aby znaleźć nazwy zaczynające się od 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 |+--------+--------+---------+------+------------+------------+
Aby znaleźć nazwy kończące się na 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 |+--------+--------+---------+------+------------+-------+
Aby znaleźć nazwy zawierające 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 |+----------+-------+---------+------+------------+------------+
Aby znaleźć nazwy zawierające dokładnie pięć znaków, użyj pięciu wystąpień znaku wzorca _
:
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 |+-------+--------+---------+------+------------+-------+
Drugi typ dopasowywania wzorców udostępniany przez MySQL wykorzystuje rozszerzone wyrażenia regularne. Gdy testujesz dopasowanie dla tego typu wzorca, użyj funkcji REGEXP_LIKE()
(lub operatorów REGEXP
lub RLIKE
, które są synonimami dla REGEXP_LIKE()
).
Poniższa lista opisuje niektóre cechy rozszerzonych wyrażeń regularnych:
-
.
dopasowuje dowolny pojedynczy znak. -
Klasa znaków
pasuje do dowolnego znaku wewnątrz nawiasów. Na przykład,
pasuje do
a
,b
lubc
. Aby nazwać zakres znaków, należy użyć myślnika.pasuje do każdej litery, a
do każdej cyfry.
-
*
dopasowuje zero lub więcej wystąpień poprzedzającej go rzeczy. Na przykładx*
dopasowuje dowolną liczbę znakówx
,*
dopasowuje dowolną liczbę cyfr, a.*
dopasowuje dowolną liczbę czegokolwiek. -
Dopasowanie wzorca wyrażenia regularnego powiedzie się, jeśli wzorzec pasuje w dowolnym miejscu testowanej wartości. (Różni się to od dopasowania wzorca
LIKE
, które powiedzie się tylko wtedy, gdy wzorzec pasuje do całej wartości). -
Aby zakotwiczyć wzorzec tak, że musi on pasować do początku lub końca testowanej wartości, należy użyć
^
na początku lub$
na końcu wzorca.
Aby zademonstrować, jak działają rozszerzone wyrażenia regularne, pokazane wcześniej zapytania LIKE
zostały tutaj przepisane na REGEXP_LIKE()
.
Aby znaleźć nazwy zaczynające się od b
, należy użyć ^
do dopasowania początku nazwy:
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 |+--------+--------+---------+------+------------+------------+
Aby wymusić, aby porównanie wyrażeń regularnych uwzględniało wielkość liter, należy użyć kolacji uwzględniającej wielkość liter lub użyć słowa kluczowego BINARY
, aby jeden z łańcuchów był łańcuchem binarnym, lub określić znak c
kontroli dopasowania. Każde z tych zapytań dopasowuje tylko małe litery b
na początku nazwy:
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');
Aby znaleźć nazwy kończące się na fy
, użyj $
, aby dopasować koniec nazwy:
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 |+--------+--------+---------+------+------------+-------+
Aby znaleźć nazwy zawierające w
, użyj tego zapytania:
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 |+----------+-------+---------+------+------------+------------+
Ponieważ wzorzec wyrażenia regularnego pasuje, jeśli występuje w dowolnym miejscu wartości, w poprzednim zapytaniu nie jest konieczne umieszczanie symbolu wieloznacznego po obu stronach wzorca, aby dopasować go do całej wartości, co byłoby prawdą w przypadku wzorca SQL.
Aby znaleźć nazwy zawierające dokładnie pięć znaków, użyj ^
i $
, aby dopasować początek i koniec nazwy oraz pięć wystąpień .
pomiędzy nimi:
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 |+-------+--------+---------+------+------------+-------+
Mogłabyś również napisać poprzednie zapytanie, używając operatora {
(„repeat-n
}n
-times”):
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 |+-------+--------+---------+------+------------+-------+
Więcej informacji na temat składni wyrażeń regularnych znajdziesz w rozdziale 12.8.2, „Wyrażenia regularne”.
.