Оператор REGEXP
Оператор REGEXP (или его синоним RLIKE) в SQL используется для поиска и обработки строковых данных с помощью регулярных выражений. Регулярные выражения предоставляют мощные возможности для сложных шаблонов поиска, которые трудно реализовать с помощью оператора LIKE.
Когда использовать REGEXP вместо LIKE?
Оператор LIKE удобен для простых шаблонов поиска, таких как поиск строк, начинающихся или заканчивающихся на определённый набор символов, или содержащих определённые подстроки. Однако, если требуется более сложный и гибкий поиск, например, поиск по нескольким условиям или использование специальных символов и диапазонов, оператор REGEXP станет незаменимым инструментом.
Синтаксис регулярных выражений
... WHERE table_field REGEXP 'pattern';
Где pattern — это регулярное выражение, задающее шаблон поиска.
Важные нюансы
-
Регистронезависимость
По умолчанию регулярные выражения в MySQL не чувствительны к регистру. Например, выражение REGEXP 'abc' найдёт строку и abc, и Abc, и ABC.
-
Специальные символы
Некоторые символы имеют особое значение в регулярных выражениях и требуют экранирования (например, ., *, +, ?, [, ], (, ), {, }, |, \). Для экранирования используется обратная косая черта \.
Специальные символы и структуры
Примеры с объяснением
-
Получим всех пользователей, чьи имена начинаются на «John»:
SELECT * FROM Users WHERE name REGEXP '^John'
Это выражение ищет строки, начинающиеся с «John». Символ ^ указывает на начало строки.
-
Выведем все школьные предметы, название которых оканчивается на букву «e» или «y»:
SELECT * FROM Subject WHERE name REGEXP '[ey]$'
В этом примере, [ey] определяет список возможных значений для паттерна $, определяющего, на что должна заканчиваться строка.
-
Найдём всех пользователей, чей адрес электронной почты oканчивается на «@outlook.com» или на «@icloud.com»:
SELECT * FROM Users WHERE email REGEXP '@(outlook.com|icloud.com)$'
Здесь также используется $ для обозначения конца строки и | для указания нескольких вариантов.
-
Найдём всех пользователей, чей номер телефона не содержит цифр «2» и «8»:
SELECT * FROM Users WHERE phone_number REGEXP '^[^28]*$'
В этом примере символ [^28] обозначает любой символ, кроме «2» и «8», а * означает любое количество таких символов. Символы ^ и $ указывают на начало и конец строки соответственно, гарантируя, что вся строка соответствует шаблону.
-
Найдём всех пользователей, чей номер телефона начинается на «+7»
SELECT name, phone_number FROM Users WHERE phone_number REGEXP '^\\+7'
В этом примере ^ означает начало строки. То есть, мы ищем строки, которые начинаются с определённого шаблона.
Поскольку + является специальным символом в регулярных выражениях, его нужно экранировать двойным обратным слэшем (\\), чтобы он воспринимался как обычный символ +. В результате, \\+ соответствует знаку + в строке.