SQL LIKE: фильтры по префиксу, суффиксу и подстроке

SQL LIKE фильтрует строки, сопоставляя текстовый столбец с шаблоном, в котором используются SQL-подстановки. Подстановка % соответствует нулю или большему количеству символов, а _ соответствует ровно одному символу. Применяйте его для фильтров по началу строки ('prefix%'), по окончанию строки ('%suffix') и по вхождению подстроки ('%term%').

Пример SQL LIKE Для Сопоставления По Префиксу

Вывод:

Результат появится здесь...

Вывод:

+-------+----------------+
| name  | email          |
+-------+----------------+
| Алиса | [email protected] |
| Алина | [email protected] |
+-------+----------------+
2 row(s)

Как LIKE ‘Ал%’ Фильтрует Строки

  1. CREATE TABLE и INSERT заполняют customers четырьмя строками.
  2. name LIKE 'Ал%' оставляет имена, которые начинаются с Ал; % покрывает оставшиеся символы.
  3. При обычном B-tree индексе по name префиксный шаблон вроде 'Ал%' может использовать сканирование диапазона индекса.

Что Такое Оператор SQL LIKE?

SQL LIKE сравнивает строковый столбец с шаблоном. LIKE сопоставляет всю строку целиком (а не подстроку), если вы не добавите % с одной или обеих сторон. Без подстановок LIKE 'text' ведет себя как = 'text'. Если в столбце NULL, выражения LIKE и NOT LIKE дают unknown, и такая строка отфильтровывается в WHERE.

Шаблоны Подстановки: %, _, и ESCAPE

% и _ покрывают большинство задач фильтрации. В шаблоне SQL WHERE wildcard сочетайте фиксированный текст с % и _, чтобы описать совпадения по префиксу, суффиксу и подстроке:

ШаблонЗначениеПример совпадения
'Ал%'Начинается с АлАлиса, Алина
'%org'Заканчивается на org[email protected]
'%mail%'Содержит mail[email protected]
'_об'Любой один символ + обБоб

Чтобы искать буквальный % или _, задайте символ экранирования через ESCAPE:

SELECT label FROM metrics
WHERE label LIKE '%100\%%' ESCAPE '\';

Здесь \ объявлен как escape-символ, поэтому \% сопоставляется с реальным %, а не работает как подстановка.

SQL NOT LIKE: Исключение Совпадающих Строк

NOT LIKE инвертирует совпадение. SQL-запрос с NOT LIKE возвращает каждую строку, где шаблон не совпал:

SELECT name FROM customers
WHERE email NOT LIKE '%corp%';

Это вернет Боба и Кэрол - всех, чья почта не содержит corp. Строки, где столбец равен NULL, исключаются и из LIKE, и из NOT LIKE. Чтобы включить NULL, добавьте явное OR column IS NULL.

Частые Ошибки С SQL LIKE

Ошибка: считать, что LIKE 'term' ищет подстроки.

Неправильно:

WHERE name LIKE 'ли'

Правильно:

WHERE name LIKE '%ли%'

Причина: LIKE сопоставляет всю строку. Без % с обеих сторон шаблон требует точного совпадения с ли.

Ошибка: искать буквальный % без ESCAPE.

Неправильно:

WHERE discount LIKE '100%'

Правильно:

WHERE discount LIKE '100\%' ESCAPE '\'

Причина: без ESCAPE % работает как подстановка и совпадает с 100, 1000, 100USD и любым другим значением, начинающимся с 100.

Производительность LIKE: Префикс Против Ведущей Подстановки

При обычном B-tree индексе LIKE 'abc%' может использовать сканирование диапазона индекса. Шаблоны, которые начинаются с % (например, '%abc' или '%abc%'), мешают индексному поиску, поэтому движок обычно сканирует заметно больше строк.

Для масштабного поиска по подстроке используйте полнотекстовый поиск (FTS) вместо LIKE '%term%'.

Чувствительность К Регистру По Диалектам

Поведение LIKE относительно регистра зависит от движка базы данных:

База данныхПоведение LIKE по умолчанию
PostgreSQLЧувствителен к регистру; для нечувствительного сравнения используйте ILIKE
MySQLЗависит от collation столбца (часто без учета регистра)
SQLiteПо умолчанию без учета регистра для ASCII-букв

SQLite трактует LIKE 'al%' и LIKE 'Al%' одинаково для ASCII. PRAGMA case_sensitive_like = ON переключает поведение на точное сравнение регистра. ILIKE в PostgreSQL - это расширение, не входящее в стандарт SQL.

Оборачивание столбцов в LOWER() работает во всех диалектах, но мешает использовать индекс. Когда важна производительность, предпочтительнее collation без учета регистра или диалектные операторы.