MySQL - Регулярные Выражения
Здравствуйте, стремящиеся к знаниям энтузиасты баз данных! Сегодня мы погружаемся в fascинирующий мир регулярных выражений MySQL. Не волнуйтесь, если вы никогда раньше не писали код - мы начнем с основ и постепенно перейдем к более сложному. К концу этого учебника вы будете использовать регулярные выражения, как профессионал!
Что такое Регулярные Выражения?
Прежде чем мы перейдем к конкретике 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