LIKE, подстановочные символы и экранирование
Сопоставление шаблонов, различия между процентом и подчёркиванием и экранирование буквальных подстановочных символов.
«LIKE, подстановочные символы и экранирование» — бесплатный урок Coding Interview Prep на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Coding Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Coding Interview Prep содержит 4 уроков всего.
Сопоставление по шаблону на собеседовании
LIKE выглядит простым, но скрывает три классических подводных камня на собеседованиях: путаницу между % и _, забывание о том, что буквальные знак процента или подчёркивание в данных требуют экранирования, и неожиданную зависимость чувствительности к регистру от базы данных.
В этом уроке подробно разбираются два подстановочных знака, предложение ESCAPE и правила, различающиеся между диалектами, по которым интервьюер отличает новичков от специалистов с опытом создания настоящих функций поиска.
Два подстановочных знака
У LIKE ровно два подстановочных знака:
%соответствует нулю или более символов_соответствует ровно одному символу
Поэтому 'a%' соответствует любой строке, начинающейся с a, а 'a_' — двухсимвольной строке, начинающейся с a. Перепутать их — самая распространённая ошибка при использовании LIKE.
SELECT *
FROM customers
WHERE name LIKE 'A%';
-- every name beginning with AПроцент в любом месте
Размещайте %, чтобы управлять тем, к какой части строки привязывается совпадение:
'%son'— заканчивается на son (Johnson, Mason)'%mary%'— содержит mary в любом месте'J%n'— начинается с J и заканчивается на n
Отдельный '%' соответствует каждой строке, отличной от NULL. NULL никогда не совпадает ни с одним шаблоном LIKE, включая '%'.
SELECT *
FROM customers
WHERE email LIKE '%@gmail.com';Подчёркивание для фиксированной длины
_ соответствует одному произвольному символу и удобно для кодов фиксированной длины. 'A__' соответствует ровно трём символам, начинающимся с A: ни больше, ни меньше.
Интервьюеры проверяют это на примерах кодов товаров или кодов стран. Кандидат, который пишет 'A%', когда требуется трёхсимвольный код, начинающийся с A, ошибается: такой шаблон возвращает A, за которым может следовать что угодно.
SELECT *
FROM products
WHERE sku LIKE 'A__';
-- A followed by exactly two more charactersКогда в данных встречаются % и _
Что делать, если нужно найти значения, буквально содержащие знак процента, например метку скидки «скидка 50%»? Запись LIKE '%50%%' не сработает, потому что конечный % воспринимается как подстановочный знак, а не как буквальный символ.
Нужно сообщить SQL, что один конкретный символ следует считать буквальным. Для этого используется предложение ESCAPE.
Предложение ESCAPE
Объявите символ экранирования с помощью ESCAPE, а затем поставьте его перед каждым подстановочным знаком, который нужно трактовать буквально. Здесь ! — символ экранирования, поэтому !% означает буквальный знак процента.
Такой запрос находит значения, содержащие буквальный текст 50% в любом месте. Символ экранирования можно выбрать произвольно; выберите тот, который не встречается в искомом тексте.
SELECT *
FROM promos
WHERE label LIKE '%50!%%' ESCAPE '!';
-- matches a literal '50%' anywhere in labelЭкранирование буквального подчёркивания
Подчёркивания часто встречаются в именах пользователей и идентификаторах, а неэкранированный _ незаметно соответствует любому символу. Чтобы найти адреса электронной почты, буквально начинающиеся с 'a_b', необходимо экранировать подчёркивание.
Без экранирования 'a_b%' также соответствовал бы 'axb', 'a9b' и так далее. Эта ошибка постоянно попадает в рабочий код, потому что неэкранированный запрос всё равно возвращает строки, выглядящие правдоподобно.
SELECT *
FROM users
WHERE handle LIKE 'a!_b%' ESCAPE '!';
-- handle starting with the literal text a_bЧувствительность к регистру зависит от базы данных
Чувствительность LIKE к регистру зависит от ядра базы данных и сопоставления:
- PostgreSQL:
LIKEчувствителен к регистру; для поиска без учёта регистра используйтеILIKE - MySQL: зависит от сопоставления столбца, которое часто не учитывает регистр по умолчанию
- SQL Server: зависит от настройки сопоставления
Переносимый и явный подход — привести обе стороны к нижнему регистру.
SELECT *
FROM customers
WHERE LOWER(name) LIKE 'a%';Скрытая цена с точки зрения производительности
Ведущий подстановочный знак, например '%son', не может использовать обычный индекс B-дерева, потому что индекс упорядочен по префиксу, а начало строки не зафиксировано. Ядру приходится просматривать каждую строку.
'son%' (конечный подстановочный знак при зафиксированном префиксе) может использовать индекс. Интервьюеры любят спрашивать, почему поиск с помощью LIKE работает медленно; обычно ответ — ведущий %.
-- index-friendly (anchored prefix):
WHERE name LIKE 'Smi%'
-- forces a scan (leading wildcard):
WHERE name LIKE '%mith'Что есть помимо LIKE
Когда возможностей LIKE недостаточно, упомяните альтернативы, чтобы показать глубину знаний:
SIMILAR TOи регулярные выражения POSIX (~,~*) в PostgreSQL для настоящих регулярных выражений- Индексы полнотекстового поиска для больших массивов свободного текста
- Индексы триграмм (pg_trgm), ускоряющие поиск с ведущим подстановочным знаком
Упоминание этих возможностей показывает, что Вы знаете: LIKE — это лишь основа, а не предел возможностей текстового поиска.
Безопасное создание шаблонов LIKE из пользовательского ввода
На собеседованиях часто спрашивают: как искать введённый пользователем термин с помощью LIKE, не нарушив запрос? Важно назвать два риска:
- Внедрение — привязывайте значение как параметр; никогда не объединяйте необработанный ввод со строкой запроса.
- Неэкранированные подстановочные символы — если сам ввод содержит
%или_, экранируйте их, чтобы они сопоставлялись буквально.
Привяжите параметр, а затем добавьте собственные подстановочные символы в запросе.
-- $1 is bound as a parameter; wildcards are added in SQL
SELECT *
FROM products
WHERE name LIKE '%' || replace(replace($1, '_', '\_'), '%', '\%') || '%' ESCAPE '\';Быстрая проверка
Вспомните разницу между двумя подстановочными знаками.
Итоги
Основные выводы:
%соответствует нулю или более символов;_соответствует ровно одному- Чтобы найти буквальные
%или_в данных, объявите символESCAPEи поставьте его перед подстановочным знаком - Чувствительность к регистру зависит от ядра базы данных; применение
LOWER()к обеим сторонам — переносимое решение (в PostgreSQL естьILIKE) - Ведущий подстановочный знак заставляет выполнять полное сканирование; префикс с зафиксированным началом может использовать индекс
Нэкранированный _ — скрытая ошибка: он всё равно возвращает правдоподобные строки.
Часто задаваемые вопросы
Урок «LIKE, подстановочные символы и экранирование» бесплатный?
Да — полный текст урока «LIKE, подстановочные символы и экранирование» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Coding Interview Prep, подпишись на CoddyKit PRO. Курс Coding Interview Prep содержит 4 уроков всего.
Чему я научусь в уроке «LIKE, подстановочные символы и экранирование»?
Сопоставление шаблонов, различия между процентом и подчёркиванием и экранирование буквальных подстановочных символов. Ты практикуешь Coding Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Coding Interview Prep?
Предыдущий опыт не требуется. Coding Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «LIKE, подстановочные символы и экранирование»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Coding Interview Prep?
Да. Каждый урок Coding Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Приоритет AND и OR и расстановка скобок
- BETWEEN, IN и включение границ
- LIKE, подстановочные символы и экранирование
- Фильтрация по вычисляемым значениям