Spec-Zone.ru › MySQL 5.7

3.3.4.7 Сопоставление шаблонов

MySQL предоставляет стандартное сопоставление шаблонов SQL, а также форму сопоставления шаблонов, основанную на расширенных регулярных выражениях, подобных тем, которые используются утилитами Unix, такими как vi, grep и sed.

Сопоставление шаблонов SQL позволяет использовать _ для сопоставления любого одиночного символа и % для сопоставления произвольного количества символов (включая ноль символов). В MySQL шаблоны SQL по умолчанию нечувствительны к регистру. Некоторые примеры показаны здесь. Не используйте = или <> при использовании шаблонов SQL. Используйте операторы сравнения LIKE или NOT LIKE вместо этого.

Чтобы найти имена, начинающиеся с 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 |
+--------+--------+---------+------+------------+------------+

Чтобы найти имена, заканчивающиеся на 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  |
+--------+--------+---------+------+------------+-------+

Чтобы найти имена, содержащие 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       |
+----------+-------+---------+------+------------+------------+

Чтобы найти имена, содержащие ровно пять символов, используйте пять экземпляров символа шаблона _:

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  |
+-------+--------+---------+------+------------+-------+

Другой тип сопоставления шаблонов, предоставляемый MySQL, использует расширенные регулярные выражения. При проверке соответствия для этого типа шаблонов используйте операторы REGEXP и NOT REGEXP (или RLIKE и NOT RLIKE, являющиеся синонимами).

В следующем списке описаны некоторые характеристики расширенных регулярных выражений:

  • . сопоставляет любой одиночный символ.

  • Класс символов [...] сопоставляет любой символ внутри скобок. Например, [abc] сопоставляет a, b или c. Для указания диапазона символов используйте дефис. [a-z] сопоставляет любую букву, а [0-9] сопоставляет любую цифру.

  • * сопоставляет ноль или более экземпляров того, что предшествует ему. Например, x* сопоставляет любое количество символов x, [0-9]* сопоставляет любое количество цифр, а .* сопоставляет любое количество чего угодно.

  • Сопоставление по шаблону регулярного выражения выполняется успешно, если шаблон соответствует где-либо в проверяемом значении. (Это отличается от сопоставления шаблона LIKE, которое успешно только в том случае, если шаблон соответствует всему значению.)

  • Для привязки шаблона, чтобы он должен был соответствовать началу или концу проверяемого значения, используйте ^ в начале или $ в конце шаблона.

Чтобы продемонстрировать, как работают расширенные регулярные выражения, запросы LIKE, показанные ранее, переписаны здесь с использованием REGEXP.

Чтобы найти имена, начинающиеся с b, используйте ^ для сопоставления начала имени:

mysql> SELECT * FROM pet WHERE name REGEXP '^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 |
+--------+--------+---------+------+------------+------------+

Чтобы сделать сравнение REGEXP чувствительным к регистру, используйте ключевое слово BINARY, чтобы сделать одну из строк строкой с бинарным представлением. Этот запрос соответствует только строчным b в начале имени:

SELECT * FROM pet WHERE name REGEXP BINARY '^b';

Чтобы найти имена, заканчивающиеся на fy, используйте $ для сопоставления конца имени:

mysql> SELECT * FROM pet WHERE name REGEXP 'fy$';
+--------+--------+---------+------+------------+-------+
| name   | owner  | species | sex  | birth      | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
+--------+--------+---------+------+------------+-------+

Чтобы найти имена, содержащие w, используйте этот запрос:

mysql> SELECT * FROM pet WHERE name REGEXP '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       |
+----------+-------+---------+------+------------+------------+

Поскольку шаблон регулярного выражения соответствует, если он встречается где-либо в значении, в предыдущем запросе нет необходимости ставить дикий символ по обе стороны от шаблона, чтобы он соответствовал всему значению, как это было бы верно при использовании шаблона SQL.

Чтобы найти имена, содержащие ровно пять символов, используйте ^ и $ для сопоставления начала и конца имени и пять экземпляров . между ними:

mysql> SELECT * FROM pet WHERE name REGEXP '^.....$';
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

Вы также можете записать предыдущий запрос, используя оператор {n} (“повторить-n-раз”):

mysql> SELECT * FROM pet WHERE name REGEXP '^.{5}$';
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

Дополнительную информацию о синтаксисе регулярных выражений см. в Разделе 12.8.2, «Регулярные выражения».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/pattern-matching.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API