SQL LIKE: фильтры по префиксу, суффиксу и подстроке
SQL LIKE фильтрует строки, сопоставляя текстовый столбец с шаблоном, в котором используются SQL-подстановки. Подстановка % соответствует нулю или большему количеству символов, а _ соответствует ровно одному символу. Применяйте его для фильтров по началу строки ('prefix%'), по окончанию строки ('%suffix') и по вхождению подстроки ('%term%').
Пример SQL LIKE Для Сопоставления По Префиксу
Вывод:
Результат появится здесь...
Вывод:
+-------+----------------+
| name | email |
+-------+----------------+
| Алиса | [email protected] |
| Алина | [email protected] |
+-------+----------------+
2 row(s)
Как LIKE ‘Ал%’ Фильтрует Строки
CREATE TABLEиINSERTзаполняютcustomersчетырьмя строками.name LIKE 'Ал%'оставляет имена, которые начинаются сАл;%покрывает оставшиеся символы.- При обычном 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 без учета регистра или диалектные операторы.