Home » SQL LIKE и NOT LIKE — поиск по шаблону в запросах
SQL LIKE и NOT LIKE — поиск по шаблону в запросах

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-запросы более гибкими и мощными, а работу с данными — более эффективной.

Полезные ссылки для дополнительного изучения:


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked