> SmartGate

LIKE

Поиск текста по заданному шаблону

Теория

Как вывести всех клиентов, которые проживают в городе 'Москва'? Очень просто: WHERE city = 'Москва'. Как вывести все товары дороже 10000 рублей? Тоже очень просто: WHERE price > 10000.
Но что делать, когда нужно вывести клиентов, проживающих по адресу, в названии которого встречается слово 'проспект', или клиентов, чьи фамилии заканчиваются на 'ов' или, например:

• нужно найти товары, название которых начинается со слова 'Ноутбук';
• найти всех пользователей с почтой на '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 — поиск по тому же шаблону, но без учёта регистра.

Примеры

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. Более высокие зарплаты должны идти выше.