MySQL - Регулярные Выражения

Здравствуйте, стремящиеся к знаниям энтузиасты баз данных! Сегодня мы погружаемся в fascинирующий мир регулярных выражений MySQL. Не волнуйтесь, если вы никогда раньше не писали код - мы начнем с основ и постепенно перейдем к более сложному. К концу этого учебника вы будете использовать регулярные выражения, как профессионал!

MySQL - Regular Expressions

Что такое Регулярные Выражения?

Прежде чем мы перейдем к конкретике MySQL, давайте поймем, что такое регулярные выражения (regex). Представьте, что вы пытаетесь найти определенный узор в копне текста. Вот где на помощь приходит regex! Это как супер заряженный инструмент поиска, который может находить сложные Patterns в строках.

Регулярные Выражения в MySQL

В MySQL мы используем оператор REGEXP, чтобы работать с регулярными выражениями. Он相似ен оператору LIKE, но гораздо мощнее.

Основная Синтаксис

Вот основная синтаксис:

SELECT column_name(s)
FROM table_name
WHERE column_name REGEXP 'pattern';

Давайте рассмотрим несколько примеров:

SELECT * FROM employees WHERE last_name REGEXP 'son';

Этот запрос найдет всех сотрудников, чьи фамилии содержат 'son', такие как Johnson, Wilson или Sonny.

Чувствительность к регистру

По умолчанию, regex в MySQL нечувствителен к регистру. Если вы хотите чувствительный к регистру поиск, используйте ключевое слово BINARY:

SELECT * FROM employees WHERE last_name REGEXP BINARY 'Smith';

Это совпадет с 'Smith', но не с 'smith' или 'SMITH'.

Patterns, Используемые с REGEXP

Теперь давайте рассмотрим некоторые часто используемые Patterns с REGEXP. Мне нравится думать о них как о "секретном коде" regex - как только вы их узнаете, вы сможете найти почти все!

^ (Кaret) - Начало Строки

Символ caret совпадает с Patternами в начале строки.

SELECT * FROM products WHERE product_name REGEXP '^Apple';

Это найдет все продукты, чьи имена начинаются с 'Apple', такие как 'Apple iPhone' или 'Apple MacBook'.

$ (Доллар) - Конец Строки

Символ доллара совпадает с Patternами в конце строки.

SELECT * FROM products WHERE product_name REGEXP 'Pro$';

Это найдет продукты, заканчивающиеся на 'Pro', такие как 'MacBook Pro' или 'iPad Pro'.

. (Точка) - Любой Одиночный Character

Точка совпадает с любым одиночным characterом, кроме новой строки.

SELECT * FROM words WHERE word REGEXP 'c.t';

Это совпадает со словами, такими как 'cat', 'cut' или даже 'c@t'!

* (Звезда) - Ноль или Больше Повторений

Звезда совпадает с нолью или больше повторениями предыдущего characterа.

SELECT * FROM emails WHERE email REGEXP 'info.*@example.com';

Это совпадает с emailами, такими как '[email protected]', '[email protected]' или даже '[email protected]'.

+ (Плюс) - Один или Больше Повторений

Подобен *, но требует как минимум одно повторение.

SELECT * FROM products WHERE product_name REGEXP 'iPad ?Pro+';

Это совпадает с 'iPad Pro', 'iPad Pro', 'iPad Pro' и т.д.

? (Question Mark) - Ноль или Один Повторение

Question mark делает предыдущий character可选ным.

SELECT * FROM words WHERE word REGEXP 'colou?r';

Это совпадает с 'color' и 'colour'.

[] (Квадратные Скобки) - Character Set

Квадратные скобки определяют набор characterов для совпадения.

SELECT * FROM employees WHERE last_name REGEXP '[AEIOU]';

Это находит фамилии, содержащие любую гласную.

[^] (Отрицательный Character Set)

Добавление кaret внутри квадратных скобок否定ает набор.

SELECT * FROM products WHERE product_name REGEXP '[^0-9]';

Это находит имена продуктов, которые не содержат никаких цифр.

| (Pipe) - Alternation

Символ pipe действует как оператор OR.

SELECT * FROM animals WHERE species REGEXP 'cat|dog';

Это находит всех кошек и собак в нашей таблице животных.

Функции и Операторы Регулярного Выражения

MySQL предоставляет несколько функций и операторов для работы с регулярными выражениями. Давайте рассмотрим их:

Функция/Оператор Описание
REGEXP Совпадает со строкой против регулярного выражения
REGEXP_LIKE() Возвращает 1, если строка совпадает с Patternом regex, 0 в противном случае
REGEXP_INSTR() Возвращает начальный индекс первого совпадения regex
REGEXP_REPLACE() Заменяет Подстроки, совпадающие с Patternом regex
REGEXP_SUBSTR() Возвращает Подстроку, совпадающую с Patternом regex

Давайте посмотрим на несколько примеров:

REGEXP_LIKE()

SELECT * FROM products WHERE REGEXP_LIKE(product_name, '^iPhone');

Этот запрос найдет все продукты, чьи имена начинаются с 'iPhone'.

REGEXP_INSTR()

SELECT email, REGEXP_INSTR(email, '@') AS at_position
FROM users;

Это возвращает положение символа '@' в каждом email адресе.

REGEXP_REPLACE()

SELECT REGEXP_REPLACE('Hello, World!', '[aeiou]', '*') AS vowels_replaced;

Это заменяет все гласные на asterisks, возвращая 'Hll, W*rld!'.

REGEXP_SUBSTR()

SELECT REGEXP_SUBSTR('[email protected]', '[^@]+') AS username;

Это извлекает имя пользователя части email адреса.

Заключение

Поздравления! Вы только что сделали свои первые шаги в мощный мир регулярных выражений MySQL. Помните, что практика делает мастера. Попробуйте создавать свои собственные Patternы regex и экспериментируйте с различными комбинациями.

Пока вы продолжаете свое путешествие, вы обнаружите, что regex похож на швейцарский армейский нож в вашем наборе инструментов для работы с базами данных. Он может показаться немного сложным сначала, но как только вы惯етесь, вы будете задаваться вопросом, как вы обходились без него!

Счастливого кодирования, и пусть ваши запросы всегда возвращают те результаты, которые вы ищете!

Credits: Image by storyset