LIKE
Поиск текста по заданному шаблону
Теория
Не всегда нужно искать точное значение целиком. Часто мы хотим найти строки, значения в которых частично совпадают с заданным шаблоном. Например:
• нужно найти товары, название которых начинается со слова 'Ноутбук';
• хотим найти всех пользователей с почтой на 'gmail.com';
• ищем должности, в которых встречается слово 'менеджер'.
Обычное сравнение через = здесь не поможет, потому что оно ищет только точное совпадение. Для таких случаев в SQL есть оператор LIKE.
LIKE сравнивает значение со строковым шаблоном. Внутри шаблона можно использовать специальные символы:
• % — любое количество любых символов;
• _ — ровно один любой символ.
LIKE удобно запомнить как поиск по шаблону: вы задаёте форму текста (шаблон), а SQL ищет строки, которые под неё подходят.
Важно: в PostgreSQL LIKE чувствителен к регистру. То есть 'м%' и 'М%' — это разные шаблоны. Если регистр не важен, используют ILIKE.
• нужно найти товары, название которых начинается со слова 'Ноутбук';
• хотим найти всех пользователей с почтой на 'gmail.com';
• ищем должности, в которых встречается слово 'менеджер'.
Обычное сравнение через = здесь не поможет, потому что оно ищет только точное совпадение. Для таких случаев в SQL есть оператор LIKE.
LIKE сравнивает значение со строковым шаблоном. Внутри шаблона можно использовать специальные символы:
• % — любое количество любых символов;
• _ — ровно один любой символ.
LIKE удобно запомнить как поиск по шаблону: вы задаёте форму текста (шаблон), а SQL ищет строки, которые под неё подходят.
Важно: в PostgreSQL LIKE чувствителен к регистру. То есть 'м%' и 'М%' — это разные шаблоны. Если регистр не важен, используют ILIKE.
Синтаксис
SELECT column1, column2, ...
FROM table_name
WHERE column_name LIKE 'pattern';
SQL
Шаблон после LIKE всегда пишется в кавычках.
Самые частые варианты:
• LIKE 'Ноутбук%' — текст начинается с 'Ноутбук';
• LIKE '%gmail.com' — текст заканчивается на 'gmail.com';
• LIKE '%менеджер%' — внутри текста встречается слово 'менеджер';
• LIKE '__ван' — перед 'ван' должно быть ровно два любых символа.
Также можно использовать отрицание:
• NOT LIKE — оставить строки, которые не подходят под шаблон.
Если регистр не важен, используют:
• ILIKE — поиск по тому же шаблону, но без учёта регистра.
Самые частые варианты:
• LIKE 'Ноутбук%' — текст начинается с 'Ноутбук';
• LIKE '%gmail.com' — текст заканчивается на 'gmail.com';
• LIKE '%менеджер%' — внутри текста встречается слово 'менеджер';
• LIKE '__ван' — перед 'ван' должно быть ровно два любых символа.
Также можно использовать отрицание:
• NOT LIKE — оставить строки, которые не подходят под шаблон.
Если регистр не важен, используют:
• ILIKE — поиск по тому же шаблону, но без учёта регистра.
Примеры
1. Находим товары, название которых начинается со слова «Ноутбук»
Шаблон 'Ноутбук%' означает: сначала должно идти слово 'Ноутбук', а дальше может быть любой хвост. Поэтому в результат попадут все товары, чьё название начинается именно так.
🔄 Попробуйте изменить запрос:
- • Поменяйте шаблон на 'Смартфон%' и сравните результат
- • Попробуйте шаблон '%Pro%' и посмотрите, какие товары содержат этот фрагмент внутри названия
2. Ищем пользователей с почтой gmail.com
Здесь знак % стоит в начале шаблона. Это значит, что перед 'gmail.com' может быть любой текст. Такой запрос удобно использовать, когда вас интересует именно окончание строки.
🔄 Попробуйте изменить запрос:
- • Замените 'gmail.com' на 'mail.ru'
- • Попробуйте отрицание: замените LIKE на NOT LIKE и посмотрите, что останется в выборке
3. Находим должности, в которых встречается слово «менеджер»
Здесь используется ILIKE, потому что нам важен сам фрагмент слова, а не точный регистр. Шаблон с процентами по краям ищет подстроку в любой части значения.
🔄 Попробуйте изменить запрос:
- • Замените ILIKE на LIKE и сравните результат
- • Попробуйте другой фрагмент, например '%специалист%', и сравните ILIKE с LIKE
4. Исключаем товары, которые начинаются со слова «Ноутбук»
Иногда нужно не найти совпадения, а наоборот убрать их. Для этого используют NOT LIKE. Здесь в результат попадут все товары, кроме тех, чьё название начинается со слова 'Ноутбук'.
🔄 Попробуйте изменить запрос:
- • Поменяйте шаблон на 'Смартфон%'
- • Замените NOT LIKE на LIKE и сравните две противоположные выборки
Типичные ошибки
Путают % и _
% означает любое количество символов, а _ — ровно один символ. Это не взаимозаменяемые вещи.
Забывают кавычки вокруг шаблона
Запись вида LIKE Ноутбук% не подойдёт. Шаблон должен быть строкой: LIKE 'Ноутбук%'.
Неправильно ставят %
'abc%' — начинается с abc.
'%abc' — заканчивается на abc.
'%abc%' — содержит abc внутри.
Забывают, что LIKE чувствителен к регистру
Если важен поиск без учёта регистра, чаще нужен ILIKE, а не обычный LIKE.
Используют LIKE там, где достаточно =
Если вам нужно точное совпадение, лучше писать обычное сравнение. LIKE нужен именно тогда, когда вы работаете с шаблоном.
Практика
Проверь себя
Ответьте на вопросы, чтобы закрепить материал:
1
Какой шаблон подойдёт, чтобы найти значения, которые заканчиваются на '.ru'?
2
Что означает шаблон '____' в условии LIKE?
3
Когда вместо LIKE лучше использовать ILIKE?
4
Что вернёт выражение SELECT 'mail.ru' LIKE '%.ru';? Введите только TRUE или FALSE.
5
Напишите запрос к таблице users, который выведет user_id, first_name, email и city только для пользователей, у которых почта содержит фрагмент 'shop', а город указан. Отсортируйте результат по email в алфавитном порядке.
6
Какой шаблон подойдёт, чтобы найти строки, где сначала идёт любая буква, потом 'ван' и больше ничего?
7
Напишите запрос к таблице workers, который выведет worker_id, first_name, position и salary для работников, чья должность не начинается со слова 'Менеджер', а зарплата больше 70000. Более высокие зарплаты должны идти выше.