Оператор LIKE и шаблоны: поиск по маске (_ и %)
Как работает оператор LIKE? 🔍
Когда SQL-запросу нужно найти не точное совпадение, а примерное — на помощь приходит LIKE. Это оператор для поиска строк по шаблону, где:
- % заменяет любое количество символов (включая ноль)
- _ заменяет ровно один символ
Представьте, что % — это дикий карт в покере, а _ — обязательная карта.
-- Найти все города, начинающиеся на "Мос"
SELECT name FROM cities
WHERE name LIKE 'Мос%';
-- Москов, Москва, Московский — всё подходит!
Практикуемся с % и _ 🛠️
Давайте разберём на реальных примерах, как эти символы меняют поиск.
Шаблон "%тер%"
Найдёт слова, где где-то внутри есть "тер":
SELECT product_name FROM products
WHERE product_name LIKE '%тер%';
-- "Компьютер", "Термос", "Катер" — все подходят
Шаблон "К_т"
Найдёт слова из трёх букв, где первая — «К», последняя — «т»:
SELECT word FROM dictionary
WHERE word LIKE 'К_т';
-- "Кот", "Кит", но не "Крот" (4 буквы)
Сложные комбинации шаблонов 🧩
Можно комбинировать % и _ для точного контроля поиска:
-- Найти email из домена @gmail.com, где третья буква 'a'
SELECT email FROM users
WHERE email LIKE '__a%@gmail.com';
-- Примеры подходящих email:
-- "dana@gmail.com" (третья буква 'a')
-- "maxa@gmail.com" (третья буква 'x' — не подходит)
Экранирование спецсимволов ⚠️
А если нужно найти именно символ % или _? Используйте ESCAPE:
-- Найти строки, содержащие "20%"
SELECT description FROM reports
WHERE description LIKE '%20!%%' ESCAPE '!';
-- Здесь "!" — экранирующий символ. Поиск будет искать именно "20%"
Производительность LIKE 🚀
Важно помнить:
🔹 LIKE 'text%' — быстро (может использовать индекс)
🔹 LIKE '%text%' — медленно (полный перебор строк)
Если скорость критична — рассмотрите полнотекстовый поиск.
Практические задания ✨
Закрепим знания на примере базы данных книжного магазина:
-- 1. Найти книги, где автор имеет фамилию на "ов" в любой части
SELECT title FROM books
WHERE author LIKE '%ов%';
-- 2. Найти товары с артикулом из 5 символов, где 3-й символ 'Z'
SELECT product_name FROM products
WHERE article LIKE '__Z__';
Продвинутый уровень: LIKE vs REGEXP 🤓
Для сложных паттернов в некоторых СУБД есть REGEXP:
-- Найти номера телефонов в формате +7(XXX)XXX-XX-XX
SELECT phone FROM contacts
WHERE phone REGEXP '^\\+7\\([0-9]{3}\\)[0-9]{3}-[0-9]{2}-[0-9]{2}$';
Но для 95% задач LIKE с % и _ — идеальный выбор!
Итоги 📝
%— любое количество символов_— ровно один символ- Комбинируйте их для гибкого поиска
- Экранируйте спецсимволы через
ESCAPE - Используйте
REGEXPдля очень сложных паттернов
Теперь вы можете искать данные как профессионал! Попробуйте применить эти шаблоны в своих проектах — результат вас удивит.