Mysql регулярные выражения в запросе

Mysql регулярные выражения в запросе

Поговорим о регулярных выражениях в mysql. Или как сейчас принято называть mysqlregexp. БД MySQL имеет множество инструментов для реализации поиска информации. Это можно сделать с помощью оператора like или =, или regexp, о чем мы и поговорим.

Регулярное выражение это набор символов, определяющий шаблон строки. По этому шаблону и происходит поиск нужных данных в БД MySQL. Например, если регулярное выражение соответствует sitear, то результатом будут совпадения с sitear и ничего больше. Более сложное это sitear|sitearchitector, будет находить совпадения как по sitear, так и по sitearchitector.

Можно привести пример посложнее, s[ite]*ar, совпадениями будут: sitear, siar, sitar, siiiitttettear, sar. То есть символы ite в шаблоне, могут встречаться сколько хочешь и в любом количестве, а могут и вообще не встречаться.

В mysql regexp могут встречаться и другие структуры, определяющие шаблон искомой строки. Ниже предоставлены примеры регулярных выражений в mysql, с использованием таких структур.

Примеры MySQL REGEXP

Символ

Назначение

Пример (1 – true, 0 – false)

Соответствие началу строки.

mysql> SELECT "fo
fo" REGEXP "^fo$"; -> 0

mysql> SELECT "fofo" REGEXP "^fo"; -> 1

Соответствие концу строки.

mysql> SELECT "fo
o" REGEXP "^fo
o$"; -> 1

mysql> SELECT "fo
o" REGEXP "^fo$"; -> 0

Соответствие любому символу (включая перевод строки).

mysql> SELECT "fofo" REGEXP "^f.*"; -> 1

mysql> SELECT "fo
fo" REGEXP "^f.*"; -> 1

Соответствие любой последовательности из нуля или более символов "a".

mysql> SELECT "Ban" REGEXP "^Ba*n"; -> 1

mysql> SELECT "Baaan" REGEXP "^Ba*n"; -> 1

mysql> SELECT "Bn" REGEXP "^Ba*n"; -> 1

Соответствие любой последовательности из одного или более символов "a ".

mysql> SELECT "Ban" REGEXP "^Ba+n"; -> 1

mysql> SELECT "Bn" REGEXP "^Ba+n"; -> 0

Соответствие как нулю, так и одному символу "a".

mysql> SELECT "Bn" REGEXP "^Ba?n"; -> 1

mysql> SELECT "Ban" REGEXP "^Ba?n"; -> 1

mysql> SELECT "Baan" REGEXP "^Ba?n"; -> 0

Соответствие как последовательности de, так и последовательности abc.

mysql> SELECT "pi" REGEXP "pi|apa"; -> 1

mysql> SELECT "axe" REGEXP "pi|apa"; -> 0

mysql> SELECT "apa" REGEXP "pi|apa"; -> 1

mysql> SELECT "apa" REGEXP "^(pi|apa)$"; -> 1

mysql> SELECT "pi" REGEXP "^(pi|apa)$"; -> 1

mysql> SELECT "pix" REGEXP "^(pi|apa)$"; -> 0

Соответствие нулю или более вхождениям последовательности abc.

mysql> SELECT "pi" REGEXP "^(pi)*$"; -> 1

mysql> SELECT "pip" REGEXP "^(pi)*$"; -> 0

mysql> SELECT "pipi" REGEXP "^(pi)*$"; -> 1

Читайте также:  Zalman zm700 gvm 700w обзор

Устанавливает количество вхождений предшествующего элемента.

mysql> SELECT "a" REGEXP "(a)<0,>"; -> 1

mysql> SELECT "b" REGEXP "(a)<0,>"; -> 1

mysql> SELECT "aaa" REGEXP "(a)<2,3>"; -> 1

mysql> SELECT "a" REGEXP "(a)<2,3>"; -> 0

mysql> SELECT "aaaa" REGEXP "(a)<2,3>"; -> 0

Соответствие символа, являющегося (или не являющегося, если используется ^) символом a, b, c, d или X.

mysql> SELECT "aXbc" REGEXP "[a-dXYZ]"; -> 1

mysql> SELECT "aXbc" REGEXP "^[a-dXYZ]$"; -> 0

mysql> SELECT "aXbc" REGEXP "^[a-dXYZ]+$"; -> 1

mysql> SELECT "aXbc" REGEXP "^[^a-dXYZ]+$"; -> 0

mysql> SELECT "gheis" REGEXP "^[^a-dXYZ]+$"; -> 1

mysql> SELECT "gheisa" REGEXP "^[^a-dXYZ]+$"; -> 0

Имя класса символов в [: :] обозначает список символов принадлежащих к классу.

