Оператор 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 для очень сложных паттернов

Теперь вы можете искать данные как профессионал! Попробуйте применить эти шаблоны в своих проектах — результат вас удивит.

Скрыть рекламу навсегда

🧠 Учёба без воды и зубрёжки

Закрытый Boosty с наработками опытного преподавателя.

Объясняю сложное так, чтобы щелкнуло.

🚀 Забрать доступ к Boosty