LIKE
Поиск текста по заданному шаблону
Теория
Как вывести всех клиентов, которые проживают в городе 'Москва'? Очень просто: WHERE city = 'Москва'. Как вывести все товары дороже 10000 рублей? Тоже очень просто: WHERE price > 10000.
Но что делать, когда нужно вывести клиентов, проживающих по адресу, в названии которого встречается слово 'проспект', или клиентов, чьи фамилии заканчиваются на 'ов' или, например:
• нужно найти товары, название которых начинается со слова 'Ноутбук';
• найти всех пользователей с почтой на 'gmail.com';
• вывести должности, в которых встречается слово 'менеджер'.
Классическое сравнение через оператор = здесь не поможет, потому что оно ищет только точное совпадение. Для таких случаев в SQL есть специальный оператор LIKE.
LIKE сравнивает значение со строковым шаблоном, который вы задаете сами. Внутри шаблона можно использовать специальные символы:
• % — любое количество любых символов;
• _ — ровно один любой символ.
Вы задаёте форму текста (шаблон), а SQL ищет строки, которые под неё подходят.
Важно: в PostgreSQL LIKE чувствителен к регистру. То есть 'м%' и 'М%' — это разные шаблоны. Если регистр не важен, используют ILIKE.
Но что делать, когда нужно вывести клиентов, проживающих по адресу, в названии которого встречается слово 'проспект', или клиентов, чьи фамилии заканчиваются на 'ов' или, например:
• нужно найти товары, название которых начинается со слова 'Ноутбук';
• найти всех пользователей с почтой на 'gmail.com';
• вывести должности, в которых встречается слово 'менеджер'.
Классическое сравнение через оператор = здесь не поможет, потому что оно ищет только точное совпадение. Для таких случаев в SQL есть специальный оператор LIKE.
LIKE сравнивает значение со строковым шаблоном, который вы задаете сами. Внутри шаблона можно использовать специальные символы:
• % — любое количество любых символов;
• _ — ровно один любой символ.
Вы задаёте форму текста (шаблон), а SQL ищет строки, которые под неё подходят.
Важно: в PostgreSQL LIKE чувствителен к регистру. То есть 'м%' и 'М%' — это разные шаблоны. Если регистр не важен, используют ILIKE.
Синтаксис
SELECT column1, -- указываем столбцы, которые хотим получить
column2,
column3
FROM table_name -- указываем таблицу, из которой берём данные
WHERE column_name LIKE 'pattern'; -- оставляем строки, где значение column_name подходит под шаблон
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 и сравните результат
- • Попробуйте другой фрагмент, например '%специалист%', и сравните ILIKE с LIKE
4. Исключаем товары, которые начинаются со слова «Ноутбук»
Иногда нужно не найти совпадения, а наоборот убрать их. Для этого используют NOT LIKE. Здесь в результат попадут все товары, кроме тех, чьё название начинается со слова 'Ноутбук'.
🔄 Попробуйте изменить запрос:
- • Поменяйте шаблон на 'Смартфон%'
- • Замените NOT LIKE на LIKE и сравните две противоположные выборки
Типичные ошибки
Путают % и _
% означает любое количество символов, а _ — ровно один символ. Это не взаимозаменяемые вещи.
Забывают кавычки вокруг шаблона
Запись вида LIKE Ноутбук% не подойдёт. Шаблон должен быть строкой: LIKE 'Ноутбук%'.
Неправильно ставят %
'abc%' — начинается с abc.
'%abc' — заканчивается на abc.
'%abc%' — содержит abc внутри.
Забывают, что LIKE чувствителен к регистру
Если важен поиск без учёта регистра, то вероятно вам нужен ILIKE, а не обычный LIKE.
Используют LIKE там, где достаточно =
Если вам нужно точное совпадение, лучше писать обычное сравнение. LIKE нужен именно тогда, когда вы работаете с шаблоном. Имеется в виду, что если в строке четко указано 'Москва', то вы сможете найти все строки с этим городом и так WHERE city LIKE 'Москва', и так WHERE city = 'Москва'. Но второй вариант через = в этом случае более предпочтителен, так как в 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. Более высокие зарплаты должны идти выше.