- Home »

SQL LIKE и NOT LIKE — поиск по шаблону в запросах
Если вы работаете с базами данных, то наверняка сталкивались с необходимостью поиска записей по частичному совпадению. Например, нужно найти всех пользователей с email-адресами на определённом домене, или логи с определённым паттерном в названии файла. Именно для таких задач в SQL существуют операторы LIKE и NOT LIKE — мощные инструменты для поиска по шаблонам, которые должен знать каждый системный администратор и разработчик.
Эти операторы особенно полезны при работе с логами сервера, анализе пользовательских данных, фильтрации записей в административных панелях и автоматизации задач через скрипты. Понимание их синтаксиса и особенностей поможет вам быстрее находить нужную информацию в больших таблицах и писать более эффективные запросы.
Как работает оператор LIKE
LIKE — это оператор сравнения, который позволяет искать значения по шаблону с использованием подстановочных символов (wildcards). В отличие от простого сравнения на равенство (=), LIKE может находить частичные совпадения.
Основные подстановочные символы:
- % — заменяет любое количество символов (включая ноль)
- _ — заменяет ровно один символ
- [] — определяет набор символов (только в некоторых СУБД)
- [^] — исключает набор символов
Базовый синтаксис выглядит так:
SELECT * FROM table_name WHERE column_name LIKE 'pattern';
Практические примеры с объяснениями
Давайте разберём конкретные сценарии, с которыми вы можете столкнуться при администрировании серверов:
Поиск по логам сервера
-- Найти все записи с ошибками в логах
SELECT * FROM server_logs WHERE message LIKE '%ERROR%';
-- Найти логи определённого сервиса
SELECT * FROM server_logs WHERE service_name LIKE 'nginx%';
-- Найти IP-адреса из определённой подсети
SELECT * FROM access_logs WHERE client_ip LIKE '192.168.1.%';
Работа с пользовательскими данными
-- Найти всех пользователей с Gmail
SELECT * FROM users WHERE email LIKE '%@gmail.com';
-- Найти пользователей с именем, начинающимся на 'A'
SELECT * FROM users WHERE username LIKE 'A%';
-- Найти телефоны с определённым кодом
SELECT * FROM users WHERE phone LIKE '+7-495-%';
Фильтрация файлов и путей
-- Найти все конфигурационные файлы
SELECT * FROM file_system WHERE filename LIKE '%.conf';
-- Найти файлы в определённой директории
SELECT * FROM file_system WHERE path LIKE '/var/log/%';
-- Найти временные файлы
SELECT * FROM file_system WHERE filename LIKE 'tmp_%';
Оператор NOT LIKE — противоположность LIKE
NOT LIKE работает как инверсия LIKE — он находит все записи, которые НЕ соответствуют указанному шаблону. Это особенно полезно для исключения определённых типов данных из результатов.
-- Исключить системные процессы из мониторинга
SELECT * FROM processes WHERE process_name NOT LIKE 'system_%';
-- Найти пользователей без корпоративной почты
SELECT * FROM users WHERE email NOT LIKE '%@company.com';
-- Исключить логи отладки
SELECT * FROM logs WHERE level NOT LIKE 'DEBUG%';
Таблица сравнения подстановочных символов
Символ | Описание | Пример | Результат |
---|---|---|---|
% | Любое количество символов | ‘admin%’ | admin, administrator, admin123 |
_ | Ровно один символ | ‘user_’ | user1, userA, но НЕ user12 |
[abc] | Один из указанных символов | ‘[abc]%’ | apple, banana, cherry |
[^abc] | Любой кроме указанных | ‘[^abc]%’ | dog, elephant, но НЕ apple |
Оптимизация запросов с LIKE
Важно понимать, что LIKE может серьёзно замедлить выполнение запросов, особенно на больших таблицах. Вот несколько рекомендаций:
- Избегайте паттернов, начинающихся с % — они не могут использовать индексы
- Используйте составные индексы для часто используемых паттернов
- Рассмотрите полнотекстовый поиск для сложных случаев
- Применяйте дополнительные условия WHERE для сужения поиска
-- Медленный запрос
SELECT * FROM large_table WHERE description LIKE '%error%';
-- Быстрее с дополнительным условием
SELECT * FROM large_table
WHERE created_date >= '2023-01-01'
AND description LIKE '%error%';
Работа с регистром и специальными символами
В разных СУБД по-разному обрабатывается регистр символов. В MySQL по умолчанию поиск нечувствителен к регистру, в PostgreSQL — чувствителен.
-- Поиск без учёта регистра в PostgreSQL
SELECT * FROM users WHERE UPPER(username) LIKE UPPER('%Admin%');
-- Использование ILIKE в PostgreSQL (case-insensitive)
SELECT * FROM users WHERE username ILIKE '%admin%';
-- Экранирование специальных символов
SELECT * FROM files WHERE filename LIKE '%\_backup\_%' ESCAPE '\';
-- Поиск символа %
SELECT * FROM statistics WHERE description LIKE '%\%%' ESCAPE '\';
Альтернативные решения и расширения
Хотя LIKE покрывает большинство базовых потребностей, существуют более мощные альтернативы:
- REGEXP/RLIKE — регулярные выражения для сложных паттернов
- Full-Text Search — для полнотекстового поиска
- SIMILAR TO — SQL-стандартный оператор с поддержкой регулярных выражений
- Elasticsearch — для масштабного поиска по логам
-- Регулярные выражения в MySQL
SELECT * FROM logs WHERE message REGEXP '^ERROR.*[0-9]+$';
-- Full-text search в PostgreSQL
SELECT * FROM documents WHERE to_tsvector('english', content) @@ to_tsquery('server & configuration');
Автоматизация и скрипты
LIKE отлично работает в скриптах для автоматизации задач администрирования. Вот несколько практических примеров:
#!/bin/bash
# Скрипт для поиска подозрительных логов
mysql -u admin -p database_name << EOF
SELECT COUNT(*) as suspicious_attempts
FROM access_logs
WHERE user_agent LIKE '%bot%'
AND response_code NOT LIKE '2%'
AND timestamp > NOW() - INTERVAL 1 HOUR;
EOF
# Python скрипт для мониторинга
import psycopg2
conn = psycopg2.connect(database="monitoring", user="admin")
cursor = conn.cursor()
cursor.execute("""
SELECT server_name, error_message
FROM server_status
WHERE error_message LIKE '%memory%'
OR error_message LIKE '%disk%'
""")
for row in cursor.fetchall():
print(f"Server {row[0]}: {row[1]}")
Нестандартные применения и хитрости
Несколько интересных способов использования LIKE, которые могут пригодиться:
- Валидация форматов данных — проверка email, телефонов, IP-адресов
- Анализ паттернов в логах — выявление аномалий и атак
- Группировка похожих записей — для аналитики и отчётов
- Создание динамических фильтров — в веб-интерфейсах
-- Проверка формата email
SELECT * FROM users WHERE email LIKE '%@%.%' AND email NOT LIKE '%@%@%';
-- Поиск потенциальных SQL-инъекций в логах
SELECT * FROM access_logs WHERE query_string LIKE '%union%select%' OR query_string LIKE '%drop%table%';
-- Группировка ошибок по типам
SELECT
CASE
WHEN error_message LIKE '%timeout%' THEN 'Timeout errors'
WHEN error_message LIKE '%connection%' THEN 'Connection errors'
ELSE 'Other errors'
END as error_type,
COUNT(*) as count
FROM error_logs
GROUP BY error_type;
Производительность и статистика
Согласно исследованиям производительности, запросы с LIKE могут быть в 5-10 раз медленнее простых запросов на равенство. Однако правильная индексация может значительно улучшить ситуацию:
- Префиксные индексы ускоряют поиск паттернов типа ‘text%’ на 80-90%
- Полнотекстовые индексы могут быть в 100 раз быстрее для поиска слов
- Партиционирование таблиц помогает при поиске по датам и категориям
Для работы с большими объёмами данных рекомендую рассмотреть VPS с SSD-дисками или выделенный сервер для размещения базы данных.
Заключение и рекомендации
LIKE и NOT LIKE — незаменимые инструменты для любого системного администратора. Используйте их для:
- Анализа логов — поиск ошибок, аномалий, паттернов активности
- Фильтрации пользователей — по email-доменам, именам, регионам
- Мониторинга системы — отслеживание процессов, файлов, сетевой активности
- Создания отчётов — группировка и анализ данных
Помните о производительности: всегда тестируйте запросы на реальных данных, используйте индексы и рассматривайте альтернативы для сложных случаев. Правильное применение LIKE сделает ваши SQL-запросы более гибкими и мощными, а работу с данными — более эффективной.
Полезные ссылки для дополнительного изучения:
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.