Классы символов:

alnum digit punct

alpha graph space

blank lower upper

cntrl print xdigit

mysql> SELECT "justalnums" REGEXP "[[:alnum:]]+"; -> 1

mysql> SELECT "!!" REGEXP "[[:alnum:]]+"; -> 0

Соответствие началу и концу слова.

mysql> SELECT "a word a" REGEXP "[[: :]]"; -> 1

mysql> SELECT "a xword a" REGEXP "[[: :]]"; -> 0

Вот пример полноценного сложного регулярного выражения в mysql:

Это все что касается mysql regexp , если у вас остались вопросы по поводу регулярных выражений в mysql, задайте их в комментариях к данной статье.

Оператор LIKE

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

Для создания шаблона используются два специальных символа.

  • % — представляет собой неопределенное количество любых символов.
  • _ — представляет только один любой символ.

Синтаксис LIKE

mysql> SELECT column1, column2, . , columnN
-> FROM table_name
-> WHERE column LIKE ‘pattern’ ;

В таблице ниже представлены несколько возможных вариантов шаблона оператора LIKE .

Шаблон LIKE Описание
LIKE ‘a%’ Значение начинается с символа "a"
LIKE ‘%a’ Значение заканчивается на символ "a"
LIKE ‘%a%’ Значение имеет символ "a" в любом месте
LIKE ‘_a%’ Значение имеет символ "a" на втором месте
LIKE ‘a__’ Значение состоит из 3 символов, первый "a"
LIKE ‘a%d’ Значение начинается с символа "a" и заканчивается на символ "d"

Рассмотрим несколько примеров.

Для всех примеров будем использовать условную базу данных книжного магазина — Bookstore и таблицу books.

mysql> USE Bookstore;

Database changed
mysql> SELECT >FROM books;
+—-+—————————+———————+———+—————-+
| id | title | author | price | shelf_position |
+—-+—————————+———————+———+—————-+
| 1 | Дубровский (Акция) | Александр Пушкин | 230.00 | 023A12 |
| 2 | Нос (Акция) | Николай Гоголь | 255.20 | 003C05 |
| 3 | Мастер и Маргарита | Михаил Булгаков | 263.00 | 004D11 |
| 4 | Мёртвые души (Акция) | Николай Гоголь | 173.00 | 007A15 |
| 5 | Преступление и наказание | Фёдор Достоевский | 245.00 | 004E08 |
| 6 | Война и мир | Лев Толстой | 341.00 | 020F01 |
| 7 | Анна Каренина | Лев Толстой | 346.00 | 004D05 |
| 8 | Отцы и дети | Иван Тургенев | 371.00 | 001H10 |
| 9 | Собачье сердце | Михаил Булгаков | 232.00 | 006A19 |
| 10 | Бесы | Фёдор Достоевский | 212.00 | 028A03 |
+—-+—————————+———————+———+—————-+
10 rows in set (0.00 sec)

Читайте также:  Bmw 5gt 530d отзывы

Найдем все записи с книгами, в названии которых есть слово "Акция".

mysql> SELECT id, title, author, price, shelf_position
-> FROM books
-> WHERE title LIKE ‘%Акция%’ ;
+—-+—————————+———————+———+—————-+
| id | title | author | price | shelf_position |
+—-+—————————+———————+———+—————-+
| 1 | Дубровский (Акция) | Александр Пушкин | 230.00 | 023A12 |
| 2 | Нос (Акция) | Николай Гоголь | 255.20 | 003C05 |
| 4 | Мёртвые души (Акция) | Николай Гоголь | 173.00 | 007A15 |
+—-+—————————+———————+———+—————-+
3 rows in set (0.00 sec)

В колонке shelf_position представлен код местоположения книги, например код — 004E08 означает: 4 ряд, шкаф Е, полка 8. Найдем все записи с книгами, которые хранятся на полках шкафа D на 4 ряду.

LIKE можно использовать с логическим оператором NOT , и находить записи, которые НЕ соответствуют заданному шаблону.

mysql> SELECT id, title, author, price, shelf_position
-> FROM books
-> WHERE author NOT LIKE ‘Николай%’ ;
+—-+———————————+————————————+———+—————-+
| id | title | author | price | shelf_position |
+—-+———————————+————————————+———+—————-+
| 1 | Дубровский (Акция) | Александр Пушкин | 230.00 | 023A12 |
| 3 | Мастер и Маргарита | Михаил Булгаков | 263.00 | 004D11 |
| 5 | Преступление и наказание | Фёдор Достоевский | 245.00 | 004E08 |
| 6 | Война и мир | Лев Толстой | 341.00 | 020F01 |
| 7 | Анна Каренина | Лев Толстой | 346.00 | 004D05 |
| 8 | Отцы и дети | Иван Тургенев | 371.00 | 001H10 |
| 9 | Собачье сердце | Михаил Булгаков | 232.00 | 006A19 |
| 10 | Бесы | Фёдор Достоевский | 212.00 | 028A03 |
+—-+———————————+————————————+———+—————-+
10 rows in set (0.00 sec)

