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.