LIKE

LIKE сравнивает строку с шаблоном:

  • % — любая последовательность символов, включая пустую;
  • _ — ровно один символ.
SELECT id, email
FROM users
WHERE email LIKE '%@example.com';

Регистрозависимость зависит от СУБД, collation и типа данных. Нельзя считать LIKE переносимым регистронезависимым поиском.

Экранирование

Если % и _ должны быть обычными символами:

WHERE sku LIKE 'A!_%' ESCAPE '!'

Шаблон и escape-синтаксис должны передаваться параметрами/конструироваться контролируемо. Это отдельный вопрос от SQL injection.

Индекс

Обычный B-tree иногда помогает для префикса:

WHERE email LIKE 'alex%'

Для ведущего wildcard:

WHERE email LIKE '%example%'

обычный B-tree, как правило, не может определить начальный диапазон. Нужны полнотекстовый поиск, trigram/inverted index или другая специализированная структура конкретной СУБД.

Ловушки

  • _ — wildcard, поэтому шаблон A_1 совпадает не только с буквальным подчеркиванием.
  • Collation влияет на регистр, акценты и диапазоны.
  • NOT LIKE не включает NULL: результат сравнения с ним UNKNOWN.
  • Слепое добавление % по краям ухудшает семантику и производительность.

Связано: Условный оператор WHERE, Индексы SQL, Операторы IS NULL BETWEEN IN.

Вопросы

Чем % отличается от _? % соответствует любой длине, _ — одному символу.

Почему '%abc%' редко использует B-tree? Нет фиксированного начала для диапазонного поиска.

Гарантирован ли регистронезависимый поиск? Нет, он зависит от диалекта и collation.