Оператор REGEXP

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

RLIKE является синонимом для оператора REGEXP .

Синтаксис REGEXP

mysql> SELECT column1, column2, . , columnN
-> FROM table_name
-> WHERE column REGEXP ‘pattern’ ;

Ниже представлены несколько примеров использования регулярных выражений в MySQL.

Найдем все записи книг, имя автора которых начинается с букв "А" или "Л".

mysql> SELECT id, title, author, price, shelf_position
-> FROM books
-> WHERE author REGEXP ‘^(А|Л)’ ;
+—-+—————————+———————+———+—————-+
| id | title | author | price | shelf_position |
+—-+—————————+———————+———+—————-+
| 1 | Дубровский (Акция) | Александр Пушкин | 230.00 | 023A12 |
| 6 | Война и мир | Лев Толстой | 341.00 | 020F01 |
| 7 | Анна Каренина | Лев Толстой | 346.00 | 004D05 |
+—-+—————————+———————+———+—————-+
3 rows in set (0.00 sec)

Читайте также:  Zte blade vec 3g прошивка

Найдем все книги, в названии которых есть слово "война".

Посмотрим какие книги находятся в шкафах на 004 ряду.

mysql> SELECT id, title, author, price, shelf_position
-> FROM books
-> WHERE shelf_position REGEXP ‘^004.*’ ;
+—-+—————————+———————+———+—————-+
| id | title | author | price | shelf_position |
+—-+—————————+———————+———+—————-+
| 3 | Мастер и Маргарита | Михаил Булгаков | 263.00 | 004D11 |
| 5 | Преступление и наказание | Фёдор Достоевский | 245.00 | 004E08 |
| 7 | Анна Каренина | Лев Толстой | 346.00 | 004D05 |
+—-+—————————+———————+———+—————-+
3 rows in set (0.00 sec)

Понравилась статья? Расскажите о ней друзьям!

Ниже приведены выражения, которым могут использоваться и их характеристика

Точка означает, что вместо нее может использоваться любой одиночный символ

Квадратные скобки, под них подойдут любой символ в них указанный и один из них. Например, регулярное выражение ‘[abc]’ будет означать, что a или b, или c могут встретиться и будут удовлетворять regexp. Регистр имеет значение, A предыдущему выражению удовлетворять уже не будет, за счет тире можно указывать диапазон значений если вариантов много и перечислять их все неудобно. Под [a-z][1-9] подойдет выражение из последовательных буквы латинского алфавита в нижнем регистре и цифры

Подходит под любое число знаков, ей предшествующих. Так [a-z]* будет означать, что под regexp подойдет слово любой длины из латинских букв в нижнем регистре.

Означает, что выражение должно начинаться с символа, который идет сразу за знаком

Означает, что выражение должно заканчиваться на символ, который идет сразу перед знаком

Все регулярные выражения выводятся с указанием ключевого слова REGEXP. Изображение взято с официального сайта MySQL

Использование регулярных выражений в MySQL

Для демонстрации возьмем выражение с LIKE и используем вместо него REGEXP

Найдем все данные об объектах недвижимости, которые располагаются на улице, название которой начинается с B, имеет одну произвольную букву, затем l и любое количество символов

SELECT * FROM REAL_ESTATE WHERE street REGEXP ‘^B.l*’;

+————+————-+————+————-+————+————+——-+
| type | city | floorspace | district | street | rentorsale | PRICE |
+————+————-+————+————-+————+————+——-+
| Appartment | Novosibirsk | 33 | Oktabriskiy | Belinskogo | Rent | 17000 |
| Appartment | Moscow | 42 | Himki | Bolshaya | Rent | 18000 |
+————+————-+————+————-+————+————+——-+
2 rows in set (0.00 sec)

Можно найти ту же квартиру на улице Белинского задав в качестве критерия поиска последний символ в имени

SELECT * FROM REAL_ESTATE WHERE street REGEXP ‘o$’;

+————+————-+————+————-+————+————+——-+
| type | city | floorspace | district | street | rentorsale | PRICE |
+————+————-+————+————-+————+————+——-+
| Appartment | Novosibirsk | 33 | Oktabriskiy | Belinskogo | Rent | 17000 |
+————+————-+————+————-+————+————+——-+
1 row in set (0.00 sec)

Ссылка на основную публикацию
Adblock detector