Урок 12.1 · Время чтения: ~10 мин
Этот урок посвящен практической обработке строк в SQL. Вы узнаете, как очищать текстовые значения, нормализовать регистр, извлекать полезные фрагменты строк и строить удобные поля для аналитики и отчетов. Мы разберем рабочие сценарии на базе данных Sakila. К концу урока вы сможете уверенно подготавливать текстовые данные к анализу прямо в SQL.
В предыдущем модуле мы говорили о качестве SQL-кода и производительности запросов. Теперь переходим к прикладной аналитике: в реальных данных часто встречаются текстовые поля, которые нужно не просто вывести, а сначала привести в рабочий вид.
Практическая обработка строк нужна в отчетах, сегментации пользователей, очистке справочников, подготовке выгрузок и проверке качества данных. Именно такие задачи чаще всего встречаются в ежедневной работе аналитика или разработчика.
Базовые строковые функции полезны сами по себе, но настоящая ценность появляется, когда вы применяете их для решения конкретной задачи. Например, один и тот же email можно использовать для проверки качества данных, сегментации по домену и подготовки отчета для маркетинга.
На практике обработка строк в SQL обычно сводится к четырем типам задач:
Чаще всего текст обрабатывают по шагам:
Такой подход делает запросы более предсказуемыми и упрощает отладку.
SELECT
LOWER(TRIM(email)) AS email_normalized
FROM customer
LIMIT 5;
Результат: email очищается от лишних пробелов по краям и приводится к нижнему регистру.
Самый частый сценарий - подготовить строку к дальнейшему анализу. Для этого обычно используют TRIM(), LOWER(), UPPER() и REPLACE().
SELECT
customer_id,
email,
LOWER(TRIM(email)) AS email_normalized
FROM customer
LIMIT 10;
Примечание: даже если данные уже выглядят чистыми, нормализация полезна для сравнения, группировки и дальнейшей автоматической обработки.
SELECT
address_id,
address,
TRIM(REPLACE(address, 'Street', 'St.')) AS address_cleaned
FROM address
LIMIT 10;
Результат: адрес становится короче и единообразнее, что удобно для вывода в отчетах и интерфейсах.
После очистки часто нужно получить из строки только ту часть, которая нужна для анализа. В MySQL для этого особенно удобны SUBSTRING(), LEFT(), RIGHT() и SUBSTRING_INDEX().
SELECT
customer_id,
email,
SUBSTRING_INDEX(LOWER(TRIM(email)), '@', -1) AS email_domain
FROM customer
LIMIT 10;
Результат: из email выделяется доменная часть, например example.com.
SELECT
film_id,
title,
LEFT(title, 5) AS title_prefix,
RIGHT(title, 5) AS title_suffix
FROM film
LIMIT 10;
Примечание: такие фрагменты бывают полезны для быстрых эвристик, проверки шаблонов именования или построения коротких меток.
В аналитике часто нужны не исходные поля, а уже собранные человекочитаемые метки. Для этого удобно использовать CONCAT() и CONCAT_WS().
SELECT
customer_id,
CONCAT_WS(
' | ',
CONCAT_WS(' ', first_name, last_name),
LOWER(TRIM(email)),
CONCAT('store=', store_id)
) AS customer_label
FROM customer
LIMIT 10;
Результат: получается компактное текстовое поле, которое удобно использовать в административных отчетах, экспортных файлах и внутренних инструментах.
Обработка строк полезна не только для форматирования, но и для базовой валидации. SQL не заменяет полноценную систему проверки данных, но позволяет быстро находить подозрительные значения.
@SELECT
customer_id,
email
FROM customer
WHERE INSTR(LOWER(TRIM(email)), '@') = 0;
Результат: запрос возвращает записи, в которых email не содержит обязательного разделителя.
SELECT
film_id,
title,
CHAR_LENGTH(title) AS title_length
FROM film
WHERE CHAR_LENGTH(title) > 20
ORDER BY title_length DESC
LIMIT 10;
Примечание: такие проверки полезны, когда нужно найти слишком длинные значения для карточек, интерфейсов или ограничений экспорта.
Теперь объединим несколько приемов в одном аналитическом запросе. Предположим, что нам нужно понять, какие домены чаще всего встречаются у клиентов.
SELECT
SUBSTRING_INDEX(LOWER(TRIM(email)), '@', -1) AS email_domain,
COUNT(*) AS customer_count
FROM customer
WHERE email IS NOT NULL
AND INSTR(LOWER(TRIM(email)), '@') > 0
GROUP BY SUBSTRING_INDEX(LOWER(TRIM(email)), '@', -1)
ORDER BY customer_count DESC, email_domain
LIMIT 15;
Результат: вы получаете распределение клиентов по доменам email. Такой запрос полезен для первичного исследования аудитории, поиска аномалий и подготовки сегментов для коммуникаций.
Этот пример показывает важную мысль: строковые функции особенно сильны не по отдельности, а в цепочках. Сначала мы очищаем значение, затем проверяем его структуру, потом извлекаем домен и только после этого агрегируем данные.
CTE или подзапросе для повышения читаемости.SUBSTRING_INDEX(), но в других СУБД может понадобиться другой синтаксис.Ключевые выводы этого урока:
TRIM, LOWER, REPLACE, SUBSTRING_INDEX, LEFT, RIGHT и CONCAT_WS особенно полезны в ежедневной работе.Потому что даже внешне «чистые» данные могут содержать лишние пробелы, разный регистр или неочевидные отклонения формата. Нормализация делает сравнение, группировку и фильтрацию надежнее.
Домен позволяет быстро сегментировать пользователей, находить корпоративные адреса и искать аномалии в данных. Это простой способ превратить необработанное текстовое поле в аналитический признак.
Когда поле нужно для отчета, административного интерфейса, экспорта или промежуточной аналитики. В таких случаях формирование меток на уровне SQL уменьшает объем постобработки и делает логику ближе к данным.
Обычно это очистка текста, нормализация формата, извлечение признаков и валидация данных. На практике строковые функции часто используются перед группировкой, сегментацией и построением отчетных полей.
GROUP BY по текстовому полю полезно применять TRIM() и LOWER()?Без нормализации одно и то же значение может оказаться в нескольких группах из-за разного регистра или лишних пробелов. Предварительная очистка делает агрегацию корректнее и уменьшает количество ложных различий.
SUBSTRING_INDEX() на практическом примере?В MySQL эта функция удобна для быстрого выделения части строки по разделителю. Например, из email можно извлечь домен и сразу использовать его в сегментации пользователей или в аналитическом отчете.
В следующем уроке мы перейдем к использованию SQL для анализа данных и отчетности и посмотрим, как превращать подготовленные данные в полезные бизнес-выводы.