Как выглядит SQL запрос с LIKE для поиска по имени
Что проверяют
Тестировщик постоянно проверяет данные в базе после действия в интерфейсе, и интервьюеру важно, что вы знаете шаблоны % и _, помните про регистр и экранирование. Следом обычно просят найти имя, в котором есть символ подчёркивания, или спрашивают, чем LIKE отличается от ILIKE.
Как отвечать
Начните с базового запроса: SELECT id, name FROM users WHERE name LIKE 'Анн%';. Потом разберите детали:
%: любое число символов, включая ноль.'Анн%'найдёт «Анна» и «Анна-Мария»,'%ов'фамилии на «ов»,'%ан%'вхождение в любом месте;_: ровно один символ.'Ив_н'найдёт «Иван», но не «Иоанн»;- регистр: зависит от СУБД. В PostgreSQL
LIKEчувствителен к регистру, для поиска без его учёта естьILIKEилиlower(name) LIKE '%анна%'. В MySQL всё решает collation колонки, и с распространёнными_ci-вариантами регистр уже не учитывается; - экранирование: если в искомой строке сам встречается
%или_, их нужно экранировать. Символ задают черезESCAPE, напримерLIKE 'a!_%' ESCAPE '!', а в PostgreSQL и MySQL по умолчанию работает обратный слеш; NULL: строки с пустым именем не попадают ни подLIKE, ни подNOT LIKE, их проверяют черезIS NULL.
Покажите практику: автотесты помечают свои данные префиксом вроде autotest_, находят и чистят их через LIKE 'autotest\_%'. Здесь экранирование обязательно.
Про скорость: шаблон с фиксированным началом ('Анн%') может использовать B-tree индекс, в PostgreSQL для этого нужен класс операторов text_pattern_ops или C-collation. Шаблоны '%ов' и '%ан%' обычным индексом не покрываются, для них в PostgreSQL ставят триграммный индекс из расширения pg_trgm.
Где спотыкаются
Переносят маски из файловой системы: пишут LIKE 'Анн*' и ищут буквальную звёздочку, а не любое окончание.
Забывают про регистр. Проверка в PostgreSQL падает, потому что в базе записано «анна», а в тесте 'Анн%'. В MySQL обратная ситуация: запрос находит лишние строки.
Чистят тестовые данные запросом DELETE ... WHERE name LIKE 'test_%' без экранирования. Подчёркивание значит «любой символ», и под шаблон попадают «testuser» и «tester» из чужих данных.