Как искать строки по шаблону в SQL (оператор LIKE и %)?
Хочу найти всех пользователей, чьё имя начинается на «Анна», или у кого в email есть «gmail». Как сделать поиск по части строки в SQL? Что означают символы % и _ в LIKE?
2 ответа
Поиск по шаблону текста делает оператор LIKE вместе со спецсимволами подстановки:
%— любое количество любых символов (в том числе ноль),_— ровно один любой символ.
Примеры:
-- имя начинается на 'Анна'
SELECT * FROM users WHERE name LIKE 'Анна%';
-- email содержит 'gmail' где угодно
SELECT * FROM users WHERE email LIKE '%gmail%';
-- имя заканчивается на 'ов'
SELECT * FROM users WHERE name LIKE '%ов';
-- ровно 5 символов
SELECT * FROM users WHERE code LIKE '_____';
Важные моменты:
-
Регистр. В одних СУБД LIKE чувствителен к регистру, в других нет. В PostgreSQL для поиска без учёта регистра есть
ILIKE, в MySQL обычно LIKE регистронезависим по умолчанию. -
Производительность. Шаблон с
%в начале ('%gmail%') не может использовать обычный индекс — СУБД просматривает все строки.'Анна%'(процент только в конце) индекс использовать может и работает быстрее. -
Если надо найти сам символ процента или подчёркивания как текст, его экранируют:
LIKE '50\%' ESCAPE '\'.
Частая ошибка — забыть % и написать LIKE 'Анна', что эквивалентно = 'Анна' (точное совпадение), и ничего не найдётся, если имя «Анна Иванова».
Если шаблонов LIKE не хватает (нужны сложные правила — цифры, диапазоны символов), посмотрите в сторону регулярных выражений: в PostgreSQL это оператор ~, в MySQL — REGEXP. Например, WHERE phone ~ '^[0-9]{11}'. Но для простых «начинается с» / «содержит» LIKE проще, читается понятнее и часто быстрее.