0Pricing
Coding Interview Prep · Урок

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 — локальная установка не требуется.

Все уроки этого курса

  1. Приоритет AND и OR и расстановка скобок
  2. BETWEEN, IN и включение границ
  3. LIKE, подстановочные символы и экранирование
  4. Фильтрация по вычисляемым значениям
← Назад к Coding Interview Prep