Поиск и регулярные выражения в MySQL
СУБД MySQL имеет различные инструменты для осуществления поиска, среди которых оператор LIKE, осуществляющий простейшие операции поиска, оператор RLIKE, предоставляющий возможности поиска по регулярным выражениям.
Оператор LIKE
Оператор LIKE предназначен для сравнения строк с использованием простейших регулярных выражений. Оператор часто используется в конструкции WHERE и возвращает 1 или 0.
Вместе с оператором LIKE возможно использование специальных символов:
"%" - Соответствует любому количеству символов и их отсутствию тоже.
"_" - Соответствует одному символу.
Поиск символов "%" и "_" осуществляется при помощи конструкций "\%" и "\_".
Пример использования:
select name, family from personal where name like 'A%В_'
//Этим скриптом мы выберем все записи поле name у которых
//начинается с буквы А и предпоследняя буква этого поля В.
Оператор можно использовать с отрицанием: NOT LIKE.
В этом случае в выборку попадут записи не удовлетворяющие заданным условиям.
Оператор RLIKE
Оператор RLIKE (а также синоним REGEXP)производит поиск в соответствии с регулярными выражениями, что позволяет задать более гибкие условия поиска, однако при этом данный оператор работает медленнее нежели оператор LIKE.
Регулярное выражение это шаблон применяемый к заданному тексту с лева на право. Например регулярное выражение содержащее обычный текст, например 'монитор', соответствует строке содержащей такую подстроку например: 'мониторинг', 'мониторы', 'большие мониторы', и т.п.
Пример:
select NAME from market_cards where NAME RLIKE 'кекс'
Результат работы:
КЕКС К ЧАЮ В АССОРТ. 225ГР.
СУХАЯ СМЕСЬ ДЛЯ КЕКСА АТЛАНТА
МИНИ КЕКСЫ 6ШТ
Из таблицы market_cards будут выбраны все записи где поле NAME содержит слово 'кекс' при этом неважно в каком месте строки это слово (или точнее сказать сочетание символов) расположено.
Чтобы привязать искомое выражение к началу строки либо к концу используются символы:
'^' - привязывает к началу строки.
'$' - привязывает к концу строки.
Пример:
1) select NAME from market_cards where NAME RLIKE '^кекс'
2) select NAME from market_cards where NAME RLIKE 'кекс$'
3) select NAME from market_cards where NAME RLIKE '^кекс$'
Результат работы:
Первый запрос вернет нам записи типа:
КЕКСЫ МИНИ КОВИС 200ГР.
КЕКС К ЧАЮ ХАРРИС 225ГР.
КЕКСЫ 7 ДНЕЙ МАГДАЛЕН.
Второй и третий запросы ничего не вернут, поскольку не найдут записей оканчивающихся на слово 'кекс'
Гораздо чаще необходимо привязываться ни к концу или началу строки, а к концу или началу слова.
Такую задачу реализуют последовательности:
[[:<:]] - Начало слова.
[[:>:]] - Конец слова.
Пример:
select NAME from market_cards where NAME RLIKE '[[:<:]]медведь[[:>:]]'
Результат:
ИГРУШКА МЕДВЕДЬ МИТЕНЬКА РЮКЗАК
ИГРУШКА МЕДВЕДЬ МИТЬКА
МЕДВЕДЬ КОРИЧНЕВЫЙ
ИГРУШКА МЕДВЕДЬ МИТЬКА
Ещё один специальный символ:
'|' - Аналогичен по смыслу (или), например 'мама|мать' - будут выбраны все строки включающие и 'мама' и 'мать'.
В регулярном выражении возможно использование других спецсимволов и классов символов:
[abc] - будут выбраны записи с любым из символов a,b,c.
[0-9] - любая из цифр. (аналогичен по смыслу [0123456789]).
[а-я] - любая из букв от а до я.
[а-я0-9] - любая буква русского алфавита либо цифра.
[^0-9] - означает любое значение кроме цифры. (в подобных случаях '^' - своего рода отрицание).
Для определения специальных последовательностей внутри строк:
'\t' - символ табуляции.
'\f' - конец файла.
'\n' - символ перевода строки.
'\r' - символ возврата каретки.
'\\' - символ обратного слэша \.
Кроме этого действуют классы символов POSIX регулярных выражений:
[:alnum:] - алфавитно цифровые символы.
[:alpha:] - символы алфавита.
[:blank:] - символы пробела и табуляции.
[:cntrl:] - управляющие символы.
[:digit:] - десятичные цифры (0-9).
[:graph:] - графические (видимые) символы.
[:lower:] - символы алфавита в нижнем регистре.
[:print:] - графические или невидимые символы.
[:punct:] - знаки препинания.
[:space:] - символы пробела, табуляции, новой строки или возврата каретки.
[:upper:] - символы алфавита в верхнем регистре.
[:xdigit:] - шестнадцатеричные цифры.
(Алфавитные символы - могут быть как русскими так и английскими.)
Выражения в квадратных скобках соответствуют только одному символу и часто употребляются с квантификаторами, которые следуют сразу за символом и изменяют количествое его вхождений в строку.
? - символ либо входит в строку один раз, либо вообще в неё не входит.
* - любое число вхождений символа в строку, в том числе и ноль.
+ - одно или более вхождений символа в строку.
Оператор RLIKE можно использовать с отрицанием NOT RLIKE - в этом случае результатом его работы будет выборка строк не соответствующих заданным параметрам.